From 881e8c113c4da503e73a953c8430f71f380cff63 Mon Sep 17 00:00:00 2001 From: Emelia Smith Date: Thu, 25 Jan 2024 17:46:02 +0100 Subject: [PATCH 001/211] Refactor: fix streaming postgresql and redis typing issues (#28747) --- streaming/index.js | 135 ++++++++++++++++++++++++++++++++++++--------- 1 file changed, 109 insertions(+), 26 deletions(-) diff --git a/streaming/index.js b/streaming/index.js index 78b049723f..6945a9ae7d 100644 --- a/streaming/index.js +++ b/streaming/index.js @@ -8,7 +8,7 @@ const url = require('url'); const cors = require('cors'); const dotenv = require('dotenv'); const express = require('express'); -const Redis = require('ioredis'); +const { Redis } = require('ioredis'); const { JSDOM } = require('jsdom'); const pg = require('pg'); const dbUrlToConfig = require('pg-connection-string').parse; @@ -43,13 +43,18 @@ initializeLogLevel(process.env, environment); */ /** - * @param {Object.} config + * @param {RedisConfiguration} config + * @returns {Promise} */ -const createRedisClient = async (config) => { - const { redisParams, redisUrl } = config; - // @ts-ignore - const client = new Redis(redisUrl, redisParams); - // @ts-ignore +const createRedisClient = async ({ redisParams, redisUrl }) => { + let client; + + if (typeof redisUrl === 'string') { + client = new Redis(redisUrl, redisParams); + } else { + client = new Redis(redisParams); + } + client.on('error', (err) => logger.error({ err }, 'Redis Client Error!')); return client; @@ -87,39 +92,101 @@ const parseJSON = (json, req) => { }; /** - * @param {Object.} env the `process.env` value to read configuration from - * @returns {Object.} the configuration for the PostgreSQL connection + * Takes an environment variable that should be an integer, attempts to parse + * it falling back to a default if not set, and handles errors parsing. + * @param {string|undefined} value + * @param {number} defaultValue + * @param {string} variableName + * @returns {number} + */ +const parseIntFromEnv = (value, defaultValue, variableName) => { + if (typeof value === 'string' && value.length > 0) { + const parsedValue = parseInt(value, 10); + if (isNaN(parsedValue)) { + throw new Error(`Invalid ${variableName} environment variable: ${value}`); + } + return parsedValue; + } else { + return defaultValue; + } +}; + +/** + * @param {NodeJS.ProcessEnv} env the `process.env` value to read configuration from + * @returns {pg.PoolConfig} the configuration for the PostgreSQL connection */ const pgConfigFromEnv = (env) => { + /** @type {Record} */ const pgConfigs = { development: { - user: env.DB_USER || pg.defaults.user, + user: env.DB_USER || pg.defaults.user, password: env.DB_PASS || pg.defaults.password, database: env.DB_NAME || 'mastodon_development', - host: env.DB_HOST || pg.defaults.host, - port: env.DB_PORT || pg.defaults.port, + host: env.DB_HOST || pg.defaults.host, + port: parseIntFromEnv(env.DB_PORT, pg.defaults.port ?? 5432, 'DB_PORT') }, production: { - user: env.DB_USER || 'mastodon', + user: env.DB_USER || 'mastodon', password: env.DB_PASS || '', database: env.DB_NAME || 'mastodon_production', - host: env.DB_HOST || 'localhost', - port: env.DB_PORT || 5432, + host: env.DB_HOST || 'localhost', + port: parseIntFromEnv(env.DB_PORT, 5432, 'DB_PORT') }, }; - let baseConfig; + /** + * @type {pg.PoolConfig} + */ + let baseConfig = {}; if (env.DATABASE_URL) { - baseConfig = dbUrlToConfig(env.DATABASE_URL); + const parsedUrl = dbUrlToConfig(env.DATABASE_URL); + + // The result of dbUrlToConfig from pg-connection-string is not type + // compatible with pg.PoolConfig, since parts of the connection URL may be + // `null` when pg.PoolConfig expects `undefined`, as such we have to + // manually create the baseConfig object from the properties of the + // parsedUrl. + // + // For more information see: + // https://github.com/brianc/node-postgres/issues/2280 + // + // FIXME: clean up once brianc/node-postgres#3128 lands + if (typeof parsedUrl.password === 'string') baseConfig.password = parsedUrl.password; + if (typeof parsedUrl.host === 'string') baseConfig.host = parsedUrl.host; + if (typeof parsedUrl.user === 'string') baseConfig.user = parsedUrl.user; + if (typeof parsedUrl.port === 'string') { + const parsedPort = parseInt(parsedUrl.port, 10); + if (isNaN(parsedPort)) { + throw new Error('Invalid port specified in DATABASE_URL environment variable'); + } + baseConfig.port = parsedPort; + } + if (typeof parsedUrl.database === 'string') baseConfig.database = parsedUrl.database; + if (typeof parsedUrl.options === 'string') baseConfig.options = parsedUrl.options; + + // The pg-connection-string type definition isn't correct, as parsedUrl.ssl + // can absolutely be an Object, this is to work around these incorrect + // types, including the casting of parsedUrl.ssl to Record + if (typeof parsedUrl.ssl === 'boolean') { + baseConfig.ssl = parsedUrl.ssl; + } else if (typeof parsedUrl.ssl === 'object' && !Array.isArray(parsedUrl.ssl) && parsedUrl.ssl !== null) { + /** @type {Record} */ + const sslOptions = parsedUrl.ssl; + baseConfig.ssl = {}; + + baseConfig.ssl.cert = sslOptions.cert; + baseConfig.ssl.key = sslOptions.key; + baseConfig.ssl.ca = sslOptions.ca; + baseConfig.ssl.rejectUnauthorized = sslOptions.rejectUnauthorized; + } // Support overriding the database password in the connection URL if (!baseConfig.password && env.DB_PASS) { baseConfig.password = env.DB_PASS; } - } else { - // @ts-ignore + } else if (Object.hasOwnProperty.call(pgConfigs, environment)) { baseConfig = pgConfigs[environment]; if (env.DB_SSLMODE) { @@ -136,42 +203,58 @@ const pgConfigFromEnv = (env) => { break; } } + } else { + throw new Error('Unable to resolve postgresql database configuration.'); } return { ...baseConfig, - max: env.DB_POOL || 10, + max: parseIntFromEnv(env.DB_POOL, 10, 'DB_POOL'), connectionTimeoutMillis: 15000, + // Deliberately set application_name to an empty string to prevent excessive + // CPU usage with PG Bouncer. See: + // - https://github.com/mastodon/mastodon/pull/23958 + // - https://github.com/pgbouncer/pgbouncer/issues/349 application_name: '', }; }; /** - * @param {Object.} env the `process.env` value to read configuration from - * @returns {Object.} configuration for the Redis connection + * @typedef RedisConfiguration + * @property {import('ioredis').RedisOptions} redisParams + * @property {string} redisPrefix + * @property {string|undefined} redisUrl + */ + +/** + * @param {NodeJS.ProcessEnv} env the `process.env` value to read configuration from + * @returns {RedisConfiguration} configuration for the Redis connection */ const redisConfigFromEnv = (env) => { // ioredis *can* transparently add prefixes for us, but it doesn't *in some cases*, // which means we can't use it. But this is something that should be looked into. const redisPrefix = env.REDIS_NAMESPACE ? `${env.REDIS_NAMESPACE}:` : ''; + let redisPort = parseIntFromEnv(env.REDIS_PORT, 6379, 'REDIS_PORT'); + let redisDatabase = parseIntFromEnv(env.REDIS_DB, 0, 'REDIS_DB'); + + /** @type {import('ioredis').RedisOptions} */ const redisParams = { host: env.REDIS_HOST || '127.0.0.1', - port: env.REDIS_PORT || 6379, - db: env.REDIS_DB || 0, + port: redisPort, + db: redisDatabase, password: env.REDIS_PASSWORD || undefined, }; // redisParams.path takes precedence over host and port. if (env.REDIS_URL && env.REDIS_URL.startsWith('unix://')) { - // @ts-ignore redisParams.path = env.REDIS_URL.slice(7); } return { redisParams, redisPrefix, - redisUrl: env.REDIS_URL, + redisUrl: typeof env.REDIS_URL === 'string' ? env.REDIS_URL : undefined, }; }; From 0e0a94f4839322e6eaf805c06865bc4c89886388 Mon Sep 17 00:00:00 2001 From: Matt Jankowski Date: Fri, 26 Jan 2024 03:53:44 -0500 Subject: [PATCH 002/211] Handle CLI failure exit status at the top-level script (#28322) --- .rubocop.yml | 3 +- bin/tootctl | 7 +- lib/mastodon/cli/accounts.rb | 152 +++++------------- lib/mastodon/cli/base.rb | 4 + lib/mastodon/cli/cache.rb | 3 +- lib/mastodon/cli/domains.rb | 6 +- lib/mastodon/cli/email_domain_blocks.rb | 10 +- lib/mastodon/cli/emoji.rb | 10 +- lib/mastodon/cli/federation.rb | 16 +- lib/mastodon/cli/feeds.rb | 8 +- lib/mastodon/cli/ip_blocks.rb | 10 +- lib/mastodon/cli/maintenance.rb | 16 +- lib/mastodon/cli/media.rb | 47 ++---- lib/mastodon/cli/progress_helper.rb | 5 +- lib/mastodon/cli/search.rb | 10 +- lib/mastodon/cli/statuses.rb | 5 +- lib/mastodon/cli/upgrade.rb | 6 +- spec/lib/mastodon/cli/accounts_spec.rb | 90 ++++------- spec/lib/mastodon/cli/cache_spec.rb | 3 +- .../mastodon/cli/email_domain_blocks_spec.rb | 6 +- spec/lib/mastodon/cli/feeds_spec.rb | 3 +- spec/lib/mastodon/cli/ip_blocks_spec.rb | 6 +- spec/lib/mastodon/cli/main_spec.rb | 6 +- spec/lib/mastodon/cli/maintenance_spec.rb | 8 +- spec/lib/mastodon/cli/media_spec.rb | 21 +-- spec/lib/mastodon/cli/search_spec.rb | 6 +- spec/lib/mastodon/cli/statuses_spec.rb | 3 +- 27 files changed, 150 insertions(+), 320 deletions(-) diff --git a/.rubocop.yml b/.rubocop.yml index 64021b4cec..6998941144 100644 --- a/.rubocop.yml +++ b/.rubocop.yml @@ -96,12 +96,11 @@ Rails/FilePath: Rails/HttpStatus: EnforcedStyle: numeric -# Reason: Allowed in `tootctl` CLI code and in boot ENV checker +# Reason: Allowed in boot ENV checker # https://docs.rubocop.org/rubocop-rails/cops_rails.html#railsexit Rails/Exit: Exclude: - 'config/boot.rb' - - 'lib/mastodon/cli/*.rb' # Reason: Conflicts with `Lint/UselessMethodDefinition` for inherited controller actions # https://docs.rubocop.org/rubocop-rails/cops_rails.html#railslexicallyscopedactionfilter diff --git a/bin/tootctl b/bin/tootctl index b3311c6b2a..ff64eb2e42 100755 --- a/bin/tootctl +++ b/bin/tootctl @@ -6,8 +6,13 @@ require_relative '../lib/mastodon/cli/main' begin Chewy.strategy(:mastodon) do - Mastodon::CLI::Main.start(ARGV) + Mastodon::CLI::Main.start(ARGV, debug: true) # Enables the script to rescue `Thor::Error` end +rescue Thor::Error => e + Thor::Shell::Color + .new + .say_error(e.message, :red) + exit(1) rescue Interrupt exit(130) end diff --git a/lib/mastodon/cli/accounts.rb b/lib/mastodon/cli/accounts.rb index 9dc65c1477..b5308e2b76 100644 --- a/lib/mastodon/cli/accounts.rb +++ b/lib/mastodon/cli/accounts.rb @@ -39,8 +39,7 @@ module Mastodon::CLI rotate_keys_for_account(Account.find_local(username)) say('OK', :green) else - say('No account(s) given', :red) - exit(1) + fail_with_message 'No account(s) given' end end @@ -74,10 +73,7 @@ module Mastodon::CLI if options[:role] role = UserRole.find_by(name: options[:role]) - if role.nil? - say('Cannot find user role with that name', :red) - exit(1) - end + fail_with_message 'Cannot find user role with that name' if role.nil? role_id = role.id end @@ -114,7 +110,6 @@ module Mastodon::CLI say("New password: #{password}") else report_errors(user.errors) - exit(1) end end @@ -152,18 +147,12 @@ module Mastodon::CLI def modify(username) user = Account.find_local(username)&.user - if user.nil? - say('No user with such username', :red) - exit(1) - end + fail_with_message 'No user with such username' if user.nil? if options[:role] role = UserRole.find_by(name: options[:role]) - if role.nil? - say('Cannot find user role with that name', :red) - exit(1) - end + fail_with_message 'Cannot find user role with that name' if role.nil? user.role_id = role.id elsif options[:remove_role] @@ -185,7 +174,6 @@ module Mastodon::CLI say("New password: #{password}") if options[:reset_password] else report_errors(user.errors) - exit(1) end end @@ -200,27 +188,19 @@ module Mastodon::CLI LONG_DESC def delete(username = nil) if username.present? && options[:email].present? - say('Use username or --email, not both', :red) - exit(1) + fail_with_message 'Use username or --email, not both' elsif username.blank? && options[:email].blank? - say('No username provided', :red) - exit(1) + fail_with_message 'No username provided' end account = nil if username.present? account = Account.find_local(username) - if account.nil? - say('No user with such username', :red) - exit(1) - end + fail_with_message 'No user with such username' if account.nil? else account = Account.left_joins(:user).find_by(user: { email: options[:email] }) - if account.nil? - say('No user with such email', :red) - exit(1) - end + fail_with_message 'No user with such email' if account.nil? end say("Deleting user with #{account.statuses_count} statuses, this might take a while...#{dry_run_mode_suffix}") @@ -243,23 +223,18 @@ module Mastodon::CLI username, domain = from_acct.split('@') from_account = Account.find_remote(username, domain) - if from_account.nil? || from_account.local? - say("No such account (#{from_acct})", :red) - exit(1) - end + fail_with_message "No such account (#{from_acct})" if from_account.nil? || from_account.local? username, domain = to_acct.split('@') to_account = Account.find_remote(username, domain) - if to_account.nil? || to_account.local? - say("No such account (#{to_acct})", :red) - exit(1) - end + fail_with_message "No such account (#{to_acct})" if to_account.nil? || to_account.local? if from_account.public_key != to_account.public_key && !options[:force] - say("Accounts don't have the same public key, might not be duplicates!", :red) - say('Override with --force', :red) - exit(1) + fail_with_message <<~ERROR + Accounts don't have the same public key, might not be duplicates! + Override with --force + ERROR end to_account.merge_with!(from_account) @@ -298,10 +273,7 @@ module Mastodon::CLI def backup(username) account = Account.find_local(username) - if account.nil? - say('No user with such username', :red) - exit(1) - end + fail_with_message 'No user with such username' if account.nil? backup = account.user.backups.create! BackupWorker.perform_async(backup.id) @@ -387,10 +359,7 @@ module Mastodon::CLI user, domain = user.split('@') account = Account.find_remote(user, domain) - if account.nil? - say('No such account', :red) - exit(1) - end + fail_with_message 'No such account' if account.nil? next if dry_run? @@ -405,8 +374,7 @@ module Mastodon::CLI say("OK#{dry_run_mode_suffix}", :green) else - say('No account(s) given', :red) - exit(1) + fail_with_message 'No account(s) given' end end @@ -416,10 +384,7 @@ module Mastodon::CLI def follow(username) target_account = Account.find_local(username) - if target_account.nil? - say('No such account', :red) - exit(1) - end + fail_with_message 'No such account' if target_account.nil? processed, = parallelize_with_progress(Account.local.without_suspended) do |account| FollowService.new.call(account, target_account, bypass_limit: true) @@ -435,10 +400,7 @@ module Mastodon::CLI username, domain = acct.split('@') target_account = Account.find_remote(username, domain) - if target_account.nil? - say('No such account', :red) - exit(1) - end + fail_with_message 'No such account' if target_account.nil? processed, = parallelize_with_progress(target_account.followers.local) do |account| UnfollowService.new.call(account, target_account) @@ -459,17 +421,11 @@ module Mastodon::CLI With the --followers option, the command removes all followers of the account. LONG_DESC def reset_relationships(username) - unless options[:follows] || options[:followers] - say('Please specify either --follows or --followers, or both', :red) - exit(1) - end + fail_with_message 'Please specify either --follows or --followers, or both' unless options[:follows] || options[:followers] account = Account.find_local(username) - if account.nil? - say('No such account', :red) - exit(1) - end + fail_with_message 'No such account' if account.nil? total = 0 total += account.following.reorder(nil).count if options[:follows] @@ -515,6 +471,8 @@ module Mastodon::CLI account identified by its username. LONG_DESC def approve(username = nil) + fail_with_message 'Number must be positive' if options[:number]&.negative? + if options[:all] User.pending.find_each(&:approve!) say('OK', :green) @@ -524,16 +482,10 @@ module Mastodon::CLI elsif username.present? account = Account.find_local(username) - if account.nil? - say('No such account', :red) - exit(1) - end + fail_with_message 'No such account' if account.nil? account.user&.approve! say('OK', :green) - else - say('Number must be positive', :red) if options[:number] - exit(1) end end @@ -587,56 +539,34 @@ module Mastodon::CLI redirects to a different account that the one specified. LONG_DESC def migrate(username) - if options[:replay].present? && options[:target].present? - say('Use --replay or --target, not both', :red) - exit(1) - end + fail_with_message 'Use --replay or --target, not both' if options[:replay].present? && options[:target].present? - if options[:replay].blank? && options[:target].blank? - say('Use either --replay or --target', :red) - exit(1) - end + fail_with_message 'Use either --replay or --target' if options[:replay].blank? && options[:target].blank? account = Account.find_local(username) - if account.nil? - say("No such account: #{username}", :red) - exit(1) - end + fail_with_message "No such account: #{username}" if account.nil? migration = nil if options[:replay] migration = account.migrations.last - if migration.nil? - say('The specified account has not performed any migration', :red) - exit(1) - end + fail_with_message 'The specified account has not performed any migration' if migration.nil? - unless options[:force] || migration.target_account_id == account.moved_to_account_id - say('The specified account is not redirecting to its last migration target. Use --force if you want to replay the migration anyway', :red) - exit(1) - end + fail_with_message 'The specified account is not redirecting to its last migration target. Use --force if you want to replay the migration anyway' unless options[:force] || migration.target_account_id == account.moved_to_account_id end if options[:target] target_account = ResolveAccountService.new.call(options[:target]) - if target_account.nil? - say("The specified target account could not be found: #{options[:target]}", :red) - exit(1) - end + fail_with_message "The specified target account could not be found: #{options[:target]}" if target_account.nil? - unless options[:force] || account.moved_to_account_id.nil? || account.moved_to_account_id == target_account.id - say('The specified account is redirecting to a different target account. Use --force if you want to change the migration target', :red) - exit(1) - end + fail_with_message 'The specified account is redirecting to a different target account. Use --force if you want to change the migration target' unless options[:force] || account.moved_to_account_id.nil? || account.moved_to_account_id == target_account.id begin migration = account.migrations.create!(acct: target_account.acct) rescue ActiveRecord::RecordInvalid => e - say("Error: #{e.message}", :red) - exit(1) + fail_with_message "Error: #{e.message}" end end @@ -648,18 +578,18 @@ module Mastodon::CLI private def report_errors(errors) - errors.each do |error| - say('Failure/Error: ', :red) - say(error.attribute) - say(" #{error.type}", :red) - end + message = errors.map do |error| + <<~STRING + Failure/Error: #{error.attribute} + #{error.type} + STRING + end.join + + fail_with_message message end def rotate_keys_for_account(account, delay = 0) - if account.nil? - say('No such account', :red) - exit(1) - end + fail_with_message 'No such account' if account.nil? old_key = account.private_key new_key = OpenSSL::PKey::RSA.new(2048) diff --git a/lib/mastodon/cli/base.rb b/lib/mastodon/cli/base.rb index 8c222bbb2b..93dec1fb8f 100644 --- a/lib/mastodon/cli/base.rb +++ b/lib/mastodon/cli/base.rb @@ -18,6 +18,10 @@ module Mastodon private + def fail_with_message(message) + raise Thor::Error, message + end + def pastel @pastel ||= Pastel.new end diff --git a/lib/mastodon/cli/cache.rb b/lib/mastodon/cli/cache.rb index e8a2ac1610..f32ab292ee 100644 --- a/lib/mastodon/cli/cache.rb +++ b/lib/mastodon/cli/cache.rb @@ -31,8 +31,7 @@ module Mastodon::CLI recount_status_stats(status) end else - say("Unknown type: #{type}", :red) - exit(1) + fail_with_message "Unknown type: #{type}" end say diff --git a/lib/mastodon/cli/domains.rb b/lib/mastodon/cli/domains.rb index e092497dc9..c247463af5 100644 --- a/lib/mastodon/cli/domains.rb +++ b/lib/mastodon/cli/domains.rb @@ -41,11 +41,9 @@ module Mastodon::CLI # Sanity check on command arguments if options[:limited_federation_mode] && !domains.empty? - say('DOMAIN parameter not supported with --limited-federation-mode', :red) - exit(1) + fail_with_message 'DOMAIN parameter not supported with --limited-federation-mode' elsif domains.empty? && !options[:limited_federation_mode] - say('No domain(s) given', :red) - exit(1) + fail_with_message 'No domain(s) given' end # Build scopes from command arguments diff --git a/lib/mastodon/cli/email_domain_blocks.rb b/lib/mastodon/cli/email_domain_blocks.rb index 022b1dcbb1..6b9107c8ad 100644 --- a/lib/mastodon/cli/email_domain_blocks.rb +++ b/lib/mastodon/cli/email_domain_blocks.rb @@ -30,10 +30,7 @@ module Mastodon::CLI it at the root. LONG_DESC def add(*domains) - if domains.empty? - say('No domain(s) given', :red) - exit(1) - end + fail_with_message 'No domain(s) given' if domains.empty? skipped = 0 processed = 0 @@ -76,10 +73,7 @@ module Mastodon::CLI desc 'remove DOMAIN...', 'Remove e-mail domain blocks' def remove(*domains) - if domains.empty? - say('No domain(s) given', :red) - exit(1) - end + fail_with_message 'No domain(s) given' if domains.empty? skipped = 0 processed = 0 diff --git a/lib/mastodon/cli/emoji.rb b/lib/mastodon/cli/emoji.rb index 912c099124..4a8949de0e 100644 --- a/lib/mastodon/cli/emoji.rb +++ b/lib/mastodon/cli/emoji.rb @@ -86,14 +86,8 @@ module Mastodon::CLI category = CustomEmojiCategory.find_by(name: options[:category]) export_file_name = File.join(path, 'export.tar.gz') - if File.file?(export_file_name) && !options[:overwrite] - say("Archive already exists! Use '--overwrite' to overwrite it!") - exit 1 - end - if category.nil? && options[:category] - say("Unable to find category '#{options[:category]}'!") - exit 1 - end + fail_with_message "Archive already exists! Use '--overwrite' to overwrite it!" if File.file?(export_file_name) && !options[:overwrite] + fail_with_message "Unable to find category '#{options[:category]}'!" if category.nil? && options[:category] File.open(export_file_name, 'wb') do |file| Zlib::GzipWriter.wrap(file) do |gzip| diff --git a/lib/mastodon/cli/federation.rb b/lib/mastodon/cli/federation.rb index 8bb46ecb1a..c738796557 100644 --- a/lib/mastodon/cli/federation.rb +++ b/lib/mastodon/cli/federation.rb @@ -43,10 +43,10 @@ module Mastodon::CLI say('Every deletion notice has been sent! You can safely delete all data and decomission your servers!', :green) end - exit(0) + raise(SystemExit) end - exit(1) unless ask('Type in the domain of the server to confirm:') == Rails.configuration.x.local_domain + fail_with_message 'Domains do not match. Stopping self-destruct initiation.' unless domain_match_confirmed? say(<<~WARNING, :yellow) This operation WILL NOT be reversible. @@ -54,19 +54,25 @@ module Mastodon::CLI The deletion process itself may take a long time, and will be handled by Sidekiq, so do not shut it down until it has finished (you will be able to re-run this command to see the state of the self-destruct process). WARNING - exit(1) if no?('Are you sure you want to proceed?') + fail_with_message 'Operation cancelled. Self-destruct will not begin.' if proceed_prompt_negative? say(<<~INSTRUCTIONS, :green) To switch Mastodon to self-destruct mode, add the following variable to your evironment (e.g. by adding a line to your `.env.production`) and restart all Mastodon processes: SELF_DESTRUCT=#{self_destruct_value} You can re-run this command to see the state of the self-destruct process. INSTRUCTIONS - rescue Interrupt - exit(1) end private + def domain_match_confirmed? + ask('Type in the domain of the server to confirm:') == Rails.configuration.x.local_domain + end + + def proceed_prompt_negative? + no?('Are you sure you want to proceed?') + end + def self_destruct_value Rails .application diff --git a/lib/mastodon/cli/feeds.rb b/lib/mastodon/cli/feeds.rb index 3467dd427c..39affd5e8e 100644 --- a/lib/mastodon/cli/feeds.rb +++ b/lib/mastodon/cli/feeds.rb @@ -27,17 +27,13 @@ module Mastodon::CLI elsif username.present? account = Account.find_local(username) - if account.nil? - say('No such account', :red) - exit(1) - end + fail_with_message 'No such account' if account.nil? PrecomputeFeedService.new.call(account) unless dry_run? say("OK #{dry_run_mode_suffix}", :green, true) else - say('No account(s) given', :red) - exit(1) + fail_with_message 'No account(s) given' end end diff --git a/lib/mastodon/cli/ip_blocks.rb b/lib/mastodon/cli/ip_blocks.rb index d12919c360..100bf7bada 100644 --- a/lib/mastodon/cli/ip_blocks.rb +++ b/lib/mastodon/cli/ip_blocks.rb @@ -20,10 +20,7 @@ module Mastodon::CLI option to overwrite it. LONG_DESC def add(*addresses) - if addresses.empty? - say('No IP(s) given', :red) - exit(1) - end + fail_with_message 'No IP(s) given' if addresses.empty? skipped = 0 processed = 0 @@ -70,10 +67,7 @@ module Mastodon::CLI cover the given IP(s). LONG_DESC def remove(*addresses) - if addresses.empty? - say('No IP(s) given', :red) - exit(1) - end + fail_with_message 'No IP(s) given' if addresses.empty? processed = 0 skipped = 0 diff --git a/lib/mastodon/cli/maintenance.rb b/lib/mastodon/cli/maintenance.rb index a64206065d..9f234e3860 100644 --- a/lib/mastodon/cli/maintenance.rb +++ b/lib/mastodon/cli/maintenance.rb @@ -199,26 +199,24 @@ module Mastodon::CLI def verify_schema_version! if migrator_version < MIN_SUPPORTED_VERSION - say 'Your version of the database schema is too old and is not supported by this script.', :red - say 'Please update to at least Mastodon 3.0.0 before running this script.', :red - exit(1) + fail_with_message <<~ERROR + Your version of the database schema is too old and is not supported by this script. + Please update to at least Mastodon 3.0.0 before running this script. + ERROR elsif migrator_version > MAX_SUPPORTED_VERSION say 'Your version of the database schema is more recent than this script, this may cause unexpected errors.', :yellow - exit(1) unless yes?('Continue anyway? (Yes/No)') + fail_with_message 'Stopping maintenance script because data is more recent than script version.' unless yes?('Continue anyway? (Yes/No)') end end def verify_sidekiq_not_active! - if Sidekiq::ProcessSet.new.any? - say 'It seems Sidekiq is running. All Mastodon processes need to be stopped when using this script.', :red - exit(1) - end + fail_with_message 'It seems Sidekiq is running. All Mastodon processes need to be stopped when using this script.' if Sidekiq::ProcessSet.new.any? end def verify_backup_warning! say 'This task will take a long time to run and is potentially destructive.', :yellow say 'Please make sure to stop Mastodon and have a backup.', :yellow - exit(1) unless yes?('Continue? (Yes/No)') + fail_with_message 'Maintenance process stopped.' unless yes?('Continue? (Yes/No)') end def deduplicate_accounts! diff --git a/lib/mastodon/cli/media.rb b/lib/mastodon/cli/media.rb index a796bb729a..87946e0262 100644 --- a/lib/mastodon/cli/media.rb +++ b/lib/mastodon/cli/media.rb @@ -31,15 +31,9 @@ module Mastodon::CLI following anyone locally are pruned. DESC def remove - if options[:prune_profiles] && options[:remove_headers] - say('--prune-profiles and --remove-headers should not be specified simultaneously', :red, true) - exit(1) - end + fail_with_message '--prune-profiles and --remove-headers should not be specified simultaneously' if options[:prune_profiles] && options[:remove_headers] - if options[:include_follows] && !(options[:prune_profiles] || options[:remove_headers]) - say('--include-follows can only be used with --prune-profiles or --remove-headers', :red, true) - exit(1) - end + fail_with_message '--include-follows can only be used with --prune-profiles or --remove-headers' if options[:include_follows] && !(options[:prune_profiles] || options[:remove_headers]) time_ago = options[:days].days.ago if options[:prune_profiles] || options[:remove_headers] @@ -156,11 +150,9 @@ module Mastodon::CLI end end when :fog - say('The fog storage driver is not supported for this operation at this time', :red) - exit(1) + fail_with_message 'The fog storage driver is not supported for this operation at this time' when :azure - say('The azure storage driver is not supported for this operation at this time', :red) - exit(1) + fail_with_message 'The azure storage driver is not supported for this operation at this time' when :filesystem require 'find' @@ -254,10 +246,7 @@ module Mastodon::CLI username, domain = options[:account].split('@') account = Account.find_remote(username, domain) - if account.nil? - say('No such account', :red) - exit(1) - end + fail_with_message 'No such account' if account.nil? scope = MediaAttachment.where(account_id: account.id) elsif options[:domain] @@ -265,8 +254,7 @@ module Mastodon::CLI elsif options[:days].present? scope = MediaAttachment.remote else - say('Specify the source of media attachments', :red) - exit(1) + fail_with_message 'Specify the source of media attachments' end scope = scope.where('media_attachments.id > ?', Mastodon::Snowflake.id_at(options[:days].days.ago, with_random: false)) if options[:days].present? @@ -306,38 +294,25 @@ module Mastodon::CLI path_segments = path.split('/')[2..] path_segments.delete('cache') - unless VALID_PATH_SEGMENTS_SIZE.include?(path_segments.size) - say('Not a media URL', :red) - exit(1) - end + fail_with_message 'Not a media URL' unless VALID_PATH_SEGMENTS_SIZE.include?(path_segments.size) model_name = path_segments.first.classify record_id = path_segments[2..-2].join.to_i - unless PRELOAD_MODEL_WHITELIST.include?(model_name) - say("Cannot find corresponding model: #{model_name}", :red) - exit(1) - end + fail_with_message "Cannot find corresponding model: #{model_name}" unless PRELOAD_MODEL_WHITELIST.include?(model_name) record = model_name.constantize.find_by(id: record_id) record = record.status if record.respond_to?(:status) - unless record - say('Cannot find corresponding record', :red) - exit(1) - end + fail_with_message 'Cannot find corresponding record' unless record display_url = ActivityPub::TagManager.instance.url_for(record) - if display_url.blank? - say('No public URL for this type of record', :red) - exit(1) - end + fail_with_message 'No public URL for this type of record' if display_url.blank? say(display_url, :blue) rescue Addressable::URI::InvalidURIError - say('Invalid URL', :red) - exit(1) + fail_with_message 'Invalid URL' end private diff --git a/lib/mastodon/cli/progress_helper.rb b/lib/mastodon/cli/progress_helper.rb index 1fa2745c18..4fcc47a7f7 100644 --- a/lib/mastodon/cli/progress_helper.rb +++ b/lib/mastodon/cli/progress_helper.rb @@ -25,10 +25,7 @@ module Mastodon::CLI end def parallelize_with_progress(scope) - if options[:concurrency] < 1 - say('Cannot run with this concurrency setting, must be at least 1', :red) - exit(1) - end + fail_with_message 'Cannot run with this concurrency setting, must be at least 1' if options[:concurrency] < 1 reset_connection_pools! diff --git a/lib/mastodon/cli/search.rb b/lib/mastodon/cli/search.rb index 77c455f049..5901c07776 100644 --- a/lib/mastodon/cli/search.rb +++ b/lib/mastodon/cli/search.rb @@ -110,17 +110,11 @@ module Mastodon::CLI end def verify_deploy_concurrency! - return unless options[:concurrency] < 1 - - say('Cannot run with this concurrency setting, must be at least 1', :red) - exit(1) + fail_with_message 'Cannot run with this concurrency setting, must be at least 1' if options[:concurrency] < 1 end def verify_deploy_batch_size! - return unless options[:batch_size] < 1 - - say('Cannot run with this batch_size setting, must be at least 1', :red) - exit(1) + fail_with_message 'Cannot run with this batch_size setting, must be at least 1' if options[:batch_size] < 1 end def progress_output_options diff --git a/lib/mastodon/cli/statuses.rb b/lib/mastodon/cli/statuses.rb index 48d76e0288..57b03c941c 100644 --- a/lib/mastodon/cli/statuses.rb +++ b/lib/mastodon/cli/statuses.rb @@ -26,10 +26,7 @@ module Mastodon::CLI indices before commencing, and removes them afterward. LONG_DESC def remove - if options[:batch_size] < 1 - say('Cannot run with this batch_size setting, must be at least 1', :red) - exit(1) - end + fail_with_message 'Cannot run with this batch_size setting, must be at least 1' if options[:batch_size] < 1 remove_statuses vacuum_and_analyze_statuses diff --git a/lib/mastodon/cli/upgrade.rb b/lib/mastodon/cli/upgrade.rb index cf83986844..2cb5105794 100644 --- a/lib/mastodon/cli/upgrade.rb +++ b/lib/mastodon/cli/upgrade.rb @@ -103,13 +103,11 @@ module Mastodon::CLI end def upgrade_storage_fog(_progress, _attachment, _style) - say('The fog storage driver is not supported for this operation at this time', :red) - exit(1) + fail_with_message 'The fog storage driver is not supported for this operation at this time' end def upgrade_storage_azure(_progress, _attachment, _style) - say('The azure storage driver is not supported for this operation at this time', :red) - exit(1) + fail_with_message 'The azure storage driver is not supported for this operation at this time' end def upgrade_storage_filesystem(progress, attachment, style) diff --git a/spec/lib/mastodon/cli/accounts_spec.rb b/spec/lib/mastodon/cli/accounts_spec.rb index 26ad983bbc..98be2b2027 100644 --- a/spec/lib/mastodon/cli/accounts_spec.rb +++ b/spec/lib/mastodon/cli/accounts_spec.rb @@ -65,8 +65,7 @@ describe Mastodon::CLI::Accounts do it 'exits with an error message' do expect { subject } - .to output_results('Failure/Error: email') - .and raise_error(SystemExit) + .to raise_error(Thor::Error, %r{Failure/Error: email}) end end end @@ -127,8 +126,7 @@ describe Mastodon::CLI::Accounts do it 'exits with an error message indicating the role name was not found' do expect { subject } - .to output_results('Cannot find user role with that name') - .and raise_error(SystemExit) + .to raise_error(Thor::Error, 'Cannot find user role with that name') end end end @@ -191,8 +189,7 @@ describe Mastodon::CLI::Accounts do it 'exits with an error message indicating the user was not found' do expect { subject } - .to output_results('No user with such username') - .and raise_error(SystemExit) + .to raise_error(Thor::Error, 'No user with such username') end end @@ -214,8 +211,7 @@ describe Mastodon::CLI::Accounts do it 'exits with an error message indicating the role was not found' do expect { subject } - .to output_results('Cannot find user role with that name') - .and raise_error(SystemExit) + .to raise_error(Thor::Error, 'Cannot find user role with that name') end end @@ -364,8 +360,7 @@ describe Mastodon::CLI::Accounts do it 'exits with an error message' do expect { subject } - .to output_results('Failure/Error: email') - .and raise_error(SystemExit) + .to raise_error(Thor::Error, %r{Failure/Error: email}) end end end @@ -387,16 +382,14 @@ describe Mastodon::CLI::Accounts do it 'exits with an error message indicating that only one should be used' do expect { subject } - .to output_results('Use username or --email, not both') - .and raise_error(SystemExit) + .to raise_error(Thor::Error, 'Use username or --email, not both') end end context 'when neither username nor --email are provided' do it 'exits with an error message indicating that no username was provided' do expect { subject } - .to output_results('No username provided') - .and raise_error(SystemExit) + .to raise_error(Thor::Error, 'No username provided') end end @@ -425,8 +418,7 @@ describe Mastodon::CLI::Accounts do it 'exits with an error message indicating that no user was found' do expect { subject } - .to output_results('No user with such username') - .and raise_error(SystemExit) + .to raise_error(Thor::Error, 'No user with such username') end end end @@ -458,8 +450,7 @@ describe Mastodon::CLI::Accounts do it 'exits with an error message indicating that no user was found' do expect { subject } - .to output_results('No user with such email') - .and raise_error(SystemExit) + .to raise_error(Thor::Error, 'No user with such email') end end end @@ -511,8 +502,7 @@ describe Mastodon::CLI::Accounts do it 'exits with an error message indicating that the number must be positive' do expect { subject } - .to output_results('Number must be positive') - .and raise_error(SystemExit) + .to raise_error(Thor::Error, 'Number must be positive') end end @@ -545,8 +535,7 @@ describe Mastodon::CLI::Accounts do it 'exits with an error message indicating that no such account was found' do expect { subject } - .to output_results('No such account') - .and raise_error(SystemExit) + .to raise_error(Thor::Error, 'No such account') end end end @@ -560,8 +549,7 @@ describe Mastodon::CLI::Accounts do it 'exits with an error message indicating that no account with the given username was found' do expect { subject } - .to output_results('No such account') - .and raise_error(SystemExit) + .to raise_error(Thor::Error, 'No such account') end end @@ -596,8 +584,7 @@ describe Mastodon::CLI::Accounts do it 'exits with an error message indicating that no account with the given username was found' do expect { subject } - .to output_results('No such account') - .and raise_error(SystemExit) + .to raise_error(Thor::Error, 'No such account') end end @@ -634,8 +621,7 @@ describe Mastodon::CLI::Accounts do it 'exits with an error message indicating that there is no such account' do expect { subject } - .to output_results('No user with such username') - .and raise_error(SystemExit) + .to raise_error(Thor::Error, 'No user with such username') end end @@ -795,8 +781,7 @@ describe Mastodon::CLI::Accounts do allow(Account).to receive(:find_remote).with(account_example_com_b.username, account_example_com_b.domain).and_return(nil) expect { subject } - .to output_results('No such account') - .and raise_error(SystemExit) + .to raise_error(Thor::Error, 'No such account') end end @@ -892,8 +877,7 @@ describe Mastodon::CLI::Accounts do context 'when neither a list of accts nor options are provided' do it 'exits with an error message' do expect { subject } - .to output_results('No account(s) given') - .and raise_error(SystemExit) + .to raise_error(Thor::Error, 'No account(s) given') end end end @@ -904,8 +888,7 @@ describe Mastodon::CLI::Accounts do context 'when neither username nor --all option are given' do it 'exits with an error message' do expect { subject } - .to output_results('No account(s) given') - .and raise_error(SystemExit) + .to raise_error(Thor::Error, 'No account(s) given') end end @@ -940,8 +923,7 @@ describe Mastodon::CLI::Accounts do it 'exits with an error message when the specified username is not found' do expect { subject } - .to output_results('No such account') - .and raise_error(SystemExit) + .to raise_error(Thor::Error, 'No such account') end end @@ -980,8 +962,7 @@ describe Mastodon::CLI::Accounts do shared_examples 'an account not found' do |acct| it 'exits with an error message indicating that there is no such account' do expect { subject } - .to output_results("No such account (#{acct})") - .and raise_error(SystemExit) + .to raise_error(Thor::Error, "No such account (#{acct})") end end @@ -1031,8 +1012,7 @@ describe Mastodon::CLI::Accounts do it 'exits with an error message indicating that the accounts do not have the same pub key' do expect { subject } - .to output_results("Accounts don't have the same public key, might not be duplicates!\nOverride with --force") - .and raise_error(SystemExit) + .to raise_error(Thor::Error, "Accounts don't have the same public key, might not be duplicates!\nOverride with --force\n") end context 'with --force option' do @@ -1200,8 +1180,7 @@ describe Mastodon::CLI::Accounts do context 'when no option is given' do it 'exits with an error message indicating that at least one option is required' do expect { subject } - .to output_results('Please specify either --follows or --followers, or both') - .and raise_error(SystemExit) + .to raise_error(Thor::Error, 'Please specify either --follows or --followers, or both') end end @@ -1211,8 +1190,7 @@ describe Mastodon::CLI::Accounts do it 'exits with an error message indicating that there is no such account' do expect { subject } - .to output_results('No such account') - .and raise_error(SystemExit) + .to raise_error(Thor::Error, 'No such account') end end @@ -1368,16 +1346,14 @@ describe Mastodon::CLI::Accounts do it 'exits with an error message indicating that using both options is not possible' do expect { subject } - .to output_results('Use --replay or --target, not both') - .and raise_error(SystemExit) + .to raise_error(Thor::Error, 'Use --replay or --target, not both') end end context 'when no option is given' do it 'exits with an error message indicating that at least one option must be used' do expect { subject } - .to output_results('Use either --replay or --target') - .and raise_error(SystemExit) + .to raise_error(Thor::Error, 'Use either --replay or --target') end end @@ -1387,8 +1363,7 @@ describe Mastodon::CLI::Accounts do it 'exits with an error message indicating that there is no such account' do expect { subject } - .to output_results("No such account: #{arguments.first}") - .and raise_error(SystemExit) + .to raise_error(Thor::Error, "No such account: #{arguments.first}") end end @@ -1398,8 +1373,7 @@ describe Mastodon::CLI::Accounts do context 'when the specified account has no previous migrations' do it 'exits with an error message indicating that the given account has no previous migrations' do expect { subject } - .to output_results('The specified account has not performed any migration') - .and raise_error(SystemExit) + .to raise_error(Thor::Error, 'The specified account has not performed any migration') end end @@ -1421,8 +1395,7 @@ describe Mastodon::CLI::Accounts do it 'exits with an error message' do expect { subject } - .to output_results('The specified account is not redirecting to its last migration target. Use --force if you want to replay the migration anyway') - .and raise_error(SystemExit) + .to raise_error(Thor::Error, 'The specified account is not redirecting to its last migration target. Use --force if you want to replay the migration anyway') end end @@ -1449,8 +1422,7 @@ describe Mastodon::CLI::Accounts do it 'exits with an error message indicating that there is no such account' do expect { subject } - .to output_results("The specified target account could not be found: #{options[:target]}") - .and raise_error(SystemExit) + .to raise_error(Thor::Error, "The specified target account could not be found: #{options[:target]}") end end @@ -1474,8 +1446,7 @@ describe Mastodon::CLI::Accounts do context 'when the migration record is invalid' do it 'exits with an error indicating that the validation failed' do expect { subject } - .to output_results('Error: Validation failed') - .and raise_error(SystemExit) + .to raise_error(Thor::Error, /Error: Validation failed/) end end @@ -1486,8 +1457,7 @@ describe Mastodon::CLI::Accounts do it 'exits with an error message' do expect { subject } - .to output_results('The specified account is redirecting to a different target account. Use --force if you want to change the migration target') - .and raise_error(SystemExit) + .to raise_error(Thor::Error, 'The specified account is redirecting to a different target account. Use --force if you want to change the migration target') end end diff --git a/spec/lib/mastodon/cli/cache_spec.rb b/spec/lib/mastodon/cli/cache_spec.rb index b1515801eb..247a14f9e2 100644 --- a/spec/lib/mastodon/cli/cache_spec.rb +++ b/spec/lib/mastodon/cli/cache_spec.rb @@ -64,8 +64,7 @@ describe Mastodon::CLI::Cache do it 'Exits with an error message' do expect { subject } - .to output_results('Unknown') - .and raise_error(SystemExit) + .to raise_error(Thor::Error, /Unknown/) end end end diff --git a/spec/lib/mastodon/cli/email_domain_blocks_spec.rb b/spec/lib/mastodon/cli/email_domain_blocks_spec.rb index 13deb05b6c..55e3da0bb8 100644 --- a/spec/lib/mastodon/cli/email_domain_blocks_spec.rb +++ b/spec/lib/mastodon/cli/email_domain_blocks_spec.rb @@ -35,8 +35,7 @@ describe Mastodon::CLI::EmailDomainBlocks do context 'without any options' do it 'warns about usage and exits' do expect { subject } - .to output_results('No domain(s) given') - .and raise_error(SystemExit) + .to raise_error(Thor::Error, 'No domain(s) given') end end @@ -72,8 +71,7 @@ describe Mastodon::CLI::EmailDomainBlocks do context 'without any options' do it 'warns about usage and exits' do expect { subject } - .to output_results('No domain(s) given') - .and raise_error(SystemExit) + .to raise_error(Thor::Error, 'No domain(s) given') end end diff --git a/spec/lib/mastodon/cli/feeds_spec.rb b/spec/lib/mastodon/cli/feeds_spec.rb index 1997980527..420cb3d587 100644 --- a/spec/lib/mastodon/cli/feeds_spec.rb +++ b/spec/lib/mastodon/cli/feeds_spec.rb @@ -42,8 +42,7 @@ describe Mastodon::CLI::Feeds do it 'displays an error and exits' do expect { subject } - .to output_results('No such account') - .and raise_error(SystemExit) + .to raise_error(Thor::Error, 'No such account') end end end diff --git a/spec/lib/mastodon/cli/ip_blocks_spec.rb b/spec/lib/mastodon/cli/ip_blocks_spec.rb index 82be10813e..d44b1b9fe4 100644 --- a/spec/lib/mastodon/cli/ip_blocks_spec.rb +++ b/spec/lib/mastodon/cli/ip_blocks_spec.rb @@ -144,8 +144,7 @@ describe Mastodon::CLI::IpBlocks do it 'exits with an error message' do expect { subject } - .to output_results('No IP(s) given') - .and raise_error(SystemExit) + .to raise_error(Thor::Error, 'No IP(s) given') end end end @@ -235,8 +234,7 @@ describe Mastodon::CLI::IpBlocks do context 'when no IP address is provided' do it 'exits with an error message' do expect { subject } - .to output_results('No IP(s) given') - .and raise_error(SystemExit) + .to raise_error(Thor::Error, 'No IP(s) given') end end end diff --git a/spec/lib/mastodon/cli/main_spec.rb b/spec/lib/mastodon/cli/main_spec.rb index 081cd2dd47..99d770a81d 100644 --- a/spec/lib/mastodon/cli/main_spec.rb +++ b/spec/lib/mastodon/cli/main_spec.rb @@ -104,9 +104,9 @@ describe Mastodon::CLI::Main do answer_hostname_incorrectly end - it 'exits silently' do + it 'exits with mismatch error message' do expect { subject } - .to raise_error(SystemExit) + .to raise_error(Thor::Error, /Domains do not match/) end end @@ -119,7 +119,7 @@ describe Mastodon::CLI::Main do it 'passes first step but stops before instructions' do expect { subject } .to output_results('operation WILL NOT') - .and raise_error(SystemExit) + .and raise_error(Thor::Error, /Self-destruct will not begin/) end end diff --git a/spec/lib/mastodon/cli/maintenance_spec.rb b/spec/lib/mastodon/cli/maintenance_spec.rb index ca492bbf69..cde25d39ed 100644 --- a/spec/lib/mastodon/cli/maintenance_spec.rb +++ b/spec/lib/mastodon/cli/maintenance_spec.rb @@ -22,8 +22,7 @@ describe Mastodon::CLI::Maintenance do it 'Exits with error message' do expect { subject } - .to output_results('is too old') - .and raise_error(SystemExit) + .to raise_error(Thor::Error, /is too old/) end end @@ -36,7 +35,7 @@ describe Mastodon::CLI::Maintenance do it 'Exits with error message' do expect { subject } .to output_results('more recent') - .and raise_error(SystemExit) + .and raise_error(Thor::Error, /more recent/) end end @@ -48,8 +47,7 @@ describe Mastodon::CLI::Maintenance do it 'Exits with error message' do expect { subject } - .to output_results('Sidekiq is running') - .and raise_error(SystemExit) + .to raise_error(Thor::Error, /Sidekiq is running/) end end diff --git a/spec/lib/mastodon/cli/media_spec.rb b/spec/lib/mastodon/cli/media_spec.rb index 10005107aa..ecc7101b6c 100644 --- a/spec/lib/mastodon/cli/media_spec.rb +++ b/spec/lib/mastodon/cli/media_spec.rb @@ -20,8 +20,7 @@ describe Mastodon::CLI::Media do it 'warns about usage and exits' do expect { subject } - .to output_results('--prune-profiles and --remove-headers should not be specified simultaneously') - .and raise_error(SystemExit) + .to raise_error(Thor::Error, '--prune-profiles and --remove-headers should not be specified simultaneously') end end @@ -30,8 +29,7 @@ describe Mastodon::CLI::Media do it 'warns about usage and exits' do expect { subject } - .to output_results('--include-follows can only be used with --prune-profiles or --remove-headers') - .and raise_error(SystemExit) + .to raise_error(Thor::Error, '--include-follows can only be used with --prune-profiles or --remove-headers') end end @@ -98,8 +96,7 @@ describe Mastodon::CLI::Media do it 'warns about url and exits' do expect { subject } - .to output_results('Not a media URL') - .and raise_error(SystemExit) + .to raise_error(Thor::Error, 'Not a media URL') end end @@ -121,8 +118,7 @@ describe Mastodon::CLI::Media do context 'without any options' do it 'warns about usage and exits' do expect { subject } - .to output_results('Specify the source') - .and raise_error(SystemExit) + .to raise_error(Thor::Error, /Specify the source/) end end @@ -147,8 +143,7 @@ describe Mastodon::CLI::Media do it 'warns about usage and exits' do expect { subject } - .to output_results('No such account') - .and raise_error(SystemExit) + .to raise_error(Thor::Error, 'No such account') end end @@ -221,8 +216,7 @@ describe Mastodon::CLI::Media do it 'warns about usage and exits' do expect { subject } - .to output_results('azure storage driver is not supported') - .and raise_error(SystemExit) + .to raise_error(Thor::Error, /azure storage driver is not supported/) end end @@ -233,8 +227,7 @@ describe Mastodon::CLI::Media do it 'warns about usage and exits' do expect { subject } - .to output_results('fog storage driver is not supported') - .and raise_error(SystemExit) + .to raise_error(Thor::Error, /fog storage driver is not supported/) end end diff --git a/spec/lib/mastodon/cli/search_spec.rb b/spec/lib/mastodon/cli/search_spec.rb index cb0c80c11d..8cce2c6ee2 100644 --- a/spec/lib/mastodon/cli/search_spec.rb +++ b/spec/lib/mastodon/cli/search_spec.rb @@ -20,8 +20,7 @@ describe Mastodon::CLI::Search do it 'Exits with error message' do expect { subject } - .to output_results('this concurrency setting') - .and raise_error(SystemExit) + .to raise_error(Thor::Error, /this concurrency setting/) end end @@ -30,8 +29,7 @@ describe Mastodon::CLI::Search do it 'Exits with error message' do expect { subject } - .to output_results('this batch_size setting') - .and raise_error(SystemExit) + .to raise_error(Thor::Error, /this batch_size setting/) end end diff --git a/spec/lib/mastodon/cli/statuses_spec.rb b/spec/lib/mastodon/cli/statuses_spec.rb index 63d494bbb6..161b7c02bb 100644 --- a/spec/lib/mastodon/cli/statuses_spec.rb +++ b/spec/lib/mastodon/cli/statuses_spec.rb @@ -20,8 +20,7 @@ describe Mastodon::CLI::Statuses do it 'exits with error message' do expect { subject } - .to output_results('Cannot run') - .and raise_error(SystemExit) + .to raise_error(Thor::Error, /Cannot run/) end end From 45287049abc0587ece709acc1d366f9e1acc3d71 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Fri, 26 Jan 2024 10:15:55 +0100 Subject: [PATCH 003/211] New Crowdin Translations (automated) (#28923) Co-authored-by: GitHub Actions --- app/javascript/mastodon/locales/af.json | 16 ------ app/javascript/mastodon/locales/an.json | 21 -------- app/javascript/mastodon/locales/ar.json | 21 -------- app/javascript/mastodon/locales/ast.json | 16 +----- app/javascript/mastodon/locales/be.json | 21 -------- app/javascript/mastodon/locales/bg.json | 36 +++++++------- app/javascript/mastodon/locales/bn.json | 18 ------- app/javascript/mastodon/locales/br.json | 21 -------- app/javascript/mastodon/locales/bs.json | 2 - app/javascript/mastodon/locales/ca.json | 34 ++++++------- app/javascript/mastodon/locales/ckb.json | 21 -------- app/javascript/mastodon/locales/co.json | 16 ------ app/javascript/mastodon/locales/cs.json | 21 -------- app/javascript/mastodon/locales/cy.json | 21 -------- app/javascript/mastodon/locales/da.json | 37 +++++++------- app/javascript/mastodon/locales/de.json | 41 ++++++++-------- app/javascript/mastodon/locales/el.json | 51 +++++++++++++------- app/javascript/mastodon/locales/en-GB.json | 21 -------- app/javascript/mastodon/locales/eo.json | 21 -------- app/javascript/mastodon/locales/es-AR.json | 27 ++++------- app/javascript/mastodon/locales/es-MX.json | 39 ++++++++------- app/javascript/mastodon/locales/es.json | 31 +++++------- app/javascript/mastodon/locales/et.json | 32 ++++++------ app/javascript/mastodon/locales/eu.json | 37 +++++++------- app/javascript/mastodon/locales/fa.json | 33 ++++++------- app/javascript/mastodon/locales/fi.json | 37 +++++++------- app/javascript/mastodon/locales/fo.json | 37 +++++++------- app/javascript/mastodon/locales/fr-CA.json | 21 -------- app/javascript/mastodon/locales/fr.json | 21 -------- app/javascript/mastodon/locales/fy.json | 21 -------- app/javascript/mastodon/locales/ga.json | 15 ------ app/javascript/mastodon/locales/gd.json | 21 -------- app/javascript/mastodon/locales/gl.json | 21 -------- app/javascript/mastodon/locales/he.json | 38 +++++++-------- app/javascript/mastodon/locales/hi.json | 19 -------- app/javascript/mastodon/locales/hr.json | 20 -------- app/javascript/mastodon/locales/hu.json | 41 ++++++++-------- app/javascript/mastodon/locales/hy.json | 19 -------- app/javascript/mastodon/locales/ia.json | 11 ----- app/javascript/mastodon/locales/id.json | 21 -------- app/javascript/mastodon/locales/ie.json | 30 +++++------- app/javascript/mastodon/locales/ig.json | 3 -- app/javascript/mastodon/locales/io.json | 21 -------- app/javascript/mastodon/locales/is.json | 33 ++++++------- app/javascript/mastodon/locales/it.json | 39 ++++++++------- app/javascript/mastodon/locales/ja.json | 21 -------- app/javascript/mastodon/locales/ka.json | 11 ----- app/javascript/mastodon/locales/kab.json | 18 ------- app/javascript/mastodon/locales/kk.json | 15 ------ app/javascript/mastodon/locales/kn.json | 4 -- app/javascript/mastodon/locales/ko.json | 37 +++++++------- app/javascript/mastodon/locales/ku.json | 21 -------- app/javascript/mastodon/locales/kw.json | 16 ------ app/javascript/mastodon/locales/la.json | 6 --- app/javascript/mastodon/locales/lad.json | 21 -------- app/javascript/mastodon/locales/lt.json | 34 ++++++------- app/javascript/mastodon/locales/lv.json | 21 -------- app/javascript/mastodon/locales/mk.json | 13 ----- app/javascript/mastodon/locales/ml.json | 12 ----- app/javascript/mastodon/locales/mr.json | 8 --- app/javascript/mastodon/locales/ms.json | 21 -------- app/javascript/mastodon/locales/my.json | 21 -------- app/javascript/mastodon/locales/ne.json | 9 +--- app/javascript/mastodon/locales/nl.json | 41 ++++++++-------- app/javascript/mastodon/locales/nn.json | 40 ++++++++------- app/javascript/mastodon/locales/no.json | 34 ++++++------- app/javascript/mastodon/locales/oc.json | 21 -------- app/javascript/mastodon/locales/pa.json | 6 --- app/javascript/mastodon/locales/pl.json | 26 ++++------ app/javascript/mastodon/locales/pt-BR.json | 33 ++++++------- app/javascript/mastodon/locales/pt-PT.json | 35 +++++++------- app/javascript/mastodon/locales/ro.json | 21 -------- app/javascript/mastodon/locales/ru.json | 21 -------- app/javascript/mastodon/locales/sa.json | 20 -------- app/javascript/mastodon/locales/sc.json | 18 ------- app/javascript/mastodon/locales/sco.json | 21 -------- app/javascript/mastodon/locales/si.json | 16 ------ app/javascript/mastodon/locales/sk.json | 21 -------- app/javascript/mastodon/locales/sl.json | 21 -------- app/javascript/mastodon/locales/sq.json | 41 ++++++++-------- app/javascript/mastodon/locales/sr-Latn.json | 21 -------- app/javascript/mastodon/locales/sr.json | 39 ++++++++------- app/javascript/mastodon/locales/sv.json | 31 ++++-------- app/javascript/mastodon/locales/szl.json | 2 - app/javascript/mastodon/locales/ta.json | 18 ------- app/javascript/mastodon/locales/tai.json | 2 - app/javascript/mastodon/locales/te.json | 13 ----- app/javascript/mastodon/locales/th.json | 21 -------- app/javascript/mastodon/locales/tr.json | 21 -------- app/javascript/mastodon/locales/tt.json | 17 ------- app/javascript/mastodon/locales/ug.json | 2 - app/javascript/mastodon/locales/uk.json | 22 +-------- app/javascript/mastodon/locales/ur.json | 16 ------ app/javascript/mastodon/locales/uz.json | 14 ------ app/javascript/mastodon/locales/vi.json | 21 -------- app/javascript/mastodon/locales/zgh.json | 7 --- app/javascript/mastodon/locales/zh-CN.json | 35 +++++++------- app/javascript/mastodon/locales/zh-HK.json | 39 ++++++++------- app/javascript/mastodon/locales/zh-TW.json | 35 +++++++------- config/locales/bg.yml | 3 ++ config/locales/eu.yml | 6 +-- config/locales/fa.yml | 1 + config/locales/hi.yml | 9 ++++ config/locales/hu.yml | 3 +- config/locales/ie.yml | 3 ++ config/locales/ja.yml | 3 ++ config/locales/zh-TW.yml | 2 +- 107 files changed, 568 insertions(+), 1727 deletions(-) diff --git a/app/javascript/mastodon/locales/af.json b/app/javascript/mastodon/locales/af.json index d1873d6dce..d2ac2f8f27 100644 --- a/app/javascript/mastodon/locales/af.json +++ b/app/javascript/mastodon/locales/af.json @@ -66,7 +66,6 @@ "alert.unexpected.message": "Iets het skeefgeloop.", "alert.unexpected.title": "Oeps!", "announcement.announcement": "Aankondiging", - "autosuggest_hashtag.per_week": "{count} per week", "boost_modal.combo": "Druk {combo} om dit volgende keer oor te slaan", "bundle_column_error.error.title": "Ag nee!", "bundle_column_error.network.title": "Netwerkfout", @@ -111,19 +110,12 @@ "compose_form.lock_disclaimer": "Jou rekening is nie {locked} nie. Enigiemand kan jou volg en sien wat jy vir jou volgers plaas.", "compose_form.lock_disclaimer.lock": "gesluit", "compose_form.placeholder": "Wat wil jy deel?", - "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 peiling om meer as een keuse toe te laat", "compose_form.poll.switch_to_single": "Verander die peiling om slegs een keuse toe te laat", - "compose_form.publish": "Publiseer", "compose_form.publish_form": "Publiseer", - "compose_form.publish_loud": "{publish}!", - "compose_form.save_changes": "Stoor veranderinge", "compose_form.spoiler.marked": "Verwyder inhoudswaarskuwing", "compose_form.spoiler.unmarked": "Voeg inhoudswaarskuwing by", - "compose_form.spoiler_placeholder": "Skryf jou waarskuwing hier", "confirmation_modal.cancel": "Kanselleer", "confirmations.block.block_and_report": "Blokkeer en rapporteer", "confirmations.block.confirm": "Blokkeer", @@ -234,7 +226,6 @@ "navigation_bar.community_timeline": "Plaaslike tydlyn", "navigation_bar.compose": "Skep nuwe plasing", "navigation_bar.domain_blocks": "Geblokkeerde domeine", - "navigation_bar.edit_profile": "Redigeer profiel", "navigation_bar.lists": "Lyste", "navigation_bar.logout": "Teken uit", "navigation_bar.personal": "Persoonlik", @@ -267,14 +258,7 @@ "onboarding.steps.share_profile.body": "Let your friends know how to find you on Mastodon!", "onboarding.steps.share_profile.title": "Share your profile", "privacy.change": "Verander privaatheid van plasing", - "privacy.direct.long": "Slegs sigbaar vir genoemde gebruikers", - "privacy.direct.short": "Slegs genoemde persone", - "privacy.private.long": "Slegs sigbaar vir volgelinge", - "privacy.private.short": "Slegs volgelinge", - "privacy.public.long": "Sigbaar vir almal", "privacy.public.short": "Publiek", - "privacy.unlisted.long": "Sigbaar vir almal, maar onttrek uit verkennings-kenmerke", - "privacy.unlisted.short": "Ongelys", "privacy_policy.last_updated": "Laaste bywerking op {date}", "privacy_policy.title": "Privaatheidsbeleid", "regeneration_indicator.sublabel": "Jou tuis-voer word voorberei!", diff --git a/app/javascript/mastodon/locales/an.json b/app/javascript/mastodon/locales/an.json index 23899b1007..e9d609a1ce 100644 --- a/app/javascript/mastodon/locales/an.json +++ b/app/javascript/mastodon/locales/an.json @@ -75,7 +75,6 @@ "announcement.announcement": "Anuncio", "attachments_list.unprocessed": "(sin procesar)", "audio.hide": "Amagar audio", - "autosuggest_hashtag.per_week": "{count} per semana", "boost_modal.combo": "Puetz fer clic en {combo} pa blincar este aviso la proxima vegada", "bundle_column_error.copy_stacktrace": "Copiar informe d'error", "bundle_column_error.error.body": "La pachina solicitada no podió estar renderizada. Podría deber-se a una error en o nuestro codigo u a un problema de compatibilidat con o navegador.", @@ -126,22 +125,12 @@ "compose_form.lock_disclaimer": "La tuya cuenta no ye {locked}. Totz pueden seguir-te pa veyer las tuyas publicacions nomás pa seguidores.", "compose_form.lock_disclaimer.lock": "blocau", "compose_form.placeholder": "En qué yes pensando?", - "compose_form.poll.add_option": "Anyadir una opción", "compose_form.poll.duration": "Duración d'a enqüesta", - "compose_form.poll.option_placeholder": "Elección {number}", - "compose_form.poll.remove_option": "Eliminar esta opción", "compose_form.poll.switch_to_multiple": "Modificar enqüesta pa permitir multiples opcions", "compose_form.poll.switch_to_single": "Modificar enqüesta pa permitir una sola opción", - "compose_form.publish": "Publicar", "compose_form.publish_form": "Publicar", - "compose_form.publish_loud": "{publish}!", - "compose_form.save_changes": "Alzar cambios", - "compose_form.sensitive.hide": "{count, plural, one {Marcar material como sensible} other {Marcar material como sensible}}", - "compose_form.sensitive.marked": "{count, plural, one {Material marcau como sensible} other {Material marcau como sensible}}", - "compose_form.sensitive.unmarked": "{count, plural, one {Material no marcau como sensible} other {Material no marcau como sensible}}", "compose_form.spoiler.marked": "Texto amagau dimpués de l'alvertencia", "compose_form.spoiler.unmarked": "Texto no amagau", - "compose_form.spoiler_placeholder": "Alvertencia de conteniu", "confirmation_modal.cancel": "Cancelar", "confirmations.block.block_and_report": "Blocar y Denunciar", "confirmations.block.confirm": "Blocar", @@ -345,7 +334,6 @@ "navigation_bar.compose": "Escribir nueva publicación", "navigation_bar.discover": "Descubrir", "navigation_bar.domain_blocks": "Dominios amagaus", - "navigation_bar.edit_profile": "Editar perfil", "navigation_bar.explore": "Explorar", "navigation_bar.filters": "Parolas silenciadas", "navigation_bar.follow_requests": "Solicitutz pa seguir-te", @@ -429,14 +417,7 @@ "poll_button.add_poll": "Anyadir una enqüesta", "poll_button.remove_poll": "Eliminar enqüesta", "privacy.change": "Achustar privacidat", - "privacy.direct.long": "Nomás amostrar a los usuarios mencionaus", - "privacy.direct.short": "Nomás contas mencionadas", - "privacy.private.long": "Nomás amostrar a seguidores", - "privacy.private.short": "Solo seguidores", - "privacy.public.long": "Visible pa totz", "privacy.public.short": "Publico", - "privacy.unlisted.long": "Visible pa totz, pero excluyiu d'as funcions d'escubrimiento", - "privacy.unlisted.short": "No listau", "privacy_policy.last_updated": "Ultima vegada actualizau {date}", "privacy_policy.title": "Politica de Privacidat", "refresh": "Actualizar", @@ -590,10 +571,8 @@ "upload_error.poll": "Puyada de fichers no permitida con enqüestas.", "upload_form.audio_description": "Describir pa personas con problemas auditivos", "upload_form.description": "Describir pa los usuarios con dificultat visual", - "upload_form.description_missing": "Garra descripción anyadida", "upload_form.edit": "Editar", "upload_form.thumbnail": "Cambiar miniatura", - "upload_form.undo": "Borrar", "upload_form.video_description": "Describir pa personas con problemas auditivos u visuals", "upload_modal.analyzing_picture": "Analisando imachen…", "upload_modal.apply": "Aplicar", diff --git a/app/javascript/mastodon/locales/ar.json b/app/javascript/mastodon/locales/ar.json index c0d07cc648..5f2d151fae 100644 --- a/app/javascript/mastodon/locales/ar.json +++ b/app/javascript/mastodon/locales/ar.json @@ -86,7 +86,6 @@ "announcement.announcement": "إعلان", "attachments_list.unprocessed": "(غير معالَج)", "audio.hide": "إخفاء المقطع الصوتي", - "autosuggest_hashtag.per_week": "{count} في الأسبوع", "boost_modal.combo": "يُمكنك الضّغط على {combo} لتخطي هذا في المرة المُقبلة", "bundle_column_error.copy_stacktrace": "انسخ تقرير الخطأ", "bundle_column_error.error.body": "لا يمكن تقديم الصفحة المطلوبة. قد يكون بسبب خطأ في التعليمات البرمجية، أو مشكلة توافق المتصفح.", @@ -143,22 +142,12 @@ "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_single": "تغيِير الاستطلاع للسماح باِخيار واحد فقط", - "compose_form.publish": "نشر", "compose_form.publish_form": "منشور جديد", - "compose_form.publish_loud": "{publish}!", - "compose_form.save_changes": "احفظ التعديلات", - "compose_form.sensitive.hide": "{count, plural, one {الإشارة إلى الوَسط كمُحتوى حسّاس} two{الإشارة إلى الوسطان كمُحتويان حسّاسان} other {الإشارة إلى الوسائط كمُحتويات حسّاسة}}", - "compose_form.sensitive.marked": "{count, plural, one {تمَّ الإشارة إلى الوسط كمُحتوى حسّاس} two{تمَّ الإشارة إلى الوسطان كمُحتويان حسّاسان} other {تمَّ الإشارة إلى الوسائط كمُحتويات حسّاسة}}", - "compose_form.sensitive.unmarked": "{count, plural, one {لم تَتِمّ الإشارة إلى الوسط كمُحتوى حسّاس} two{لم تَتِمّ الإشارة إلى الوسطان كمُحتويان حسّاسان} other {لم تَتِمّ الإشارة إلى الوسائط كمُحتويات حسّاسة}}", "compose_form.spoiler.marked": "إزالة تحذير المحتوى", "compose_form.spoiler.unmarked": "إضافة تحذير للمحتوى", - "compose_form.spoiler_placeholder": "اُكتُب تحذيركَ هُنا", "confirmation_modal.cancel": "إلغاء", "confirmations.block.block_and_report": "حظره والإبلاغ عنه", "confirmations.block.confirm": "حظر", @@ -402,7 +391,6 @@ "navigation_bar.direct": "الإشارات الخاصة", "navigation_bar.discover": "اكتشف", "navigation_bar.domain_blocks": "النطاقات المحظورة", - "navigation_bar.edit_profile": "عدّل الملف التعريفي", "navigation_bar.explore": "استكشف", "navigation_bar.favourites": "المفضلة", "navigation_bar.filters": "الكلمات المكتومة", @@ -509,14 +497,7 @@ "poll_button.add_poll": "إضافة استطلاع للرأي", "poll_button.remove_poll": "إزالة استطلاع الرأي", "privacy.change": "اضبط خصوصية المنشور", - "privacy.direct.long": "مرئي للمستخدمين المذكورين فقط", - "privacy.direct.short": "الأشخاص المشار إليهم فقط", - "privacy.private.long": "أنشر لمتابعيك فقط", - "privacy.private.short": "للمتابِعين فقط", - "privacy.public.long": "مرئي للكل", "privacy.public.short": "للعامة", - "privacy.unlisted.long": "مرئي للجميع، ولكن مِن دون ميزات الاكتشاف", - "privacy.unlisted.short": "غير مدرج", "privacy_policy.last_updated": "آخر تحديث {date}", "privacy_policy.title": "سياسة الخصوصية", "refresh": "أنعِش", @@ -696,10 +677,8 @@ "upload_error.poll": "لا يمكن إدراج ملفات في استطلاعات الرأي.", "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_modal.analyzing_picture": "جارٍ فحص الصورة…", "upload_modal.apply": "طبّق", diff --git a/app/javascript/mastodon/locales/ast.json b/app/javascript/mastodon/locales/ast.json index 1467f8891e..479c9c9243 100644 --- a/app/javascript/mastodon/locales/ast.json +++ b/app/javascript/mastodon/locales/ast.json @@ -66,7 +66,6 @@ "alert.unexpected.title": "¡Meca!", "announcement.announcement": "Anunciu", "attachments_list.unprocessed": "(ensin procesar)", - "autosuggest_hashtag.per_week": "{count} per selmana", "bundle_column_error.error.body": "La páxina solicitada nun se pudo renderizar. Ye posible que seya pola mor d'un fallu nel códigu o por un problema de compatibilidá del restolador.", "bundle_column_error.error.title": "¡Oh, non!", "bundle_column_error.network.body": "Hebo un error al tentar de cargar esta páxina. Esto pudo ser pola mor d'un problema temporal cola conexón a internet o con esti sirvidor.", @@ -109,13 +108,9 @@ "compose_form.lock_disclaimer": "La to cuenta nun ye {locked}. Cualesquier perfil pue siguite pa ver los artículos que son namás pa siguidores.", "compose_form.lock_disclaimer.lock": "privada", "compose_form.placeholder": "¿En qué pienses?", - "compose_form.poll.add_option": "Amestar una opción", "compose_form.poll.option_placeholder": "Opción {number}", - "compose_form.poll.remove_option": "Quitar esta opción", - "compose_form.publish": "Espublizar", + "compose_form.poll.type": "Estilu", "compose_form.publish_form": "Artículu nuevu", - "compose_form.publish_loud": "¡{publish}!", - "compose_form.save_changes": "Guardar los cambeos", "confirmation_modal.cancel": "Encaboxar", "confirmations.block.block_and_report": "Bloquiar ya informar", "confirmations.block.confirm": "Bloquiar", @@ -286,7 +281,6 @@ "navigation_bar.community_timeline": "Llinia de tiempu llocal", "navigation_bar.direct": "Menciones privaes", "navigation_bar.domain_blocks": "Dominios bloquiaos", - "navigation_bar.edit_profile": "Editar el perfil", "navigation_bar.explore": "Esploración", "navigation_bar.filters": "Pallabres desactivaes", "navigation_bar.follow_requests": "Solicitúes de siguimientu", @@ -346,12 +340,7 @@ "poll_button.add_poll": "Amestar una encuesta", "poll_button.remove_poll": "Quitar la encuesta", "privacy.change": "Configurar la privacidá del artículu", - "privacy.direct.long": "Artículu visible namás pa los perfiles mentaos", - "privacy.private.long": "Artículu visible namás pa los perfiles siguidores", - "privacy.private.short": "Namás pa siguidores", - "privacy.public.long": "Tol mundu pue ver l'artículu", "privacy.public.short": "Artículu públicu", - "privacy.unlisted.long": "Artículu visible pa tol mundu mas escluyíu de les funciones de descubrimientu", "privacy_policy.last_updated": "Data del últimu anovamientu: {date}", "privacy_policy.title": "Política de privacidá", "refresh": "Anovar", @@ -368,6 +357,7 @@ "relative_time.seconds": "{number} s", "relative_time.today": "güei", "reply_indicator.cancel": "Encaboxar", + "reply_indicator.poll": "Encuesta", "report.block": "Bloquiar", "report.categories.spam": "Spam", "report.categories.violation": "El conteníu incumple una o más normes del sirvidor", @@ -492,9 +482,7 @@ "upload_button.label": "Amestar ficheros multimedia", "upload_error.poll": "La xuba de ficheros nun ta permitida coles encuestes.", "upload_form.audio_description": "Describi'l conteníu pa persones sordes ya/o ciegues", - "upload_form.description_missing": "Nun s'amestó la descripción", "upload_form.edit": "Editar", - "upload_form.undo": "Desaniciar", "upload_modal.analyzing_picture": "Analizando la semeya…", "upload_modal.apply": "Aplicar", "upload_modal.applying": "Aplicando…", diff --git a/app/javascript/mastodon/locales/be.json b/app/javascript/mastodon/locales/be.json index 773af40343..e069515109 100644 --- a/app/javascript/mastodon/locales/be.json +++ b/app/javascript/mastodon/locales/be.json @@ -89,7 +89,6 @@ "announcement.announcement": "Аб'ява", "attachments_list.unprocessed": "(неапрацаваны)", "audio.hide": "Схаваць аўдыя", - "autosuggest_hashtag.per_week": "{count} за тыдзень", "boost_modal.combo": "Націсніце {combo}, каб прапусціць наступным разам", "bundle_column_error.copy_stacktrace": "Скапіраваць справаздачу пра памылку", "bundle_column_error.error.body": "Запытаная старонка не можа быць адлюстраваная. Гэта магло стацца праз хібу ў нашым кодзе, або праз памылку сумяшчальнасці з браўзерам.", @@ -146,22 +145,12 @@ "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_single": "Змяніце апытанне, каб дазволіць адзіны варыянт адказу", - "compose_form.publish": "Апублікаваць", "compose_form.publish_form": "Апублікаваць", - "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": "Выдаліць папярэджанне аб змесціве", "compose_form.spoiler.unmarked": "Дадаць папярэджанне аб змесціве", - "compose_form.spoiler_placeholder": "Напішыце сваё папярэджанне тут", "confirmation_modal.cancel": "Скасаваць", "confirmations.block.block_and_report": "Заблакіраваць і паскардзіцца", "confirmations.block.confirm": "Заблакіраваць", @@ -408,7 +397,6 @@ "navigation_bar.direct": "Асабістыя згадванні", "navigation_bar.discover": "Даведайцесь", "navigation_bar.domain_blocks": "Заблакіраваныя дамены", - "navigation_bar.edit_profile": "Рэдагаваць профіль", "navigation_bar.explore": "Агляд", "navigation_bar.favourites": "Упадабанае", "navigation_bar.filters": "Ігнараваныя словы", @@ -526,14 +514,7 @@ "poll_button.add_poll": "Дадаць апытанне", "poll_button.remove_poll": "Выдаліць апытанне", "privacy.change": "Змяніць прыватнасць допісу", - "privacy.direct.long": "Паказаць толькі згаданым карыстальнікам", - "privacy.direct.short": "Толькі згаданыя людзі", - "privacy.private.long": "Паказаць толькі падпісчыкам", - "privacy.private.short": "Толькі для падпісчыкаў", - "privacy.public.long": "Бачны для ўсіх", "privacy.public.short": "Публічны", - "privacy.unlisted.long": "Бачна для ўсіх, але не праз магчымасці агляду", - "privacy.unlisted.short": "Не ў стужках", "privacy_policy.last_updated": "Адноўлена {date}", "privacy_policy.title": "Палітыка канфідэнцыйнасці", "recommended": "Рэкамендуем", @@ -715,10 +696,8 @@ "upload_error.poll": "Немагчыма прымацаваць файл да апытання.", "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_modal.analyzing_picture": "Аналіз выявы…", "upload_modal.apply": "Ужыць", diff --git a/app/javascript/mastodon/locales/bg.json b/app/javascript/mastodon/locales/bg.json index 7ee3c868ae..213ac090a7 100644 --- a/app/javascript/mastodon/locales/bg.json +++ b/app/javascript/mastodon/locales/bg.json @@ -89,7 +89,6 @@ "announcement.announcement": "Оповестяване", "attachments_list.unprocessed": "(необработено)", "audio.hide": "Скриване на звука", - "autosuggest_hashtag.per_week": "{count} на седмица", "boost_modal.combo": "Можете да натиснете {combo}, за да пропуснете това следващия път", "bundle_column_error.copy_stacktrace": "Копиране на доклада за грешката", "bundle_column_error.error.body": "Заявената страница не може да се изобрази. Това може да е заради грешка в кода ни или проблем със съвместимостта на браузъра.", @@ -148,20 +147,20 @@ "compose_form.placeholder": "Какво мислите?", "compose_form.poll.add_option": "Добавяне на избор", "compose_form.poll.duration": "Времетраене на анкетата", + "compose_form.poll.multiple": "Множествен избор", "compose_form.poll.option_placeholder": "Избор {number}", - "compose_form.poll.remove_option": "Премахване на този избор", + "compose_form.poll.remove_option": "Премахване на тази възможност", + "compose_form.poll.single": "Подберете нещо", "compose_form.poll.switch_to_multiple": "Промяна на анкетата, за да се позволят множество възможни избора", "compose_form.poll.switch_to_single": "Промяна на анкетата, за да се позволи един възможен избор", - "compose_form.publish": "Публикуване", + "compose_form.poll.type": "Стил", + "compose_form.publish": "Публикация", "compose_form.publish_form": "Публикуване", - "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.reply": "Отговор", + "compose_form.save_changes": "Обновяване", "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": "Блокиране", @@ -408,7 +407,6 @@ "navigation_bar.direct": "Частни споменавания", "navigation_bar.discover": "Откриване", "navigation_bar.domain_blocks": "Блокирани домейни", - "navigation_bar.edit_profile": "Редактиране на профила", "navigation_bar.explore": "Изследване", "navigation_bar.favourites": "Любими", "navigation_bar.filters": "Заглушени думи", @@ -526,14 +524,14 @@ "poll_button.add_poll": "Анкетиране", "poll_button.remove_poll": "Премахване на анкета", "privacy.change": "Промяна на поверителността на публикация", - "privacy.direct.long": "Видимо само за споменатите потребители", - "privacy.direct.short": "Само споменатите хора", - "privacy.private.long": "Видимо само за последователите", - "privacy.private.short": "Само последователи", - "privacy.public.long": "Видимо за всички", + "privacy.direct.long": "Всеки споменат в публикацията", + "privacy.direct.short": "Определени хора", + "privacy.private.long": "Само последователите ви", + "privacy.private.short": "Последователи", + "privacy.public.long": "Всеки във и извън Mastodon", "privacy.public.short": "Публично", - "privacy.unlisted.long": "Видимо за всички, но не чрез възможността за откриване", - "privacy.unlisted.short": "Несписъчно", + "privacy.unlisted.long": "По-малко алгоритмични фанфари", + "privacy.unlisted.short": "Тиха публика", "privacy_policy.last_updated": "Последно осъвременяване на {date}", "privacy_policy.title": "Политика за поверителност", "recommended": "Препоръчано", @@ -551,7 +549,9 @@ "relative_time.minutes": "{number}м.", "relative_time.seconds": "{number}с.", "relative_time.today": "днес", + "reply_indicator.attachments": "{count, plural, one {# прикаване} other {# прикачвания}}", "reply_indicator.cancel": "Отказ", + "reply_indicator.poll": "Анкета", "report.block": "Блокиране", "report.block_explanation": "Няма да им виждате публикациите. Те няма да могат да виждат публикациите ви или да ви последват. Те ще могат да казват, че са били блокирани.", "report.categories.legal": "Правни въпроси", @@ -715,10 +715,8 @@ "upload_error.poll": "Качването на файлове не е позволено с анкети.", "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_modal.analyzing_picture": "Снимков анализ…", "upload_modal.apply": "Прилагане", diff --git a/app/javascript/mastodon/locales/bn.json b/app/javascript/mastodon/locales/bn.json index fe3d2a627c..508caa2f42 100644 --- a/app/javascript/mastodon/locales/bn.json +++ b/app/javascript/mastodon/locales/bn.json @@ -85,7 +85,6 @@ "announcement.announcement": "ঘোষণা", "attachments_list.unprocessed": "(প্রক্রিয়া করা যায়নি)", "audio.hide": "অডিও লুকান", - "autosuggest_hashtag.per_week": "প্রতি সপ্তাহে {count}", "boost_modal.combo": "পরেরবার আপনি {combo} টিপলে এটি আর আসবে না", "bundle_column_error.copy_stacktrace": "এরর রিপোর্ট কপি করুন", "bundle_column_error.error.body": "অনুরোধ করা পৃষ্ঠাটি রেন্ডার করা যায়নি। এটি আমাদের কোডে একটি বাগ বা ব্রাউজার সামঞ্জস্যের সমস্যার কারণে হতে পারে।", @@ -142,22 +141,12 @@ "compose_form.lock_disclaimer": "আপনার নিবন্ধনে তালা দেওয়া নেই, যে কেও আপনাকে অনুসরণ করতে পারবে এবং অনুশারকদের জন্য লেখা দেখতে পারবে।", "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_single": "একটি একক পছন্দের অনুমতি দেওয়ার জন্য পোল পরিবর্তন করুন", - "compose_form.publish": "প্রকাশ করুন", "compose_form.publish_form": "প্রকাশ করুন", - "compose_form.publish_loud": "{publish}!", - "compose_form.save_changes": "পরিবর্তনগুলো প্রকাশ করুন", - "compose_form.sensitive.hide": "এই ছবি বা ভিডিওটি সংবেদনশীল হিসেবে চিহ্নিত করতে", - "compose_form.sensitive.marked": "এই ছবি বা ভিডিওটি সংবেদনশীল হিসেবে চিহ্নিত করা হয়েছে", - "compose_form.sensitive.unmarked": "এই ছবি বা ভিডিওটি সংবেদনশীল হিসেবে চিহ্নিত করা হয়নি", "compose_form.spoiler.marked": "সতর্কতার পিছনে লেখানটি লুকানো আছে", "compose_form.spoiler.unmarked": "লেখাটি লুকানো নেই", - "compose_form.spoiler_placeholder": "আপনার লেখা দেখার সাবধানবাণী লিখুন", "confirmation_modal.cancel": "বাতিল করুন", "confirmations.block.block_and_report": "ব্লক করুন এবং রিপোর্ট করুন", "confirmations.block.confirm": "ব্লক করুন", @@ -324,7 +313,6 @@ "navigation_bar.compose": "নতুন টুট লিখুন", "navigation_bar.discover": "ঘুরে দেখুন", "navigation_bar.domain_blocks": "লুকানো ডোমেনগুলি", - "navigation_bar.edit_profile": "নিজের পাতা সম্পাদনা করতে", "navigation_bar.explore": "পরিব্রাজন", "navigation_bar.favourites": "পছন্দসমূহ", "navigation_bar.filters": "বন্ধ করা শব্দ", @@ -395,12 +383,7 @@ "poll_button.add_poll": "একটা নির্বাচন যোগ করতে", "poll_button.remove_poll": "নির্বাচন বাদ দিতে", "privacy.change": "লেখার গোপনীয়তা অবস্থা ঠিক করতে", - "privacy.direct.long": "শুধুমাত্র উল্লেখিত ব্যবহারকারীদের কাছে লিখতে", - "privacy.direct.short": "Direct", - "privacy.private.long": "শুধুমাত্র আপনার অনুসরণকারীদের লিখতে", - "privacy.private.short": "Followers-only", "privacy.public.short": "সর্বজনীন প্রকাশ্য", - "privacy.unlisted.short": "প্রকাশ্য নয়", "refresh": "সতেজ করা", "regeneration_indicator.label": "আসছে…", "regeneration_indicator.sublabel": "আপনার বাড়ির-সময়রেখা প্রস্তূত করা হচ্ছে!", @@ -506,7 +489,6 @@ "upload_form.description": "যারা দেখতে পায়না তাদের জন্য এটা বর্ণনা করতে", "upload_form.edit": "সম্পাদন", "upload_form.thumbnail": "থাম্বনেল পরিবর্তন করুন", - "upload_form.undo": "মুছে ফেলতে", "upload_form.video_description": "শ্রবণশক্তি হ্রাস বা চাক্ষুষ প্রতিবন্ধী ব্যক্তিদের জন্য বর্ণনা করুন", "upload_modal.analyzing_picture": "চিত্র বিশ্লেষণ করা হচ্ছে…", "upload_modal.apply": "প্রয়োগ করুন", diff --git a/app/javascript/mastodon/locales/br.json b/app/javascript/mastodon/locales/br.json index ad6e55c5e1..5e83ab4e6d 100644 --- a/app/javascript/mastodon/locales/br.json +++ b/app/javascript/mastodon/locales/br.json @@ -87,7 +87,6 @@ "announcement.announcement": "Kemennad", "attachments_list.unprocessed": "(ket meret)", "audio.hide": "Kuzhat ar c'hleved", - "autosuggest_hashtag.per_week": "{count} bep sizhun", "boost_modal.combo": "Ar wezh kentañ e c'halliot gwaskañ war {combo} evit tremen hebiou", "bundle_column_error.copy_stacktrace": "Eilañ an danevell fazi", "bundle_column_error.error.body": "N'haller ket skrammañ ar bajenn goulennet. Gallout a ra bezañ abalamour d'ur beug er c'hod pe d'ur gudenn keverlec'hded gant ar merdeer.", @@ -143,22 +142,12 @@ "compose_form.lock_disclaimer": "N'eo ket {locked} ho kont. An holl a c'hal ho heuliañ evit gwelet ho toudoù prevez.", "compose_form.lock_disclaimer.lock": "prennet", "compose_form.placeholder": "Petra emaoc'h o soñjal e-barzh ?", - "compose_form.poll.add_option": "Ouzhpenniñ un dibab", "compose_form.poll.duration": "Pad ar sontadeg", - "compose_form.poll.option_placeholder": "Dibab {number}", - "compose_form.poll.remove_option": "Lemel an dibab-mañ", "compose_form.poll.switch_to_multiple": "Kemmañ ar sontadeg evit aotren meur a zibab", "compose_form.poll.switch_to_single": "Kemmañ ar sontadeg evit aotren un dibab hepken", - "compose_form.publish": "Embann", "compose_form.publish_form": "Embann", - "compose_form.publish_loud": "{publish} !", - "compose_form.save_changes": "Enrollañ ar cheñchamantoù", - "compose_form.sensitive.hide": "Merkañ ar media evel kizidik", - "compose_form.sensitive.marked": "Merket eo ar media evel kizidik", - "compose_form.sensitive.unmarked": "N'eo ket merket ar media evel kizidik", "compose_form.spoiler.marked": "Kuzhet eo an destenn a-dreñv ur c'hemenn", "compose_form.spoiler.unmarked": "N'eo ket kuzhet an destenn", - "compose_form.spoiler_placeholder": "Skrivit ho kemenn diwall amañ", "confirmation_modal.cancel": "Nullañ", "confirmations.block.block_and_report": "Berzañ ha Disklêriañ", "confirmations.block.confirm": "Stankañ", @@ -383,7 +372,6 @@ "navigation_bar.direct": "Menegoù prevez", "navigation_bar.discover": "Dizoleiñ", "navigation_bar.domain_blocks": "Domanioù kuzhet", - "navigation_bar.edit_profile": "Kemmañ ar profil", "navigation_bar.explore": "Furchal", "navigation_bar.favourites": "Muiañ-karet", "navigation_bar.filters": "Gerioù kuzhet", @@ -487,14 +475,7 @@ "poll_button.add_poll": "Ouzhpennañ ur sontadeg", "poll_button.remove_poll": "Dilemel ar sontadeg", "privacy.change": "Cheñch prevezded an toud", - "privacy.direct.long": "Embann evit an implijer·ezed·ien meneget hepken", - "privacy.direct.short": "Tud meneget hepken", - "privacy.private.long": "Embann evit ar re a heuilh ac'hanon hepken", - "privacy.private.short": "Tud koumanantet hepken", - "privacy.public.long": "Gwelus d'an holl", "privacy.public.short": "Publik", - "privacy.unlisted.long": "Gwelus gant an holl, met hep arc'hweladur dizoleiñ", - "privacy.unlisted.short": "Anlistennet", "privacy_policy.last_updated": "Hizivadenn ziwezhañ {date}", "privacy_policy.title": "Reolennoù Prevezded", "recommended": "Erbedet", @@ -667,10 +648,8 @@ "upload_error.poll": "Pellgargañ restroù n'eo ket aotreet gant sontadegoù.", "upload_form.audio_description": "Diskrivañ evit tud a zo kollet o c'hlev", "upload_form.description": "Diskrivañ evit tud a zo kollet o gweled", - "upload_form.description_missing": "Deskrivadur diank", "upload_form.edit": "Kemmañ", "upload_form.thumbnail": "Kemmañ ar velvenn", - "upload_form.undo": "Dilemel", "upload_form.video_description": "Diskrivañ evit tud a zo kollet o gweled pe o c'hlev", "upload_modal.analyzing_picture": "O tielfennañ ar skeudenn…", "upload_modal.apply": "Arloañ", diff --git a/app/javascript/mastodon/locales/bs.json b/app/javascript/mastodon/locales/bs.json index 9b6b49c3d6..c978a8b01f 100644 --- a/app/javascript/mastodon/locales/bs.json +++ b/app/javascript/mastodon/locales/bs.json @@ -66,8 +66,6 @@ "onboarding.steps.share_profile.body": "Let your friends know how to find you on Mastodon!", "onboarding.steps.share_profile.title": "Share your profile", "privacy.change": "Adjust status privacy", - "privacy.direct.short": "Direct", - "privacy.private.short": "Followers-only", "report.placeholder": "Type or paste additional comments", "report.submit": "Submit report", "report.target": "Report {target}", diff --git a/app/javascript/mastodon/locales/ca.json b/app/javascript/mastodon/locales/ca.json index c763a32ba8..0d089bf8b8 100644 --- a/app/javascript/mastodon/locales/ca.json +++ b/app/javascript/mastodon/locales/ca.json @@ -89,7 +89,6 @@ "announcement.announcement": "Anunci", "attachments_list.unprocessed": "(sense processar)", "audio.hide": "Amaga l'àudio", - "autosuggest_hashtag.per_week": "{count} per setmana", "boost_modal.combo": "Pots prémer {combo} per a evitar-ho el pròxim cop", "bundle_column_error.copy_stacktrace": "Copia l'informe d'error", "bundle_column_error.error.body": "No s'ha pogut renderitzar la pàgina sol·licitada. Podria ser per un error en el nostre codi o per un problema de compatibilitat del navegador.", @@ -146,22 +145,22 @@ "compose_form.lock_disclaimer": "El teu compte no està {locked}. Tothom pot seguir-te i veure els tuts de només per a seguidors.", "compose_form.lock_disclaimer.lock": "blocat", "compose_form.placeholder": "Què tens al cap?", - "compose_form.poll.add_option": "Afegeix una opció", + "compose_form.poll.add_option": "Afegiu una opció", "compose_form.poll.duration": "Durada de l'enquesta", + "compose_form.poll.multiple": "Opcions múltiples", "compose_form.poll.option_placeholder": "Opció {number}", - "compose_form.poll.remove_option": "Elimina aquesta opció", + "compose_form.poll.remove_option": "Treu aquesta opció", + "compose_form.poll.single": "Trieu-ne una", "compose_form.poll.switch_to_multiple": "Canvia l’enquesta per a permetre múltiples opcions", "compose_form.poll.switch_to_single": "Canvia l’enquesta per a permetre una única opció", - "compose_form.publish": "Tut", + "compose_form.poll.type": "Estil", + "compose_form.publish": "Publica", "compose_form.publish_form": "Nou tut", - "compose_form.publish_loud": "Tut!", - "compose_form.save_changes": "Desa els canvis", - "compose_form.sensitive.hide": "{count, plural, one {Marca mèdia com a sensible} other {Marca mèdia com a sensible}}", - "compose_form.sensitive.marked": "{count, plural, one {Contingut marcat com a sensible} other {Contingut marcat com a sensible}}", - "compose_form.sensitive.unmarked": "{count, plural, one {Contingut no marcat com a sensible} other {Contingut no marcat com a sensible}}", + "compose_form.reply": "Responeu", + "compose_form.save_changes": "Actualitza", "compose_form.spoiler.marked": "Elimina l'avís de contingut", "compose_form.spoiler.unmarked": "Afegeix avís de contingut", - "compose_form.spoiler_placeholder": "Escriu l'avís aquí", + "compose_form.spoiler_placeholder": "Avís de contingut (opcional)", "confirmation_modal.cancel": "Cancel·la", "confirmations.block.block_and_report": "Bloca i denuncia", "confirmations.block.confirm": "Bloca", @@ -408,7 +407,6 @@ "navigation_bar.direct": "Mencions privades", "navigation_bar.discover": "Descobreix", "navigation_bar.domain_blocks": "Dominis blocats", - "navigation_bar.edit_profile": "Edita el perfil", "navigation_bar.explore": "Explora", "navigation_bar.favourites": "Favorits", "navigation_bar.filters": "Paraules silenciades", @@ -526,14 +524,12 @@ "poll_button.add_poll": "Afegeix una enquesta", "poll_button.remove_poll": "Elimina l'enquesta", "privacy.change": "Canvia la privacitat del tut", - "privacy.direct.long": "Visible només per als usuaris esmentats", - "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 a tothom", + "privacy.direct.long": "Tothom mencionat en aquesta publicació", + "privacy.direct.short": "Persones concretes", + "privacy.private.long": "Només els vostres seguidors", + "privacy.private.short": "Seguidors", + "privacy.public.long": "Tothom dins o fora Mastodon", "privacy.public.short": "Públic", - "privacy.unlisted.long": "Visible per a tothom però exclosa de les funcions de descobriment", - "privacy.unlisted.short": "No llistada", "privacy_policy.last_updated": "Darrera actualització {date}", "privacy_policy.title": "Política de Privacitat", "recommended": "Recomanat", @@ -715,10 +711,8 @@ "upload_error.poll": "No es permet carregar fitxers a les enquestes.", "upload_form.audio_description": "Descriu-ho per a persones amb problemes d'audició", "upload_form.description": "Descriu-ho per a persones amb problemes de visió", - "upload_form.description_missing": "No s'hi ha afegit cap descripció", "upload_form.edit": "Edita", "upload_form.thumbnail": "Canvia la miniatura", - "upload_form.undo": "Elimina", "upload_form.video_description": "Descriu-ho per a persones amb problemes de visió o audició", "upload_modal.analyzing_picture": "S'analitza la imatge…", "upload_modal.apply": "Aplica", diff --git a/app/javascript/mastodon/locales/ckb.json b/app/javascript/mastodon/locales/ckb.json index f1cafd1ac4..73910f9b7c 100644 --- a/app/javascript/mastodon/locales/ckb.json +++ b/app/javascript/mastodon/locales/ckb.json @@ -76,7 +76,6 @@ "announcement.announcement": "بانگەواز", "attachments_list.unprocessed": "(unprocessed)", "audio.hide": "شاردنەوەی دەنگ", - "autosuggest_hashtag.per_week": "{count} هەرهەفتە", "boost_modal.combo": "دەتوانیت دەست بنێی بە سەر {combo} بۆ بازدان لە جاری داهاتوو", "bundle_column_error.copy_stacktrace": "ڕاپۆرتی هەڵەی کۆپی بکە", "bundle_column_error.error.body": "لاپەڕەی داواکراو نەتوانرا ڕەندەر بکرێت. دەکرێت بەهۆی هەڵەیەکی کۆدەکەمانەوە بێت، یان کێشەی گونجانی وێبگەڕ.", @@ -128,22 +127,12 @@ "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_single": "گۆڕینی ڕاپرسی بۆ ڕێگەدان بە تاکە هەڵبژاردنێک", - "compose_form.publish": "بڵاوی بکەوە", "compose_form.publish_form": "بڵاوی بکەوە", - "compose_form.publish_loud": "{publish}!", - "compose_form.save_changes": "پاشکەوتی گۆڕانکاریەکان", - "compose_form.sensitive.hide": "نیشانکردنی میدیا وەک هەستیار", - "compose_form.sensitive.marked": "وادەی کۆتایی", - "compose_form.sensitive.unmarked": "میدیا وەک هەستیار نیشان نەکراوە", "compose_form.spoiler.marked": "دەق لە پشت ئاگاداریدا شاراوەتەوە", "compose_form.spoiler.unmarked": "دەق شاراوە نییە", - "compose_form.spoiler_placeholder": "ئاگاداریەکەت لێرە بنووسە", "confirmation_modal.cancel": "هەڵوەشاندنەوه", "confirmations.block.block_and_report": "بلۆک & گوزارشت", "confirmations.block.confirm": "بلۆک", @@ -354,7 +343,6 @@ "navigation_bar.direct": "ئاماژەی تایبەت", "navigation_bar.discover": "دۆزینەوە", "navigation_bar.domain_blocks": "دۆمەینە بلۆک کراوەکان", - "navigation_bar.edit_profile": "دەستکاری پرۆفایل بکە", "navigation_bar.explore": "گەڕان", "navigation_bar.filters": "وشە کپەکان", "navigation_bar.follow_requests": "بەدواداچوی داواکاریەکان بکە", @@ -439,14 +427,7 @@ "poll_button.add_poll": "ڕاپرسییەک زیاد بکە", "poll_button.remove_poll": "ده‌نگدان بسڕه‌وه‌‌", "privacy.change": "ڕێکخستنی تایبەتمەندی توت", - "privacy.direct.long": "تەنیا بۆ بەکارهێنەرانی ناوبراو", - "privacy.direct.short": "تەنها کەسانی باس کراو", - "privacy.private.long": "بینراو تەنها بۆ شوێنکەوتوان", - "privacy.private.short": "تەنیا شوێنکەوتووان", - "privacy.public.long": "بۆ هەمووان دیارە", "privacy.public.short": "گشتی", - "privacy.unlisted.long": "بۆ هەمووان دیارە، بەڵام لە تایبەتمەندییەکانی دۆزینەوە دەرچووە", - "privacy.unlisted.short": "لە لیست نەکراو", "privacy_policy.last_updated": "دوایین نوێکردنەوە {date}", "privacy_policy.title": "سیاسەتی تایبەتێتی", "refresh": "نوێکردنەوە", @@ -610,10 +591,8 @@ "upload_error.poll": "فایل و ڕاپرسی پێکەوە ڕێپێنەدراون.", "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_modal.analyzing_picture": "وێنەکە شی دەکرێتەوە…", "upload_modal.apply": "بیسەپێنە", diff --git a/app/javascript/mastodon/locales/co.json b/app/javascript/mastodon/locales/co.json index 9f90c3d211..9d0b0306c8 100644 --- a/app/javascript/mastodon/locales/co.json +++ b/app/javascript/mastodon/locales/co.json @@ -45,7 +45,6 @@ "alert.unexpected.title": "Uups!", "announcement.announcement": "Annunziu", "attachments_list.unprocessed": "(micca trattata)", - "autosuggest_hashtag.per_week": "{count} per settimana", "boost_modal.combo": "Pudete appughjà nant'à {combo} per saltà quessa a prussima volta", "bundle_column_error.retry": "Pruvà torna", "bundle_modal_error.close": "Chjudà", @@ -80,20 +79,12 @@ "compose_form.lock_disclaimer": "U vostru contu ùn hè micca {locked}. Tuttu u mondu pò seguitavi è vede i vostri statuti privati.", "compose_form.lock_disclaimer.lock": "privatu", "compose_form.placeholder": "À chè pensate?", - "compose_form.poll.add_option": "Aghjunghje scelta", "compose_form.poll.duration": "Durata di u scandagliu", - "compose_form.poll.option_placeholder": "Scelta {number}", - "compose_form.poll.remove_option": "Toglie sta scelta", "compose_form.poll.switch_to_multiple": "Cambià u scandagliu per accittà parechje scelte", "compose_form.poll.switch_to_single": "Cambià u scandagliu per ùn accittà ch'una scelta", "compose_form.publish_form": "Publish", - "compose_form.publish_loud": "{publish}!", - "compose_form.sensitive.hide": "{count, plural, one {Indicà u media cum'è sensibile} other {Indicà i media cum'è sensibili}}", - "compose_form.sensitive.marked": "{count, plural, one {Media indicatu cum'è sensibile} other {Media indicati cum'è sensibili}}", - "compose_form.sensitive.unmarked": "{count, plural, one {Media micca indicatu cum'è sensibile} other {Media micca indicati cum'è sensibili}}", "compose_form.spoiler.marked": "Testu piattatu daret'à un'avertimentu", "compose_form.spoiler.unmarked": "Testu micca piattatu", - "compose_form.spoiler_placeholder": "Scrive u vostr'avertimentu quì", "confirmation_modal.cancel": "Annullà", "confirmations.block.block_and_report": "Bluccà è signalà", "confirmations.block.confirm": "Bluccà", @@ -245,7 +236,6 @@ "navigation_bar.compose": "Scrive un novu statutu", "navigation_bar.discover": "Scopre", "navigation_bar.domain_blocks": "Duminii piattati", - "navigation_bar.edit_profile": "Mudificà u prufile", "navigation_bar.filters": "Parolle silenzate", "navigation_bar.follow_requests": "Dumande d'abbunamentu", "navigation_bar.follows_and_followers": "Abbunati è abbunamenti", @@ -318,12 +308,7 @@ "poll_button.add_poll": "Aghjunghje", "poll_button.remove_poll": "Toglie u scandagliu", "privacy.change": "Mudificà a cunfidenzialità di u statutu", - "privacy.direct.long": "Mandà solu à quelli chì so mintuvati", - "privacy.direct.short": "Direct", - "privacy.private.long": "Mustrà solu à l'abbunati", - "privacy.private.short": "Followers-only", "privacy.public.short": "Pubblicu", - "privacy.unlisted.short": "Micca listatu", "refresh": "Attualizà", "regeneration_indicator.label": "Caricamentu…", "regeneration_indicator.sublabel": "Priparazione di a vostra pagina d'accolta!", @@ -409,7 +394,6 @@ "upload_form.description": "Discrizzione per i malvistosi", "upload_form.edit": "Mudificà", "upload_form.thumbnail": "Cambià vignetta", - "upload_form.undo": "Sguassà", "upload_form.video_description": "Discrizzione per i ciochi o cechi", "upload_modal.analyzing_picture": "Analisi di u ritrattu…", "upload_modal.apply": "Affettà", diff --git a/app/javascript/mastodon/locales/cs.json b/app/javascript/mastodon/locales/cs.json index e18cabcec1..7d91670de0 100644 --- a/app/javascript/mastodon/locales/cs.json +++ b/app/javascript/mastodon/locales/cs.json @@ -87,7 +87,6 @@ "announcement.announcement": "Oznámení", "attachments_list.unprocessed": "(nezpracováno)", "audio.hide": "Skrýt zvuk", - "autosuggest_hashtag.per_week": "{count} za týden", "boost_modal.combo": "Příště můžete pro přeskočení stisknout {combo}", "bundle_column_error.copy_stacktrace": "Zkopírovat zprávu o chybě", "bundle_column_error.error.body": "Požadovanou stránku nelze vykreslit. Může to být způsobeno chybou v našem kódu nebo problémem s kompatibilitou prohlížeče.", @@ -144,22 +143,12 @@ "compose_form.lock_disclaimer": "Váš účet není {locked}. Kdokoliv vás může sledovat a vidět vaše příspěvky učené pouze pro sledující.", "compose_form.lock_disclaimer.lock": "zamčený", "compose_form.placeholder": "Co se vám honí hlavou?", - "compose_form.poll.add_option": "Přidat volbu", "compose_form.poll.duration": "Doba trvání ankety", - "compose_form.poll.option_placeholder": "Volba {number}", - "compose_form.poll.remove_option": "Odebrat tuto volbu", "compose_form.poll.switch_to_multiple": "Povolit u ankety výběr více voleb", "compose_form.poll.switch_to_single": "Povolit u ankety výběr pouze jedné volby", - "compose_form.publish": "Zveřejnit", "compose_form.publish_form": "Zveřejnit", - "compose_form.publish_loud": "{publish}!", - "compose_form.save_changes": "Uložit změny", - "compose_form.sensitive.hide": "{count, plural, one {Označit média za citlivá} few {Označit média za citlivá} many {Označit média za citlivá} other {Označit média za citlivá}}", - "compose_form.sensitive.marked": "{count, plural, one {Média jsou označena za citlivá} few {Média jsou označena za citlivá} many {Média jsou označena za citlivá} other {Média jsou označena za citlivá}}", - "compose_form.sensitive.unmarked": "{count, plural, one {Média nejsou označena za citlivá} few {Média nejsou označena za citlivá} many {Média nejsou označena za citlivá} other {Média nejsou označena za citlivá}}", "compose_form.spoiler.marked": "Odebrat varování o obsahu", "compose_form.spoiler.unmarked": "Přidat varování o obsahu", - "compose_form.spoiler_placeholder": "Sem napište vaše varování", "confirmation_modal.cancel": "Zrušit", "confirmations.block.block_and_report": "Blokovat a nahlásit", "confirmations.block.confirm": "Blokovat", @@ -401,7 +390,6 @@ "navigation_bar.direct": "Soukromé zmínky", "navigation_bar.discover": "Objevit", "navigation_bar.domain_blocks": "Blokované domény", - "navigation_bar.edit_profile": "Upravit profil", "navigation_bar.explore": "Prozkoumat", "navigation_bar.favourites": "Oblíbené", "navigation_bar.filters": "Skrytá slova", @@ -508,14 +496,7 @@ "poll_button.add_poll": "Přidat anketu", "poll_button.remove_poll": "Odebrat anketu", "privacy.change": "Změnit soukromí příspěvku", - "privacy.direct.long": "Viditelný pouze pro zmíněné uživatele", - "privacy.direct.short": "Pouze 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", "privacy.public.short": "Veřejné", - "privacy.unlisted.long": "Viditelný pro všechny, ale vyňat z funkcí objevování", - "privacy.unlisted.short": "Neveřejný", "privacy_policy.last_updated": "Naposledy aktualizováno {date}", "privacy_policy.title": "Zásady ochrany osobních údajů", "refresh": "Obnovit", @@ -695,10 +676,8 @@ "upload_error.poll": "Nahrávání souborů není povoleno s anketami.", "upload_form.audio_description": "Popis pro sluchově postižené", "upload_form.description": "Popis pro zrakově postižené", - "upload_form.description_missing": "Nebyl přidán popis", "upload_form.edit": "Upravit", "upload_form.thumbnail": "Změnit miniaturu", - "upload_form.undo": "Smazat", "upload_form.video_description": "Popis pro sluchově či zrakově postižené", "upload_modal.analyzing_picture": "Analyzuji obrázek…", "upload_modal.apply": "Použít", diff --git a/app/javascript/mastodon/locales/cy.json b/app/javascript/mastodon/locales/cy.json index 04b39904e4..3cd090e186 100644 --- a/app/javascript/mastodon/locales/cy.json +++ b/app/javascript/mastodon/locales/cy.json @@ -89,7 +89,6 @@ "announcement.announcement": "Cyhoeddiad", "attachments_list.unprocessed": "(heb eu prosesu)", "audio.hide": "Cuddio sain", - "autosuggest_hashtag.per_week": "{count} yr wythnos", "boost_modal.combo": "Mae modd pwyso {combo} er mwyn hepgor hyn tro nesa", "bundle_column_error.copy_stacktrace": "Copïo'r adroddiad gwall", "bundle_column_error.error.body": "Nid oedd modd cynhyrchu'r dudalen honno. Gall fod oherwydd gwall yn ein cod neu fater cydnawsedd porwr.", @@ -146,22 +145,12 @@ "compose_form.lock_disclaimer": "Nid yw eich cyfri wedi'i {locked}. Gall unrhyw un eich dilyn i weld eich postiadau dilynwyr-yn-unig.", "compose_form.lock_disclaimer.lock": "wedi ei gloi", "compose_form.placeholder": "Beth sydd ar eich meddwl?", - "compose_form.poll.add_option": "Ychwanegu dewis", "compose_form.poll.duration": "Cyfnod pleidlais", - "compose_form.poll.option_placeholder": "Dewis {number}", - "compose_form.poll.remove_option": "Tynnu'r dewis", "compose_form.poll.switch_to_multiple": "Newid pleidlais i adael mwy nag un dewis", "compose_form.poll.switch_to_single": "Newid pleidlais i gyfyngu i un dewis", - "compose_form.publish": "Cyhoeddi", "compose_form.publish_form": "Cyhoeddi", - "compose_form.publish_loud": "{publish}!", - "compose_form.save_changes": "Cadw newidiadau", - "compose_form.sensitive.hide": "Marcio cyfryngau fel eu bod yn sensitif", - "compose_form.sensitive.marked": "Cyfryngau wedi'u marcio'n sensitif", - "compose_form.sensitive.unmarked": "Nid yw'r cyfryngau wedi'u marcio'n sensitif", "compose_form.spoiler.marked": "Dileu rhybudd cynnwys", "compose_form.spoiler.unmarked": "Ychwanegu rhybudd cynnwys", - "compose_form.spoiler_placeholder": "Ysgrifenwch eich rhybudd yma", "confirmation_modal.cancel": "Diddymu", "confirmations.block.block_and_report": "Rhwystro ac Adrodd", "confirmations.block.confirm": "Blocio", @@ -408,7 +397,6 @@ "navigation_bar.direct": "Crybwylliadau preifat", "navigation_bar.discover": "Darganfod", "navigation_bar.domain_blocks": "Parthau wedi'u blocio", - "navigation_bar.edit_profile": "Golygu proffil", "navigation_bar.explore": "Darganfod", "navigation_bar.favourites": "Ffefrynnau", "navigation_bar.filters": "Geiriau wedi'u tewi", @@ -526,14 +514,7 @@ "poll_button.add_poll": "Ychwanegu pleidlais", "poll_button.remove_poll": "Tynnu pleidlais", "privacy.change": "Addasu preifatrwdd y post", - "privacy.direct.long": "Dim ond yn weladwy i ddefnyddwyr a grybwyllwyd", - "privacy.direct.short": "Dim ond pobl sy wedi'u crybwyll", - "privacy.private.long": "Dim ond pobl sy'n ddilynwyr", - "privacy.private.short": "Dilynwyr yn unig", - "privacy.public.long": "Gweladwy i bawb", "privacy.public.short": "Cyhoeddus", - "privacy.unlisted.long": "Gweladwy i bawb, ond wedi optio allan o nodweddion darganfod", - "privacy.unlisted.short": "Heb ei restru", "privacy_policy.last_updated": "Diweddarwyd ddiwethaf ar {date}", "privacy_policy.title": "Polisi Preifatrwydd", "recommended": "Argymhellwyd", @@ -715,10 +696,8 @@ "upload_error.poll": "Nid oes modd llwytho ffeiliau â phleidleisiau.", "upload_form.audio_description": "Disgrifio ar gyfer pobl sydd â cholled clyw", "upload_form.description": "Disgrifio i'r rheini a nam ar ei golwg", - "upload_form.description_missing": "Dim disgrifiad wedi'i ychwanegu", "upload_form.edit": "Golygu", "upload_form.thumbnail": "Newid llun bach", - "upload_form.undo": "Dileu", "upload_form.video_description": "Disgrifio ar gyfer pobl sydd â cholled clyw neu amhariad golwg", "upload_modal.analyzing_picture": "Yn dadansoddi llun…", "upload_modal.apply": "Gosod", diff --git a/app/javascript/mastodon/locales/da.json b/app/javascript/mastodon/locales/da.json index 3bc830ad27..5d6cac69d8 100644 --- a/app/javascript/mastodon/locales/da.json +++ b/app/javascript/mastodon/locales/da.json @@ -89,7 +89,6 @@ "announcement.announcement": "Bekendtgørelse", "attachments_list.unprocessed": "(ubehandlet)", "audio.hide": "Skjul lyd", - "autosuggest_hashtag.per_week": "{count} pr. uge", "boost_modal.combo": "Du kan trykke {combo} for at springe dette over næste gang", "bundle_column_error.copy_stacktrace": "Kopiér fejlrapport", "bundle_column_error.error.body": "Den anmodede side kunne ikke gengives. Dette kan skyldes flere typer fejl.", @@ -146,22 +145,22 @@ "compose_form.lock_disclaimer": "Din konto er ikke {locked}. Enhver kan følge dig og se indlæg kun beregnet for følgere.", "compose_form.lock_disclaimer.lock": "låst", "compose_form.placeholder": "Hvad tænker du på?", - "compose_form.poll.add_option": "Tilføj valgmulighed", + "compose_form.poll.add_option": "Tilføj mulighed", "compose_form.poll.duration": "Afstemningens varighed", + "compose_form.poll.multiple": "Multivalg", "compose_form.poll.option_placeholder": "Valgmulighed {number}", "compose_form.poll.remove_option": "Fjern denne valgmulighed", + "compose_form.poll.single": "Vælg én", "compose_form.poll.switch_to_multiple": "Ændr afstemning til flervalgstype", "compose_form.poll.switch_to_single": "Ændr afstemning til enkeltvalgstype", - "compose_form.publish": "Publicér", + "compose_form.poll.type": "Stil", + "compose_form.publish": "Indsend", "compose_form.publish_form": "Publicér", - "compose_form.publish_loud": "{publish}!", - "compose_form.save_changes": "Gem ændringer", - "compose_form.sensitive.hide": "{count, plural, one {Markér medie som følsomt} other {Markér medier som følsomme}}", - "compose_form.sensitive.marked": "{count, plural, one {Medie er markeret som sensitivt} other {Medier er markerede som sensitive}}", - "compose_form.sensitive.unmarked": "{count, plural, one {Medie er ikke market som sensitivt} other {Medier er ikke markerede som sensitive}}", + "compose_form.reply": "Svar", + "compose_form.save_changes": "Opdatér", "compose_form.spoiler.marked": "Fjern indholdsadvarsel", "compose_form.spoiler.unmarked": "Tilføj indholdsadvarsel", - "compose_form.spoiler_placeholder": "Skriv din advarsel hér", + "compose_form.spoiler_placeholder": "Indholdsadvarsel (valgfri)", "confirmation_modal.cancel": "Afbryd", "confirmations.block.block_and_report": "Blokér og Anmeld", "confirmations.block.confirm": "Blokér", @@ -408,7 +407,6 @@ "navigation_bar.direct": "Private omtaler", "navigation_bar.discover": "Opdag", "navigation_bar.domain_blocks": "Blokerede domæner", - "navigation_bar.edit_profile": "Redigér profil", "navigation_bar.explore": "Udforsk", "navigation_bar.favourites": "Favoritter", "navigation_bar.filters": "Skjulte ord (mutede)", @@ -526,14 +524,15 @@ "poll_button.add_poll": "Tilføj en afstemning", "poll_button.remove_poll": "Fjern afstemning", "privacy.change": "Tilpas indlægsfortrolighed", - "privacy.direct.long": "Kun synlig for nævnte brugere", - "privacy.direct.short": "Kun omtalte personer", - "privacy.private.long": "Kun synlig for følgere", - "privacy.private.short": "Kun følgere", - "privacy.public.long": "Synlig for alle", + "privacy.direct.long": "Alle nævnt i indlægget", + "privacy.direct.short": "Bestemte personer", + "privacy.private.long": "Kun dine følgere", + "privacy.private.short": "Følgere", + "privacy.public.long": "Alle på og udenfor Mastodon", "privacy.public.short": "Offentlig", - "privacy.unlisted.long": "Synlig for alle, men med fravalgt visning i opdagelsesfunktioner", - "privacy.unlisted.short": "Diskret", + "privacy.unlisted.additional": "Dette er præcis som offentlig adfærd, dog vises indlægget ikke i live feeds/hashtags, udforsk eller Mastodon-søgning, selv hvis valget gælder hele kontoen.", + "privacy.unlisted.long": "Færre algoritmiske fanfarer", + "privacy.unlisted.short": "Tavsgøre offentligt", "privacy_policy.last_updated": "Senest opdateret {date}", "privacy_policy.title": "Privatlivspolitik", "recommended": "Anbefalet", @@ -551,7 +550,9 @@ "relative_time.minutes": "{number}m", "relative_time.seconds": "{number}s", "relative_time.today": "i dag", + "reply_indicator.attachments": "{count, plural, one {# vedhæftning} other {# vedhæftninger}}", "reply_indicator.cancel": "Afbryd", + "reply_indicator.poll": "Afstemning", "report.block": "Blokér", "report.block_explanation": "Du vil ikke se vedkommendes indlæg. Vedkommende vil ikke kunne se dine indlæg eller følge dig. Vedkommende vil kunne se, at de er blokeret.", "report.categories.legal": "Juridisk", @@ -715,10 +716,8 @@ "upload_error.poll": "Filupload ikke tilladt for afstemninger.", "upload_form.audio_description": "Beskrivelse til hørehæmmede", "upload_form.description": "Beskrivelse til svagtseende", - "upload_form.description_missing": "Ingen beskrivelse tilføjet", "upload_form.edit": "Redigér", "upload_form.thumbnail": "Skift miniature", - "upload_form.undo": "Slet", "upload_form.video_description": "Beskrivelse for hørehæmmede eller synshandicappede personer", "upload_modal.analyzing_picture": "Analyserer billede…", "upload_modal.apply": "Anvend", diff --git a/app/javascript/mastodon/locales/de.json b/app/javascript/mastodon/locales/de.json index 462352750c..a6dd098bb2 100644 --- a/app/javascript/mastodon/locales/de.json +++ b/app/javascript/mastodon/locales/de.json @@ -89,7 +89,6 @@ "announcement.announcement": "Ankündigung", "attachments_list.unprocessed": "(ausstehend)", "audio.hide": "Audio ausblenden", - "autosuggest_hashtag.per_week": "{count} pro Woche", "boost_modal.combo": "Mit {combo} wird dieses Fenster beim nächsten Mal nicht mehr angezeigt", "bundle_column_error.copy_stacktrace": "Fehlerbericht kopieren", "bundle_column_error.error.body": "Die angeforderte Seite konnte nicht dargestellt werden. Dies könnte auf einen Fehler in unserem Code oder auf ein Browser-Kompatibilitätsproblem zurückzuführen sein.", @@ -146,22 +145,22 @@ "compose_form.lock_disclaimer": "Dein Profil ist nicht {locked}. Andere können dir folgen und deine Beiträge sehen, die nur für Follower bestimmt sind.", "compose_form.lock_disclaimer.lock": "geschützt", "compose_form.placeholder": "Was gibt’s Neues?", - "compose_form.poll.add_option": "Auswahl", + "compose_form.poll.add_option": "Auswahl hinzufügen", "compose_form.poll.duration": "Umfragedauer", - "compose_form.poll.option_placeholder": "{number}. Auswahl", - "compose_form.poll.remove_option": "Auswahlfeld entfernen", + "compose_form.poll.multiple": "Mehrfachauswahl", + "compose_form.poll.option_placeholder": "{number}. Auswahlmöglichkeit", + "compose_form.poll.remove_option": "Dieses Auswahlfeld entfernen", + "compose_form.poll.single": "Einfachauswahl", "compose_form.poll.switch_to_multiple": "Mehrfachauswahl erlauben", - "compose_form.poll.switch_to_single": "Nur Einzelauswahl erlauben", + "compose_form.poll.switch_to_single": "Nur Einfachauswahl erlauben", + "compose_form.poll.type": "Art", "compose_form.publish": "Veröffentlichen", "compose_form.publish_form": "Neuer Beitrag", - "compose_form.publish_loud": "{publish}!", - "compose_form.save_changes": "Änderungen speichern", - "compose_form.sensitive.hide": "{count, plural, one {Mit einer Inhaltswarnung versehen} other {Mit einer Inhaltswarnung versehen}}", - "compose_form.sensitive.marked": "{count, plural, one {Medien-Datei ist mit einer Inhaltswarnung versehen} other {Medien-Dateien sind mit einer Inhaltswarnung versehen}}", - "compose_form.sensitive.unmarked": "{count, plural, one {Medien-Datei ist nicht mit einer Inhaltswarnung versehen} other {Medien-Dateien sind nicht mit einer Inhaltswarnung versehen}}", + "compose_form.reply": "Antworten", + "compose_form.save_changes": "Aktualisieren", "compose_form.spoiler.marked": "Inhaltswarnung entfernen", "compose_form.spoiler.unmarked": "Inhaltswarnung hinzufügen", - "compose_form.spoiler_placeholder": "Inhaltswarnung", + "compose_form.spoiler_placeholder": "Inhaltswarnung (optional)", "confirmation_modal.cancel": "Abbrechen", "confirmations.block.block_and_report": "Blockieren und melden", "confirmations.block.confirm": "Blockieren", @@ -408,7 +407,6 @@ "navigation_bar.direct": "Private Erwähnungen", "navigation_bar.discover": "Entdecken", "navigation_bar.domain_blocks": "Blockierte Domains", - "navigation_bar.edit_profile": "Profil bearbeiten", "navigation_bar.explore": "Entdecken", "navigation_bar.favourites": "Favoriten", "navigation_bar.filters": "Stummgeschaltete Wörter", @@ -526,14 +524,15 @@ "poll_button.add_poll": "Umfrage erstellen", "poll_button.remove_poll": "Umfrage entfernen", "privacy.change": "Sichtbarkeit anpassen", - "privacy.direct.long": "Nur für die erwähnten Profile sichtbar", - "privacy.direct.short": "Nur erwähnte Profile", - "privacy.private.long": "Nur für deine Follower sichtbar", - "privacy.private.short": "Nur Follower", - "privacy.public.long": "Für alle sichtbar", + "privacy.direct.long": "Alle in diesem Beitrag erwähnten Profile", + "privacy.direct.short": "Bestimmte Profile", + "privacy.private.long": "Nur deine Follower", + "privacy.private.short": "Follower", + "privacy.public.long": "Alle auf und außerhalb von Mastodon", "privacy.public.short": "Öffentlich", - "privacy.unlisted.long": "Für alle sichtbar, aber nicht über die Suche zu finden", - "privacy.unlisted.short": "Nicht gelistet", + "privacy.unlisted.additional": "Das Verhalten ist wie bei „Öffentlich“, jedoch erscheint dieser Beitrag nicht in „Live-Feeds“, „Erkunden“, Hashtags oder über die Mastodon-Suchfunktion – selbst wenn du das in den Einstellungen aktiviert hast.", + "privacy.unlisted.long": "Weniger im Algorithmus berücksichtigt", + "privacy.unlisted.short": "Öffentlich (eingeschränkt)", "privacy_policy.last_updated": "Stand: {date}", "privacy_policy.title": "Datenschutzerklärung", "recommended": "Empfohlen", @@ -551,7 +550,9 @@ "relative_time.minutes": "{number} Min.", "relative_time.seconds": "{number} Sek.", "relative_time.today": "heute", + "reply_indicator.attachments": "{count, plural, one {# Anhang} other {# Anhänge}}", "reply_indicator.cancel": "Abbrechen", + "reply_indicator.poll": "Umfrage", "report.block": "Blockieren", "report.block_explanation": "Du wirst keine Beiträge mehr von diesem Konto sehen. Das blockierte Konto wird deine Beiträge nicht mehr sehen oder dir folgen können. Die Person könnte mitbekommen, dass du sie blockiert hast.", "report.categories.legal": "Rechtlich", @@ -715,10 +716,8 @@ "upload_error.poll": "Medien-Anhänge sind zusammen mit Umfragen nicht erlaubt.", "upload_form.audio_description": "Beschreibe für Menschen mit Hörbehinderung", "upload_form.description": "Beschreibe für Menschen mit Sehbehinderung", - "upload_form.description_missing": "Keine Beschreibung hinzugefügt", "upload_form.edit": "Bearbeiten", "upload_form.thumbnail": "Vorschaubild ändern", - "upload_form.undo": "Löschen", "upload_form.video_description": "Beschreibe für Menschen mit einer Hör- oder Sehbehinderung", "upload_modal.analyzing_picture": "Bild wird analysiert …", "upload_modal.apply": "Übernehmen", diff --git a/app/javascript/mastodon/locales/el.json b/app/javascript/mastodon/locales/el.json index 53e55fa950..068d228906 100644 --- a/app/javascript/mastodon/locales/el.json +++ b/app/javascript/mastodon/locales/el.json @@ -85,7 +85,6 @@ "announcement.announcement": "Ανακοίνωση", "attachments_list.unprocessed": "(μη επεξεργασμένο)", "audio.hide": "Απόκρυψη αρχείου ήχου", - "autosuggest_hashtag.per_week": "{count} ανά εβδομάδα", "boost_modal.combo": "Μπορείς να πατήσεις {combo} για να το προσπεράσεις την επόμενη φορά", "bundle_column_error.copy_stacktrace": "Αντιγραφή αναφοράς σφάλματος", "bundle_column_error.error.body": "Δεν ήταν δυνατή η απόδοση της σελίδας που ζήτησες. Μπορεί να οφείλεται σε σφάλμα στον κώδικά μας ή σε πρόβλημα συμβατότητας του προγράμματος περιήγησης.", @@ -111,6 +110,7 @@ "column.direct": "Ιδιωτικές αναφορές", "column.directory": "Περιήγηση στα προφίλ", "column.domain_blocks": "Αποκλεισμένοι τομείς", + "column.favourites": "Αγαπημένα", "column.follow_requests": "Αιτήματα ακολούθησης", "column.home": "Αρχική", "column.lists": "Λίστες", @@ -131,6 +131,9 @@ "community.column_settings.remote_only": "Απομακρυσμένα μόνο", "compose.language.change": "Αλλαγή γλώσσας", "compose.language.search": "Αναζήτηση γλωσσών...", + "compose.published.body": "Η ανάρτηση δημοσιεύτηκε.", + "compose.published.open": "Άνοιγμα", + "compose.saved.body": "Η ανάρτηση αποθηκεύτηκε.", "compose_form.direct_message_warning_learn_more": "Μάθε περισσότερα", "compose_form.encryption_warning": "Οι δημοσιεύσεις στο Mastodon δεν είναι κρυπτογραφημένες από άκρο σε άκρο. Μη μοιράζεσαι ευαίσθητες πληροφορίες μέσω του Mastodon.", "compose_form.hashtag_warning": "Αυτή η δημοσίευση δεν θα εμφανίζεται κάτω από οποιαδήποτε ετικέτα καθώς δεν είναι δημόσια. Μόνο οι δημόσιες δημοσιεύσεις μπορούν να αναζητηθούν με ετικέτα.", @@ -139,20 +142,19 @@ "compose_form.placeholder": "Τι σκέφτεσαι;", "compose_form.poll.add_option": "Προσθήκη επιλογής", "compose_form.poll.duration": "Διάρκεια δημοσκόπησης", + "compose_form.poll.multiple": "Πολλαπλή επιλογή", "compose_form.poll.option_placeholder": "Επιλογή {number}", "compose_form.poll.remove_option": "Αφαίρεση επιλογής", "compose_form.poll.switch_to_multiple": "Ενημέρωση δημοσκόπησης με πολλαπλές επιλογές", "compose_form.poll.switch_to_single": "Ενημέρωση δημοσκόπησης με μοναδική επιλογή", - "compose_form.publish": "Δημοσίευση", + "compose_form.poll.type": "Στυλ", + "compose_form.publish": "Ανάρτηση", "compose_form.publish_form": "Δημοσίευση", - "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.reply": "Απάντηση", + "compose_form.save_changes": "Ενημέρωση", "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": "Αποκλεισμός", @@ -184,6 +186,7 @@ "conversation.mark_as_read": "Σήμανση ως αναγνωσμένο", "conversation.open": "Προβολή συνομιλίας", "conversation.with": "Με {names}", + "copy_icon_button.copied": "Αντιγράφηκε στο πρόχειρο", "copypaste.copied": "Αντιγράφηκε", "copypaste.copy_to_clipboard": "Αντιγραφή στο πρόχειρο", "directory.federated": "Από το γνωστό fediverse", @@ -380,7 +383,6 @@ "navigation_bar.direct": "Ιδιωτικές επισημάνσεις", "navigation_bar.discover": "Ανακάλυψη", "navigation_bar.domain_blocks": "Αποκλεισμένοι τομείς", - "navigation_bar.edit_profile": "Επεξεργασία προφίλ", "navigation_bar.explore": "Εξερεύνηση", "navigation_bar.filters": "Αποσιωπημένες λέξεις", "navigation_bar.follow_requests": "Αιτήματα ακολούθησης", @@ -450,6 +452,12 @@ "onboarding.actions.go_to_home": "Πηγαίνετε στην αρχική σας ροή", "onboarding.follows.lead": "You curate your own home feed. The more people you follow, the more active and interesting it will be. These profiles may be a good starting point—you can always unfollow them later!", "onboarding.follows.title": "Δημοφιλή στο Mastodon", + "onboarding.profile.note": "Βιογραφικό", + "onboarding.profile.note_hint": "Μπορείτε να @αναφέρετε άλλα άτομα ή #hashtags…", + "onboarding.profile.save_and_continue": "Αποθήκευση και συνέχεια", + "onboarding.profile.title": "Ρύθμιση προφίλ", + "onboarding.profile.upload_avatar": "Μεταφόρτωση εικόνας προφίλ", + "onboarding.profile.upload_header": "Μεταφόρτωση κεφαλίδας προφίλ", "onboarding.share.lead": "Let people know how they can find you on Mastodon!\nΕνημερώστε άλλα άτομα πώς μπορούν να σας βρουν στο Mastodon!", "onboarding.share.next_steps": "Πιθανά επόμενα βήματα:", "onboarding.start.lead": "Your new Mastodon account is ready to go. Here's how you can make the most of it:", @@ -458,6 +466,7 @@ "onboarding.steps.follow_people.body": "You curate your own feed. Lets fill it with interesting people.", "onboarding.steps.follow_people.title": "Follow {count, plural, one {one person} other {# people}}", "onboarding.steps.publish_status.body": "Say hello to the world.", + "onboarding.steps.publish_status.title": "Κάντε την πρώτη σας δημοσίευση", "onboarding.steps.setup_profile.body": "Others are more likely to interact with you with a filled out profile.", "onboarding.steps.setup_profile.title": "Customize your profile", "onboarding.steps.share_profile.body": "Let your friends know how to find you on Mastodon!", @@ -467,6 +476,7 @@ "picture_in_picture.restore": "Βάλε το πίσω", "poll.closed": "Κλειστή", "poll.refresh": "Ανανέωση", + "poll.reveal": "Δείτε τα αποτελέσματα", "poll.total_people": "{count, plural, one {# άτομο} other {# άτομα}}", "poll.total_votes": "{count, plural, one {# ψήφος} other {# ψήφοι}}", "poll.vote": "Ψήφισε", @@ -475,16 +485,14 @@ "poll_button.add_poll": "Προσθήκη δημοσκόπησης", "poll_button.remove_poll": "Αφαίρεση δημοσκόπησης", "privacy.change": "Προσαρμογή ιδιωτικότητας ανάρτησης", - "privacy.direct.long": "Δημοσίευση μόνο σε όσους επισημαίνονται", - "privacy.direct.short": "Αναφερόμενα άτομα μόνο", - "privacy.private.long": "Ορατό μόνο για τους ακολούθους", - "privacy.private.short": "Μόνο ακόλουθοι", - "privacy.public.long": "Ορατό σε όλους", + "privacy.direct.long": "Όλοι όσοι αναφέρθηκαν στη δημοσίευση", + "privacy.direct.short": "Συγκεκριμένα άτομα", + "privacy.private.long": "Μόνο οι ακόλουθοί σας", + "privacy.private.short": "Ακόλουθοι", "privacy.public.short": "Δημόσιο", - "privacy.unlisted.long": "Ορατό για όλους, εκτός αυτών που δεν συμμετέχουν σε δυνατότητες ανακάλυψης", - "privacy.unlisted.short": "Μη καταχωρημένα", "privacy_policy.last_updated": "Τελευταία ενημέρωση {date}", "privacy_policy.title": "Πολιτική Απορρήτου", + "recommended": "Προτεινόμενα", "refresh": "Ανανέωση", "regeneration_indicator.label": "Φορτώνει…", "regeneration_indicator.sublabel": "Η αρχική σου ροή ετοιμάζεται!", @@ -500,8 +508,10 @@ "relative_time.seconds": "{number}δ", "relative_time.today": "σήμερα", "reply_indicator.cancel": "Άκυρο", + "reply_indicator.poll": "Δημοσκόπηση", "report.block": "Αποκλεισμός", "report.block_explanation": "Δεν θα βλέπεις τις αναρτήσεις του. Δεν θα μπορεί να δει τις αναρτήσεις σου ή να σε ακολουθήσει. Θα μπορεί να δει ότι έχει αποκλειστεί.", + "report.categories.legal": "Νομικό περιεχόμενο", "report.categories.other": "Άλλες", "report.categories.spam": "Ανεπιθύμητα", "report.categories.violation": "Το περιεχόμενο παραβιάζει έναν ή περισσότερους κανόνες διακομιστή", @@ -519,6 +529,8 @@ "report.placeholder": "Επιπλέον σχόλια", "report.reasons.dislike": "Δεν μου αρέσει", "report.reasons.dislike_description": "Δεν είναι κάτι που θα ήθελες να δεις", + "report.reasons.legal": "Είναι παράνομο", + "report.reasons.legal_description": "Πιστεύετε ότι παραβιάζει το νόμο της χώρας σας ή της χώρας του διακομιστή", "report.reasons.other": "Είναι κάτι άλλο", "report.reasons.other_description": "Το ζήτημα δεν ταιριάζει σε άλλες κατηγορίες", "report.reasons.spam": "Είναι σπαμ", @@ -552,10 +564,12 @@ "search.search_or_paste": "Αναζήτηση ή εισαγωγή URL", "search_popout.quick_actions": "Γρήγορες ενέργειες", "search_popout.recent": "Πρόσφατες αναζητήσεις", + "search_popout.user": "χρήστης", "search_results.accounts": "Προφίλ", "search_results.all": "Όλα", "search_results.hashtags": "Ετικέτες", "search_results.nothing_found": "Δεν βρέθηκε τίποτα με αυτούς τους όρους αναζήτησης", + "search_results.see_all": "Δες τα όλα", "search_results.statuses": "Αναρτήσεις", "search_results.title": "Αναζήτηση για {q}", "server_banner.about_active_users": "Άτομα που χρησιμοποιούν αυτόν τον διακομιστή κατά τις τελευταίες 30 ημέρες (Μηνιαία Ενεργοί Χρήστες)", @@ -566,6 +580,8 @@ "server_banner.server_stats": "Στατιστικά διακομιστή:", "sign_in_banner.create_account": "Δημιουργία λογαριασμού", "sign_in_banner.sign_in": "Σύνδεση", + "sign_in_banner.sso_redirect": "Συνδεθείτε ή Εγγραφείτε", + "sign_in_banner.text": "Συνδεθείτε για να ακολουθήσετε προφίλ ή ετικέτες, αγαπήστε, μοιραστείτε και απαντήστε σε δημοσιεύσεις. Μπορείτε επίσης να αλληλεπιδράσετε από τον λογαριασμό σας σε διαφορετικό διακομιστή.", "status.admin_account": "Άνοιγμα διεπαφής συντονισμού για τον/την @{name}", "status.admin_domain": "Άνοιγμα λειτουργίας διαμεσολάβησης για {domain}", "status.admin_status": "Άνοιγμα αυτής της ανάρτησης σε διεπαφή συντονισμού", @@ -582,6 +598,7 @@ "status.edited": "Επεξεργάστηκε στις {date}", "status.edited_x_times": "Επεξεργάστηκε {count, plural, one {{count} φορά} other {{count} φορές}}", "status.embed": "Ενσωμάτωσε", + "status.favourite": "Αγαπημένα", "status.filter": "Φιλτράρισμα αυτής της ανάρτησης", "status.filtered": "Φιλτραρισμένα", "status.hide": "Απόκρυψη ανάρτησης", @@ -646,10 +663,8 @@ "upload_error.poll": "Στις δημοσκοπήσεις δεν επιτρέπεται η μεταφόρτωση αρχείου.", "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_modal.analyzing_picture": "Ανάλυση εικόνας…", "upload_modal.apply": "Εφαρμογή", diff --git a/app/javascript/mastodon/locales/en-GB.json b/app/javascript/mastodon/locales/en-GB.json index 37e5efa5ba..2cf1b4dbae 100644 --- a/app/javascript/mastodon/locales/en-GB.json +++ b/app/javascript/mastodon/locales/en-GB.json @@ -87,7 +87,6 @@ "announcement.announcement": "Announcement", "attachments_list.unprocessed": "(unprocessed)", "audio.hide": "Hide audio", - "autosuggest_hashtag.per_week": "{count} per week", "boost_modal.combo": "You can press {combo} to skip this next time", "bundle_column_error.copy_stacktrace": "Copy error report", "bundle_column_error.error.body": "The requested page could not be rendered. It could be due to a bug in our code, or a browser compatibility issue.", @@ -144,22 +143,12 @@ "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's 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": "Publish", "compose_form.publish_form": "New post", - "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": "Remove content warning", "compose_form.spoiler.unmarked": "Add content warning", - "compose_form.spoiler_placeholder": "Write your warning here", "confirmation_modal.cancel": "Cancel", "confirmations.block.block_and_report": "Block & Report", "confirmations.block.confirm": "Block", @@ -406,7 +395,6 @@ "navigation_bar.direct": "Private mentions", "navigation_bar.discover": "Discover", "navigation_bar.domain_blocks": "Blocked domains", - "navigation_bar.edit_profile": "Edit profile", "navigation_bar.explore": "Explore", "navigation_bar.favourites": "Favourites", "navigation_bar.filters": "Muted words", @@ -524,14 +512,7 @@ "poll_button.add_poll": "Add a poll", "poll_button.remove_poll": "Remove poll", "privacy.change": "Change post privacy", - "privacy.direct.long": "Visible for mentioned users only", - "privacy.direct.short": "Mentioned people only", - "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", "privacy_policy.last_updated": "Last updated {date}", "privacy_policy.title": "Privacy Policy", "recommended": "Recommended", @@ -713,10 +694,8 @@ "upload_error.poll": "File upload not allowed with polls.", "upload_form.audio_description": "Describe for people who are deaf or hard of hearing", "upload_form.description": "Describe for people who are blind or have low vision", - "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 who are deaf, hard of hearing, blind or have low vision", "upload_modal.analyzing_picture": "Analysing picture…", "upload_modal.apply": "Apply", diff --git a/app/javascript/mastodon/locales/eo.json b/app/javascript/mastodon/locales/eo.json index 643329ba99..907a918af0 100644 --- a/app/javascript/mastodon/locales/eo.json +++ b/app/javascript/mastodon/locales/eo.json @@ -89,7 +89,6 @@ "announcement.announcement": "Anoncoj", "attachments_list.unprocessed": "(neprilaborita)", "audio.hide": "Kaŝi aŭdion", - "autosuggest_hashtag.per_week": "po {count} por semajno", "boost_modal.combo": "Vi povas premi {combo} por preterpasi sekvafoje", "bundle_column_error.copy_stacktrace": "Kopii la eraran raporton", "bundle_column_error.error.body": "La petita paĝo ne povas redonitis. Eble estas eraro.", @@ -146,22 +145,12 @@ "compose_form.lock_disclaimer": "Via konto ne estas {locked}. Iu ajn povas sekvi vin por vidi viajn afiŝojn nur al la sekvantoj.", "compose_form.lock_disclaimer.lock": "ŝlosita", "compose_form.placeholder": "Kion vi pensas?", - "compose_form.poll.add_option": "Aldoni elekteblon", "compose_form.poll.duration": "Daŭro de la balotenketo", - "compose_form.poll.option_placeholder": "Elekteblo {number}", - "compose_form.poll.remove_option": "Forigi ĉi tiu elekteblon", "compose_form.poll.switch_to_multiple": "Ŝanĝi la balotenketon por permesi multajn elektojn", "compose_form.poll.switch_to_single": "Ŝanĝi la balotenketon por permesi unu solan elekton", - "compose_form.publish": "Afiŝi", "compose_form.publish_form": "Afiŝi", - "compose_form.publish_loud": "{publish}!", - "compose_form.save_changes": "Konservi ŝanĝojn", - "compose_form.sensitive.hide": "{count, plural, one {Marki la plurmedio kiel tikla} other {Marki la plurmedioj kiel tiklaj}}", - "compose_form.sensitive.marked": "{count, plural, one {La plurmedio estas markita kiel tikla} other {La plurmedioj estas markitaj kiel tiklaj}}", - "compose_form.sensitive.unmarked": "{count, plural, one {La plurmedio ne estas markita kiel tikla} other {La plurmedioj ne estas markitaj kiel tiklaj}}", "compose_form.spoiler.marked": "Forigi la averton de enhavo", "compose_form.spoiler.unmarked": "Aldoni averton de enhavo", - "compose_form.spoiler_placeholder": "Skribu vian averton ĉi tie", "confirmation_modal.cancel": "Nuligi", "confirmations.block.block_and_report": "Bloki kaj raporti", "confirmations.block.confirm": "Bloki", @@ -408,7 +397,6 @@ "navigation_bar.direct": "Privataj mencioj", "navigation_bar.discover": "Esplori", "navigation_bar.domain_blocks": "Blokitaj domajnoj", - "navigation_bar.edit_profile": "Redakti profilon", "navigation_bar.explore": "Esplori", "navigation_bar.favourites": "Stelumoj", "navigation_bar.filters": "Silentigitaj vortoj", @@ -526,14 +514,7 @@ "poll_button.add_poll": "Aldoni balotenketon", "poll_button.remove_poll": "Forigi balotenketon", "privacy.change": "Agordi mesaĝan privatecon", - "privacy.direct.long": "Videbla nur al menciitaj uzantoj", - "privacy.direct.short": "Nur menciitaj personoj", - "privacy.private.long": "Videbla nur al viaj sekvantoj", - "privacy.private.short": "Nur abonantoj", - "privacy.public.long": "Videbla por ĉiuj", "privacy.public.short": "Publika", - "privacy.unlisted.long": "Videbla por ĉiuj, sed ekskluzive el la funkcio de esploro", - "privacy.unlisted.short": "Nelistigita", "privacy_policy.last_updated": "Laste ĝisdatigita en {date}", "privacy_policy.title": "Politiko de privateco", "recommended": "Rekomendita", @@ -715,10 +696,8 @@ "upload_error.poll": "Alŝuto de dosiero ne permesita kun balotenketo.", "upload_form.audio_description": "Priskribi por homoj kiuj malfacile aŭdi", "upload_form.description": "Priskribi por personoj, kiuj estas blindaj aŭ havas vidmalsufiĉon", - "upload_form.description_missing": "Neniu priskribo aldonita", "upload_form.edit": "Redakti", "upload_form.thumbnail": "Ŝanĝi etigita bildo", - "upload_form.undo": "Forigi", "upload_form.video_description": "Priskribi por homoj kiuj malfacile aŭdi aŭ vidi", "upload_modal.analyzing_picture": "Bilda analizado…", "upload_modal.apply": "Apliki", diff --git a/app/javascript/mastodon/locales/es-AR.json b/app/javascript/mastodon/locales/es-AR.json index 7c2e4f0d49..8816f18af6 100644 --- a/app/javascript/mastodon/locales/es-AR.json +++ b/app/javascript/mastodon/locales/es-AR.json @@ -89,7 +89,6 @@ "announcement.announcement": "Anuncio", "attachments_list.unprocessed": "[sin procesar]", "audio.hide": "Ocultar audio", - "autosuggest_hashtag.per_week": "{count} por semana", "boost_modal.combo": "Podés hacer clic en {combo} para saltar esto la próxima vez", "bundle_column_error.copy_stacktrace": "Copiar informe de error", "bundle_column_error.error.body": "La página solicitada no pudo ser cargada. Podría deberse a un error de programación en nuestro código o a un problema de compatibilidad con el navegador web.", @@ -146,22 +145,21 @@ "compose_form.lock_disclaimer": "Tu cuenta no es {locked}. Todos pueden seguirte para ver tus mensajes marcados como \"Sólo para seguidores\".", "compose_form.lock_disclaimer.lock": "privada", "compose_form.placeholder": "¿Qué onda?", - "compose_form.poll.add_option": "Agregá una opción", "compose_form.poll.duration": "Duración de la encuesta", + "compose_form.poll.multiple": "Selección múltiple", "compose_form.poll.option_placeholder": "Opción {number}", "compose_form.poll.remove_option": "Quitar esta opción", + "compose_form.poll.single": "Elige uno", "compose_form.poll.switch_to_multiple": "Cambiar encuesta para permitir opciones múltiples", "compose_form.poll.switch_to_single": "Cambiar encuesta para permitir una sola opción", + "compose_form.poll.type": "Estilo", "compose_form.publish": "Publicar", "compose_form.publish_form": "Nuevo mensaje", - "compose_form.publish_loud": "¡{publish}!", - "compose_form.save_changes": "Guardar cambios", - "compose_form.sensitive.hide": "Marcar medio como sensible", - "compose_form.sensitive.marked": "{count, plural, one {El medio está marcado como sensible} other {Los medios están marcados como sensibles}}", - "compose_form.sensitive.unmarked": "El medio no está marcado como sensible", + "compose_form.reply": "Responder", + "compose_form.save_changes": "Actualizar", "compose_form.spoiler.marked": "Quitar advertencia de contenido", "compose_form.spoiler.unmarked": "Agregar advertencia de contenido", - "compose_form.spoiler_placeholder": "Escribí tu advertencia acá", + "compose_form.spoiler_placeholder": "Advertencia de contenido (opcional)", "confirmation_modal.cancel": "Cancelar", "confirmations.block.block_and_report": "Bloquear y denunciar", "confirmations.block.confirm": "Bloquear", @@ -408,7 +406,6 @@ "navigation_bar.direct": "Menciones privadas", "navigation_bar.discover": "Descubrir", "navigation_bar.domain_blocks": "Dominios bloqueados", - "navigation_bar.edit_profile": "Editar perfil", "navigation_bar.explore": "Explorá", "navigation_bar.favourites": "Favoritos", "navigation_bar.filters": "Palabras silenciadas", @@ -526,14 +523,10 @@ "poll_button.add_poll": "Agregar encuesta", "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 cuentas mencionadas", - "privacy.private.long": "Visible sólo para los seguidores", - "privacy.private.short": "Sólo para seguidores", - "privacy.public.long": "Visible para todos", + "privacy.direct.short": "Personas específicas", + "privacy.private.long": "Solo tus seguidores", + "privacy.private.short": "Seguidores", "privacy.public.short": "Público", - "privacy.unlisted.long": "Visible para todos, pero excluido de las características de descubrimiento", - "privacy.unlisted.short": "No listado", "privacy_policy.last_updated": "Última actualización: {date}", "privacy_policy.title": "Política de privacidad", "recommended": "Opción recomendada", @@ -715,10 +708,8 @@ "upload_error.poll": "No se permite la subida de archivos en encuestas.", "upload_form.audio_description": "Agregá una descripción para personas con dificultades auditivas", "upload_form.description": "Agregá una descripción para personas con dificultades visuales", - "upload_form.description_missing": "No se agregó descripción", "upload_form.edit": "Editar", "upload_form.thumbnail": "Cambiar miniatura", - "upload_form.undo": "Eliminar", "upload_form.video_description": "Agregá una descripción para personas con dificultades auditivas o visuales", "upload_modal.analyzing_picture": "Analizando imagen…", "upload_modal.apply": "Aplicar", diff --git a/app/javascript/mastodon/locales/es-MX.json b/app/javascript/mastodon/locales/es-MX.json index fab5f6ec96..fdc57ac6d6 100644 --- a/app/javascript/mastodon/locales/es-MX.json +++ b/app/javascript/mastodon/locales/es-MX.json @@ -89,7 +89,6 @@ "announcement.announcement": "Anuncio", "attachments_list.unprocessed": "(sin procesar)", "audio.hide": "Ocultar audio", - "autosuggest_hashtag.per_week": "{count} por semana", "boost_modal.combo": "Puedes hacer clic en {combo} para saltar este aviso la próxima vez", "bundle_column_error.copy_stacktrace": "Copiar informe de error", "bundle_column_error.error.body": "La página solicitada no pudo ser renderizada. Podría deberse a un error en nuestro código o a un problema de compatibilidad con el navegador.", @@ -146,22 +145,22 @@ "compose_form.lock_disclaimer": "Tu cuenta no está bloqueada. Todos pueden seguirte para ver tus toots solo para seguidores.", "compose_form.lock_disclaimer.lock": "bloqueado", "compose_form.placeholder": "¿En qué estás pensando?", - "compose_form.poll.add_option": "Añadir una opción", + "compose_form.poll.add_option": "Agregar opción", "compose_form.poll.duration": "Duración de la encuesta", - "compose_form.poll.option_placeholder": "Elección {number}", + "compose_form.poll.multiple": "Selección múltiple", + "compose_form.poll.option_placeholder": "Opción {number}", "compose_form.poll.remove_option": "Eliminar esta opción", + "compose_form.poll.single": "Seleccione uno", "compose_form.poll.switch_to_multiple": "Modificar encuesta para permitir múltiples opciones", "compose_form.poll.switch_to_single": "Modificar encuesta para permitir una única opción", - "compose_form.publish": "Publicar", + "compose_form.poll.type": "Estilo", + "compose_form.publish": "Publicación", "compose_form.publish_form": "Publicar", - "compose_form.publish_loud": "¡{publish}!", - "compose_form.save_changes": "Guardar cambios", - "compose_form.sensitive.hide": "Marcar multimedia como sensible", - "compose_form.sensitive.marked": "Material marcado como sensible", - "compose_form.sensitive.unmarked": "Material no marcado como sensible", + "compose_form.reply": "Respuesta", + "compose_form.save_changes": "Actualización", "compose_form.spoiler.marked": "Texto oculto tras la advertencia", "compose_form.spoiler.unmarked": "Texto no oculto", - "compose_form.spoiler_placeholder": "Advertencia de contenido", + "compose_form.spoiler_placeholder": "Advertencia de contenido (opcional)", "confirmation_modal.cancel": "Cancelar", "confirmations.block.block_and_report": "Bloquear y Denunciar", "confirmations.block.confirm": "Bloquear", @@ -408,7 +407,6 @@ "navigation_bar.direct": "Menciones privadas", "navigation_bar.discover": "Descubrir", "navigation_bar.domain_blocks": "Dominios ocultos", - "navigation_bar.edit_profile": "Editar perfil", "navigation_bar.explore": "Explorar", "navigation_bar.favourites": "Favoritos", "navigation_bar.filters": "Palabras silenciadas", @@ -526,14 +524,15 @@ "poll_button.add_poll": "Añadir una encuesta", "poll_button.remove_poll": "Eliminar encuesta", "privacy.change": "Ajustar privacidad", - "privacy.direct.long": "Sólo mostrar a los usuarios mencionados", - "privacy.direct.short": "Solo personas mencionadas", - "privacy.private.long": "Sólo mostrar a seguidores", - "privacy.private.short": "Solo seguidores", - "privacy.public.long": "Visible para todos", + "privacy.direct.long": "Todos los mencionados en la publicación", + "privacy.direct.short": "Personas específicas", + "privacy.private.long": "Sólo tus seguidores", + "privacy.private.short": "Seguidores", + "privacy.public.long": "Cualquiera dentro y fuera de Mastodon", "privacy.public.short": "Público", - "privacy.unlisted.long": "Visible para todos, pero excluido de las funciones de descubrimiento", - "privacy.unlisted.short": "No listado", + "privacy.unlisted.additional": "Esto se comporta exactamente igual que el público, excepto que el post no aparecerá en las cronologías en directo o en los hashtags, la exploración o busquedas en Mastodon, incluso si está optado por activar la cuenta de usuario.", + "privacy.unlisted.long": "Menos fanfares algorítmicos", + "privacy.unlisted.short": "Público silencioso", "privacy_policy.last_updated": "Actualizado por última vez {date}", "privacy_policy.title": "Política de Privacidad", "recommended": "Recomendado", @@ -551,7 +550,9 @@ "relative_time.minutes": "{number} m", "relative_time.seconds": "{number} s", "relative_time.today": "hoy", + "reply_indicator.attachments": "{count, plural, one {# adjunto} other {# adjuntos}}", "reply_indicator.cancel": "Cancelar", + "reply_indicator.poll": "Encuesta", "report.block": "Bloquear", "report.block_explanation": "No veras sus publicaciones. No podrán ver tus publicaciones ni seguirte. Podrán saber que están bloqueados.", "report.categories.legal": "Legal", @@ -715,10 +716,8 @@ "upload_error.poll": "Subida de archivos no permitida con encuestas.", "upload_form.audio_description": "Describir para personas con problemas auditivos", "upload_form.description": "Describir para los usuarios con dificultad visual", - "upload_form.description_missing": "Sin descripción añadida", "upload_form.edit": "Editar", "upload_form.thumbnail": "Cambiar miniatura", - "upload_form.undo": "Borrar", "upload_form.video_description": "Describir para personas con problemas auditivos o visuales", "upload_modal.analyzing_picture": "Analizando imagen…", "upload_modal.apply": "Aplicar", diff --git a/app/javascript/mastodon/locales/es.json b/app/javascript/mastodon/locales/es.json index 0d6149f5f5..2e4ea93177 100644 --- a/app/javascript/mastodon/locales/es.json +++ b/app/javascript/mastodon/locales/es.json @@ -89,7 +89,6 @@ "announcement.announcement": "Anuncio", "attachments_list.unprocessed": "(sin procesar)", "audio.hide": "Ocultar audio", - "autosuggest_hashtag.per_week": "{count} por semana", "boost_modal.combo": "Puedes hacer clic en {combo} para saltar este aviso la próxima vez", "bundle_column_error.copy_stacktrace": "Copiar informe de error", "bundle_column_error.error.body": "La página solicitada no pudo ser renderizada. Podría deberse a un error en nuestro código o a un problema de compatibilidad con el navegador.", @@ -146,22 +145,21 @@ "compose_form.lock_disclaimer": "Tu cuenta no está {locked}. Todos pueden seguirte para ver tus publicaciones solo para seguidores.", "compose_form.lock_disclaimer.lock": "bloqueado", "compose_form.placeholder": "¿En qué estás pensando?", - "compose_form.poll.add_option": "Añadir una opción", "compose_form.poll.duration": "Duración de la encuesta", - "compose_form.poll.option_placeholder": "Elección {number}", - "compose_form.poll.remove_option": "Eliminar esta opción", + "compose_form.poll.multiple": "Selección múltiple", + "compose_form.poll.option_placeholder": "Opción {number}", + "compose_form.poll.remove_option": "Quitar esta opción", + "compose_form.poll.single": "Elige uno", "compose_form.poll.switch_to_multiple": "Modificar encuesta para permitir múltiples opciones", "compose_form.poll.switch_to_single": "Modificar encuesta para permitir una única opción", + "compose_form.poll.type": "Estilo", "compose_form.publish": "Publicar", "compose_form.publish_form": "Publicar", - "compose_form.publish_loud": "¡{publish}!", - "compose_form.save_changes": "Guardar cambios", - "compose_form.sensitive.hide": "{count, plural, one {Marcar material como sensible} other {Marcar material como sensible}}", - "compose_form.sensitive.marked": "{count, plural, one {Material marcado como sensible} other {Material marcado como sensible}}", - "compose_form.sensitive.unmarked": "{count, plural, one {Material no marcado como sensible} other {Material no marcado como sensible}}", + "compose_form.reply": "Responder", + "compose_form.save_changes": "Actualizar", "compose_form.spoiler.marked": "Quitar advertencia de contenido", "compose_form.spoiler.unmarked": "Añadir advertencia de contenido", - "compose_form.spoiler_placeholder": "Escribe aquí tu advertencia", + "compose_form.spoiler_placeholder": "Advertencia de contenido (opcional)", "confirmation_modal.cancel": "Cancelar", "confirmations.block.block_and_report": "Bloquear y Reportar", "confirmations.block.confirm": "Bloquear", @@ -408,7 +406,6 @@ "navigation_bar.direct": "Menciones privadas", "navigation_bar.discover": "Descubrir", "navigation_bar.domain_blocks": "Dominios ocultos", - "navigation_bar.edit_profile": "Editar perfil", "navigation_bar.explore": "Explorar", "navigation_bar.favourites": "Favoritos", "navigation_bar.filters": "Palabras silenciadas", @@ -526,14 +523,10 @@ "poll_button.add_poll": "Añadir una encuesta", "poll_button.remove_poll": "Eliminar encuesta", "privacy.change": "Ajustar privacidad", - "privacy.direct.long": "Visible solo para usuarios mencionados", - "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", + "privacy.direct.short": "Personas específicas", + "privacy.private.long": "Solo tus seguidores", + "privacy.private.short": "Seguidores", "privacy.public.short": "Público", - "privacy.unlisted.long": "Visible para todos, pero excluido de las funciones de descubrimiento", - "privacy.unlisted.short": "No listado", "privacy_policy.last_updated": "Actualizado por última vez {date}", "privacy_policy.title": "Política de Privacidad", "recommended": "Recomendado", @@ -715,10 +708,8 @@ "upload_error.poll": "No se permite la subida de archivos con encuestas.", "upload_form.audio_description": "Describir para personas con problemas auditivos", "upload_form.description": "Describir para personas con discapacidad visual", - "upload_form.description_missing": "No se ha añadido ninguna descripción", "upload_form.edit": "Editar", "upload_form.thumbnail": "Cambiar miniatura", - "upload_form.undo": "Eliminar", "upload_form.video_description": "Describir para personas con problemas auditivos o visuales", "upload_modal.analyzing_picture": "Analizando imagen…", "upload_modal.apply": "Aplicar", diff --git a/app/javascript/mastodon/locales/et.json b/app/javascript/mastodon/locales/et.json index 26657d402e..5034c25541 100644 --- a/app/javascript/mastodon/locales/et.json +++ b/app/javascript/mastodon/locales/et.json @@ -89,7 +89,6 @@ "announcement.announcement": "Teadaanne", "attachments_list.unprocessed": "(töötlemata)", "audio.hide": "Peida audio", - "autosuggest_hashtag.per_week": "{count} nädalas", "boost_modal.combo": "Vajutades {combo}, saab selle edaspidi vahele jätta", "bundle_column_error.copy_stacktrace": "Kopeeri veateade", "bundle_column_error.error.body": "Soovitud lehte ei õnnestunud esitada. See võib olla meie koodiviga või probleem brauseri ühilduvusega.", @@ -148,20 +147,20 @@ "compose_form.placeholder": "Millest mõtled?", "compose_form.poll.add_option": "Lisa valik", "compose_form.poll.duration": "Küsitluse kestus", + "compose_form.poll.multiple": "Valikvastustega", "compose_form.poll.option_placeholder": "Valik {number}", "compose_form.poll.remove_option": "Eemalda see valik", + "compose_form.poll.single": "Vali üks", "compose_form.poll.switch_to_multiple": "Muuda küsitlust mitmikvaliku lubamiseks", "compose_form.poll.switch_to_single": "Muuda küsitlust ainult ühe valiku lubamiseks", + "compose_form.poll.type": "Stiil", "compose_form.publish": "Postita", "compose_form.publish_form": "Postita", - "compose_form.publish_loud": "{publish}!", - "compose_form.save_changes": "Salvesta muudatused", - "compose_form.sensitive.hide": "{count, plural, one {Märgi meedia tundlikuks} other {Märgi meediad tundlikuks}}", - "compose_form.sensitive.marked": "{count, plural, one {Meedia on märgitud tundlikuks} other {Meediad on märgitud tundlikuks}}", - "compose_form.sensitive.unmarked": "{count, plural, one {Meedia ei ole tundlikuks märgitud} other {Meediad ei ole märgitud tundlikuks}}", + "compose_form.reply": "Vasta", + "compose_form.save_changes": "Uuenda", "compose_form.spoiler.marked": "Tekst on hoiatuse taha peidetud", "compose_form.spoiler.unmarked": "Märgi sisu tundlikuks", - "compose_form.spoiler_placeholder": "Kirjuta hoiatus siia", + "compose_form.spoiler_placeholder": "Sisuhoiatus (valikuline)", "confirmation_modal.cancel": "Katkesta", "confirmations.block.block_and_report": "Blokeeri ja teata", "confirmations.block.confirm": "Blokeeri", @@ -408,7 +407,6 @@ "navigation_bar.direct": "Privaatsed mainimised", "navigation_bar.discover": "Avasta", "navigation_bar.domain_blocks": "Peidetud domeenid", - "navigation_bar.edit_profile": "Muuda profiili", "navigation_bar.explore": "Avasta", "navigation_bar.favourites": "Lemmikud", "navigation_bar.filters": "Vaigistatud sõnad", @@ -526,14 +524,14 @@ "poll_button.add_poll": "Lisa küsitlus", "poll_button.remove_poll": "Eemalda küsitlus", "privacy.change": "Muuda postituse nähtavust", - "privacy.direct.long": "Postita ainult mainitud kasutajatele", - "privacy.direct.short": "Mainitud inimesed ainult", - "privacy.private.long": "Postita ainult jälgijatele", - "privacy.private.short": "Jälgijad ainult", - "privacy.public.long": "Kõigile nähtav", + "privacy.direct.long": "Kõik postituses mainitud", + "privacy.direct.short": "Määratud kasutajad", + "privacy.private.long": "Ainult jälgijad", + "privacy.private.short": "Jälgijad", + "privacy.public.long": "Nii kasutajad kui mittekasutajad", "privacy.public.short": "Avalik", - "privacy.unlisted.long": "Kõigile nähtav, aga ei ilmu avastamise vaadetes", - "privacy.unlisted.short": "Määramata", + "privacy.unlisted.long": "Vähem algoritmilisi teavitusi", + "privacy.unlisted.short": "Vaikselt avalik", "privacy_policy.last_updated": "Viimati uuendatud {date}", "privacy_policy.title": "Isikuandmete kaitse", "recommended": "Soovitatud", @@ -551,7 +549,9 @@ "relative_time.minutes": "{number}m", "relative_time.seconds": "{number}s", "relative_time.today": "täna", + "reply_indicator.attachments": "{count, plural, one {# lisa} other {# lisa}}", "reply_indicator.cancel": "Tühista", + "reply_indicator.poll": "Küsitlus", "report.block": "Blokeeri", "report.block_explanation": "Sa ei näe tema postitusi. Tema ei saa näha sinu postitusi ega sind jälgida. Talle on näha, et ta on blokeeritud.", "report.categories.legal": "Juriidiline", @@ -715,10 +715,8 @@ "upload_error.poll": "Küsitlustes pole faili üleslaadimine lubatud.", "upload_form.audio_description": "Kirjelda kuulmispuudega inimeste jaoks", "upload_form.description": "Kirjelda vaegnägijatele", - "upload_form.description_missing": "Kirjeldus puudub", "upload_form.edit": "Muuda", "upload_form.thumbnail": "Muuda pisipilti", - "upload_form.undo": "Kustuta", "upload_form.video_description": "Kirjelda kuulmis- või nägemispuudega inimeste jaoks", "upload_modal.analyzing_picture": "Analüüsime pilti…", "upload_modal.apply": "Rakenda", diff --git a/app/javascript/mastodon/locales/eu.json b/app/javascript/mastodon/locales/eu.json index c75f697e4c..cee18e7a51 100644 --- a/app/javascript/mastodon/locales/eu.json +++ b/app/javascript/mastodon/locales/eu.json @@ -25,7 +25,7 @@ "account.direct": "Aipatu pribatuki @{name}", "account.disable_notifications": "Utzi jakinarazteari @{name} erabiltzaileak argitaratzean", "account.domain_blocked": "Ezkutatutako domeinua", - "account.edit_profile": "Aldatu profila", + "account.edit_profile": "Editatu profila", "account.enable_notifications": "Jakinarazi @{name} erabiltzaileak argitaratzean", "account.endorse": "Nabarmendu profilean", "account.featured_tags.last_status_at": "Azken bidalketa {date} datan", @@ -89,7 +89,6 @@ "announcement.announcement": "Iragarpena", "attachments_list.unprocessed": "(prozesatu gabe)", "audio.hide": "Ezkutatu audioa", - "autosuggest_hashtag.per_week": "{count} asteko", "boost_modal.combo": "{combo} sakatu dezakezu hurrengoan hau saltatzeko", "bundle_column_error.copy_stacktrace": "Kopiatu errore-txostena", "bundle_column_error.error.body": "Eskatutako orria ezin izan da bistaratu. Kodeko errore bategatik izan daiteke edo nabigatzailearen bateragarritasun arazo bategatik.", @@ -146,22 +145,22 @@ "compose_form.lock_disclaimer": "Zure kontua ez dago {locked}. Edonork jarraitu zaitzake zure jarraitzaileentzako soilik diren bidalketak ikusteko.", "compose_form.lock_disclaimer.lock": "giltzapetuta", "compose_form.placeholder": "Zer duzu buruan?", - "compose_form.poll.add_option": "Gehitu aukera bat", + "compose_form.poll.add_option": "Gehitu aukera", "compose_form.poll.duration": "Inkestaren iraupena", + "compose_form.poll.multiple": "Aukera aniza", "compose_form.poll.option_placeholder": "{number}. aukera", "compose_form.poll.remove_option": "Kendu aukera hau", + "compose_form.poll.single": "Hautatu bat", "compose_form.poll.switch_to_multiple": "Aldatu inkesta hainbat aukera onartzeko", "compose_form.poll.switch_to_single": "Aldatu inkesta aukera bakarra onartzeko", + "compose_form.poll.type": "Estiloa", "compose_form.publish": "Argitaratu", "compose_form.publish_form": "Argitaratu", - "compose_form.publish_loud": "{publish}!", - "compose_form.save_changes": "Gorde aldaketak", - "compose_form.sensitive.hide": "Markatu multimedia hunkigarri gisa", - "compose_form.sensitive.marked": "Multimedia edukia hunkigarri gisa markatu da", - "compose_form.sensitive.unmarked": "Multimedia edukia ez da hunkigarri gisa markatu", + "compose_form.reply": "Erantzun", + "compose_form.save_changes": "Eguneratu", "compose_form.spoiler.marked": "Testua abisu batek ezkutatzen du", "compose_form.spoiler.unmarked": "Testua ez dago ezkutatuta", - "compose_form.spoiler_placeholder": "Idatzi zure abisua hemen", + "compose_form.spoiler_placeholder": "Edukiaren abisua (aukerakoa)", "confirmation_modal.cancel": "Utzi", "confirmations.block.block_and_report": "Blokeatu eta salatu", "confirmations.block.confirm": "Blokeatu", @@ -408,7 +407,6 @@ "navigation_bar.direct": "Aipamen pribatuak", "navigation_bar.discover": "Aurkitu", "navigation_bar.domain_blocks": "Ezkutatutako domeinuak", - "navigation_bar.edit_profile": "Aldatu profila", "navigation_bar.explore": "Arakatu", "navigation_bar.favourites": "Gogokoak", "navigation_bar.filters": "Mutututako hitzak", @@ -526,14 +524,15 @@ "poll_button.add_poll": "Gehitu inkesta bat", "poll_button.remove_poll": "Kendu inkesta", "privacy.change": "Aldatu bidalketaren pribatutasuna", - "privacy.direct.long": "Bidali aipatutako erabiltzaileei besterik ez", - "privacy.direct.short": "Aipatutako jendea soilik", - "privacy.private.long": "Bidali jarraitzaileei besterik ez", - "privacy.private.short": "Jarraitzaileak soilik", - "privacy.public.long": "Guztientzat ikusgai", + "privacy.direct.long": "Argitalpen honetan aipatutako denak", + "privacy.direct.short": "Jende jakina", + "privacy.private.long": "Soilik jarraitzaileak", + "privacy.private.short": "Jarraitzaileak", + "privacy.public.long": "Mastodonen dagoen edo ez dagoen edonor", "privacy.public.short": "Publikoa", - "privacy.unlisted.long": "Guztientzat ikusgai, baina ez aurkitzeko ezaugarrietan", - "privacy.unlisted.short": "Zerrendatu gabea", + "privacy.unlisted.additional": "Aukera honek publiko modua bezala funtzionatzen du, baina argitalpena ez da agertuko zuzeneko jarioetan edo traoletan, \"Arakatu\" atalean edo Mastodonen bilaketan, nahiz eta kontua zabaltzeko onartu duzun.", + "privacy.unlisted.long": "Tontakeria algoritmiko gutxiago", + "privacy.unlisted.short": "Deiadar urrikoa", "privacy_policy.last_updated": "Azkenengo eguneraketa {date}", "privacy_policy.title": "Pribatutasun politika", "recommended": "Gomendatua", @@ -551,7 +550,9 @@ "relative_time.minutes": "{number}m", "relative_time.seconds": "{number}s", "relative_time.today": "gaur", + "reply_indicator.attachments": "{count, plural, one {# eranskin} other {# eranskin}}", "reply_indicator.cancel": "Utzi", + "reply_indicator.poll": "Inkesta", "report.block": "Blokeatu", "report.block_explanation": "Ez dituzu bere bidalketak ikusiko. Ezingo dituzte zure bidalketak ikusi eta ez jarraitu. Blokeatu dituzula jakin dezakete.", "report.categories.legal": "Juridikoa", @@ -715,10 +716,8 @@ "upload_error.poll": "Ez da inkestetan fitxategiak igotzea onartzen.", "upload_form.audio_description": "Deskribatu entzumen galera duten pertsonentzat", "upload_form.description": "Deskribatu ikusmen arazoak dituztenentzat", - "upload_form.description_missing": "Ez da deskribapenik gehitu", "upload_form.edit": "Editatu", "upload_form.thumbnail": "Aldatu koadro txikia", - "upload_form.undo": "Ezabatu", "upload_form.video_description": "Deskribatu entzumen galera edo ikusmen urritasuna duten pertsonentzat", "upload_modal.analyzing_picture": "Irudia aztertzen…", "upload_modal.apply": "Aplikatu", diff --git a/app/javascript/mastodon/locales/fa.json b/app/javascript/mastodon/locales/fa.json index 9f3201ca78..0b078d1ab3 100644 --- a/app/javascript/mastodon/locales/fa.json +++ b/app/javascript/mastodon/locales/fa.json @@ -89,7 +89,6 @@ "announcement.announcement": "اعلامیه", "attachments_list.unprocessed": "(پردازش نشده)", "audio.hide": "نهفتن صدا", - "autosuggest_hashtag.per_week": "{count} در هفته", "boost_modal.combo": "دکمهٔ {combo} را بزنید تا دیگر این را نبینید", "bundle_column_error.copy_stacktrace": "رونوشت از گزارش خطا", "bundle_column_error.error.body": "صفحهٔ درخواستی نتوانست پرداخت شود. ممکن است به خاطر اشکالی در کدمان یا مشکل سازگاری مرورگر باشد.", @@ -148,20 +147,20 @@ "compose_form.placeholder": "تازه چه خبر؟", "compose_form.poll.add_option": "افزودن گزینه", "compose_form.poll.duration": "مدت نظرسنجی", + "compose_form.poll.multiple": "چند گزینه‌ای", "compose_form.poll.option_placeholder": "گزینهٔ {number}", "compose_form.poll.remove_option": "برداشتن این گزینه", + "compose_form.poll.single": "گزینش یکی", "compose_form.poll.switch_to_multiple": "تغییر نظرسنجی برای اجازه به چندین گزینه", "compose_form.poll.switch_to_single": "تبدیل به نظرسنجی تک‌گزینه‌ای", - "compose_form.publish": "انتشار", + "compose_form.poll.type": "سبک", + "compose_form.publish": "فرستادن", "compose_form.publish_form": "انتشار", - "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.reply": "پاسخ", + "compose_form.save_changes": "به‌روز رسانی", "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": "انسداد", @@ -408,7 +407,6 @@ "navigation_bar.direct": "اشاره‌های خصوصی", "navigation_bar.discover": "گشت و گذار", "navigation_bar.domain_blocks": "دامنه‌های مسدود شده", - "navigation_bar.edit_profile": "ویرایش نمایه", "navigation_bar.explore": "کاوش", "navigation_bar.favourites": "برگزیده‌ها", "navigation_bar.filters": "واژه‌های خموش", @@ -524,14 +522,14 @@ "poll_button.add_poll": "افزودن نظرسنجی", "poll_button.remove_poll": "برداشتن نظرسنجی", "privacy.change": "تغییر محرمانگی فرسته", - "privacy.direct.long": "نمایان فقط برای کاربران اشاره شده", - "privacy.direct.short": "فقط افراد اشاره شده", - "privacy.private.long": "نمایان فقط برای پی‌گیرندگان", - "privacy.private.short": "فقط پی‌گیرندگان", - "privacy.public.long": "نمایان برای همه", + "privacy.direct.long": "هرکسی که در فرسته نام برده شده", + "privacy.direct.short": "افراد مشخّص", + "privacy.private.long": "تنها پی‌گیرندگانتان", + "privacy.private.short": "پی‌گیرندگان", + "privacy.public.long": "هرکسی در و بیرون از ماستودون", "privacy.public.short": "عمومی", - "privacy.unlisted.long": "نمایان برای همه، ولی خارج از قابلیت‌های کشف", - "privacy.unlisted.short": "فهرست نشده", + "privacy.unlisted.long": "سروصدای الگوریتمی کم‌تر", + "privacy.unlisted.short": "عمومی ساکت", "privacy_policy.last_updated": "آخرین به‌روز رسانی در {date}", "privacy_policy.title": "سیاست محرمانگی", "recommended": "پیشنهادشده", @@ -550,6 +548,7 @@ "relative_time.seconds": "{number} ثانیه", "relative_time.today": "امروز", "reply_indicator.cancel": "لغو", + "reply_indicator.poll": "نظرسنجی", "report.block": "انسداد", "report.block_explanation": "شما فرسته‌هایشان را نخواهید دید. آن‌ها نمی‌توانند فرسته‌هایتان را ببینند یا شما را پی‌بگیرند. آنها می‌توانند بگویند که مسدود شده‌اند.", "report.categories.legal": "حقوقی", @@ -713,10 +712,8 @@ "upload_error.poll": "بارگذاری پرونده در نظرسنجی‌ها مجاز نیست.", "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_modal.analyzing_picture": "در حال پردازش تصویر…", "upload_modal.apply": "اعمال", diff --git a/app/javascript/mastodon/locales/fi.json b/app/javascript/mastodon/locales/fi.json index 00df0e537a..7b98f99836 100644 --- a/app/javascript/mastodon/locales/fi.json +++ b/app/javascript/mastodon/locales/fi.json @@ -89,7 +89,6 @@ "announcement.announcement": "Ilmoitus", "attachments_list.unprocessed": "(käsittelemätön)", "audio.hide": "Piilota ääni", - "autosuggest_hashtag.per_week": "{count} viikossa", "boost_modal.combo": "Ensi kerralla voit ohittaa tämän painamalla {combo}", "bundle_column_error.copy_stacktrace": "Kopioi virheraportti", "bundle_column_error.error.body": "Pyydettyä sivua ei voitu hahmontaa. Se voi johtua virheestä koodissamme tai selaimen yhteensopivuudessa.", @@ -146,22 +145,22 @@ "compose_form.lock_disclaimer": "Tilisi ei ole {locked}. Kuka tahansa voi seurata tiliäsi ja nähdä vain seuraajille rajaamasi julkaisut.", "compose_form.lock_disclaimer.lock": "lukittu", "compose_form.placeholder": "Mitä mietit?", - "compose_form.poll.add_option": "Lisää valinta", + "compose_form.poll.add_option": "Lisää vaihtoehto", "compose_form.poll.duration": "Äänestyksen kesto", - "compose_form.poll.option_placeholder": "Valinta {number}", - "compose_form.poll.remove_option": "Poista tämä valinta", + "compose_form.poll.multiple": "Monivalinta", + "compose_form.poll.option_placeholder": "Vaihtoehto {number}", + "compose_form.poll.remove_option": "Poista tämä vaihtoehto", + "compose_form.poll.single": "Valitse yksi", "compose_form.poll.switch_to_multiple": "Muuta äänestys monivalinnaksi", "compose_form.poll.switch_to_single": "Muuta äänestys sallimaan vain yksi valinta", + "compose_form.poll.type": "Tyyli", "compose_form.publish": "Julkaise", "compose_form.publish_form": "Uusi julkaisu", - "compose_form.publish_loud": "{publish}!", - "compose_form.save_changes": "Tallenna muutokset", - "compose_form.sensitive.hide": "{count, plural, one {Merkitse media arkaluonteiseksi} other {Merkitse mediat arkaluonteisiksi}}", - "compose_form.sensitive.marked": "{count, plural, one {Media on merkitty arkaluonteiseksi} other {Mediat on merkitty arkaluonteisiksi}}", - "compose_form.sensitive.unmarked": "{count, plural, one {Mediaa ei ole merkitty arkaluonteiseksi} other {Medioita ei ole merkitty arkaluonteisiksi}}", + "compose_form.reply": "Vastaa", + "compose_form.save_changes": "Päivitä", "compose_form.spoiler.marked": "Poista sisältövaroitus", "compose_form.spoiler.unmarked": "Lisää sisältövaroitus", - "compose_form.spoiler_placeholder": "Kirjoita varoituksesi tähän", + "compose_form.spoiler_placeholder": "Sisältövaroitus (valinnainen)", "confirmation_modal.cancel": "Peruuta", "confirmations.block.block_and_report": "Estä ja raportoi", "confirmations.block.confirm": "Estä", @@ -408,7 +407,6 @@ "navigation_bar.direct": "Yksityiset maininnat", "navigation_bar.discover": "Löydä uutta", "navigation_bar.domain_blocks": "Estetyt verkkotunnukset", - "navigation_bar.edit_profile": "Muokkaa profiilia", "navigation_bar.explore": "Selaa", "navigation_bar.favourites": "Suosikit", "navigation_bar.filters": "Mykistetyt sanat", @@ -526,14 +524,13 @@ "poll_button.add_poll": "Lisää äänestys", "poll_button.remove_poll": "Poista äänestys", "privacy.change": "Muuta julkaisun näkyvyyttä", - "privacy.direct.long": "Näkyy vain mainituille käyttäjille", - "privacy.direct.short": "Vain mainitut käyttäjät", - "privacy.private.long": "Näkyy vain seuraajille", - "privacy.private.short": "Vain seuraajat", - "privacy.public.long": "Näkyy kaikille", + "privacy.direct.long": "Kaikki tässä julkaisussa mainitut", + "privacy.direct.short": "Tietyt henkilöt", + "privacy.private.long": "Vain seuraajasi", + "privacy.private.short": "Seuraajat", + "privacy.public.long": "Kuka tahansa Mastodonissa ja sen ulkopuolella", "privacy.public.short": "Julkinen", - "privacy.unlisted.long": "Näkyy kaikille mutta jää pois löytämisominaisuuksista", - "privacy.unlisted.short": "Listaamaton", + "privacy.unlisted.additional": "Tämä toimii kuten julkinen, paitsi että julkaisu ei näy livesyötteissä, aihetunnisteissa, selaa-näkymässä tai Mastodon-haussa, vaikka olisit sallinut ne käyttäjätilin laajuisesti.", "privacy_policy.last_updated": "Viimeksi päivitetty {date}", "privacy_policy.title": "Tietosuojakäytäntö", "recommended": "Suositeltu", @@ -551,7 +548,9 @@ "relative_time.minutes": "{number} min", "relative_time.seconds": "{number} s", "relative_time.today": "tänään", + "reply_indicator.attachments": "{count, plural, one {# liite} other {# liitettä}}", "reply_indicator.cancel": "Peruuta", + "reply_indicator.poll": "Kysely", "report.block": "Estä", "report.block_explanation": "Et näe hänen viestejään, eikä hän voi nähdä viestejäsi tai seurata sinua. Hän näkee, että olet estänyt hänet.", "report.categories.legal": "Lakiasiat", @@ -715,10 +714,8 @@ "upload_error.poll": "Tiedoston lataaminen ei ole sallittua äänestyksissä.", "upload_form.audio_description": "Kuvaile sisältöä kuuroille ja kuulorajoitteisille", "upload_form.description": "Kuvaile sisältöä sokeille ja näkörajoitteisille", - "upload_form.description_missing": "Kuvausta ei ole lisätty", "upload_form.edit": "Muokkaa", "upload_form.thumbnail": "Vaihda pikkukuva", - "upload_form.undo": "Poista", "upload_form.video_description": "Kuvaile sisältöä kuuroille, kuulorajoitteisille, sokeille tai näkörajoitteisille", "upload_modal.analyzing_picture": "Analysoidaan kuvaa…", "upload_modal.apply": "Käytä", diff --git a/app/javascript/mastodon/locales/fo.json b/app/javascript/mastodon/locales/fo.json index 94d13e8d91..a4c5296086 100644 --- a/app/javascript/mastodon/locales/fo.json +++ b/app/javascript/mastodon/locales/fo.json @@ -89,7 +89,6 @@ "announcement.announcement": "Kunngerð", "attachments_list.unprocessed": "(óviðgjørt)", "audio.hide": "Fjal ljóð", - "autosuggest_hashtag.per_week": "{count} um vikuna", "boost_modal.combo": "Tú kanst trýsta á {combo} fyri at loypa uppum hetta næstu ferð", "bundle_column_error.copy_stacktrace": "Avrita feilfráboðan", "bundle_column_error.error.body": "Umbidna síðan kann ikki vísast. Tað kann vera orsakað av einum feili í koduni hjá okkum ella tað kann vera orsakað av kaganum, sum tú brúkar.", @@ -148,20 +147,20 @@ "compose_form.placeholder": "Hvat hevur tú í huga?", "compose_form.poll.add_option": "Legg valmøguleika afturat", "compose_form.poll.duration": "Atkvøðugreiðslutíð", + "compose_form.poll.multiple": "Fleiri valmøguleikar", "compose_form.poll.option_placeholder": "Valmøguleiki {number}", - "compose_form.poll.remove_option": "Strika valmøguleikan", + "compose_form.poll.remove_option": "Strika hendan valmøguleikan", + "compose_form.poll.single": "Vel ein", "compose_form.poll.switch_to_multiple": "Broyt atkvøðugreiðslu til at loyva fleiri svarum", "compose_form.poll.switch_to_single": "Broyt atkvøðugreiðslu til einstakt svar", - "compose_form.publish": "Legg út", + "compose_form.poll.type": "Stílur", + "compose_form.publish": "Posta", "compose_form.publish_form": "Legg út", - "compose_form.publish_loud": "{publish}!", - "compose_form.save_changes": "Goym broytingar", - "compose_form.sensitive.hide": "{count, plural, one {Frámerk tilfar sum viðkvæmt} other {Frámerk tilfar sum viðkvæmt}}", - "compose_form.sensitive.marked": "{count, plural, one {Tilfarið er frámerkt sum viðkvæmt} other {Tilfarið er frámerkt sum viðkvæmt}}", - "compose_form.sensitive.unmarked": "{count, plural, one {Tilfarið er ikki merkt sum viðkvæmt} other {Tilfarið er ikki merkt sum viðkvæmt}}", + "compose_form.reply": "Svara", + "compose_form.save_changes": "Dagfør", "compose_form.spoiler.marked": "Ávaring um at strika innihald", "compose_form.spoiler.unmarked": "Skriva ávaring um innihald", - "compose_form.spoiler_placeholder": "Skriva tína ávaring her", + "compose_form.spoiler_placeholder": "Innihaldsávaring (valfrí)", "confirmation_modal.cancel": "Strika", "confirmations.block.block_and_report": "Banna og melda", "confirmations.block.confirm": "Banna", @@ -408,7 +407,6 @@ "navigation_bar.direct": "Privatar umrøður", "navigation_bar.discover": "Uppdaga", "navigation_bar.domain_blocks": "Bannað økisnøvn", - "navigation_bar.edit_profile": "Broyt vanga", "navigation_bar.explore": "Rannsaka", "navigation_bar.favourites": "Dámdir postar", "navigation_bar.filters": "Doyvd orð", @@ -526,14 +524,15 @@ "poll_button.add_poll": "Legg atkvøðugreiðslu afturat", "poll_button.remove_poll": "Strika atkvøðugreiðslu", "privacy.change": "Broyt privatverju av posti", - "privacy.direct.long": "Bert sjónligt hjá nevndum brúkarum", - "privacy.direct.short": "Bert nevnd fólk", - "privacy.private.long": "Bert sjónligt hjá fylgjarum", - "privacy.private.short": "Einans fylgjarar", - "privacy.public.long": "Sjónligt hjá øllum", + "privacy.direct.long": "Øll, sum eru nevnd í postinum", + "privacy.direct.short": "Ávís fólk", + "privacy.private.long": "Einans tey, ið fylgja tær", + "privacy.private.short": "Fylgjarar", + "privacy.public.long": "Øll í og uttanfyri Mastodon", "privacy.public.short": "Alment", - "privacy.unlisted.long": "Sjónligur fyri øll, men ikki gjøgnum uppdagingarhentleikarnar", - "privacy.unlisted.short": "Ikki listað", + "privacy.unlisted.additional": "Hetta er júst sum almenn, tó verður posturin ikki vístur í samtíðarrásum ella frámerkjum, rannsakan ella Mastodon leitingum, sjálvt um valið er galdandi fyri alla kontuna.", + "privacy.unlisted.long": "Færri algoritmiskar fanfarur", + "privacy.unlisted.short": "Stillur almenningur", "privacy_policy.last_updated": "Seinast dagført {date}", "privacy_policy.title": "Privatlívspolitikkur", "recommended": "Viðmælt", @@ -551,7 +550,9 @@ "relative_time.minutes": "{number}m", "relative_time.seconds": "{number}s", "relative_time.today": "í dag", + "reply_indicator.attachments": "{count, plural, one {# viðfesti} other {# viðfesti}}", "reply_indicator.cancel": "Ógilda", + "reply_indicator.poll": "Atkvøðugreiðsla", "report.block": "Blokera", "report.block_explanation": "Tú fer ikki at síggja postarnar hjá teimum. Tey kunnu ikki síggja tínar postar ella fylgja tær. Tey síggja, at tey eru blokeraði.", "report.categories.legal": "Løgfrøðisligt", @@ -715,10 +716,8 @@ "upload_error.poll": "Ikki loyvt at leggja fílur upp í spurnarkanningum.", "upload_form.audio_description": "Lýs fyri teimum, sum eru deyv ella hava ringa hoyrn", "upload_form.description": "Lýs fyri teimum, sum eru blind ella eru sjónveik", - "upload_form.description_missing": "Lýsing vantar", "upload_form.edit": "Rætta", "upload_form.thumbnail": "Broyt smámynd", - "upload_form.undo": "Strika", "upload_form.video_description": "Lýs fyri teimum, sum eru deyv, hava ringa hoyrn, eru blind ella eru sjónveik", "upload_modal.analyzing_picture": "Greini mynd…", "upload_modal.apply": "Ger virkið", diff --git a/app/javascript/mastodon/locales/fr-CA.json b/app/javascript/mastodon/locales/fr-CA.json index f2d99412d2..66a7da6d15 100644 --- a/app/javascript/mastodon/locales/fr-CA.json +++ b/app/javascript/mastodon/locales/fr-CA.json @@ -89,7 +89,6 @@ "announcement.announcement": "Annonce", "attachments_list.unprocessed": "(non traité)", "audio.hide": "Masquer l'audio", - "autosuggest_hashtag.per_week": "{count} par semaine", "boost_modal.combo": "Vous pouvez appuyer sur {combo} pour sauter ceci la prochaine fois", "bundle_column_error.copy_stacktrace": "Copier le rapport d'erreur", "bundle_column_error.error.body": "La page demandée n'a pas pu être affichée. Cela pourrait être dû à un bogue dans notre code, ou à un problème de compatibilité avec le navigateur.", @@ -146,22 +145,12 @@ "compose_form.lock_disclaimer": "Votre compte n’est pas {locked}. Tout le monde peut vous suivre et voir vos publications privés.", "compose_form.lock_disclaimer.lock": "verrouillé", "compose_form.placeholder": "À quoi pensez-vous?", - "compose_form.poll.add_option": "Ajouter un choix", "compose_form.poll.duration": "Durée du sondage", - "compose_form.poll.option_placeholder": "Choix {number}", - "compose_form.poll.remove_option": "Supprimer ce choix", "compose_form.poll.switch_to_multiple": "Changer le sondage pour autoriser plusieurs choix", "compose_form.poll.switch_to_single": "Changer le sondage pour n'autoriser qu'un seul choix", - "compose_form.publish": "Publier", "compose_form.publish_form": "Publier", - "compose_form.publish_loud": "{publish}!", - "compose_form.save_changes": "Enregistrer les modifications", - "compose_form.sensitive.hide": "{count, plural, one {Marquer média comme sensible} other {Marquer médias comme sensibles}}", - "compose_form.sensitive.marked": "{count, plural, one {Le média est marqué comme sensible} other {Les médias sont marqués comme sensibles}}", - "compose_form.sensitive.unmarked": "{count, plural, one {Le média n’est pas marqué comme sensible} other {Les médias ne sont pas marqués comme sensibles}}", "compose_form.spoiler.marked": "Enlever l'avertissement de contenu", "compose_form.spoiler.unmarked": "Ajouter un avertissement de contenu", - "compose_form.spoiler_placeholder": "Écrivez votre avertissement ici", "confirmation_modal.cancel": "Annuler", "confirmations.block.block_and_report": "Bloquer et signaler", "confirmations.block.confirm": "Bloquer", @@ -408,7 +397,6 @@ "navigation_bar.direct": "Mention privée", "navigation_bar.discover": "Découvrir", "navigation_bar.domain_blocks": "Domaines bloqués", - "navigation_bar.edit_profile": "Modifier le profil", "navigation_bar.explore": "Explorer", "navigation_bar.favourites": "Favoris", "navigation_bar.filters": "Mots masqués", @@ -526,14 +514,7 @@ "poll_button.add_poll": "Ajouter un sondage", "poll_button.remove_poll": "Supprimer le sondage", "privacy.change": "Changer la confidentialité des messages", - "privacy.direct.long": "Visible uniquement par les comptes mentionnés", - "privacy.direct.short": "Personnes mentionnées uniquement", - "privacy.private.long": "Visible uniquement pour vos abonné·e·s", - "privacy.private.short": "Abonné·e·s seulement", - "privacy.public.long": "Visible pour tous", "privacy.public.short": "Public", - "privacy.unlisted.long": "Visible pour tous, mais sans fonctionnalités de découverte", - "privacy.unlisted.short": "Non listé", "privacy_policy.last_updated": "Dernière mise à jour {date}", "privacy_policy.title": "Politique de confidentialité", "recommended": "Recommandé", @@ -715,10 +696,8 @@ "upload_error.poll": "L’envoi de fichiers n’est pas autorisé avec les sondages.", "upload_form.audio_description": "Décrire pour les personnes ayant des difficultés d’audition", "upload_form.description": "Décrire pour les malvoyants", - "upload_form.description_missing": "Description manquante", "upload_form.edit": "Modifier", "upload_form.thumbnail": "Changer la vignette", - "upload_form.undo": "Supprimer", "upload_form.video_description": "Décrire pour les personnes ayant des problèmes de vue ou d'audition", "upload_modal.analyzing_picture": "Analyse de l’image en cours…", "upload_modal.apply": "Appliquer", diff --git a/app/javascript/mastodon/locales/fr.json b/app/javascript/mastodon/locales/fr.json index 774702f98c..2d0fa3b7dd 100644 --- a/app/javascript/mastodon/locales/fr.json +++ b/app/javascript/mastodon/locales/fr.json @@ -89,7 +89,6 @@ "announcement.announcement": "Annonce", "attachments_list.unprocessed": "(non traité)", "audio.hide": "Masquer l'audio", - "autosuggest_hashtag.per_week": "{count} par semaine", "boost_modal.combo": "Vous pouvez appuyer sur {combo} pour passer ceci la prochaine fois", "bundle_column_error.copy_stacktrace": "Copier le rapport d'erreur", "bundle_column_error.error.body": "La page demandée n'a pas pu être affichée. Cela peut être dû à un bogue dans notre code, ou à un problème de compatibilité avec le navigateur.", @@ -146,22 +145,12 @@ "compose_form.lock_disclaimer": "Votre compte n’est pas {locked}. Tout le monde peut vous suivre pour voir vos messages réservés à vos abonné⋅e⋅s.", "compose_form.lock_disclaimer.lock": "verrouillé", "compose_form.placeholder": "Qu’avez-vous en tête ?", - "compose_form.poll.add_option": "Ajouter un choix", "compose_form.poll.duration": "Durée du sondage", - "compose_form.poll.option_placeholder": "Choix {number}", - "compose_form.poll.remove_option": "Supprimer ce choix", "compose_form.poll.switch_to_multiple": "Changer le sondage pour autoriser plusieurs choix", "compose_form.poll.switch_to_single": "Modifier le sondage pour autoriser qu'un seul choix", - "compose_form.publish": "Publier", "compose_form.publish_form": "Nouvelle publication", - "compose_form.publish_loud": "{publish} !", - "compose_form.save_changes": "Enregistrer les modifications", - "compose_form.sensitive.hide": "{count, plural, one {Marquer le média comme sensible} other {Marquer les médias comme sensibles}}", - "compose_form.sensitive.marked": "{count, plural, one {Le média est marqué comme sensible} other {Les médias sont marqués comme sensibles}}", - "compose_form.sensitive.unmarked": "{count, plural, one {Le média n’est pas marqué comme sensible} other {Les médias ne sont pas marqués comme sensibles}}", "compose_form.spoiler.marked": "Enlever l’avertissement de contenu", "compose_form.spoiler.unmarked": "Ajouter un avertissement de contenu", - "compose_form.spoiler_placeholder": "Écrivez votre avertissement ici", "confirmation_modal.cancel": "Annuler", "confirmations.block.block_and_report": "Bloquer et signaler", "confirmations.block.confirm": "Bloquer", @@ -408,7 +397,6 @@ "navigation_bar.direct": "Mention privée", "navigation_bar.discover": "Découvrir", "navigation_bar.domain_blocks": "Domaines bloqués", - "navigation_bar.edit_profile": "Modifier le profil", "navigation_bar.explore": "Explorer", "navigation_bar.favourites": "Favoris", "navigation_bar.filters": "Mots masqués", @@ -526,14 +514,7 @@ "poll_button.add_poll": "Ajouter un sondage", "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": "Personnes mentionnées uniquement", - "privacy.private.long": "Visible uniquement par vos abonnés", - "privacy.private.short": "Abonnés uniquement", - "privacy.public.long": "Visible pour tous", "privacy.public.short": "Public", - "privacy.unlisted.long": "Visible pour tous, mais sans fonctionnalités de découverte", - "privacy.unlisted.short": "Non listé", "privacy_policy.last_updated": "Dernière mise à jour {date}", "privacy_policy.title": "Politique de confidentialité", "recommended": "Recommandé", @@ -715,10 +696,8 @@ "upload_error.poll": "L’envoi de fichiers n’est pas autorisé avec les sondages.", "upload_form.audio_description": "Décrire pour les personnes ayant des difficultés d’audition", "upload_form.description": "Décrire pour les malvoyant·e·s", - "upload_form.description_missing": "Description manquante", "upload_form.edit": "Modifier", "upload_form.thumbnail": "Changer la vignette", - "upload_form.undo": "Supprimer", "upload_form.video_description": "Décrire pour les personnes ayant des problèmes de vue ou d'audition", "upload_modal.analyzing_picture": "Analyse de l’image en cours…", "upload_modal.apply": "Appliquer", diff --git a/app/javascript/mastodon/locales/fy.json b/app/javascript/mastodon/locales/fy.json index ea42ef91c0..d5f22d2ee1 100644 --- a/app/javascript/mastodon/locales/fy.json +++ b/app/javascript/mastodon/locales/fy.json @@ -89,7 +89,6 @@ "announcement.announcement": "Oankundiging", "attachments_list.unprocessed": "(net ferwurke)", "audio.hide": "Audio ferstopje", - "autosuggest_hashtag.per_week": "{count} yn ’e wike", "boost_modal.combo": "Jo kinne op {combo} drukke om dit de folgjende kear oer te slaan", "bundle_column_error.copy_stacktrace": "Flaterrapport kopiearje", "bundle_column_error.error.body": "De opfrege side koe net werjûn wurde. It kin wêze troch in flater yn ús koade, of in probleem mei browserkompatibiliteit.", @@ -146,22 +145,12 @@ "compose_form.lock_disclaimer": "Jo account is net {locked}. Elkenien kin jo folgje en kin de berjochten sjen dy’t jo allinnich oan jo folgers rjochte hawwe.", "compose_form.lock_disclaimer.lock": "beskoattele", "compose_form.placeholder": "Wat wolle jo kwyt?", - "compose_form.poll.add_option": "Kar tafoegje", "compose_form.poll.duration": "Doer fan de enkête", - "compose_form.poll.option_placeholder": "Kar {number}", - "compose_form.poll.remove_option": "Dizze kar fuortsmite", "compose_form.poll.switch_to_multiple": "Enkête wizigje om meardere karren ta te stean", "compose_form.poll.switch_to_single": "Enkête wizigje om in inkelde kar ta te stean", - "compose_form.publish": "Publisearje", "compose_form.publish_form": "Publisearje", - "compose_form.publish_loud": "{publish}!", - "compose_form.save_changes": "Wizigingen bewarje", - "compose_form.sensitive.hide": "{count, plural, one {Media as gefoelich markearje} other {Media as gefoelich markearje}}", - "compose_form.sensitive.marked": "{count, plural, one {Media as gefoelich markearre} other {Media as gefoelich markearre}}", - "compose_form.sensitive.unmarked": "{count, plural, one {Media is net as gefoelich markearre} other {Media is net as gefoelich markearre}}", "compose_form.spoiler.marked": "Ynhâldswarskôging fuortsmite", "compose_form.spoiler.unmarked": "Ynhâldswarskôging tafoegje", - "compose_form.spoiler_placeholder": "Warskôgingstekst", "confirmation_modal.cancel": "Annulearje", "confirmations.block.block_and_report": "Blokkearje en rapportearje", "confirmations.block.confirm": "Blokkearje", @@ -408,7 +397,6 @@ "navigation_bar.direct": "Priveefermeldingen", "navigation_bar.discover": "Untdekke", "navigation_bar.domain_blocks": "Blokkearre domeinen", - "navigation_bar.edit_profile": "Profyl bewurkje", "navigation_bar.explore": "Ferkenne", "navigation_bar.favourites": "Favoriten", "navigation_bar.filters": "Negearre wurden", @@ -526,14 +514,7 @@ "poll_button.add_poll": "Poll tafoegje", "poll_button.remove_poll": "Enkête fuortsmite", "privacy.change": "Sichtberheid fan berjocht oanpasse", - "privacy.direct.long": "Allinnich sichtber foar fermelde brûkers", - "privacy.direct.short": "Allinnich fermelde minsken", - "privacy.private.long": "Allinnich sichtber foar folgers", - "privacy.private.short": "Allinnich folgers", - "privacy.public.long": "Sichtber foar elkenien", "privacy.public.short": "Iepenbier", - "privacy.unlisted.long": "Foar elkenien sichtber, mar net ûnder trends, hashtags en op iepenbiere tiidlinen", - "privacy.unlisted.short": "Minder iepenbier", "privacy_policy.last_updated": "Lêst bywurke op {date}", "privacy_policy.title": "Privacybelied", "recommended": "Oanrekommandearre", @@ -715,10 +696,8 @@ "upload_error.poll": "It opladen fan bestannen is yn enkêten net tastien.", "upload_form.audio_description": "Describe for people with hearing loss", "upload_form.description": "Describe for the visually impaired", - "upload_form.description_missing": "Gjin omskriuwing tafoege", "upload_form.edit": "Bewurkje", "upload_form.thumbnail": "Miniatuerôfbylding wizigje", - "upload_form.undo": "Fuortsmite", "upload_form.video_description": "Describe for people with hearing loss or visual impairment", "upload_modal.analyzing_picture": "Ofbylding analysearje…", "upload_modal.apply": "Tapasse", diff --git a/app/javascript/mastodon/locales/ga.json b/app/javascript/mastodon/locales/ga.json index f0f9c55549..855a27d057 100644 --- a/app/javascript/mastodon/locales/ga.json +++ b/app/javascript/mastodon/locales/ga.json @@ -76,7 +76,6 @@ "announcement.announcement": "Fógra", "attachments_list.unprocessed": "(neamhphróiseáilte)", "audio.hide": "Cuir fuaim i bhfolach", - "autosuggest_hashtag.per_week": "{count} sa seachtain", "boost_modal.combo": "Is féidir leat {combo} a bhrú chun é seo a scipeáil an chéad uair eile", "bundle_column_error.copy_stacktrace": "Cóipeáil tuairisc earráide", "bundle_column_error.error.body": "Ní féidir an leathanach a iarradh a sholáthar. Seans gurb amhlaidh mar gheall ar fhabht sa chód, nó mar gheall ar mhíréireacht leis an mbrabhsálaí.", @@ -127,19 +126,12 @@ "compose_form.lock_disclaimer": "Níl an cuntas seo {locked}. Féadfaidh duine ar bith tú a leanúint agus na postálacha atá dírithe agat ar do lucht leanúna amháin a fheiceáil.", "compose_form.lock_disclaimer.lock": "faoi ghlas", "compose_form.placeholder": "Cad atá ag tarlú?", - "compose_form.poll.add_option": "Cuir rogha isteach", "compose_form.poll.duration": "Achar suirbhéanna", - "compose_form.poll.option_placeholder": "Rogha {number}", - "compose_form.poll.remove_option": "Bain an rogha seo", "compose_form.poll.switch_to_multiple": "Athraigh suirbhé chun cead a thabhairt do ilrogha", "compose_form.poll.switch_to_single": "Athraigh suirbhé chun cead a thabhairt do rogha amháin", - "compose_form.publish": "Foilsigh", "compose_form.publish_form": "Foilsigh\n", - "compose_form.publish_loud": "{publish}!", - "compose_form.save_changes": "Sábháil", "compose_form.spoiler.marked": "Bain rabhadh ábhair", "compose_form.spoiler.unmarked": "Cuir rabhadh ábhair", - "compose_form.spoiler_placeholder": "Scríobh do rabhadh anseo", "confirmation_modal.cancel": "Cealaigh", "confirmations.block.block_and_report": "Bac ⁊ Tuairiscigh", "confirmations.block.confirm": "Bac", @@ -325,7 +317,6 @@ "navigation_bar.compose": "Cum postáil nua", "navigation_bar.discover": "Faigh amach", "navigation_bar.domain_blocks": "Fearainn bhactha", - "navigation_bar.edit_profile": "Cuir an phróifíl in eagar", "navigation_bar.explore": "Féach thart", "navigation_bar.filters": "Focail bhalbhaithe", "navigation_bar.follow_requests": "Iarratais leanúnaí", @@ -401,12 +392,7 @@ "poll_button.add_poll": "Cruthaigh suirbhé", "poll_button.remove_poll": "Bain suirbhé", "privacy.change": "Adjust status privacy", - "privacy.direct.short": "Direct", - "privacy.private.long": "Sofheicthe do Leantóirí amháin", - "privacy.private.short": "Leantóirí amháin", - "privacy.public.long": "Infheicthe do chách", "privacy.public.short": "Poiblí", - "privacy.unlisted.short": "Neamhliostaithe", "privacy_policy.title": "Polasaí príobháideachais", "refresh": "Athnuaigh", "regeneration_indicator.label": "Ag lódáil…", @@ -529,7 +515,6 @@ "upload_form.audio_description": "Describe for people with hearing loss", "upload_form.description": "Describe for the visually impaired", "upload_form.edit": "Cuir in eagar", - "upload_form.undo": "Scrios", "upload_form.video_description": "Describe for people with hearing loss or visual impairment", "upload_modal.analyzing_picture": "Ag anailísiú íomhá…", "upload_modal.apply": "Cuir i bhFeidhm", diff --git a/app/javascript/mastodon/locales/gd.json b/app/javascript/mastodon/locales/gd.json index 11d83d6ceb..0c7ef79cd8 100644 --- a/app/javascript/mastodon/locales/gd.json +++ b/app/javascript/mastodon/locales/gd.json @@ -86,7 +86,6 @@ "announcement.announcement": "Brath-fios", "attachments_list.unprocessed": "(gun phròiseasadh)", "audio.hide": "Falaich an fhuaim", - "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.copy_stacktrace": "Dèan lethbhreac de aithris na mearachd", "bundle_column_error.error.body": "Cha b’ urrainn dhuinn an duilleag a dh’iarr thu a reandaradh. Dh’fhaoidte gu bheil buga sa chòd againn no duilgheadas co-chòrdalachd leis a’ bhrabhsair.", @@ -143,22 +142,12 @@ "compose_form.lock_disclaimer": "Chan eil an cunntas agad {locked}. ’S urrainn do dhuine sam bith ’gad leantainn is na postaichean agad a tha ag amas air an luchd-leantainn agad a-mhàin a shealltainn.", "compose_form.lock_disclaimer.lock": "glaiste", "compose_form.placeholder": "Dè tha air d’ aire?", - "compose_form.poll.add_option": "Cuir roghainn ris", "compose_form.poll.duration": "Faide a’ chunntais-bheachd", - "compose_form.poll.option_placeholder": "Roghainn {number}", - "compose_form.poll.remove_option": "Thoir an roghainn seo air falbh", "compose_form.poll.switch_to_multiple": "Atharraich an cunntas-bheachd ach an gabh iomadh roghainn a thaghadh", "compose_form.poll.switch_to_single": "Atharraich an cunntas-bheachd gus nach gabh ach aon roghainn a thaghadh", - "compose_form.publish": "Foillsich", "compose_form.publish_form": "Post ùr", - "compose_form.publish_loud": "{publish}!", - "compose_form.save_changes": "Sàbhail na h-atharraichean", - "compose_form.sensitive.hide": "{count, plural, one {Cuir comharra gu bheil am meadhan frionasach} two {Cuir comharra gu bheil na meadhanan frionasach} few {Cuir comharra gu bheil na meadhanan frionasach} other {Cuir comharra gu bheil na meadhanan frionasach}}", - "compose_form.sensitive.marked": "{count, plural, one {Tha comharra ris a’ mheadhan gu bheil e frionasach} two {Tha comharra ris na meadhanan gu bheil iad frionasach} few {Tha comharra ris na meadhanan gu bheil iad frionasach} other {Tha comharra ris na meadhanan gu bheil iad frionasach}}", - "compose_form.sensitive.unmarked": "{count, plural, one {Chan eil comharra ris a’ mheadhan gun robh e frionasach} two {Chan eil comharra ris na meadhanan gun robh iad frionasach} few {Chan eil comharra ris na meadhanan gun robh iad frionasach} other {Chan eil comharra ris na meadhanan gun robh iad frionasach}}", "compose_form.spoiler.marked": "Thoir air falbh an rabhadh susbainte", "compose_form.spoiler.unmarked": "Cuir rabhadh susbainte ris", - "compose_form.spoiler_placeholder": "Sgrìobh an rabhadh agad an-seo", "confirmation_modal.cancel": "Sguir dheth", "confirmations.block.block_and_report": "Bac ⁊ dèan gearan", "confirmations.block.confirm": "Bac", @@ -402,7 +391,6 @@ "navigation_bar.direct": "Iomraidhean prìobhaideach", "navigation_bar.discover": "Rùraich", "navigation_bar.domain_blocks": "Àrainnean bacte", - "navigation_bar.edit_profile": "Deasaich a’ phròifil", "navigation_bar.explore": "Rùraich", "navigation_bar.favourites": "Annsachdan", "navigation_bar.filters": "Faclan mùchte", @@ -509,14 +497,7 @@ "poll_button.add_poll": "Cuir cunntas-bheachd ris", "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": "An fheadhainn le iomradh orra a-mhàin", - "privacy.private.long": "Chan fhaic ach na daoine a tha ’gad leantainn seo", - "privacy.private.short": "Luchd-leantainn a-mhàin", - "privacy.public.long": "Chì a h-uile duine e", "privacy.public.short": "Poblach", - "privacy.unlisted.long": "Chì a h-uile duine e ach cha nochd e ann an gleusan rùrachaidh", - "privacy.unlisted.short": "Falaichte o liostaichean", "privacy_policy.last_updated": "An t-ùrachadh mu dheireadh {date}", "privacy_policy.title": "Poileasaidh prìobhaideachd", "refresh": "Ath-nuadhaich", @@ -696,10 +677,8 @@ "upload_error.poll": "Chan fhaod thu faidhle a luchdadh suas an cois cunntais-bheachd.", "upload_form.audio_description": "Mìnich e dhan fheadhainn le èisteachd bheag", "upload_form.description": "Mìnich e dhan fheadhainn le cion-lèirsinne", - "upload_form.description_missing": "Cha deach tuairisgeul a chur ris", "upload_form.edit": "Deasaich", "upload_form.thumbnail": "Atharraich an dealbhag", - "upload_form.undo": "Sguab às", "upload_form.video_description": "Mìnich e dhan fheadhainn le èisteachd bheag no cion-lèirsinne", "upload_modal.analyzing_picture": "A’ sgrùdadh an deilbh…", "upload_modal.apply": "Cuir an sàs", diff --git a/app/javascript/mastodon/locales/gl.json b/app/javascript/mastodon/locales/gl.json index e857b69554..ffd01a547d 100644 --- a/app/javascript/mastodon/locales/gl.json +++ b/app/javascript/mastodon/locales/gl.json @@ -89,7 +89,6 @@ "announcement.announcement": "Anuncio", "attachments_list.unprocessed": "(sen procesar)", "audio.hide": "Agochar audio", - "autosuggest_hashtag.per_week": "{count} por semana", "boost_modal.combo": "Preme {combo} para ignorar isto na seguinte vez", "bundle_column_error.copy_stacktrace": "Copiar informe do erro", "bundle_column_error.error.body": "Non se puido mostrar a páxina solicitada. Podería deberse a un problema no código, ou incompatiblidade co navegador.", @@ -146,22 +145,12 @@ "compose_form.lock_disclaimer": "A túa conta non está {locked}. Todas poden seguirte para ollar os teus toots só para seguidoras.", "compose_form.lock_disclaimer.lock": "bloqueada", "compose_form.placeholder": "Que contas?", - "compose_form.poll.add_option": "Engadir unha opción", "compose_form.poll.duration": "Duración da enquisa", - "compose_form.poll.option_placeholder": "Opción {number}", - "compose_form.poll.remove_option": "Eliminar esta opción", "compose_form.poll.switch_to_multiple": "Mudar a enquisa para permitir múltiples escollas", "compose_form.poll.switch_to_single": "Mudar a enquisa para permitir unha soa opción", - "compose_form.publish": "Publicar", "compose_form.publish_form": "Publicar", - "compose_form.publish_loud": "{publish}!", - "compose_form.save_changes": "Gardar cambios", - "compose_form.sensitive.hide": "{count, plural, one {Marca multimedia como sensible} other {Marca multimedia como sensibles}}", - "compose_form.sensitive.marked": "{count, plural, one {Multimedia marcado como sensible} other {Multimedia marcados como sensibles}}", - "compose_form.sensitive.unmarked": "{count, plural, one {Multimedia non marcado como sensible} other {Multimedia non marcado como sensible}}", "compose_form.spoiler.marked": "Retirar o aviso sobre o contido", "compose_form.spoiler.unmarked": "Engadir aviso sobre o contido", - "compose_form.spoiler_placeholder": "Escribe o teu aviso aquí", "confirmation_modal.cancel": "Cancelar", "confirmations.block.block_and_report": "Bloquear e denunciar", "confirmations.block.confirm": "Bloquear", @@ -408,7 +397,6 @@ "navigation_bar.direct": "Mencións privadas", "navigation_bar.discover": "Descubrir", "navigation_bar.domain_blocks": "Dominios agochados", - "navigation_bar.edit_profile": "Editar perfil", "navigation_bar.explore": "Descubrir", "navigation_bar.favourites": "Favoritas", "navigation_bar.filters": "Palabras silenciadas", @@ -526,14 +514,7 @@ "poll_button.add_poll": "Engadir unha enquisa", "poll_button.remove_poll": "Eliminar enquisa", "privacy.change": "Axustar privacidade", - "privacy.direct.long": "Só para as usuarias mencionadas", - "privacy.direct.short": "Só persoas mencionadas", - "privacy.private.long": "Só para persoas que te seguen", - "privacy.private.short": "Só para seguidoras", - "privacy.public.long": "Visible por todas", "privacy.public.short": "Público", - "privacy.unlisted.long": "Visible por todas, pero excluída da sección descubrir", - "privacy.unlisted.short": "Sen listar", "privacy_policy.last_updated": "Actualizado por última vez no {date}", "privacy_policy.title": "Política de Privacidade", "recommended": "Aconsellable", @@ -715,10 +696,8 @@ "upload_error.poll": "Non se poden subir ficheiros nas enquisas.", "upload_form.audio_description": "Describir para persoas con problemas auditivos", "upload_form.description": "Describir para persoas cegas ou con problemas visuais", - "upload_form.description_missing": "Sen descrición", "upload_form.edit": "Editar", "upload_form.thumbnail": "Cambiar a miniatura", - "upload_form.undo": "Eliminar", "upload_form.video_description": "Describe para persoas con problemas visuais ou auditivos", "upload_modal.analyzing_picture": "Estase a analizar a imaxe…", "upload_modal.apply": "Aplicar", diff --git a/app/javascript/mastodon/locales/he.json b/app/javascript/mastodon/locales/he.json index 6758457273..d88a8c49c3 100644 --- a/app/javascript/mastodon/locales/he.json +++ b/app/javascript/mastodon/locales/he.json @@ -89,7 +89,6 @@ "announcement.announcement": "הכרזה", "attachments_list.unprocessed": "(לא מעובד)", "audio.hide": "השתק", - "autosuggest_hashtag.per_week": "{count} לשבוע", "boost_modal.combo": "ניתן להקיש {combo} כדי לדלג בפעם הבאה", "bundle_column_error.copy_stacktrace": "העתקת הודעת שגיאה", "bundle_column_error.error.body": "הדף המבוקש אינו זמין. זה עשוי להיות באג בקוד או בעייה בתאימות הדפדפן.", @@ -146,22 +145,22 @@ "compose_form.lock_disclaimer": "חשבונך אינו {locked}. כל אחד יוכל לעקוב אחריך כדי לקרוא את הודעותיך המיועדות לעוקבים בלבד.", "compose_form.lock_disclaimer.lock": "נעול", "compose_form.placeholder": "על מה את.ה חושב.ת?", - "compose_form.poll.add_option": "הוסיפו בחירה", + "compose_form.poll.add_option": "הוספת אפשרות", "compose_form.poll.duration": "משך הסקר", - "compose_form.poll.option_placeholder": "אפשרות מספר {number}", - "compose_form.poll.remove_option": "הסר בחירה זו", + "compose_form.poll.multiple": "בחירה מרובה", + "compose_form.poll.option_placeholder": "אפשרות {number}", + "compose_form.poll.remove_option": "הסרת אפשרות זו", + "compose_form.poll.single": "נא לבחור", "compose_form.poll.switch_to_multiple": "אפשרו בחירה מרובה בסקר", "compose_form.poll.switch_to_single": "אפשרו בחירה בודדת בסקר", - "compose_form.publish": "פרסום", + "compose_form.poll.type": "סוג משאל", + "compose_form.publish": "הודעה", "compose_form.publish_form": "לפרסם", - "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.reply": "תגובה", + "compose_form.save_changes": "עדכון", "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": "לחסום", @@ -408,7 +407,6 @@ "navigation_bar.direct": "הודעות פרטיות", "navigation_bar.discover": "גלה", "navigation_bar.domain_blocks": "קהילות (שמות מתחם) חסומות", - "navigation_bar.edit_profile": "עריכת פרופיל", "navigation_bar.explore": "סיור", "navigation_bar.favourites": "חיבובים", "navigation_bar.filters": "מילים מושתקות", @@ -526,14 +524,12 @@ "poll_button.add_poll": "הוספת סקר", "poll_button.remove_poll": "הסרת סקר", "privacy.change": "שינוי פרטיות ההודעה", - "privacy.direct.long": "רק למשתמשים מאוזכרים (mentioned)", - "privacy.direct.short": "למאוזכרים בלבד", - "privacy.private.long": "הצג לעוקבים בלבד", - "privacy.private.short": "לעוקבים בלבד", - "privacy.public.long": "גלוי לכל", + "privacy.direct.long": "כל המוזכרים בהודעה", + "privacy.direct.short": "א.נשים מסוימים", + "privacy.private.long": "לעוקביך בלבד", + "privacy.private.short": "עוקבים", + "privacy.public.long": "כל הגולשים, מחוברים למסטודון או לא", "privacy.public.short": "פומבי", - "privacy.unlisted.long": "גלוי לכל, אבל מוסתר מאמצעי תגלית", - "privacy.unlisted.short": "לא רשום (לא לפיד הכללי)", "privacy_policy.last_updated": "עודכן לאחרונה {date}", "privacy_policy.title": "מדיניות פרטיות", "recommended": "מומלץ", @@ -551,7 +547,9 @@ "relative_time.minutes": "{number} דקות", "relative_time.seconds": "{number} שניות", "relative_time.today": "היום", + "reply_indicator.attachments": "{count, plural,one {# קובץ מצורף}other {# קבצים מצורפים}}", "reply_indicator.cancel": "ביטול", + "reply_indicator.poll": "משאל", "report.block": "לחסום", "report.block_explanation": "לא ניתן יהיה לראות את ההודעות שלהן. הן לא יוכלו לראות את ההודעות שלך או לעקוב אחריך. הם יוכלו לדעת שהם חסומים.", "report.categories.legal": "חוקי", @@ -715,10 +713,8 @@ "upload_error.poll": "לא ניתן להעלות קובץ עם סקר.", "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_modal.analyzing_picture": "מנתח תמונה…", "upload_modal.apply": "החל", diff --git a/app/javascript/mastodon/locales/hi.json b/app/javascript/mastodon/locales/hi.json index 412159bef9..42f4ca4efa 100644 --- a/app/javascript/mastodon/locales/hi.json +++ b/app/javascript/mastodon/locales/hi.json @@ -83,7 +83,6 @@ "announcement.announcement": "घोषणा", "attachments_list.unprocessed": "(असंसाधित)", "audio.hide": "हाईड ऑडियो", - "autosuggest_hashtag.per_week": "{count} हर सप्ताह", "boost_modal.combo": "अगली बार स्किप करने के लिए आप {combo} दबा सकते है", "bundle_column_error.copy_stacktrace": "कॉपी एरर रिपोर्ट", "bundle_column_error.error.body": "अनुरोधित पेज प्रस्तुत नहीं किया जा सका। यह हमारे कोड में बग या ब्राउज़र संगतता समस्या के कारण हो सकता है।", @@ -138,22 +137,12 @@ "compose_form.lock_disclaimer": "आपका खाता {locked} नहीं है। आपको केवल फॉलोवर्स को दिखाई दिए जाने वाले पोस्ट देखने के लिए कोई भी फॉलो कर सकता है।", "compose_form.lock_disclaimer.lock": "लॉक्ड", "compose_form.placeholder": "What is on your mind?", - "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_single": "एक ही विकल्प के लिए अनुमति देने के लिए पोल बदलें", - "compose_form.publish": "पब्लिश", "compose_form.publish_form": "पब्लिश", - "compose_form.publish_loud": "{publish}!", - "compose_form.save_changes": "परिवर्तनों को सहेजें", - "compose_form.sensitive.hide": "मीडिया को संवेदनशील के रूप में चिह्नित करें", - "compose_form.sensitive.marked": "मीडिया संवेदनशील के रूप में चिह्नित है", - "compose_form.sensitive.unmarked": "मीडिया संवेदनशील के रूप में चिह्नित नहीं है", "compose_form.spoiler.marked": "चेतावनी के पीछे टेक्स्ट छिपा है", "compose_form.spoiler.unmarked": "टेक्स्ट छिपा नहीं है", - "compose_form.spoiler_placeholder": "अपनी चेतावनी यहाँ लिखें", "confirmation_modal.cancel": "रद्द करें", "confirmations.block.block_and_report": "ब्लॉक एवं रिपोर्ट", "confirmations.block.confirm": "ब्लॉक", @@ -370,7 +359,6 @@ "navigation_bar.direct": "निजी संदेश", "navigation_bar.discover": "खोजें", "navigation_bar.domain_blocks": "Hidden domains", - "navigation_bar.edit_profile": "प्रोफ़ाइल संपादित करें", "navigation_bar.explore": "अन्वेषण करें", "navigation_bar.favourites": "पसंदीदा", "navigation_bar.filters": "वारित शब्द", @@ -440,13 +428,7 @@ "poll.vote": "वोट", "poll.voted": "आपने इसी उत्तर का चुनाव किया है।", "privacy.change": "Adjust status privacy", - "privacy.direct.long": "Post to mentioned users only", - "privacy.direct.short": "Direct", - "privacy.private.long": "Post to followers only", - "privacy.private.short": "Followers-only", - "privacy.public.long": "सब को दिखाई देगा", "privacy.public.short": "सार्वजनिक", - "privacy.unlisted.short": "अनलिस्टेड", "recommended": "अनुशंसित", "refresh": "रीफ्रेश करें", "regeneration_indicator.label": "लोड हो रहा है...", @@ -531,7 +513,6 @@ "upload_form.audio_description": "Describe for people with hearing loss", "upload_form.description": "Describe for the visually impaired", "upload_form.edit": "संशोधन करें", - "upload_form.undo": "मिटाए", "upload_form.video_description": "Describe for people with hearing loss or visual impairment", "upload_modal.apply": "लागू करें", "upload_modal.edit_media": "मीडिया में संशोधन करें", diff --git a/app/javascript/mastodon/locales/hr.json b/app/javascript/mastodon/locales/hr.json index c535f1affc..cada365fc8 100644 --- a/app/javascript/mastodon/locales/hr.json +++ b/app/javascript/mastodon/locales/hr.json @@ -88,7 +88,6 @@ "announcement.announcement": "Najava", "attachments_list.unprocessed": "(neobrađeno)", "audio.hide": "Sakrij audio", - "autosuggest_hashtag.per_week": "{count} tjedno", "boost_modal.combo": "Možete pritisnuti {combo} kako biste preskočili ovo sljedeći put", "bundle_column_error.copy_stacktrace": "Kopiraj izvješće o pogrešci", "bundle_column_error.error.body": "Zaraženu stranicu nije moguće prikazati. To bi moglo biti zbog pogreške u našem kodu ili problema s kompatibilnošću preglednika.", @@ -140,22 +139,12 @@ "compose_form.lock_disclaimer": "Vaš račun nije {locked}. Svatko Vas može pratiti kako bi vidjeli objave namijenjene Vašim pratiteljima.", "compose_form.lock_disclaimer.lock": "zaključan", "compose_form.placeholder": "Što ti je na umu?", - "compose_form.poll.add_option": "Dodaj opciju", "compose_form.poll.duration": "Trajanje ankete", - "compose_form.poll.option_placeholder": "Opcija {number}", - "compose_form.poll.remove_option": "Ukloni ovu opciju", "compose_form.poll.switch_to_multiple": "Omogući višestruki odabir opcija ankete", "compose_form.poll.switch_to_single": "Omogući odabir samo jedne opcije ankete", - "compose_form.publish": "Objavi", "compose_form.publish_form": "Objavi", - "compose_form.publish_loud": "{publish}!", - "compose_form.save_changes": "Spremi promjene", - "compose_form.sensitive.hide": "Označi medijski sadržaj kao osjetljiv", - "compose_form.sensitive.marked": "Medijski sadržaj označen je kao osjetljiv", - "compose_form.sensitive.unmarked": "Medijski sadržaj nije označen kao osjetljiv", "compose_form.spoiler.marked": "Tekst je skriven iza upozorenja", "compose_form.spoiler.unmarked": "Tekst nije skriven", - "compose_form.spoiler_placeholder": "Ovdje upišite upozorenje", "confirmation_modal.cancel": "Otkaži", "confirmations.block.block_and_report": "Blokiraj i prijavi", "confirmations.block.confirm": "Blokiraj", @@ -346,7 +335,6 @@ "navigation_bar.direct": "Privatna spominjanja", "navigation_bar.discover": "Istraživanje", "navigation_bar.domain_blocks": "Blokirane domene", - "navigation_bar.edit_profile": "Uredi profil", "navigation_bar.explore": "Istraži", "navigation_bar.favourites": "Favoriti", "navigation_bar.filters": "Utišane riječi", @@ -415,13 +403,7 @@ "poll_button.add_poll": "Dodaj anketu", "poll_button.remove_poll": "Ukloni anketu", "privacy.change": "Podesi privatnost toota", - "privacy.direct.long": "Vidljivo samo spomenutim korisnicima", - "privacy.direct.short": "Direct", - "privacy.private.long": "Vidljivo samo pratiteljima", - "privacy.private.short": "Followers-only", - "privacy.public.long": "Vidljivo svima", "privacy.public.short": "Javno", - "privacy.unlisted.short": "Neprikazano", "privacy_policy.last_updated": "Zadnje ažurirannje {date}", "privacy_policy.title": "Pravila o zaštiti privatnosti", "recommended": "Preporučeno", @@ -561,10 +543,8 @@ "upload_error.poll": "Prijenos datoteka nije dopušten kod anketa.", "upload_form.audio_description": "Opišite za ljude sa slabim sluhom", "upload_form.description": "Opišite za ljude sa slabim vidom", - "upload_form.description_missing": "Bez opisa", "upload_form.edit": "Uredi", "upload_form.thumbnail": "Promijeni pretpregled", - "upload_form.undo": "Obriši", "upload_form.video_description": "Opišite za ljude sa slabim sluhom ili vidom", "upload_modal.analyzing_picture": "Analiza slike…", "upload_modal.apply": "Primijeni", diff --git a/app/javascript/mastodon/locales/hu.json b/app/javascript/mastodon/locales/hu.json index 0d50e36feb..31bca5652b 100644 --- a/app/javascript/mastodon/locales/hu.json +++ b/app/javascript/mastodon/locales/hu.json @@ -89,7 +89,6 @@ "announcement.announcement": "Közlemény", "attachments_list.unprocessed": "(feldolgozatlan)", "audio.hide": "Hang elrejtése", - "autosuggest_hashtag.per_week": "{count} hetente", "boost_modal.combo": "Hogy átugord ezt következő alkalommal, használd {combo}", "bundle_column_error.copy_stacktrace": "Hibajelentés másolása", "bundle_column_error.error.body": "A kért lap nem jeleníthető meg. Ez lehet, hogy kódhiba, vagy böngészőkompatibitási hiba.", @@ -146,22 +145,22 @@ "compose_form.lock_disclaimer": "A fiókod nincs {locked}. Bárki követni tud, hogy megtekintse a kizárólag követőknek szánt bejegyzéseket.", "compose_form.lock_disclaimer.lock": "zárolva", "compose_form.placeholder": "Mi jár a fejedben?", - "compose_form.poll.add_option": "Lehetőség hozzáadása", + "compose_form.poll.add_option": "Opció hozzáadása", "compose_form.poll.duration": "Szavazás időtartama", - "compose_form.poll.option_placeholder": "{number}. lehetőség", - "compose_form.poll.remove_option": "Lehetőség eltávolítása", + "compose_form.poll.multiple": "Több választás", + "compose_form.poll.option_placeholder": "Opció {number}", + "compose_form.poll.remove_option": "Opció eltávolítása", + "compose_form.poll.single": "Egy választása", "compose_form.poll.switch_to_multiple": "Szavazás megváltoztatása több választásosra", "compose_form.poll.switch_to_single": "Szavazás megváltoztatása egyetlen választásosra", - "compose_form.publish": "Közzététel", + "compose_form.poll.type": "Stílus", + "compose_form.publish": "Bejegyzés", "compose_form.publish_form": "Új bejegyzés", - "compose_form.publish_loud": "{publish}!", - "compose_form.save_changes": "Módosítások mentése", - "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.reply": "Válasz", + "compose_form.save_changes": "Frissítés", "compose_form.spoiler.marked": "Tartalmi figyelmeztetés eltávolítása", "compose_form.spoiler.unmarked": "Tartalmi figyelmeztetés hozzáadása", - "compose_form.spoiler_placeholder": "Írd ide a figyelmeztetést", + "compose_form.spoiler_placeholder": "Tartalom figyelmeztetés (opcionális)", "confirmation_modal.cancel": "Mégsem", "confirmations.block.block_and_report": "Letiltás és jelentés", "confirmations.block.confirm": "Letiltás", @@ -408,7 +407,6 @@ "navigation_bar.direct": "Személyes említések", "navigation_bar.discover": "Felfedezés", "navigation_bar.domain_blocks": "Letiltott tartományok", - "navigation_bar.edit_profile": "Profil szerkesztése", "navigation_bar.explore": "Felfedezés", "navigation_bar.favourites": "Kedvencek", "navigation_bar.filters": "Némított szavak", @@ -526,14 +524,15 @@ "poll_button.add_poll": "Új szavazás", "poll_button.remove_poll": "Szavazás eltávolítása", "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 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ó", + "privacy.direct.long": "Mindenki, akit a bejegyzésben említettek", + "privacy.direct.short": "Adott személyek", + "privacy.private.long": "Csak a követők", + "privacy.private.short": "Követők", + "privacy.public.long": "Bárki a Mastodonon és azon kívül", "privacy.public.short": "Nyilvános", - "privacy.unlisted.long": "Mindenki számára látható, de kimarad a felfedezős funkciókból", - "privacy.unlisted.short": "Listázatlan", + "privacy.unlisted.additional": "Ez pontosan úgy viselkedik, mint a nyilvános, kivéve, hogy a bejegyzés nem jelenik meg élő hírcsatornákban vagy hashtagokban, felfedezésben vagy a Mastodon keresésben, még akkor sem, ha az egész fiókra bejelentkezetünk.", + "privacy.unlisted.long": "Kevesebb algoritmikus fanfár", + "privacy.unlisted.short": "Csendes nyilvánosság", "privacy_policy.last_updated": "Utoljára frissítve: {date}", "privacy_policy.title": "Adatvédelmi szabályzat", "recommended": "Ajánlott", @@ -551,7 +550,9 @@ "relative_time.minutes": "{number}p", "relative_time.seconds": "{number}mp", "relative_time.today": "ma", + "reply_indicator.attachments": "{count, plural, one {# melléklet} other {# melléklet}}", "reply_indicator.cancel": "Mégsem", + "reply_indicator.poll": "Szavazás", "report.block": "Letiltás", "report.block_explanation": "Nem fogod látni a bejegyzéseit. Nem fogja tudni megnézni a bejegyzéseidet és nem fog tudni követni sem. Azt is meg fogja tudni mondani, hogy letiltottad.", "report.categories.legal": "Jogi információk", @@ -715,10 +716,8 @@ "upload_error.poll": "Szavazásnál nem lehet fájlt feltölteni.", "upload_form.audio_description": "Leírás siket vagy hallássérült emberek számára", "upload_form.description": "Leírás vak vagy gyengénlátó emberek számára", - "upload_form.description_missing": "Nincs leírás megadva", "upload_form.edit": "Szerkesztés", "upload_form.thumbnail": "Bélyegkép megváltoztatása", - "upload_form.undo": "Törlés", "upload_form.video_description": "Leírás siket, hallássérült, vak vagy gyengénlátó emberek számára", "upload_modal.analyzing_picture": "Kép elemzése…", "upload_modal.apply": "Alkalmaz", diff --git a/app/javascript/mastodon/locales/hy.json b/app/javascript/mastodon/locales/hy.json index 835105218d..6ddcfcdb21 100644 --- a/app/javascript/mastodon/locales/hy.json +++ b/app/javascript/mastodon/locales/hy.json @@ -70,7 +70,6 @@ "alert.unexpected.title": "Վա՜յ", "announcement.announcement": "Յայտարարութիւններ", "audio.hide": "Թաքցնել աուդիոն", - "autosuggest_hashtag.per_week": "շաբաթը՝ {count}", "boost_modal.combo": "Կարող ես սեղմել {combo}՝ սա յաջորդ անգամ բաց թողնելու համար", "bundle_column_error.error.title": "Օ՜, ոչ։", "bundle_column_error.network.title": "Ցանցի սխալ", @@ -117,22 +116,12 @@ "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_single": "Հարցումը դարձնել եզակի ընտրութեամբ", - "compose_form.publish": "Հրապարակել", "compose_form.publish_form": "Հրապարակել", - "compose_form.publish_loud": "Հրապարակե՜լ", - "compose_form.save_changes": "Պահպանել փոփոխութիւնները", - "compose_form.sensitive.hide": "Նշել մեդիան որպէս դիւրազգաց", - "compose_form.sensitive.marked": "Մեդիան նշուած է որպէս դիւրազգաց", - "compose_form.sensitive.unmarked": "Մեդիան նշուած չէ որպէս դիւրազգաց", "compose_form.spoiler.marked": "Տեքստը թաքցուած է զգուշացման ետեւում", "compose_form.spoiler.unmarked": "Տեքստը թաքցուած չէ", - "compose_form.spoiler_placeholder": "Գրիր նախազգուշացումդ այստեղ", "confirmation_modal.cancel": "Չեղարկել", "confirmations.block.block_and_report": "Արգելափակել եւ բողոքել", "confirmations.block.confirm": "Արգելափակել", @@ -325,7 +314,6 @@ "navigation_bar.direct": "Մասնաւոր յիշատակումներ", "navigation_bar.discover": "Բացայայտել", "navigation_bar.domain_blocks": "Թաքցուած տիրոյթներ", - "navigation_bar.edit_profile": "Խմբագրել հաշիւը", "navigation_bar.explore": "Բացայայտել", "navigation_bar.favourites": "Հաւանածներ", "navigation_bar.filters": "Լռեցուած բառեր", @@ -414,13 +402,7 @@ "poll_button.add_poll": "Աւելացնել հարցում", "poll_button.remove_poll": "Հեռացնել հարցումը", "privacy.change": "Կարգաւորել գրառման գաղտնիութիւնը", - "privacy.direct.long": "Կը տեսնեն միայն նշուած օգտատէրերը", - "privacy.direct.short": "Direct", - "privacy.private.long": "Կը տեսնեն միայն հետեւորդները", - "privacy.private.short": "Միայն հետեւողները", - "privacy.public.long": "Տեսանելի բոլորին", "privacy.public.short": "Հրապարակային", - "privacy.unlisted.short": "Ծածուկ", "privacy_policy.last_updated": "Վերջին անգամ թարմացուել է՝ {date}", "privacy_policy.title": "Գաղտնիութեան քաղաքականութիւն", "refresh": "Թարմացնել", @@ -556,7 +538,6 @@ "upload_form.description": "Նկարագիր՝ տեսողական խնդիրներ ունեցողների համար", "upload_form.edit": "Խմբագրել", "upload_form.thumbnail": "Փոխել պատկերակը", - "upload_form.undo": "Յետարկել", "upload_form.video_description": "Նկարագրիր տեսանիւթը լսողական կամ տեսողական խնդիրներով անձանց համար", "upload_modal.analyzing_picture": "Լուսանկարի վերլուծում…", "upload_modal.apply": "Կիրառել", diff --git a/app/javascript/mastodon/locales/ia.json b/app/javascript/mastodon/locales/ia.json index a660eb77ff..14b75a17f4 100644 --- a/app/javascript/mastodon/locales/ia.json +++ b/app/javascript/mastodon/locales/ia.json @@ -56,7 +56,6 @@ "alert.unexpected.message": "Ocurreva un error inexpectate.", "announcement.announcement": "Annuncio", "audio.hide": "Celar audio", - "autosuggest_hashtag.per_week": "{count} per septimana", "bundle_column_error.network.title": "Error de rete", "bundle_column_error.retry": "Tentar novemente", "bundle_column_error.return": "Retornar al initio", @@ -90,15 +89,9 @@ "compose_form.direct_message_warning_learn_more": "Apprender plus", "compose_form.lock_disclaimer": "Tu conto non es {locked}. Quicunque pote sequer te pro vider tu messages solo pro sequitores.", "compose_form.lock_disclaimer.lock": "blocate", - "compose_form.poll.add_option": "Adder un option", - "compose_form.poll.remove_option": "Remover iste option", - "compose_form.publish": "Publicar", "compose_form.publish_form": "Nove message", - "compose_form.publish_loud": "{publish}!", - "compose_form.save_changes": "Salvar le cambiamentos", "compose_form.spoiler.marked": "Remover advertimento de contento", "compose_form.spoiler.unmarked": "Adder advertimento de contento", - "compose_form.spoiler_placeholder": "Scribe tu advertimento hic", "confirmation_modal.cancel": "Cancellar", "confirmations.block.confirm": "Blocar", "confirmations.delete.confirm": "Deler", @@ -217,7 +210,6 @@ "navigation_bar.direct": "Mentiones private", "navigation_bar.discover": "Discoperir", "navigation_bar.domain_blocks": "Dominios blocate", - "navigation_bar.edit_profile": "Modificar profilo", "navigation_bar.favourites": "Favoritos", "navigation_bar.filters": "Parolas silentiate", "navigation_bar.lists": "Listas", @@ -252,8 +244,6 @@ "poll.closed": "Claudite", "poll.reveal": "Vider le resultatos", "privacy.change": "Cambiar privacitate del message", - "privacy.private.long": "Visibile solmente pro sequitores", - "privacy.public.long": "Visibile pro totos", "privacy.public.short": "Public", "privacy_policy.last_updated": "Ultime actualisation {date}", "privacy_policy.title": "Politica de confidentialitate", @@ -307,7 +297,6 @@ "tabs_bar.notifications": "Notificationes", "timeline_hint.resources.statuses": "Messages ancian", "trends.trending_now": "Ora in tendentias", - "upload_form.undo": "Deler", "upload_modal.choose_image": "Seliger un imagine", "upload_modal.detect_text": "Deteger texto ab un pictura", "video.close": "Clauder le video", diff --git a/app/javascript/mastodon/locales/id.json b/app/javascript/mastodon/locales/id.json index 5af20a97f7..1670d616fb 100644 --- a/app/javascript/mastodon/locales/id.json +++ b/app/javascript/mastodon/locales/id.json @@ -82,7 +82,6 @@ "announcement.announcement": "Pengumuman", "attachments_list.unprocessed": "(tidak diproses)", "audio.hide": "Sembunyikan audio", - "autosuggest_hashtag.per_week": "{count} per minggu", "boost_modal.combo": "Anda dapat menekan {combo} untuk melewati ini", "bundle_column_error.copy_stacktrace": "Salin laporan kesalahan", "bundle_column_error.error.body": "Laman yang diminta tidak dapat ditampilkan. Mungkin karena sebuah kutu dalam kode kami, atau masalah kompatibilitas peramban.", @@ -134,22 +133,12 @@ "compose_form.lock_disclaimer": "Akun Anda tidak {locked}. Semua orang dapat mengikuti Anda untuk melihat kiriman khusus untuk pengikut Anda.", "compose_form.lock_disclaimer.lock": "terkunci", "compose_form.placeholder": "Apa yang ada di pikiran Anda?", - "compose_form.poll.add_option": "Tambahkan pilihan", "compose_form.poll.duration": "Durasi japat", - "compose_form.poll.option_placeholder": "Pilihan {number}", - "compose_form.poll.remove_option": "Hapus opsi ini", "compose_form.poll.switch_to_multiple": "Ubah japat menjadi pilihan ganda", "compose_form.poll.switch_to_single": "Ubah japat menjadi pilihan tunggal", - "compose_form.publish": "Terbitkan", "compose_form.publish_form": "Terbitkan", - "compose_form.publish_loud": "{publish}!", - "compose_form.save_changes": "Simpan perubahan", - "compose_form.sensitive.hide": "{count, plural, other {Tandai media sebagai sensitif}}", - "compose_form.sensitive.marked": "{count, plural, other {Media ini ditandai sebagai sensitif}}", - "compose_form.sensitive.unmarked": "{count, plural, other {Media ini tidak ditandai sebagai sensitif}}", "compose_form.spoiler.marked": "Hapus peringatan tentang isi konten", "compose_form.spoiler.unmarked": "Tambahkan peringatan tentang isi konten", - "compose_form.spoiler_placeholder": "Peringatan konten", "confirmation_modal.cancel": "Batal", "confirmations.block.block_and_report": "Blokir & Laporkan", "confirmations.block.confirm": "Blokir", @@ -364,7 +353,6 @@ "navigation_bar.compose": "Tulis toot baru", "navigation_bar.discover": "Temukan", "navigation_bar.domain_blocks": "Domain tersembunyi", - "navigation_bar.edit_profile": "Ubah profil", "navigation_bar.explore": "Jelajahi", "navigation_bar.filters": "Kata yang dibisukan", "navigation_bar.follow_requests": "Permintaan mengikuti", @@ -454,14 +442,7 @@ "poll_button.add_poll": "Tambah japat", "poll_button.remove_poll": "Hapus japat", "privacy.change": "Ubah privasi kiriman", - "privacy.direct.long": "Kirim hanya ke pengguna yang disebut", - "privacy.direct.short": "Orang yang disebutkan saja", - "privacy.private.long": "Kirim kiriman hanya kepada pengikut", - "privacy.private.short": "Pengikut saja", - "privacy.public.long": "Terlihat oleh semua", "privacy.public.short": "Publik", - "privacy.unlisted.long": "Terlihat oleh semua, tapi jangan tampilkan di fitur jelajah", - "privacy.unlisted.short": "Tak Terdaftar", "privacy_policy.last_updated": "Terakhir diperbarui {date}", "privacy_policy.title": "Kebijakan Privasi", "refresh": "Segarkan", @@ -615,10 +596,8 @@ "upload_error.poll": "Unggah berkas tak diizinkan di japat ini.", "upload_form.audio_description": "Penjelasan untuk orang dengan gangguan pendengaran", "upload_form.description": "Deskripsikan untuk mereka yang tidak bisa melihat dengan jelas", - "upload_form.description_missing": "Tidak ada deskripsi yang ditambahkan", "upload_form.edit": "Sunting", "upload_form.thumbnail": "Ubah gambar kecil", - "upload_form.undo": "Undo", "upload_form.video_description": "Penjelasan untuk orang dengan gangguan pendengaran atau penglihatan", "upload_modal.analyzing_picture": "Analisis gambar…", "upload_modal.apply": "Terapkan", diff --git a/app/javascript/mastodon/locales/ie.json b/app/javascript/mastodon/locales/ie.json index 8579fc89c6..5188d137e3 100644 --- a/app/javascript/mastodon/locales/ie.json +++ b/app/javascript/mastodon/locales/ie.json @@ -89,7 +89,6 @@ "announcement.announcement": "Proclamation", "attachments_list.unprocessed": "(íntractat)", "audio.hide": "Celar audio", - "autosuggest_hashtag.per_week": "{count} per semane", "boost_modal.combo": "Li proxim vez tu posse pressar {combo} por passar to-ci", "bundle_column_error.copy_stacktrace": "Copiar erra-raporte", "bundle_column_error.error.body": "Li demandat págine ne posset esser rendit. Fórsan it es un problema in nor code, o un problema de compatibilitá con li navigator.", @@ -146,22 +145,21 @@ "compose_form.lock_disclaimer": "Tui conto ne es {locked}. Quicunc posse sequer te por vider tui postas solmen por sequitores.", "compose_form.lock_disclaimer.lock": "cludet", "compose_form.placeholder": "Quo es in tui spiritu?", - "compose_form.poll.add_option": "Adjunter un option", + "compose_form.poll.add_option": "Adjunter option", "compose_form.poll.duration": "Duration del balotation", + "compose_form.poll.multiple": "Selection multiplic", "compose_form.poll.option_placeholder": "Option {number}", "compose_form.poll.remove_option": "Remover ti-ci option", + "compose_form.poll.single": "Selecter un", "compose_form.poll.switch_to_multiple": "Changea li balotation por permisser multiplic selectiones", "compose_form.poll.switch_to_single": "Changea li balotation por permisser un singul selection", - "compose_form.publish": "Publicar", + "compose_form.poll.type": "Stil", + "compose_form.publish": "Postar", "compose_form.publish_form": "Nov posta", - "compose_form.publish_loud": "{publish}!", - "compose_form.save_changes": "Conservar changes", - "compose_form.sensitive.hide": "{count, plural, one {Marcar medie quam sensitiv} other {Marcar medie quam sensitiv}}", - "compose_form.sensitive.marked": "{count, plural, one {Medie es marcat quam sensitiv} other {Medie es marcat quam sensitiv}}", - "compose_form.sensitive.unmarked": "{count, plural, one {Medie ne es marcat quam sensitiv} other {Medie ne es marcat quam sensitiv}}", + "compose_form.reply": "Responder", + "compose_form.save_changes": "Actualisar", "compose_form.spoiler.marked": "Remover avise pri li contenete", "compose_form.spoiler.unmarked": "Adjunter avise pri li contenete", - "compose_form.spoiler_placeholder": "Scri tui avise ci", "confirmation_modal.cancel": "Anullar", "confirmations.block.block_and_report": "Bloccar & Raportar", "confirmations.block.confirm": "Bloccar", @@ -408,7 +406,6 @@ "navigation_bar.direct": "Privat mentiones", "navigation_bar.discover": "Decovrir", "navigation_bar.domain_blocks": "Bloccat dominias", - "navigation_bar.edit_profile": "Redacter profil", "navigation_bar.explore": "Explorar", "navigation_bar.favourites": "Favorites", "navigation_bar.filters": "Silentiat paroles", @@ -526,14 +523,11 @@ "poll_button.add_poll": "Adjunter un balotation", "poll_button.remove_poll": "Remover balotation", "privacy.change": "Changear li privatie del posta", - "privacy.direct.long": "Visibil solmen a mentionat usatores", - "privacy.direct.short": "Solmen persones mentionat", - "privacy.private.long": "Visibil solmen por sequitores", - "privacy.private.short": "Solmen sequitores", - "privacy.public.long": "Visibil a omnes", + "privacy.direct.short": "Specific persones", + "privacy.private.long": "Solmen tui sequitores", + "privacy.private.short": "Sequitores", + "privacy.public.long": "Quicunc in e ex Mastodon", "privacy.public.short": "Public", - "privacy.unlisted.long": "Visibil por omnes, ma excludet de functiones de decovrition", - "privacy.unlisted.short": "Delistat", "privacy_policy.last_updated": "Ultimmen actualisat ye {date}", "privacy_policy.title": "Politica pri Privatie", "recommended": "Recomandat", @@ -715,10 +709,8 @@ "upload_error.poll": "On ne es permisset cargar medie con balotationes.", "upload_form.audio_description": "Descrir por persones qui es surd o ne audi bon", "upload_form.description": "Descrir por persones qui es ciec o have mal vision", - "upload_form.description_missing": "Null descrition adjuntet", "upload_form.edit": "Redacter", "upload_form.thumbnail": "Changear previsual image", - "upload_form.undo": "Deleter", "upload_form.video_description": "Descrir por persones qui es surd, ciec, ne audi bon, o have mal vision", "upload_modal.analyzing_picture": "Analisant image…", "upload_modal.apply": "Aplicar", diff --git a/app/javascript/mastodon/locales/ig.json b/app/javascript/mastodon/locales/ig.json index f163567f17..a4f7268422 100644 --- a/app/javascript/mastodon/locales/ig.json +++ b/app/javascript/mastodon/locales/ig.json @@ -107,8 +107,6 @@ "onboarding.steps.share_profile.body": "Let your friends know how to find you on Mastodon!", "onboarding.steps.share_profile.title": "Share your profile", "privacy.change": "Adjust status privacy", - "privacy.direct.short": "Direct", - "privacy.private.short": "Followers-only", "relative_time.full.just_now": "kịta", "relative_time.just_now": "kịta", "relative_time.today": "taa", @@ -142,7 +140,6 @@ "trends.trending_now": "Na-ewu ewu kịta", "upload_form.audio_description": "Describe for people with hearing loss", "upload_form.description": "Describe for the visually impaired", - "upload_form.undo": "Hichapụ", "upload_form.video_description": "Describe for people with hearing loss or visual impairment", "upload_modal.choose_image": "Họrọ onyonyo", "upload_progress.label": "Uploading…" diff --git a/app/javascript/mastodon/locales/io.json b/app/javascript/mastodon/locales/io.json index 233b768457..a9dd32c06c 100644 --- a/app/javascript/mastodon/locales/io.json +++ b/app/javascript/mastodon/locales/io.json @@ -86,7 +86,6 @@ "announcement.announcement": "Anunco", "attachments_list.unprocessed": "(neprocedita)", "audio.hide": "Celez audio", - "autosuggest_hashtag.per_week": "{count} dum singla semano", "boost_modal.combo": "Vu povas pulsar {combo} por omisar co venontafoye", "bundle_column_error.copy_stacktrace": "Kopierorraporto", "bundle_column_error.error.body": "La demandita pagino ne povas strukturigesar. Forsan ol esas eroro en kodexo hike o vidilkoncilieblesproblemo.", @@ -143,22 +142,12 @@ "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": "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": "Publikigez", "compose_form.publish_form": "Publish", - "compose_form.publish_loud": "{publish}!", - "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": "Anulez", "confirmations.block.block_and_report": "Restriktez e Raportizez", "confirmations.block.confirm": "Restriktez", @@ -405,7 +394,6 @@ "navigation_bar.direct": "Privata mencioni", "navigation_bar.discover": "Deskovrez", "navigation_bar.domain_blocks": "Hidden domains", - "navigation_bar.edit_profile": "Modifikar profilo", "navigation_bar.explore": "Explorez", "navigation_bar.favourites": "Favoriziti", "navigation_bar.filters": "Silencigita vorti", @@ -519,14 +507,7 @@ "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": "Mencionita personi nur", - "privacy.private.long": "Sendar nur a sequanti", - "privacy.private.short": "Sequanti nur", - "privacy.public.long": "Videbla da omnu", "privacy.public.short": "Publike", - "privacy.unlisted.long": "Videbla da omnu ma voluntala ne inkluzas deskovrotraiti", - "privacy.unlisted.short": "Ne enlistigota", "privacy_policy.last_updated": "Antea novajo ye {date}", "privacy_policy.title": "Privatesguidilo", "recommended": "Rekomendata", @@ -708,10 +689,8 @@ "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": "Deskriptez por personi kun audnekapableso o vidnekapableso", "upload_modal.analyzing_picture": "Analizas imajo…", "upload_modal.apply": "Aplikez", diff --git a/app/javascript/mastodon/locales/is.json b/app/javascript/mastodon/locales/is.json index fb839503e9..dfece102bb 100644 --- a/app/javascript/mastodon/locales/is.json +++ b/app/javascript/mastodon/locales/is.json @@ -89,7 +89,6 @@ "announcement.announcement": "Auglýsing", "attachments_list.unprocessed": "(óunnið)", "audio.hide": "Fela hljóð", - "autosuggest_hashtag.per_week": "{count} á viku", "boost_modal.combo": "Þú getur ýtt á {combo} til að sleppa þessu næst", "bundle_column_error.copy_stacktrace": "Afrita villuskýrslu", "bundle_column_error.error.body": "Umbeðna síðau var ekki hægt að myndgera. Það gæti verið vegna villu í kóðanum okkar eða vandamáls með samhæfni vafra.", @@ -148,20 +147,20 @@ "compose_form.placeholder": "Hvað liggur þér á hjarta?", "compose_form.poll.add_option": "Bæta við valkosti", "compose_form.poll.duration": "Tímalengd könnunar", + "compose_form.poll.multiple": "Margir valkostir", "compose_form.poll.option_placeholder": "Valkostur {number}", "compose_form.poll.remove_option": "Fjarlægja þennan valkost", + "compose_form.poll.single": "Veldu eitt", "compose_form.poll.switch_to_multiple": "Breyta könnun svo hægt sé að hafa marga valkosti", "compose_form.poll.switch_to_single": "Breyta könnun svo hægt sé að hafa einn stakan valkost", + "compose_form.poll.type": "Stíll", "compose_form.publish": "Birta", "compose_form.publish_form": "Birta", - "compose_form.publish_loud": "{publish}!", - "compose_form.save_changes": "Vista breytingar", - "compose_form.sensitive.hide": "{count, plural, one {Merkja mynd sem viðkvæma} other {Merkja myndir sem viðkvæmar}}", - "compose_form.sensitive.marked": "{count, plural, one {Mynd er merkt sem viðkvæm} other {Myndir eru merktar sem viðkvæmar}}", - "compose_form.sensitive.unmarked": "{count, plural, one {Mynd er ekki merkt sem viðkvæm} other {Myndir eru ekki merktar sem viðkvæmar}}", + "compose_form.reply": "Svara", + "compose_form.save_changes": "Uppfæra", "compose_form.spoiler.marked": "Fjarlægja aðvörun vegna efnis", "compose_form.spoiler.unmarked": "Bæta við aðvörun vegna efnis", - "compose_form.spoiler_placeholder": "Skrifaðu aðvörunina þína hér", + "compose_form.spoiler_placeholder": "Aðvörun vegna efnis (valkvætt)", "confirmation_modal.cancel": "Hætta við", "confirmations.block.block_and_report": "Útiloka og kæra", "confirmations.block.confirm": "Útiloka", @@ -408,7 +407,6 @@ "navigation_bar.direct": "Einkaspjall", "navigation_bar.discover": "Uppgötva", "navigation_bar.domain_blocks": "Útilokuð lén", - "navigation_bar.edit_profile": "Breyta notandasniði", "navigation_bar.explore": "Kanna", "navigation_bar.favourites": "Eftirlæti", "navigation_bar.filters": "Þögguð orð", @@ -526,14 +524,15 @@ "poll_button.add_poll": "Bæta við könnun", "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 minnst er á", - "privacy.private.long": "Senda einungis á fylgjendur", - "privacy.private.short": "Einungis fylgjendur", - "privacy.public.long": "Sýnilegt fyrir alla", + "privacy.direct.long": "Allir sem minnst er á í færslunni", + "privacy.direct.short": "Tilteknir aðilar", + "privacy.private.long": "Einungis þeir sem fylgjast með þér", + "privacy.private.short": "Fylgjendur", + "privacy.public.long": "Hver sem er, á og utan Mastodon", "privacy.public.short": "Opinbert", - "privacy.unlisted.long": "Sýnilegt öllum, en ekki tekið með í uppgötvunareiginleikum", - "privacy.unlisted.short": "Óskráð", + "privacy.unlisted.additional": "Þetta hegðar sér eins og opinber færsla, fyrir utan að færslan birtist ekki í beinum streymum eða myllumerkjum, né heldur í Mastodon-leitum jafnvel þótt þú hafir valið að falla undir slíkt í notandasniðinu þínu.", + "privacy.unlisted.long": "Minni stælar í reikniritum", + "privacy.unlisted.short": "Hljóðlátt opinbert", "privacy_policy.last_updated": "Síðast uppfært {date}", "privacy_policy.title": "Persónuverndarstefna", "recommended": "Mælt með", @@ -551,7 +550,9 @@ "relative_time.minutes": "{number}mín", "relative_time.seconds": "{number}sek", "relative_time.today": "í dag", + "reply_indicator.attachments": "{count, plural, one {# viðhengi} other {# viðhengi}}", "reply_indicator.cancel": "Hætta við", + "reply_indicator.poll": "Könnun", "report.block": "Útiloka", "report.block_explanation": "Þú munt ekki sjá færslurnar þeirra. Þeir munu ekki geta séð færslurnar þínar eða fylgst með þér. Þeir munu ekki geta séð að lokað sé á þá.", "report.categories.legal": "Lagalegt", @@ -715,10 +716,8 @@ "upload_error.poll": "Innsending skráa er ekki leyfð í könnunum.", "upload_form.audio_description": "Lýstu þessu fyrir heyrnarskerta", "upload_form.description": "Lýstu þessu fyrir sjónskerta", - "upload_form.description_missing": "Engri lýsingu bætt við", "upload_form.edit": "Breyta", "upload_form.thumbnail": "Skipta um smámynd", - "upload_form.undo": "Eyða", "upload_form.video_description": "Lýstu þessu fyrir fólk sem heyrir illa eða er með skerta sjón", "upload_modal.analyzing_picture": "Greini mynd…", "upload_modal.apply": "Virkja", diff --git a/app/javascript/mastodon/locales/it.json b/app/javascript/mastodon/locales/it.json index 4fb4d88cbc..920b80d5a6 100644 --- a/app/javascript/mastodon/locales/it.json +++ b/app/javascript/mastodon/locales/it.json @@ -89,7 +89,6 @@ "announcement.announcement": "Annuncio", "attachments_list.unprocessed": "(non elaborato)", "audio.hide": "Nascondi audio", - "autosuggest_hashtag.per_week": "{count} a settimana", "boost_modal.combo": "Puoi premere {combo} per saltare questo passaggio, la prossima volta", "bundle_column_error.copy_stacktrace": "Copia rapporto sull'errore", "bundle_column_error.error.body": "Impossibile rendedrizzare la pagina richiesta. Potrebbe dipendere da un bug nel nostro codice o da un problema di compatibilità di un browser.", @@ -146,22 +145,22 @@ "compose_form.lock_disclaimer": "Il tuo profilo non è {locked}. Chiunque può seguirti per visualizzare i tuoi post per soli seguaci.", "compose_form.lock_disclaimer.lock": "bloccato", "compose_form.placeholder": "Cos'hai in mente?", - "compose_form.poll.add_option": "Aggiungi una scelta", + "compose_form.poll.add_option": "Aggiungi opzione", "compose_form.poll.duration": "Durata del sondaggio", - "compose_form.poll.option_placeholder": "Scelta {number}", - "compose_form.poll.remove_option": "Rimuovi questa scelta", + "compose_form.poll.multiple": "Scelta multipla", + "compose_form.poll.option_placeholder": "Opzione {number}", + "compose_form.poll.remove_option": "Rimuovi questa opzione", + "compose_form.poll.single": "Scegli uno", "compose_form.poll.switch_to_multiple": "Modifica il sondaggio per consentire scelte multiple", "compose_form.poll.switch_to_single": "Modifica il sondaggio per consentire una singola scelta", + "compose_form.poll.type": "Stile", "compose_form.publish": "Pubblica", "compose_form.publish_form": "Nuovo post", - "compose_form.publish_loud": "{publish}!", - "compose_form.save_changes": "Salva le modifiche", - "compose_form.sensitive.hide": "{count, plural, one {Segna media come sensibile} other {Segna media come sensibili}}", - "compose_form.sensitive.marked": "{count, plural, one {Il media è contrassegnato come sensibile} other {I media sono contrassegnati come sensibili}}", - "compose_form.sensitive.unmarked": "{count, plural, one {Il media non è contrassegnato come sensibile} other {I media non sono contrassegnati come sensibili}}", + "compose_form.reply": "Rispondi", + "compose_form.save_changes": "Aggiorna", "compose_form.spoiler.marked": "Rimuovi l'avviso del contenuto", "compose_form.spoiler.unmarked": "Aggiungi l'avviso del contenuto", - "compose_form.spoiler_placeholder": "Scrivi qui il tuo avviso", + "compose_form.spoiler_placeholder": "Contenuto sensibile (facoltativo)", "confirmation_modal.cancel": "Annulla", "confirmations.block.block_and_report": "Blocca & Segnala", "confirmations.block.confirm": "Blocca", @@ -408,7 +407,6 @@ "navigation_bar.direct": "Menzioni private", "navigation_bar.discover": "Scopri", "navigation_bar.domain_blocks": "Domini bloccati", - "navigation_bar.edit_profile": "Modifica il profilo", "navigation_bar.explore": "Esplora", "navigation_bar.favourites": "Preferiti", "navigation_bar.filters": "Parole silenziate", @@ -526,14 +524,15 @@ "poll_button.add_poll": "Aggiungi un sondaggio", "poll_button.remove_poll": "Rimuovi il sondaggio", "privacy.change": "Modifica privacy del post", - "privacy.direct.long": "Visibile solo per gli utenti menzionati", - "privacy.direct.short": "Solo persone menzionate", - "privacy.private.long": "Visibile solo ai seguaci", - "privacy.private.short": "Solo seguaci", - "privacy.public.long": "Visibile a tutti", + "privacy.direct.long": "Tutti quelli menzioniati nel post", + "privacy.direct.short": "Persone specifiche", + "privacy.private.long": "Solo i tuoi follower", + "privacy.private.short": "Follower", + "privacy.public.long": "Chiunque dentro e fuori Mastodon", "privacy.public.short": "Pubblico", - "privacy.unlisted.long": "Visibile a tutti, ma escluso dalle funzioni di scoperta", - "privacy.unlisted.short": "Non elencato", + "privacy.unlisted.additional": "Si comporta esattamente come pubblico, tranne per il fatto che il post non verrà visualizzato nei feed live o negli hashtag, nell'esplorazione o nella ricerca Mastodon, anche se hai attivato l'attivazione a livello di account.", + "privacy.unlisted.long": "Meno fanfare algoritmiche", + "privacy.unlisted.short": "Pubblico silenzioso", "privacy_policy.last_updated": "Ultimo aggiornamento {date}", "privacy_policy.title": "Politica sulla Privacy", "recommended": "Consigliato", @@ -551,7 +550,9 @@ "relative_time.minutes": "{number}m", "relative_time.seconds": "{number}s", "relative_time.today": "oggi", + "reply_indicator.attachments": "{count, plural, one {# allegato} other {# allegati}}", "reply_indicator.cancel": "Annulla", + "reply_indicator.poll": "Sondaggio", "report.block": "Blocca", "report.block_explanation": "Non visualizzerai i suoi post. Non potrà vedere i tuoi post o seguirti. Potrà sapere di esser stato bloccato.", "report.categories.legal": "Informazioni legali", @@ -715,10 +716,8 @@ "upload_error.poll": "Caricamento del file non consentito con i sondaggi.", "upload_form.audio_description": "Descrizione per persone con deficit uditivi", "upload_form.description": "Descrizione per ipovedenti", - "upload_form.description_missing": "Nessuna descrizione aggiunta", "upload_form.edit": "Modifica", "upload_form.thumbnail": "Cambia la miniatura", - "upload_form.undo": "Elimina", "upload_form.video_description": "Descrizione per persone con deficit uditivi o ipovedenti", "upload_modal.analyzing_picture": "Analizzando l'immagine…", "upload_modal.apply": "Applica", diff --git a/app/javascript/mastodon/locales/ja.json b/app/javascript/mastodon/locales/ja.json index e7aafe852a..e0cc96d571 100644 --- a/app/javascript/mastodon/locales/ja.json +++ b/app/javascript/mastodon/locales/ja.json @@ -89,7 +89,6 @@ "announcement.announcement": "お知らせ", "attachments_list.unprocessed": "(未処理)", "audio.hide": "音声を閉じる", - "autosuggest_hashtag.per_week": "{count} 回 / 週", "boost_modal.combo": "次からは{combo}を押せばスキップできます", "bundle_column_error.copy_stacktrace": "エラーレポートをコピー", "bundle_column_error.error.body": "要求されたページをレンダリングできませんでした。コードのバグ、またはブラウザの互換性の問題が原因である可能性があります。", @@ -146,22 +145,12 @@ "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_single": "単一選択に変更", - "compose_form.publish": "投稿", "compose_form.publish_form": "投稿", - "compose_form.publish_loud": "{publish}!", - "compose_form.save_changes": "変更を保存", - "compose_form.sensitive.hide": "メディアを閲覧注意にする", - "compose_form.sensitive.marked": "メディアに閲覧注意が設定されています", - "compose_form.sensitive.unmarked": "メディアに閲覧注意が設定されていません", "compose_form.spoiler.marked": "本文は警告の後ろに隠されます", "compose_form.spoiler.unmarked": "本文は隠されていません", - "compose_form.spoiler_placeholder": "ここに警告を書いてください", "confirmation_modal.cancel": "キャンセル", "confirmations.block.block_and_report": "ブロックし通報", "confirmations.block.confirm": "ブロック", @@ -408,7 +397,6 @@ "navigation_bar.direct": "非公開の返信", "navigation_bar.discover": "見つける", "navigation_bar.domain_blocks": "ブロックしたドメイン", - "navigation_bar.edit_profile": "プロフィールを編集", "navigation_bar.explore": "探索する", "navigation_bar.favourites": "お気に入り", "navigation_bar.filters": "フィルター設定", @@ -526,14 +514,7 @@ "poll_button.add_poll": "アンケートを追加", "poll_button.remove_poll": "アンケートを削除", "privacy.change": "公開範囲を変更", - "privacy.direct.long": "指定された相手のみ閲覧可", - "privacy.direct.short": "指定された相手のみ", - "privacy.private.long": "フォロワーのみ閲覧可", - "privacy.private.short": "フォロワーのみ", - "privacy.public.long": "誰でも閲覧可", "privacy.public.short": "公開", - "privacy.unlisted.long": "誰でも閲覧可、サイレント", - "privacy.unlisted.short": "非収載", "privacy_policy.last_updated": "{date}に更新", "privacy_policy.title": "プライバシーポリシー", "recommended": "おすすめ", @@ -715,10 +696,8 @@ "upload_error.poll": "アンケートではファイルをアップロードできません。", "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_modal.analyzing_picture": "画像を解析中…", "upload_modal.apply": "適用", diff --git a/app/javascript/mastodon/locales/ka.json b/app/javascript/mastodon/locales/ka.json index 9d977e9331..8628cb38a2 100644 --- a/app/javascript/mastodon/locales/ka.json +++ b/app/javascript/mastodon/locales/ka.json @@ -36,7 +36,6 @@ "admin.dashboard.retention.cohort_size": "ახალი მომხმარებელი", "alert.unexpected.message": "წარმოიშვა მოულოდნელი შეცდომა.", "alert.unexpected.title": "უპს!", - "autosuggest_hashtag.per_week": "კვირაში {count}", "boost_modal.combo": "შეგიძლიათ დააჭიროთ {combo}-ს რათა შემდეგ ჯერზე გამოტოვოთ ეს", "bundle_column_error.retry": "სცადეთ კიდევ ერთხელ", "bundle_modal_error.close": "დახურვა", @@ -68,11 +67,8 @@ "compose_form.lock_disclaimer.lock": "ჩაკეტილი", "compose_form.placeholder": "რაზე ფიქრობ?", "compose_form.publish_form": "Publish", - "compose_form.sensitive.marked": "მედია მონიშნულია მგრძნობიარედ", - "compose_form.sensitive.unmarked": "მედია არაა მონიშნული მგრძნობიარედ", "compose_form.spoiler.marked": "გაფრთხილების უკან ტექსტი დამალულია", "compose_form.spoiler.unmarked": "ტექსტი არაა დამალული", - "compose_form.spoiler_placeholder": "თქვენი გაფრთხილება დაწერეთ აქ", "confirmation_modal.cancel": "უარყოფა", "confirmations.block.confirm": "ბლოკი", "confirmations.block.message": "დარწმუნებული ხართ, გსურთ დაბლოკოთ {name}?", @@ -171,7 +167,6 @@ "navigation_bar.compose": "Compose new toot", "navigation_bar.discover": "აღმოაჩინე", "navigation_bar.domain_blocks": "დამალული დომენები", - "navigation_bar.edit_profile": "შეცვალე პროფილი", "navigation_bar.filters": "გაჩუმებული სიტყვები", "navigation_bar.follow_requests": "დადევნების მოთხოვნები", "navigation_bar.lists": "სიები", @@ -211,12 +206,7 @@ "onboarding.steps.share_profile.body": "Let your friends know how to find you on Mastodon!", "onboarding.steps.share_profile.title": "Share your profile", "privacy.change": "სტატუსის კონფიდენციალურობის მითითება", - "privacy.direct.long": "დაიპოსტოს მხოლოდ დასახელებულ მომხმარებლებთან", - "privacy.direct.short": "Direct", - "privacy.private.long": "დაიპოსტოს მხოლოდ მიმდევრებთან", - "privacy.private.short": "Followers-only", "privacy.public.short": "საჯარო", - "privacy.unlisted.short": "ჩამოუთვლელი", "regeneration_indicator.label": "იტვირთება…", "regeneration_indicator.sublabel": "თქვენი სახლის ლენტა მზადდება!", "relative_time.days": "{number}დღ", @@ -279,7 +269,6 @@ "upload_button.label": "მედიის დამატება", "upload_form.audio_description": "Describe for people with hearing loss", "upload_form.description": "აღწერილობა ვიზუალურად უფასურისთვის", - "upload_form.undo": "გაუქმება", "upload_form.video_description": "Describe for people with hearing loss or visual impairment", "upload_progress.label": "იტვირთება...", "video.close": "ვიდეოს დახურვა", diff --git a/app/javascript/mastodon/locales/kab.json b/app/javascript/mastodon/locales/kab.json index 08c70a9405..d9388c7048 100644 --- a/app/javascript/mastodon/locales/kab.json +++ b/app/javascript/mastodon/locales/kab.json @@ -53,7 +53,6 @@ "alert.unexpected.title": "Ayhuh!", "announcement.announcement": "Ulɣu", "audio.hide": "Ffer amesli", - "autosuggest_hashtag.per_week": "{count} i yimalas", "boost_modal.combo": "Tzemreḍ ad tetekkiḍ ɣef {combo} akken ad tessurfeḍ aya tikelt-nniḍen", "bundle_column_error.copy_stacktrace": "Nɣel tuccḍa n uneqqis", "bundle_column_error.error.title": "Uh, ala !", @@ -99,20 +98,10 @@ "compose_form.lock_disclaimer": "Amiḍan-ik·im ur yelli ara {locked}. Menwala yezmer ad k·kem-yeḍfeṛ akken ad iẓer acu tbeṭṭuḍ akked yimeḍfaṛen-ik·im.", "compose_form.lock_disclaimer.lock": "yettwacekkel", "compose_form.placeholder": "D acu i itezzin deg wallaɣ?", - "compose_form.poll.add_option": "Rnu afran", "compose_form.poll.duration": "Tanzagt n tefrant", - "compose_form.poll.option_placeholder": "Afran {number}", - "compose_form.poll.remove_option": "Sfeḍ afran-agi", - "compose_form.publish": "Suffeɣ", "compose_form.publish_form": "Suffeɣ", - "compose_form.publish_loud": "{publish}!", - "compose_form.save_changes": "Sekles ibeddilen", - "compose_form.sensitive.hide": "Creḍ allal n teywalt d anafri", - "compose_form.sensitive.marked": "Allal n teywalt yettwacreḍ d anafri", - "compose_form.sensitive.unmarked": "{count, plural, one {Amidya ur yettwacreḍ ara d anafri} other {Imidyaten ur ttwacreḍen ara d inafriyen}}", "compose_form.spoiler.marked": "Kkes aḍris yettwaffren deffir n walɣu", "compose_form.spoiler.unmarked": "Rnu aḍris yettwaffren deffir n walɣu", - "compose_form.spoiler_placeholder": "Aru alɣu-inek·inem da", "confirmation_modal.cancel": "Sefsex", "confirmations.block.block_and_report": "Sewḥel & sewɛed", "confirmations.block.confirm": "Sewḥel", @@ -284,7 +273,6 @@ "navigation_bar.compose": "Aru tajewwiqt tamaynut", "navigation_bar.discover": "Ẓer", "navigation_bar.domain_blocks": "Tiɣula yeffren", - "navigation_bar.edit_profile": "Ẓreg amaɣnu", "navigation_bar.explore": "Snirem", "navigation_bar.favourites": "Imenyafen", "navigation_bar.filters": "Awalen i yettwasgugmen", @@ -359,12 +347,7 @@ "poll_button.add_poll": "Rnu asenqed", "poll_button.remove_poll": "Kkes asenqed", "privacy.change": "Seggem tabaḍnit n yizen", - "privacy.direct.long": "Bḍu gar yimseqdacen i tbedreḍ kan", - "privacy.direct.short": "Direct", - "privacy.private.long": "Bḍu i yimeḍfaṛen-ik kan", - "privacy.private.short": "Imeḍfaṛen kan", "privacy.public.short": "Azayez", - "privacy.unlisted.short": "War tabdert", "privacy_policy.title": "Tasertit tabaḍnit", "refresh": "Smiren", "regeneration_indicator.label": "Yessalay-d…", @@ -472,7 +455,6 @@ "upload_form.description": "Glem-d i yemdaneni yesɛan ugur deg yiẓri", "upload_form.edit": "Ẓreg", "upload_form.thumbnail": "Beddel tugna", - "upload_form.undo": "Kkes", "upload_form.video_description": "Glem-d i yemdanen i yesɛan ugur deg tmesliwt neɣ deg yiẓri", "upload_modal.analyzing_picture": "Tasleḍt n tugna tetteddu…", "upload_modal.apply": "Snes", diff --git a/app/javascript/mastodon/locales/kk.json b/app/javascript/mastodon/locales/kk.json index 97b1991803..1f6cc78a57 100644 --- a/app/javascript/mastodon/locales/kk.json +++ b/app/javascript/mastodon/locales/kk.json @@ -64,7 +64,6 @@ "alert.unexpected.message": "Бір нәрсе дұрыс болмады.", "alert.unexpected.title": "Өй!", "announcement.announcement": "Хабарландыру", - "autosuggest_hashtag.per_week": "{count} аптасына", "boost_modal.combo": "Келесіде өткізіп жіберу үшін басыңыз {combo}", "bundle_column_error.retry": "Қайтадан көріңіз", "bundle_modal_error.close": "Жабу", @@ -99,19 +98,12 @@ "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_single": "Тек бір жауап таңдайтындай қылу", "compose_form.publish_form": "Publish", - "compose_form.sensitive.hide": "Сезімтал ретінде белгіле", - "compose_form.sensitive.marked": "Медиа нәзік деп белгіленген", - "compose_form.sensitive.unmarked": "Медиа нәзік деп белгіленбеген", "compose_form.spoiler.marked": "Мәтін ескертумен жасырылған", "compose_form.spoiler.unmarked": "Мәтін жасырылмаған", - "compose_form.spoiler_placeholder": "Ескертуіңізді осында жазыңыз", "confirmation_modal.cancel": "Қайтып алу", "confirmations.block.block_and_report": "Блок және Шағым", "confirmations.block.confirm": "Бұғаттау", @@ -250,7 +242,6 @@ "navigation_bar.compose": "Жаңа жазба бастау", "navigation_bar.discover": "шарлау", "navigation_bar.domain_blocks": "Жабық домендер", - "navigation_bar.edit_profile": "Профиль түзету", "navigation_bar.filters": "Үнсіз сөздер", "navigation_bar.follow_requests": "Жазылуға сұранғандар", "navigation_bar.follows_and_followers": "Жазылымдар және оқырмандар", @@ -311,12 +302,7 @@ "poll_button.add_poll": "Сауалнама қосу", "poll_button.remove_poll": "Сауалнаманы өшіру", "privacy.change": "Құпиялылықты реттеу", - "privacy.direct.long": "Аталған адамдарға ғана көрінетін жазба", - "privacy.direct.short": "Direct", - "privacy.private.long": "Тек оқырмандарға арналған жазба", - "privacy.private.short": "Followers-only", "privacy.public.short": "Ашық", - "privacy.unlisted.short": "Тізімсіз", "refresh": "Жаңарту", "regeneration_indicator.label": "Жүктеу…", "regeneration_indicator.sublabel": "Жергілікті желі құрылуда!", @@ -399,7 +385,6 @@ "upload_form.description": "Көру қабілеті нашар адамдар үшін сипаттаңыз", "upload_form.edit": "Түзету", "upload_form.thumbnail": "Суретті өзгерту", - "upload_form.undo": "Өшіру", "upload_form.video_description": "Есту немесе көру қабілеті нашар адамдарға сипаттама беріңіз", "upload_modal.analyzing_picture": "Суретті анализ жасау…", "upload_modal.apply": "Қолдану", diff --git a/app/javascript/mastodon/locales/kn.json b/app/javascript/mastodon/locales/kn.json index 473690070f..396aebbdf2 100644 --- a/app/javascript/mastodon/locales/kn.json +++ b/app/javascript/mastodon/locales/kn.json @@ -91,10 +91,6 @@ "onboarding.steps.share_profile.body": "Let your friends know how to find you on Mastodon!", "onboarding.steps.share_profile.title": "Share your profile", "privacy.change": "Adjust status privacy", - "privacy.direct.long": "Post to mentioned users only", - "privacy.direct.short": "Direct", - "privacy.private.long": "Post to followers only", - "privacy.private.short": "Followers-only", "report.placeholder": "Type or paste additional comments", "report.submit": "Submit report", "report.target": "Report {target}", diff --git a/app/javascript/mastodon/locales/ko.json b/app/javascript/mastodon/locales/ko.json index 70ce6611d6..eae7f8faea 100644 --- a/app/javascript/mastodon/locales/ko.json +++ b/app/javascript/mastodon/locales/ko.json @@ -68,7 +68,7 @@ "account.unblock_domain": "도메인 {domain} 차단 해제", "account.unblock_short": "차단 해제", "account.unendorse": "프로필에 추천하지 않기", - "account.unfollow": "팔로우 해제", + "account.unfollow": "언팔로우", "account.unmute": "@{name} 뮤트 해제", "account.unmute_notifications_short": "알림 뮤트 해제", "account.unmute_short": "뮤트 해제", @@ -89,7 +89,6 @@ "announcement.announcement": "공지사항", "attachments_list.unprocessed": "(처리 안 됨)", "audio.hide": "소리 숨기기", - "autosuggest_hashtag.per_week": "주간 {count}회", "boost_modal.combo": "다음엔 {combo}를 눌러서 이 과정을 건너뛸 수 있습니다", "bundle_column_error.copy_stacktrace": "에러 리포트 복사하기", "bundle_column_error.error.body": "요청한 페이지를 렌더링 할 수 없습니다. 저희의 코드에 버그가 있거나, 브라우저 호환성 문제일 수 있습니다.", @@ -148,20 +147,20 @@ "compose_form.placeholder": "지금 무슨 생각을 하고 있나요?", "compose_form.poll.add_option": "항목 추가", "compose_form.poll.duration": "투표 기간", - "compose_form.poll.option_placeholder": "{number}번 항목", + "compose_form.poll.multiple": "다중 선택", + "compose_form.poll.option_placeholder": "{option}번째 항목", "compose_form.poll.remove_option": "이 항목 삭제", + "compose_form.poll.single": "단일 선택", "compose_form.poll.switch_to_multiple": "다중 선택이 가능한 투표로 변경", "compose_form.poll.switch_to_single": "단일 선택 투표로 변경", + "compose_form.poll.type": "형식", "compose_form.publish": "게시", "compose_form.publish_form": "새 게시물", - "compose_form.publish_loud": "{publish}!", - "compose_form.save_changes": "변경사항 저장", - "compose_form.sensitive.hide": "미디어를 민감함으로 설정하기", - "compose_form.sensitive.marked": "미디어가 열람주의로 설정되어 있습니다", - "compose_form.sensitive.unmarked": "미디어가 열람주의로 설정 되어 있지 않습니다", + "compose_form.reply": "답장", + "compose_form.save_changes": "수정", "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": "차단", @@ -408,7 +407,6 @@ "navigation_bar.direct": "개인적인 멘션", "navigation_bar.discover": "발견하기", "navigation_bar.domain_blocks": "차단한 도메인", - "navigation_bar.edit_profile": "프로필 수정", "navigation_bar.explore": "둘러보기", "navigation_bar.favourites": "좋아요", "navigation_bar.filters": "뮤트한 단어", @@ -526,14 +524,15 @@ "poll_button.add_poll": "설문 추가", "poll_button.remove_poll": "설문 제거", "privacy.change": "게시물의 프라이버시 설정을 변경", - "privacy.direct.long": "언급된 사용자만 볼 수 있음", - "privacy.direct.short": "멘션한 사람들만", - "privacy.private.long": "팔로워에게만 공개", - "privacy.private.short": "팔로워 전용", - "privacy.public.long": "모두가 볼 수 있음", + "privacy.direct.long": "이 게시물에서 언급된 모두", + "privacy.direct.short": "특정 인물", + "privacy.private.long": "내 팔로워들에게만", + "privacy.private.short": "팔로워", + "privacy.public.long": "마스토돈 내외 모두", "privacy.public.short": "공개", - "privacy.unlisted.long": "모두가 볼 수 있지만, 발견하기 기능에서는 제외됨", - "privacy.unlisted.short": "미등재", + "privacy.unlisted.additional": "공개와 똑같지만 게시물이 라이브 피드나 해시태그, 발견하기, (계정 설정에서 허용했더라도) 마스토돈 검색에서 제외됩니다.", + "privacy.unlisted.long": "더 적은 알고리즘 팡파레", + "privacy.unlisted.short": "조용한 공개", "privacy_policy.last_updated": "{date}에 마지막으로 업데이트됨", "privacy_policy.title": "개인정보처리방침", "recommended": "추천함", @@ -551,7 +550,9 @@ "relative_time.minutes": "{number}분 전", "relative_time.seconds": "{number}초 전", "relative_time.today": "오늘", + "reply_indicator.attachments": "{count, plural, one {#} other {#}}개의 첨부파일", "reply_indicator.cancel": "취소", + "reply_indicator.poll": "투표", "report.block": "차단", "report.block_explanation": "당신은 해당 계정의 게시물을 보지 않게 됩니다. 해당 계정은 당신의 게시물을 보거나 팔로우 할 수 없습니다. 해당 계정은 자신이 차단되었다는 사실을 알 수 있습니다.", "report.categories.legal": "법적인 문제", @@ -715,10 +716,8 @@ "upload_error.poll": "파일 업로드는 설문과 함께 쓸 수 없습니다.", "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_modal.analyzing_picture": "사진 분석 중…", "upload_modal.apply": "적용", diff --git a/app/javascript/mastodon/locales/ku.json b/app/javascript/mastodon/locales/ku.json index 7d8603cae1..4a0fd671db 100644 --- a/app/javascript/mastodon/locales/ku.json +++ b/app/javascript/mastodon/locales/ku.json @@ -77,7 +77,6 @@ "announcement.announcement": "Daxuyanî", "attachments_list.unprocessed": "(bêpêvajo)", "audio.hide": "Dengê veşêre", - "autosuggest_hashtag.per_week": "Her hefte {count}", "boost_modal.combo": "Ji bo derbas bî carekî din de pêlê {combo} bike", "bundle_column_error.copy_stacktrace": "Rapora çewtiyê jê bigire", "bundle_column_error.error.body": "Rûpela xwestî nehate pêşkêşkirin. Dibe ku ew ji ber şaşetiyeke koda me, an jî pirsgirêkeke lihevhatina gerokê be.", @@ -129,22 +128,12 @@ "compose_form.lock_disclaimer": "Ajimêrê te ne {locked}. Herkes dikare te bişopîne da ku şandiyên te yên tenê ji şopînerên re têne xuyakirin bibînin.", "compose_form.lock_disclaimer.lock": "girtî ye", "compose_form.placeholder": "Çi di hişê te derbas dibe?", - "compose_form.poll.add_option": "Hilbijartinekî tevlî bike", "compose_form.poll.duration": "Dema rapirsî yê", - "compose_form.poll.option_placeholder": "{number} Hilbijêre", - "compose_form.poll.remove_option": "Vê hilbijarê rake", "compose_form.poll.switch_to_multiple": "Rapirsî yê biguherînin da ku destûr bidin vebijarkên pirjimar", "compose_form.poll.switch_to_single": "Rapirsîyê biguherîne da ku mafê bidî tenê vebijêrkek", - "compose_form.publish": "Biweşîne", "compose_form.publish_form": "Biweşîne", - "compose_form.publish_loud": "{publish}!", - "compose_form.save_changes": "Guhertinan tomar bike", - "compose_form.sensitive.hide": "{count, plural, one {Medya wekî hestiyar nîşan bide} other {Medya wekî hestiyar nîşan bide}}", - "compose_form.sensitive.marked": "{count, plural, one {Medya wekî hestiyar hate nîşan} other {Medya wekî hestiyar nîşan}}", - "compose_form.sensitive.unmarked": "{count, plural, one {Medya wekî hestiyar nehatiye nîşan} other {Medya wekî hestiyar nehatiye nîşan}}", "compose_form.spoiler.marked": "Hişyariya naverokê rake", "compose_form.spoiler.unmarked": "Hişyariya naverokê tevlî bike", - "compose_form.spoiler_placeholder": "Li vir hişyariya xwe binivîse", "confirmation_modal.cancel": "Dev jê berde", "confirmations.block.block_and_report": "Asteng bike & ragihîne", "confirmations.block.confirm": "Asteng bike", @@ -351,7 +340,6 @@ "navigation_bar.direct": "Qalkirinên taybet", "navigation_bar.discover": "Vekolê", "navigation_bar.domain_blocks": "Navperên astengkirî", - "navigation_bar.edit_profile": "Profîlê serrast bike", "navigation_bar.explore": "Vekole", "navigation_bar.filters": "Peyvên bêdengkirî", "navigation_bar.follow_requests": "Daxwazên şopandinê", @@ -437,14 +425,7 @@ "poll_button.add_poll": "Rapirsîyek zêde bike", "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ê 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", "privacy.public.short": "Gelemperî", - "privacy.unlisted.long": "Ji bo hemûyan xuyabar e, lê ji taybetmendiyên vekolînê veqetiya ye", - "privacy.unlisted.short": "Nelîstekirî", "privacy_policy.last_updated": "Rojanekirina dawî {date}", "privacy_policy.title": "Politîka taybetiyê", "refresh": "Nû bike", @@ -608,10 +589,8 @@ "upload_error.poll": "Di rapirsîyan de mafê barkirina pelan nayê dayîn.", "upload_form.audio_description": "Ji bona kesên kêm dibihîsin re pênase bike", "upload_form.description": "Ji bona astengdarên dîtinê re vebêje", - "upload_form.description_missing": "Ti danasîn nehatiye tevlîkirin", "upload_form.edit": "Serrast bike", "upload_form.thumbnail": "Wêneyê biçûk biguherîne", - "upload_form.undo": "Jê bibe", "upload_form.video_description": "Ji bo kesên kerr û lalan pênase bike", "upload_modal.analyzing_picture": "Wêne tê analîzkirin…", "upload_modal.apply": "Bisepîne", diff --git a/app/javascript/mastodon/locales/kw.json b/app/javascript/mastodon/locales/kw.json index 8f384fe125..e42f50aeff 100644 --- a/app/javascript/mastodon/locales/kw.json +++ b/app/javascript/mastodon/locales/kw.json @@ -45,7 +45,6 @@ "alert.unexpected.message": "Gwall anwaytyadow re dharva.", "alert.unexpected.title": "Oups!", "announcement.announcement": "Deklaryans", - "autosuggest_hashtag.per_week": "{count} an seythen", "boost_modal.combo": "Hwi a yll gwaska {combo} dhe woheles hemma an nessa tro", "bundle_column_error.retry": "Assayewgh arta", "bundle_modal_error.close": "Degea", @@ -80,20 +79,12 @@ "compose_form.lock_disclaimer": "Nyns yw agas akont {locked}. Piwpynag a yll agas holya dhe weles agas postow holyoryon-hepken.", "compose_form.lock_disclaimer.lock": "Alhwedhys", "compose_form.placeholder": "Pyth eus yn agas brys?", - "compose_form.poll.add_option": "Keworra dewis", "compose_form.poll.duration": "Duryans sondyans", - "compose_form.poll.option_placeholder": "Dewis {number}", - "compose_form.poll.remove_option": "Dilea'n dewis ma", "compose_form.poll.switch_to_multiple": "Chanjya sondyans dhe asa lies dewis", "compose_form.poll.switch_to_single": "Chanjya sondyans dhe asa unn dewis hepken", "compose_form.publish_form": "Publish", - "compose_form.publish_loud": "{publish}!", - "compose_form.sensitive.hide": "{count, plural, one {Merkya myski vel tender} other {Merkya myski vel tender}}", - "compose_form.sensitive.marked": "{count, plural, one {Myski merkys vel tender} other {Myski merkys vel tender}}", - "compose_form.sensitive.unmarked": "{count, plural, one {Nyns yw myski merkys vel tender} other {Nyns yw myski merkys vel tender}}", "compose_form.spoiler.marked": "Dilea gwarnyans dalgh", "compose_form.spoiler.unmarked": "Keworra gwarnyans dalgh", - "compose_form.spoiler_placeholder": "Skrifewgh agas gwarnyans omma", "confirmation_modal.cancel": "Hedhi", "confirmations.block.block_and_report": "Lettya & Reportya", "confirmations.block.confirm": "Lettya", @@ -244,7 +235,6 @@ "navigation_bar.compose": "Komposya post nowydh", "navigation_bar.discover": "Diskudha", "navigation_bar.domain_blocks": "Gorfarthow lettys", - "navigation_bar.edit_profile": "Golegi profil", "navigation_bar.filters": "Geryow tawhes", "navigation_bar.follow_requests": "Govynnow holya", "navigation_bar.follows_and_followers": "Holyansow ha holyoryon", @@ -316,12 +306,7 @@ "poll_button.add_poll": "Keworra sondyans", "poll_button.remove_poll": "Dilea sondyans", "privacy.change": "Chanjya privetter an post", - "privacy.direct.long": "Gweladow dhe'n dhevnydhyoryon menegys hepken", - "privacy.direct.short": "Direct", - "privacy.private.long": "Gweladow dhe holyoryon hepken", - "privacy.private.short": "Followers-only", "privacy.public.short": "Poblek", - "privacy.unlisted.short": "Anrelys", "refresh": "Daskarga", "regeneration_indicator.label": "Ow karga…", "regeneration_indicator.sublabel": "Yma agas lin dre ow pos pareusys!", @@ -407,7 +392,6 @@ "upload_form.description": "Deskrifewgh rag tus dhallek", "upload_form.edit": "Golegi", "upload_form.thumbnail": "Chanjya avenik", - "upload_form.undo": "Dilea", "upload_form.video_description": "Deskrifa rag tus vodharek po dallek", "upload_modal.analyzing_picture": "Ow tytratya skeusen…", "upload_modal.apply": "Gweytha", diff --git a/app/javascript/mastodon/locales/la.json b/app/javascript/mastodon/locales/la.json index 3e5747ba8b..698b3da4c3 100644 --- a/app/javascript/mastodon/locales/la.json +++ b/app/javascript/mastodon/locales/la.json @@ -34,9 +34,7 @@ "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.lock": "clausum", "compose_form.placeholder": "What is on your mind?", - "compose_form.publish": "Barrire", "compose_form.publish_form": "Barrire", - "compose_form.publish_loud": "{publish}!", "compose_form.spoiler.marked": "Text is hidden behind warning", "compose_form.spoiler.unmarked": "Text is not hidden", "confirmations.block.confirm": "Impedire", @@ -116,9 +114,6 @@ "poll_button.add_poll": "Addere electionem", "poll_button.remove_poll": "Auferre electionem", "privacy.change": "Adjust status privacy", - "privacy.direct.short": "Direct", - "privacy.private.short": "Followers-only", - "privacy.public.long": "Coram publico", "privacy.public.short": "Coram publico", "relative_time.full.just_now": "nunc", "relative_time.just_now": "nunc", @@ -153,7 +148,6 @@ "trends.counter_by_accounts": "{count, plural, one {{counter} person} other {{counter} people}} in the past {days, plural, one {day} other {# days}}", "upload_form.audio_description": "Describe for people who are hard of hearing", "upload_form.edit": "Recolere", - "upload_form.undo": "Oblitterare", "upload_progress.label": "Uploading…", "video.mute": "Confutare soni" } diff --git a/app/javascript/mastodon/locales/lad.json b/app/javascript/mastodon/locales/lad.json index 8fde687427..ba99f5cd30 100644 --- a/app/javascript/mastodon/locales/lad.json +++ b/app/javascript/mastodon/locales/lad.json @@ -89,7 +89,6 @@ "announcement.announcement": "Pregon", "attachments_list.unprocessed": "(no prosesado)", "audio.hide": "Eskonder audio", - "autosuggest_hashtag.per_week": "{count} por semana", "boost_modal.combo": "Puedes klikar {combo} para ometer esto la proksima vez", "bundle_column_error.copy_stacktrace": "Kopia el raporto de yerro", "bundle_column_error.error.body": "La pajina solisitada no pudo ser renderada. Podria ser por un yerro en muestro kodiche o un problem de kompatibilita kon el navigador.", @@ -146,22 +145,12 @@ "compose_form.lock_disclaimer": "Tu kuento no esta {locked}. Todos pueden segirte para ver tus publikasyones solo para suivantes.", "compose_form.lock_disclaimer.lock": "serrado", "compose_form.placeholder": "Ke haber?", - "compose_form.poll.add_option": "Adjusta opsyon", "compose_form.poll.duration": "Durasion de anketa", - "compose_form.poll.option_placeholder": "Opsyon {number}", - "compose_form.poll.remove_option": "Kita esta opsyon", "compose_form.poll.switch_to_multiple": "Trokar anketa para permeter a eskojer mas ke una opsyon", "compose_form.poll.switch_to_single": "Trokar anketa para permeter a eskojer solo una opsyon", - "compose_form.publish": "Publika", "compose_form.publish_form": "Mueva publikasyon", - "compose_form.publish_loud": "{publish}!", - "compose_form.save_changes": "Guadra trokamientos", - "compose_form.sensitive.hide": "{count, plural, one {Marka material komo sensivle} other {Marka material komo sensivle}}", - "compose_form.sensitive.marked": "{count, plural, one {Material markado komo sensivle} other {Material markado komo sensivle}}", - "compose_form.sensitive.unmarked": "{count, plural, one {Material no markado komo sensivle} other {Material no markado komo sensivle}}", "compose_form.spoiler.marked": "Kita avertensya de kontenido", "compose_form.spoiler.unmarked": "Adjusta avertensya de kontenido", - "compose_form.spoiler_placeholder": "Eskrive tu avertensya aki", "confirmation_modal.cancel": "Anula", "confirmations.block.block_and_report": "Bloka i raporta", "confirmations.block.confirm": "Bloka", @@ -408,7 +397,6 @@ "navigation_bar.direct": "Enmentaduras privadas", "navigation_bar.discover": "Diskuvre", "navigation_bar.domain_blocks": "Domenos blokados", - "navigation_bar.edit_profile": "Edita profil", "navigation_bar.explore": "Eksplorar", "navigation_bar.favourites": "Te plazen", "navigation_bar.filters": "Biervos silensiados", @@ -519,14 +507,7 @@ "poll_button.add_poll": "Adjusta anketa", "poll_button.remove_poll": "Kita anketa", "privacy.change": "Troka privasita de publikasyon", - "privacy.direct.long": "Vizivle solo para utilizadores enmentados", - "privacy.direct.short": "Solo personas enmentadas", - "privacy.private.long": "Vizivle solo para suivantes", - "privacy.private.short": "Solo suivantes", - "privacy.public.long": "Vizivle para todos", "privacy.public.short": "Publiko", - "privacy.unlisted.long": "Vizivle para todos, ama eskluido de las fonksiones de diskuvrimyento", - "privacy.unlisted.short": "No listado", "privacy_policy.last_updated": "Ultima aktualizasyon: {date}", "privacy_policy.title": "Politika de privasita", "recommended": "Rekomendado", @@ -708,10 +689,8 @@ "upload_error.poll": "No se permite kargar dosyas kon anketas.", "upload_form.audio_description": "Deskrive para personas sodras o kon problemes auditivos", "upload_form.description": "Deskrive para personas siegas o kon problemes vizuales", - "upload_form.description_missing": "No adjustates deskripsion", "upload_form.edit": "Edita", "upload_form.thumbnail": "Troka minyatura", - "upload_form.undo": "Efasa", "upload_form.video_description": "Deskrive para personas sodras, kon problemes auditivos, siegas o kon problemes vizuales", "upload_modal.analyzing_picture": "Analizando imaje…", "upload_modal.apply": "Aplika", diff --git a/app/javascript/mastodon/locales/lt.json b/app/javascript/mastodon/locales/lt.json index 623ff2248f..14fa09e973 100644 --- a/app/javascript/mastodon/locales/lt.json +++ b/app/javascript/mastodon/locales/lt.json @@ -89,7 +89,6 @@ "announcement.announcement": "Skelbimas", "attachments_list.unprocessed": "(neapdorotas)", "audio.hide": "Slėpti garsą", - "autosuggest_hashtag.per_week": "{count} per savaitę", "boost_modal.combo": "Gali paspausti {combo}, kad praleisti kitą kartą", "bundle_column_error.copy_stacktrace": "Kopijuoti klaidos ataskaitą", "bundle_column_error.error.body": "Užklausos puslapio nepavyko atvaizduoti. Tai gali būti dėl mūsų kodo klaidos arba naršyklės suderinamumo problemos.", @@ -148,20 +147,20 @@ "compose_form.placeholder": "Kas tavo mintyse?", "compose_form.poll.add_option": "Pridėti pasirinkimą", "compose_form.poll.duration": "Apklausos trukmė", + "compose_form.poll.multiple": "Keli pasirinkimai", "compose_form.poll.option_placeholder": "{number} pasirinkimas", "compose_form.poll.remove_option": "Pašalinti šį pasirinkimą", + "compose_form.poll.single": "Pasirinkti vieną", "compose_form.poll.switch_to_multiple": "Keisti apklausą, kad būtų galima pasirinkti kelis pasirinkimus", "compose_form.poll.switch_to_single": "Pakeisti apklausą, kad būtų galima pasirinkti vieną variantą", + "compose_form.poll.type": "Stilius", "compose_form.publish": "Skelbti", "compose_form.publish_form": "Naujas įrašas", - "compose_form.publish_loud": "{publish}!", - "compose_form.save_changes": "Išsaugoti pakeitimus", - "compose_form.sensitive.hide": "{count, plural, one {Žymėti mediją kaip jautrią} few {Žymėti medijas kaip jautrias} many {Žymėti medijo kaip jautrio} other {Žymėti medijų kaip jautrių}}", - "compose_form.sensitive.marked": "{count, plural, one {Medija pažymėta kaip jautri} few {Medijos pažymėtos kaip jautrios} many {Medijo pažymėta kaip jautrio} other {Medijų pažymėtų kaip jautrių}}", - "compose_form.sensitive.unmarked": "{count, plural, one {Medija nepažymėta kaip jautri} few {Medijos nepažymėtos kaip jautrios} many {Medijo nepažymėta kaip jautrio} other {Medijų nepažymėtų kaip jautrių}}", + "compose_form.reply": "Atsakyti", + "compose_form.save_changes": "Atnaujinti", "compose_form.spoiler.marked": "Pašalinti turinio įspėjimą", "compose_form.spoiler.unmarked": "Pridėti turinio įspėjimą", - "compose_form.spoiler_placeholder": "Rašyk savo įspėjimą čia", + "compose_form.spoiler_placeholder": "Turinio įspėjimas (pasirinktinis)", "confirmation_modal.cancel": "Atšaukti", "confirmations.block.block_and_report": "Blokuoti ir pranešti", "confirmations.block.confirm": "Blokuoti", @@ -342,6 +341,7 @@ "keyboard_shortcuts.unfocus": "to un-focus compose textarea/search", "keyboard_shortcuts.up": "to move up in the list", "lightbox.close": "Uždaryti", + "lists.new.create": "Pridėti sąrašą", "loading_indicator.label": "Kraunama…", "media_gallery.toggle_visible": "{number, plural, one {Slėpti vaizdą} few {Slėpti vaizdus} many {Slėpti vaizdo} other {Slėpti vaizdų}}", "moved_to_account_banner.text": "Tavo paskyra {disabledAccount} šiuo metu yra išjungta, nes persikėlei į {movedToAccount}.", @@ -356,7 +356,6 @@ "navigation_bar.direct": "Privatūs paminėjimai", "navigation_bar.discover": "Atrasti", "navigation_bar.domain_blocks": "Hidden domains", - "navigation_bar.edit_profile": "Redaguoti profilį", "navigation_bar.explore": "Naršyti", "navigation_bar.favourites": "Mėgstamiausi", "navigation_bar.filters": "Nutylėti žodžiai", @@ -466,14 +465,15 @@ "poll_button.add_poll": "Pridėti apklausą", "poll_button.remove_poll": "Šalinti apklausą", "privacy.change": "Adjust status privacy", - "privacy.direct.long": "Post to mentioned users only", - "privacy.direct.short": "Direct", - "privacy.private.long": "Post to followers only", - "privacy.private.short": "Followers-only", - "privacy.public.long": "Visiems matomas", + "privacy.direct.long": "Visus, paminėtus įraše", + "privacy.direct.short": "Konkretūs žmonės", + "privacy.private.long": "Tik sekėjams", + "privacy.private.short": "Sekėjai", + "privacy.public.long": "Bet kas iš Mastodon ir ne Mastodon", "privacy.public.short": "Viešas", - "privacy.unlisted.long": "Matomas visiems, bet atsisakyta atradimo funkcijų", - "privacy.unlisted.short": "Neįtrauktas į sąrašą", + "privacy.unlisted.additional": "Tai veikia lygiai taip pat, kaip ir vieša, tik įrašas nebus rodomas tiesioginiuose srautuose, saitažodžiose, naršyme ar Mastodon paieškoje, net jei esi įtraukęs (-usi) visą paskyrą.", + "privacy.unlisted.long": "Mažiau algoritminių fanfarų", + "privacy.unlisted.short": "Tyliai vieša", "privacy_policy.last_updated": "Paskutinį kartą atnaujinta {date}", "privacy_policy.title": "Privatumo politika", "recommended": "Rekomenduojama", @@ -485,7 +485,9 @@ "relative_time.minutes": "{number} min.", "relative_time.seconds": "{number} sek.", "relative_time.today": "šiandien", + "reply_indicator.attachments": "{count, plural, one {# priedas} few {# priedai} many {# priedo} other {# priedų}}", "reply_indicator.cancel": "Atšaukti", + "reply_indicator.poll": "Apklausa", "report.block": "Blokuoti", "report.categories.legal": "Legalus", "report.categories.other": "Kita", @@ -579,9 +581,7 @@ "units.short.thousand": "{count} tūkst.", "upload_form.audio_description": "Describe for people with hearing loss", "upload_form.description": "Describe for the visually impaired", - "upload_form.description_missing": "Nėra pridėto aprašymo", "upload_form.edit": "Redaguoti", - "upload_form.undo": "Ištrinti", "upload_form.video_description": "Describe for people with hearing loss or visual impairment", "upload_modal.choose_image": "Pasirinkti vaizdą", "upload_modal.description_placeholder": "Greita rudoji lapė peršoka tinginį šunį", diff --git a/app/javascript/mastodon/locales/lv.json b/app/javascript/mastodon/locales/lv.json index c06a1d9368..b4426b4c45 100644 --- a/app/javascript/mastodon/locales/lv.json +++ b/app/javascript/mastodon/locales/lv.json @@ -86,7 +86,6 @@ "announcement.announcement": "Paziņojums", "attachments_list.unprocessed": "(neapstrādāti)", "audio.hide": "Slēpt audio", - "autosuggest_hashtag.per_week": "{count} nedēļā", "boost_modal.combo": "Nospied {combo}, lai nākamreiz šo izlaistu", "bundle_column_error.copy_stacktrace": "Kopēt kļūdu ziņojumu", "bundle_column_error.error.body": "Pieprasīto lapu nevarēja atveidot. Tas varētu būt saistīts ar kļūdu mūsu kodā, vai tā ir pārlūkprogrammas saderības problēma.", @@ -143,22 +142,12 @@ "compose_form.lock_disclaimer": "Tavs konts nav {locked}. Ikviens var tev piesekot un redzēt tikai sekotājiem paredzētos ziņojumus.", "compose_form.lock_disclaimer.lock": "slēgts", "compose_form.placeholder": "Kas tev padomā?", - "compose_form.poll.add_option": "Pievienot izvēli", "compose_form.poll.duration": "Aptaujas ilgums", - "compose_form.poll.option_placeholder": "Izvēle Nr. {number}", - "compose_form.poll.remove_option": "Noņemt šo izvēli", "compose_form.poll.switch_to_multiple": "Mainīt aptaujas veidu, lai atļautu vairākas izvēles", "compose_form.poll.switch_to_single": "Mainīt aptaujas veidu, lai atļautu vienu izvēli", - "compose_form.publish": "Publicēt", "compose_form.publish_form": "Jauns ieraksts", - "compose_form.publish_loud": "{publish}!", - "compose_form.save_changes": "Saglabāt izmaiņas", - "compose_form.sensitive.hide": "{count, plural, one {Atzīmēt multividi kā sensitīvu} other {Atzīmēt multivides kā sensitīvas}}", - "compose_form.sensitive.marked": "{count, plural, one {Multivide ir atzīmēta kā sensitīva} other {Multivides ir atzīmētas kā sensitīvas}}", - "compose_form.sensitive.unmarked": "{count, plural, one {Multivide nav atzīmēta kā sensitīva} other {Multivides nav atzīmētas kā sensitīvas}}", "compose_form.spoiler.marked": "Noņemt satura brīdinājumu", "compose_form.spoiler.unmarked": "Pievienot satura brīdinājumu", - "compose_form.spoiler_placeholder": "Ieraksti savu brīdinājumu šeit", "confirmation_modal.cancel": "Atcelt", "confirmations.block.block_and_report": "Bloķēt un ziņot", "confirmations.block.confirm": "Bloķēt", @@ -403,7 +392,6 @@ "navigation_bar.direct": "Privāti pieminēti", "navigation_bar.discover": "Atklāt", "navigation_bar.domain_blocks": "Bloķētie domēni", - "navigation_bar.edit_profile": "Rediģēt profilu", "navigation_bar.explore": "Pārlūkot", "navigation_bar.favourites": "Izlase", "navigation_bar.filters": "Apklusinātie vārdi", @@ -510,14 +498,7 @@ "poll_button.add_poll": "Pievienot aptauju", "poll_button.remove_poll": "Noņemt aptauju", "privacy.change": "Mainīt ieraksta privātumu", - "privacy.direct.long": "Redzama tikai pieminētajiem lietotājiem", - "privacy.direct.short": "Tikai minētie cilvēki", - "privacy.private.long": "Redzama tikai sekotājiem", - "privacy.private.short": "Tikai sekotājiem", - "privacy.public.long": "Redzams visiem", "privacy.public.short": "Publiska", - "privacy.unlisted.long": "Redzams visiem, bet izslēgts no satura atklāšanas funkcijām", - "privacy.unlisted.short": "Neiekļautie", "privacy_policy.last_updated": "Pēdējo reizi atjaunināta {date}", "privacy_policy.title": "Privātuma politika", "refresh": "Atsvaidzināt", @@ -697,10 +678,8 @@ "upload_error.poll": "Datņu augšupielādes aptaujās nav atļautas.", "upload_form.audio_description": "Pievieno aprakstu cilvēkiem ar dzirdes zudumu", "upload_form.description": "Pievieno aprakstu vājredzīgajiem", - "upload_form.description_missing": "Apraksts nav pievienots", "upload_form.edit": "Rediģēt", "upload_form.thumbnail": "Nomainīt sīktēlu", - "upload_form.undo": "Dzēst", "upload_form.video_description": "Pievieno aprakstu cilvēkiem ar dzirdes vai redzes traucējumiem", "upload_modal.analyzing_picture": "Analizē attēlu…", "upload_modal.apply": "Pielietot", diff --git a/app/javascript/mastodon/locales/mk.json b/app/javascript/mastodon/locales/mk.json index bdef3f4a5f..f7080842b7 100644 --- a/app/javascript/mastodon/locales/mk.json +++ b/app/javascript/mastodon/locales/mk.json @@ -48,7 +48,6 @@ "alert.rate_limited.message": "Обидете се повторно после {retry_time, time, medium}.", "alert.unexpected.message": "Неочекувана грешка.", "alert.unexpected.title": "Упс!", - "autosuggest_hashtag.per_week": "{count} неделно", "boost_modal.combo": "Кликни {combo} за да го прескокниш ова нареден пат", "bundle_column_error.retry": "Обидете се повторно", "bundle_modal_error.close": "Затвори", @@ -76,14 +75,8 @@ "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.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.publish_form": "Publish", - "compose_form.sensitive.hide": "Обележи медиа како сензитивна", - "compose_form.sensitive.marked": "Медиата е обележана како сензитивна", - "compose_form.sensitive.unmarked": "Медиата не е обележана како сензитивна", "compose_form.spoiler.marked": "Текстот е сокриен зад предупредување", "compose_form.spoiler.unmarked": "Текстот не е сокриен", "confirmation_modal.cancel": "Откажи", @@ -182,7 +175,6 @@ "keyboard_shortcuts.up": "to move up in the list", "navigation_bar.compose": "Compose new toot", "navigation_bar.domain_blocks": "Hidden domains", - "navigation_bar.edit_profile": "Уреди профил", "navigation_bar.filters": "Замолќени зборови", "navigation_bar.follow_requests": "Следи покани", "navigation_bar.follows_and_followers": "Следења и следбеници", @@ -229,12 +221,7 @@ "poll_button.add_poll": "Додадете нова анкета", "poll_button.remove_poll": "Избришете анкета", "privacy.change": "Штеловај статус на приватност", - "privacy.direct.long": "Објави само на спомнати корисници", - "privacy.direct.short": "Direct", - "privacy.private.long": "Објави само на следбеници", - "privacy.private.short": "Followers-only", "privacy.public.short": "Јавно", - "privacy.unlisted.short": "Необјавено", "refresh": "Освежи", "regeneration_indicator.label": "Вчитување…", "regeneration_indicator.sublabel": "Вашиот новости се подготвуваат!", diff --git a/app/javascript/mastodon/locales/ml.json b/app/javascript/mastodon/locales/ml.json index 11636646b2..0059dd333b 100644 --- a/app/javascript/mastodon/locales/ml.json +++ b/app/javascript/mastodon/locales/ml.json @@ -60,7 +60,6 @@ "announcement.announcement": "അറിയിപ്പ്", "attachments_list.unprocessed": "(പ്രോസസ്സ് ചെയ്യാത്തത്)", "audio.hide": "ശബ്ദം ഒഴിവാക്കുക", - "autosuggest_hashtag.per_week": "ആഴ്ച തോറും {count}", "boost_modal.combo": "അടുത്ത തവണ ഇത് ഒഴിവാക്കുവാൻ {combo} ഞെക്കാവുന്നതാണ്", "bundle_column_error.network.title": "നെറ്റ്‍വർക്ക് പിശക്", "bundle_column_error.retry": "വീണ്ടും ശ്രമിക്കുക", @@ -102,17 +101,12 @@ "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.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_single": "വോട്ടെടുപ്പിൽ ഒരൊറ്റ ചോയ്‌സ്‌ മാത്രം ആക്കുക", "compose_form.publish_form": "Publish", - "compose_form.publish_loud": "{പ്രസിദ്ധീകരിക്കുക}!", "compose_form.spoiler.marked": "എഴുത്ത് മുന്നറിയിപ്പിനാൽ മറച്ചിരിക്കുന്നു", "compose_form.spoiler.unmarked": "എഴുത്ത് മറയ്ക്കപ്പെട്ടിട്ടില്ല", - "compose_form.spoiler_placeholder": "നിങ്ങളുടെ മുന്നറിയിപ്പ് ഇവിടെ എഴുതുക", "confirmation_modal.cancel": "റദ്ദാക്കുക", "confirmations.block.block_and_report": "തടയുകയും റിപ്പോർട്ടും ചെയ്യുക", "confirmations.block.confirm": "തടയുക", @@ -244,7 +238,6 @@ "navigation_bar.compose": "പുതിയ ടൂട്ട് എഴുതുക", "navigation_bar.discover": "കണ്ടെത്തുക", "navigation_bar.domain_blocks": "Hidden domains", - "navigation_bar.edit_profile": "പ്രൊഫൈൽ തിരുത്തുക", "navigation_bar.follow_requests": "പിന്തുടരാനുള്ള അഭ്യർത്ഥനകൾ", "navigation_bar.lists": "ലിസ്റ്റുകൾ", "navigation_bar.logout": "ലോഗൗട്ട്", @@ -302,10 +295,6 @@ "poll_button.add_poll": "ഒരു പോൾ ചേർക്കുക", "poll_button.remove_poll": "പോൾ നീക്കംചെയ്യുക", "privacy.change": "ടൂട്ട് സ്വകാര്യത ക്രമീകരിക്കുക", - "privacy.direct.long": "Post to mentioned users only", - "privacy.direct.short": "Direct", - "privacy.private.long": "Post to followers only", - "privacy.private.short": "Followers-only", "privacy.public.short": "എല്ലാവര്‍ക്കും", "refresh": "പുതുക്കുക", "regeneration_indicator.label": "ലഭ്യമാക്കുന്നു…", @@ -372,7 +361,6 @@ "upload_form.description": "കാഴ്ചശക്തി ഇല്ലാത്തവർക്ക് വേണ്ടി വിവരണം നൽകൂ", "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": "ചിത്രം വിശകലനം ചെയ്യുന്നു…", "upload_modal.apply": "പ്രയോഗിക്കുക", diff --git a/app/javascript/mastodon/locales/mr.json b/app/javascript/mastodon/locales/mr.json index 7f5b7d6524..20231f0bbf 100644 --- a/app/javascript/mastodon/locales/mr.json +++ b/app/javascript/mastodon/locales/mr.json @@ -73,7 +73,6 @@ "alert.unexpected.message": "एक अनपेक्षित त्रुटी आली.", "alert.unexpected.title": "अरेरे!", "announcement.announcement": "घोषणा", - "autosuggest_hashtag.per_week": "{count} प्रतिसप्ताह", "bundle_column_error.retry": "पुन्हा प्रयत्न करा", "bundle_modal_error.close": "बंद करा", "bundle_modal_error.message": "हा घटक लोड करतांना काहीतरी चुकले आहे.", @@ -99,9 +98,6 @@ "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.placeholder": "आपल्या मनात काय आहे?", - "compose_form.poll.add_option": "नवीन पर्याय", - "compose_form.poll.option_placeholder": "निवड {number}", - "compose_form.poll.remove_option": "हा पर्याय काढा", "compose_form.publish_form": "Publish", "compose_form.spoiler.marked": "Text is hidden behind warning", "compose_form.spoiler.unmarked": "Text is not hidden", @@ -228,10 +224,6 @@ "onboarding.steps.share_profile.body": "Let your friends know how to find you on Mastodon!", "onboarding.steps.share_profile.title": "Share your profile", "privacy.change": "Adjust status privacy", - "privacy.direct.long": "Post to mentioned users only", - "privacy.direct.short": "Direct", - "privacy.private.long": "Post to followers only", - "privacy.private.short": "Followers-only", "report.placeholder": "Type or paste additional comments", "report.submit": "Submit report", "report.target": "Report {target}", diff --git a/app/javascript/mastodon/locales/ms.json b/app/javascript/mastodon/locales/ms.json index 50a48db1ea..8c1ff63376 100644 --- a/app/javascript/mastodon/locales/ms.json +++ b/app/javascript/mastodon/locales/ms.json @@ -86,7 +86,6 @@ "announcement.announcement": "Pengumuman", "attachments_list.unprocessed": "(belum diproses)", "audio.hide": "Sembunyikan audio", - "autosuggest_hashtag.per_week": "{count} seminggu", "boost_modal.combo": "Anda boleh tekan {combo} untuk melangkauinya pada waktu lain", "bundle_column_error.copy_stacktrace": "Salin laporan ralat", "bundle_column_error.error.body": "Halaman yang diminta gagal dipaparkan. Ini mungkin disebabkan oleh pepijat dalam kod kami, atau masalah keserasian pelayar.", @@ -143,22 +142,12 @@ "compose_form.lock_disclaimer": "Akaun anda tidak {locked}. Sesiapa pun boleh mengikuti anda untuk melihat hantaran pengikut-sahaja anda.", "compose_form.lock_disclaimer.lock": "dikunci", "compose_form.placeholder": "Apakah yang sedang anda fikirkan?", - "compose_form.poll.add_option": "Tambah pilihan", "compose_form.poll.duration": "Tempoh undian", - "compose_form.poll.option_placeholder": "Pilihan {number}", - "compose_form.poll.remove_option": "Buang pilihan ini", "compose_form.poll.switch_to_multiple": "Ubah kepada membenarkan aneka undian", "compose_form.poll.switch_to_single": "Ubah kepada undian pilihan tunggal", - "compose_form.publish": "Terbit", "compose_form.publish_form": "Terbit", - "compose_form.publish_loud": "{publish}!", - "compose_form.save_changes": "Simpan perubahan", - "compose_form.sensitive.hide": "{count, plural, one {Tandakan media sbg sensitif} other {Tandakan media sbg sensitif}}", - "compose_form.sensitive.marked": "{count, plural, one {Media telah ditanda sbg sensitif} other {Media telah ditanda sbg sensitif}}", - "compose_form.sensitive.unmarked": "{count, plural, one {Media tidak ditanda sbg sensitif} other {Media tidak ditanda sbg sensitif}}", "compose_form.spoiler.marked": "Buang amaran kandungan", "compose_form.spoiler.unmarked": "Tambah amaran kandungan", - "compose_form.spoiler_placeholder": "Tulis amaran anda di sini", "confirmation_modal.cancel": "Batal", "confirmations.block.block_and_report": "Sekat & Lapor", "confirmations.block.confirm": "Sekat", @@ -399,7 +388,6 @@ "navigation_bar.direct": "Sebutan peribadi", "navigation_bar.discover": "Teroka", "navigation_bar.domain_blocks": "Domain disekat", - "navigation_bar.edit_profile": "Sunting profil", "navigation_bar.explore": "Teroka", "navigation_bar.favourites": "Kegemaran", "navigation_bar.filters": "Perkataan yang dibisukan", @@ -506,14 +494,7 @@ "poll_button.add_poll": "Tambah undian", "poll_button.remove_poll": "Buang undian", "privacy.change": "Ubah privasi hantaran", - "privacy.direct.long": "Hanya boleh dilihat oleh pengguna disebut", - "privacy.direct.short": "Orang yang disebut sahaja", - "privacy.private.long": "Hanya boleh dilihat oleh pengikut", - "privacy.private.short": "Pengikut sahaja", - "privacy.public.long": "Kelihatan untuk semua", "privacy.public.short": "Awam", - "privacy.unlisted.long": "Terpapar untuk semua, tetapi menarik diri daripada ciri penemuan", - "privacy.unlisted.short": "Tidak tersenarai", "privacy_policy.last_updated": "Dikemaskini {date}", "privacy_policy.title": "Dasar Privasi", "refresh": "Muat semula", @@ -693,10 +674,8 @@ "upload_error.poll": "Tidak boleh memuat naik fail bersama undian.", "upload_form.audio_description": "Jelaskan untuk orang yang ada masalah pendengaran", "upload_form.description": "Jelaskan untuk orang yang ada masalah penglihatan", - "upload_form.description_missing": "Tiada keterangan ditambah", "upload_form.edit": "Sunting", "upload_form.thumbnail": "Ubah gambar kecil", - "upload_form.undo": "Padam", "upload_form.video_description": "Jelaskan untuk orang yang ada masalah pendengaran atau penglihatan", "upload_modal.analyzing_picture": "Menganalisis gambar…", "upload_modal.apply": "Guna", diff --git a/app/javascript/mastodon/locales/my.json b/app/javascript/mastodon/locales/my.json index 3ca03b616a..396a72ac45 100644 --- a/app/javascript/mastodon/locales/my.json +++ b/app/javascript/mastodon/locales/my.json @@ -87,7 +87,6 @@ "announcement.announcement": "ကြေငြာချက်", "attachments_list.unprocessed": "(မလုပ်ဆောင်ရသေး)", "audio.hide": "အသံပိတ်မည်", - "autosuggest_hashtag.per_week": "တစ်ပတ်လျှင် {count}\n", "boost_modal.combo": "ဤအရာကို နောက်တစ်ကြိမ်ကျော်ရန် {combo} ကိုနှိပ်နိုင်သည်။", "bundle_column_error.copy_stacktrace": "စာကူးရာတွင်ပြဿနာရှိသည်", "bundle_column_error.error.body": "ဤစာမျက်နှာကို ဖော်ပြရာတွင် ပြဿနာရှိနေသည်", @@ -144,22 +143,12 @@ "compose_form.lock_disclaimer": "သင့်အကောင့်ကို {သော့ခတ်မထားပါ}။ သင့်နောက်လိုက်-သီးသန့်ပို့စ်များကို ကြည့်ရှုရန် မည်သူမဆို သင့်အား လိုက်ကြည့်နိုင်ပါသည်။", "compose_form.lock_disclaimer.lock": "သော့ခတ်ထားမယ်", "compose_form.placeholder": "What is on your mind?", - "compose_form.poll.add_option": "ရွေးချယ်မှုထပ်မံပေါင်းထည့်ပါ", "compose_form.poll.duration": "စစ်တမ်းကြာချိန်", - "compose_form.poll.option_placeholder": "ရွေးချယ်မှု {number}\n", - "compose_form.poll.remove_option": "ဤရွေးချယ်မှုကို ဖယ်ထုတ်ပါ", "compose_form.poll.switch_to_multiple": "စစ်တမ်းတွင်တစ်ခုထပ်ပိုသောဆန္ဒပြုချက်လက်ခံမည်", "compose_form.poll.switch_to_single": "စစ်တမ်းတွင် တစ်ခုကိုသာရွေးချယ်ခွင့်ပြုမည်", - "compose_form.publish": "ပို့စ်တင်မည်", "compose_form.publish_form": "ပို့စ်တင်မည်", - "compose_form.publish_loud": "{publish}!", - "compose_form.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": "သတိပေးစာကိုဤနေရာတွင်ရေးပါ", "confirmation_modal.cancel": "ပယ်ဖျက်မည်", "confirmations.block.block_and_report": "ဘလော့ပြီး တိုင်ကြားမည်", "confirmations.block.confirm": "ဘလော့မည်", @@ -405,7 +394,6 @@ "navigation_bar.direct": "သီးသန့်ဖော်ပြချက်များ", "navigation_bar.discover": "ရှာဖွေပါ", "navigation_bar.domain_blocks": "Hidden domains", - "navigation_bar.edit_profile": "ကိုယ်ရေးမှတ်တမ်းပြင်ဆင်မည်", "navigation_bar.explore": "စူးစမ်းရန်", "navigation_bar.favourites": "Favorites", "navigation_bar.filters": "စကားလုံးများ ပိတ်ထားပါ", @@ -519,14 +507,7 @@ "poll_button.add_poll": "စစ်တမ်းကောက်မည်", "poll_button.remove_poll": "စစ်တမ်းပယ်ဖျက်မည်", "privacy.change": "Adjust status privacy", - "privacy.direct.long": "မန်းရှင်းခေါ်သူသီးသန့်", - "privacy.direct.short": "Direct", - "privacy.private.long": "ဖော်လိုးလုပ်သူသီးသန့်", - "privacy.private.short": "စောင့်ကြည့်သူများသာ", - "privacy.public.long": "အားလုံး မြင်နိုင်သည်", "privacy.public.short": "အများကိုပြမည်", - "privacy.unlisted.long": "အားလုံးမြင်နိုင်သော်လည်း ရှာဖွေမှုများမှ ဖယ်ထုတ်ထားသည်", - "privacy.unlisted.short": "စာရင်းမသွင်းထားပါ", "privacy_policy.last_updated": "နောက်ဆုံး ပြင်ဆင်ခဲ့သည့်ရက်စွဲ {date}", "privacy_policy.title": "ကိုယ်ရေးအချက်အလက်မူဝါဒ", "recommended": "အကြံပြုသည်", @@ -708,10 +689,8 @@ "upload_error.poll": "စစ်တမ်းနှင့်အတူဖိုင်များတင်ခွင့်မပြုပါ", "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_modal.analyzing_picture": "ပုံအား ပိုင်းခြားစိတ်ဖြာနေသည်...", "upload_modal.apply": "သုံးပါ", diff --git a/app/javascript/mastodon/locales/ne.json b/app/javascript/mastodon/locales/ne.json index 229d4f4718..86e24a15fb 100644 --- a/app/javascript/mastodon/locales/ne.json +++ b/app/javascript/mastodon/locales/ne.json @@ -69,12 +69,5 @@ "compose.language.change": "भाषा परिवर्तन गर्नुहोस्", "compose.language.search": "भाषाहरू खोज्नुहोस्...", "compose_form.direct_message_warning_learn_more": "थप जान्नुहोस्", - "compose_form.poll.add_option": "विकल्प थप्नुहोस्", - "compose_form.poll.remove_option": "यो विकल्प हटाउनुहोस्", - "compose_form.publish_form": "नयाँ पोस्ट", - "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_placeholder": "यहाँ आफ्नो चेतावनी लेख्नुहोस्" + "compose_form.publish_form": "नयाँ पोस्ट" } diff --git a/app/javascript/mastodon/locales/nl.json b/app/javascript/mastodon/locales/nl.json index 86617d4a54..e38f8fd0ba 100644 --- a/app/javascript/mastodon/locales/nl.json +++ b/app/javascript/mastodon/locales/nl.json @@ -89,7 +89,6 @@ "announcement.announcement": "Mededeling", "attachments_list.unprocessed": "(niet verwerkt)", "audio.hide": "Audio verbergen", - "autosuggest_hashtag.per_week": "{count} per week", "boost_modal.combo": "Je kunt {combo} klikken om dit de volgende keer over te slaan", "bundle_column_error.copy_stacktrace": "Foutrapportage kopiëren", "bundle_column_error.error.body": "De opgevraagde pagina kon niet worden weergegeven. Dit kan het gevolg zijn van een fout in onze broncode, of van een compatibiliteitsprobleem met je webbrowser.", @@ -146,22 +145,22 @@ "compose_form.lock_disclaimer": "Jouw account is niet {locked}. Iedereen kan jou volgen en kan de berichten zien die je alleen aan jouw volgers hebt gericht.", "compose_form.lock_disclaimer.lock": "vergrendeld", "compose_form.placeholder": "Wat wil je kwijt?", - "compose_form.poll.add_option": "Keuze toevoegen", + "compose_form.poll.add_option": "Optie toevoegen", "compose_form.poll.duration": "Duur van de peiling", - "compose_form.poll.option_placeholder": "Keuze {number}", - "compose_form.poll.remove_option": "Deze keuze verwijderen", + "compose_form.poll.multiple": "Meerkeuze", + "compose_form.poll.option_placeholder": "Optie {number}", + "compose_form.poll.remove_option": "Deze optie verwijderen", + "compose_form.poll.single": "Kies een", "compose_form.poll.switch_to_multiple": "Peiling wijzigen om meerdere keuzes toe te staan", "compose_form.poll.switch_to_single": "Peiling wijzigen om een enkele keuze toe te staan", - "compose_form.publish": "Toot", + "compose_form.poll.type": "Stijl", + "compose_form.publish": "Plaatsen", "compose_form.publish_form": "Nieuw bericht", - "compose_form.publish_loud": "{publish}!", - "compose_form.save_changes": "Wijzigingen opslaan", - "compose_form.sensitive.hide": "{count, plural, one {Media als gevoelig markeren} other {Media als gevoelig markeren}}", - "compose_form.sensitive.marked": "{count, plural, one {Media is als gevoelig gemarkeerd} other {Media is als gevoelig gemarkeerd}}", - "compose_form.sensitive.unmarked": "{count, plural, one {Media is niet als gevoelig gemarkeerd} other {Media is niet als gevoelig gemarkeerd}}", + "compose_form.reply": "Reageren", + "compose_form.save_changes": "Bijwerken", "compose_form.spoiler.marked": "Inhoudswaarschuwing verwijderen", "compose_form.spoiler.unmarked": "Inhoudswaarschuwing toevoegen", - "compose_form.spoiler_placeholder": "Waarschuwingstekst", + "compose_form.spoiler_placeholder": "Waarschuwing inhoud (optioneel)", "confirmation_modal.cancel": "Annuleren", "confirmations.block.block_and_report": "Blokkeren en rapporteren", "confirmations.block.confirm": "Blokkeren", @@ -408,7 +407,6 @@ "navigation_bar.direct": "Privéberichten", "navigation_bar.discover": "Ontdekken", "navigation_bar.domain_blocks": "Geblokkeerde domeinen", - "navigation_bar.edit_profile": "Profiel bewerken", "navigation_bar.explore": "Verkennen", "navigation_bar.favourites": "Favorieten", "navigation_bar.filters": "Filters", @@ -526,14 +524,15 @@ "poll_button.add_poll": "Peiling toevoegen", "poll_button.remove_poll": "Peiling verwijderen", "privacy.change": "Zichtbaarheid van bericht aanpassen", - "privacy.direct.long": "Alleen aan vermelde gebruikers tonen", - "privacy.direct.short": "Privébericht", - "privacy.private.long": "Alleen aan volgers tonen", - "privacy.private.short": "Alleen volgers", - "privacy.public.long": "Voor iedereen zichtbaar", + "privacy.direct.long": "Iedereen genoemd in de post", + "privacy.direct.short": "Specifieke mensen", + "privacy.private.long": "Alleen jouw volgers", + "privacy.private.short": "Volgers", + "privacy.public.long": "Iedereen op Mastodon en daarbuiten", "privacy.public.short": "Openbaar", - "privacy.unlisted.long": "Voor iedereen zichtbaar, maar niet onder trends, hashtags en op openbare tijdlijnen", - "privacy.unlisted.short": "Minder openbaar", + "privacy.unlisted.additional": "Dit is vergelijkbaar met publiek, behalve dat de post niet zal verschijnen in live feeds of hashtags, verkennen of Mastodon zoeken, zelfs als je gekozen hebt voor account-breed.", + "privacy.unlisted.long": "Minder algoritmische fanfare", + "privacy.unlisted.short": "Stil publiek", "privacy_policy.last_updated": "Laatst bijgewerkt op {date}", "privacy_policy.title": "Privacybeleid", "recommended": "Aanbevolen", @@ -551,7 +550,9 @@ "relative_time.minutes": "{number}m", "relative_time.seconds": "{number}s", "relative_time.today": "vandaag", + "reply_indicator.attachments": "{count, plural, one {# bijlage} other {# bijlagen}}", "reply_indicator.cancel": "Annuleren", + "reply_indicator.poll": "Peiling", "report.block": "Blokkeren", "report.block_explanation": "Je kunt diens berichten niet zien. Je kunt door diegene niet gevolgd worden en jouw berichten zijn onzichtbaar. Diegene kan zien dat die door jou is geblokkeerd.", "report.categories.legal": "Juridisch", @@ -715,10 +716,8 @@ "upload_error.poll": "Het uploaden van bestanden is bij peilingen niet toegestaan.", "upload_form.audio_description": "Omschrijf dit voor dove of slechthorende mensen", "upload_form.description": "Omschrijf dit voor blinde of slechtziende mensen", - "upload_form.description_missing": "Geen omschrijving toegevoegd", "upload_form.edit": "Bewerken", "upload_form.thumbnail": "Miniatuurafbeelding wijzigen", - "upload_form.undo": "Verwijderen", "upload_form.video_description": "Omschrijf dit voor dove, slechthorende, blinde of slechtziende mensen", "upload_modal.analyzing_picture": "Afbeelding analyseren…", "upload_modal.apply": "Toepassen", diff --git a/app/javascript/mastodon/locales/nn.json b/app/javascript/mastodon/locales/nn.json index ec2ff82144..9bb4f59197 100644 --- a/app/javascript/mastodon/locales/nn.json +++ b/app/javascript/mastodon/locales/nn.json @@ -89,7 +89,6 @@ "announcement.announcement": "Kunngjering", "attachments_list.unprocessed": "(ubehandla)", "audio.hide": "Gøym lyd", - "autosuggest_hashtag.per_week": "{count} per veke", "boost_modal.combo": "Du kan trykkja {combo} for å hoppa over dette neste gong", "bundle_column_error.copy_stacktrace": "Kopier feilrapport", "bundle_column_error.error.body": "Den etterspurde sida kan ikke hentast fram. Det kan skuldast ein feil i koden vår eller eit kompatibilitetsproblem.", @@ -146,22 +145,22 @@ "compose_form.lock_disclaimer": "Kontoen din er ikkje {locked}. Kven som helst kan fylgja deg for å sjå innlegga dine.", "compose_form.lock_disclaimer.lock": "låst", "compose_form.placeholder": "Kva har du på hjarta?", - "compose_form.poll.add_option": "Legg til eit val", + "compose_form.poll.add_option": "Legg til alternativ", "compose_form.poll.duration": "Varigheit for rundspørjing", - "compose_form.poll.option_placeholder": "Val {number}", - "compose_form.poll.remove_option": "Fjern dette valet", + "compose_form.poll.multiple": "Flervalg", + "compose_form.poll.option_placeholder": "Valg {number}", + "compose_form.poll.remove_option": "Fjern dette valget", + "compose_form.poll.single": "Velg en", "compose_form.poll.switch_to_multiple": "Endre rundspørjinga til å tillate fleire val", "compose_form.poll.switch_to_single": "Endre rundspørjinga til å tillate berre eitt val", - "compose_form.publish": "Legg ut", + "compose_form.poll.type": "Stil", + "compose_form.publish": "Publiser", "compose_form.publish_form": "Legg ut", - "compose_form.publish_loud": "{publish}!", - "compose_form.save_changes": "Lagre endringar", - "compose_form.sensitive.hide": "{count, plural, one {Marker mediet som ømtolig} other {Marker media som ømtolige}}", - "compose_form.sensitive.marked": "{count, plural, one {Mediet er markert som ømtolig} other {Media er markerte som ømtolige}}", - "compose_form.sensitive.unmarked": "{count, plural, one {Mediet er ikkje markert som ømtolig} other {Media er ikkje markerte som ømtolige}}", + "compose_form.reply": "Svar", + "compose_form.save_changes": "Oppdater", "compose_form.spoiler.marked": "Fjern innhaldsåtvaring", "compose_form.spoiler.unmarked": "Legg til innhaldsåtvaring", - "compose_form.spoiler_placeholder": "Skriv åtvaringa di her", + "compose_form.spoiler_placeholder": "Innholdsadvarsel (valgfritt)", "confirmation_modal.cancel": "Avbryt", "confirmations.block.block_and_report": "Blokker & rapporter", "confirmations.block.confirm": "Blokker", @@ -408,7 +407,6 @@ "navigation_bar.direct": "Private omtaler", "navigation_bar.discover": "Oppdag", "navigation_bar.domain_blocks": "Skjulte domene", - "navigation_bar.edit_profile": "Rediger profil", "navigation_bar.explore": "Utforsk", "navigation_bar.favourites": "Favorittar", "navigation_bar.filters": "Målbundne ord", @@ -525,14 +523,14 @@ "poll_button.add_poll": "Lag ei rundspørjing", "poll_button.remove_poll": "Fjern rundspørjing", "privacy.change": "Endre personvernet på innlegg", - "privacy.direct.long": "Synleg kun for omtala brukarar", - "privacy.direct.short": "Kun nemnde personar", - "privacy.private.long": "Kun synleg for fylgjarar", - "privacy.private.short": "Kun fylgjarar", - "privacy.public.long": "Synleg for alle", + "privacy.direct.long": "Alle nevnt i innlegget", + "privacy.direct.short": "Spesifikke folk", + "privacy.private.long": "Bare følgerne dine", + "privacy.private.short": "Følgere", + "privacy.public.long": "Alle på og utenfor Mastodon", "privacy.public.short": "Offentleg", - "privacy.unlisted.long": "Synleg for alle, men blir ikkje vist i oppdagsfunksjonar", - "privacy.unlisted.short": "Uoppført", + "privacy.unlisted.long": "Færre algoritmiske fanfarer", + "privacy.unlisted.short": "Stille offentlig", "privacy_policy.last_updated": "Sist oppdatert {date}", "privacy_policy.title": "Personvernsreglar", "recommended": "Anbefalt", @@ -550,7 +548,9 @@ "relative_time.minutes": "{number}min", "relative_time.seconds": "{number}sek", "relative_time.today": "i dag", + "reply_indicator.attachments": "{count, plural, one {# vedlegg} other {# vedlegg}}", "reply_indicator.cancel": "Avbryt", + "reply_indicator.poll": "Avstemming", "report.block": "Blokker", "report.block_explanation": "Du vil ikkje kunne sjå innlegga deira. Dei vil ikkje kunne sjå innlegga dine eller fylgje deg. Dei kan sjå at dei er blokkert.", "report.categories.legal": "Juridisk", @@ -714,10 +714,8 @@ "upload_error.poll": "Filopplasting er ikkje lov for rundspørjingar.", "upload_form.audio_description": "Skildre for dei med nedsett høyrsel", "upload_form.description": "Skildre for blinde og svaksynte", - "upload_form.description_missing": "Inga skildring er lagt til", "upload_form.edit": "Rediger", "upload_form.thumbnail": "Bytt miniatyrbilete", - "upload_form.undo": "Slett", "upload_form.video_description": "Skildre for dei med nedsett høyrsel eller redusert syn", "upload_modal.analyzing_picture": "Analyserer bilete…", "upload_modal.apply": "Bruk", diff --git a/app/javascript/mastodon/locales/no.json b/app/javascript/mastodon/locales/no.json index 50da3bb2be..8da9853bee 100644 --- a/app/javascript/mastodon/locales/no.json +++ b/app/javascript/mastodon/locales/no.json @@ -89,7 +89,6 @@ "announcement.announcement": "Kunngjøring", "attachments_list.unprocessed": "(ubehandlet)", "audio.hide": "Skjul lyd", - "autosuggest_hashtag.per_week": "{count} per uke", "boost_modal.combo": "You kan trykke {combo} for å hoppe over dette neste gang", "bundle_column_error.copy_stacktrace": "Kopier feilrapport", "bundle_column_error.error.body": "Den forespurte siden kan ikke gjengis. Den kan skyldes en feil i vår kode eller et kompatibilitetsproblem med nettleseren.", @@ -146,22 +145,22 @@ "compose_form.lock_disclaimer": "Din konto er ikke {locked}. Hvem som helst kan følge deg og se dine private poster.", "compose_form.lock_disclaimer.lock": "låst", "compose_form.placeholder": "Hva har du på hjertet?", - "compose_form.poll.add_option": "Legg til et valg", + "compose_form.poll.add_option": "Legg til alternativ", "compose_form.poll.duration": "Avstemningens varighet", + "compose_form.poll.multiple": "Flervalg", "compose_form.poll.option_placeholder": "Valg {number}", "compose_form.poll.remove_option": "Fjern dette valget", + "compose_form.poll.single": "Velg en", "compose_form.poll.switch_to_multiple": "Endre avstemning til å tillate flere valg", "compose_form.poll.switch_to_single": "Endre avstemning til å tillate ett valg", + "compose_form.poll.type": "Stil", "compose_form.publish": "Publiser", "compose_form.publish_form": "Publiser", - "compose_form.publish_loud": "{publish}!", - "compose_form.save_changes": "Lagre endringer", - "compose_form.sensitive.hide": "{count, plural,one {Merk media som følsomt} other {Merk medier som følsomme}}", - "compose_form.sensitive.marked": "{count, plural,one {Mediet er merket som følsomt}other {Mediene er merket som følsomme}}", - "compose_form.sensitive.unmarked": "{count, plural,one {Mediet er ikke merket som følsomt}other {Mediene er ikke merket som følsomme}}", + "compose_form.reply": "Svar", + "compose_form.save_changes": "Oppdater", "compose_form.spoiler.marked": "Fjern innholdsvarsel", "compose_form.spoiler.unmarked": "Legg til innholdsvarsel", - "compose_form.spoiler_placeholder": "Skriv advarselen din her", + "compose_form.spoiler_placeholder": "Innholdsadvarsel (valgfritt)", "confirmation_modal.cancel": "Avbryt", "confirmations.block.block_and_report": "Blokker og rapporter", "confirmations.block.confirm": "Blokkèr", @@ -408,7 +407,6 @@ "navigation_bar.direct": "Private omtaler", "navigation_bar.discover": "Oppdag", "navigation_bar.domain_blocks": "Skjulte domener", - "navigation_bar.edit_profile": "Rediger profil", "navigation_bar.explore": "Utforsk", "navigation_bar.favourites": "Favoritter", "navigation_bar.filters": "Stilnede ord", @@ -525,14 +523,14 @@ "poll_button.add_poll": "Legg til en avstemning", "poll_button.remove_poll": "Fjern avstemningen", "privacy.change": "Juster synlighet", - "privacy.direct.long": "Post kun til nevnte brukere", - "privacy.direct.short": "Kun nevnte personer", - "privacy.private.long": "Post kun til følgere", - "privacy.private.short": "Kun følgere", - "privacy.public.long": "Synlig for alle", + "privacy.direct.long": "Alle nevnt i innlegget", + "privacy.direct.short": "Spesifikke folk", + "privacy.private.long": "Bare følgerne dine", + "privacy.private.short": "Følgere", + "privacy.public.long": "Alle på og utenfor Mastodon", "privacy.public.short": "Offentlig", - "privacy.unlisted.long": "Synlig for alle, men vises ikke i oppdagsfunksjoner", - "privacy.unlisted.short": "Uoppført", + "privacy.unlisted.long": "Færre algoritmiske fanfarer", + "privacy.unlisted.short": "Stille offentlig", "privacy_policy.last_updated": "Sist oppdatert {date}", "privacy_policy.title": "Personvernregler", "recommended": "Anbefalt", @@ -550,7 +548,9 @@ "relative_time.minutes": "{number}m", "relative_time.seconds": "{number}s", "relative_time.today": "i dag", + "reply_indicator.attachments": "{count, plural, one {# vedlegg} other {# vedlegg}}", "reply_indicator.cancel": "Avbryt", + "reply_indicator.poll": "Avstemming", "report.block": "Blokker", "report.block_explanation": "Du kommer ikke til å se innleggene deres. De vil ikke kunne se innleggene dine eller følge deg. De vil kunne se at de er blokkert.", "report.categories.legal": "Juridisk", @@ -714,10 +714,8 @@ "upload_error.poll": "Filopplasting er ikke tillatt for avstemninger.", "upload_form.audio_description": "Beskriv det for folk med hørselstap", "upload_form.description": "Beskriv for synshemmede", - "upload_form.description_missing": "Ingen beskrivelse lagt til", "upload_form.edit": "Rediger", "upload_form.thumbnail": "Endre miniatyrbilde", - "upload_form.undo": "Angre", "upload_form.video_description": "Beskriv det for folk med hørselstap eller synshemminger", "upload_modal.analyzing_picture": "Analyserer bildet …", "upload_modal.apply": "Bruk", diff --git a/app/javascript/mastodon/locales/oc.json b/app/javascript/mastodon/locales/oc.json index 1ecfbcaf06..8660a3bc05 100644 --- a/app/javascript/mastodon/locales/oc.json +++ b/app/javascript/mastodon/locales/oc.json @@ -80,7 +80,6 @@ "announcement.announcement": "Anóncia", "attachments_list.unprocessed": "(pas tractat)", "audio.hide": "Amagar àudio", - "autosuggest_hashtag.per_week": "{count} per setmana", "boost_modal.combo": "Podètz botar {combo} per passar aquò lo còp que ven", "bundle_column_error.copy_stacktrace": "Copiar senhalament d’avaria", "bundle_column_error.error.title": "Oh non !", @@ -131,22 +130,12 @@ "compose_form.lock_disclaimer": "Vòstre compte es pas {locked}. Tot lo mond pòt vos sègre e veire los estatuts reservats als seguidors.", "compose_form.lock_disclaimer.lock": "clavat", "compose_form.placeholder": "A de qué pensatz ?", - "compose_form.poll.add_option": "Ajustar una causida", "compose_form.poll.duration": "Durada del sondatge", - "compose_form.poll.option_placeholder": "Opcion {number}", - "compose_form.poll.remove_option": "Levar aquesta opcion", "compose_form.poll.switch_to_multiple": "Cambiar lo sondatge per permetre de causidas multiplas", "compose_form.poll.switch_to_single": "Cambiar lo sondatge per permetre una sola causida", - "compose_form.publish": "Publicar", "compose_form.publish_form": "Publicar", - "compose_form.publish_loud": "{publish} !", - "compose_form.save_changes": "Salvar los cambiaments", - "compose_form.sensitive.hide": "Marcar coma sensible", - "compose_form.sensitive.marked": "Lo mèdia es marcat coma sensible", - "compose_form.sensitive.unmarked": "Lo mèdia es pas marcat coma sensible", "compose_form.spoiler.marked": "Lo tèxte es rescondut jos l’avertiment", "compose_form.spoiler.unmarked": "Lo tèxte es pas rescondut", - "compose_form.spoiler_placeholder": "Escrivètz l’avertiment aquí", "confirmation_modal.cancel": "Anullar", "confirmations.block.block_and_report": "Blocar e senhalar", "confirmations.block.confirm": "Blocar", @@ -359,7 +348,6 @@ "navigation_bar.direct": "Mencions privadas", "navigation_bar.discover": "Trobar", "navigation_bar.domain_blocks": "Domenis resconduts", - "navigation_bar.edit_profile": "Modificar lo perfil", "navigation_bar.explore": "Explorar", "navigation_bar.favourites": "Favorits", "navigation_bar.filters": "Mots ignorats", @@ -457,14 +445,7 @@ "poll_button.add_poll": "Ajustar un sondatge", "poll_button.remove_poll": "Levar lo sondatge", "privacy.change": "Ajustar la confidencialitat del messatge", - "privacy.direct.long": "Mostrar pas qu’a las personas mencionadas", - "privacy.direct.short": "Sonque per las personas mencionadas", - "privacy.private.long": "Mostrar pas qu’a vòstres seguidors", - "privacy.private.short": "Sonque pels seguidors", - "privacy.public.long": "Visiblas per totes", "privacy.public.short": "Public", - "privacy.unlisted.long": "Visible per totes mas desactivat per las foncionalitats de descobèrta", - "privacy.unlisted.short": "Pas-listat", "privacy_policy.last_updated": "Darrièra actualizacion {date}", "privacy_policy.title": "Politica de confidencialitat", "refresh": "Actualizar", @@ -621,10 +602,8 @@ "upload_error.poll": "Lo mandadís de fichièr es pas autorizat pels sondatges.", "upload_form.audio_description": "Descriure per las personas amb pèrdas auditivas", "upload_form.description": "Descripcion pels mal vesents", - "upload_form.description_missing": "Cap de descripcion pas aponduda", "upload_form.edit": "Modificar", "upload_form.thumbnail": "Cambiar la vinheta", - "upload_form.undo": "Suprimir", "upload_form.video_description": "Descriure per las personas amb pèrdas auditivas o mal vesent", "upload_modal.analyzing_picture": "Analisi de l’imatge…", "upload_modal.apply": "Aplicar", diff --git a/app/javascript/mastodon/locales/pa.json b/app/javascript/mastodon/locales/pa.json index 132b695cda..de085cf985 100644 --- a/app/javascript/mastodon/locales/pa.json +++ b/app/javascript/mastodon/locales/pa.json @@ -67,9 +67,7 @@ "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.lock": "ਲਾਕ ਹੈ", "compose_form.placeholder": "What is on your mind?", - "compose_form.publish": "ਪ੍ਰਕਾਸ਼ਨ ਕਰੋ", "compose_form.publish_form": "Publish", - "compose_form.save_changes": "ਤਬਦੀਲੀਆਂ ਸਾਂਭੋ", "compose_form.spoiler.marked": "ਸਮੱਗਰੀ ਚੇਤਾਵਨੀ ਨੂੰ ਹਟਾਓ", "compose_form.spoiler.unmarked": "ਸਮੱਗਰੀ ਬਾਰੇ ਚੇਤਾਵਨੀ ਜੋੜੋ", "confirmation_modal.cancel": "ਰੱਦ ਕਰੋ", @@ -188,7 +186,6 @@ "navigation_bar.direct": "ਨਿੱਜੀ ਜ਼ਿਕਰ", "navigation_bar.discover": "ਖੋਜ", "navigation_bar.domain_blocks": "ਪਾਬੰਦੀ ਲਾਏ ਡੋਮੇਨ", - "navigation_bar.edit_profile": "ਪਰੋਫਾਈਲ ਨੂੰ ਸੋਧੋ", "navigation_bar.explore": "ਪੜਚੋਲ ਕਰੋ", "navigation_bar.favourites": "ਮਨਪਸੰਦ", "navigation_bar.follow_requests": "ਫ਼ਾਲੋ ਦੀਆਂ ਬੇਨਤੀਆਂ", @@ -238,8 +235,6 @@ "poll.refresh": "ਤਾਜ਼ਾ ਕਰੋ", "poll.vote": "ਵੋਟ ਪਾਓ", "privacy.change": "ਪੋਸਟ ਦੀ ਪਰਦੇਦਾਰੀ ਨੂੰ ਬਦਲੋ", - "privacy.direct.short": "ਸਿੱਧਾ ਲੋਕਾਂ ਦਾ ਜ਼ਿਕਰ ਕਰੋ", - "privacy.private.short": "ਸਿਰਫ਼ ਫ਼ਾਲੋਅਰ", "privacy.public.short": "ਜਨਤਕ", "privacy_policy.title": "ਪਰਦੇਦਾਰੀ ਨੀਤੀ", "refresh": "ਤਾਜ਼ਾ ਕਰੋ", @@ -327,7 +322,6 @@ "upload_form.audio_description": "ਬੋਲ਼ੇ ਜਾਂ ਸੁਣਨ ਵਿੱਚ ਮੁਸ਼ਕਿਲ ਵਾਲੇ ਲੋਕਾਂ ਲਈ ਵੇਰਵੇ", "upload_form.description": "ਅੰਨ੍ਹੇ ਜਾਂ ਦੇਖਣ ਲਈ ਮੁਸ਼ਕਲ ਵਾਲੇ ਲੋਕਾਂ ਲਈ ਵੇਰਵੇ", "upload_form.edit": "ਸੋਧ", - "upload_form.undo": "ਹਟਾਓ", "upload_form.video_description": "ਬੋਲ਼ੇ, ਸੁਣਨ ਵਿੱਚ ਮੁਸ਼ਕਿਲ, ਅੰਨ੍ਹੇ ਜਾਂ ਘੱਟ ਨਿਗ੍ਹਾ ਵਾਲੇ ਲੋਕਾਂ ਲਈ ਵੇਰਵਾ", "upload_modal.apply": "ਲਾਗੂ ਕਰੋ", "upload_modal.applying": "ਲਾਗੂ ਕੀਤਾ ਜਾ ਰਿਹਾ ਹੈ…", diff --git a/app/javascript/mastodon/locales/pl.json b/app/javascript/mastodon/locales/pl.json index 35dbc6661d..2eaeeaab55 100644 --- a/app/javascript/mastodon/locales/pl.json +++ b/app/javascript/mastodon/locales/pl.json @@ -89,7 +89,6 @@ "announcement.announcement": "Ogłoszenie", "attachments_list.unprocessed": "(nieprzetworzone)", "audio.hide": "Ukryj dźwięk", - "autosuggest_hashtag.per_week": "{count} co tydzień", "boost_modal.combo": "Naciśnij {combo}, aby pominąć to następnym razem", "bundle_column_error.copy_stacktrace": "Skopiuj raport o błędzie", "bundle_column_error.error.body": "Nie można zrenderować żądanej strony. Może to być spowodowane błędem w naszym kodzie lub problemami z kompatybilnością przeglądarki.", @@ -148,20 +147,19 @@ "compose_form.placeholder": "Co chodzi ci po głowie?", "compose_form.poll.add_option": "Dodaj opcję", "compose_form.poll.duration": "Czas trwania głosowania", + "compose_form.poll.multiple": "Wielokrotny wybór", "compose_form.poll.option_placeholder": "Opcja {number}", "compose_form.poll.remove_option": "Usuń tę opcję", + "compose_form.poll.single": "Wybierz jedną", "compose_form.poll.switch_to_multiple": "Pozwól na wybranie wielu opcji", "compose_form.poll.switch_to_single": "Pozwól na wybranie tylko jednej opcji", + "compose_form.poll.type": "Styl", "compose_form.publish": "Opublikuj", "compose_form.publish_form": "Opublikuj", - "compose_form.publish_loud": "{publish}!", - "compose_form.save_changes": "Zapisz zmiany", - "compose_form.sensitive.hide": "{count, plural, one {Oznacz treść multimedialną jako wrażliwą} other {Oznacz treści multimedialne jako wrażliwe}}", - "compose_form.sensitive.marked": "{count, plural, one {Treść multimedialna jest oznaczona jako wrażliwa} other {Treści multimedialne są oznaczone jako wrażliwe}}", - "compose_form.sensitive.unmarked": "{count, plural, one {Treść multimedialna nie jest oznaczona jako wrażliwa} other {Treści multimedialne nie są oznaczone jako wrażliwe}}", + "compose_form.reply": "Odpowiedz", + "compose_form.save_changes": "Aktualizuj", "compose_form.spoiler.marked": "Usuń ostrzeżenie o treści", "compose_form.spoiler.unmarked": "Dodaj ostrzeżenie o treści", - "compose_form.spoiler_placeholder": "Wpisz ostrzeżenie tutaj", "confirmation_modal.cancel": "Anuluj", "confirmations.block.block_and_report": "Zablokuj i zgłoś", "confirmations.block.confirm": "Zablokuj", @@ -408,7 +406,6 @@ "navigation_bar.direct": "Prywatne wzmianki", "navigation_bar.discover": "Odkrywaj", "navigation_bar.domain_blocks": "Ukryte domeny", - "navigation_bar.edit_profile": "Edytuj profil", "navigation_bar.explore": "Odkrywaj", "navigation_bar.favourites": "Ulubione", "navigation_bar.filters": "Wyciszone słowa", @@ -526,14 +523,11 @@ "poll_button.add_poll": "Dodaj głosowanie", "poll_button.remove_poll": "Usuń głosowanie", "privacy.change": "Dostosuj widoczność wpisów", - "privacy.direct.long": "Widoczny tylko dla wspomnianych", - "privacy.direct.short": "Tylko wspomniane osoby", - "privacy.private.long": "Widoczny tylko dla osób, które Cię obserwują", - "privacy.private.short": "Tylko obserwujący", - "privacy.public.long": "Widoczne dla każdego", + "privacy.direct.short": "Konkretni ludzie", + "privacy.private.long": "Tylko ci, którzy cię obserwują", + "privacy.private.short": "Obserwujący", + "privacy.public.long": "Ktokolwiek na i poza Mastodonem", "privacy.public.short": "Publiczny", - "privacy.unlisted.long": "Widoczne dla każdego, z wyłączeniem funkcji odkrywania", - "privacy.unlisted.short": "Niewidoczny", "privacy_policy.last_updated": "Data ostatniej aktualizacji: {date}", "privacy_policy.title": "Polityka prywatności", "recommended": "Zalecane", @@ -715,10 +709,8 @@ "upload_error.poll": "Dołączanie plików nie dozwolone z głosowaniami.", "upload_form.audio_description": "Opisz dla osób niesłyszących i niedosłyszących", "upload_form.description": "Wprowadź opis dla niewidomych i niedowidzących", - "upload_form.description_missing": "Nie dodano opisu", "upload_form.edit": "Edytuj", "upload_form.thumbnail": "Zmień miniaturę", - "upload_form.undo": "Usuń", "upload_form.video_description": "Opisz dla osób niesłyszących, niedosłyszących, niewidomych i niedowidzących", "upload_modal.analyzing_picture": "Analizowanie obrazu…", "upload_modal.apply": "Zastosuj", diff --git a/app/javascript/mastodon/locales/pt-BR.json b/app/javascript/mastodon/locales/pt-BR.json index b8e18e1229..bb009239d4 100644 --- a/app/javascript/mastodon/locales/pt-BR.json +++ b/app/javascript/mastodon/locales/pt-BR.json @@ -89,7 +89,6 @@ "announcement.announcement": "Comunicados", "attachments_list.unprocessed": "(não processado)", "audio.hide": "Ocultar áudio", - "autosuggest_hashtag.per_week": "{count} por semana", "boost_modal.combo": "Pressione {combo} para pular isso na próxima vez", "bundle_column_error.copy_stacktrace": "Copiar relatório do erro", "bundle_column_error.error.body": "A página solicitada não pôde ser renderizada. Pode ser devido a um erro no nosso código, ou um problema de compatibilidade do seu navegador.", @@ -148,20 +147,20 @@ "compose_form.placeholder": "No que você está pensando?", "compose_form.poll.add_option": "Adicionar opção", "compose_form.poll.duration": "Duração da enquete", + "compose_form.poll.multiple": "Múltipla escolha", "compose_form.poll.option_placeholder": "Opção {number}", - "compose_form.poll.remove_option": "Remover opção", + "compose_form.poll.remove_option": "Remover esta opção", + "compose_form.poll.single": "Escolha uma", "compose_form.poll.switch_to_multiple": "Permitir múltiplas escolhas", "compose_form.poll.switch_to_single": "Opção única", - "compose_form.publish": "Publicar", + "compose_form.poll.type": "Estilo", + "compose_form.publish": "Publicação", "compose_form.publish_form": "Publicar", - "compose_form.publish_loud": "{publish}!", - "compose_form.save_changes": "Salvar alterações", - "compose_form.sensitive.hide": "{count, plural, one {Marcar mídia como sensível} other {Marcar mídias como sensível}}", - "compose_form.sensitive.marked": "{count, plural, one {Mídia marcada como sensível} other {Mídias marcadas como sensível}}", - "compose_form.sensitive.unmarked": "{count, plural, one {Mídia não está marcada como sensível} other {Mídias não estão marcadas como sensível}}", + "compose_form.reply": "Resposta", + "compose_form.save_changes": "Atualização", "compose_form.spoiler.marked": "Com Aviso de Conteúdo", "compose_form.spoiler.unmarked": "Sem Aviso de Conteúdo", - "compose_form.spoiler_placeholder": "Aviso de Conteúdo aqui", + "compose_form.spoiler_placeholder": "Aviso de conteúdo (opcional)", "confirmation_modal.cancel": "Cancelar", "confirmations.block.block_and_report": "Bloquear e denunciar", "confirmations.block.confirm": "Bloquear", @@ -408,7 +407,6 @@ "navigation_bar.direct": "Menções privadas", "navigation_bar.discover": "Descobrir", "navigation_bar.domain_blocks": "Domínios bloqueados", - "navigation_bar.edit_profile": "Editar perfil", "navigation_bar.explore": "Explorar", "navigation_bar.favourites": "Favoritos", "navigation_bar.filters": "Palavras filtradas", @@ -526,14 +524,12 @@ "poll_button.add_poll": "Adicionar enquete", "poll_button.remove_poll": "Remover enquete", "privacy.change": "Alterar privacidade do toot", - "privacy.direct.long": "Postar só para usuários mencionados", - "privacy.direct.short": "Apenas pessoas mencionadas", - "privacy.private.long": "Postar só para seguidores", - "privacy.private.short": "Apenas seguidores", - "privacy.public.long": "Visível para todos", + "privacy.direct.long": "Todos mencionados na publicação", + "privacy.direct.short": "Pessoas específicas", + "privacy.private.long": "Apenas seus seguidores", + "privacy.private.short": "Seguidores", + "privacy.public.long": "Qualquer um dentro ou fora do Mastodon", "privacy.public.short": "Público", - "privacy.unlisted.long": "Visível para todos, mas desativou os recursos de descoberta", - "privacy.unlisted.short": "Não-listado", "privacy_policy.last_updated": "Atualizado {date}", "privacy_policy.title": "Política de privacidade", "recommended": "Recomendado", @@ -552,6 +548,7 @@ "relative_time.seconds": "{number}s", "relative_time.today": "hoje", "reply_indicator.cancel": "Cancelar", + "reply_indicator.poll": "Enquete", "report.block": "Bloquear", "report.block_explanation": "Você não verá suas publicações. Ele não poderá ver suas publicações ou segui-lo, e será capaz de perceber que está bloqueado.", "report.categories.legal": "Jurídico", @@ -715,10 +712,8 @@ "upload_error.poll": "Mídias não podem ser anexadas em toots com enquetes.", "upload_form.audio_description": "Descrever para deficientes auditivos", "upload_form.description": "Descrever para deficientes visuais", - "upload_form.description_missing": "Sem descrição", "upload_form.edit": "Editar", "upload_form.thumbnail": "Alterar miniatura", - "upload_form.undo": "Excluir", "upload_form.video_description": "Descrever para deficientes auditivos ou visuais", "upload_modal.analyzing_picture": "Analisando imagem…", "upload_modal.apply": "Aplicar", diff --git a/app/javascript/mastodon/locales/pt-PT.json b/app/javascript/mastodon/locales/pt-PT.json index a6d0ffee9a..22bb1bbfd2 100644 --- a/app/javascript/mastodon/locales/pt-PT.json +++ b/app/javascript/mastodon/locales/pt-PT.json @@ -89,7 +89,6 @@ "announcement.announcement": "Anúncio", "attachments_list.unprocessed": "(não processado)", "audio.hide": "Ocultar áudio", - "autosuggest_hashtag.per_week": "{count} por semana", "boost_modal.combo": "Pode clicar {combo} para não voltar a ver", "bundle_column_error.copy_stacktrace": "Copiar relatório de erros", "bundle_column_error.error.body": "A página solicitada não pôde ser sintetizada. Isto pode ser devido a uma falha no nosso código ou a um problema de compatibilidade com o navegador.", @@ -146,22 +145,22 @@ "compose_form.lock_disclaimer": "A sua conta não é {locked}. Qualquer pessoa pode segui-lo e ver as publicações direcionadas apenas a seguidores.", "compose_form.lock_disclaimer.lock": "fechada", "compose_form.placeholder": "Em que está a pensar?", - "compose_form.poll.add_option": "Adicionar uma opção", + "compose_form.poll.add_option": "Adicionar opção", "compose_form.poll.duration": "Duração do inquérito", + "compose_form.poll.multiple": "Escolha múltipla", "compose_form.poll.option_placeholder": "Opção {number}", "compose_form.poll.remove_option": "Eliminar esta opção", + "compose_form.poll.single": "Escolha uma", "compose_form.poll.switch_to_multiple": "Alterar o inquérito para permitir várias respostas", "compose_form.poll.switch_to_single": "Alterar o inquérito para permitir uma única resposta", + "compose_form.poll.type": "Estilo", "compose_form.publish": "Publicar", "compose_form.publish_form": "Publicar", - "compose_form.publish_loud": "{publish}!", - "compose_form.save_changes": "Guardar alterações", - "compose_form.sensitive.hide": "Marcar media como sensível", - "compose_form.sensitive.marked": "Media marcada como sensível", - "compose_form.sensitive.unmarked": "Media não está marcada como sensível", + "compose_form.reply": "Responder", + "compose_form.save_changes": "Atualizar", "compose_form.spoiler.marked": "Texto escondido atrás de aviso", "compose_form.spoiler.unmarked": "Juntar um aviso de conteúdo", - "compose_form.spoiler_placeholder": "Escreva o seu aviso aqui", + "compose_form.spoiler_placeholder": "Aviso de conteúdo (opcional)", "confirmation_modal.cancel": "Cancelar", "confirmations.block.block_and_report": "Bloquear e Denunciar", "confirmations.block.confirm": "Bloquear", @@ -408,7 +407,6 @@ "navigation_bar.direct": "Menções privadas", "navigation_bar.discover": "Descobrir", "navigation_bar.domain_blocks": "Domínios escondidos", - "navigation_bar.edit_profile": "Editar perfil", "navigation_bar.explore": "Explorar", "navigation_bar.favourites": "Favoritos", "navigation_bar.filters": "Palavras silenciadas", @@ -526,14 +524,15 @@ "poll_button.add_poll": "Adicionar votação", "poll_button.remove_poll": "Remover sondagem", "privacy.change": "Ajustar a privacidade da publicação", - "privacy.direct.long": "Apenas para utilizadores mencionados", - "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", + "privacy.direct.long": "Todos os mencionados na publicação", + "privacy.direct.short": "Pessoas específicas", + "privacy.private.long": "Apenas os seus seguidores", + "privacy.private.short": "Seguidores", + "privacy.public.long": "Qualquer pessoa no Mastodon ou não", "privacy.public.short": "Público", - "privacy.unlisted.long": "Visível para todos, mas não incluir em funcionalidades de divulgação", - "privacy.unlisted.short": "Não listar", + "privacy.unlisted.additional": "Isto comporta-se exatamente como público, exceto que a publicação não aparecerá em feeds nem em etiquetas, explorar ou pesquisa Mastodon, mesmo que tenha optado por isso na sua conta.", + "privacy.unlisted.long": "Menos fanfarras algorítmicas", + "privacy.unlisted.short": "Público silencioso", "privacy_policy.last_updated": "Última atualização em {date}", "privacy_policy.title": "Política de privacidade", "recommended": "Recomendado", @@ -551,7 +550,9 @@ "relative_time.minutes": "{number}m", "relative_time.seconds": "{number}s", "relative_time.today": "hoje", + "reply_indicator.attachments": "{count, plural, one {# anexo} other {# anexos}}", "reply_indicator.cancel": "Cancelar", + "reply_indicator.poll": "Sondagem", "report.block": "Bloquear", "report.block_explanation": "Não verá as publicações deles. Eles não serão capazes de ver suas publicações ou de o seguir. Eles vão conseguir saber que estão bloqueados.", "report.categories.legal": "Legal", @@ -715,10 +716,8 @@ "upload_error.poll": "O carregamento de ficheiros não é permitido em sondagens.", "upload_form.audio_description": "Descreva para pessoas com diminuição da acuidade auditiva", "upload_form.description": "Descreva para pessoas com diminuição da acuidade visual", - "upload_form.description_missing": "Nenhuma descrição adicionada", "upload_form.edit": "Editar", "upload_form.thumbnail": "Alterar miniatura", - "upload_form.undo": "Eliminar", "upload_form.video_description": "Descreva para pessoas com diminuição da acuidade auditiva ou visual", "upload_modal.analyzing_picture": "A analizar imagem…", "upload_modal.apply": "Aplicar", diff --git a/app/javascript/mastodon/locales/ro.json b/app/javascript/mastodon/locales/ro.json index 88dbfa4b8e..e6d881a986 100644 --- a/app/javascript/mastodon/locales/ro.json +++ b/app/javascript/mastodon/locales/ro.json @@ -76,7 +76,6 @@ "announcement.announcement": "Anunț", "attachments_list.unprocessed": "(neprocesate)", "audio.hide": "Ascunde audio", - "autosuggest_hashtag.per_week": "{count} pe săptămână", "boost_modal.combo": "Poți apăsa {combo} pentru a sări peste asta data viitoare", "bundle_column_error.copy_stacktrace": "Copiază raportul de eroare", "bundle_column_error.error.body": "Pagina solicitată nu a putut fi randată. Ar putea fi cauzată de o eroare în codul nostru sau de o problemă de compatibilitate cu browser-ul.", @@ -131,22 +130,12 @@ "compose_form.lock_disclaimer": "Contul tău nu este {locked}. Oricine se poate abona la tine pentru a îți vedea postările numai pentru abonați.", "compose_form.lock_disclaimer.lock": "privat", "compose_form.placeholder": "La ce te gândești?", - "compose_form.poll.add_option": "Adaugă o opțiune", "compose_form.poll.duration": "Durata sondajului", - "compose_form.poll.option_placeholder": "Opțiunea {number}", - "compose_form.poll.remove_option": "Elimină acestă opțiune", "compose_form.poll.switch_to_multiple": "Modifică sondajul pentru a permite mai multe opțiuni", "compose_form.poll.switch_to_single": "Modifică sondajul pentru a permite o singură opțiune", - "compose_form.publish": "Publică", "compose_form.publish_form": "Publică", - "compose_form.publish_loud": "{publish}!", - "compose_form.save_changes": "Salvează modificările", - "compose_form.sensitive.hide": "{count, plural, one {Marchează conținutul media ca fiind sensibil} few {Marchează conținuturile media ca fiind sensibile} other {Marchează conținuturile media ca fiind sensibile}}", - "compose_form.sensitive.marked": "{count, plural, one {Conținutul media este marcat ca fiind sensibil} other {Conținuturile media sunt marcate ca fiind sensibile}}", - "compose_form.sensitive.unmarked": "{count, plural, one {Conținutul media nu este marcat ca fiind sensibil} other {Conținuturile media nu sunt marcate ca fiind sensibile}}", "compose_form.spoiler.marked": "Elimină avertismentul privind conținutul", "compose_form.spoiler.unmarked": "Adaugă un avertisment privind conținutul", - "compose_form.spoiler_placeholder": "Scrie avertismentul aici", "confirmation_modal.cancel": "Anulează", "confirmations.block.block_and_report": "Blochează și raportează", "confirmations.block.confirm": "Blochează", @@ -365,7 +354,6 @@ "navigation_bar.compose": "Compune o nouă postare", "navigation_bar.discover": "Descoperă", "navigation_bar.domain_blocks": "Domenii blocate", - "navigation_bar.edit_profile": "Modifică profilul", "navigation_bar.explore": "Explorează", "navigation_bar.filters": "Cuvinte ignorate", "navigation_bar.follow_requests": "Cereri de abonare", @@ -461,14 +449,7 @@ "poll_button.add_poll": "Adaugă un sondaj", "poll_button.remove_poll": "Elimină sondajul", "privacy.change": "Modifică confidențialitatea postării", - "privacy.direct.long": "Vizibil doar pentru utilizatorii menționați", - "privacy.direct.short": "Doar persoane menționate", - "privacy.private.long": "Vizibil doar pentru abonați", - "privacy.private.short": "Doar abonați", - "privacy.public.long": "Vizibil pentru toți", "privacy.public.short": "Public", - "privacy.unlisted.long": "Vizibil pentru toți dar fără funcții de descoperire", - "privacy.unlisted.short": "Nelistat", "privacy_policy.last_updated": "Ultima actualizare în data de {date}", "privacy_policy.title": "Politică de confidențialitate", "refresh": "Reîncarcă", @@ -641,10 +622,8 @@ "upload_error.poll": "Încărcarea fișierului nu este permisă cu sondaje.", "upload_form.audio_description": "Descrie pentru persoanele cu deficiență a auzului", "upload_form.description": "Adaugă o descriere pentru persoanele cu deficiențe de vedere", - "upload_form.description_missing": "Nicio descriere adăugată", "upload_form.edit": "Modifică", "upload_form.thumbnail": "Schimbă miniatura", - "upload_form.undo": "Șterge", "upload_form.video_description": "Adaugă o descriere pentru persoanele cu deficiențe vizuale sau auditive", "upload_modal.analyzing_picture": "Se analizează imaginea…", "upload_modal.apply": "Aplică", diff --git a/app/javascript/mastodon/locales/ru.json b/app/javascript/mastodon/locales/ru.json index a8ff90cc00..eefa9c7298 100644 --- a/app/javascript/mastodon/locales/ru.json +++ b/app/javascript/mastodon/locales/ru.json @@ -89,7 +89,6 @@ "announcement.announcement": "Объявление", "attachments_list.unprocessed": "(не обработан)", "audio.hide": "Скрыть аудио", - "autosuggest_hashtag.per_week": "{count} / неделю", "boost_modal.combo": "{combo}, чтобы пропустить это в следующий раз", "bundle_column_error.copy_stacktrace": "Скопировать отчет об ошибке", "bundle_column_error.error.body": "Запрошенная страница не может быть отображена. Это может быть вызвано ошибкой в нашем коде или проблемой совместимости браузера.", @@ -146,22 +145,12 @@ "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_single": "Переключить в режим выбора одного ответа", - "compose_form.publish": "Опубликовать", "compose_form.publish_form": "Опубликовать", - "compose_form.publish_loud": "{publish}!", - "compose_form.save_changes": "Сохранить", - "compose_form.sensitive.hide": "{count, plural, one {Отметить медифайл как деликатный} other {Отметить медифайлы как деликатные}}", - "compose_form.sensitive.marked": "Медиа{count, plural, =1 {файл отмечен} other {файлы отмечены}} как «деликатного характера»", - "compose_form.sensitive.unmarked": "Медиа{count, plural, =1 {файл не отмечен} other {файлы не отмечены}} как «деликатного характера»", "compose_form.spoiler.marked": "Текст скрыт за предупреждением", "compose_form.spoiler.unmarked": "Текст не скрыт", - "compose_form.spoiler_placeholder": "Текст предупреждения", "confirmation_modal.cancel": "Отмена", "confirmations.block.block_and_report": "Заблокировать и пожаловаться", "confirmations.block.confirm": "Заблокировать", @@ -408,7 +397,6 @@ "navigation_bar.direct": "Личные упоминания", "navigation_bar.discover": "Изучайте", "navigation_bar.domain_blocks": "Скрытые домены", - "navigation_bar.edit_profile": "Изменить профиль", "navigation_bar.explore": "Обзор", "navigation_bar.favourites": "Избранные", "navigation_bar.filters": "Игнорируемые слова", @@ -526,14 +514,7 @@ "poll_button.add_poll": "Добавить опрос", "poll_button.remove_poll": "Удалить опрос", "privacy.change": "Изменить видимость поста", - "privacy.direct.long": "Показать только упомянутым", - "privacy.direct.short": "Только упомянутые", - "privacy.private.long": "Показать только подписчикам", - "privacy.private.short": "Для подписчиков", - "privacy.public.long": "Виден всем", "privacy.public.short": "Публичный", - "privacy.unlisted.long": "Виден всем, но не через функции обзора", - "privacy.unlisted.short": "Скрытый", "privacy_policy.last_updated": "Последнее обновление {date}", "privacy_policy.title": "Политика конфиденциальности", "recommended": "Рекомендуется", @@ -715,10 +696,8 @@ "upload_error.poll": "К опросам нельзя прикреплять файлы.", "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_modal.analyzing_picture": "Обработка изображения…", "upload_modal.apply": "Применить", diff --git a/app/javascript/mastodon/locales/sa.json b/app/javascript/mastodon/locales/sa.json index 051ec5d6f8..469930c3ed 100644 --- a/app/javascript/mastodon/locales/sa.json +++ b/app/javascript/mastodon/locales/sa.json @@ -77,7 +77,6 @@ "announcement.announcement": "उद्घोषणा", "attachments_list.unprocessed": "(अप्रकृतम्)", "audio.hide": "ध्वनिं प्रच्छादय", - "autosuggest_hashtag.per_week": "{count} प्रतिसप्ताहे", "boost_modal.combo": "{combo} अत्र स्प्रष्टुं शक्यते, त्यक्तुमेतमन्यस्मिन् समये", "bundle_column_error.copy_stacktrace": "त्रुट्यावेदनं प्रतिलिपिङ्कुरु", "bundle_column_error.error.body": "अनुरोधितं पृष्ठं प्रतिपादयितुं न शक्यते। अस्माकं कोडि दोषस्य कारणेन, अथवा ब्राउजर् संगततायास्समस्यायाः कारणेन भवितुमर्हति।", @@ -129,22 +128,12 @@ "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_single": "मतदानं परिवर्तयित्वा निर्विकल्पमतदानं क्रियताम्", - "compose_form.publish": "प्रकाशीकुरु", "compose_form.publish_form": "प्रकाशीकुरु", - "compose_form.publish_loud": "{publish}!", - "compose_form.save_changes": "परिवर्तनानि रक्ष", - "compose_form.sensitive.hide": "संवेदनशीलसामग्रीत्यङ्यताम्", - "compose_form.sensitive.marked": "संवेदनशीलसामग्रीत्यङ्कितम्", - "compose_form.sensitive.unmarked": "संवेदनशीलसामग्रीति नाङ्कितम्", "compose_form.spoiler.marked": "प्रच्छान्नाक्षरं विद्यते", "compose_form.spoiler.unmarked": "अप्रच्छन्नाक्षरं विद्यते", - "compose_form.spoiler_placeholder": "प्रत्यादेशस्ते लिख्यताम्", "confirmation_modal.cancel": "नश्यताम्", "confirmations.block.block_and_report": "अवरुध्य आविद्यताम्", "confirmations.block.confirm": "निषेधः", @@ -357,7 +346,6 @@ "navigation_bar.direct": "गोपनीयरूपेण उल्लिखितानि", "navigation_bar.discover": "आविष्कुरु", "navigation_bar.domain_blocks": "Hidden domains", - "navigation_bar.edit_profile": "प्रोफैलं सम्पाद्यताम्", "navigation_bar.explore": "अन्विच्छ", "navigation_bar.filters": "मूकीकृतानि पदानि", "navigation_bar.follow_requests": "अनुसरणानुरोधाः", @@ -453,14 +441,7 @@ "poll_button.add_poll": "निर्वाचनं योजय", "poll_button.remove_poll": "निर्वाचनं मार्जय", "privacy.change": "पत्रस्य गोपनीयतां परिवर्तय", - "privacy.direct.long": "केवलमुल्लिखितोभोक्तृभ्यो दृश्यते", - "privacy.direct.short": "Direct", - "privacy.private.long": "केवलं येऽनुसरन्ति त्वां तेभ्यो दृश्यते", - "privacy.private.short": "Followers-only", - "privacy.public.long": "सर्वेभ्यो दृश्यते", "privacy.public.short": "सार्वजनिकम्", - "privacy.unlisted.long": "सर्वेभ्यो दृश्यते किन्तु आविष्कारविशेषताभ्योऽन्तरभूतं नास्ति", - "privacy.unlisted.short": "असूचीकृतम्", "privacy_policy.last_updated": "अन्तिमवारं परिवर्तितम् {date}", "privacy_policy.title": "गोपनीयतानीतिः", "refresh": "नवीकुरु", @@ -572,7 +553,6 @@ "trends.counter_by_accounts": "{count, plural, one {{counter} person} other {{counter} people}} in the past {days, plural, one {day} other {# days}}", "upload_form.audio_description": "Describe for people with hearing loss", "upload_form.description": "Describe for the visually impaired", - "upload_form.undo": "मार्जय", "upload_form.video_description": "Describe for people with hearing loss or visual impairment", "upload_progress.label": "Uploading…" } diff --git a/app/javascript/mastodon/locales/sc.json b/app/javascript/mastodon/locales/sc.json index 89e951f77d..90b663aea7 100644 --- a/app/javascript/mastodon/locales/sc.json +++ b/app/javascript/mastodon/locales/sc.json @@ -60,7 +60,6 @@ "alert.unexpected.title": "Oh!", "announcement.announcement": "Annùntziu", "audio.hide": "Cua s'àudio", - "autosuggest_hashtag.per_week": "{count} a sa chida", "boost_modal.combo": "Podes incarcare {combo} pro brincare custu sa borta chi benit", "bundle_column_error.error.title": "Oh, no!", "bundle_column_error.network.title": "Faddina de connessione", @@ -100,22 +99,12 @@ "compose_form.lock_disclaimer": "Su contu tuo no est {locked}. Cale si siat persone ti podet sighire pro bìdere is messàgios tuos chi imbies a sa gente chi ti sighit.", "compose_form.lock_disclaimer.lock": "blocadu", "compose_form.placeholder": "A ite ses pensende?", - "compose_form.poll.add_option": "Agiunghe unu sèberu", "compose_form.poll.duration": "Longària de su sondàgiu", - "compose_form.poll.option_placeholder": "Optzione {number}", - "compose_form.poll.remove_option": "Boga custa optzione", "compose_form.poll.switch_to_multiple": "Muda su sondàgiu pro permìtere multi-optziones", "compose_form.poll.switch_to_single": "Muda su sondàgiu pro permìtere un'optzione isceti", - "compose_form.publish": "Pùblica", "compose_form.publish_form": "Publish", - "compose_form.publish_loud": "{publish}!", - "compose_form.save_changes": "Sarva is modìficas", - "compose_form.sensitive.hide": "{count, plural, one {Marca elementu multimediale comente a sensìbile} other {Marca elementos multimediales comente sensìbiles}}", - "compose_form.sensitive.marked": "{count, plural, one {Elementu multimediale marcadu comente a sensìbile} other {Elementos multimediales marcados comente a sensìbiles}}", - "compose_form.sensitive.unmarked": "{count, plural, one {Elementu multimediale non marcadu comente a sensìbile} other {Elementos multimediales non marcados comente a sensìbiles}}", "compose_form.spoiler.marked": "Boga avisu de cuntenutu", "compose_form.spoiler.unmarked": "Agiunghe avisu de cuntenutu", - "compose_form.spoiler_placeholder": "Iscrie s'avisu tuo inoghe", "confirmation_modal.cancel": "Annulla", "confirmations.block.block_and_report": "Bloca e signala", "confirmations.block.confirm": "Bloca", @@ -287,7 +276,6 @@ "navigation_bar.compose": "Cumpone una publicatzione noa", "navigation_bar.discover": "Iscoberi", "navigation_bar.domain_blocks": "Domìnios blocados", - "navigation_bar.edit_profile": "Modìfica profilu", "navigation_bar.filters": "Faeddos a sa muda", "navigation_bar.follow_requests": "Rechestas de sighidura", "navigation_bar.follows_and_followers": "Gente chi sighis e sighiduras", @@ -364,12 +352,7 @@ "poll_button.add_poll": "Agiunghe unu sondàgiu", "poll_button.remove_poll": "Cantzella su sondàgiu", "privacy.change": "Modìfica s'istadu de riservadesa", - "privacy.direct.long": "Visìbile isceti pro is persones mentovadas", - "privacy.direct.short": "Direct", - "privacy.private.long": "Visìbile isceti pro chie ti sighit", - "privacy.private.short": "Followers-only", "privacy.public.short": "Pùblicu", - "privacy.unlisted.short": "Esclùidu de sa lista", "recommended": "Cussigiadu", "refresh": "Atualiza", "regeneration_indicator.label": "Carrighende…", @@ -473,7 +456,6 @@ "upload_form.description": "Descritzione pro persones cun problemas visuales", "upload_form.edit": "Modìfica", "upload_form.thumbnail": "Càmbia sa miniadura", - "upload_form.undo": "Cantzella", "upload_form.video_description": "Descritzione pro persones cun pèrdida auditiva o problemas visuales", "upload_modal.analyzing_picture": "Analizende immàgine…", "upload_modal.apply": "Àplica", diff --git a/app/javascript/mastodon/locales/sco.json b/app/javascript/mastodon/locales/sco.json index 0378cd2926..b7563022a9 100644 --- a/app/javascript/mastodon/locales/sco.json +++ b/app/javascript/mastodon/locales/sco.json @@ -74,7 +74,6 @@ "announcement.announcement": "Annooncement", "attachments_list.unprocessed": "(No processed)", "audio.hide": "Stow audio", - "autosuggest_hashtag.per_week": "{count} a week", "boost_modal.combo": "Ye kin chap {combo} tae dingie this neist tim", "bundle_column_error.copy_stacktrace": "Copy error report", "bundle_column_error.error.body": "The requestit page cuidnae be rennert. Hit cuid be doon tae a bug in wir code, or a brooser compatability issue.", @@ -125,22 +124,12 @@ "compose_form.lock_disclaimer": "Yer accoont isnae {locked}. Awbody kin follae ye for tae luik at yer follaer-ainly posts.", "compose_form.lock_disclaimer.lock": "lockit", "compose_form.placeholder": "Whit's on yer mind?", - "compose_form.poll.add_option": "Pit in a chyce", "compose_form.poll.duration": "Poll lenth", - "compose_form.poll.option_placeholder": "Chyce {number}", - "compose_form.poll.remove_option": "Tak oot this chyce", "compose_form.poll.switch_to_multiple": "Chynge poll tae alloo multiple chyces", "compose_form.poll.switch_to_single": "Chynge poll tae alloo fir a single chyce", - "compose_form.publish": "Publish", "compose_form.publish_form": "Publish", - "compose_form.publish_loud": "{publish}!", - "compose_form.save_changes": "Save chynges", - "compose_form.sensitive.hide": "{count, plural, one {Mairk media as sensitive} other {Mairk media as sensitive}}", - "compose_form.sensitive.marked": "{count, plural, one {Media is mairkit as sensitive} other {Media is mairkit as sensitive}}", - "compose_form.sensitive.unmarked": "{count, plural, one {Media isnae mairkit as sensitive} other {Media isnae mairkit as sensitive}}", "compose_form.spoiler.marked": "Tak aff the content warnin", "compose_form.spoiler.unmarked": "Pit on a content warnin", - "compose_form.spoiler_placeholder": "Scrieve yer warnin in here", "confirmation_modal.cancel": "Stap", "confirmations.block.block_and_report": "Dingie & Clype", "confirmations.block.confirm": "Dingie", @@ -341,7 +330,6 @@ "navigation_bar.compose": "Scrieve new post", "navigation_bar.discover": "Fin", "navigation_bar.domain_blocks": "Dingied domains", - "navigation_bar.edit_profile": "Edit profile", "navigation_bar.explore": "Splore", "navigation_bar.filters": "Wheesht wirds", "navigation_bar.follow_requests": "Follae requests", @@ -425,14 +413,7 @@ "poll_button.add_poll": "Dae a poll", "poll_button.remove_poll": "Tak doon poll", "privacy.change": "Chynge post privacy", - "privacy.direct.long": "Ainly menshied uisers kin see this", - "privacy.direct.short": "Menshied fowk ainly", - "privacy.private.long": "Ainly follaers kin see this", - "privacy.private.short": "Ainly follaers", - "privacy.public.long": "Awbody kin see this", "privacy.public.short": "Public", - "privacy.unlisted.long": "Aw kin see this, but optit-oot o discovery features", - "privacy.unlisted.short": "No listit", "privacy_policy.last_updated": "Last updatit {date}", "privacy_policy.title": "Privacy Policy", "refresh": "Refresh", @@ -583,10 +564,8 @@ "upload_error.poll": "File upload isnae allooed wi polls.", "upload_form.audio_description": "Describe fir fowk wi hearin loss", "upload_form.description": "Describe fir thaim wi visual impairments", - "upload_form.description_missing": "Nae description addit", "upload_form.edit": "Edit", "upload_form.thumbnail": "Chynge thoomnail", - "upload_form.undo": "Delete", "upload_form.video_description": "Describe fir fowk wi hearin loss or wi visual impairment", "upload_modal.analyzing_picture": "Analyzin picture…", "upload_modal.apply": "Apply", diff --git a/app/javascript/mastodon/locales/si.json b/app/javascript/mastodon/locales/si.json index c2d2a41cc5..1b2eb17633 100644 --- a/app/javascript/mastodon/locales/si.json +++ b/app/javascript/mastodon/locales/si.json @@ -53,7 +53,6 @@ "alert.unexpected.title": "අපොයි!", "announcement.announcement": "නිවේදනය", "audio.hide": "හඬපටය සඟවන්න", - "autosuggest_hashtag.per_week": "සතියකට {count}", "boost_modal.combo": "ඊළඟ වතාවේ මෙය මඟ හැරීමට {combo} එබීමට හැකිය", "bundle_column_error.copy_stacktrace": "දෝෂ වාර්තාවේ පිටපතක්", "bundle_column_error.error.title": "අපොයි!", @@ -102,19 +101,12 @@ "compose_form.encryption_warning": "මාස්ටඩන් වෙත පළ කරන දෑ අන්ත සංකේතනයෙන් ආරක්‍ෂා නොවේ. මාස්ටඩන් හරහා කිසිදු සංවේදී තොරතුරක් බෙදා නොගන්න.", "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_single": "තනි තේරීමකට මත විමසුම වෙනස් කරන්න", - "compose_form.publish": "ප්‍රකාශනය", "compose_form.publish_form": "නව ලිපිය", - "compose_form.publish_loud": "{publish}!", - "compose_form.save_changes": "වෙනස්කම් සුරකින්න", "compose_form.spoiler.marked": "අන්තර්ගත අවවාදය ඉවත් කරන්න", "compose_form.spoiler.unmarked": "අන්තර්ගත අවවාදයක් එක් කරන්න", - "compose_form.spoiler_placeholder": "අවවාදය මෙහි ලියන්න", "confirmation_modal.cancel": "අවලංගු", "confirmations.block.block_and_report": "අවහිර කර වාර්තා කරන්න", "confirmations.block.confirm": "අවහිර", @@ -269,7 +261,6 @@ "navigation_bar.compose": "නව ලිපියක් ලියන්න", "navigation_bar.direct": "පෞද්ගලික සැඳහුම්", "navigation_bar.domain_blocks": "අවහිර කළ වසම්", - "navigation_bar.edit_profile": "පැතිකඩ සංස්කරණය", "navigation_bar.explore": "ගවේශනය", "navigation_bar.favourites": "ප්‍රියතමයන්", "navigation_bar.filters": "නිහඬ කළ වචන", @@ -335,11 +326,6 @@ "poll_button.add_poll": "මත විමසුමක් අරඹන්න", "poll_button.remove_poll": "මත විමසුම ඉවතලන්න", "privacy.change": "ලිපියේ රහස්‍යතාව සංශෝධනය", - "privacy.direct.long": "සඳහන් කළ අයට දිස්වෙයි", - "privacy.direct.short": "සඳහන් කළ අයට පමණි", - "privacy.private.long": "අනුගාමිකයින්ට දිස්වේ", - "privacy.private.short": "අනුගාමිකයින් පමණි", - "privacy.public.long": "සැමට දිස්වෙයි", "privacy.public.short": "ප්‍රසිද්ධ", "privacy_policy.title": "රහස්‍යතා ප්‍රතිපත්තිය", "refresh": "නැවුම් කරන්න", @@ -481,10 +467,8 @@ "upload_error.poll": "මත විමසුම් සමඟ ගොනු යෙදීමට ඉඩ නොදේ.", "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_modal.analyzing_picture": "පින්තූරය විශ්ලේෂණය කරමින්…", "upload_modal.apply": "යොදන්න", diff --git a/app/javascript/mastodon/locales/sk.json b/app/javascript/mastodon/locales/sk.json index 3e41a2035a..5b1203aeea 100644 --- a/app/javascript/mastodon/locales/sk.json +++ b/app/javascript/mastodon/locales/sk.json @@ -89,7 +89,6 @@ "announcement.announcement": "Oznámenie", "attachments_list.unprocessed": "(nespracované)", "audio.hide": "Skry zvuk", - "autosuggest_hashtag.per_week": "{count} týždenne", "boost_modal.combo": "Nabudúce môžeš kliknúť {combo} pre preskočenie", "bundle_column_error.copy_stacktrace": "Kopírovať chybovú hlášku", "bundle_column_error.error.body": "Požadovanú stránku nebolo možné vykresliť. Môže to byť spôsobené chybou v našom kóde alebo problémom s kompatibilitou prehliadača.", @@ -146,22 +145,12 @@ "compose_form.lock_disclaimer": "Tvoj účet nie je {locked}. Ktokoľvek ťa môže nasledovať a vidieť tvoje správy pre sledujúcich.", "compose_form.lock_disclaimer.lock": "zamknutý", "compose_form.placeholder": "Čo máš na mysli?", - "compose_form.poll.add_option": "Pridaj voľbu", "compose_form.poll.duration": "Trvanie ankety", - "compose_form.poll.option_placeholder": "Voľba {number}", - "compose_form.poll.remove_option": "Odstráň túto voľbu", "compose_form.poll.switch_to_multiple": "Zmeň anketu pre povolenie viacerých možností", "compose_form.poll.switch_to_single": "Zmeň anketu na takú s jedinou voľbou", - "compose_form.publish": "Zverejni", "compose_form.publish_form": "Zverejniť", - "compose_form.publish_loud": "{publish}!", - "compose_form.save_changes": "Ulož zmeny", - "compose_form.sensitive.hide": "Označ médiá ako chúlostivé", - "compose_form.sensitive.marked": "Médiálny obsah je označený ako chúlostivý", - "compose_form.sensitive.unmarked": "Médiálny obsah nieje označený ako chúlostivý", "compose_form.spoiler.marked": "Text je ukrytý za varovaním", "compose_form.spoiler.unmarked": "Text nieje ukrytý", - "compose_form.spoiler_placeholder": "Sem napíš tvoje varovanie", "confirmation_modal.cancel": "Zruš", "confirmations.block.block_and_report": "Zablokuj a nahlás", "confirmations.block.confirm": "Blokuj", @@ -408,7 +397,6 @@ "navigation_bar.direct": "Súkromné spomenutia", "navigation_bar.discover": "Objavuj", "navigation_bar.domain_blocks": "Skryté domény", - "navigation_bar.edit_profile": "Uprav profil", "navigation_bar.explore": "Objavuj", "navigation_bar.favourites": "Obľúbené", "navigation_bar.filters": "Filtrované slová", @@ -525,14 +513,7 @@ "poll_button.add_poll": "Pridaj anketu", "poll_button.remove_poll": "Odstráň anketu", "privacy.change": "Uprav súkromie príspevku", - "privacy.direct.long": "Pošli iba spomenutým užívateľom", - "privacy.direct.short": "Iba spomenutým ľudom", - "privacy.private.long": "Pošli iba následovateľom", - "privacy.private.short": "Iba pre sledujúcich", - "privacy.public.long": "Viditeľné pre všetkých", "privacy.public.short": "Verejné", - "privacy.unlisted.long": "Viditeľné pre všetkých, ale odmietnuté funkcie zisťovania", - "privacy.unlisted.short": "Verejne, ale nezobraziť v osi", "privacy_policy.last_updated": "Posledná úprava {date}", "privacy_policy.title": "Zásady súkromia", "recommended": "Odporúčané", @@ -714,10 +695,8 @@ "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": "Nepridaný žiadny popis", "upload_form.edit": "Uprav", "upload_form.thumbnail": "Zmeniť miniatúru", - "upload_form.undo": "Vymaž", "upload_form.video_description": "Popíš, pre ľudí so stratou sluchu, alebo očným znevýhodnením", "upload_modal.analyzing_picture": "Analyzujem obrázok…", "upload_modal.apply": "Použi", diff --git a/app/javascript/mastodon/locales/sl.json b/app/javascript/mastodon/locales/sl.json index b3998b9110..559b05db72 100644 --- a/app/javascript/mastodon/locales/sl.json +++ b/app/javascript/mastodon/locales/sl.json @@ -89,7 +89,6 @@ "announcement.announcement": "Obvestilo", "attachments_list.unprocessed": "(neobdelano)", "audio.hide": "Skrij zvok", - "autosuggest_hashtag.per_week": "{count} na teden", "boost_modal.combo": "Če želite preskočiti to, lahko pritisnete {combo}", "bundle_column_error.copy_stacktrace": "Kopiraj poročilo o napaki", "bundle_column_error.error.body": "Zahtevane strani ni mogoče upodobiti. Vzrok težave je morda hrošč v naši kodi ali pa nezdružljivost z brskalnikom.", @@ -146,22 +145,12 @@ "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šljate?", - "compose_form.poll.add_option": "Dodaj izbiro", "compose_form.poll.duration": "Trajanje ankete", - "compose_form.poll.option_placeholder": "Izbira {number}", - "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": "Objavi", "compose_form.publish_form": "Objavi", - "compose_form.publish_loud": "{publish}!", - "compose_form.save_changes": "Shrani spremembe", - "compose_form.sensitive.hide": "{count, plural,one {Označi medij kot občutljiv} two {Označi medija kot občutljiva} other {Označi medije kot občutljive}}", - "compose_form.sensitive.marked": "{count, plural,one {Medij je označen kot občutljiv} two {Medija sta označena kot občutljiva} other {Mediji so označeni kot občutljivi}}", - "compose_form.sensitive.unmarked": "{count, plural,one {Medij ni označen kot občutljiv} two {Medija nista označena kot občutljiva} other {Mediji niso označeni kot občutljivi}}", "compose_form.spoiler.marked": "Odstrani opozorilo o vsebini", "compose_form.spoiler.unmarked": "Dodaj opozorilo o vsebini", - "compose_form.spoiler_placeholder": "Tukaj napišite opozorilo", "confirmation_modal.cancel": "Prekliči", "confirmations.block.block_and_report": "Blokiraj in prijavi", "confirmations.block.confirm": "Blokiraj", @@ -408,7 +397,6 @@ "navigation_bar.direct": "Zasebne omembe", "navigation_bar.discover": "Odkrijte", "navigation_bar.domain_blocks": "Blokirane domene", - "navigation_bar.edit_profile": "Uredi profil", "navigation_bar.explore": "Razišči", "navigation_bar.favourites": "Priljubljeni", "navigation_bar.filters": "Utišane besede", @@ -526,14 +514,7 @@ "poll_button.add_poll": "Dodaj anketo", "poll_button.remove_poll": "Odstrani anketo", "privacy.change": "Spremeni zasebnost objave", - "privacy.direct.long": "Objavi samo omenjenim uporabnikom", - "privacy.direct.short": "Samo omenjeni", - "privacy.private.long": "Vidno samo sledilcem", - "privacy.private.short": "Samo sledilci", - "privacy.public.long": "Vidno vsem", "privacy.public.short": "Javno", - "privacy.unlisted.long": "Vidno za vse, vendar izključeno iz funkcionalnosti odkrivanja", - "privacy.unlisted.short": "Ni prikazano", "privacy_policy.last_updated": "Zadnja posodobitev {date}", "privacy_policy.title": "Pravilnik o zasebnosti", "recommended": "Priporočeno", @@ -715,10 +696,8 @@ "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": "Noben opis ni dodan", "upload_form.edit": "Uredi", "upload_form.thumbnail": "Spremeni sličico", - "upload_form.undo": "Izbriši", "upload_form.video_description": "Opišite za osebe z okvaro sluha in/ali vida", "upload_modal.analyzing_picture": "Analiziranje slike …", "upload_modal.apply": "Uveljavi", diff --git a/app/javascript/mastodon/locales/sq.json b/app/javascript/mastodon/locales/sq.json index f45266c845..bfc674248b 100644 --- a/app/javascript/mastodon/locales/sq.json +++ b/app/javascript/mastodon/locales/sq.json @@ -89,7 +89,6 @@ "announcement.announcement": "Lajmërim", "attachments_list.unprocessed": "(e papërpunuar)", "audio.hide": "Fshihe audion", - "autosuggest_hashtag.per_week": "{count} për javë", "boost_modal.combo": "Që kjo të anashkalohet herës tjetër, mund të shtypni {combo}", "bundle_column_error.copy_stacktrace": "Kopjo raportim gabimi", "bundle_column_error.error.body": "Faqja e kërkuar s’u vizatua dot. Kjo mund të vijë nga një e metë në kodin tonë, ose nga një problem përputhshmërie i shfletuesit.", @@ -146,22 +145,22 @@ "compose_form.lock_disclaimer": "Llogaria juaj s’është {locked}. Mund ta ndjekë cilido, për të parë postimet tuaja vetëm për ndjekësit.", "compose_form.lock_disclaimer.lock": "e kyçur", "compose_form.placeholder": "Ç’bluani në mendje?", - "compose_form.poll.add_option": "Shtoni një zgjedhje", + "compose_form.poll.add_option": "Shtoni mundësi", "compose_form.poll.duration": "Kohëzgjatje pyetësori", - "compose_form.poll.option_placeholder": "Zgjedhja {number}", - "compose_form.poll.remove_option": "Hiqe këtë zgjedhje", + "compose_form.poll.multiple": "Shumë zgjedhje", + "compose_form.poll.option_placeholder": "Mundësia {number}", + "compose_form.poll.remove_option": "Hiqe këtë mundësi", + "compose_form.poll.single": "Zgjidhni një", "compose_form.poll.switch_to_multiple": "Ndrysho votimin për të lejuar shumë zgjedhje", "compose_form.poll.switch_to_single": "Ndrysho votimin për të lejuar vetëm një zgjedhje", - "compose_form.publish": "Botoje", + "compose_form.poll.type": "Stil", + "compose_form.publish": "Postim", "compose_form.publish_form": "Publikoje", - "compose_form.publish_loud": "{publish}!", - "compose_form.save_changes": "Ruaji ndryshimet", - "compose_form.sensitive.hide": "{count, plural, one {Vëri shenjë medias si rezervat} other {Vëru shenjë mediave si rezervat}}", - "compose_form.sensitive.marked": "{count, plural, one {Medias i është vënë shenjë rezervat} other {Mediave u është vënë shenjë si rezervat}}", - "compose_form.sensitive.unmarked": "{count, plural, one {Media s’ka shenjë si rezervat} other {Mediat s’kanë shenja si rezervat}}", + "compose_form.reply": "Përgjigjuni", + "compose_form.save_changes": "Përditësoje", "compose_form.spoiler.marked": "Hiq sinjalizim lënde", "compose_form.spoiler.unmarked": "Shtoni sinjalizim lënde", - "compose_form.spoiler_placeholder": "Shkruani këtu sinjalizimin tuaj", + "compose_form.spoiler_placeholder": "Sinjalizim lënde (opsional)", "confirmation_modal.cancel": "Anuloje", "confirmations.block.block_and_report": "Bllokojeni & Raportojeni", "confirmations.block.confirm": "Bllokoje", @@ -408,7 +407,6 @@ "navigation_bar.direct": "Përmendje private", "navigation_bar.discover": "Zbuloni", "navigation_bar.domain_blocks": "Përkatësi të bllokuara", - "navigation_bar.edit_profile": "Përpunoni profilin", "navigation_bar.explore": "Eksploroni", "navigation_bar.favourites": "Të parapëlqyer", "navigation_bar.filters": "Fjalë të heshtuara", @@ -526,14 +524,15 @@ "poll_button.add_poll": "Shtoni një pyetësor", "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 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ë", + "privacy.direct.long": "Gjithkënd i përmendur te postimi", + "privacy.direct.short": "Persona të veçantë", + "privacy.private.long": "Vetëm ndjekësit tuaj", + "privacy.private.short": "Ndjekës", + "privacy.public.long": "Cilido që hyn e del në Mastodon", "privacy.public.short": "Publik", - "privacy.unlisted.long": "I dukshëm për të tërë, por lënë jashtë nga veçoritë e zbulimit", - "privacy.unlisted.short": "Jo në lista", + "privacy.unlisted.additional": "Ky sillet saktësisht si publik, vetëm se postimi s’do të shfaqet në prurje të drejtpërdrejta, ose në hashtag-ë, te eksploroni, apo kërkim në Mastodon, edhe kur keni zgjedhur të jetë për tërë llogarinë.", + "privacy.unlisted.long": "Më pak fanfara algoritmike", + "privacy.unlisted.short": "Publik i qetë", "privacy_policy.last_updated": "Përditësuar së fundi më {date}", "privacy_policy.title": "Rregulla Privatësie", "recommended": "E rekomanduar", @@ -551,7 +550,9 @@ "relative_time.minutes": "{number}m", "relative_time.seconds": "{number}s", "relative_time.today": "sot", + "reply_indicator.attachments": "{count, plural, one {# bashkëngjitje} other {# bashkëngjitje}}", "reply_indicator.cancel": "Anuloje", + "reply_indicator.poll": "Pyetësor", "report.block": "Bllokoje", "report.block_explanation": "S’do të shihni postime prej tyre. S’do të jenë në gjendje të shohin postimet tuaja, apo t’ju ndjekin. Do të jenë në gjendje të shohin se janë bllokuar.", "report.categories.legal": "Ligjore", @@ -715,10 +716,8 @@ "upload_error.poll": "Me pyetësorët s’lejohet ngarkim kartelash.", "upload_form.audio_description": "Përshkruajeni për persona me dëgjim të kufizuar", "upload_form.description": "Përshkruajeni për persona me probleme shikimi", - "upload_form.description_missing": "S’u shtua përshkrim", "upload_form.edit": "Përpunoni", "upload_form.thumbnail": "Ndryshoni miniaturën", - "upload_form.undo": "Fshije", "upload_form.video_description": "Përshkruajeni për persona me dëgjim të kufizuar ose probleme shikimi", "upload_modal.analyzing_picture": "Po analizohet fotoja…", "upload_modal.apply": "Aplikoje", diff --git a/app/javascript/mastodon/locales/sr-Latn.json b/app/javascript/mastodon/locales/sr-Latn.json index 77c262e957..b0348748a6 100644 --- a/app/javascript/mastodon/locales/sr-Latn.json +++ b/app/javascript/mastodon/locales/sr-Latn.json @@ -89,7 +89,6 @@ "announcement.announcement": "Najava", "attachments_list.unprocessed": "(neobrađeno)", "audio.hide": "Sakrij audio", - "autosuggest_hashtag.per_week": "{count} nedeljno", "boost_modal.combo": "Možete pritisnuti {combo} da preskočite ovo sledeći put", "bundle_column_error.copy_stacktrace": "Kopiraj izveštaj o grešci", "bundle_column_error.error.body": "Nije moguće prikazati traženu stranicu. Razlog može biti greška u našem kodu ili problem sa kompatibilnošću pretraživača.", @@ -146,22 +145,12 @@ "compose_form.lock_disclaimer": "Vaš nalog nije {locked}. Svako može da vas prati i da vidi vaše objave namenjene samo za vaše pratioce.", "compose_form.lock_disclaimer.lock": "zaključan", "compose_form.placeholder": "O čemu razmišljate?", - "compose_form.poll.add_option": "Dodajte izbor", "compose_form.poll.duration": "Trajanje ankete", - "compose_form.poll.option_placeholder": "Izbor {number}", - "compose_form.poll.remove_option": "Ukloni ovaj izbor", "compose_form.poll.switch_to_multiple": "Promenite anketu da biste omogućili više izbora", "compose_form.poll.switch_to_single": "Promenite anketu da biste omogućili jedan izbor", - "compose_form.publish": "Objavi", "compose_form.publish_form": "Objavi", - "compose_form.publish_loud": "{publish}!", - "compose_form.save_changes": "Sačuvaj promene", - "compose_form.sensitive.hide": "{count, plural, one {Označi multimediju kao osetljivu} few {Označi multimediju kao osetljivu} other {Označi multimediju kao osetljivu}}", - "compose_form.sensitive.marked": "{count, plural, one {Multimedija je označena kao osetljiva} few {Multimedija je označena kao osetljiva} other {Multimedija je označena kao osetljiva}}", - "compose_form.sensitive.unmarked": "{count, plural, one {Multimedija nije označena kao osetljiva} few {Multimedija nije označena kao osetljiva} other {Multimedija nije označena kao osetljiva}}", "compose_form.spoiler.marked": "Ukloni upozorenje o sadržaju", "compose_form.spoiler.unmarked": "Dodaj upozorenje o sadržaju", - "compose_form.spoiler_placeholder": "Ovde napišite upozorenje", "confirmation_modal.cancel": "Otkaži", "confirmations.block.block_and_report": "Blokiraj i prijavi", "confirmations.block.confirm": "Blokiraj", @@ -408,7 +397,6 @@ "navigation_bar.direct": "Privatna pominjanja", "navigation_bar.discover": "Otkrij", "navigation_bar.domain_blocks": "Blokirani domeni", - "navigation_bar.edit_profile": "Uredi profil", "navigation_bar.explore": "Istraži", "navigation_bar.favourites": "Omiljeno", "navigation_bar.filters": "Ignorisane reči", @@ -526,14 +514,7 @@ "poll_button.add_poll": "Dodaj anketu", "poll_button.remove_poll": "Ukloni anketu", "privacy.change": "Promeni privatnost objave", - "privacy.direct.long": "Vidljivo samo pomenutim korisnicima", - "privacy.direct.short": "Samo pomenute osobe", - "privacy.private.long": "Vidljivo samo pratiocima", - "privacy.private.short": "Samo pratioci", - "privacy.public.long": "Vidljivo za sve", "privacy.public.short": "Javno", - "privacy.unlisted.long": "Vidljivo svima, ali isključeno iz funkcija otkrivanja", - "privacy.unlisted.short": "Neizlistano", "privacy_policy.last_updated": "Poslednje ažuriranje {date}", "privacy_policy.title": "Politika privatnosti", "recommended": "Preporučeno", @@ -715,10 +696,8 @@ "upload_error.poll": "Otpremanje datoteka nije dozvoljeno kod anketa.", "upload_form.audio_description": "Dodajte opis za osobe sa oštećenim sluhom", "upload_form.description": "Dodajte opis za osobe sa oštećenim vidom", - "upload_form.description_missing": "Nema dodatog opisa", "upload_form.edit": "Uredi", "upload_form.thumbnail": "Promeni sličicu", - "upload_form.undo": "Izbriši", "upload_form.video_description": "Opišite za osobe sa oštećenim sluhom ili vidom", "upload_modal.analyzing_picture": "Analiziranje slike…", "upload_modal.apply": "Primeni", diff --git a/app/javascript/mastodon/locales/sr.json b/app/javascript/mastodon/locales/sr.json index 85e7567bf4..4e4956e1a2 100644 --- a/app/javascript/mastodon/locales/sr.json +++ b/app/javascript/mastodon/locales/sr.json @@ -89,7 +89,6 @@ "announcement.announcement": "Најава", "attachments_list.unprocessed": "(необрађено)", "audio.hide": "Сакриј аудио", - "autosuggest_hashtag.per_week": "{count} недељно", "boost_modal.combo": "Можете притиснути {combo} да прескочите ово следећи пут", "bundle_column_error.copy_stacktrace": "Копирај извештај о грешци", "bundle_column_error.error.body": "Није могуће приказати тражену страницу. Разлог може бити грешка у нашем коду или проблем са компатибилношћу претраживача.", @@ -146,22 +145,22 @@ "compose_form.lock_disclaimer": "Ваш налог није {locked}. Свако може да Вас запрати и да види објаве намењене само Вашим пратиоцима.", "compose_form.lock_disclaimer.lock": "закључан", "compose_form.placeholder": "О чему размишљате?", - "compose_form.poll.add_option": "Додајте избор", + "compose_form.poll.add_option": "Додај опцију", "compose_form.poll.duration": "Трајање анкете", - "compose_form.poll.option_placeholder": "Избор {number}", - "compose_form.poll.remove_option": "Уклони овај избор", + "compose_form.poll.multiple": "Вишеструки избор", + "compose_form.poll.option_placeholder": "Опција {number}", + "compose_form.poll.remove_option": "Уклони ову опцију", + "compose_form.poll.single": "Одаберите једно", "compose_form.poll.switch_to_multiple": "Промените анкету да бисте омогућили више избора", "compose_form.poll.switch_to_single": "Промените анкету да бисте омогућили један избор", + "compose_form.poll.type": "Стил", "compose_form.publish": "Објави", "compose_form.publish_form": "Нова објава", - "compose_form.publish_loud": "{publish}!", - "compose_form.save_changes": "Сачувај промене", - "compose_form.sensitive.hide": "{count, plural, one {Означи мултимедију као осетљиву} few {Означи мултимедију као осетљиву} other {Означи мултимедију као осетљиву}}", - "compose_form.sensitive.marked": "{count, plural, one {Мултимедија је означена као осетљива} few {Мултимедија је означена као осетљива} other {Мултимедија је означена као осетљива}}", - "compose_form.sensitive.unmarked": "{count, plural, one {Мултимедија није означена као осетљива} few {Мултимедија није означена као осетљива} other {Мултимедија није означена као осетљива}}", + "compose_form.reply": "Одговори", + "compose_form.save_changes": "Ажурирај", "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": "Блокирај", @@ -408,7 +407,6 @@ "navigation_bar.direct": "Приватна помињања", "navigation_bar.discover": "Откриј", "navigation_bar.domain_blocks": "Блокирани домени", - "navigation_bar.edit_profile": "Уреди профил", "navigation_bar.explore": "Истражи", "navigation_bar.favourites": "Омиљено", "navigation_bar.filters": "Игнорисане речи", @@ -526,14 +524,15 @@ "poll_button.add_poll": "Додај анкету", "poll_button.remove_poll": "Уклони анкету", "privacy.change": "Промени приватност објаве", - "privacy.direct.long": "Видљиво само поменутим корисницима", - "privacy.direct.short": "Само поменуте особе", - "privacy.private.long": "Видљиво само пратиоцима", - "privacy.private.short": "Само пратиоци", - "privacy.public.long": "Видљиво за све", + "privacy.direct.long": "Сви поменути у објави", + "privacy.direct.short": "Одређени људи", + "privacy.private.long": "Само ваши пратиоци", + "privacy.private.short": "Пратиоци", + "privacy.public.long": "Било ко на Mastodon-у и ван њега", "privacy.public.short": "Јавно", - "privacy.unlisted.long": "Видљиво свима, али искључено из функција откривања", - "privacy.unlisted.short": "Неизлистано", + "privacy.unlisted.additional": "Ово се понаша потпуно као јавно, осим што се објава неће појављивати у изворима уживо или хеш ознакама, истраживањима или претрази Mastodon-а, чак и ако сте укључени у целом налогу.", + "privacy.unlisted.long": "Мање алгоритамских фанфара", + "privacy.unlisted.short": "Тиха јавност", "privacy_policy.last_updated": "Последње ажурирање {date}", "privacy_policy.title": "Политика приватности", "recommended": "Препоручено", @@ -551,7 +550,9 @@ "relative_time.minutes": "{number} мин.", "relative_time.seconds": "{number} сек.", "relative_time.today": "данас", + "reply_indicator.attachments": "{count, plural, one {# прилог} few {# прилога} other {# прилога}}", "reply_indicator.cancel": "Откажи", + "reply_indicator.poll": "Анкета", "report.block": "Блокирај", "report.block_explanation": "Нећете видети објаве корисника. Ни он неће видети Ваше објаве нити ће моћи да Вас прати. Такође ће моћи да сазна да је блокиран.", "report.categories.legal": "Правни", @@ -715,10 +716,8 @@ "upload_error.poll": "Отпремање датотека није дозвољено код анкета.", "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_modal.analyzing_picture": "Анализирање слике…", "upload_modal.apply": "Примени", diff --git a/app/javascript/mastodon/locales/sv.json b/app/javascript/mastodon/locales/sv.json index d3ca776bd9..d6e6555b53 100644 --- a/app/javascript/mastodon/locales/sv.json +++ b/app/javascript/mastodon/locales/sv.json @@ -89,7 +89,6 @@ "announcement.announcement": "Meddelande", "attachments_list.unprocessed": "(obehandlad)", "audio.hide": "Dölj audio", - "autosuggest_hashtag.per_week": "{count} per vecka", "boost_modal.combo": "Du kan trycka på {combo} för att hoppa över detta nästa gång", "bundle_column_error.copy_stacktrace": "Kopiera felrapport", "bundle_column_error.error.body": "Den begärda sidan kunde inte visas. Det kan bero på ett fel i vår kod eller ett problem med webbläsarens kompatibilitet.", @@ -146,22 +145,18 @@ "compose_form.lock_disclaimer": "Ditt konto är inte {locked}. Vem som helst kan följa dig för att se dina inlägg som endast är för följare.", "compose_form.lock_disclaimer.lock": "låst", "compose_form.placeholder": "Vad tänker du på?", - "compose_form.poll.add_option": "Lägg till ett val", + "compose_form.poll.add_option": "Lägg till alternativ", "compose_form.poll.duration": "Varaktighet för omröstning", - "compose_form.poll.option_placeholder": "Val {number}", - "compose_form.poll.remove_option": "Ta bort detta val", + "compose_form.poll.option_placeholder": "Alternativ {number}", "compose_form.poll.switch_to_multiple": "Ändra enkät för att tillåta flera val", "compose_form.poll.switch_to_single": "Ändra enkät för att tillåta ett enda val", - "compose_form.publish": "Publicera", + "compose_form.poll.type": "Stil", "compose_form.publish_form": "Publicera", - "compose_form.publish_loud": "{publish}!", - "compose_form.save_changes": "Spara ändringar", - "compose_form.sensitive.hide": "Markera media som känsligt", - "compose_form.sensitive.marked": "Media har markerats som känsligt", - "compose_form.sensitive.unmarked": "Media är inte markerat som känsligt", + "compose_form.reply": "Svara", + "compose_form.save_changes": "Uppdatera", "compose_form.spoiler.marked": "Texten är dold bakom en varning", "compose_form.spoiler.unmarked": "Texten är inte dold", - "compose_form.spoiler_placeholder": "Skriv din varning här", + "compose_form.spoiler_placeholder": "Innehållsvarning (valfritt)", "confirmation_modal.cancel": "Avbryt", "confirmations.block.block_and_report": "Blockera & rapportera", "confirmations.block.confirm": "Blockera", @@ -408,7 +403,6 @@ "navigation_bar.direct": "Privata nämningar", "navigation_bar.discover": "Upptäck", "navigation_bar.domain_blocks": "Dolda domäner", - "navigation_bar.edit_profile": "Redigera profil", "navigation_bar.explore": "Utforska", "navigation_bar.favourites": "Favoriter", "navigation_bar.filters": "Tystade ord", @@ -524,14 +518,10 @@ "poll_button.add_poll": "Lägg till en omröstning", "poll_button.remove_poll": "Ta bort omröstning", "privacy.change": "Ändra inläggsintegritet", - "privacy.direct.long": "Skicka endast till nämnda användare", - "privacy.direct.short": "Endast omnämnda personer", - "privacy.private.long": "Endast synligt för följare", - "privacy.private.short": "Endast följare", - "privacy.public.long": "Synlig för alla", + "privacy.private.long": "Endast dina följare", + "privacy.private.short": "Följare", + "privacy.public.long": "Alla på och utanför Mastodon", "privacy.public.short": "Publik", - "privacy.unlisted.long": "Synlig för alla, men visas inte i upptäcksfunktioner", - "privacy.unlisted.short": "Olistad", "privacy_policy.last_updated": "Senast uppdaterad {date}", "privacy_policy.title": "Integritetspolicy", "recommended": "Rekommenderas", @@ -550,6 +540,7 @@ "relative_time.seconds": "{number}sek", "relative_time.today": "idag", "reply_indicator.cancel": "Ångra", + "reply_indicator.poll": "Omröstning", "report.block": "Blockera", "report.block_explanation": "Du kommer inte se hens inlägg. Hen kommer inte kunna se dina inlägg eller följa dig. Hen kommer kunna se att hen är blockerad.", "report.categories.legal": "Juridisk", @@ -713,10 +704,8 @@ "upload_error.poll": "Filuppladdning tillåts inte med omröstningar.", "upload_form.audio_description": "Beskriv för personer med hörselnedsättning", "upload_form.description": "Beskriv för synskadade", - "upload_form.description_missing": "Beskrivning saknas", "upload_form.edit": "Redigera", "upload_form.thumbnail": "Ändra miniatyr", - "upload_form.undo": "Radera", "upload_form.video_description": "Beskriv för personer med hörsel- eller synnedsättning", "upload_modal.analyzing_picture": "Analyserar bild…", "upload_modal.apply": "Verkställ", diff --git a/app/javascript/mastodon/locales/szl.json b/app/javascript/mastodon/locales/szl.json index abbdf9b7da..42164f656b 100644 --- a/app/javascript/mastodon/locales/szl.json +++ b/app/javascript/mastodon/locales/szl.json @@ -93,8 +93,6 @@ "onboarding.steps.share_profile.body": "Let your friends know how to find you on Mastodon!", "onboarding.steps.share_profile.title": "Share your profile", "privacy.change": "Adjust status privacy", - "privacy.direct.short": "Direct", - "privacy.private.short": "Followers-only", "report.placeholder": "Type or paste additional comments", "report.submit": "Submit report", "report.target": "Report {target}", diff --git a/app/javascript/mastodon/locales/ta.json b/app/javascript/mastodon/locales/ta.json index 5290e13ff4..6210c3d0b1 100644 --- a/app/javascript/mastodon/locales/ta.json +++ b/app/javascript/mastodon/locales/ta.json @@ -66,7 +66,6 @@ "announcement.announcement": "அறிவிப்பு", "attachments_list.unprocessed": "(செயலாக்கப்படாதது)", "audio.hide": "ஆடியோவை மறை", - "autosuggest_hashtag.per_week": "ஒவ்வொரு வாரம் {count}", "boost_modal.combo": "நீங்கள் இதை அடுத்தமுறை தவிர்க்க {combo} வை அழுத்தவும்", "bundle_column_error.error.title": "அடடே!", "bundle_column_error.network.body": "இந்தப் பக்கத்தைத் திறக்கும்பொழுது ஒரு பிழை ஏற்பட்டுவிட்டது. இது உங்கள் இணைய தொடர்பில் அல்லது இப்பத்தின் வழங்க்கியில் ஏற்பட்டுள்ள ஒரு தற்காலிக பிரச்சணையாக இருக்கலாம்.", @@ -120,22 +119,12 @@ "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_single": "ஒரே ஒரு தேர்வை மட்டும் அனுமதிக்குமாறு மாற்று", - "compose_form.publish": "வெளியிடு", "compose_form.publish_form": "Publish", - "compose_form.publish_loud": "{publish}!", - "compose_form.save_changes": "மாற்றங்களை சேமி", - "compose_form.sensitive.hide": "அனைவருக்கும் ஏற்றப் படம் இல்லை எனக் குறியிடு", - "compose_form.sensitive.marked": "இப்படம் அனைவருக்கும் ஏற்றதல்ல எனக் குறியிடப்பட்டுள்ளது", - "compose_form.sensitive.unmarked": "இப்படம் அனைவருக்கும் ஏற்றதல்ல எனக் குறியிடப்படவில்லை", "compose_form.spoiler.marked": "எச்சரிக்கையின் பின்னால் பதிவு மறைக்கப்பட்டுள்ளது", "compose_form.spoiler.unmarked": "பதிவு மறைக்கப்படவில்லை", - "compose_form.spoiler_placeholder": "உங்கள் எச்சரிக்கையை இங்கு எழுதவும்", "confirmation_modal.cancel": "ரத்து", "confirmations.block.block_and_report": "தடுத்துப் புகாரளி", "confirmations.block.confirm": "தடு", @@ -283,7 +272,6 @@ "navigation_bar.compose": "புதியவற்றை எழுதுக toot", "navigation_bar.discover": "கண்டு பிடி", "navigation_bar.domain_blocks": "மறைந்த களங்கள்", - "navigation_bar.edit_profile": "சுயவிவரத்தைத் திருத்தவும்", "navigation_bar.filters": "முடக்கப்பட்ட வார்த்தைகள்", "navigation_bar.follow_requests": "கோரிக்கைகளை பின்பற்றவும்", "navigation_bar.follows_and_followers": "பின்பற்றல்கள் மற்றும் பின்பற்றுபவர்கள்", @@ -344,12 +332,7 @@ "poll_button.add_poll": "வாக்கெடுப்பைச் சேர்க்கவும்", "poll_button.remove_poll": "வாக்கெடுப்பை அகற்று", "privacy.change": "நிலை தனியுரிமை", - "privacy.direct.long": "குறிப்பிடப்பட்ட பயனர்களுக்கு மட்டுமே இடுகையிடவும்", - "privacy.direct.short": "Direct", - "privacy.private.long": "பின்தொடர்பவர்களுக்கு மட்டுமே இடுகை", - "privacy.private.short": "Followers-only", "privacy.public.short": "பொது", - "privacy.unlisted.short": "பட்டியலிடப்படாத", "refresh": "புதுப்பி", "regeneration_indicator.label": "சுமையேற்றம்…", "regeneration_indicator.sublabel": "உங்கள் வீட்டு ஊட்டம் தயார் செய்யப்படுகிறது!", @@ -432,7 +415,6 @@ "upload_form.description": "பார்வையற்ற விவரிக்கவும்", "upload_form.edit": "தொகு", "upload_form.thumbnail": "சிறுபடத்தை மாற்ற", - "upload_form.undo": "நீக்கு", "upload_form.video_description": "செவித்திறன் மற்றும் பார்வைக் குறைபாடு உள்ளவர்களுக்காக விளக்குக‌", "upload_modal.analyzing_picture": "படம் ஆராயப்படுகிறது…", "upload_modal.apply": "உபயோகி", diff --git a/app/javascript/mastodon/locales/tai.json b/app/javascript/mastodon/locales/tai.json index 7c1956d95b..b1a242c751 100644 --- a/app/javascript/mastodon/locales/tai.json +++ b/app/javascript/mastodon/locales/tai.json @@ -79,8 +79,6 @@ "onboarding.steps.share_profile.body": "Let your friends know how to find you on Mastodon!", "onboarding.steps.share_profile.title": "Share your profile", "privacy.change": "Adjust status privacy", - "privacy.direct.short": "Direct", - "privacy.private.short": "Followers-only", "report.placeholder": "Type or paste additional comments", "report.submit": "Submit report", "report.target": "Report {target}", diff --git a/app/javascript/mastodon/locales/te.json b/app/javascript/mastodon/locales/te.json index 3c231871fa..24a67247c0 100644 --- a/app/javascript/mastodon/locales/te.json +++ b/app/javascript/mastodon/locales/te.json @@ -64,16 +64,10 @@ "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.publish_form": "Publish", - "compose_form.sensitive.marked": "మీడియా సున్నితమైనదిగా గుర్తించబడింది", - "compose_form.sensitive.unmarked": "మీడియా సున్నితమైనదిగా గుర్తించబడలేదు", "compose_form.spoiler.marked": "హెచ్చరిక వెనుక పాఠ్యం దాచబడింది", "compose_form.spoiler.unmarked": "పాఠ్యం దాచబడలేదు", - "compose_form.spoiler_placeholder": "ఇక్కడ మీ హెచ్చరికను రాయండి", "confirmation_modal.cancel": "రద్దు చెయ్యి", "confirmations.block.confirm": "బ్లాక్ చేయి", "confirmations.block.message": "మీరు ఖచ్చితంగా {name}ని బ్లాక్ చేయాలనుకుంటున్నారా?", @@ -186,7 +180,6 @@ "navigation_bar.compose": "కొత్త టూట్ను రాయండి", "navigation_bar.discover": "కనుగొను", "navigation_bar.domain_blocks": "దాచిన డొమైన్లు", - "navigation_bar.edit_profile": "ప్రొఫైల్ని సవరించండి", "navigation_bar.filters": "మ్యూట్ చేయబడిన పదాలు", "navigation_bar.follow_requests": "అనుసరించడానికి అభ్యర్ధనలు", "navigation_bar.lists": "జాబితాలు", @@ -240,12 +233,7 @@ "poll_button.add_poll": "ఒక ఎన్నికను చేర్చు", "poll_button.remove_poll": "ఎన్నికను తొలగించు", "privacy.change": "స్టేటస్ గోప్యతను సర్దుబాటు చేయండి", - "privacy.direct.long": "పేర్కొన్న వినియోగదారులకు మాత్రమే పోస్ట్ చేయి", - "privacy.direct.short": "Direct", - "privacy.private.long": "అనుచరులకు మాత్రమే పోస్ట్ చేయి", - "privacy.private.short": "Followers-only", "privacy.public.short": "ప్రజా", - "privacy.unlisted.short": "జాబితా చేయబడనిది", "regeneration_indicator.label": "లోడ్ అవుతోంది…", "regeneration_indicator.sublabel": "మీ హోమ్ ఫీడ్ సిద్ధమవుతోంది!", "relative_time.just_now": "ఇప్పుడు", @@ -308,7 +296,6 @@ "upload_button.label": "మీడియాను జోడించండి (JPEG, PNG, GIF, WebM, MP4, MOV)", "upload_form.audio_description": "Describe for people with hearing loss", "upload_form.description": "దృష్టి లోపమున్న వారి కోసం వివరించండి", - "upload_form.undo": "తొలగించు", "upload_form.video_description": "Describe for people with hearing loss or visual impairment", "upload_progress.label": "అప్లోడ్ అవుతోంది...", "video.close": "వీడియోని మూసివేయి", diff --git a/app/javascript/mastodon/locales/th.json b/app/javascript/mastodon/locales/th.json index 65f27ef061..4437afa78c 100644 --- a/app/javascript/mastodon/locales/th.json +++ b/app/javascript/mastodon/locales/th.json @@ -89,7 +89,6 @@ "announcement.announcement": "ประกาศ", "attachments_list.unprocessed": "(ยังไม่ได้ประมวลผล)", "audio.hide": "ซ่อนเสียง", - "autosuggest_hashtag.per_week": "{count} ต่อสัปดาห์", "boost_modal.combo": "คุณสามารถกด {combo} เพื่อข้ามสิ่งนี้ในครั้งถัดไป", "bundle_column_error.copy_stacktrace": "คัดลอกรายงานข้อผิดพลาด", "bundle_column_error.error.body": "ไม่สามารถแสดงผลหน้าที่ขอ ข้อผิดพลาดอาจเป็นเพราะข้อบกพร่องในโค้ดของเรา หรือปัญหาความเข้ากันได้ของเบราว์เซอร์", @@ -146,22 +145,12 @@ "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_single": "เปลี่ยนการสำรวจความคิดเห็นเป็นอนุญาตตัวเลือกเดี่ยว", - "compose_form.publish": "เผยแพร่", "compose_form.publish_form": "โพสต์ใหม่", - "compose_form.publish_loud": "{publish}!", - "compose_form.save_changes": "บันทึกการเปลี่ยนแปลง", - "compose_form.sensitive.hide": "{count, plural, other {ทำเครื่องหมายสื่อว่าละเอียดอ่อน}}", - "compose_form.sensitive.marked": "{count, plural, other {มีการทำเครื่องหมายสื่อว่าละเอียดอ่อน}}", - "compose_form.sensitive.unmarked": "{count, plural, other {ไม่มีการทำเครื่องหมายสื่อว่าละเอียดอ่อน}}", "compose_form.spoiler.marked": "เอาคำเตือนเนื้อหาออก", "compose_form.spoiler.unmarked": "เพิ่มคำเตือนเนื้อหา", - "compose_form.spoiler_placeholder": "เขียนคำเตือนของคุณที่นี่", "confirmation_modal.cancel": "ยกเลิก", "confirmations.block.block_and_report": "ปิดกั้นแล้วรายงาน", "confirmations.block.confirm": "ปิดกั้น", @@ -408,7 +397,6 @@ "navigation_bar.direct": "การกล่าวถึงแบบส่วนตัว", "navigation_bar.discover": "ค้นพบ", "navigation_bar.domain_blocks": "โดเมนที่ปิดกั้นอยู่", - "navigation_bar.edit_profile": "แก้ไขโปรไฟล์", "navigation_bar.explore": "สำรวจ", "navigation_bar.favourites": "รายการโปรด", "navigation_bar.filters": "คำที่ซ่อนอยู่", @@ -526,14 +514,7 @@ "poll_button.add_poll": "เพิ่มการสำรวจความคิดเห็น", "poll_button.remove_poll": "เอาการสำรวจความคิดเห็นออก", "privacy.change": "เปลี่ยนความเป็นส่วนตัวของโพสต์", - "privacy.direct.long": "ปรากฏแก่ผู้ใช้ที่กล่าวถึงเท่านั้น", - "privacy.direct.short": "ผู้คนที่กล่าวถึงเท่านั้น", - "privacy.private.long": "ปรากฏแก่ผู้ติดตามเท่านั้น", - "privacy.private.short": "ผู้ติดตามเท่านั้น", - "privacy.public.long": "ปรากฏแก่ทั้งหมด", "privacy.public.short": "สาธารณะ", - "privacy.unlisted.long": "ปรากฏแก่ทั้งหมด แต่เลือกไม่รับคุณลักษณะการค้นพบ", - "privacy.unlisted.short": "ไม่อยู่ในรายการ", "privacy_policy.last_updated": "อัปเดตล่าสุดเมื่อ {date}", "privacy_policy.title": "นโยบายความเป็นส่วนตัว", "recommended": "แนะนำ", @@ -715,10 +696,8 @@ "upload_error.poll": "ไม่อนุญาตการอัปโหลดไฟล์โดยมีการสำรวจความคิดเห็น", "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_modal.analyzing_picture": "กำลังวิเคราะห์รูปภาพ…", "upload_modal.apply": "นำไปใช้", diff --git a/app/javascript/mastodon/locales/tr.json b/app/javascript/mastodon/locales/tr.json index e85db817b9..6811c158d4 100644 --- a/app/javascript/mastodon/locales/tr.json +++ b/app/javascript/mastodon/locales/tr.json @@ -89,7 +89,6 @@ "announcement.announcement": "Duyuru", "attachments_list.unprocessed": "(işlenmemiş)", "audio.hide": "Sesi gizle", - "autosuggest_hashtag.per_week": "Haftada {count}", "boost_modal.combo": "Bir daha ki sefere {combo} tuşuna basabilirsin", "bundle_column_error.copy_stacktrace": "Hata raporunu kopyala", "bundle_column_error.error.body": "İstenen sayfa gösterilemiyor. Bu durum kodumuzdaki bir hatadan veya tarayıcı uyum sorunundan kaynaklanıyor olabilir.", @@ -146,22 +145,12 @@ "compose_form.lock_disclaimer": "Hesabın {locked} değil. Yalnızca takipçilere özel gönderilerini görüntülemek için herkes seni takip edebilir.", "compose_form.lock_disclaimer.lock": "kilitli", "compose_form.placeholder": "Aklında ne var?", - "compose_form.poll.add_option": "Bir seçenek ekleyin", "compose_form.poll.duration": "Anket süresi", - "compose_form.poll.option_placeholder": "{number}.seçenek", - "compose_form.poll.remove_option": "Bu seçeneği kaldır", "compose_form.poll.switch_to_multiple": "Birden çok seçeneğe izin vermek için anketi değiştir", "compose_form.poll.switch_to_single": "Tek bir seçeneğe izin vermek için anketi değiştir", - "compose_form.publish": "Gönder", "compose_form.publish_form": "Gönder", - "compose_form.publish_loud": "{publish}!", - "compose_form.save_changes": "Değişiklikleri kaydet", - "compose_form.sensitive.hide": "{count, plural, one {Medyayı hassas olarak işaretle} other {Medyayı hassas olarak işaretle}}", - "compose_form.sensitive.marked": "{count, plural, one {Medya hassas olarak işaretlendi} other {Medya hassas olarak işaretlendi}}", - "compose_form.sensitive.unmarked": "{count, plural, one {Medya hassas olarak işaretlenmemiş} other {Medya hassas olarak işaretlenmemiş}}", "compose_form.spoiler.marked": "Metin uyarının arkasına gizlenir", "compose_form.spoiler.unmarked": "Metin gizli değil", - "compose_form.spoiler_placeholder": "Uyarınızı buraya yazın", "confirmation_modal.cancel": "İptal", "confirmations.block.block_and_report": "Engelle ve Bildir", "confirmations.block.confirm": "Engelle", @@ -408,7 +397,6 @@ "navigation_bar.direct": "Özel değinmeler", "navigation_bar.discover": "Keşfet", "navigation_bar.domain_blocks": "Engellenen alan adları", - "navigation_bar.edit_profile": "Profili düzenle", "navigation_bar.explore": "Keşfet", "navigation_bar.favourites": "Favorilerin", "navigation_bar.filters": "Sessize alınmış kelimeler", @@ -526,14 +514,7 @@ "poll_button.add_poll": "Bir anket ekleyin", "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 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", "privacy.public.short": "Herkese açık", - "privacy.unlisted.long": "Keşfet harici herkese açık", - "privacy.unlisted.short": "Listelenmemiş", "privacy_policy.last_updated": "Son güncelleme {date}", "privacy_policy.title": "Gizlilik Politikası", "recommended": "Önerilen", @@ -715,10 +696,8 @@ "upload_error.poll": "Anketlerde dosya yüklemesine izin verilmez.", "upload_form.audio_description": "İşitme kaybı olan kişiler için yazı ekleyiniz", "upload_form.description": "Görme engelliler için açıklama", - "upload_form.description_missing": "Açıklama eklenmedi", "upload_form.edit": "Düzenle", "upload_form.thumbnail": "Küçük resmi değiştir", - "upload_form.undo": "Sil", "upload_form.video_description": "İşitme kaybı veya görme engeli olan kişiler için açıklama ekleyiniz", "upload_modal.analyzing_picture": "Resim analiz ediliyor…", "upload_modal.apply": "Uygula", diff --git a/app/javascript/mastodon/locales/tt.json b/app/javascript/mastodon/locales/tt.json index 47fe60bd25..17de9884e7 100644 --- a/app/javascript/mastodon/locales/tt.json +++ b/app/javascript/mastodon/locales/tt.json @@ -76,7 +76,6 @@ "announcement.announcement": "Игълан", "attachments_list.unprocessed": "(чимал)", "audio.hide": "Аудионы яшерү", - "autosuggest_hashtag.per_week": "{count} атнага", "boost_modal.combo": "Сез баса аласыз {combo} киләсе тапкыр моны сагыну өчен", "bundle_column_error.copy_stacktrace": "Күчереп алу хата турында Отчет", "bundle_column_error.error.body": "Соралган бит күрсәтелә алмый. Бу безнең кодтагы хата яки браузерга туры килү проблемасы аркасында булырга мөмкин.", @@ -128,22 +127,12 @@ "compose_form.lock_disclaimer": "Сезнең хисап түгел {locked}. Апуәрбер теләгән кеше сезнең язма өчен иярә ала.", "compose_form.lock_disclaimer.lock": "бикле", "compose_form.placeholder": "What is on your mind?", - "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_single": "Бердәнбер сайлау өчен сораштыруны Үзгәртегез", - "compose_form.publish": "Бастыру", "compose_form.publish_form": "Бастыру", - "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": "Кисәтүегезне монда языгыз", "confirmation_modal.cancel": "Баш тарту", "confirmations.block.block_and_report": "Блоклау һәм шикаять итү", "confirmations.block.confirm": "Блоклау", @@ -322,7 +311,6 @@ "navigation_bar.compose": "Compose new toot", "navigation_bar.direct": "Хосусый искә алулар", "navigation_bar.domain_blocks": "Hidden domains", - "navigation_bar.edit_profile": "Профильны үзгәртү", "navigation_bar.explore": "Күзәтү", "navigation_bar.lists": "Исемлекләр", "navigation_bar.logout": "Чыгу", @@ -376,9 +364,6 @@ "poll_button.add_poll": "Сораштыруны өстәү", "poll_button.remove_poll": "Сораштыруны бетерү", "privacy.change": "Adjust status privacy", - "privacy.direct.short": "Direct", - "privacy.private.short": "Followers-only", - "privacy.public.long": "Һәркемгә ачык", "privacy.public.short": "Һәркемгә ачык", "privacy_policy.last_updated": "Соңгы яңарту {date}", "privacy_policy.title": "Хосусыйлык Сәясәте", @@ -478,9 +463,7 @@ "units.short.thousand": "{count}М", "upload_form.audio_description": "Describe for people with hearing loss", "upload_form.description": "Describe for the visually impaired", - "upload_form.description_missing": "Тасвирлама өстәлмәде", "upload_form.edit": "Үзгәртү", - "upload_form.undo": "Бетерү", "upload_form.video_description": "Describe for people with hearing loss or visual impairment", "upload_modal.analyzing_picture": "Рәсемгә анализ ясау…", "upload_modal.apply": "Куллан", diff --git a/app/javascript/mastodon/locales/ug.json b/app/javascript/mastodon/locales/ug.json index 6bb5ba0ebf..9dc3b5c1f9 100644 --- a/app/javascript/mastodon/locales/ug.json +++ b/app/javascript/mastodon/locales/ug.json @@ -76,8 +76,6 @@ "onboarding.steps.share_profile.body": "Let your friends know how to find you on Mastodon!", "onboarding.steps.share_profile.title": "Share your profile", "privacy.change": "Adjust status privacy", - "privacy.direct.short": "Direct", - "privacy.private.short": "Followers-only", "report.placeholder": "Type or paste additional comments", "report.submit": "Submit report", "report.target": "Report {target}", diff --git a/app/javascript/mastodon/locales/uk.json b/app/javascript/mastodon/locales/uk.json index 5ec0da599b..38e5f9cfbd 100644 --- a/app/javascript/mastodon/locales/uk.json +++ b/app/javascript/mastodon/locales/uk.json @@ -89,7 +89,6 @@ "announcement.announcement": "Оголошення", "attachments_list.unprocessed": "(не оброблено)", "audio.hide": "Сховати аудіо", - "autosuggest_hashtag.per_week": "{count} на тиждень", "boost_modal.combo": "Ви можете натиснути {combo}, щоби пропустити це наступного разу", "bundle_column_error.copy_stacktrace": "Копіювати звіт про помилку", "bundle_column_error.error.body": "Неможливо показати запитану сторінку. Це може бути спричинено помилкою у нашому коді, або через проблему сумісності з браузером.", @@ -146,22 +145,13 @@ "compose_form.lock_disclaimer": "Ваш обліковий запис не {locked}. Будь-який користувач може підписатися на вас та переглядати ваші дописи для підписників.", "compose_form.lock_disclaimer.lock": "приватний", "compose_form.placeholder": "Що у вас на думці?", - "compose_form.poll.add_option": "Додати варіант", + "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_single": "Перемкнути у режим вибору однієї відповіді", - "compose_form.publish": "Опублікувати", "compose_form.publish_form": "Новий допис", - "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": "Прибрати попередження про вміст", "compose_form.spoiler.unmarked": "Додати попередження про вміст", - "compose_form.spoiler_placeholder": "Напишіть своє попередження тут", "confirmation_modal.cancel": "Скасувати", "confirmations.block.block_and_report": "Заблокувати та поскаржитися", "confirmations.block.confirm": "Заблокувати", @@ -408,7 +398,6 @@ "navigation_bar.direct": "Особисті згадки", "navigation_bar.discover": "Дослідити", "navigation_bar.domain_blocks": "Заблоковані домени", - "navigation_bar.edit_profile": "Редагувати профіль", "navigation_bar.explore": "Огляд", "navigation_bar.favourites": "Уподобане", "navigation_bar.filters": "Приховані слова", @@ -526,14 +515,7 @@ "poll_button.add_poll": "Додати опитування", "poll_button.remove_poll": "Видалити опитування", "privacy.change": "Змінити видимість допису", - "privacy.direct.long": "Показати тільки згаданим користувачам", - "privacy.direct.short": "Лише згадані люди", - "privacy.private.long": "Показати тільки підписникам", - "privacy.private.short": "Тільки для підписників", - "privacy.public.long": "Видимий для всіх", "privacy.public.short": "Публічно", - "privacy.unlisted.long": "Видимий для всіх, але не через можливості виявлення", - "privacy.unlisted.short": "Прихований", "privacy_policy.last_updated": "Оновлено {date}", "privacy_policy.title": "Політика приватності", "recommended": "Рекомендовано", @@ -715,10 +697,8 @@ "upload_error.poll": "Не можна завантажувати файли до опитувань.", "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_modal.analyzing_picture": "Аналізуємо зображення…", "upload_modal.apply": "Застосувати", diff --git a/app/javascript/mastodon/locales/ur.json b/app/javascript/mastodon/locales/ur.json index 563b2dedf8..fee2cc3a98 100644 --- a/app/javascript/mastodon/locales/ur.json +++ b/app/javascript/mastodon/locales/ur.json @@ -72,7 +72,6 @@ "alert.unexpected.message": "ایک غیر متوقع سہو ہوا ہے.", "alert.unexpected.title": "ا رے!", "announcement.announcement": "اعلان", - "autosuggest_hashtag.per_week": "{count} فی ہفتہ", "boost_modal.combo": "آئیندہ یہ نہ دیکھنے کیلئے آپ {combo} دبا سکتے ہیں", "bundle_column_error.error.title": "اوف، نہیں!", "bundle_column_error.network.title": "نیٹ ورک کی خرابی", @@ -115,22 +114,12 @@ "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_single": "کسی ایک انتخاب کے لیے پول تبدیل کریں", - "compose_form.publish": "اشاعت کردہ", "compose_form.publish_form": "اشاعت کریں", - "compose_form.publish_loud": "{publish}!", - "compose_form.save_changes": "تبدیلیاں محفوظ کریں", - "compose_form.sensitive.hide": "وسائل کو حساس نشاندہ کریں", - "compose_form.sensitive.marked": "وسائل حساس نشاندہ ہے", - "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": "اپنی وارننگ یہاں لکھیں", "confirmation_modal.cancel": "منسوخ", "confirmations.block.block_and_report": "شکایت کریں اور بلاک کریں", "confirmations.block.confirm": "بلاک", @@ -242,7 +231,6 @@ "navigation_bar.compose": "Compose new toot", "navigation_bar.discover": "دریافت کریں", "navigation_bar.domain_blocks": "Hidden domains", - "navigation_bar.edit_profile": "پروفائل میں ترمیم کریں", "navigation_bar.filters": "خاموش کردہ الفاظ", "navigation_bar.follow_requests": "پیروی کی درخواستیں", "navigation_bar.follows_and_followers": "پیروی کردہ اور پیروکار", @@ -281,10 +269,6 @@ "onboarding.steps.share_profile.body": "Let your friends know how to find you on Mastodon!", "onboarding.steps.share_profile.title": "Share your profile", "privacy.change": "Adjust status privacy", - "privacy.direct.long": "Post to mentioned users only", - "privacy.direct.short": "Direct", - "privacy.private.long": "Post to followers only", - "privacy.private.short": "Followers-only", "report.placeholder": "Type or paste additional comments", "report.submit": "Submit report", "report.target": "Report {target}", diff --git a/app/javascript/mastodon/locales/uz.json b/app/javascript/mastodon/locales/uz.json index 8eeee42a5e..8f231c8c77 100644 --- a/app/javascript/mastodon/locales/uz.json +++ b/app/javascript/mastodon/locales/uz.json @@ -75,7 +75,6 @@ "announcement.announcement": "E'lonlar", "attachments_list.unprocessed": "(qayta ishlanmagan)", "audio.hide": "Audioni yashirish", - "autosuggest_hashtag.per_week": "{count} haftasiga", "boost_modal.combo": "Keyingi safar buni oʻtkazib yuborish uchun {combo} tugmasini bosishingiz mumkin", "bundle_column_error.copy_stacktrace": "Xato hisobotini nusxalash", "bundle_column_error.error.body": "Soʻralgan sahifani koʻrsatib boʻlmadi. Buning sababi bizning kodimizdagi xato yoki brauzer mosligi muammosi bo'lishi mumkin.", @@ -126,22 +125,12 @@ "compose_form.lock_disclaimer": "Hisobingiz {locked}. Faqat obunachilarga moʻljallangan postlaringizni koʻrish uchun har kim sizni kuzatishi mumkin.", "compose_form.lock_disclaimer.lock": "yopilgan", "compose_form.placeholder": "Xalolizda nima?", - "compose_form.poll.add_option": "Tanlov qo'shing", "compose_form.poll.duration": "So‘rov muddati", - "compose_form.poll.option_placeholder": "Tanlov {number}", - "compose_form.poll.remove_option": "Olib tashlash", "compose_form.poll.switch_to_multiple": "Bir nechta tanlovga ruxsat berish uchun so'rovnomani o'zgartirish", "compose_form.poll.switch_to_single": "Yagona tanlovga ruxsat berish uchun so‘rovnomani o‘zgartirish", - "compose_form.publish": "Nashr qilish", "compose_form.publish_form": "Nashr qilish", - "compose_form.publish_loud": "{publish}!", - "compose_form.save_changes": "O‘zgarishlarni saqlash", - "compose_form.sensitive.hide": "{count, plural, one {Mediani sezgir deb belgilang} other {Medialarni sezgir deb belgilang}}", - "compose_form.sensitive.marked": "{count, plural, one {Mediani sezgir deb belgilang} other {Medialarni sezgir deb belgilang}}", - "compose_form.sensitive.unmarked": "{count, plural, one {Mediani sezgir deb belgilang} other {Medialarni sezgir deb belgilang}}", "compose_form.spoiler.marked": "Kontent ogohlantirishini olib tashlang", "compose_form.spoiler.unmarked": "Kontent haqida ogohlantirish qo'shing", - "compose_form.spoiler_placeholder": "Sharhingizni bu erga yozing", "confirmation_modal.cancel": "Bekor qilish", "confirmations.block.block_and_report": "Bloklash va hisobot berish", "confirmations.block.confirm": "Bloklash", @@ -336,7 +325,6 @@ "navigation_bar.compose": "Yangi post yozing", "navigation_bar.discover": "Kashf qilish", "navigation_bar.domain_blocks": "Bloklangan domenlar", - "navigation_bar.edit_profile": "Profilni tahrirlash", "navigation_bar.explore": "O‘rganish", "navigation_bar.filters": "E'tiborga olinmagan so'zlar", "navigation_bar.followed_tags": "Kuzatilgan hashtaglar", @@ -368,8 +356,6 @@ "onboarding.steps.share_profile.body": "Let your friends know how to find you on Mastodon!", "onboarding.steps.share_profile.title": "Share your profile", "privacy.change": "Adjust status privacy", - "privacy.direct.short": "Direct", - "privacy.private.short": "Followers-only", "report.placeholder": "Type or paste additional comments", "report.submit": "Submit report", "report.target": "Report {target}", diff --git a/app/javascript/mastodon/locales/vi.json b/app/javascript/mastodon/locales/vi.json index c623caa3fb..73a11b9573 100644 --- a/app/javascript/mastodon/locales/vi.json +++ b/app/javascript/mastodon/locales/vi.json @@ -89,7 +89,6 @@ "announcement.announcement": "Có gì mới?", "attachments_list.unprocessed": "(chưa xử lí)", "audio.hide": "Ẩn âm thanh", - "autosuggest_hashtag.per_week": "{count} mỗi tuần", "boost_modal.combo": "Nhấn {combo} để bỏ qua bước này", "bundle_column_error.copy_stacktrace": "Sao chép báo lỗi", "bundle_column_error.error.body": "Không thể hiện trang này. Đây có thể là một lỗi trong mã lập trình của chúng tôi, hoặc là vấn đề tương thích của trình duyệt.", @@ -146,22 +145,12 @@ "compose_form.lock_disclaimer": "Tài khoản của bạn không {locked}. Bất cứ ai cũng có thể theo dõi và xem tút riêng tư của bạn.", "compose_form.lock_disclaimer.lock": "khóa", "compose_form.placeholder": "Bạn đang nghĩ gì?", - "compose_form.poll.add_option": "Thêm lựa chọn", "compose_form.poll.duration": "Hết hạn vào", - "compose_form.poll.option_placeholder": "Lựa chọn {number}", - "compose_form.poll.remove_option": "Xóa lựa chọn này", "compose_form.poll.switch_to_multiple": "Có thể chọn nhiều lựa chọn", "compose_form.poll.switch_to_single": "Chỉ cho phép chọn duy nhất một lựa chọn", - "compose_form.publish": "Đăng", "compose_form.publish_form": "Đăng", - "compose_form.publish_loud": "{publish}!", - "compose_form.save_changes": "Lưu thay đổi", - "compose_form.sensitive.hide": "{count, plural, other {Đánh dấu nội dung nhạy cảm}}", - "compose_form.sensitive.marked": "{count, plural, other {Nội dung này nhạy cảm}}", - "compose_form.sensitive.unmarked": "{count, plural, other {Nội dung này bình thường}}", "compose_form.spoiler.marked": "Hủy nội dung ẩn", "compose_form.spoiler.unmarked": "Tạo nội dung ẩn", - "compose_form.spoiler_placeholder": "Lời dẫn cho nội dung ẩn", "confirmation_modal.cancel": "Hủy bỏ", "confirmations.block.block_and_report": "Chặn & Báo cáo", "confirmations.block.confirm": "Chặn", @@ -408,7 +397,6 @@ "navigation_bar.direct": "Nhắn riêng", "navigation_bar.discover": "Khám phá", "navigation_bar.domain_blocks": "Máy chủ đã ẩn", - "navigation_bar.edit_profile": "Sửa hồ sơ", "navigation_bar.explore": "Xu hướng", "navigation_bar.favourites": "Lượt thích", "navigation_bar.filters": "Bộ lọc từ ngữ", @@ -526,14 +514,7 @@ "poll_button.add_poll": "Tạo bình chọn", "poll_button.remove_poll": "Hủy cuộc bình chọn", "privacy.change": "Chọn kiểu tút", - "privacy.direct.long": "Chỉ người được nhắc đến mới thấy", - "privacy.direct.short": "Nhắn riêng", - "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", "privacy.public.short": "Công khai", - "privacy.unlisted.long": "Công khai nhưng ẩn trên bảng tin", - "privacy.unlisted.short": "Hạn chế", "privacy_policy.last_updated": "Cập nhật lần cuối {date}", "privacy_policy.title": "Chính sách bảo mật", "recommended": "Đề xuất", @@ -715,10 +696,8 @@ "upload_error.poll": "Không cho phép đính kèm tập tin.", "upload_form.audio_description": "Mô tả cho người mất thính giác", "upload_form.description": "Mô tả cho người khiếm thị", - "upload_form.description_missing": "Chưa thêm mô tả", "upload_form.edit": "Biên tập", "upload_form.thumbnail": "Đổi ảnh thumbnail", - "upload_form.undo": "Xóa bỏ", "upload_form.video_description": "Mô tả cho người mất thị lực hoặc không thể nghe", "upload_modal.analyzing_picture": "Phân tích hình ảnh", "upload_modal.apply": "Áp dụng", diff --git a/app/javascript/mastodon/locales/zgh.json b/app/javascript/mastodon/locales/zgh.json index 008a9636db..a585838cd2 100644 --- a/app/javascript/mastodon/locales/zgh.json +++ b/app/javascript/mastodon/locales/zgh.json @@ -22,7 +22,6 @@ "account.statuses_counter": "{count, plural, one {{counter} Toot} other {{counter} Toots}}", "account.unfollow": "ⴽⴽⵙ ⴰⴹⴼⴼⵓⵕ", "account_note.placeholder": "Click to add a note", - "autosuggest_hashtag.per_week": "{count} ⵙ ⵉⵎⴰⵍⴰⵙⵙ", "bundle_column_error.retry": "ⴰⵍⵙ ⴰⵔⵎ", "bundle_modal_error.close": "ⵔⴳⵍ", "bundle_modal_error.retry": "ⴰⵍⵙ ⴰⵔⵎ", @@ -44,9 +43,7 @@ "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.lock": "ⵉⵜⵜⵓⵔⴳⵍ", "compose_form.placeholder": "ⵎⴰⵢⴷ ⵉⵍⵍⴰⵏ ⴳ ⵉⵅⴼ ⵏⵏⴽ?", - "compose_form.poll.option_placeholder": "ⴰⵙⵜⵜⴰⵢ {number}", "compose_form.publish_form": "Publish", - "compose_form.publish_loud": "{publish}!", "compose_form.spoiler.marked": "Text is hidden behind warning", "compose_form.spoiler.unmarked": "Text is not hidden", "confirmation_modal.cancel": "ⵙⵔ", @@ -129,7 +126,6 @@ "media_gallery.toggle_visible": "ⴼⴼⵔ {number, plural, one {ⵜⴰⵡⵍⴰⴼⵜ} other {ⵜⵉⵡⵍⴰⴼⵉⵏ}}", "navigation_bar.compose": "Compose new toot", "navigation_bar.domain_blocks": "Hidden domains", - "navigation_bar.edit_profile": "ⵙⵏⴼⵍ ⵉⴼⵔⵙ", "navigation_bar.follow_requests": "ⵜⵓⵜⵔⴰⵡⵉⵏ ⵏ ⵓⴹⴼⴰⵕ", "navigation_bar.lists": "ⵜⵉⵍⴳⴰⵎⵉⵏ", "navigation_bar.logout": "ⴼⴼⵖ", @@ -161,8 +157,6 @@ "poll_button.add_poll": "ⵔⵏⵓ ⵢⴰⵏ ⵢⵉⴷⵣ", "poll_button.remove_poll": "ⵙⵙⵉⵜⵢ ⵉⴷⵣ", "privacy.change": "Adjust status privacy", - "privacy.direct.short": "Direct", - "privacy.private.short": "Followers-only", "privacy.public.short": "ⵜⴰⴳⴷⵓⴷⴰⵏⵜ", "regeneration_indicator.label": "ⴰⵣⴷⴰⵎ…", "relative_time.days": "{number}ⴰⵙ", @@ -211,7 +205,6 @@ "upload_form.audio_description": "Describe for people with hearing loss", "upload_form.description": "Describe for the visually impaired", "upload_form.edit": "ⵙⵏⴼⵍ", - "upload_form.undo": "ⴽⴽⵙ", "upload_form.video_description": "Describe for people with hearing loss or visual impairment", "upload_modal.choose_image": "ⴷⵖⵔ ⵜⴰⵡⵍⴰⴼⵜ", "upload_progress.label": "Uploading…", diff --git a/app/javascript/mastodon/locales/zh-CN.json b/app/javascript/mastodon/locales/zh-CN.json index 720e4331b3..9b55e51b1f 100644 --- a/app/javascript/mastodon/locales/zh-CN.json +++ b/app/javascript/mastodon/locales/zh-CN.json @@ -89,7 +89,6 @@ "announcement.announcement": "公告", "attachments_list.unprocessed": "(未处理)", "audio.hide": "隐藏音频", - "autosuggest_hashtag.per_week": "每星期 {count} 条", "boost_modal.combo": "下次按住 {combo} 即可跳过此提示", "bundle_column_error.copy_stacktrace": "复制错误报告", "bundle_column_error.error.body": "请求的页面无法渲染,可能是代码出现错误或浏览器存在兼容性问题。", @@ -148,20 +147,20 @@ "compose_form.placeholder": "想写什么?", "compose_form.poll.add_option": "添加选项", "compose_form.poll.duration": "投票期限", + "compose_form.poll.multiple": "多选", "compose_form.poll.option_placeholder": "选项 {number}", - "compose_form.poll.remove_option": "移除此选项", + "compose_form.poll.remove_option": "删除此选项", + "compose_form.poll.single": "单选", "compose_form.poll.switch_to_multiple": "将投票改为多选", "compose_form.poll.switch_to_single": "将投票改为单选", + "compose_form.poll.type": "样式", "compose_form.publish": "发布", "compose_form.publish_form": "发布", - "compose_form.publish_loud": "{publish}!", - "compose_form.save_changes": "保存更改", - "compose_form.sensitive.hide": "标记媒体为敏感内容", - "compose_form.sensitive.marked": "媒体已被标记为敏感内容", - "compose_form.sensitive.unmarked": "媒体未被标记为敏感内容", + "compose_form.reply": "回复", + "compose_form.save_changes": "更新", "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": "屏蔽", @@ -408,7 +407,6 @@ "navigation_bar.direct": "私下提及", "navigation_bar.discover": "发现", "navigation_bar.domain_blocks": "已屏蔽的域名", - "navigation_bar.edit_profile": "修改个人资料", "navigation_bar.explore": "探索", "navigation_bar.favourites": "喜欢", "navigation_bar.filters": "忽略的关键词", @@ -526,14 +524,15 @@ "poll_button.add_poll": "发起投票", "poll_button.remove_poll": "移除投票", "privacy.change": "设置嘟文的可见范围", - "privacy.direct.long": "只有被提及的用户能看到", - "privacy.direct.short": "仅提到的人", - "privacy.private.long": "仅对关注者可见", - "privacy.private.short": "仅关注者可见", - "privacy.public.long": "所有人可见", + "privacy.direct.long": "帖子中提到的每个人", + "privacy.direct.short": "具体的人", + "privacy.private.long": "仅限您的关注者", + "privacy.private.short": "关注者", + "privacy.public.long": "所有Mastodon内外的人", "privacy.public.short": "公开", - "privacy.unlisted.long": "所有人可见,但不在探索功能出现", - "privacy.unlisted.short": "不公开", + "privacy.unlisted.additional": "该模式的行为与“公开”完全相同,只是帖子不会出现在实时动态、话题标签、探索或 Mastodon 搜索中,即使你已在账户级设置中选择加入。", + "privacy.unlisted.long": "减少算法影响", + "privacy.unlisted.short": "悄悄公开", "privacy_policy.last_updated": "最近更新于 {date}", "privacy_policy.title": "隐私政策", "recommended": "推荐", @@ -551,7 +550,9 @@ "relative_time.minutes": "{number} 分钟前", "relative_time.seconds": "{number} 秒前", "relative_time.today": "今天", + "reply_indicator.attachments": "{count, plural, other {# 个附件}}", "reply_indicator.cancel": "取消", + "reply_indicator.poll": "投票", "report.block": "屏蔽", "report.block_explanation": "你将无法看到他们的嘟文。他们也将无法看到你的嘟文或关注你。他们将能够判断出他们被屏蔽了。", "report.categories.legal": "法律义务", @@ -715,10 +716,8 @@ "upload_error.poll": "投票中不允许上传文件。", "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_modal.analyzing_picture": "分析图片…", "upload_modal.apply": "应用", diff --git a/app/javascript/mastodon/locales/zh-HK.json b/app/javascript/mastodon/locales/zh-HK.json index cd0845b6e2..5890c4df4b 100644 --- a/app/javascript/mastodon/locales/zh-HK.json +++ b/app/javascript/mastodon/locales/zh-HK.json @@ -89,7 +89,6 @@ "announcement.announcement": "公告", "attachments_list.unprocessed": "(未處理)", "audio.hide": "隱藏音訊", - "autosuggest_hashtag.per_week": "每週 {count} 次", "boost_modal.combo": "你下次可以按 {combo} 來跳過", "bundle_column_error.copy_stacktrace": "複製錯誤報告", "bundle_column_error.error.body": "無法提供請求的頁面。這可能是因為代碼出現錯誤或瀏覽器出現兼容問題。", @@ -146,22 +145,22 @@ "compose_form.lock_disclaimer": "你的用戶狀態沒有{locked},任何人都能立即關注你,然後看到「只有關注者能看」的文章。", "compose_form.lock_disclaimer.lock": "鎖定", "compose_form.placeholder": "你在想甚麼?", - "compose_form.poll.add_option": "新增選擇", + "compose_form.poll.add_option": "新增選項", "compose_form.poll.duration": "投票期限", - "compose_form.poll.option_placeholder": "第 {number} 個選擇", - "compose_form.poll.remove_option": "移除此選擇", + "compose_form.poll.multiple": "多選", + "compose_form.poll.option_placeholder": "選項 {number}", + "compose_form.poll.remove_option": "移除此選項", + "compose_form.poll.single": "選擇一個", "compose_form.poll.switch_to_multiple": "變更投票為允許多個選項", "compose_form.poll.switch_to_single": "變更投票為限定單一選項", + "compose_form.poll.type": "風格", "compose_form.publish": "發佈", "compose_form.publish_form": "發佈", - "compose_form.publish_loud": "{publish}!", - "compose_form.save_changes": "儲存變更", - "compose_form.sensitive.hide": "標記媒體為敏感內容", - "compose_form.sensitive.marked": "媒體被標示為敏感", - "compose_form.sensitive.unmarked": "媒體沒有被標示為敏感", + "compose_form.reply": "回覆", + "compose_form.save_changes": "更新", "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": "封鎖", @@ -408,7 +407,6 @@ "navigation_bar.direct": "私人提及", "navigation_bar.discover": "探索", "navigation_bar.domain_blocks": "封鎖的服務站", - "navigation_bar.edit_profile": "修改個人資料", "navigation_bar.explore": "探索", "navigation_bar.favourites": "最愛", "navigation_bar.filters": "靜音詞彙", @@ -526,14 +524,15 @@ "poll_button.add_poll": "建立投票", "poll_button.remove_poll": "移除投票", "privacy.change": "調整私隱設定", - "privacy.direct.long": "只有提及的使用者能看到", - "privacy.direct.short": "僅限提及的人", - "privacy.private.long": "只有你的關注者能看到", - "privacy.private.short": "僅限追隨者", - "privacy.public.long": "對所有人可見", + "privacy.direct.long": "帖文提及的人", + "privacy.direct.short": "特定的人", + "privacy.private.long": "只有你的追蹤者", + "privacy.private.short": "追蹤者", + "privacy.public.long": "Mastodon 內外的任何人", "privacy.public.short": "公共", - "privacy.unlisted.long": "對所有人可見,但不包括探索功能", - "privacy.unlisted.short": "公開", + "privacy.unlisted.additional": "這與公開完全相同,但是你的帖文不會顯示在即時動態、標籤、探索和 Mastodon 的搜尋結果中,即使你的帳戶啟用了相關設定也好。", + "privacy.unlisted.long": "較少用演算法宣傳", + "privacy.unlisted.short": "半公開", "privacy_policy.last_updated": "最後更新 {date}", "privacy_policy.title": "私隱政策", "recommended": "推薦", @@ -551,7 +550,9 @@ "relative_time.minutes": "{number}分鐘前", "relative_time.seconds": "{number}秒前", "relative_time.today": "今天", + "reply_indicator.attachments": "{count, plural, one {# 附件} other {# 附件}}", "reply_indicator.cancel": "取消", + "reply_indicator.poll": "投票", "report.block": "封鎖", "report.block_explanation": "你將不會看到他們的帖文。他們將無法看到你的帖文或追隨你。他們將發現自己被封鎖了。", "report.categories.legal": "法律", @@ -715,10 +716,8 @@ "upload_error.poll": "不允許在投票上傳檔案。", "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_modal.analyzing_picture": "正在分析圖片…", "upload_modal.apply": "套用", diff --git a/app/javascript/mastodon/locales/zh-TW.json b/app/javascript/mastodon/locales/zh-TW.json index cc8b583120..c365e67e07 100644 --- a/app/javascript/mastodon/locales/zh-TW.json +++ b/app/javascript/mastodon/locales/zh-TW.json @@ -89,7 +89,6 @@ "announcement.announcement": "公告", "attachments_list.unprocessed": "(未經處理)", "audio.hide": "隱藏音訊", - "autosuggest_hashtag.per_week": "{count} / 週", "boost_modal.combo": "下次您可以按 {combo} 跳過", "bundle_column_error.copy_stacktrace": "複製錯誤報告", "bundle_column_error.error.body": "無法繪製請求的頁面。這可能是因為我們程式碼中的臭蟲或是瀏覽器的相容問題。", @@ -148,20 +147,20 @@ "compose_form.placeholder": "正在想些什麼嗎?", "compose_form.poll.add_option": "新增選項", "compose_form.poll.duration": "投票期限", - "compose_form.poll.option_placeholder": "第 {number} 個選項", + "compose_form.poll.multiple": "多選", + "compose_form.poll.option_placeholder": "選項 {number}", "compose_form.poll.remove_option": "移除此選項", + "compose_form.poll.single": "選擇一個", "compose_form.poll.switch_to_multiple": "變更投票為允許多個選項", "compose_form.poll.switch_to_single": "變更投票為允許單一選項", - "compose_form.publish": "嘟出去", + "compose_form.poll.type": "投票方式", + "compose_form.publish": "發嘟", "compose_form.publish_form": "嘟出去", - "compose_form.publish_loud": "{publish}!", - "compose_form.save_changes": "儲存變更", - "compose_form.sensitive.hide": "{count, plural, other {將媒體標記為敏感內容}}", - "compose_form.sensitive.marked": "此媒體被標記為敏感內容", - "compose_form.sensitive.unmarked": "此媒體未被標記為敏感內容", + "compose_form.reply": "回覆", + "compose_form.save_changes": "更新", "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": "封鎖", @@ -408,7 +407,6 @@ "navigation_bar.direct": "私訊", "navigation_bar.discover": "探索", "navigation_bar.domain_blocks": "已封鎖網域", - "navigation_bar.edit_profile": "編輯個人檔案", "navigation_bar.explore": "探索", "navigation_bar.favourites": "最愛", "navigation_bar.filters": "已靜音的關鍵字", @@ -526,13 +524,14 @@ "poll_button.add_poll": "建立投票", "poll_button.remove_poll": "移除投票", "privacy.change": "調整嘟文隱私狀態", - "privacy.direct.long": "只有被提及的使用者能看到", - "privacy.direct.short": "僅限提及者", - "privacy.private.long": "只有跟隨您的使用者能看到", - "privacy.private.short": "僅限跟隨者", - "privacy.public.long": "對所有人可見", + "privacy.direct.long": "此嘟文提及之所有人", + "privacy.direct.short": "指定使用者", + "privacy.private.long": "只有跟隨您的人能看到", + "privacy.private.short": "跟隨者", + "privacy.public.long": "所有人 (無論在 Mastodon 上與否)", "privacy.public.short": "公開", - "privacy.unlisted.long": "對所有人可見,但選擇退出探索功能", + "privacy.unlisted.additional": "此與公開嘟文完全相同,但嘟文不會出現於即時內容或主題標籤、探索、及 Mastodon 搜尋中,即使您在帳戶設定中選擇加入。", + "privacy.unlisted.long": "悄然無聲", "privacy.unlisted.short": "不公開", "privacy_policy.last_updated": "最後更新:{date}", "privacy_policy.title": "隱私權政策", @@ -551,7 +550,9 @@ "relative_time.minutes": "{number} 分鐘前", "relative_time.seconds": "{number} 秒", "relative_time.today": "今天", + "reply_indicator.attachments": "{count, plural, other {# 個附加檔案}}", "reply_indicator.cancel": "取消", + "reply_indicator.poll": "投票", "report.block": "封鎖", "report.block_explanation": "您將不再看到他們的嘟文。他們將無法看到您的嘟文或是跟隨您。他們會發現他們已被封鎖。", "report.categories.legal": "合法性", @@ -715,10 +716,8 @@ "upload_error.poll": "不允許於投票時上傳檔案。", "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_modal.analyzing_picture": "正在分析圖片…", "upload_modal.apply": "套用", diff --git a/config/locales/bg.yml b/config/locales/bg.yml index b9a3135448..9c8456a05f 100644 --- a/config/locales/bg.yml +++ b/config/locales/bg.yml @@ -1546,6 +1546,9 @@ bg: errors: limit_reached: Ограничението на различни реакции е достигнат unrecognized_emoji: не е разпознато емоджи + redirects: + prompt: Ако вярвате на тази връзка, то щракнете на нея, за да продължите. + title: Напускате %{instance}. relationships: activity: Дейност на акаунта confirm_follow_selected_followers: Наистина ли искате да последвате избраните последователи? diff --git a/config/locales/eu.yml b/config/locales/eu.yml index 44688577a9..444d0e2c5f 100644 --- a/config/locales/eu.yml +++ b/config/locales/eu.yml @@ -1646,7 +1646,7 @@ eu: back: Itzuli Mastodon-era delete: Kontuaren ezabaketa development: Garapena - edit_profile: Aldatu profila + edit_profile: Editatu profila export: Datuen esportazioa featured_tags: Nabarmendutako traolak import: Inportazioa @@ -1860,9 +1860,9 @@ eu: seamless_external_login: Kanpo zerbitzu baten bidez hasi duzu saioa, beraz pasahitza eta e-mail ezarpenak ez daude eskuragarri. signed_in_as: 'Saioa honela hasita:' verification: - extra_instructions_html: Aholkua: webguneko esteka ikusezina izan daiteke. Muina rel="me" da, erabiltzaileak sortutako edukia duten webguneetan beste inor zure burutzat aurkeztea eragozten duena. a beharrean esteka-etiketa bat ere erabil dezakezu orrialdearen goiburuan, baina HTMLak eskuragarri egon behar du JavaScript exekutatu gabe. + extra_instructions_html: Aholkua: webguneko esteka ikusezina izan daiteke. Muina rel="me" da, erabiltzaileak sortutako edukia duten webguneetan beste inor zure burutzat aurkeztea eragozten duena. a beharrean esteka motako etiketa bat ere erabil dezakezu orriaren goiburuan, baina HTMLak erabilgarri egon behar du JavaScript exekutatu gabe. here_is_how: Hemen duzu nola - hint_html: "Mastodonen nortasun-egiaztapena guztiontzat da. Web estandar irekietan oinarritua, orain eta betiko doan. Behar duzun guztia jendeak ezagutzen duen webgune pertsonal bat da. Mastodon profiletik webgune honetara estekatzen duzunean, webguneak mastodon profilera estekatzen duela egiaztatuko dugu eta adierazle bat erakutsiko du." + hint_html: "Mastodonen nortasun-egiaztapena guztiontzat da. Web estandar irekietan oinarritua, orain eta betiko doan. Behar duzun guztia jendeak ezagutzen duen webgune pertsonal bat da. Mastodon profiletik webgune honetara estekatzen duzunean, webguneak Mastodon profilera estekatzen duela egiaztatuko dugu eta adierazle bat erakutsiko du." instructions_html: Kopiatu eta itsatsi ondoko kodea zure webguneko HTMLan. Ondoren, gehitu zure webgunearen helbidea zure profileko eremu gehigarrietako batean, "Editatu profila" fitxatik eta gorde aldaketak. verification: Egiaztaketa verified_links: Zure lotura egiaztatuak diff --git a/config/locales/fa.yml b/config/locales/fa.yml index 0514772c1d..bb3368dd9e 100644 --- a/config/locales/fa.yml +++ b/config/locales/fa.yml @@ -406,6 +406,7 @@ fa: silence: محدود suspend: تعلیق title: مسدودسازی دامین تازه + no_domain_block_selected: هیچ انسداد دامنه‌ای تغییر نکرد زیرا هیچ‌کدامشان انتخاب نشده بودند not_permitted: شما مجاز به انجام این عملیات نیستید obfuscate: مبهم‌سازی نام دامنهٔ obfuscate_hint: در صورت به کار افتاده بودن اعلام فهرست محدودیت‌های دامنه، نام دامنه در فهرست را به صورت جزیی مبهم می‌کند diff --git a/config/locales/hi.yml b/config/locales/hi.yml index 9b505e5f92..b67de192f2 100644 --- a/config/locales/hi.yml +++ b/config/locales/hi.yml @@ -38,6 +38,9 @@ hi: upload_check_privacy_error_object_storage: action: अधिक जानकारी हेतु यहां क्लिक करें। message_html: " आपके वेब सर्वर का कन्फिगरेशन सही नहीं है। उपयोगकर्ताओं की निजता खतरे में है। " + redirects: + prompt: अगर आपको इस लिंक पर भरोसा है तो आगे बढ़ने के लिए इसे क्लिक करें + title: आप इस %{instance} को छोड़ने वाले हैं relationships: follow_failure: चुने हुए अकाउंट्स में से कुछ को फ़ॉलो नहीं किया जा सकता sessions: @@ -50,3 +53,9 @@ hi: time: formats: with_time_zone: "%b %d, %Y, %H:%M %Z" + user_mailer: + failed_2fa: + details: 'आपके साइन इन प्रयासों के डिटेल ये रहे:' + explanation: किसी ने आपके अकाउंट पर साइन इन करने का प्रयास किया लेकिन दूसरा प्रमाणीकरण विकल्प गलत दिया। + further_actions_html: अगर ये आप नहीं थे, तो हम अनुरोध करते हैं कि आप तुरंत %{action} लें क्योंकि ये शायद खतरे में है। + subject: दूसरा फैक्टर सत्यापन नाकाम रहा diff --git a/config/locales/hu.yml b/config/locales/hu.yml index 8cbbb64c97..545da69d9c 100644 --- a/config/locales/hu.yml +++ b/config/locales/hu.yml @@ -1547,7 +1547,8 @@ hu: limit_reached: A különböző reakciók száma elérte a határértéket unrecognized_emoji: nem ismert emodzsi redirects: - prompt: Ha megbízunk ebben a hivatkozásban, kattintsunk rá a folytatáshoz. + prompt: Ha megbízol ebben a hivatkozásban, kattints rá a folytatáshoz. + title: Épp elhagyni készülöd a %{instance} kiszolgálót. relationships: activity: Fiók aktivitás confirm_follow_selected_followers: Biztos, hogy követni akarod a kiválasztott követőket? diff --git a/config/locales/ie.yml b/config/locales/ie.yml index c77a8f802d..a8287da533 100644 --- a/config/locales/ie.yml +++ b/config/locales/ie.yml @@ -1546,6 +1546,9 @@ ie: errors: limit_reached: Límite de diferent reactiones atinget unrecognized_emoji: ne es un reconosset emoji + redirects: + prompt: Si tu fide ti ligament, clicca it por continuar. + title: Tu exea de %{instance}. relationships: activity: Activitá de conto confirm_follow_selected_followers: Esque tu vermen vole sequer selectet sequitores? diff --git a/config/locales/ja.yml b/config/locales/ja.yml index 2051e30aee..6880f64c5e 100644 --- a/config/locales/ja.yml +++ b/config/locales/ja.yml @@ -1520,6 +1520,9 @@ ja: errors: limit_reached: リアクションの種類が上限に達しました unrecognized_emoji: は絵文字として認識されていません + redirects: + prompt: リンク先を確かめ、信用できる場合のみリンクをクリックしてください。 + title: "%{instance} から別のサーバーに移動します。" relationships: activity: 活動 confirm_follow_selected_followers: 選択したフォロワーをフォローしてもよろしいですか? diff --git a/config/locales/zh-TW.yml b/config/locales/zh-TW.yml index 72e63e47d3..7fe60541e6 100644 --- a/config/locales/zh-TW.yml +++ b/config/locales/zh-TW.yml @@ -1449,7 +1449,7 @@ zh-TW: title: 新的跟隨請求 mention: action: 回覆 - body: "%{name} 於嘟文中提及您:" + body: "%{name} 於嘟文中提及您:" subject: "%{name} 於嘟文中提及您" title: 新的提及 poll: From 805dba7f8d2a2d5f910ec1396247b36417170345 Mon Sep 17 00:00:00 2001 From: Claire Date: Fri, 26 Jan 2024 15:09:45 +0100 Subject: [PATCH 004/211] Change compose form to use server-provided post character limit (#28928) --- .../features/compose/components/compose_form.jsx | 9 +++++---- .../compose/containers/compose_form_container.js | 1 + 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/app/javascript/mastodon/features/compose/components/compose_form.jsx b/app/javascript/mastodon/features/compose/components/compose_form.jsx index c5ee894683..b93bac9d19 100644 --- a/app/javascript/mastodon/features/compose/components/compose_form.jsx +++ b/app/javascript/mastodon/features/compose/components/compose_form.jsx @@ -70,6 +70,7 @@ class ComposeForm extends ImmutablePureComponent { isInReply: PropTypes.bool, singleColumn: PropTypes.bool, lang: PropTypes.string, + maxChars: PropTypes.number, ...WithOptionalRouterPropTypes }; @@ -101,11 +102,11 @@ class ComposeForm extends ImmutablePureComponent { }; canSubmit = () => { - const { isSubmitting, isChangingUpload, isUploading, anyMedia } = this.props; + const { isSubmitting, isChangingUpload, isUploading, anyMedia, maxChars } = this.props; const fulltext = this.getFulltextForCharacterCounting(); const isOnlyWhitespace = fulltext.length !== 0 && fulltext.trim().length === 0; - return !(isSubmitting || isUploading || isChangingUpload || length(fulltext) > 500 || (isOnlyWhitespace && !anyMedia)); + return !(isSubmitting || isUploading || isChangingUpload || length(fulltext) > maxChars || (isOnlyWhitespace && !anyMedia)); }; handleSubmit = (e) => { @@ -224,7 +225,7 @@ class ComposeForm extends ImmutablePureComponent { }; render () { - const { intl, onPaste, autoFocus, withoutNavigation } = this.props; + const { intl, onPaste, autoFocus, withoutNavigation, maxChars } = this.props; const { highlighted } = this.state; const disabled = this.props.isSubmitting; @@ -297,7 +298,7 @@ class ComposeForm extends ImmutablePureComponent { - +
diff --git a/app/javascript/mastodon/features/compose/containers/compose_form_container.js b/app/javascript/mastodon/features/compose/containers/compose_form_container.js index ba20698bac..b5e5300334 100644 --- a/app/javascript/mastodon/features/compose/containers/compose_form_container.js +++ b/app/javascript/mastodon/features/compose/containers/compose_form_container.js @@ -28,6 +28,7 @@ const mapStateToProps = state => ({ anyMedia: state.getIn(['compose', 'media_attachments']).size > 0, isInReply: state.getIn(['compose', 'in_reply_to']) !== null, lang: state.getIn(['compose', 'language']), + maxChars: state.getIn(['server', 'server', 'configuration', 'statuses', 'max_characters'], 500), }); const mapDispatchToProps = (dispatch) => ({ From 9cc1817bb493799b89d1171a1d632abb9791340c Mon Sep 17 00:00:00 2001 From: Matt Jankowski Date: Fri, 26 Jan 2024 09:10:26 -0500 Subject: [PATCH 005/211] Fix intmermittent failure in `api/v1/accounts/statuses` controller spec (#28931) --- .../api/v1/accounts/statuses_controller_spec.rb | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/spec/controllers/api/v1/accounts/statuses_controller_spec.rb b/spec/controllers/api/v1/accounts/statuses_controller_spec.rb index df71e94ace..9bf385c03d 100644 --- a/spec/controllers/api/v1/accounts/statuses_controller_spec.rb +++ b/spec/controllers/api/v1/accounts/statuses_controller_spec.rb @@ -39,11 +39,14 @@ describe Api::V1::Accounts::StatusesController do end it 'returns posts along with self replies', :aggregate_failures do - json = body_as_json - post_ids = json.map { |item| item[:id].to_i }.sort - - expect(response).to have_http_status(200) - expect(post_ids).to eq [status.id, status_self_reply.id] + expect(response) + .to have_http_status(200) + expect(body_as_json) + .to have_attributes(size: 2) + .and contain_exactly( + include(id: status.id.to_s), + include(id: status_self_reply.id.to_s) + ) end end From 2f8656334d341839bc471d1850850d80f920f01c Mon Sep 17 00:00:00 2001 From: Matt Jankowski Date: Fri, 26 Jan 2024 11:21:31 -0500 Subject: [PATCH 006/211] Combine double subjects in `admin/accounts` controller spec (#28936) --- .../admin/accounts_controller_spec.rb | 17 +++-------------- 1 file changed, 3 insertions(+), 14 deletions(-) diff --git a/spec/controllers/admin/accounts_controller_spec.rb b/spec/controllers/admin/accounts_controller_spec.rb index 1882ea8388..ef3053b6b3 100644 --- a/spec/controllers/admin/accounts_controller_spec.rb +++ b/spec/controllers/admin/accounts_controller_spec.rb @@ -153,13 +153,9 @@ RSpec.describe Admin::AccountsController do context 'when user is admin' do let(:role) { UserRole.find_by(name: 'Admin') } - it 'succeeds in approving account' do + it 'succeeds in approving account and logs action' do expect(subject).to redirect_to admin_accounts_path(status: 'pending') expect(user.reload).to be_approved - end - - it 'logs action' do - expect(subject).to have_http_status 302 expect(latest_admin_action_log) .to be_present @@ -195,12 +191,8 @@ RSpec.describe Admin::AccountsController do context 'when user is admin' do let(:role) { UserRole.find_by(name: 'Admin') } - it 'succeeds in rejecting account' do + it 'succeeds in rejecting account and logs action' do expect(subject).to redirect_to admin_accounts_path(status: 'pending') - end - - it 'logs action' do - expect(subject).to have_http_status 302 expect(latest_admin_action_log) .to be_present @@ -286,12 +278,9 @@ RSpec.describe Admin::AccountsController do context 'when user is admin' do let(:role) { UserRole.find_by(name: 'Admin') } - it 'succeeds in removing email blocks' do + it 'succeeds in removing email blocks and redirects to admin account path' do expect { subject }.to change { CanonicalEmailBlock.where(reference_account: account).count }.from(1).to(0) - end - it 'redirects to admin account path' do - subject expect(response).to redirect_to admin_account_path(account.id) end end From 6d35a77c9226881c1d554566aca120e330004df1 Mon Sep 17 00:00:00 2001 From: Matt Jankowski Date: Fri, 26 Jan 2024 11:22:44 -0500 Subject: [PATCH 007/211] Combine repeated subjects in `models/user` spec (#28937) --- spec/models/user_spec.rb | 30 ++++++------------------------ 1 file changed, 6 insertions(+), 24 deletions(-) diff --git a/spec/models/user_spec.rb b/spec/models/user_spec.rb index 213022e830..5ac41c0ff1 100644 --- a/spec/models/user_spec.rb +++ b/spec/models/user_spec.rb @@ -187,12 +187,9 @@ RSpec.describe User do context 'when the user is already confirmed' do let!(:user) { Fabricate(:user, confirmed_at: Time.now.utc, approved: true, unconfirmed_email: new_email) } - it 'sets email to unconfirmed_email' do + it 'sets email to unconfirmed_email and does not trigger web hook' do expect { subject }.to change { user.reload.email }.to(new_email) - end - it 'does not trigger the account.approved Web Hook' do - subject expect(TriggerWebhookWorker).to_not have_received(:perform_async).with('account.approved', 'Account', user.account_id) end end @@ -206,12 +203,9 @@ RSpec.describe User do user.approve! end - it 'sets email to unconfirmed_email' do + it 'sets email to unconfirmed_email and triggers `account.approved` web hook' do expect { subject }.to change { user.reload.email }.to(new_email) - end - it 'triggers the account.approved Web Hook' do - user.confirm expect(TriggerWebhookWorker).to have_received(:perform_async).with('account.approved', 'Account', user.account_id).once end end @@ -221,12 +215,9 @@ RSpec.describe User do Setting.registrations_mode = 'open' end - it 'sets email to unconfirmed_email' do + it 'sets email to unconfirmed_email and triggers `account.approved` web hook' do expect { subject }.to change { user.reload.email }.to(new_email) - end - it 'triggers the account.approved Web Hook' do - user.confirm expect(TriggerWebhookWorker).to have_received(:perform_async).with('account.approved', 'Account', user.account_id).once end end @@ -236,12 +227,9 @@ RSpec.describe User do Setting.registrations_mode = 'approved' end - it 'sets email to unconfirmed_email' do + it 'sets email to unconfirmed_email and does not trigger web hook' do expect { subject }.to change { user.reload.email }.to(new_email) - end - it 'does not trigger the account.approved Web Hook' do - subject expect(TriggerWebhookWorker).to_not have_received(:perform_async).with('account.approved', 'Account', user.account_id) end end @@ -259,12 +247,9 @@ RSpec.describe User do context 'when the user is already confirmed' do let(:user) { Fabricate(:user, confirmed_at: Time.now.utc, approved: false) } - it 'sets the approved flag' do + it 'sets the approved flag and triggers `account.approved` web hook' do expect { subject }.to change { user.reload.approved? }.to(true) - end - it 'triggers the account.approved Web Hook' do - subject expect(TriggerWebhookWorker).to have_received(:perform_async).with('account.approved', 'Account', user.account_id).once end end @@ -272,12 +257,9 @@ RSpec.describe User do context 'when the user is not confirmed' do let(:user) { Fabricate(:user, confirmed_at: nil, approved: false) } - it 'sets the approved flag' do + it 'sets the approved flag and does not trigger web hook' do expect { subject }.to change { user.reload.approved? }.to(true) - end - it 'does not trigger the account.approved Web Hook' do - subject expect(TriggerWebhookWorker).to_not have_received(:perform_async).with('account.approved', 'Account', user.account_id) end end From beaef4b6723cc0ddd34a3139749e02e870178c2b Mon Sep 17 00:00:00 2001 From: Matt Jankowski Date: Fri, 26 Jan 2024 11:23:12 -0500 Subject: [PATCH 008/211] Combine double subjects in application controller shared example (#28938) --- spec/controllers/application_controller_spec.rb | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/spec/controllers/application_controller_spec.rb b/spec/controllers/application_controller_spec.rb index e9d4796035..a309e933ee 100644 --- a/spec/controllers/application_controller_spec.rb +++ b/spec/controllers/application_controller_spec.rb @@ -22,13 +22,10 @@ describe ApplicationController do end shared_examples 'respond_with_error' do |code| - it "returns http #{code} for http" do - subject - expect(response).to have_http_status(code) - end - - it 'renders template for http' do + it "returns http #{code} for http and renders template" do expect(subject).to render_template("errors/#{code}", layout: 'error') + + expect(response).to have_http_status(code) end end From beb74fd71cba1c460c8ef3df016905aa063bdc7f Mon Sep 17 00:00:00 2001 From: Matt Jankowski Date: Fri, 26 Jan 2024 11:28:50 -0500 Subject: [PATCH 009/211] Combine double subjects in instance actors controller shared example (#28939) --- .../instance_actors_controller_spec.rb | 16 +++------------- 1 file changed, 3 insertions(+), 13 deletions(-) diff --git a/spec/controllers/instance_actors_controller_spec.rb b/spec/controllers/instance_actors_controller_spec.rb index 8406094311..36b9049fbc 100644 --- a/spec/controllers/instance_actors_controller_spec.rb +++ b/spec/controllers/instance_actors_controller_spec.rb @@ -12,30 +12,20 @@ RSpec.describe InstanceActorsController do get :show, params: { format: format } end - it 'returns http success' do + it 'returns http success with correct media type, headers, and session values' do expect(response).to have_http_status(200) - end - it 'returns application/activity+json' do expect(response.media_type).to eq 'application/activity+json' - end - it 'does not set cookies' do expect(response.cookies).to be_empty expect(response.headers['Set-Cookies']).to be_nil - end - it 'does not set sessions' do expect(session).to be_empty - end - it 'returns public Cache-Control header' do expect(response.headers['Cache-Control']).to include 'public' - end - it 'renders account' do - json = body_as_json - expect(json).to include(:id, :type, :preferredUsername, :inbox, :publicKey, :inbox, :outbox, :url) + expect(body_as_json) + .to include(:id, :type, :preferredUsername, :inbox, :publicKey, :inbox, :outbox, :url) end end From 685eaa04d4037886e4d7f4e346183a04c292bf0a Mon Sep 17 00:00:00 2001 From: Matt Jankowski Date: Fri, 26 Jan 2024 11:30:30 -0500 Subject: [PATCH 010/211] Combine double subject in admin/statuses controller shared example (#28940) --- spec/controllers/admin/statuses_controller_spec.rb | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/spec/controllers/admin/statuses_controller_spec.rb b/spec/controllers/admin/statuses_controller_spec.rb index dc5e28e972..4e8bf9ead6 100644 --- a/spec/controllers/admin/statuses_controller_spec.rb +++ b/spec/controllers/admin/statuses_controller_spec.rb @@ -60,16 +60,14 @@ describe Admin::StatusesController do shared_examples 'when action is report' do let(:action) { 'report' } - it 'creates a report' do + it 'creates a report and redirects to report page' do subject - report = Report.last - expect(report.target_account_id).to eq account.id - expect(report.status_ids).to eq status_ids - end - - it 'redirects to report page' do - subject + expect(Report.last) + .to have_attributes( + target_account_id: eq(account.id), + status_ids: eq(status_ids) + ) expect(response).to redirect_to(admin_report_path(Report.last.id)) end From 1a30a517d60148c518cb74d6c8fbbef21f6fae56 Mon Sep 17 00:00:00 2001 From: Matt Jankowski Date: Fri, 26 Jan 2024 11:31:07 -0500 Subject: [PATCH 011/211] Combine repeated subjects in link details extractor spec (#28941) --- spec/lib/link_details_extractor_spec.rb | 132 ++++++------------------ 1 file changed, 30 insertions(+), 102 deletions(-) diff --git a/spec/lib/link_details_extractor_spec.rb b/spec/lib/link_details_extractor_spec.rb index 8c485cef2a..26d9d4e265 100644 --- a/spec/lib/link_details_extractor_spec.rb +++ b/spec/lib/link_details_extractor_spec.rb @@ -46,22 +46,13 @@ RSpec.describe LinkDetailsExtractor do HTML - describe '#title' do - it 'returns the title from title tag' do - expect(subject.title).to eq 'Man bites dog' - end - end - - describe '#description' do - it 'returns the description from meta tag' do - expect(subject.description).to eq "A dog's tale" - end - end - - describe '#language' do - it 'returns the language from lang attribute' do - expect(subject.language).to eq 'en' - end + it 'extracts the expected values from html metadata' do + expect(subject) + .to have_attributes( + title: eq('Man bites dog'), + description: eq("A dog's tale"), + language: eq('en') + ) end end @@ -90,40 +81,16 @@ RSpec.describe LinkDetailsExtractor do end shared_examples 'structured data' do - describe '#title' do - it 'returns the title from structured data' do - expect(subject.title).to eq 'Man bites dog' - end - end - - describe '#description' do - it 'returns the description from structured data' do - expect(subject.description).to eq "A dog's tale" - end - end - - describe '#published_at' do - it 'returns the publicaton time from structured data' do - expect(subject.published_at).to eq '2022-01-31T19:53:00+00:00' - end - end - - describe '#author_name' do - it 'returns the author name from structured data' do - expect(subject.author_name).to eq 'Charlie Brown' - end - end - - describe '#provider_name' do - it 'returns the provider name from structured data' do - expect(subject.provider_name).to eq 'Pet News' - end - end - - describe '#language' do - it 'returns the language from structured data' do - expect(subject.language).to eq 'en' - end + it 'extracts the expected values from structured data' do + expect(subject) + .to have_attributes( + title: eq('Man bites dog'), + description: eq("A dog's tale"), + published_at: eq('2022-01-31T19:53:00+00:00'), + author_name: eq('Charlie Brown'), + provider_name: eq('Pet News'), + language: eq('en') + ) end end @@ -245,58 +212,19 @@ RSpec.describe LinkDetailsExtractor do HTML - describe '#canonical_url' do - it 'returns the URL from Open Graph protocol data' do - expect(subject.canonical_url).to eq 'https://example.com/dog.html' - end - end - - describe '#title' do - it 'returns the title from Open Graph protocol data' do - expect(subject.title).to eq 'Man bites dog' - end - end - - describe '#description' do - it 'returns the description from Open Graph protocol data' do - expect(subject.description).to eq "A dog's tale" - end - end - - describe '#published_at' do - it 'returns the publicaton time from Open Graph protocol data' do - expect(subject.published_at).to eq '2022-01-31T19:53:00+00:00' - end - end - - describe '#author_name' do - it 'returns the author name from Open Graph protocol data' do - expect(subject.author_name).to eq 'Charlie Brown' - end - end - - describe '#language' do - it 'returns the language from Open Graph protocol data' do - expect(subject.language).to eq 'en' - end - end - - describe '#image' do - it 'returns the image from Open Graph protocol data' do - expect(subject.image).to eq 'https://example.com/snoopy.jpg' - end - end - - describe '#image:alt' do - it 'returns the image description from Open Graph protocol data' do - expect(subject.image_alt).to eq 'A good boy' - end - end - - describe '#provider_name' do - it 'returns the provider name from Open Graph protocol data' do - expect(subject.provider_name).to eq 'Pet News' - end + it 'extracts the expected values from open graph data' do + expect(subject) + .to have_attributes( + canonical_url: eq('https://example.com/dog.html'), + title: eq('Man bites dog'), + description: eq("A dog's tale"), + published_at: eq('2022-01-31T19:53:00+00:00'), + author_name: eq('Charlie Brown'), + language: eq('en'), + image: eq('https://example.com/snoopy.jpg'), + image_alt: eq('A good boy'), + provider_name: eq('Pet News') + ) end end end From 5fbdb2055becdb4177ad8aa0b3891cb2617d223b Mon Sep 17 00:00:00 2001 From: Matt Jankowski Date: Fri, 26 Jan 2024 11:35:19 -0500 Subject: [PATCH 012/211] Combine repeated `subject` in `cli/accounts` spec shared example (#28942) --- spec/lib/mastodon/cli/accounts_spec.rb | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/spec/lib/mastodon/cli/accounts_spec.rb b/spec/lib/mastodon/cli/accounts_spec.rb index 98be2b2027..137f85c6ca 100644 --- a/spec/lib/mastodon/cli/accounts_spec.rb +++ b/spec/lib/mastodon/cli/accounts_spec.rb @@ -1326,18 +1326,16 @@ describe Mastodon::CLI::Accounts do end shared_examples 'a successful migration' do - it 'calls the MoveService for the last migration' do + it 'displays a success message and calls the MoveService for the last migration' do expect { subject } - .to output_results('OK') - - last_migration = source_account.migrations.last + .to output_results("OK, migrated #{source_account.acct} to #{target_account.acct}") - expect(move_service).to have_received(:call).with(last_migration).once + expect(move_service) + .to have_received(:call).with(last_migration).once end - it 'displays a successful message' do - expect { subject } - .to output_results("OK, migrated #{source_account.acct} to #{target_account.acct}") + def last_migration + source_account.migrations.last end end From 09a3493fcacf7ae4f190fceb3c22a0510eac022f Mon Sep 17 00:00:00 2001 From: Matt Jankowski Date: Fri, 26 Jan 2024 11:35:49 -0500 Subject: [PATCH 013/211] Combine double subject in `api/v1/media` shared example (#28943) --- spec/requests/api/v1/media_spec.rb | 10 ++-------- 1 file changed, 2 insertions(+), 8 deletions(-) diff --git a/spec/requests/api/v1/media_spec.rb b/spec/requests/api/v1/media_spec.rb index 2c29328087..26c76b9c5b 100644 --- a/spec/requests/api/v1/media_spec.rb +++ b/spec/requests/api/v1/media_spec.rb @@ -76,20 +76,14 @@ RSpec.describe 'Media' do let(:params) { {} } shared_examples 'a successful media upload' do |media_type| - it 'uploads the file successfully', :aggregate_failures do + it 'uploads the file successfully and returns correct media content', :aggregate_failures do subject expect(response).to have_http_status(200) expect(MediaAttachment.first).to be_present expect(MediaAttachment.first).to have_attached_file(:file) - end - - it 'returns the correct media content' do - subject - - body = body_as_json - expect(body).to match( + expect(body_as_json).to match( a_hash_including(id: MediaAttachment.first.id.to_s, description: params[:description], type: media_type) ) end From d791bca11b69f0599a000c8568885dc2ee14ef06 Mon Sep 17 00:00:00 2001 From: Matt Jankowski Date: Fri, 26 Jan 2024 11:36:21 -0500 Subject: [PATCH 014/211] Combine double subject in `well_known/webfinger` shared example (#28944) --- spec/requests/well_known/webfinger_spec.rb | 16 ++++++---------- 1 file changed, 6 insertions(+), 10 deletions(-) diff --git a/spec/requests/well_known/webfinger_spec.rb b/spec/requests/well_known/webfinger_spec.rb index 779f1bba59..0aafdf5624 100644 --- a/spec/requests/well_known/webfinger_spec.rb +++ b/spec/requests/well_known/webfinger_spec.rb @@ -17,22 +17,18 @@ describe 'The /.well-known/webfinger endpoint' do end shared_examples 'a successful response' do - it 'returns http success' do + it 'returns http success with correct media type and headers and body json' do expect(response).to have_http_status(200) - end - it 'sets only a Vary Origin header' do expect(response.headers['Vary']).to eq('Origin') - end - it 'returns application/jrd+json' do expect(response.media_type).to eq 'application/jrd+json' - end - it 'returns links for the account' do - json = body_as_json - expect(json[:subject]).to eq 'acct:alice@cb6e6126.ngrok.io' - expect(json[:aliases]).to include('https://cb6e6126.ngrok.io/@alice', 'https://cb6e6126.ngrok.io/users/alice') + expect(body_as_json) + .to include( + subject: eq('acct:alice@cb6e6126.ngrok.io'), + aliases: include('https://cb6e6126.ngrok.io/@alice', 'https://cb6e6126.ngrok.io/users/alice') + ) end end From e519f113e8154dacd7fd1b67b35bd3f40d9768a2 Mon Sep 17 00:00:00 2001 From: Matt Jankowski Date: Fri, 26 Jan 2024 11:37:05 -0500 Subject: [PATCH 015/211] Combine repeated subject in `cacheable response` shared example (#28945) --- spec/support/examples/cache.rb | 12 ++---------- 1 file changed, 2 insertions(+), 10 deletions(-) diff --git a/spec/support/examples/cache.rb b/spec/support/examples/cache.rb index 43cfbade82..afbee66b2d 100644 --- a/spec/support/examples/cache.rb +++ b/spec/support/examples/cache.rb @@ -1,22 +1,14 @@ # frozen_string_literal: true shared_examples 'cacheable response' do |expects_vary: false| - it 'does not set cookies' do + it 'sets correct cache and vary headers and does not set cookies or session' do expect(response.cookies).to be_empty expect(response.headers['Set-Cookies']).to be_nil - end - it 'does not set sessions' do expect(session).to be_empty - end - if expects_vary - it 'returns Vary header' do - expect(response.headers['Vary']).to include(expects_vary) - end - end + expect(response.headers['Vary']).to include(expects_vary) if expects_vary - it 'returns public Cache-Control header' do expect(response.headers['Cache-Control']).to include('public') end end From 160c8f492362abca1c97e0e63cef1cafdd3ba6ab Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Fri, 26 Jan 2024 17:49:03 +0100 Subject: [PATCH 016/211] Update babel monorepo to v7.23.9 (#28916) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- yarn.lock | 172 +++++++++++++++++++++++++++--------------------------- 1 file changed, 86 insertions(+), 86 deletions(-) diff --git a/yarn.lock b/yarn.lock index 78261b3b84..759c43138b 100644 --- a/yarn.lock +++ b/yarn.lock @@ -42,7 +42,7 @@ __metadata: languageName: node linkType: hard -"@babel/code-frame@npm:^7.0.0, @babel/code-frame@npm:^7.10.4, @babel/code-frame@npm:^7.12.13, @babel/code-frame@npm:^7.22.13, @babel/code-frame@npm:^7.23.5": +"@babel/code-frame@npm:^7.0.0, @babel/code-frame@npm:^7.10.4, @babel/code-frame@npm:^7.12.13, @babel/code-frame@npm:^7.23.5": version: 7.23.5 resolution: "@babel/code-frame@npm:7.23.5" dependencies: @@ -60,25 +60,25 @@ __metadata: linkType: hard "@babel/core@npm:^7.10.4, @babel/core@npm:^7.11.1, @babel/core@npm:^7.11.6, @babel/core@npm:^7.12.3, @babel/core@npm:^7.22.1": - version: 7.23.7 - resolution: "@babel/core@npm:7.23.7" + version: 7.23.9 + resolution: "@babel/core@npm:7.23.9" dependencies: "@ampproject/remapping": "npm:^2.2.0" "@babel/code-frame": "npm:^7.23.5" "@babel/generator": "npm:^7.23.6" "@babel/helper-compilation-targets": "npm:^7.23.6" "@babel/helper-module-transforms": "npm:^7.23.3" - "@babel/helpers": "npm:^7.23.7" - "@babel/parser": "npm:^7.23.6" - "@babel/template": "npm:^7.22.15" - "@babel/traverse": "npm:^7.23.7" - "@babel/types": "npm:^7.23.6" + "@babel/helpers": "npm:^7.23.9" + "@babel/parser": "npm:^7.23.9" + "@babel/template": "npm:^7.23.9" + "@babel/traverse": "npm:^7.23.9" + "@babel/types": "npm:^7.23.9" convert-source-map: "npm:^2.0.0" debug: "npm:^4.1.0" gensync: "npm:^1.0.0-beta.2" json5: "npm:^2.2.3" semver: "npm:^6.3.1" - checksum: 38c9934973d384ed83369712978453eac91dc3f22167404dbdb272b64f602e74728a6f37012c53ee57e521b8ae2da60097f050497d9b6a212d28b59cdfb2cd1d + checksum: 03883300bf1252ab4c9ba5b52f161232dd52873dbe5cde9289bb2bb26e935c42682493acbac9194a59a3b6cbd17f4c4c84030db8d6d482588afe64531532ff9b languageName: node linkType: hard @@ -167,9 +167,9 @@ __metadata: languageName: node linkType: hard -"@babel/helper-define-polyfill-provider@npm:^0.4.4": - version: 0.4.4 - resolution: "@babel/helper-define-polyfill-provider@npm:0.4.4" +"@babel/helper-define-polyfill-provider@npm:^0.5.0": + version: 0.5.0 + resolution: "@babel/helper-define-polyfill-provider@npm:0.5.0" dependencies: "@babel/helper-compilation-targets": "npm:^7.22.6" "@babel/helper-plugin-utils": "npm:^7.22.5" @@ -178,7 +178,7 @@ __metadata: resolve: "npm:^1.14.2" peerDependencies: "@babel/core": ^7.4.0 || ^8.0.0-0 <8.0.0 - checksum: 60126f5f719b9e2114df62e3bf3ac0797b71d8dc733db60192eb169b004fde72ee309fa5848c5fdfe98b8e8863c46f55e16da5aa8a4e420b4d2670cd0c5dd708 + checksum: 2b053b96a0c604a7e0f5c7d13a8a55f4451d938f7af42bd40f62a87df15e6c87a0b1dbd893a0f0bb51077b54dc3ba00a58b166531a5940ad286ab685dd8979ec languageName: node linkType: hard @@ -342,14 +342,14 @@ __metadata: languageName: node linkType: hard -"@babel/helpers@npm:^7.23.7": - version: 7.23.7 - resolution: "@babel/helpers@npm:7.23.7" +"@babel/helpers@npm:^7.23.9": + version: 7.23.9 + resolution: "@babel/helpers@npm:7.23.9" dependencies: - "@babel/template": "npm:^7.22.15" - "@babel/traverse": "npm:^7.23.7" - "@babel/types": "npm:^7.23.6" - checksum: f74a61ad28a1bc1fdd9133ad571c07787b66d6db017c707b87c203b0cd06879cea8b33e9c6a8585765a4949efa5df3cc9e19b710fe867f11be38ee29fd4a0488 + "@babel/template": "npm:^7.23.9" + "@babel/traverse": "npm:^7.23.9" + "@babel/types": "npm:^7.23.9" + checksum: f69fd0aca96a6fb8bd6dd044cd8a5c0f1851072d4ce23355345b9493c4032e76d1217f86b70df795e127553cf7f3fcd1587ede9d1b03b95e8b62681ca2165b87 languageName: node linkType: hard @@ -364,12 +364,12 @@ __metadata: languageName: node linkType: hard -"@babel/parser@npm:^7.1.0, @babel/parser@npm:^7.14.7, @babel/parser@npm:^7.20.7, @babel/parser@npm:^7.22.15, @babel/parser@npm:^7.23.6": - version: 7.23.6 - resolution: "@babel/parser@npm:7.23.6" +"@babel/parser@npm:^7.1.0, @babel/parser@npm:^7.14.7, @babel/parser@npm:^7.20.7, @babel/parser@npm:^7.23.9": + version: 7.23.9 + resolution: "@babel/parser@npm:7.23.9" bin: parser: ./bin/babel-parser.js - checksum: 6f76cd5ccae1fa9bcab3525b0865c6222e9c1d22f87abc69f28c5c7b2c8816a13361f5bd06bddbd5faf903f7320a8feba02545c981468acec45d12a03db7755e + checksum: 7df97386431366d4810538db4b9ec538f4377096f720c0591c7587a16f6810e62747e9fbbfa1ff99257fd4330035e4fb1b5b77c7bd3b97ce0d2e3780a6618975 languageName: node linkType: hard @@ -661,9 +661,9 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-transform-async-generator-functions@npm:^7.23.7": - version: 7.23.7 - resolution: "@babel/plugin-transform-async-generator-functions@npm:7.23.7" +"@babel/plugin-transform-async-generator-functions@npm:^7.23.9": + version: 7.23.9 + resolution: "@babel/plugin-transform-async-generator-functions@npm:7.23.9" dependencies: "@babel/helper-environment-visitor": "npm:^7.22.20" "@babel/helper-plugin-utils": "npm:^7.22.5" @@ -671,7 +671,7 @@ __metadata: "@babel/plugin-syntax-async-generators": "npm:^7.8.4" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 63d314edc9fbeaf2700745ca0e19bf9840e87f2d7d1f6c5638e06d2aec3e7418d0d7493ed09087e2fe369cc15e9d96c113fb2cd367cb5e3ff922e3712c27b7d4 + checksum: 4ff75f9ce500e1de8c0236fa5122e6475a477d19cb9a4c2ae8651e78e717ebb2e2cecfeca69d420def779deaec78b945843b9ffd15f02ecd7de5072030b4469b languageName: node linkType: hard @@ -931,9 +931,9 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-transform-modules-systemjs@npm:^7.23.3": - version: 7.23.3 - resolution: "@babel/plugin-transform-modules-systemjs@npm:7.23.3" +"@babel/plugin-transform-modules-systemjs@npm:^7.23.9": + version: 7.23.9 + resolution: "@babel/plugin-transform-modules-systemjs@npm:7.23.9" dependencies: "@babel/helper-hoist-variables": "npm:^7.22.5" "@babel/helper-module-transforms": "npm:^7.23.3" @@ -941,7 +941,7 @@ __metadata: "@babel/helper-validator-identifier": "npm:^7.22.20" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 0d55280a276510222c8896bf4e581acb84824aa5b14c824f7102242ad6bc5104aaffe5ab22fe4d27518f4ae2811bd59c36d0c0bfa695157f9cfce33f0517a069 + checksum: 1926631fe9d87c0c53427a3420ad49da62d53320d0016b6afab64e5417a672aa5bdff3ea1d24746ffa1e43319c28a80f5d8cef0ad214760d399c293b5850500f languageName: node linkType: hard @@ -1200,18 +1200,18 @@ __metadata: linkType: hard "@babel/plugin-transform-runtime@npm:^7.22.4": - version: 7.23.7 - resolution: "@babel/plugin-transform-runtime@npm:7.23.7" + version: 7.23.9 + resolution: "@babel/plugin-transform-runtime@npm:7.23.9" dependencies: "@babel/helper-module-imports": "npm:^7.22.15" "@babel/helper-plugin-utils": "npm:^7.22.5" - babel-plugin-polyfill-corejs2: "npm:^0.4.7" - babel-plugin-polyfill-corejs3: "npm:^0.8.7" - babel-plugin-polyfill-regenerator: "npm:^0.5.4" + babel-plugin-polyfill-corejs2: "npm:^0.4.8" + babel-plugin-polyfill-corejs3: "npm:^0.9.0" + babel-plugin-polyfill-regenerator: "npm:^0.5.5" semver: "npm:^6.3.1" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 0d5038462a5762c3a88d820785f685ce1b659075527a3ad538647fd9ce486052777d5aea3d62e626639d60441a04dd0ded2ed32c86b92cf8afbdbd3d54460c13 + checksum: 3b959c2b88ea0009c288fa190d9f69b0d26cb336b8a7cab54a5e54b844f33cce1996725c15305a40049c8f23ca30082ee27e1f6853ff35fad723543e3d2dba47 languageName: node linkType: hard @@ -1333,8 +1333,8 @@ __metadata: linkType: hard "@babel/preset-env@npm:^7.11.0, @babel/preset-env@npm:^7.12.1, @babel/preset-env@npm:^7.22.4": - version: 7.23.8 - resolution: "@babel/preset-env@npm:7.23.8" + version: 7.23.9 + resolution: "@babel/preset-env@npm:7.23.9" dependencies: "@babel/compat-data": "npm:^7.23.5" "@babel/helper-compilation-targets": "npm:^7.23.6" @@ -1363,7 +1363,7 @@ __metadata: "@babel/plugin-syntax-top-level-await": "npm:^7.14.5" "@babel/plugin-syntax-unicode-sets-regex": "npm:^7.18.6" "@babel/plugin-transform-arrow-functions": "npm:^7.23.3" - "@babel/plugin-transform-async-generator-functions": "npm:^7.23.7" + "@babel/plugin-transform-async-generator-functions": "npm:^7.23.9" "@babel/plugin-transform-async-to-generator": "npm:^7.23.3" "@babel/plugin-transform-block-scoped-functions": "npm:^7.23.3" "@babel/plugin-transform-block-scoping": "npm:^7.23.4" @@ -1385,7 +1385,7 @@ __metadata: "@babel/plugin-transform-member-expression-literals": "npm:^7.23.3" "@babel/plugin-transform-modules-amd": "npm:^7.23.3" "@babel/plugin-transform-modules-commonjs": "npm:^7.23.3" - "@babel/plugin-transform-modules-systemjs": "npm:^7.23.3" + "@babel/plugin-transform-modules-systemjs": "npm:^7.23.9" "@babel/plugin-transform-modules-umd": "npm:^7.23.3" "@babel/plugin-transform-named-capturing-groups-regex": "npm:^7.22.5" "@babel/plugin-transform-new-target": "npm:^7.23.3" @@ -1411,14 +1411,14 @@ __metadata: "@babel/plugin-transform-unicode-regex": "npm:^7.23.3" "@babel/plugin-transform-unicode-sets-regex": "npm:^7.23.3" "@babel/preset-modules": "npm:0.1.6-no-external-plugins" - babel-plugin-polyfill-corejs2: "npm:^0.4.7" - babel-plugin-polyfill-corejs3: "npm:^0.8.7" - babel-plugin-polyfill-regenerator: "npm:^0.5.4" + babel-plugin-polyfill-corejs2: "npm:^0.4.8" + babel-plugin-polyfill-corejs3: "npm:^0.9.0" + babel-plugin-polyfill-regenerator: "npm:^0.5.5" core-js-compat: "npm:^3.31.0" semver: "npm:^6.3.1" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: e602ad954645f1a509644e3d2c72b3c63bdc2273c377e7a83b78f076eca215887ea3624ffc36aaad03deb9ac8acd89e247fd4562b96e0f2b679485e20d8ff25f + checksum: 2837a42089180e51bfd6864b6d197e01fc0abec1920422e71c0513c2fc8fb5f3bfe694ed778cc4e45856c546964945bc53bf8105e4b26f3580ce3685fa50cc0f languageName: node linkType: hard @@ -1483,28 +1483,28 @@ __metadata: linkType: hard "@babel/runtime@npm:^7.0.0, @babel/runtime@npm:^7.1.2, @babel/runtime@npm:^7.11.2, @babel/runtime@npm:^7.12.0, @babel/runtime@npm:^7.12.13, @babel/runtime@npm:^7.12.5, @babel/runtime@npm:^7.13.8, @babel/runtime@npm:^7.18.3, @babel/runtime@npm:^7.2.0, @babel/runtime@npm:^7.20.13, @babel/runtime@npm:^7.22.3, @babel/runtime@npm:^7.23.2, @babel/runtime@npm:^7.3.1, @babel/runtime@npm:^7.5.5, @babel/runtime@npm:^7.6.3, @babel/runtime@npm:^7.8.4, @babel/runtime@npm:^7.8.7, @babel/runtime@npm:^7.9.2": - version: 7.23.8 - resolution: "@babel/runtime@npm:7.23.8" + version: 7.23.9 + resolution: "@babel/runtime@npm:7.23.9" dependencies: regenerator-runtime: "npm:^0.14.0" - checksum: ba5e8fbb32ef04f6cab5e89c54a0497c2fde7b730595cc1af93496270314f13ff2c6a9360fdb2f0bdd4d6b376752ce3cf85642bd6b876969a6a62954934c2df8 + checksum: e71205fdd7082b2656512cc98e647d9ea7e222e4fe5c36e9e5adc026446fcc3ba7b3cdff8b0b694a0b78bb85db83e7b1e3d4c56ef90726682b74f13249cf952d languageName: node linkType: hard -"@babel/template@npm:^7.22.15, @babel/template@npm:^7.3.3": - version: 7.22.15 - resolution: "@babel/template@npm:7.22.15" +"@babel/template@npm:^7.22.15, @babel/template@npm:^7.23.9, @babel/template@npm:^7.3.3": + version: 7.23.9 + resolution: "@babel/template@npm:7.23.9" dependencies: - "@babel/code-frame": "npm:^7.22.13" - "@babel/parser": "npm:^7.22.15" - "@babel/types": "npm:^7.22.15" - checksum: 9312edd37cf1311d738907003f2aa321a88a42ba223c69209abe4d7111db019d321805504f606c7fd75f21c6cf9d24d0a8223104cd21ebd207e241b6c551f454 + "@babel/code-frame": "npm:^7.23.5" + "@babel/parser": "npm:^7.23.9" + "@babel/types": "npm:^7.23.9" + checksum: 0e8b60119433787742bc08ae762bbd8d6755611c4cabbcb7627b292ec901a55af65d93d1c88572326069efb64136ef151ec91ffb74b2df7689bbab237030833a languageName: node linkType: hard -"@babel/traverse@npm:7, @babel/traverse@npm:^7.23.7": - version: 7.23.7 - resolution: "@babel/traverse@npm:7.23.7" +"@babel/traverse@npm:7, @babel/traverse@npm:^7.23.9": + version: 7.23.9 + resolution: "@babel/traverse@npm:7.23.9" dependencies: "@babel/code-frame": "npm:^7.23.5" "@babel/generator": "npm:^7.23.6" @@ -1512,22 +1512,22 @@ __metadata: "@babel/helper-function-name": "npm:^7.23.0" "@babel/helper-hoist-variables": "npm:^7.22.5" "@babel/helper-split-export-declaration": "npm:^7.22.6" - "@babel/parser": "npm:^7.23.6" - "@babel/types": "npm:^7.23.6" + "@babel/parser": "npm:^7.23.9" + "@babel/types": "npm:^7.23.9" debug: "npm:^4.3.1" globals: "npm:^11.1.0" - checksum: e32fceb4249beec2bde83968ddffe17444221c1ee5cd18c543a2feaf94e3ca83f2a4dfbc2dcca87cf226e0105973e0fe3717063a21e982a9de9945615ab3f3f5 + checksum: d1615d1d02f04d47111a7ea4446a1a6275668ca39082f31d51f08380de9502e19862be434eaa34b022ce9a17dbb8f9e2b73a746c654d9575f3a680a7ffdf5630 languageName: node linkType: hard -"@babel/types@npm:^7.0.0, @babel/types@npm:^7.0.0-beta.49, @babel/types@npm:^7.12.11, @babel/types@npm:^7.12.6, @babel/types@npm:^7.20.7, @babel/types@npm:^7.22.10, @babel/types@npm:^7.22.15, @babel/types@npm:^7.22.19, @babel/types@npm:^7.22.5, @babel/types@npm:^7.23.0, @babel/types@npm:^7.23.6, @babel/types@npm:^7.3.3, @babel/types@npm:^7.4.4, @babel/types@npm:^7.8.3": - version: 7.23.6 - resolution: "@babel/types@npm:7.23.6" +"@babel/types@npm:^7.0.0, @babel/types@npm:^7.0.0-beta.49, @babel/types@npm:^7.12.11, @babel/types@npm:^7.12.6, @babel/types@npm:^7.20.7, @babel/types@npm:^7.22.10, @babel/types@npm:^7.22.15, @babel/types@npm:^7.22.19, @babel/types@npm:^7.22.5, @babel/types@npm:^7.23.0, @babel/types@npm:^7.23.6, @babel/types@npm:^7.23.9, @babel/types@npm:^7.3.3, @babel/types@npm:^7.4.4, @babel/types@npm:^7.8.3": + version: 7.23.9 + resolution: "@babel/types@npm:7.23.9" dependencies: "@babel/helper-string-parser": "npm:^7.23.4" "@babel/helper-validator-identifier": "npm:^7.22.20" to-fast-properties: "npm:^2.0.0" - checksum: 42cefce8a68bd09bb5828b4764aa5586c53c60128ac2ac012e23858e1c179347a4aac9c66fc577994fbf57595227611c5ec8270bf0cfc94ff033bbfac0550b70 + checksum: edc7bb180ce7e4d2aea10c6972fb10474341ac39ba8fdc4a27ffb328368dfdfbf40fca18e441bbe7c483774500d5c05e222cec276c242e952853dcaf4eb884f7 languageName: node linkType: hard @@ -4805,39 +4805,39 @@ __metadata: languageName: node linkType: hard -"babel-plugin-polyfill-corejs2@npm:^0.4.7": - version: 0.4.7 - resolution: "babel-plugin-polyfill-corejs2@npm:0.4.7" +"babel-plugin-polyfill-corejs2@npm:^0.4.8": + version: 0.4.8 + resolution: "babel-plugin-polyfill-corejs2@npm:0.4.8" dependencies: "@babel/compat-data": "npm:^7.22.6" - "@babel/helper-define-polyfill-provider": "npm:^0.4.4" + "@babel/helper-define-polyfill-provider": "npm:^0.5.0" semver: "npm:^6.3.1" peerDependencies: "@babel/core": ^7.4.0 || ^8.0.0-0 <8.0.0 - checksum: f80f7284ec72c63e7dd751e0bdf25e9978df195a79e0887470603bfdea13ee518d62573cf360bb1bc01b80819e54915dd5edce9cff14c52d0af5f984aa3d36a3 + checksum: 843e7528de0e03a31a6f3837896a95f75b0b24b0294a077246282372279e974400b0bdd82399e8f9cbfe42c87ed56540fd71c33eafb7c8e8b9adac546ecc5fe5 languageName: node linkType: hard -"babel-plugin-polyfill-corejs3@npm:^0.8.7": - version: 0.8.7 - resolution: "babel-plugin-polyfill-corejs3@npm:0.8.7" +"babel-plugin-polyfill-corejs3@npm:^0.9.0": + version: 0.9.0 + resolution: "babel-plugin-polyfill-corejs3@npm:0.9.0" dependencies: - "@babel/helper-define-polyfill-provider": "npm:^0.4.4" - core-js-compat: "npm:^3.33.1" + "@babel/helper-define-polyfill-provider": "npm:^0.5.0" + core-js-compat: "npm:^3.34.0" peerDependencies: "@babel/core": ^7.4.0 || ^8.0.0-0 <8.0.0 - checksum: 094e40f4ab9f131408202063964d63740609fd4fdb70a5b6332b371761921b540ffbcee7a434c0199b8317dfb2ba4675eef674867215fd3b85e24054607c1501 + checksum: b857010736c5e42e20b683973dae862448a42082fcc95b3ef188305a6864a4f94b5cbd568e49e4cd7172c6b2eace7bc403c3ba0984fbe5479474ade01126d559 languageName: node linkType: hard -"babel-plugin-polyfill-regenerator@npm:^0.5.4": - version: 0.5.4 - resolution: "babel-plugin-polyfill-regenerator@npm:0.5.4" +"babel-plugin-polyfill-regenerator@npm:^0.5.5": + version: 0.5.5 + resolution: "babel-plugin-polyfill-regenerator@npm:0.5.5" dependencies: - "@babel/helper-define-polyfill-provider": "npm:^0.4.4" + "@babel/helper-define-polyfill-provider": "npm:^0.5.0" peerDependencies: "@babel/core": ^7.4.0 || ^8.0.0-0 <8.0.0 - checksum: 0b903f5fe2f8c487b4260935dfe60bd9a95bcaee7ae63958f063045093b16d4e8288c232199d411261300aa21f6b106a3cb83c42cc996de013b337f5825a79fe + checksum: 2aab692582082d54e0df9f9373dca1b223e65b4e7e96440160f27ed8803d417a1fa08da550f08aa3820d2010329ca91b68e2b6e9bd7aed51c93d46dfe79629bb languageName: node linkType: hard @@ -5922,12 +5922,12 @@ __metadata: languageName: node linkType: hard -"core-js-compat@npm:^3.31.0, core-js-compat@npm:^3.33.1": - version: 3.35.0 - resolution: "core-js-compat@npm:3.35.0" +"core-js-compat@npm:^3.31.0, core-js-compat@npm:^3.34.0": + version: 3.35.1 + resolution: "core-js-compat@npm:3.35.1" dependencies: browserslist: "npm:^4.22.2" - checksum: 8c4379240b8decb94b21e81d5ba6f768418721061923b28c9dfc97574680c35d778d39c010207402fc7c8308a68a4cf6d5e02bcbcb96e931c52e6e0dce29a68c + checksum: c3b872e1f9703aa9554cce816207d85730da4703f1776c540b4da11bbbef6d9a1e6041625b5c1f58d2ada3d05f4a2b92897b7de5315c5ecd5d33d50dec86cca7 languageName: node linkType: hard From f4a12adfb7f1706d82460c9e27a28101a87d35ac Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Fri, 26 Jan 2024 17:49:09 +0100 Subject: [PATCH 017/211] Update dependency axios to v1.6.7 (#28917) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- yarn.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/yarn.lock b/yarn.lock index 759c43138b..a2ea797d38 100644 --- a/yarn.lock +++ b/yarn.lock @@ -4673,13 +4673,13 @@ __metadata: linkType: hard "axios@npm:^1.4.0": - version: 1.6.6 - resolution: "axios@npm:1.6.6" + version: 1.6.7 + resolution: "axios@npm:1.6.7" dependencies: follow-redirects: "npm:^1.15.4" form-data: "npm:^4.0.0" proxy-from-env: "npm:^1.1.0" - checksum: 974f54cfade94fd4c0191309122a112c8d233089cecb0070cd8e0904e9bd9c364ac3a6fd0f981c978508077249788950427c565f54b7b2110e5c3426006ff343 + checksum: 131bf8e62eee48ca4bd84e6101f211961bf6a21a33b95e5dfb3983d5a2fe50d9fffde0b57668d7ce6f65063d3dc10f2212cbcb554f75cfca99da1c73b210358d languageName: node linkType: hard From 87ad398ddc78f2da5746774960690661e8e57335 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Fri, 26 Jan 2024 17:49:16 +0100 Subject: [PATCH 018/211] Update formatjs monorepo (#28925) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- yarn.lock | 72 +++++++++++++++++++++++++++---------------------------- 1 file changed, 36 insertions(+), 36 deletions(-) diff --git a/yarn.lock b/yarn.lock index a2ea797d38..3f70a02e74 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1830,14 +1830,14 @@ __metadata: languageName: node linkType: hard -"@formatjs/icu-messageformat-parser@npm:2.7.5": - version: 2.7.5 - resolution: "@formatjs/icu-messageformat-parser@npm:2.7.5" +"@formatjs/icu-messageformat-parser@npm:2.7.6": + version: 2.7.6 + resolution: "@formatjs/icu-messageformat-parser@npm:2.7.6" dependencies: "@formatjs/ecma402-abstract": "npm:1.18.2" - "@formatjs/icu-skeleton-parser": "npm:1.7.2" + "@formatjs/icu-skeleton-parser": "npm:1.8.0" tslib: "npm:^2.4.0" - checksum: b1995ee0844c48d1b4bf184017a65600eb1d324107046c8b67d77e08d7da74bbbbf00dccbf2bc418480c8510443b3eb157646404fbacd71fa6e7d572d0ffc910 + checksum: 9fc72c2075333a969601e2be4260638940b1abefd1a5fc15b93b0b10d2319c9df5778aa51fc2a173ce66ca5e8a47b4b64caca85a32d0eb6095e16e8d65cb4b00 languageName: node linkType: hard @@ -1851,13 +1851,13 @@ __metadata: languageName: node linkType: hard -"@formatjs/icu-skeleton-parser@npm:1.7.2": - version: 1.7.2 - resolution: "@formatjs/icu-skeleton-parser@npm:1.7.2" +"@formatjs/icu-skeleton-parser@npm:1.8.0": + version: 1.8.0 + resolution: "@formatjs/icu-skeleton-parser@npm:1.8.0" dependencies: "@formatjs/ecma402-abstract": "npm:1.18.2" tslib: "npm:^2.4.0" - checksum: 7ca30ac360a5a971b5a06b4ae0263f0ddbde4751ff470486767f544f0399c5c85affab7170e5dd227c65afac4797e79a5e8abe65a70a335b96ab77b5d314abcb + checksum: 10956732d70cc67049d216410b5dc3ef048935d1ea2ae76f5755bb9d0243af37ddeabd5d140ddbf5f6c7047068c3d02a05f93c68a89cedfaf7488d5062885ea4 languageName: node linkType: hard @@ -1912,31 +1912,31 @@ __metadata: languageName: node linkType: hard -"@formatjs/intl@npm:2.9.11": - version: 2.9.11 - resolution: "@formatjs/intl@npm:2.9.11" +"@formatjs/intl@npm:2.10.0": + version: 2.10.0 + resolution: "@formatjs/intl@npm:2.10.0" dependencies: "@formatjs/ecma402-abstract": "npm:1.18.2" "@formatjs/fast-memoize": "npm:2.2.0" - "@formatjs/icu-messageformat-parser": "npm:2.7.5" + "@formatjs/icu-messageformat-parser": "npm:2.7.6" "@formatjs/intl-displaynames": "npm:6.6.6" "@formatjs/intl-listformat": "npm:7.5.5" - intl-messageformat: "npm:10.5.10" + intl-messageformat: "npm:10.5.11" tslib: "npm:^2.4.0" peerDependencies: typescript: ^4.7 || 5 peerDependenciesMeta: typescript: optional: true - checksum: 003a4356e698cf847aeb701565cad701f3afba2a31d8d3c2fe0d5790d90ef866bea30cf2cc20151b15085db10e436376d38c10b911b3fe5afdef5c32333d09f3 + checksum: 7566038b011116cee7069165a25836b3fb687948e61b041809a9d978ac6c0882ae8d81a624a415cfb8e43852d097cd1cbc3c6707e717928e39b75c252491a712 languageName: node linkType: hard -"@formatjs/ts-transformer@npm:3.13.11": - version: 3.13.11 - resolution: "@formatjs/ts-transformer@npm:3.13.11" +"@formatjs/ts-transformer@npm:3.13.12": + version: 3.13.12 + resolution: "@formatjs/ts-transformer@npm:3.13.12" dependencies: - "@formatjs/icu-messageformat-parser": "npm:2.7.5" + "@formatjs/icu-messageformat-parser": "npm:2.7.6" "@types/json-stable-stringify": "npm:^1.0.32" "@types/node": "npm:14 || 16 || 17" chalk: "npm:^4.0.0" @@ -1948,7 +1948,7 @@ __metadata: peerDependenciesMeta: ts-jest: optional: true - checksum: 2f7c48e742a152d0499615d01113fab23089c3c56beaa3234f53bbe48393b6351c68eba1aa23d6dec57ebfd7b1d12b165215950eeb87dd90072519dcc0a2e022 + checksum: 68f72ee6379b87b7ef6340e118a5370cb2fa18cbbae08f5f3d10893803a52f0533e644002e0b5e9ffeded5b2f0aa9daad6adf8b487b10f5d2b61f9fb3fed0dbd languageName: node linkType: hard @@ -4725,21 +4725,21 @@ __metadata: linkType: hard "babel-plugin-formatjs@npm:^10.5.1": - version: 10.5.12 - resolution: "babel-plugin-formatjs@npm:10.5.12" + version: 10.5.13 + resolution: "babel-plugin-formatjs@npm:10.5.13" dependencies: "@babel/core": "npm:^7.10.4" "@babel/helper-plugin-utils": "npm:^7.10.4" "@babel/plugin-syntax-jsx": "npm:7" "@babel/traverse": "npm:7" "@babel/types": "npm:^7.12.11" - "@formatjs/icu-messageformat-parser": "npm:2.7.5" - "@formatjs/ts-transformer": "npm:3.13.11" + "@formatjs/icu-messageformat-parser": "npm:2.7.6" + "@formatjs/ts-transformer": "npm:3.13.12" "@types/babel__core": "npm:^7.1.7" "@types/babel__helper-plugin-utils": "npm:^7.10.0" "@types/babel__traverse": "npm:^7.1.7" tslib: "npm:^2.4.0" - checksum: 64fe3a38b283bb46e5528ad2f72287ca8a163227b0eea3bbe1bedff6d885b2be38c9fb8ed3843a72b723aeb2a7ad4d32b48e52030698631dc646aa15017f4208 + checksum: 1ce0b69478dd3c92126a7e3440f1fad46feebebc9318e8bbb102dea91a60448da4a8511b3c8ffbf2c3675995fca6c8ce7f097c08907455b33a5f9185e39fb94e languageName: node linkType: hard @@ -9271,15 +9271,15 @@ __metadata: languageName: node linkType: hard -"intl-messageformat@npm:10.5.10, intl-messageformat@npm:^10.3.5": - version: 10.5.10 - resolution: "intl-messageformat@npm:10.5.10" +"intl-messageformat@npm:10.5.11, intl-messageformat@npm:^10.3.5": + version: 10.5.11 + resolution: "intl-messageformat@npm:10.5.11" dependencies: "@formatjs/ecma402-abstract": "npm:1.18.2" "@formatjs/fast-memoize": "npm:2.2.0" - "@formatjs/icu-messageformat-parser": "npm:2.7.5" + "@formatjs/icu-messageformat-parser": "npm:2.7.6" tslib: "npm:^2.4.0" - checksum: 2016c0561e5172b28f180669e28992d04944752d61ebcb539232cc289e7627fd92fe64c73985bc32bddd5cc683f7b77863c1b58507d214ce3a87982d50571658 + checksum: 423f1c879ce2d0e7b9e0b4c1787a81ead7fe4d1734e0366a20fef56b06c09146e7ca3618e2e78b4f8b8f2b59cafe6237ceed21530fe0c16cfb47d915fc80222d languageName: node linkType: hard @@ -13669,18 +13669,18 @@ __metadata: linkType: hard "react-intl@npm:^6.4.2": - version: 6.6.1 - resolution: "react-intl@npm:6.6.1" + version: 6.6.2 + resolution: "react-intl@npm:6.6.2" dependencies: "@formatjs/ecma402-abstract": "npm:1.18.2" - "@formatjs/icu-messageformat-parser": "npm:2.7.5" - "@formatjs/intl": "npm:2.9.11" + "@formatjs/icu-messageformat-parser": "npm:2.7.6" + "@formatjs/intl": "npm:2.10.0" "@formatjs/intl-displaynames": "npm:6.6.6" "@formatjs/intl-listformat": "npm:7.5.5" "@types/hoist-non-react-statics": "npm:^3.3.1" "@types/react": "npm:16 || 17 || 18" hoist-non-react-statics: "npm:^3.3.2" - intl-messageformat: "npm:10.5.10" + intl-messageformat: "npm:10.5.11" tslib: "npm:^2.4.0" peerDependencies: react: ^16.6.0 || 17 || 18 @@ -13688,7 +13688,7 @@ __metadata: peerDependenciesMeta: typescript: optional: true - checksum: 9277269eadbe432a9651af66402240b8a91a567c769ac9c1a774575999f63689a31dccf22a09a1d78d1b8fed4ecad103bdcc609e476ee7e60dabf0cbce6556d3 + checksum: 78288a0fded816735812dca6dcfee3eaa8bb3af7e963ba47639b51cc700a102a526859ff647ca79a5ebcdc69d6d78da90daeeed15cc0b819c7a20a74b2e1469c languageName: node linkType: hard From 0b0ca6f3b85c9d08e4642e49d743f8d060632293 Mon Sep 17 00:00:00 2001 From: Matt Jankowski Date: Fri, 26 Jan 2024 12:40:15 -0500 Subject: [PATCH 019/211] Move `api/v1/timelines/list` to request spec (#28948) --- .../api/v1/timelines/list_spec.rb} | 21 +++++++++---------- 1 file changed, 10 insertions(+), 11 deletions(-) rename spec/{controllers/api/v1/timelines/list_controller_spec.rb => requests/api/v1/timelines/list_spec.rb} (73%) diff --git a/spec/controllers/api/v1/timelines/list_controller_spec.rb b/spec/requests/api/v1/timelines/list_spec.rb similarity index 73% rename from spec/controllers/api/v1/timelines/list_controller_spec.rb rename to spec/requests/api/v1/timelines/list_spec.rb index 4ef5d41af8..98d2456745 100644 --- a/spec/controllers/api/v1/timelines/list_controller_spec.rb +++ b/spec/requests/api/v1/timelines/list_spec.rb @@ -2,20 +2,17 @@ require 'rails_helper' -describe Api::V1::Timelines::ListController do - render_views - +describe 'API V1 Timelines List' do let(:user) { Fabricate(:user) } + let(:scopes) { 'read:statuses' } + let(:token) { Fabricate(:accessible_access_token, resource_owner_id: user.id, scopes: scopes) } + let(:headers) { { 'Authorization' => "Bearer #{token.token}" } } let(:list) { Fabricate(:list, account: user.account) } - before do - allow(controller).to receive(:doorkeeper_token) { token } - end - context 'with a user context' do let(:token) { Fabricate(:accessible_access_token, resource_owner_id: user.id, scopes: 'read:lists') } - describe 'GET #show' do + describe 'GET /api/v1/timelines/list/:id' do before do follow = Fabricate(:follow, account: user.account) list.accounts << follow.target_account @@ -23,7 +20,8 @@ describe Api::V1::Timelines::ListController do end it 'returns http success' do - get :show, params: { id: list.id } + get "/api/v1/timelines/list/#{list.id}", headers: headers + expect(response).to have_http_status(200) end end @@ -35,7 +33,8 @@ describe Api::V1::Timelines::ListController do describe 'GET #show' do it 'returns http not found' do - get :show, params: { id: list.id } + get "/api/v1/timelines/list/#{list.id}", headers: headers + expect(response).to have_http_status(404) end end @@ -46,7 +45,7 @@ describe Api::V1::Timelines::ListController do describe 'GET #show' do it 'returns http unprocessable entity' do - get :show, params: { id: list.id } + get "/api/v1/timelines/list/#{list.id}", headers: headers expect(response).to have_http_status(422) expect(response.headers['Link']).to be_nil From 7adcc0aae3cadf946411192e680be9e1b7af9d7a Mon Sep 17 00:00:00 2001 From: Matt Jankowski Date: Fri, 26 Jan 2024 12:40:39 -0500 Subject: [PATCH 020/211] Move `api/v1/trends/*` to request specs (#28949) --- .../api/v1/trends/links_spec.rb} | 10 ++++------ .../api/v1/trends/statuses_spec.rb} | 10 ++++------ .../api/v1/trends/tags_spec.rb} | 10 ++++------ 3 files changed, 12 insertions(+), 18 deletions(-) rename spec/{controllers/api/v1/trends/links_controller_spec.rb => requests/api/v1/trends/links_spec.rb} (84%) rename spec/{controllers/api/v1/trends/statuses_controller_spec.rb => requests/api/v1/trends/statuses_spec.rb} (83%) rename spec/{controllers/api/v1/trends/tags_controller_spec.rb => requests/api/v1/trends/tags_spec.rb} (85%) diff --git a/spec/controllers/api/v1/trends/links_controller_spec.rb b/spec/requests/api/v1/trends/links_spec.rb similarity index 84% rename from spec/controllers/api/v1/trends/links_controller_spec.rb rename to spec/requests/api/v1/trends/links_spec.rb index bcaf066f16..012d035907 100644 --- a/spec/controllers/api/v1/trends/links_controller_spec.rb +++ b/spec/requests/api/v1/trends/links_spec.rb @@ -2,15 +2,13 @@ require 'rails_helper' -RSpec.describe Api::V1::Trends::LinksController do - render_views - - describe 'GET #index' do +RSpec.describe 'API V1 Trends Links' do + describe 'GET /api/v1/trends/links' do context 'when trends are disabled' do before { Setting.trends = false } it 'returns http success' do - get :index + get '/api/v1/trends/links' expect(response).to have_http_status(200) end @@ -22,7 +20,7 @@ RSpec.describe Api::V1::Trends::LinksController do it 'returns http success' do prepare_trends stub_const('Api::V1::Trends::LinksController::DEFAULT_LINKS_LIMIT', 2) - get :index + get '/api/v1/trends/links' expect(response).to have_http_status(200) expect(response.headers).to include('Link') diff --git a/spec/controllers/api/v1/trends/statuses_controller_spec.rb b/spec/requests/api/v1/trends/statuses_spec.rb similarity index 83% rename from spec/controllers/api/v1/trends/statuses_controller_spec.rb rename to spec/requests/api/v1/trends/statuses_spec.rb index 25ab5f228a..3b906e8f82 100644 --- a/spec/controllers/api/v1/trends/statuses_controller_spec.rb +++ b/spec/requests/api/v1/trends/statuses_spec.rb @@ -2,15 +2,13 @@ require 'rails_helper' -RSpec.describe Api::V1::Trends::StatusesController do - render_views - - describe 'GET #index' do +RSpec.describe 'API V1 Trends Statuses' do + describe 'GET /api/v1/trends/statuses' do context 'when trends are disabled' do before { Setting.trends = false } it 'returns http success' do - get :index + get '/api/v1/trends/statuses' expect(response).to have_http_status(200) end @@ -22,7 +20,7 @@ RSpec.describe Api::V1::Trends::StatusesController do it 'returns http success' do prepare_trends stub_const('Api::BaseController::DEFAULT_STATUSES_LIMIT', 2) - get :index + get '/api/v1/trends/statuses' expect(response).to have_http_status(200) expect(response.headers).to include('Link') diff --git a/spec/controllers/api/v1/trends/tags_controller_spec.rb b/spec/requests/api/v1/trends/tags_spec.rb similarity index 85% rename from spec/controllers/api/v1/trends/tags_controller_spec.rb rename to spec/requests/api/v1/trends/tags_spec.rb index c889f1c5b9..598f4e7752 100644 --- a/spec/controllers/api/v1/trends/tags_controller_spec.rb +++ b/spec/requests/api/v1/trends/tags_spec.rb @@ -2,15 +2,13 @@ require 'rails_helper' -RSpec.describe Api::V1::Trends::TagsController do - render_views - - describe 'GET #index' do +RSpec.describe 'API V1 Trends Tags' do + describe 'GET /api/v1/trends/tags' do context 'when trends are disabled' do before { Setting.trends = false } it 'returns http success' do - get :index + get '/api/v1/trends/tags' expect(response).to have_http_status(200) expect(response.headers).to_not include('Link') @@ -23,7 +21,7 @@ RSpec.describe Api::V1::Trends::TagsController do it 'returns http success' do prepare_trends stub_const('Api::V1::Trends::TagsController::DEFAULT_TAGS_LIMIT', 2) - get :index + get '/api/v1/trends/tags' expect(response).to have_http_status(200) expect(response.headers).to include('Link') From b6baab447de9c394d93d5d0b9800b4a4dab28cd7 Mon Sep 17 00:00:00 2001 From: Matt Jankowski Date: Fri, 26 Jan 2024 12:41:13 -0500 Subject: [PATCH 021/211] Move `api/v2/admin/accounts` to request spec (#28950) --- .../api/v2/admin/accounts_spec.rb} | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) rename spec/{controllers/api/v2/admin/accounts_controller_spec.rb => requests/api/v2/admin/accounts_spec.rb} (94%) diff --git a/spec/controllers/api/v2/admin/accounts_controller_spec.rb b/spec/requests/api/v2/admin/accounts_spec.rb similarity index 94% rename from spec/controllers/api/v2/admin/accounts_controller_spec.rb rename to spec/requests/api/v2/admin/accounts_spec.rb index 349f4d2528..fb04850bb7 100644 --- a/spec/controllers/api/v2/admin/accounts_controller_spec.rb +++ b/spec/requests/api/v2/admin/accounts_spec.rb @@ -2,19 +2,14 @@ require 'rails_helper' -RSpec.describe Api::V2::Admin::AccountsController do - render_views - +RSpec.describe 'API V2 Admin Accounts' do let(:role) { UserRole.find_by(name: 'Moderator') } let(:user) { Fabricate(:user, role: role) } let(:scopes) { 'admin:read admin:write' } let(:token) { Fabricate(:accessible_access_token, resource_owner_id: user.id, scopes: scopes) } + let(:headers) { { 'Authorization' => "Bearer #{token.token}" } } let(:account) { Fabricate(:account) } - before do - allow(controller).to receive(:doorkeeper_token) { token } - end - describe 'GET #index' do let!(:remote_account) { Fabricate(:account, domain: 'example.org') } let!(:other_remote_account) { Fabricate(:account, domain: 'foo.bar') } @@ -28,7 +23,8 @@ RSpec.describe Api::V2::Admin::AccountsController do before do pending_account.user.update(approved: false) - get :index, params: params + + get '/api/v2/admin/accounts', params: params, headers: headers end it_behaves_like 'forbidden for wrong scope', 'write:statuses' From 5119fbc9b7e576b95404d1ffe126c212c09c9754 Mon Sep 17 00:00:00 2001 From: Matt Jankowski Date: Fri, 26 Jan 2024 12:41:39 -0500 Subject: [PATCH 022/211] Move `api/v1/admin/trends/links/preview_card_providers` to request spec (#28951) --- .../links/preview_card_providers_spec.rb} | 21 +++++++------------ 1 file changed, 8 insertions(+), 13 deletions(-) rename spec/{controllers/api/v1/admin/trends/links/preview_card_providers_controller_spec.rb => requests/api/v1/admin/trends/links/preview_card_providers_spec.rb} (60%) diff --git a/spec/controllers/api/v1/admin/trends/links/preview_card_providers_controller_spec.rb b/spec/requests/api/v1/admin/trends/links/preview_card_providers_spec.rb similarity index 60% rename from spec/controllers/api/v1/admin/trends/links/preview_card_providers_controller_spec.rb rename to spec/requests/api/v1/admin/trends/links/preview_card_providers_spec.rb index 76e215440d..384a305d4a 100644 --- a/spec/controllers/api/v1/admin/trends/links/preview_card_providers_controller_spec.rb +++ b/spec/requests/api/v1/admin/trends/links/preview_card_providers_spec.rb @@ -2,31 +2,26 @@ require 'rails_helper' -describe Api::V1::Admin::Trends::Links::PreviewCardProvidersController do - render_views - +describe 'API V1 Admin Trends Links Preview Card Providers' do let(:role) { UserRole.find_by(name: 'Admin') } let(:user) { Fabricate(:user, role: role) } let(:scopes) { 'admin:read admin:write' } let(:token) { Fabricate(:accessible_access_token, resource_owner_id: user.id, scopes: scopes) } + let(:headers) { { 'Authorization' => "Bearer #{token.token}" } } let(:account) { Fabricate(:account) } let(:preview_card_provider) { Fabricate(:preview_card_provider) } - before do - allow(controller).to receive(:doorkeeper_token) { token } - end - - describe 'GET #index' do + describe 'GET /api/v1/admin/trends/links/publishers' do it 'returns http success' do - get :index, params: { account_id: account.id, limit: 2 } + get '/api/v1/admin/trends/links/publishers', params: { account_id: account.id, limit: 2 }, headers: headers expect(response).to have_http_status(200) end end - describe 'POST #approve' do + describe 'POST /api/v1/admin/trends/links/publishers/:id/approve' do before do - post :approve, params: { id: preview_card_provider.id } + post "/api/v1/admin/trends/links/publishers/#{preview_card_provider.id}/approve", headers: headers end it_behaves_like 'forbidden for wrong scope', 'write:statuses' @@ -37,9 +32,9 @@ describe Api::V1::Admin::Trends::Links::PreviewCardProvidersController do end end - describe 'POST #reject' do + describe 'POST /api/v1/admin/trends/links/publishers/:id/reject' do before do - post :reject, params: { id: preview_card_provider.id } + post "/api/v1/admin/trends/links/publishers/#{preview_card_provider.id}/reject", headers: headers end it_behaves_like 'forbidden for wrong scope', 'write:statuses' From 239244e2ed577c12eda63f26735bf270dd0213b2 Mon Sep 17 00:00:00 2001 From: Matt Jankowski Date: Fri, 26 Jan 2024 12:43:08 -0500 Subject: [PATCH 023/211] Combine repeated subject in ap fetch remote account service spec (#28952) --- .../fetch_remote_account_service_spec.rb | 87 +++++-------------- 1 file changed, 21 insertions(+), 66 deletions(-) diff --git a/spec/services/activitypub/fetch_remote_account_service_spec.rb b/spec/services/activitypub/fetch_remote_account_service_spec.rb index ac7484d96d..4015723f6d 100644 --- a/spec/services/activitypub/fetch_remote_account_service_spec.rb +++ b/spec/services/activitypub/fetch_remote_account_service_spec.rb @@ -21,20 +21,14 @@ RSpec.describe ActivityPub::FetchRemoteAccountService, type: :service do let(:account) { subject.call('https://example.com/alice', id: true) } shared_examples 'sets profile data' do - it 'returns an account' do - expect(account).to be_an Account - end - - it 'sets display name' do - expect(account.display_name).to eq 'Alice' - end - - it 'sets note' do - expect(account.note).to eq 'Foo bar' - end - - it 'sets URL' do - expect(account.url).to eq 'https://example.com/alice' + it 'returns an account with expected details' do + expect(account) + .to be_an(Account) + .and have_attributes( + display_name: eq('Alice'), + note: eq('Foo bar'), + url: eq('https://example.com/alice') + ) end end @@ -48,19 +42,12 @@ RSpec.describe ActivityPub::FetchRemoteAccountService, type: :service do stub_request(:get, 'https://example.com/.well-known/webfinger?resource=acct:alice@example.com').to_return(body: Oj.dump(webfinger), headers: { 'Content-Type': 'application/jrd+json' }) end - it 'fetches resource' do - account - expect(a_request(:get, 'https://example.com/alice')).to have_been_made.once - end + it 'fetches resource and looks up webfinger and returns nil' do + expect(account).to be_nil - it 'looks up webfinger' do - account + expect(a_request(:get, 'https://example.com/alice')).to have_been_made.once expect(a_request(:get, 'https://example.com/.well-known/webfinger?resource=acct:alice@example.com')).to have_been_made.once end - - it 'returns nil' do - expect(account).to be_nil - end end context 'when URI and WebFinger share the same host' do @@ -71,17 +58,12 @@ RSpec.describe ActivityPub::FetchRemoteAccountService, type: :service do stub_request(:get, 'https://example.com/.well-known/webfinger?resource=acct:alice@example.com').to_return(body: Oj.dump(webfinger), headers: { 'Content-Type': 'application/jrd+json' }) end - it 'fetches resource' do + it 'fetches resource and looks up webfinger and sets attributes' do account - expect(a_request(:get, 'https://example.com/alice')).to have_been_made.once - end - it 'looks up webfinger' do - account + expect(a_request(:get, 'https://example.com/alice')).to have_been_made.once expect(a_request(:get, 'https://example.com/.well-known/webfinger?resource=acct:alice@example.com')).to have_been_made.once - end - it 'sets username and domain from webfinger' do expect(account.username).to eq 'alice' expect(account.domain).to eq 'example.com' end @@ -98,22 +80,13 @@ RSpec.describe ActivityPub::FetchRemoteAccountService, type: :service do stub_request(:get, 'https://iscool.af/.well-known/webfinger?resource=acct:alice@iscool.af').to_return(body: Oj.dump(webfinger), headers: { 'Content-Type': 'application/jrd+json' }) end - it 'fetches resource' do + it 'fetches resource and looks up webfinger and follows redirection and sets attributes' do account - expect(a_request(:get, 'https://example.com/alice')).to have_been_made.once - end - it 'looks up webfinger' do - account + expect(a_request(:get, 'https://example.com/alice')).to have_been_made.once expect(a_request(:get, 'https://example.com/.well-known/webfinger?resource=acct:alice@example.com')).to have_been_made.once - end - - it 'looks up "redirected" webfinger' do - account expect(a_request(:get, 'https://iscool.af/.well-known/webfinger?resource=acct:alice@iscool.af')).to have_been_made.once - end - it 'sets username and domain from final webfinger' do expect(account.username).to eq 'alice' expect(account.domain).to eq 'iscool.af' end @@ -129,19 +102,12 @@ RSpec.describe ActivityPub::FetchRemoteAccountService, type: :service do stub_request(:get, 'https://example.com/.well-known/webfinger?resource=acct:alice@example.com').to_return(body: Oj.dump(webfinger), headers: { 'Content-Type': 'application/jrd+json' }) end - it 'fetches resource' do - account - expect(a_request(:get, 'https://example.com/alice')).to have_been_made.once - end + it 'fetches resource and looks up webfinger and does not create account' do + expect(account).to be_nil - it 'looks up webfinger' do - account + expect(a_request(:get, 'https://example.com/alice')).to have_been_made.once expect(a_request(:get, 'https://example.com/.well-known/webfinger?resource=acct:alice@example.com')).to have_been_made.once end - - it 'does not create account' do - expect(account).to be_nil - end end context 'when WebFinger returns a different URI after a redirection' do @@ -153,24 +119,13 @@ RSpec.describe ActivityPub::FetchRemoteAccountService, type: :service do stub_request(:get, 'https://iscool.af/.well-known/webfinger?resource=acct:alice@iscool.af').to_return(body: Oj.dump(webfinger), headers: { 'Content-Type': 'application/jrd+json' }) end - it 'fetches resource' do - account - expect(a_request(:get, 'https://example.com/alice')).to have_been_made.once - end + it 'fetches resource and looks up webfinger and follows redirect and does not create account' do + expect(account).to be_nil - it 'looks up webfinger' do - account + expect(a_request(:get, 'https://example.com/alice')).to have_been_made.once expect(a_request(:get, 'https://example.com/.well-known/webfinger?resource=acct:alice@example.com')).to have_been_made.once - end - - it 'looks up "redirected" webfinger' do - account expect(a_request(:get, 'https://iscool.af/.well-known/webfinger?resource=acct:alice@iscool.af')).to have_been_made.once end - - it 'does not create account' do - expect(account).to be_nil - end end context 'with wrong id' do From 44f6d285af45682b5ddb7225bfdc56b48cd27a91 Mon Sep 17 00:00:00 2001 From: Matt Jankowski Date: Fri, 26 Jan 2024 12:44:12 -0500 Subject: [PATCH 024/211] Combine repeated subject in ap fetch remote actor service spec (#28953) --- .../fetch_remote_actor_service_spec.rb | 87 +++++-------------- 1 file changed, 21 insertions(+), 66 deletions(-) diff --git a/spec/services/activitypub/fetch_remote_actor_service_spec.rb b/spec/services/activitypub/fetch_remote_actor_service_spec.rb index 93d31b69d5..485ca81a11 100644 --- a/spec/services/activitypub/fetch_remote_actor_service_spec.rb +++ b/spec/services/activitypub/fetch_remote_actor_service_spec.rb @@ -21,20 +21,14 @@ RSpec.describe ActivityPub::FetchRemoteActorService, type: :service do let(:account) { subject.call('https://example.com/alice', id: true) } shared_examples 'sets profile data' do - it 'returns an account' do - expect(account).to be_an Account - end - - it 'sets display name' do - expect(account.display_name).to eq 'Alice' - end - - it 'sets note' do - expect(account.note).to eq 'Foo bar' - end - - it 'sets URL' do - expect(account.url).to eq 'https://example.com/alice' + it 'returns an account and sets attributes' do + expect(account) + .to be_an(Account) + .and have_attributes( + display_name: eq('Alice'), + note: eq('Foo bar'), + url: eq('https://example.com/alice') + ) end end @@ -48,19 +42,12 @@ RSpec.describe ActivityPub::FetchRemoteActorService, type: :service do stub_request(:get, 'https://example.com/.well-known/webfinger?resource=acct:alice@example.com').to_return(body: Oj.dump(webfinger), headers: { 'Content-Type': 'application/jrd+json' }) end - it 'fetches resource' do - account - expect(a_request(:get, 'https://example.com/alice')).to have_been_made.once - end + it 'fetches resource and looks up webfinger and returns nil' do + expect(account).to be_nil - it 'looks up webfinger' do - account + expect(a_request(:get, 'https://example.com/alice')).to have_been_made.once expect(a_request(:get, 'https://example.com/.well-known/webfinger?resource=acct:alice@example.com')).to have_been_made.once end - - it 'returns nil' do - expect(account).to be_nil - end end context 'when URI and WebFinger share the same host' do @@ -71,17 +58,12 @@ RSpec.describe ActivityPub::FetchRemoteActorService, type: :service do stub_request(:get, 'https://example.com/.well-known/webfinger?resource=acct:alice@example.com').to_return(body: Oj.dump(webfinger), headers: { 'Content-Type': 'application/jrd+json' }) end - it 'fetches resource' do + it 'fetches resource and looks up webfinger and sets values' do account - expect(a_request(:get, 'https://example.com/alice')).to have_been_made.once - end - it 'looks up webfinger' do - account + expect(a_request(:get, 'https://example.com/alice')).to have_been_made.once expect(a_request(:get, 'https://example.com/.well-known/webfinger?resource=acct:alice@example.com')).to have_been_made.once - end - it 'sets username and domain from webfinger' do expect(account.username).to eq 'alice' expect(account.domain).to eq 'example.com' end @@ -98,22 +80,13 @@ RSpec.describe ActivityPub::FetchRemoteActorService, type: :service do stub_request(:get, 'https://iscool.af/.well-known/webfinger?resource=acct:alice@iscool.af').to_return(body: Oj.dump(webfinger), headers: { 'Content-Type': 'application/jrd+json' }) end - it 'fetches resource' do + it 'fetches resource and looks up webfinger and follows redirect and sets values' do account - expect(a_request(:get, 'https://example.com/alice')).to have_been_made.once - end - it 'looks up webfinger' do - account + expect(a_request(:get, 'https://example.com/alice')).to have_been_made.once expect(a_request(:get, 'https://example.com/.well-known/webfinger?resource=acct:alice@example.com')).to have_been_made.once - end - - it 'looks up "redirected" webfinger' do - account expect(a_request(:get, 'https://iscool.af/.well-known/webfinger?resource=acct:alice@iscool.af')).to have_been_made.once - end - it 'sets username and domain from final webfinger' do expect(account.username).to eq 'alice' expect(account.domain).to eq 'iscool.af' end @@ -129,19 +102,12 @@ RSpec.describe ActivityPub::FetchRemoteActorService, type: :service do stub_request(:get, 'https://example.com/.well-known/webfinger?resource=acct:alice@example.com').to_return(body: Oj.dump(webfinger), headers: { 'Content-Type': 'application/jrd+json' }) end - it 'fetches resource' do - account - expect(a_request(:get, 'https://example.com/alice')).to have_been_made.once - end + it 'fetches resource and looks up webfinger and does not create account' do + expect(account).to be_nil - it 'looks up webfinger' do - account + expect(a_request(:get, 'https://example.com/alice')).to have_been_made.once expect(a_request(:get, 'https://example.com/.well-known/webfinger?resource=acct:alice@example.com')).to have_been_made.once end - - it 'does not create account' do - expect(account).to be_nil - end end context 'when WebFinger returns a different URI after a redirection' do @@ -153,24 +119,13 @@ RSpec.describe ActivityPub::FetchRemoteActorService, type: :service do stub_request(:get, 'https://iscool.af/.well-known/webfinger?resource=acct:alice@iscool.af').to_return(body: Oj.dump(webfinger), headers: { 'Content-Type': 'application/jrd+json' }) end - it 'fetches resource' do - account - expect(a_request(:get, 'https://example.com/alice')).to have_been_made.once - end + it 'fetches resource and looks up webfinger and follows redirect and does not create account' do + expect(account).to be_nil - it 'looks up webfinger' do - account + expect(a_request(:get, 'https://example.com/alice')).to have_been_made.once expect(a_request(:get, 'https://example.com/.well-known/webfinger?resource=acct:alice@example.com')).to have_been_made.once - end - - it 'looks up "redirected" webfinger' do - account expect(a_request(:get, 'https://iscool.af/.well-known/webfinger?resource=acct:alice@iscool.af')).to have_been_made.once end - - it 'does not create account' do - expect(account).to be_nil - end end context 'with wrong id' do From ff8937aa2c81c616cbe3b2d7ce7d0d11850f37b8 Mon Sep 17 00:00:00 2001 From: Matt Jankowski Date: Fri, 26 Jan 2024 12:45:54 -0500 Subject: [PATCH 025/211] Move `api/v1/statuses/*` to request spec (#28954) --- .../api/v1/statuses/histories_spec.rb} | 17 +++++-------- .../api/v1/statuses/mutes_spec.rb} | 21 ++++++---------- .../api/v1/statuses/reblogs_spec.rb} | 25 ++++++++----------- .../api/v1/statuses/translations_spec.rb} | 17 +++++-------- 4 files changed, 30 insertions(+), 50 deletions(-) rename spec/{controllers/api/v1/statuses/histories_controller_spec.rb => requests/api/v1/statuses/histories_spec.rb} (53%) rename spec/{controllers/api/v1/statuses/mutes_controller_spec.rb => requests/api/v1/statuses/mutes_spec.rb} (66%) rename spec/{controllers/api/v1/statuses/reblogs_controller_spec.rb => requests/api/v1/statuses/reblogs_spec.rb} (81%) rename spec/{controllers/api/v1/statuses/translations_controller_spec.rb => requests/api/v1/statuses/translations_spec.rb} (65%) diff --git a/spec/controllers/api/v1/statuses/histories_controller_spec.rb b/spec/requests/api/v1/statuses/histories_spec.rb similarity index 53% rename from spec/controllers/api/v1/statuses/histories_controller_spec.rb rename to spec/requests/api/v1/statuses/histories_spec.rb index 99384c8ed5..b3761ca688 100644 --- a/spec/controllers/api/v1/statuses/histories_controller_spec.rb +++ b/spec/requests/api/v1/statuses/histories_spec.rb @@ -2,23 +2,18 @@ require 'rails_helper' -describe Api::V1::Statuses::HistoriesController do - render_views - +describe 'API V1 Statuses Histories' do let(:user) { Fabricate(:user) } - let(:app) { Fabricate(:application, name: 'Test app', website: 'http://testapp.com') } - let(:token) { Fabricate(:accessible_access_token, resource_owner_id: user.id, scopes: 'read:statuses', application: app) } + let(:token) { Fabricate(:accessible_access_token, resource_owner_id: user.id, scopes: scopes) } + let(:scopes) { 'read:statuses' } + let(:headers) { { 'Authorization' => "Bearer #{token.token}" } } context 'with an oauth token' do - before do - allow(controller).to receive(:doorkeeper_token) { token } - end - - describe 'GET #show' do + describe 'GET /api/v1/statuses/:status_id/history' do let(:status) { Fabricate(:status, account: user.account) } before do - get :show, params: { status_id: status.id } + get "/api/v1/statuses/#{status.id}/history", headers: headers end it 'returns http success' do diff --git a/spec/controllers/api/v1/statuses/mutes_controller_spec.rb b/spec/requests/api/v1/statuses/mutes_spec.rb similarity index 66% rename from spec/controllers/api/v1/statuses/mutes_controller_spec.rb rename to spec/requests/api/v1/statuses/mutes_spec.rb index 03274fe1cd..72fd7d9d11 100644 --- a/spec/controllers/api/v1/statuses/mutes_controller_spec.rb +++ b/spec/requests/api/v1/statuses/mutes_spec.rb @@ -2,23 +2,18 @@ require 'rails_helper' -describe Api::V1::Statuses::MutesController do - render_views - +describe 'API V1 Statuses Mutes' do let(:user) { Fabricate(:user) } - let(:app) { Fabricate(:application, name: 'Test app', website: 'http://testapp.com') } - let(:token) { Fabricate(:accessible_access_token, resource_owner_id: user.id, scopes: 'write:mutes', application: app) } + let(:token) { Fabricate(:accessible_access_token, resource_owner_id: user.id, scopes: scopes) } + let(:scopes) { 'write:mutes' } + let(:headers) { { 'Authorization' => "Bearer #{token.token}" } } context 'with an oauth token' do - before do - allow(controller).to receive(:doorkeeper_token) { token } - end - - describe 'POST #create' do + describe 'POST /api/v1/statuses/:status_id/mute' do let(:status) { Fabricate(:status, account: user.account) } before do - post :create, params: { status_id: status.id } + post "/api/v1/statuses/#{status.id}/mute", headers: headers end it 'creates a conversation mute', :aggregate_failures do @@ -27,12 +22,12 @@ describe Api::V1::Statuses::MutesController do end end - describe 'POST #destroy' do + describe 'POST /api/v1/statuses/:status_id/unmute' do let(:status) { Fabricate(:status, account: user.account) } before do user.account.mute_conversation!(status.conversation) - post :destroy, params: { status_id: status.id } + post "/api/v1/statuses/#{status.id}/unmute", headers: headers end it 'destroys the conversation mute', :aggregate_failures do diff --git a/spec/controllers/api/v1/statuses/reblogs_controller_spec.rb b/spec/requests/api/v1/statuses/reblogs_spec.rb similarity index 81% rename from spec/controllers/api/v1/statuses/reblogs_controller_spec.rb rename to spec/requests/api/v1/statuses/reblogs_spec.rb index 014a03c1a2..cf0a1f861d 100644 --- a/spec/controllers/api/v1/statuses/reblogs_controller_spec.rb +++ b/spec/requests/api/v1/statuses/reblogs_spec.rb @@ -2,23 +2,18 @@ require 'rails_helper' -describe Api::V1::Statuses::ReblogsController do - render_views - +describe 'API V1 Statuses Reblogs' do let(:user) { Fabricate(:user) } - let(:app) { Fabricate(:application, name: 'Test app', website: 'http://testapp.com') } - let(:token) { Fabricate(:accessible_access_token, resource_owner_id: user.id, scopes: 'write:statuses', application: app) } + let(:token) { Fabricate(:accessible_access_token, resource_owner_id: user.id, scopes: scopes) } + let(:scopes) { 'write:statuses' } + let(:headers) { { 'Authorization' => "Bearer #{token.token}" } } context 'with an oauth token' do - before do - allow(controller).to receive(:doorkeeper_token) { token } - end - - describe 'POST #create' do + describe 'POST /api/v1/statuses/:status_id/reblog' do let(:status) { Fabricate(:status, account: user.account) } before do - post :create, params: { status_id: status.id } + post "/api/v1/statuses/#{status.id}/reblog", headers: headers end context 'with public status' do @@ -46,13 +41,13 @@ describe Api::V1::Statuses::ReblogsController do end end - describe 'POST #destroy', :sidekiq_inline do + describe 'POST /api/v1/statuses/:status_id/unreblog', :sidekiq_inline do context 'with public status' do let(:status) { Fabricate(:status, account: user.account) } before do ReblogService.new.call(user.account, status) - post :destroy, params: { status_id: status.id } + post "/api/v1/statuses/#{status.id}/unreblog", headers: headers end it 'destroys the reblog', :aggregate_failures do @@ -76,7 +71,7 @@ describe Api::V1::Statuses::ReblogsController do before do ReblogService.new.call(user.account, status) status.account.block!(user.account) - post :destroy, params: { status_id: status.id } + post "/api/v1/statuses/#{status.id}/unreblog", headers: headers end it 'destroys the reblog', :aggregate_failures do @@ -98,7 +93,7 @@ describe Api::V1::Statuses::ReblogsController do let(:status) { Fabricate(:status, visibility: :private) } before do - post :destroy, params: { status_id: status.id } + post "/api/v1/statuses/#{status.id}/unreblog", headers: headers end it 'returns http not found' do diff --git a/spec/controllers/api/v1/statuses/translations_controller_spec.rb b/spec/requests/api/v1/statuses/translations_spec.rb similarity index 65% rename from spec/controllers/api/v1/statuses/translations_controller_spec.rb rename to spec/requests/api/v1/statuses/translations_spec.rb index 6257494ae1..5b0a994561 100644 --- a/spec/controllers/api/v1/statuses/translations_controller_spec.rb +++ b/spec/requests/api/v1/statuses/translations_spec.rb @@ -2,19 +2,14 @@ require 'rails_helper' -describe Api::V1::Statuses::TranslationsController do - render_views - +describe 'API V1 Statuses Translations' do let(:user) { Fabricate(:user) } - let(:app) { Fabricate(:application, name: 'Test app', website: 'http://testapp.com') } - let(:token) { Fabricate(:accessible_access_token, resource_owner_id: user.id, scopes: 'read:statuses', application: app) } + let(:token) { Fabricate(:accessible_access_token, resource_owner_id: user.id, scopes: scopes) } + let(:scopes) { 'read:statuses' } + let(:headers) { { 'Authorization' => "Bearer #{token.token}" } } context 'with an oauth token' do - before do - allow(controller).to receive(:doorkeeper_token) { token } - end - - describe 'POST #create' do + describe 'POST /api/v1/statuses/:status_id/translate' do let(:status) { Fabricate(:status, account: user.account, text: 'Hola', language: 'es') } before do @@ -22,7 +17,7 @@ describe Api::V1::Statuses::TranslationsController do service = instance_double(TranslationService::DeepL, translate: [translation]) allow(TranslationService).to receive_messages(configured?: true, configured: service) Rails.cache.write('translation_service/languages', { 'es' => ['en'] }) - post :create, params: { status_id: status.id } + post "/api/v1/statuses/#{status.id}/translate", headers: headers end it 'returns http success' do From 1467f1e1e1c18dc4b310862ff1f719165a24cfb6 Mon Sep 17 00:00:00 2001 From: J H Date: Tue, 30 Jan 2024 13:38:49 +0000 Subject: [PATCH 026/211] Fixed the toggle emoji dropdown bug (#29012) --- .../features/compose/components/emoji_picker_dropdown.jsx | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/app/javascript/mastodon/features/compose/components/emoji_picker_dropdown.jsx b/app/javascript/mastodon/features/compose/components/emoji_picker_dropdown.jsx index 9949d2c001..37017f4cc3 100644 --- a/app/javascript/mastodon/features/compose/components/emoji_picker_dropdown.jsx +++ b/app/javascript/mastodon/features/compose/components/emoji_picker_dropdown.jsx @@ -164,6 +164,7 @@ class EmojiPickerMenuImpl extends PureComponent { intl: PropTypes.object.isRequired, skinTone: PropTypes.number.isRequired, onSkinTone: PropTypes.func.isRequired, + pickerButtonRef: PropTypes.func.isRequired }; static defaultProps = { @@ -178,7 +179,7 @@ class EmojiPickerMenuImpl extends PureComponent { }; handleDocumentClick = e => { - if (this.node && !this.node.contains(e.target)) { + if (this.node && !this.node.contains(e.target) && !this.props.pickerButtonRef.contains(e.target)) { this.props.onClose(); } }; @@ -233,6 +234,7 @@ class EmojiPickerMenuImpl extends PureComponent { emoji.native = emoji.colons; } if (!(event.ctrlKey || event.metaKey)) { + this.props.onClose(); } this.props.onPick(emoji); @@ -407,6 +409,7 @@ class EmojiPickerDropdown extends PureComponent { onSkinTone={onSkinTone} skinTone={skinTone} frequentlyUsedEmojis={frequentlyUsedEmojis} + pickerButtonRef={this.target} />
From adcd693b71805e703d04d1306c0ac2575cd8f383 Mon Sep 17 00:00:00 2001 From: Matt Jankowski Date: Tue, 30 Jan 2024 10:29:42 -0500 Subject: [PATCH 027/211] Use existing `MediaAttachment.remote` scope in media CLI (#28912) --- lib/mastodon/cli/media.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/mastodon/cli/media.rb b/lib/mastodon/cli/media.rb index 87946e0262..ac8f219807 100644 --- a/lib/mastodon/cli/media.rb +++ b/lib/mastodon/cli/media.rb @@ -58,7 +58,7 @@ module Mastodon::CLI end unless options[:prune_profiles] || options[:remove_headers] - processed, aggregate = parallelize_with_progress(MediaAttachment.cached.where.not(remote_url: '').where(created_at: ..time_ago)) do |media_attachment| + processed, aggregate = parallelize_with_progress(MediaAttachment.cached.remote.where(created_at: ..time_ago)) do |media_attachment| next if media_attachment.file.blank? size = (media_attachment.file_file_size || 0) + (media_attachment.thumbnail_file_size || 0) From 9d3830344fc01bf72a3d624b30c881bf1c90888a Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Tue, 30 Jan 2024 16:30:39 +0100 Subject: [PATCH 028/211] Update dependency immutable to v4.3.5 (#28933) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- yarn.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/yarn.lock b/yarn.lock index 3f70a02e74..c97667808a 100644 --- a/yarn.lock +++ b/yarn.lock @@ -9123,9 +9123,9 @@ __metadata: linkType: hard "immutable@npm:^4.0.0, immutable@npm:^4.0.0-rc.1, immutable@npm:^4.3.0": - version: 4.3.4 - resolution: "immutable@npm:4.3.4" - checksum: c15b9f0fa7b3c9315725cb00704fddad59f0e668a7379c39b9a528a8386140ee9effb015ae51a5b423e05c59d15fc0b38c970db6964ad6b3e05d0761db68441f + version: 4.3.5 + resolution: "immutable@npm:4.3.5" + checksum: 63d2d7908241a955d18c7822fd2215b6e89ff5a1a33cc72cd475b013cbbdef7a705aa5170a51ce9f84a57f62fdddfaa34e7b5a14b33d8a43c65cc6a881d6e894 languageName: node linkType: hard From f91acba70ac455b1240616e61968a36f99176ce7 Mon Sep 17 00:00:00 2001 From: Matt Jankowski Date: Tue, 30 Jan 2024 10:32:20 -0500 Subject: [PATCH 029/211] Combine repeated requests in account controller concern spec (#28957) --- .../account_controller_concern_spec.rb | 23 +++++++++---------- 1 file changed, 11 insertions(+), 12 deletions(-) diff --git a/spec/controllers/concerns/account_controller_concern_spec.rb b/spec/controllers/concerns/account_controller_concern_spec.rb index e3295204aa..6eb970dedb 100644 --- a/spec/controllers/concerns/account_controller_concern_spec.rb +++ b/spec/controllers/concerns/account_controller_concern_spec.rb @@ -49,22 +49,21 @@ describe AccountControllerConcern do end context 'when account is not suspended' do - it 'assigns @account' do - account = Fabricate(:account) + let(:account) { Fabricate(:account, username: 'username') } + + it 'assigns @account, returns success, and sets link headers' do get 'success', params: { account_username: account.username } - expect(assigns(:account)).to eq account - end - it 'sets link headers' do - Fabricate(:account, username: 'username') - get 'success', params: { account_username: 'username' } - expect(response.headers['Link'].to_s).to eq '; rel="lrdd"; type="application/jrd+json", ; rel="alternate"; type="application/activity+json"' + expect(assigns(:account)).to eq account + expect(response).to have_http_status(200) + expect(response.headers['Link'].to_s).to eq(expected_link_headers) end - it 'returns http success' do - account = Fabricate(:account) - get 'success', params: { account_username: account.username } - expect(response).to have_http_status(200) + def expected_link_headers + [ + '; rel="lrdd"; type="application/jrd+json"', + '; rel="alternate"; type="application/activity+json"', + ].join(', ') end end end From b3075a9993bff1bfca18ada91fe5587e921781d5 Mon Sep 17 00:00:00 2001 From: Yamagishi Kazutoshi Date: Wed, 31 Jan 2024 00:34:07 +0900 Subject: [PATCH 030/211] Remove unused l18n messages (#28964) --- .../mastodon/features/compose/components/poll_form.jsx | 2 -- app/javascript/mastodon/locales/en.json | 2 -- 2 files changed, 4 deletions(-) diff --git a/app/javascript/mastodon/features/compose/components/poll_form.jsx b/app/javascript/mastodon/features/compose/components/poll_form.jsx index 3c02810e7a..b3566fd6f5 100644 --- a/app/javascript/mastodon/features/compose/components/poll_form.jsx +++ b/app/javascript/mastodon/features/compose/components/poll_form.jsx @@ -18,8 +18,6 @@ import AutosuggestInput from 'mastodon/components/autosuggest_input'; const messages = defineMessages({ option_placeholder: { id: 'compose_form.poll.option_placeholder', defaultMessage: 'Option {number}' }, - add_option: { id: 'compose_form.poll.add_option', defaultMessage: 'Add option' }, - remove_option: { id: 'compose_form.poll.remove_option', defaultMessage: 'Remove this option' }, duration: { id: 'compose_form.poll.duration', defaultMessage: 'Poll length' }, type: { id: 'compose_form.poll.type', defaultMessage: 'Style' }, switchToMultiple: { id: 'compose_form.poll.switch_to_multiple', defaultMessage: 'Change poll to allow multiple choices' }, diff --git a/app/javascript/mastodon/locales/en.json b/app/javascript/mastodon/locales/en.json index 4befe77949..22a831b093 100644 --- a/app/javascript/mastodon/locales/en.json +++ b/app/javascript/mastodon/locales/en.json @@ -145,11 +145,9 @@ "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's on your mind?", - "compose_form.poll.add_option": "Add option", "compose_form.poll.duration": "Poll duration", "compose_form.poll.multiple": "Multiple choice", "compose_form.poll.option_placeholder": "Option {number}", - "compose_form.poll.remove_option": "Remove this option", "compose_form.poll.single": "Pick one", "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", From 86fbde7b4615a1ac8209ca8886b4d7a3d8754063 Mon Sep 17 00:00:00 2001 From: Matt Jankowski Date: Tue, 30 Jan 2024 10:38:33 -0500 Subject: [PATCH 031/211] Fix `Style/NumericLiterals` cop in ProfileStories support module (#28971) --- spec/support/stories/profile_stories.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spec/support/stories/profile_stories.rb b/spec/support/stories/profile_stories.rb index 2b345ddef1..74342c337d 100644 --- a/spec/support/stories/profile_stories.rb +++ b/spec/support/stories/profile_stories.rb @@ -10,7 +10,7 @@ module ProfileStories account: Fabricate(:account, username: 'bob') ) - Web::Setting.where(user: bob).first_or_initialize(user: bob).update!(data: { introductionVersion: 201812160442020 }) if finished_onboarding # rubocop:disable Style/NumericLiterals + Web::Setting.where(user: bob).first_or_initialize(user: bob).update!(data: { introductionVersion: 2018_12_16_044202 }) if finished_onboarding end def as_a_logged_in_user From ce0d134147707cf7037784fe703837ca1627ea21 Mon Sep 17 00:00:00 2001 From: Matt Jankowski Date: Tue, 30 Jan 2024 10:39:01 -0500 Subject: [PATCH 032/211] Add `redirect_with_vary` to `AllowedMethods` for `Style/FormatStringToken` cop (#28973) --- .rubocop.yml | 9 +++++++++ config/routes.rb | 12 ++++++------ 2 files changed, 15 insertions(+), 6 deletions(-) diff --git a/.rubocop.yml b/.rubocop.yml index 6998941144..330c40de1b 100644 --- a/.rubocop.yml +++ b/.rubocop.yml @@ -174,6 +174,15 @@ Style/ClassAndModuleChildren: Style/Documentation: Enabled: false +# Reason: Route redirects are not token-formatted and must be skipped +# https://docs.rubocop.org/rubocop/cops_style.html#styleformatstringtoken +Style/FormatStringToken: + inherit_mode: + merge: + - AllowedMethods # The rubocop-rails config adds `redirect` + AllowedMethods: + - redirect_with_vary + # Reason: Enforce modern Ruby style # https://docs.rubocop.org/rubocop/cops_style.html#stylehashsyntax Style/HashSyntax: diff --git a/config/routes.rb b/config/routes.rb index c4f862acaf..bb088821fd 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -104,12 +104,12 @@ Rails.application.routes.draw do confirmations: 'auth/confirmations', } - # rubocop:disable Style/FormatStringToken - those do not go through the usual formatting functions and are not safe to correct - get '/users/:username', to: redirect_with_vary('/@%{username}'), constraints: ->(req) { req.format.nil? || req.format.html? } - get '/users/:username/following', to: redirect_with_vary('/@%{username}/following'), constraints: ->(req) { req.format.nil? || req.format.html? } - get '/users/:username/followers', to: redirect_with_vary('/@%{username}/followers'), constraints: ->(req) { req.format.nil? || req.format.html? } - get '/users/:username/statuses/:id', to: redirect_with_vary('/@%{username}/%{id}'), constraints: ->(req) { req.format.nil? || req.format.html? } - # rubocop:enable Style/FormatStringToken + with_options constraints: ->(req) { req.format.nil? || req.format.html? } do + get '/users/:username', to: redirect_with_vary('/@%{username}') + get '/users/:username/following', to: redirect_with_vary('/@%{username}/following') + get '/users/:username/followers', to: redirect_with_vary('/@%{username}/followers') + get '/users/:username/statuses/:id', to: redirect_with_vary('/@%{username}/%{id}') + end get '/authorize_follow', to: redirect { |_, request| "/authorize_interaction?#{request.params.to_query}" } From 8c08e5cdb282bb5bc7229335b24e947c179498f8 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Tue, 30 Jan 2024 15:39:34 +0000 Subject: [PATCH 033/211] Update devDependencies (non-major) (#29000) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- yarn.lock | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/yarn.lock b/yarn.lock index c97667808a..8ddbb0d0c0 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1777,8 +1777,8 @@ __metadata: linkType: hard "@formatjs/cli@npm:^6.1.1": - version: 6.2.6 - resolution: "@formatjs/cli@npm:6.2.6" + version: 6.2.7 + resolution: "@formatjs/cli@npm:6.2.7" peerDependencies: vue: ^3.3.4 peerDependenciesMeta: @@ -1786,7 +1786,7 @@ __metadata: optional: true bin: formatjs: bin/formatjs - checksum: f8b0bc45c72b83437f0dc91a2d3ea513852c11bfd8eedbc2f255b19552f153bccb4d38fcd281f897ca60d0dfddf2b99de22e5a87cb1e173ca11df88c61cde2e4 + checksum: ee7b0873a734e02721ce1ee107ee60845bb30855f4ca686bfb6c5e9862353249d5d20748b18db93200aabc7a59875ff062f485c64d41cb8e61f1d43e2bb5eceb languageName: node linkType: hard @@ -2945,8 +2945,8 @@ __metadata: linkType: hard "@testing-library/jest-dom@npm:^6.0.0": - version: 6.2.0 - resolution: "@testing-library/jest-dom@npm:6.2.0" + version: 6.4.0 + resolution: "@testing-library/jest-dom@npm:6.4.0" dependencies: "@adobe/css-tools": "npm:^4.3.2" "@babel/runtime": "npm:^7.9.2" @@ -2958,19 +2958,22 @@ __metadata: redent: "npm:^3.0.0" peerDependencies: "@jest/globals": ">= 28" + "@types/bun": "*" "@types/jest": ">= 28" jest: ">= 28" vitest: ">= 0.32" peerDependenciesMeta: "@jest/globals": optional: true + "@types/bun": + optional: true "@types/jest": optional: true jest: optional: true vitest: optional: true - checksum: 71421693e0ad6a46be7d16f00b58a45725c238693972b8b5b1fd9ab797902ccf1209cf259afe8da1bf59d7c958762c46ee85d1aa5b164a5ec330981ea2376b08 + checksum: 6b7eba9ca388986a721fb12f84adf0f5534bf7ec5851982023a889c4a0afac6e9e91291bdac39e1f59a05adefd7727e30463d98b21c3da32fbfec229ccb11ef1 languageName: node linkType: hard From 0bc526a967f121cdee85bb529ec72bcd2244e2fd Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Tue, 30 Jan 2024 15:39:59 +0000 Subject: [PATCH 034/211] Update eslint (non-major) (#29001) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- yarn.lock | 178 ++++++++++++++++++------------------------------------ 1 file changed, 59 insertions(+), 119 deletions(-) diff --git a/yarn.lock b/yarn.lock index 8ddbb0d0c0..4d1084c229 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1790,16 +1790,6 @@ __metadata: languageName: node linkType: hard -"@formatjs/ecma402-abstract@npm:1.18.0": - version: 1.18.0 - resolution: "@formatjs/ecma402-abstract@npm:1.18.0" - dependencies: - "@formatjs/intl-localematcher": "npm:0.5.2" - tslib: "npm:^2.4.0" - checksum: bbdad0aee8e48baad6bfe6b2c27caf3befe35e658b922ee2f84417a819f0bdc7e849a8c0c782db8b53f5666bf19669d2b10a1104257c08796d198c87766bfc92 - languageName: node - linkType: hard - "@formatjs/ecma402-abstract@npm:1.18.2": version: 1.18.2 resolution: "@formatjs/ecma402-abstract@npm:1.18.2" @@ -1819,17 +1809,6 @@ __metadata: languageName: node linkType: hard -"@formatjs/icu-messageformat-parser@npm:2.7.3": - version: 2.7.3 - resolution: "@formatjs/icu-messageformat-parser@npm:2.7.3" - dependencies: - "@formatjs/ecma402-abstract": "npm:1.18.0" - "@formatjs/icu-skeleton-parser": "npm:1.7.0" - tslib: "npm:^2.4.0" - checksum: 2a51038813e5cff7e2df767e1227373d228e907adb7268fc3744b3d82c4fa69d4aa9f6020a62de2c468cf724600e9372ac07ae43a4480ed066fe34e224e80e4a - languageName: node - linkType: hard - "@formatjs/icu-messageformat-parser@npm:2.7.6": version: 2.7.6 resolution: "@formatjs/icu-messageformat-parser@npm:2.7.6" @@ -1841,16 +1820,6 @@ __metadata: languageName: node linkType: hard -"@formatjs/icu-skeleton-parser@npm:1.7.0": - version: 1.7.0 - resolution: "@formatjs/icu-skeleton-parser@npm:1.7.0" - dependencies: - "@formatjs/ecma402-abstract": "npm:1.18.0" - tslib: "npm:^2.4.0" - checksum: 2e4db815247ddb10f7990bbb501c85b854ee951ee45143673eb91b4392b11d0a8312327adb8b624c6a2fdafab12083904630d6d22475503d025f1612da4dcaee - languageName: node - linkType: hard - "@formatjs/icu-skeleton-parser@npm:1.8.0": version: 1.8.0 resolution: "@formatjs/icu-skeleton-parser@npm:1.8.0" @@ -1883,15 +1852,6 @@ __metadata: languageName: node linkType: hard -"@formatjs/intl-localematcher@npm:0.5.2": - version: 0.5.2 - resolution: "@formatjs/intl-localematcher@npm:0.5.2" - dependencies: - tslib: "npm:^2.4.0" - checksum: 4b3ae75470e3e53ffa39b2d46e65a2a4c9c4becbc0aac989b0694370e10c6687643660a045512d676509bc29b257fe5726fbb028de12f889be02c2d20b6527e6 - languageName: node - linkType: hard - "@formatjs/intl-localematcher@npm:0.5.4": version: 0.5.4 resolution: "@formatjs/intl-localematcher@npm:0.5.4" @@ -1952,26 +1912,6 @@ __metadata: languageName: node linkType: hard -"@formatjs/ts-transformer@npm:3.13.9": - version: 3.13.9 - resolution: "@formatjs/ts-transformer@npm:3.13.9" - dependencies: - "@formatjs/icu-messageformat-parser": "npm:2.7.3" - "@types/json-stable-stringify": "npm:^1.0.32" - "@types/node": "npm:14 || 16 || 17" - chalk: "npm:^4.0.0" - json-stable-stringify: "npm:^1.0.1" - tslib: "npm:^2.4.0" - typescript: "npm:5" - peerDependencies: - ts-jest: ">=27" - peerDependenciesMeta: - ts-jest: - optional: true - checksum: 4e313b967e45aae79246174c3181d31cc7cd297380d3a880a98fc0be16d76b783868712151e840ea16d22e2fbec0388b1005f688b6d4cb74ee4411b43f6d33f4 - languageName: node - linkType: hard - "@gamestdio/websocket@npm:^0.3.2": version: 0.3.2 resolution: "@gamestdio/websocket@npm:0.3.2" @@ -3723,14 +3663,14 @@ __metadata: linkType: hard "@typescript-eslint/eslint-plugin@npm:^6.0.0": - version: 6.19.0 - resolution: "@typescript-eslint/eslint-plugin@npm:6.19.0" + version: 6.20.0 + resolution: "@typescript-eslint/eslint-plugin@npm:6.20.0" dependencies: "@eslint-community/regexpp": "npm:^4.5.1" - "@typescript-eslint/scope-manager": "npm:6.19.0" - "@typescript-eslint/type-utils": "npm:6.19.0" - "@typescript-eslint/utils": "npm:6.19.0" - "@typescript-eslint/visitor-keys": "npm:6.19.0" + "@typescript-eslint/scope-manager": "npm:6.20.0" + "@typescript-eslint/type-utils": "npm:6.20.0" + "@typescript-eslint/utils": "npm:6.20.0" + "@typescript-eslint/visitor-keys": "npm:6.20.0" debug: "npm:^4.3.4" graphemer: "npm:^1.4.0" ignore: "npm:^5.2.4" @@ -3743,44 +3683,44 @@ __metadata: peerDependenciesMeta: typescript: optional: true - checksum: ab1a5ace6663b0c6d2418e321328fa28aa4bdc4b5fae257addec01346fb3a9c2d3a2960ade0f7114e6974c513a28632c9e8e602333cc0fab3135c445babdef59 + checksum: 5020faac39be476de056342f58f2bf68bb788f230e2fa4a2e27ceab8a5187dc450beba7333b0aa741a43aeaff45a117558132953f9390b5eca4c2cc004fde716 languageName: node linkType: hard "@typescript-eslint/parser@npm:^6.17.0": - version: 6.19.0 - resolution: "@typescript-eslint/parser@npm:6.19.0" + version: 6.20.0 + resolution: "@typescript-eslint/parser@npm:6.20.0" dependencies: - "@typescript-eslint/scope-manager": "npm:6.19.0" - "@typescript-eslint/types": "npm:6.19.0" - "@typescript-eslint/typescript-estree": "npm:6.19.0" - "@typescript-eslint/visitor-keys": "npm:6.19.0" + "@typescript-eslint/scope-manager": "npm:6.20.0" + "@typescript-eslint/types": "npm:6.20.0" + "@typescript-eslint/typescript-estree": "npm:6.20.0" + "@typescript-eslint/visitor-keys": "npm:6.20.0" debug: "npm:^4.3.4" peerDependencies: eslint: ^7.0.0 || ^8.0.0 peerDependenciesMeta: typescript: optional: true - checksum: d547bfb1aaed112cfc0f9f0be8506a280952ba3b61be42b749352139361bd94e4a47fa043d819e19c6a498cacbd8bb36a46e3628c436a7e2009e7ac27afc8861 + checksum: d84ad5e2282b1096c80dedb903c83ecc31eaf7be1aafcb14c18d9ec2d4a319f2fd1e5a9038b944d9f42c36c1c57add5e4292d4026ca7d3d5441d41286700d402 languageName: node linkType: hard -"@typescript-eslint/scope-manager@npm:6.19.0": - version: 6.19.0 - resolution: "@typescript-eslint/scope-manager@npm:6.19.0" +"@typescript-eslint/scope-manager@npm:6.20.0": + version: 6.20.0 + resolution: "@typescript-eslint/scope-manager@npm:6.20.0" dependencies: - "@typescript-eslint/types": "npm:6.19.0" - "@typescript-eslint/visitor-keys": "npm:6.19.0" - checksum: 1ec7b9dedca7975f0aa4543c1c382f7d6131411bd443a5f9b96f137acb6adb450888ed13c95f6d26546b682b2e0579ce8a1c883fdbe2255dc0b61052193b8243 + "@typescript-eslint/types": "npm:6.20.0" + "@typescript-eslint/visitor-keys": "npm:6.20.0" + checksum: f6768ed2dcd2d1771d55ed567ff392a6569ffd683a26500067509dd41769f8838c43686460fe7337144f324fd063df33f5d5646d44e5df4998ceffb3ad1fb790 languageName: node linkType: hard -"@typescript-eslint/type-utils@npm:6.19.0": - version: 6.19.0 - resolution: "@typescript-eslint/type-utils@npm:6.19.0" +"@typescript-eslint/type-utils@npm:6.20.0": + version: 6.20.0 + resolution: "@typescript-eslint/type-utils@npm:6.20.0" dependencies: - "@typescript-eslint/typescript-estree": "npm:6.19.0" - "@typescript-eslint/utils": "npm:6.19.0" + "@typescript-eslint/typescript-estree": "npm:6.20.0" + "@typescript-eslint/utils": "npm:6.20.0" debug: "npm:^4.3.4" ts-api-utils: "npm:^1.0.1" peerDependencies: @@ -3788,23 +3728,23 @@ __metadata: peerDependenciesMeta: typescript: optional: true - checksum: 5b146b985481e587122026c703ac9f537ad7e90eee1dca814971bca0d7e4a5d4ff9861fb4bf749014c28c6a4fbb4a01a4527355961315eb9501f3569f8e8dd38 + checksum: 8f622fbb14268f1d00b2948f995b570f0ef82be02c12be41d90385290a56ea0dbd34d855d6a5aff100b57f3bdd300ff0c300f16c78f12d6064f7ae6e34fd71bf languageName: node linkType: hard -"@typescript-eslint/types@npm:6.19.0": - version: 6.19.0 - resolution: "@typescript-eslint/types@npm:6.19.0" - checksum: 6f81860a3c14df55232c2e6dec21fb166867b9f30b3c3369b325aef5ee1c7e41e827c0504654daa49c8ff1a3a9ca9d9bfe76786882b6212a7c1b58991a9c80b9 +"@typescript-eslint/types@npm:6.20.0": + version: 6.20.0 + resolution: "@typescript-eslint/types@npm:6.20.0" + checksum: 37589003b0e06f83c1945e3748e91af85918cfd997766894642a08e6f355f611cfe11df4e7632dda96e3a9b3441406283fe834ab0906cf81ea97fd43ca2aebe3 languageName: node linkType: hard -"@typescript-eslint/typescript-estree@npm:6.19.0": - version: 6.19.0 - resolution: "@typescript-eslint/typescript-estree@npm:6.19.0" +"@typescript-eslint/typescript-estree@npm:6.20.0": + version: 6.20.0 + resolution: "@typescript-eslint/typescript-estree@npm:6.20.0" dependencies: - "@typescript-eslint/types": "npm:6.19.0" - "@typescript-eslint/visitor-keys": "npm:6.19.0" + "@typescript-eslint/types": "npm:6.20.0" + "@typescript-eslint/visitor-keys": "npm:6.20.0" debug: "npm:^4.3.4" globby: "npm:^11.1.0" is-glob: "npm:^4.0.3" @@ -3814,34 +3754,34 @@ __metadata: peerDependenciesMeta: typescript: optional: true - checksum: 5b365f009e43c7beafdbb7d8ecad78ee1087b0a4338cd9ec695eed514b7b4c1089e56239761139ddae629ec0ce8d428840c6ebfeea3618d2efe00c84f8794da5 + checksum: 551f13445a303882d9fc0fbe14ef8507eb8414253fd87a5f13d2e324b5280b626421a238b8ec038e628bc80128dc06c057757f668738e82e64d5b39a9083c27d languageName: node linkType: hard -"@typescript-eslint/utils@npm:6.19.0, @typescript-eslint/utils@npm:^6.5.0": - version: 6.19.0 - resolution: "@typescript-eslint/utils@npm:6.19.0" +"@typescript-eslint/utils@npm:6.20.0, @typescript-eslint/utils@npm:^6.18.1": + version: 6.20.0 + resolution: "@typescript-eslint/utils@npm:6.20.0" dependencies: "@eslint-community/eslint-utils": "npm:^4.4.0" "@types/json-schema": "npm:^7.0.12" "@types/semver": "npm:^7.5.0" - "@typescript-eslint/scope-manager": "npm:6.19.0" - "@typescript-eslint/types": "npm:6.19.0" - "@typescript-eslint/typescript-estree": "npm:6.19.0" + "@typescript-eslint/scope-manager": "npm:6.20.0" + "@typescript-eslint/types": "npm:6.20.0" + "@typescript-eslint/typescript-estree": "npm:6.20.0" semver: "npm:^7.5.4" peerDependencies: eslint: ^7.0.0 || ^8.0.0 - checksum: 343ff4cd4f7e102df8c46b41254d017a33d95df76455531fda679fdb92aebb9c111df8ee9ab54972e73c1e8fad9dd7e421001233f0aee8115384462b0821852e + checksum: 0a8ede3d80a365b52ae96d88e4a9f6e6abf3569c6b60ff9f42ff900cd843ae7c5493cd95f8f2029d90bb0acbf31030980206af98e581d760d6d41e0f80e9fb86 languageName: node linkType: hard -"@typescript-eslint/visitor-keys@npm:6.19.0": - version: 6.19.0 - resolution: "@typescript-eslint/visitor-keys@npm:6.19.0" +"@typescript-eslint/visitor-keys@npm:6.20.0": + version: 6.20.0 + resolution: "@typescript-eslint/visitor-keys@npm:6.20.0" dependencies: - "@typescript-eslint/types": "npm:6.19.0" + "@typescript-eslint/types": "npm:6.20.0" eslint-visitor-keys: "npm:^3.4.1" - checksum: bb34e922e018aadf34866995ea5949d6623f184cc4f6470ab05767dd208ffabb003b7dc3872199714574b7f10afe89d49c6f89a4e8d086edea82be73e189f1bb + checksum: 852d938f2e5d57200cf62733b42e73a369f797b097d17e8fd3fffd0f7315c3b9e1863eed60bb8d57d6535a3b7f1980f645f96ec6d513950f182bfa8107b33fab languageName: node linkType: hard @@ -7359,23 +7299,23 @@ __metadata: linkType: hard "eslint-plugin-formatjs@npm:^4.10.1": - version: 4.11.3 - resolution: "eslint-plugin-formatjs@npm:4.11.3" + version: 4.12.2 + resolution: "eslint-plugin-formatjs@npm:4.12.2" dependencies: - "@formatjs/icu-messageformat-parser": "npm:2.7.3" - "@formatjs/ts-transformer": "npm:3.13.9" + "@formatjs/icu-messageformat-parser": "npm:2.7.6" + "@formatjs/ts-transformer": "npm:3.13.12" "@types/eslint": "npm:7 || 8" "@types/picomatch": "npm:^2.3.0" - "@typescript-eslint/utils": "npm:^6.5.0" + "@typescript-eslint/utils": "npm:^6.18.1" emoji-regex: "npm:^10.2.1" magic-string: "npm:^0.30.0" picomatch: "npm:^2.3.1" tslib: "npm:2.6.2" typescript: "npm:5" - unicode-emoji-utils: "npm:^1.1.1" + unicode-emoji-utils: "npm:^1.2.0" peerDependencies: eslint: 7 || 8 - checksum: 66481e0b5af5738bdb2b164ac1c74216c5c26f7c7400456a58387e71424bb30554aef39da43ce29bfd551f7dad678818d9af029022edadc4e1024349339f6984 + checksum: 77cc1a2959903fcb6639d9fec89e7dfc55cf1e4ea58fca7d3bd6d12fa540aa173cbf5f90fc629b6aaf2ea3b8e61ed0a3cfce940fd2bec6f0796353315e2dbeef languageName: node linkType: hard @@ -7407,8 +7347,8 @@ __metadata: linkType: hard "eslint-plugin-jsdoc@npm:^48.0.0": - version: 48.0.2 - resolution: "eslint-plugin-jsdoc@npm:48.0.2" + version: 48.0.4 + resolution: "eslint-plugin-jsdoc@npm:48.0.4" dependencies: "@es-joy/jsdoccomment": "npm:~0.41.0" are-docs-informative: "npm:^0.0.2" @@ -7421,7 +7361,7 @@ __metadata: spdx-expression-parse: "npm:^4.0.0" peerDependencies: eslint: ^7.0.0 || ^8.0.0 || ^9.0.0 - checksum: 6e6062c22fa4039e4be898a62f8ca0edef8bcbdc8257abb18302471e9819ccd63941971cf8de0ccf4eb59b3508902aa06de56214d80bdfc9bde7cadb94906190 + checksum: c73063d26ca70d37ea00eea9750d1f889e5bfda64ca46dbfc6bf4842b892551c320368220cb46acc9d3d96a89fd5391486650284b82dc722f700e3b5df5c78db languageName: node linkType: hard @@ -16510,7 +16450,7 @@ __metadata: languageName: node linkType: hard -"unicode-emoji-utils@npm:^1.1.1": +"unicode-emoji-utils@npm:^1.2.0": version: 1.2.0 resolution: "unicode-emoji-utils@npm:1.2.0" dependencies: From 0c0d07727638ca795b7290e5918678450eec903c Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Tue, 30 Jan 2024 16:40:43 +0100 Subject: [PATCH 035/211] Update dependency chewy to v7.5.1 (#29018) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- Gemfile.lock | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Gemfile.lock b/Gemfile.lock index 57b2580722..3891139dce 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -180,7 +180,7 @@ GEM activesupport cbor (0.5.9.6) charlock_holmes (0.7.7) - chewy (7.5.0) + chewy (7.5.1) activesupport (>= 5.2) elasticsearch (>= 7.12.0, < 7.14.0) elasticsearch-dsl From c4af668e5ccf0ba26b3abc83b9bc36c3aa57a549 Mon Sep 17 00:00:00 2001 From: Eugen Rochko Date: Tue, 30 Jan 2024 18:24:40 +0100 Subject: [PATCH 036/211] Fix follow recommendations for less used languages (#29017) --- app/models/account_summary.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/models/account_summary.rb b/app/models/account_summary.rb index 2a21d09a8b..f052816361 100644 --- a/app/models/account_summary.rb +++ b/app/models/account_summary.rb @@ -15,7 +15,7 @@ class AccountSummary < ApplicationRecord has_many :follow_recommendation_suppressions, primary_key: :account_id, foreign_key: :account_id, inverse_of: false scope :safe, -> { where(sensitive: false) } - scope :localized, ->(locale) { where(language: locale) } + scope :localized, ->(locale) { order(Arel::Nodes::Case.new.when(arel_table[:language].eq(locale)).then(1).else(0).desc) } scope :filtered, -> { where.missing(:follow_recommendation_suppressions) } def self.refresh From fa0ba677538588086d83c97c0ea56f9cd1556590 Mon Sep 17 00:00:00 2001 From: Eugen Rochko Date: Tue, 30 Jan 2024 19:21:30 +0100 Subject: [PATCH 037/211] Change materialized views to be refreshed concurrently to avoid locks (#29015) --- app/models/account_summary.rb | 2 ++ app/models/follow_recommendation.rb | 2 ++ db/migrate/20210322164601_create_account_summaries.rb | 2 +- ...0505174616_update_follow_recommendations_to_version_2.rb | 2 +- .../20211213040746_update_account_summaries_to_version_2.rb | 6 +++--- .../20230818141056_create_global_follow_recommendations.rb | 2 +- .../20230818142253_drop_follow_recommendations.rb | 2 +- 7 files changed, 11 insertions(+), 7 deletions(-) diff --git a/app/models/account_summary.rb b/app/models/account_summary.rb index f052816361..30ada50cc0 100644 --- a/app/models/account_summary.rb +++ b/app/models/account_summary.rb @@ -19,6 +19,8 @@ class AccountSummary < ApplicationRecord scope :filtered, -> { where.missing(:follow_recommendation_suppressions) } def self.refresh + Scenic.database.refresh_materialized_view(table_name, concurrently: true, cascade: false) + rescue ActiveRecord::StatementInvalid Scenic.database.refresh_materialized_view(table_name, concurrently: false, cascade: false) end diff --git a/app/models/follow_recommendation.rb b/app/models/follow_recommendation.rb index 9d2648394b..6b49a3ca66 100644 --- a/app/models/follow_recommendation.rb +++ b/app/models/follow_recommendation.rb @@ -19,6 +19,8 @@ class FollowRecommendation < ApplicationRecord scope :localized, ->(locale) { joins(:account_summary).merge(AccountSummary.localized(locale)) } def self.refresh + Scenic.database.refresh_materialized_view(table_name, concurrently: true, cascade: false) + rescue ActiveRecord::StatementInvalid Scenic.database.refresh_materialized_view(table_name, concurrently: false, cascade: false) end diff --git a/db/migrate/20210322164601_create_account_summaries.rb b/db/migrate/20210322164601_create_account_summaries.rb index 8d18e9eeb4..5c93291e0a 100644 --- a/db/migrate/20210322164601_create_account_summaries.rb +++ b/db/migrate/20210322164601_create_account_summaries.rb @@ -2,7 +2,7 @@ class CreateAccountSummaries < ActiveRecord::Migration[5.2] def change - create_view :account_summaries, materialized: { no_data: true } + create_view :account_summaries, materialized: true # To be able to refresh the view concurrently, # at least one unique index is required diff --git a/db/migrate/20210505174616_update_follow_recommendations_to_version_2.rb b/db/migrate/20210505174616_update_follow_recommendations_to_version_2.rb index 22c27a0e7a..3a9024ffcb 100644 --- a/db/migrate/20210505174616_update_follow_recommendations_to_version_2.rb +++ b/db/migrate/20210505174616_update_follow_recommendations_to_version_2.rb @@ -6,7 +6,7 @@ class UpdateFollowRecommendationsToVersion2 < ActiveRecord::Migration[6.1] def up drop_view :follow_recommendations - create_view :follow_recommendations, version: 2, materialized: { no_data: true } + create_view :follow_recommendations, version: 2, materialized: true # To be able to refresh the view concurrently, # at least one unique index is required diff --git a/db/migrate/20211213040746_update_account_summaries_to_version_2.rb b/db/migrate/20211213040746_update_account_summaries_to_version_2.rb index e347a874ff..a82cf4afa2 100644 --- a/db/migrate/20211213040746_update_account_summaries_to_version_2.rb +++ b/db/migrate/20211213040746_update_account_summaries_to_version_2.rb @@ -4,7 +4,7 @@ class UpdateAccountSummariesToVersion2 < ActiveRecord::Migration[6.1] def up reapplication_follow_recommendations_v2 do drop_view :account_summaries, materialized: true - create_view :account_summaries, version: 2, materialized: { no_data: true } + create_view :account_summaries, version: 2, materialized: true safety_assured { add_index :account_summaries, :account_id, unique: true } end end @@ -12,7 +12,7 @@ class UpdateAccountSummariesToVersion2 < ActiveRecord::Migration[6.1] def down reapplication_follow_recommendations_v2 do drop_view :account_summaries, materialized: true - create_view :account_summaries, version: 1, materialized: { no_data: true } + create_view :account_summaries, version: 1, materialized: true safety_assured { add_index :account_summaries, :account_id, unique: true } end end @@ -20,7 +20,7 @@ class UpdateAccountSummariesToVersion2 < ActiveRecord::Migration[6.1] def reapplication_follow_recommendations_v2 drop_view :follow_recommendations, materialized: true yield - create_view :follow_recommendations, version: 2, materialized: { no_data: true } + create_view :follow_recommendations, version: 2, materialized: true safety_assured { add_index :follow_recommendations, :account_id, unique: true } end end diff --git a/db/migrate/20230818141056_create_global_follow_recommendations.rb b/db/migrate/20230818141056_create_global_follow_recommendations.rb index b88c71b9d7..1a3f23d228 100644 --- a/db/migrate/20230818141056_create_global_follow_recommendations.rb +++ b/db/migrate/20230818141056_create_global_follow_recommendations.rb @@ -2,7 +2,7 @@ class CreateGlobalFollowRecommendations < ActiveRecord::Migration[7.0] def change - create_view :global_follow_recommendations, materialized: { no_data: true } + create_view :global_follow_recommendations, materialized: true safety_assured { add_index :global_follow_recommendations, :account_id, unique: true } end end diff --git a/db/post_migrate/20230818142253_drop_follow_recommendations.rb b/db/post_migrate/20230818142253_drop_follow_recommendations.rb index 95913d6caa..e0a24753ca 100644 --- a/db/post_migrate/20230818142253_drop_follow_recommendations.rb +++ b/db/post_migrate/20230818142253_drop_follow_recommendations.rb @@ -6,7 +6,7 @@ class DropFollowRecommendations < ActiveRecord::Migration[7.0] end def down - create_view :follow_recommendations, version: 2, materialized: { no_data: true } + create_view :follow_recommendations, version: 2, materialized: true safety_assured { add_index :follow_recommendations, :account_id, unique: true } end end From 022d2a3793bf45631be938e9e803f81b5ff2b4b5 Mon Sep 17 00:00:00 2001 From: Matt Jankowski Date: Wed, 31 Jan 2024 07:52:51 -0500 Subject: [PATCH 038/211] Make factory gems available in test+development envs (#28969) --- Gemfile | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/Gemfile b/Gemfile index 4951304e39..906441ec67 100644 --- a/Gemfile +++ b/Gemfile @@ -125,12 +125,6 @@ group :test do # Used to mock environment variables gem 'climate_control' - # Generating fake data for specs - gem 'faker', '~> 3.2' - - # Generate test objects for specs - gem 'fabrication', '~> 2.30' - # Add back helpers functions removed in Rails 5.1 gem 'rails-controller-testing', '~> 1.0' @@ -182,6 +176,12 @@ group :development, :test do # Interactive Debugging tools gem 'debug', '~> 1.8' + # Generate fake data values + gem 'faker', '~> 3.2' + + # Generate factory objects + gem 'fabrication', '~> 2.30' + # Profiling tools gem 'memory_profiler', require: false gem 'ruby-prof', require: false From 738dba0cf7380c0392d2588deeddbdaa197a6331 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 31 Jan 2024 13:55:15 +0100 Subject: [PATCH 039/211] Update dependency capybara to v3.40.0 (#28966) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- Gemfile.lock | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Gemfile.lock b/Gemfile.lock index 3891139dce..01f5b45929 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -167,11 +167,11 @@ GEM bundler-audit (0.9.1) bundler (>= 1.2.0, < 3) thor (~> 1.0) - capybara (3.39.2) + capybara (3.40.0) addressable matrix mini_mime (>= 0.1.3) - nokogiri (~> 1.8) + nokogiri (~> 1.11) rack (>= 1.6.0) rack-test (>= 0.6.3) regexp_parser (>= 1.5, < 3.0) From dd934ebb07b1dc087fb782c025935de8e1107367 Mon Sep 17 00:00:00 2001 From: Matt Jankowski Date: Wed, 31 Jan 2024 11:55:50 -0500 Subject: [PATCH 040/211] Update `actions/cache` to v4 (updates node 16->20) (#29025) --- .github/actions/setup-javascript/action.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/actions/setup-javascript/action.yml b/.github/actions/setup-javascript/action.yml index 07fd4d08d3..808adc7de6 100644 --- a/.github/actions/setup-javascript/action.yml +++ b/.github/actions/setup-javascript/action.yml @@ -23,7 +23,7 @@ runs: shell: bash run: echo "dir=$(yarn config get cacheFolder)" >> $GITHUB_OUTPUT - - uses: actions/cache@v3 + - uses: actions/cache@v4 id: yarn-cache # use this to check for `cache-hit` (`steps.yarn-cache.outputs.cache-hit != 'true'`) with: path: ${{ steps.yarn-cache-dir-path.outputs.dir }} From 812a13142371441fb4510a0d8862ee413f3b98c5 Mon Sep 17 00:00:00 2001 From: Claire Date: Thu, 1 Feb 2024 10:33:12 +0100 Subject: [PATCH 041/211] Add github action workflow for manual security builds (#29040) --- .github/workflows/build-security.yml | 62 ++++++++++++++++++++++++++++ 1 file changed, 62 insertions(+) create mode 100644 .github/workflows/build-security.yml diff --git a/.github/workflows/build-security.yml b/.github/workflows/build-security.yml new file mode 100644 index 0000000000..cc9bae9227 --- /dev/null +++ b/.github/workflows/build-security.yml @@ -0,0 +1,62 @@ +name: Build security nightly container image + +permissions: + contents: read + packages: write + +jobs: + compute-suffix: + runs-on: ubuntu-latest + if: github.repository == 'mastodon/mastodon' + steps: + - id: version_vars + env: + TZ: Etc/UTC + run: | + echo mastodon_version_prerelease=nightly.$(date --date='next day' +'%Y-%m-%d')-security>> $GITHUB_OUTPUT + outputs: + prerelease: ${{ steps.version_vars.outputs.mastodon_version_prerelease }} + + build-image: + needs: compute-suffix + uses: ./.github/workflows/build-container-image.yml + with: + file_to_build: Dockerfile + platforms: linux/amd64,linux/arm64 + use_native_arm64_builder: true + cache: false + push_to_images: | + tootsuite/mastodon + ghcr.io/mastodon/mastodon + version_prerelease: ${{ needs.compute-suffix.outputs.prerelease }} + labels: | + org.opencontainers.image.description=Nightly build image used for testing purposes + flavor: | + latest=auto + tags: | + type=raw,value=edge + type=raw,value=nightly + type=schedule,pattern=${{ needs.compute-suffix.outputs.prerelease }} + secrets: inherit + + build-image-streaming: + needs: compute-suffix + uses: ./.github/workflows/build-container-image.yml + with: + file_to_build: streaming/Dockerfile + platforms: linux/amd64,linux/arm64 + use_native_arm64_builder: true + cache: false + push_to_images: | + tootsuite/mastodon-streaming + ghcr.io/mastodon/mastodon-streaming + version_prerelease: ${{ needs.compute-suffix.outputs.prerelease }} + labels: | + org.opencontainers.image.description=Nightly build image used for testing purposes + flavor: | + latest=auto + tags: | + type=raw,value=edge + type=raw,value=nightly + type=schedule,pattern=${{ needs.compute-suffix.outputs.prerelease }} + secrets: inherit From 8b7b0ee59873fcb6ad79daabd46eec07ae2c68ee Mon Sep 17 00:00:00 2001 From: Matt Jankowski Date: Thu, 1 Feb 2024 04:46:31 -0500 Subject: [PATCH 042/211] Configure selenium to use Chrome version 120 (#29038) --- spec/support/capybara.rb | 1 + 1 file changed, 1 insertion(+) diff --git a/spec/support/capybara.rb b/spec/support/capybara.rb index d4f27e209e..4aba65b404 100644 --- a/spec/support/capybara.rb +++ b/spec/support/capybara.rb @@ -14,6 +14,7 @@ Capybara.register_driver :headless_chrome do |app| options = Selenium::WebDriver::Chrome::Options.new options.add_argument '--headless=new' options.add_argument '--window-size=1680,1050' + options.browser_version = '120' Capybara::Selenium::Driver.new( app, From 7316a08380faed6c3553d0d24f51d206fe974e92 Mon Sep 17 00:00:00 2001 From: Claire Date: Thu, 1 Feb 2024 10:52:01 +0100 Subject: [PATCH 043/211] Fix missing `workflow_dispatch` trigger for `build-security` (#29041) --- .github/workflows/build-security.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/workflows/build-security.yml b/.github/workflows/build-security.yml index cc9bae9227..b03b787d5f 100644 --- a/.github/workflows/build-security.yml +++ b/.github/workflows/build-security.yml @@ -1,4 +1,6 @@ name: Build security nightly container image +on: + workflow_dispatch: permissions: contents: read From 9cdc60ecc6e5746b706bdcf19d0743d1c153105f Mon Sep 17 00:00:00 2001 From: Eugen Rochko Date: Thu, 1 Feb 2024 14:37:04 +0100 Subject: [PATCH 044/211] Change onboarding prompt to follow suggestions carousel in web UI (#28878) --- .../mastodon/actions/suggestions.js | 9 +- app/javascript/mastodon/actions/timelines.js | 21 ++ .../mastodon/components/status_list.jsx | 53 +++-- .../components/explore_prompt.tsx | 46 ---- .../components/inline_follow_suggestions.jsx | 201 ++++++++++++++++++ .../mastodon/features/home_timeline/index.jsx | 51 +---- .../ui/containers/status_list_container.js | 2 +- app/javascript/mastodon/locales/en.json | 10 +- app/javascript/mastodon/reducers/settings.js | 2 +- .../mastodon/reducers/suggestions.js | 6 +- app/javascript/mastodon/reducers/timelines.js | 31 ++- .../400-24px/navigate_before-fill.svg | 1 + .../400-24px/navigate_before.svg | 1 + .../400-24px/navigate_next-fill.svg | 1 + .../material-icons/400-24px/navigate_next.svg | 1 + .../styles/mastodon-light/diff.scss | 13 ++ .../styles/mastodon/components.scss | 196 +++++++++++++++++ 17 files changed, 507 insertions(+), 138 deletions(-) delete mode 100644 app/javascript/mastodon/features/home_timeline/components/explore_prompt.tsx create mode 100644 app/javascript/mastodon/features/home_timeline/components/inline_follow_suggestions.jsx create mode 100644 app/javascript/material-icons/400-24px/navigate_before-fill.svg create mode 100644 app/javascript/material-icons/400-24px/navigate_before.svg create mode 100644 app/javascript/material-icons/400-24px/navigate_next-fill.svg create mode 100644 app/javascript/material-icons/400-24px/navigate_next.svg diff --git a/app/javascript/mastodon/actions/suggestions.js b/app/javascript/mastodon/actions/suggestions.js index 870a311024..8eafe38b21 100644 --- a/app/javascript/mastodon/actions/suggestions.js +++ b/app/javascript/mastodon/actions/suggestions.js @@ -54,12 +54,5 @@ export const dismissSuggestion = accountId => (dispatch, getState) => { id: accountId, }); - api(getState).delete(`/api/v1/suggestions/${accountId}`).then(() => { - dispatch(fetchSuggestionsRequest()); - - api(getState).get('/api/v2/suggestions').then(response => { - dispatch(importFetchedAccounts(response.data.map(x => x.account))); - dispatch(fetchSuggestionsSuccess(response.data)); - }).catch(error => dispatch(fetchSuggestionsFail(error))); - }).catch(() => {}); + api(getState).delete(`/api/v1/suggestions/${accountId}`).catch(() => {}); }; diff --git a/app/javascript/mastodon/actions/timelines.js b/app/javascript/mastodon/actions/timelines.js index 08561c71f4..4ce7c3cf84 100644 --- a/app/javascript/mastodon/actions/timelines.js +++ b/app/javascript/mastodon/actions/timelines.js @@ -21,6 +21,10 @@ export const TIMELINE_DISCONNECT = 'TIMELINE_DISCONNECT'; export const TIMELINE_CONNECT = 'TIMELINE_CONNECT'; export const TIMELINE_MARK_AS_PARTIAL = 'TIMELINE_MARK_AS_PARTIAL'; +export const TIMELINE_INSERT = 'TIMELINE_INSERT'; + +export const TIMELINE_SUGGESTIONS = 'inline-follow-suggestions'; +export const TIMELINE_GAP = null; export const loadPending = timeline => ({ type: TIMELINE_LOAD_PENDING, @@ -112,9 +116,19 @@ export function expandTimeline(timelineId, path, params = {}, done = noOp) { api(getState).get(path, { params }).then(response => { const next = getLinks(response).refs.find(link => link.rel === 'next'); + dispatch(importFetchedStatuses(response.data)); dispatch(expandTimelineSuccess(timelineId, response.data, next ? next.uri : null, response.status === 206, isLoadingRecent, isLoadingMore, isLoadingRecent && preferPendingItems)); + if (timelineId === 'home' && !isLoadingMore && !isLoadingRecent) { + const now = new Date(); + const fittingIndex = response.data.findIndex(status => now - (new Date(status.created_at)) > 4 * 3600 * 1000); + + if (fittingIndex !== -1) { + dispatch(insertIntoTimeline(timelineId, TIMELINE_SUGGESTIONS, Math.max(1, fittingIndex))); + } + } + if (timelineId === 'home') { dispatch(submitMarkers()); } @@ -221,3 +235,10 @@ export const markAsPartial = timeline => ({ type: TIMELINE_MARK_AS_PARTIAL, timeline, }); + +export const insertIntoTimeline = (timeline, key, index) => ({ + type: TIMELINE_INSERT, + timeline, + index, + key, +}); diff --git a/app/javascript/mastodon/components/status_list.jsx b/app/javascript/mastodon/components/status_list.jsx index e92dd233e1..3ed20f65eb 100644 --- a/app/javascript/mastodon/components/status_list.jsx +++ b/app/javascript/mastodon/components/status_list.jsx @@ -5,7 +5,9 @@ import ImmutablePureComponent from 'react-immutable-pure-component'; import { debounce } from 'lodash'; +import { TIMELINE_GAP, TIMELINE_SUGGESTIONS } from 'mastodon/actions/timelines'; import RegenerationIndicator from 'mastodon/components/regeneration_indicator'; +import { InlineFollowSuggestions } from 'mastodon/features/home_timeline/components/inline_follow_suggestions'; import StatusContainer from '../containers/status_container'; @@ -91,25 +93,38 @@ export default class StatusList extends ImmutablePureComponent { } let scrollableContent = (isLoading || statusIds.size > 0) ? ( - statusIds.map((statusId, index) => statusId === null ? ( - 0 ? statusIds.get(index - 1) : null} - onClick={onLoadMore} - /> - ) : ( - - )) + statusIds.map((statusId, index) => { + switch(statusId) { + case TIMELINE_SUGGESTIONS: + return ( + + ); + case TIMELINE_GAP: + return ( + 0 ? statusIds.get(index - 1) : null} + onClick={onLoadMore} + /> + ); + default: + return ( + + ); + } + }) ) : null; if (scrollableContent && featuredStatusIds) { diff --git a/app/javascript/mastodon/features/home_timeline/components/explore_prompt.tsx b/app/javascript/mastodon/features/home_timeline/components/explore_prompt.tsx deleted file mode 100644 index 960d30e2ca..0000000000 --- a/app/javascript/mastodon/features/home_timeline/components/explore_prompt.tsx +++ /dev/null @@ -1,46 +0,0 @@ -import { FormattedMessage } from 'react-intl'; - -import { Link } from 'react-router-dom'; - -import background from '@/images/friends-cropped.png'; -import { DismissableBanner } from 'mastodon/components/dismissable_banner'; - -export const ExplorePrompt = () => ( - - - -

- -

-

- -

- -
-
- - - - - - -
-
-
-); diff --git a/app/javascript/mastodon/features/home_timeline/components/inline_follow_suggestions.jsx b/app/javascript/mastodon/features/home_timeline/components/inline_follow_suggestions.jsx new file mode 100644 index 0000000000..ac414d04d6 --- /dev/null +++ b/app/javascript/mastodon/features/home_timeline/components/inline_follow_suggestions.jsx @@ -0,0 +1,201 @@ +import PropTypes from 'prop-types'; +import { useEffect, useCallback, useRef, useState } from 'react'; + +import { FormattedMessage, useIntl, defineMessages } from 'react-intl'; + +import { Link } from 'react-router-dom'; + +import ImmutablePropTypes from 'react-immutable-proptypes'; +import { useDispatch, useSelector } from 'react-redux'; + +import ChevronLeftIcon from '@/material-icons/400-24px/chevron_left.svg?react'; +import ChevronRightIcon from '@/material-icons/400-24px/chevron_right.svg?react'; +import CloseIcon from '@/material-icons/400-24px/close.svg?react'; +import InfoIcon from '@/material-icons/400-24px/info.svg?react'; +import { followAccount, unfollowAccount } from 'mastodon/actions/accounts'; +import { changeSetting } from 'mastodon/actions/settings'; +import { fetchSuggestions, dismissSuggestion } from 'mastodon/actions/suggestions'; +import { Avatar } from 'mastodon/components/avatar'; +import { Button } from 'mastodon/components/button'; +import { DisplayName } from 'mastodon/components/display_name'; +import { Icon } from 'mastodon/components/icon'; +import { IconButton } from 'mastodon/components/icon_button'; +import { VerifiedBadge } from 'mastodon/components/verified_badge'; + +const messages = defineMessages({ + follow: { id: 'account.follow', defaultMessage: 'Follow' }, + unfollow: { id: 'account.unfollow', defaultMessage: 'Unfollow' }, + previous: { id: 'lightbox.previous', defaultMessage: 'Previous' }, + next: { id: 'lightbox.next', defaultMessage: 'Next' }, + dismiss: { id: 'follow_suggestions.dismiss', defaultMessage: "Don't show again" }, +}); + +const Source = ({ id }) => { + let label; + + switch (id) { + case 'friends_of_friends': + case 'similar_to_recently_followed': + label = ; + break; + case 'featured': + label = ; + break; + case 'most_followed': + case 'most_interactions': + label = ; + break; + } + + return ( +
+ + {label} +
+ ); +}; + +Source.propTypes = { + id: PropTypes.oneOf(['friends_of_friends', 'similar_to_recently_followed', 'featured', 'most_followed', 'most_interactions']), +}; + +const Card = ({ id, source }) => { + const intl = useIntl(); + const account = useSelector(state => state.getIn(['accounts', id])); + const relationship = useSelector(state => state.getIn(['relationships', id])); + const firstVerifiedField = account.get('fields').find(item => !!item.get('verified_at')); + const dispatch = useDispatch(); + const following = relationship?.get('following') ?? relationship?.get('requested'); + + const handleFollow = useCallback(() => { + if (following) { + dispatch(unfollowAccount(id)); + } else { + dispatch(followAccount(id)); + } + }, [id, following, dispatch]); + + const handleDismiss = useCallback(() => { + dispatch(dismissSuggestion(id)); + }, [id, dispatch]); + + return ( +
+ + +
+ +
+ +
+ + {firstVerifiedField ? : } +
+ +
+ ); +}; + +Card.propTypes = { + id: PropTypes.string.isRequired, + source: ImmutablePropTypes.list, +}; + +const DISMISSIBLE_ID = 'home/follow-suggestions'; + +export const InlineFollowSuggestions = ({ hidden }) => { + const intl = useIntl(); + const dispatch = useDispatch(); + const suggestions = useSelector(state => state.getIn(['suggestions', 'items'])); + const isLoading = useSelector(state => state.getIn(['suggestions', 'isLoading'])); + const dismissed = useSelector(state => state.getIn(['settings', 'dismissed_banners', DISMISSIBLE_ID])); + const bodyRef = useRef(); + const [canScrollLeft, setCanScrollLeft] = useState(false); + const [canScrollRight, setCanScrollRight] = useState(true); + + useEffect(() => { + dispatch(fetchSuggestions()); + }, [dispatch]); + + useEffect(() => { + if (!bodyRef.current) { + return; + } + + setCanScrollLeft(bodyRef.current.scrollLeft > 0); + setCanScrollRight((bodyRef.current.scrollLeft + bodyRef.current.clientWidth) < bodyRef.current.scrollWidth); + }, [setCanScrollRight, setCanScrollLeft, bodyRef, suggestions]); + + const handleLeftNav = useCallback(() => { + bodyRef.current.scrollLeft -= 200; + }, [bodyRef]); + + const handleRightNav = useCallback(() => { + bodyRef.current.scrollLeft += 200; + }, [bodyRef]); + + const handleScroll = useCallback(() => { + if (!bodyRef.current) { + return; + } + + setCanScrollLeft(bodyRef.current.scrollLeft > 0); + setCanScrollRight((bodyRef.current.scrollLeft + bodyRef.current.clientWidth) < bodyRef.current.scrollWidth); + }, [setCanScrollRight, setCanScrollLeft, bodyRef]); + + const handleDismiss = useCallback(() => { + dispatch(changeSetting(['dismissed_banners', DISMISSIBLE_ID], true)); + }, [dispatch]); + + if (dismissed || (!isLoading && suggestions.isEmpty())) { + return null; + } + + if (hidden) { + return ( +
+ ); + } + + return ( +
+
+

+ +
+ + +
+
+ +
+
+ {suggestions.map(suggestion => ( + + ))} +
+ + {canScrollLeft && ( + + )} + + {canScrollRight && ( + + )} +
+
+ ); +}; + +InlineFollowSuggestions.propTypes = { + hidden: PropTypes.bool, +}; diff --git a/app/javascript/mastodon/features/home_timeline/index.jsx b/app/javascript/mastodon/features/home_timeline/index.jsx index 069f52b0be..6e7dc2b6c8 100644 --- a/app/javascript/mastodon/features/home_timeline/index.jsx +++ b/app/javascript/mastodon/features/home_timeline/index.jsx @@ -6,8 +6,6 @@ import { defineMessages, injectIntl, FormattedMessage } from 'react-intl'; import classNames from 'classnames'; import { Helmet } from 'react-helmet'; -import { createSelector } from '@reduxjs/toolkit'; -import { List as ImmutableList } from 'immutable'; import { connect } from 'react-redux'; import CampaignIcon from '@/material-icons/400-24px/campaign.svg?react'; @@ -16,7 +14,7 @@ import { fetchAnnouncements, toggleShowAnnouncements } from 'mastodon/actions/an import { IconWithBadge } from 'mastodon/components/icon_with_badge'; import { NotSignedInIndicator } from 'mastodon/components/not_signed_in_indicator'; import AnnouncementsContainer from 'mastodon/features/getting_started/containers/announcements_container'; -import { me, criticalUpdatesPending } from 'mastodon/initial_state'; +import { criticalUpdatesPending } from 'mastodon/initial_state'; import { addColumn, removeColumn, moveColumn } from '../../actions/columns'; import { expandHomeTimeline } from '../../actions/timelines'; @@ -26,7 +24,6 @@ import StatusListContainer from '../ui/containers/status_list_container'; import { ColumnSettings } from './components/column_settings'; import { CriticalUpdateBanner } from './components/critical_update_banner'; -import { ExplorePrompt } from './components/explore_prompt'; const messages = defineMessages({ title: { id: 'column.home', defaultMessage: 'Home' }, @@ -34,51 +31,12 @@ const messages = defineMessages({ hide_announcements: { id: 'home.hide_announcements', defaultMessage: 'Hide announcements' }, }); -const getHomeFeedSpeed = createSelector([ - state => state.getIn(['timelines', 'home', 'items'], ImmutableList()), - state => state.getIn(['timelines', 'home', 'pendingItems'], ImmutableList()), - state => state.get('statuses'), -], (statusIds, pendingStatusIds, statusMap) => { - const recentStatusIds = pendingStatusIds.concat(statusIds); - const statuses = recentStatusIds.filter(id => id !== null).map(id => statusMap.get(id)).filter(status => status?.get('account') !== me).take(20); - - if (statuses.isEmpty()) { - return { - gap: 0, - newest: new Date(0), - }; - } - - const datetimes = statuses.map(status => status.get('created_at', 0)); - const oldest = new Date(datetimes.min()); - const newest = new Date(datetimes.max()); - const averageGap = (newest - oldest) / (1000 * (statuses.size + 1)); // Average gap between posts on first page in seconds - - return { - gap: averageGap, - newest, - }; -}); - -const homeTooSlow = createSelector([ - state => state.getIn(['timelines', 'home', 'isLoading']), - state => state.getIn(['timelines', 'home', 'isPartial']), - getHomeFeedSpeed, -], (isLoading, isPartial, speed) => - !isLoading && !isPartial // Only if the home feed has finished loading - && ( - (speed.gap > (30 * 60) // If the average gap between posts is more than 30 minutes - || (Date.now() - speed.newest) > (1000 * 3600)) // If the most recent post is from over an hour ago - ) -); - const mapStateToProps = state => ({ hasUnread: state.getIn(['timelines', 'home', 'unread']) > 0, isPartial: state.getIn(['timelines', 'home', 'isPartial']), hasAnnouncements: !state.getIn(['announcements', 'items']).isEmpty(), unreadAnnouncements: state.getIn(['announcements', 'items']).count(item => !item.get('read')), showAnnouncements: state.getIn(['announcements', 'show']), - tooSlow: homeTooSlow(state), }); class HomeTimeline extends PureComponent { @@ -97,7 +55,6 @@ class HomeTimeline extends PureComponent { hasAnnouncements: PropTypes.bool, unreadAnnouncements: PropTypes.number, showAnnouncements: PropTypes.bool, - tooSlow: PropTypes.bool, }; handlePin = () => { @@ -167,7 +124,7 @@ class HomeTimeline extends PureComponent { }; render () { - const { intl, hasUnread, columnId, multiColumn, tooSlow, hasAnnouncements, unreadAnnouncements, showAnnouncements } = this.props; + const { intl, hasUnread, columnId, multiColumn, hasAnnouncements, unreadAnnouncements, showAnnouncements } = this.props; const pinned = !!columnId; const { signedIn } = this.context.identity; const banners = []; @@ -192,10 +149,6 @@ class HomeTimeline extends PureComponent { banners.push(); } - if (tooSlow) { - banners.push(); - } - return ( createSelector([ (state) => state.get('statuses'), ], (columnSettings, statusIds, statuses) => { return statusIds.filter(id => { - if (id === null) return true; + if (id === null || id === 'inline-follow-suggestions') return true; const statusForId = statuses.get(id); let showStatus = true; diff --git a/app/javascript/mastodon/locales/en.json b/app/javascript/mastodon/locales/en.json index 22a831b093..12d0068d69 100644 --- a/app/javascript/mastodon/locales/en.json +++ b/app/javascript/mastodon/locales/en.json @@ -277,6 +277,12 @@ "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.", + "follow_suggestions.curated_suggestion": "Editors' Choice", + "follow_suggestions.dismiss": "Don't show again", + "follow_suggestions.personalized_suggestion": "Personalized suggestion", + "follow_suggestions.popular_suggestion": "Popular suggestion", + "follow_suggestions.view_all": "View all", + "follow_suggestions.who_to_follow": "Who to follow", "followed_tags": "Followed hashtags", "footer.about": "About", "footer.directory": "Profiles directory", @@ -303,13 +309,9 @@ "hashtag.follow": "Follow hashtag", "hashtag.unfollow": "Unfollow hashtag", "hashtags.and_other": "…and {count, plural, other {# more}}", - "home.actions.go_to_explore": "See what's trending", - "home.actions.go_to_suggestions": "Find people to follow", "home.column_settings.basic": "Basic", "home.column_settings.show_reblogs": "Show boosts", "home.column_settings.show_replies": "Show replies", - "home.explore_prompt.body": "Your home feed will have a mix of posts from the hashtags you've chosen to follow, the people you've chosen to follow, and the posts they boost. If that feels too quiet, you may want to:", - "home.explore_prompt.title": "This is your home base within Mastodon.", "home.hide_announcements": "Hide announcements", "home.pending_critical_update.body": "Please update your Mastodon server as soon as possible!", "home.pending_critical_update.link": "See updates", diff --git a/app/javascript/mastodon/reducers/settings.js b/app/javascript/mastodon/reducers/settings.js index a605ecbb8b..0e353e0d1b 100644 --- a/app/javascript/mastodon/reducers/settings.js +++ b/app/javascript/mastodon/reducers/settings.js @@ -104,7 +104,7 @@ const initialState = ImmutableMap({ dismissed_banners: ImmutableMap({ 'public_timeline': false, 'community_timeline': false, - 'home.explore_prompt': false, + 'home/follow-suggestions': false, 'explore/links': false, 'explore/statuses': false, 'explore/tags': false, diff --git a/app/javascript/mastodon/reducers/suggestions.js b/app/javascript/mastodon/reducers/suggestions.js index 0f224ff4b9..5b9d983dea 100644 --- a/app/javascript/mastodon/reducers/suggestions.js +++ b/app/javascript/mastodon/reducers/suggestions.js @@ -28,12 +28,12 @@ export default function suggestionsReducer(state = initialState, action) { case SUGGESTIONS_FETCH_FAIL: return state.set('isLoading', false); case SUGGESTIONS_DISMISS: - return state.update('items', list => list.filterNot(x => x.account === action.id)); + return state.update('items', list => list.filterNot(x => x.get('account') === action.id)); case blockAccountSuccess.type: case muteAccountSuccess.type: - return state.update('items', list => list.filterNot(x => x.account === action.payload.relationship.id)); + return state.update('items', list => list.filterNot(x => x.get('account') === action.payload.relationship.id)); case blockDomainSuccess.type: - return state.update('items', list => list.filterNot(x => action.payload.accounts.includes(x.account))); + return state.update('items', list => list.filterNot(x => action.payload.accounts.includes(x.get('account')))); default: return state; } diff --git a/app/javascript/mastodon/reducers/timelines.js b/app/javascript/mastodon/reducers/timelines.js index 43dedd6e6d..4c9ab98a82 100644 --- a/app/javascript/mastodon/reducers/timelines.js +++ b/app/javascript/mastodon/reducers/timelines.js @@ -17,6 +17,9 @@ import { TIMELINE_DISCONNECT, TIMELINE_LOAD_PENDING, TIMELINE_MARK_AS_PARTIAL, + TIMELINE_INSERT, + TIMELINE_GAP, + TIMELINE_SUGGESTIONS, } from '../actions/timelines'; import { compareId } from '../compare_id'; @@ -32,6 +35,8 @@ const initialTimeline = ImmutableMap({ items: ImmutableList(), }); +const isPlaceholder = value => value === TIMELINE_GAP || value === TIMELINE_SUGGESTIONS; + const expandNormalizedTimeline = (state, timeline, statuses, next, isPartial, isLoadingRecent, usePendingItems) => { // This method is pretty tricky because: // - existing items in the timeline might be out of order @@ -63,20 +68,20 @@ const expandNormalizedTimeline = (state, timeline, statuses, next, isPartial, is // First, find the furthest (if properly sorted, oldest) item in the timeline that is // newer than the oldest fetched one, as it's most likely that it delimits the gap. // Start the gap *after* that item. - const lastIndex = oldIds.findLastIndex(id => id !== null && compareId(id, newIds.last()) >= 0) + 1; + const lastIndex = oldIds.findLastIndex(id => !isPlaceholder(id) && compareId(id, newIds.last()) >= 0) + 1; // Then, try to find the furthest (if properly sorted, oldest) item in the timeline that // is newer than the most recent fetched one, as it delimits a section comprised of only // items older or within `newIds` (or that were deleted from the server, so should be removed // anyway). // Stop the gap *after* that item. - const firstIndex = oldIds.take(lastIndex).findLastIndex(id => id !== null && compareId(id, newIds.first()) > 0) + 1; + const firstIndex = oldIds.take(lastIndex).findLastIndex(id => !isPlaceholder(id) && compareId(id, newIds.first()) > 0) + 1; let insertedIds = ImmutableOrderedSet(newIds).withMutations(insertedIds => { // It is possible, though unlikely, that the slice we are replacing contains items older // than the elements we got from the API. Get them and add them back at the back of the // slice. - const olderIds = oldIds.slice(firstIndex, lastIndex).filter(id => id !== null && compareId(id, newIds.last()) < 0); + const olderIds = oldIds.slice(firstIndex, lastIndex).filter(id => !isPlaceholder(id) && compareId(id, newIds.last()) < 0); insertedIds.union(olderIds); // Make sure we aren't inserting duplicates @@ -84,8 +89,8 @@ const expandNormalizedTimeline = (state, timeline, statuses, next, isPartial, is }).toList(); // Finally, insert a gap marker if the data is marked as partial by the server - if (isPartial && (firstIndex === 0 || oldIds.get(firstIndex - 1) !== null)) { - insertedIds = insertedIds.unshift(null); + if (isPartial && (firstIndex === 0 || oldIds.get(firstIndex - 1) !== TIMELINE_GAP)) { + insertedIds = insertedIds.unshift(TIMELINE_GAP); } return oldIds.take(firstIndex).concat( @@ -178,7 +183,7 @@ const reconnectTimeline = (state, usePendingItems) => { } return state.withMutations(mMap => { - mMap.update(usePendingItems ? 'pendingItems' : 'items', items => items.first() ? items.unshift(null) : items); + mMap.update(usePendingItems ? 'pendingItems' : 'items', items => items.first() ? items.unshift(TIMELINE_GAP) : items); mMap.set('online', true); }); }; @@ -213,7 +218,7 @@ export default function timelines(state = initialState, action) { return state.update( action.timeline, initialTimeline, - map => map.set('online', false).update(action.usePendingItems ? 'pendingItems' : 'items', items => items.first() ? items.unshift(null) : items), + map => map.set('online', false).update(action.usePendingItems ? 'pendingItems' : 'items', items => items.first() ? items.unshift(TIMELINE_GAP) : items), ); case TIMELINE_MARK_AS_PARTIAL: return state.update( @@ -221,6 +226,18 @@ export default function timelines(state = initialState, action) { initialTimeline, map => map.set('isPartial', true).set('items', ImmutableList()).set('pendingItems', ImmutableList()).set('unread', 0), ); + case TIMELINE_INSERT: + return state.update( + action.timeline, + initialTimeline, + map => map.update('items', ImmutableList(), list => { + if (!list.includes(action.key)) { + return list.insert(action.index, action.key); + } + + return list; + }) + ); default: return state; } diff --git a/app/javascript/material-icons/400-24px/navigate_before-fill.svg b/app/javascript/material-icons/400-24px/navigate_before-fill.svg new file mode 100644 index 0000000000..53783746ae --- /dev/null +++ b/app/javascript/material-icons/400-24px/navigate_before-fill.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/app/javascript/material-icons/400-24px/navigate_before.svg b/app/javascript/material-icons/400-24px/navigate_before.svg new file mode 100644 index 0000000000..53783746ae --- /dev/null +++ b/app/javascript/material-icons/400-24px/navigate_before.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/app/javascript/material-icons/400-24px/navigate_next-fill.svg b/app/javascript/material-icons/400-24px/navigate_next-fill.svg new file mode 100644 index 0000000000..4100467365 --- /dev/null +++ b/app/javascript/material-icons/400-24px/navigate_next-fill.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/app/javascript/material-icons/400-24px/navigate_next.svg b/app/javascript/material-icons/400-24px/navigate_next.svg new file mode 100644 index 0000000000..4100467365 --- /dev/null +++ b/app/javascript/material-icons/400-24px/navigate_next.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/app/javascript/styles/mastodon-light/diff.scss b/app/javascript/styles/mastodon-light/diff.scss index 3c75854d9b..520e91e28b 100644 --- a/app/javascript/styles/mastodon-light/diff.scss +++ b/app/javascript/styles/mastodon-light/diff.scss @@ -578,3 +578,16 @@ html { .poll__option input[type='text'] { background: darken($ui-base-color, 10%); } + +.inline-follow-suggestions { + background-color: rgba($ui-highlight-color, 0.1); + border-bottom-color: rgba($ui-highlight-color, 0.3); +} + +.inline-follow-suggestions__body__scrollable__card { + background: $white; +} + +.inline-follow-suggestions__body__scroll-button__icon { + color: $white; +} diff --git a/app/javascript/styles/mastodon/components.scss b/app/javascript/styles/mastodon/components.scss index 5b89e7f25d..f70fa12a51 100644 --- a/app/javascript/styles/mastodon/components.scss +++ b/app/javascript/styles/mastodon/components.scss @@ -9459,3 +9459,199 @@ noscript { padding: 0; } } + +.inline-follow-suggestions { + display: flex; + flex-direction: column; + gap: 12px; + padding: 16px 0; + border-bottom: 1px solid mix($ui-base-color, $ui-highlight-color, 75%); + background: mix($ui-base-color, $ui-highlight-color, 95%); + + &__header { + display: flex; + align-items: center; + justify-content: space-between; + padding: 0 16px; + + h3 { + font-size: 15px; + line-height: 22px; + font-weight: 500; + } + + &__actions { + display: flex; + align-items: center; + gap: 24px; + } + + .link-button { + font-size: 13px; + font-weight: 500; + } + } + + &__body { + position: relative; + + &__scroll-button { + position: absolute; + height: 100%; + background: transparent; + border: none; + cursor: pointer; + top: 0; + color: $primary-text-color; + + &.left { + left: 0; + } + + &.right { + right: 0; + } + + &__icon { + border-radius: 50%; + background: $ui-highlight-color; + display: flex; + align-items: center; + justify-content: center; + aspect-ratio: 1; + padding: 8px; + + .icon { + width: 24px; + height: 24px; + } + } + + &:hover, + &:focus, + &:active { + .inline-follow-suggestions__body__scroll-button__icon { + background: lighten($ui-highlight-color, 4%); + } + } + } + + &__scrollable { + display: flex; + flex-wrap: nowrap; + gap: 16px; + padding: 16px; + padding-bottom: 0; + scroll-snap-type: x mandatory; + scroll-padding: 16px; + scroll-behavior: smooth; + overflow-x: hidden; + + &__card { + background: darken($ui-base-color, 4%); + border: 1px solid lighten($ui-base-color, 8%); + border-radius: 4px; + display: flex; + flex-direction: column; + gap: 12px; + align-items: center; + padding: 12px; + scroll-snap-align: start; + flex: 0 0 auto; + width: 200px; + box-sizing: border-box; + position: relative; + + a { + text-decoration: none; + } + + & > .icon-button { + position: absolute; + inset-inline-end: 8px; + top: 8px; + } + + &__avatar { + height: 48px; + display: flex; + + a { + display: flex; + text-decoration: none; + } + } + + .account__avatar { + flex-shrink: 0; + align-self: flex-end; + border: 1px solid lighten($ui-base-color, 8%); + background-color: $ui-base-color; + } + + &__text-stack { + display: flex; + flex-direction: column; + gap: 4px; + align-items: center; + max-width: 100%; + + a { + max-width: 100%; + } + + &__source { + display: inline-flex; + align-items: center; + color: $dark-text-color; + gap: 4px; + overflow: hidden; + white-space: nowrap; + + > span { + overflow: hidden; + text-overflow: ellipsis; + } + + .icon { + width: 16px; + height: 16px; + } + } + } + + .display-name { + display: flex; + flex-direction: column; + gap: 4px; + align-items: center; + + & > * { + max-width: 100%; + } + + &__html { + font-size: 15px; + font-weight: 500; + color: $secondary-text-color; + } + + &__account { + font-size: 14px; + color: $darker-text-color; + } + } + + .verified-badge { + font-size: 14px; + max-width: 100%; + } + + .button { + display: block; + width: 100%; + } + } + } + } +} From 1726085db5cd73dd30953da858f9887bcc90b958 Mon Sep 17 00:00:00 2001 From: Claire Date: Thu, 1 Feb 2024 15:56:46 +0100 Subject: [PATCH 045/211] Merge pull request from GHSA-3fjr-858r-92rw * Fix insufficient origin validation * Bump version to 4.3.0-alpha.1 --- .../concerns/signature_verification.rb | 2 +- app/helpers/jsonld_helper.rb | 4 ++-- app/lib/activitypub/activity.rb | 2 +- app/lib/activitypub/linked_data_signature.rb | 2 +- .../activitypub/fetch_remote_account_service.rb | 2 +- .../activitypub/fetch_remote_actor_service.rb | 6 +++--- .../activitypub/fetch_remote_key_service.rb | 17 ++--------------- .../activitypub/fetch_remote_status_service.rb | 8 ++++---- .../activitypub/process_account_service.rb | 2 +- app/services/fetch_resource_service.rb | 10 +++++++++- lib/mastodon/version.rb | 2 +- .../activitypub/linked_data_signature_spec.rb | 4 ++-- .../fetch_remote_account_service_spec.rb | 2 +- .../fetch_remote_actor_service_spec.rb | 2 +- .../fetch_remote_key_service_spec.rb | 2 +- spec/services/fetch_resource_service_spec.rb | 10 +++++----- spec/services/resolve_url_service_spec.rb | 1 + 17 files changed, 37 insertions(+), 41 deletions(-) diff --git a/app/controllers/concerns/signature_verification.rb b/app/controllers/concerns/signature_verification.rb index 35391e64c4..92f1eb5a16 100644 --- a/app/controllers/concerns/signature_verification.rb +++ b/app/controllers/concerns/signature_verification.rb @@ -266,7 +266,7 @@ module SignatureVerification stoplight_wrap_request { ResolveAccountService.new.call(key_id.delete_prefix('acct:'), suppress_errors: false) } elsif !ActivityPub::TagManager.instance.local_uri?(key_id) account = ActivityPub::TagManager.instance.uri_to_actor(key_id) - account ||= stoplight_wrap_request { ActivityPub::FetchRemoteKeyService.new.call(key_id, id: false, suppress_errors: false) } + account ||= stoplight_wrap_request { ActivityPub::FetchRemoteKeyService.new.call(key_id, suppress_errors: false) } account end rescue Mastodon::PrivateNetworkAddressError => e diff --git a/app/helpers/jsonld_helper.rb b/app/helpers/jsonld_helper.rb index b3d0d032c4..cc05b7a403 100644 --- a/app/helpers/jsonld_helper.rb +++ b/app/helpers/jsonld_helper.rb @@ -155,8 +155,8 @@ module JsonLdHelper end end - def fetch_resource(uri, id, on_behalf_of = nil, request_options: {}) - unless id + def fetch_resource(uri, id_is_known, on_behalf_of = nil, request_options: {}) + unless id_is_known json = fetch_resource_without_id_validation(uri, on_behalf_of) return if !json.is_a?(Hash) || unsupported_uri_scheme?(json['id']) diff --git a/app/lib/activitypub/activity.rb b/app/lib/activitypub/activity.rb index 51384ef984..322f3e27ad 100644 --- a/app/lib/activitypub/activity.rb +++ b/app/lib/activitypub/activity.rb @@ -154,7 +154,7 @@ class ActivityPub::Activity if object_uri.start_with?('http') return if ActivityPub::TagManager.instance.local_uri?(object_uri) - ActivityPub::FetchRemoteStatusService.new.call(object_uri, id: true, on_behalf_of: @account.followers.local.first, request_id: @options[:request_id]) + ActivityPub::FetchRemoteStatusService.new.call(object_uri, on_behalf_of: @account.followers.local.first, request_id: @options[:request_id]) elsif @object['url'].present? ::FetchRemoteStatusService.new.call(@object['url'], request_id: @options[:request_id]) end diff --git a/app/lib/activitypub/linked_data_signature.rb b/app/lib/activitypub/linked_data_signature.rb index faea63e8f1..9459fdd8b7 100644 --- a/app/lib/activitypub/linked_data_signature.rb +++ b/app/lib/activitypub/linked_data_signature.rb @@ -19,7 +19,7 @@ class ActivityPub::LinkedDataSignature return unless type == 'RsaSignature2017' creator = ActivityPub::TagManager.instance.uri_to_actor(creator_uri) - creator = ActivityPub::FetchRemoteKeyService.new.call(creator_uri, id: false) if creator&.public_key.blank? + creator = ActivityPub::FetchRemoteKeyService.new.call(creator_uri) if creator&.public_key.blank? return if creator.nil? diff --git a/app/services/activitypub/fetch_remote_account_service.rb b/app/services/activitypub/fetch_remote_account_service.rb index 567dd8a14a..7b083d889b 100644 --- a/app/services/activitypub/fetch_remote_account_service.rb +++ b/app/services/activitypub/fetch_remote_account_service.rb @@ -2,7 +2,7 @@ class ActivityPub::FetchRemoteAccountService < ActivityPub::FetchRemoteActorService # Does a WebFinger roundtrip on each call, unless `only_key` is true - def call(uri, id: true, prefetched_body: nil, break_on_redirect: false, only_key: false, suppress_errors: true, request_id: nil) + def call(uri, prefetched_body: nil, break_on_redirect: false, only_key: false, suppress_errors: true, request_id: nil) actor = super return actor if actor.nil? || actor.is_a?(Account) diff --git a/app/services/activitypub/fetch_remote_actor_service.rb b/app/services/activitypub/fetch_remote_actor_service.rb index 8df8c75876..86a134bb4e 100644 --- a/app/services/activitypub/fetch_remote_actor_service.rb +++ b/app/services/activitypub/fetch_remote_actor_service.rb @@ -10,15 +10,15 @@ class ActivityPub::FetchRemoteActorService < BaseService SUPPORTED_TYPES = %w(Application Group Organization Person Service).freeze # Does a WebFinger roundtrip on each call, unless `only_key` is true - def call(uri, id: true, prefetched_body: nil, break_on_redirect: false, only_key: false, suppress_errors: true, request_id: nil) + def call(uri, prefetched_body: nil, break_on_redirect: false, only_key: false, suppress_errors: true, request_id: nil) return if domain_not_allowed?(uri) return ActivityPub::TagManager.instance.uri_to_actor(uri) if ActivityPub::TagManager.instance.local_uri?(uri) @json = begin if prefetched_body.nil? - fetch_resource(uri, id) + fetch_resource(uri, true) else - body_to_json(prefetched_body, compare_id: id ? uri : nil) + body_to_json(prefetched_body, compare_id: uri) end rescue Oj::ParseError raise Error, "Error parsing JSON-LD document #{uri}" diff --git a/app/services/activitypub/fetch_remote_key_service.rb b/app/services/activitypub/fetch_remote_key_service.rb index 8eb97c1e66..e96b5ad3bb 100644 --- a/app/services/activitypub/fetch_remote_key_service.rb +++ b/app/services/activitypub/fetch_remote_key_service.rb @@ -6,23 +6,10 @@ class ActivityPub::FetchRemoteKeyService < BaseService class Error < StandardError; end # Returns actor that owns the key - def call(uri, id: true, prefetched_body: nil, suppress_errors: true) + def call(uri, suppress_errors: true) raise Error, 'No key URI given' if uri.blank? - if prefetched_body.nil? - if id - @json = fetch_resource_without_id_validation(uri) - if actor_type? - @json = fetch_resource(@json['id'], true) - elsif uri != @json['id'] - raise Error, "Fetched URI #{uri} has wrong id #{@json['id']}" - end - else - @json = fetch_resource(uri, id) - end - else - @json = body_to_json(prefetched_body, compare_id: id ? uri : nil) - end + @json = fetch_resource(uri, false) raise Error, "Unable to fetch key JSON at #{uri}" if @json.nil? raise Error, "Unsupported JSON-LD context for document #{uri}" unless supported_context?(@json) diff --git a/app/services/activitypub/fetch_remote_status_service.rb b/app/services/activitypub/fetch_remote_status_service.rb index e3a9b60b56..6f8882378f 100644 --- a/app/services/activitypub/fetch_remote_status_service.rb +++ b/app/services/activitypub/fetch_remote_status_service.rb @@ -8,14 +8,14 @@ class ActivityPub::FetchRemoteStatusService < BaseService DISCOVERIES_PER_REQUEST = 1000 # Should be called when uri has already been checked for locality - def call(uri, id: true, prefetched_body: nil, on_behalf_of: nil, expected_actor_uri: nil, request_id: nil) + def call(uri, prefetched_body: nil, on_behalf_of: nil, expected_actor_uri: nil, request_id: nil) return if domain_not_allowed?(uri) @request_id = request_id || "#{Time.now.utc.to_i}-status-#{uri}" @json = if prefetched_body.nil? - fetch_resource(uri, id, on_behalf_of) + fetch_resource(uri, true, on_behalf_of) else - body_to_json(prefetched_body, compare_id: id ? uri : nil) + body_to_json(prefetched_body, compare_id: uri) end return unless supported_context? @@ -65,7 +65,7 @@ class ActivityPub::FetchRemoteStatusService < BaseService def account_from_uri(uri) actor = ActivityPub::TagManager.instance.uri_to_resource(uri, Account) - actor = ActivityPub::FetchRemoteAccountService.new.call(uri, id: true, request_id: @request_id) if actor.nil? || actor.possibly_stale? + actor = ActivityPub::FetchRemoteAccountService.new.call(uri, request_id: @request_id) if actor.nil? || actor.possibly_stale? actor end diff --git a/app/services/activitypub/process_account_service.rb b/app/services/activitypub/process_account_service.rb index 8fc0989a3f..9e787ace50 100644 --- a/app/services/activitypub/process_account_service.rb +++ b/app/services/activitypub/process_account_service.rb @@ -277,7 +277,7 @@ class ActivityPub::ProcessAccountService < BaseService def moved_account account = ActivityPub::TagManager.instance.uri_to_resource(@json['movedTo'], Account) - account ||= ActivityPub::FetchRemoteAccountService.new.call(@json['movedTo'], id: true, break_on_redirect: true, request_id: @options[:request_id]) + account ||= ActivityPub::FetchRemoteAccountService.new.call(@json['movedTo'], break_on_redirect: true, request_id: @options[:request_id]) account end diff --git a/app/services/fetch_resource_service.rb b/app/services/fetch_resource_service.rb index a3406e5a57..71c6cca790 100644 --- a/app/services/fetch_resource_service.rb +++ b/app/services/fetch_resource_service.rb @@ -48,7 +48,15 @@ class FetchResourceService < BaseService body = response.body_with_limit json = body_to_json(body) - [json['id'], { prefetched_body: body, id: true }] if supported_context?(json) && (equals_or_includes_any?(json['type'], ActivityPub::FetchRemoteActorService::SUPPORTED_TYPES) || expected_type?(json)) + return unless supported_context?(json) && (equals_or_includes_any?(json['type'], ActivityPub::FetchRemoteActorService::SUPPORTED_TYPES) || expected_type?(json)) + + if json['id'] != @url + return if terminal + + return process(json['id'], terminal: true) + end + + [@url, { prefetched_body: body }] elsif !terminal link_header = response['Link'] && parse_link_header(response) diff --git a/lib/mastodon/version.rb b/lib/mastodon/version.rb index 587e89303b..dd7c84207e 100644 --- a/lib/mastodon/version.rb +++ b/lib/mastodon/version.rb @@ -17,7 +17,7 @@ module Mastodon end def default_prerelease - 'alpha.0' + 'alpha.1' end def prerelease diff --git a/spec/lib/activitypub/linked_data_signature_spec.rb b/spec/lib/activitypub/linked_data_signature_spec.rb index 97268eea6d..1af45673c0 100644 --- a/spec/lib/activitypub/linked_data_signature_spec.rb +++ b/spec/lib/activitypub/linked_data_signature_spec.rb @@ -56,7 +56,7 @@ RSpec.describe ActivityPub::LinkedDataSignature do allow(ActivityPub::FetchRemoteKeyService).to receive(:new).and_return(service_stub) - allow(service_stub).to receive(:call).with('http://example.com/alice', id: false) do + allow(service_stub).to receive(:call).with('http://example.com/alice') do sender.update!(public_key: old_key) sender end @@ -64,7 +64,7 @@ RSpec.describe ActivityPub::LinkedDataSignature do it 'fetches key and returns creator' do expect(subject.verify_actor!).to eq sender - expect(service_stub).to have_received(:call).with('http://example.com/alice', id: false).once + expect(service_stub).to have_received(:call).with('http://example.com/alice').once end end diff --git a/spec/services/activitypub/fetch_remote_account_service_spec.rb b/spec/services/activitypub/fetch_remote_account_service_spec.rb index 4015723f6d..e7f6bb8dd8 100644 --- a/spec/services/activitypub/fetch_remote_account_service_spec.rb +++ b/spec/services/activitypub/fetch_remote_account_service_spec.rb @@ -18,7 +18,7 @@ RSpec.describe ActivityPub::FetchRemoteAccountService, type: :service do end describe '#call' do - let(:account) { subject.call('https://example.com/alice', id: true) } + let(:account) { subject.call('https://example.com/alice') } shared_examples 'sets profile data' do it 'returns an account with expected details' do diff --git a/spec/services/activitypub/fetch_remote_actor_service_spec.rb b/spec/services/activitypub/fetch_remote_actor_service_spec.rb index 485ca81a11..e622c7d4c3 100644 --- a/spec/services/activitypub/fetch_remote_actor_service_spec.rb +++ b/spec/services/activitypub/fetch_remote_actor_service_spec.rb @@ -18,7 +18,7 @@ RSpec.describe ActivityPub::FetchRemoteActorService, type: :service do end describe '#call' do - let(:account) { subject.call('https://example.com/alice', id: true) } + let(:account) { subject.call('https://example.com/alice') } shared_examples 'sets profile data' do it 'returns an account and sets attributes' do diff --git a/spec/services/activitypub/fetch_remote_key_service_spec.rb b/spec/services/activitypub/fetch_remote_key_service_spec.rb index e210d20ec7..0b14da4f44 100644 --- a/spec/services/activitypub/fetch_remote_key_service_spec.rb +++ b/spec/services/activitypub/fetch_remote_key_service_spec.rb @@ -55,7 +55,7 @@ RSpec.describe ActivityPub::FetchRemoteKeyService, type: :service do end describe '#call' do - let(:account) { subject.call(public_key_id, id: false) } + let(:account) { subject.call(public_key_id) } context 'when the key is a sub-object from the actor' do before do diff --git a/spec/services/fetch_resource_service_spec.rb b/spec/services/fetch_resource_service_spec.rb index 0f1068471f..78037a06ce 100644 --- a/spec/services/fetch_resource_service_spec.rb +++ b/spec/services/fetch_resource_service_spec.rb @@ -57,7 +57,7 @@ RSpec.describe FetchResourceService, type: :service do let(:json) do { - id: 1, + id: 'http://example.com/foo', '@context': ActivityPub::TagManager::CONTEXT, type: 'Note', }.to_json @@ -83,27 +83,27 @@ RSpec.describe FetchResourceService, type: :service do let(:content_type) { 'application/activity+json; charset=utf-8' } let(:body) { json } - it { is_expected.to eq [1, { prefetched_body: body, id: true }] } + it { is_expected.to eq ['http://example.com/foo', { prefetched_body: body }] } end context 'when content type is ld+json with profile' do let(:content_type) { 'application/ld+json; profile="https://www.w3.org/ns/activitystreams"' } let(:body) { json } - it { is_expected.to eq [1, { prefetched_body: body, id: true }] } + it { is_expected.to eq ['http://example.com/foo', { prefetched_body: body }] } end context 'when link header is present' do let(:headers) { { 'Link' => '; rel="alternate"; type="application/activity+json"' } } - it { is_expected.to eq [1, { prefetched_body: json, id: true }] } + it { is_expected.to eq ['http://example.com/foo', { prefetched_body: json }] } end context 'when content type is text/html' do let(:content_type) { 'text/html' } let(:body) { '' } - it { is_expected.to eq [1, { prefetched_body: json, id: true }] } + it { is_expected.to eq ['http://example.com/foo', { prefetched_body: json }] } end end end diff --git a/spec/services/resolve_url_service_spec.rb b/spec/services/resolve_url_service_spec.rb index bcfb9dbfb0..5270cc10dd 100644 --- a/spec/services/resolve_url_service_spec.rb +++ b/spec/services/resolve_url_service_spec.rb @@ -139,6 +139,7 @@ describe ResolveURLService, type: :service do stub_request(:get, url).to_return(status: 302, headers: { 'Location' => status_url }) body = ActiveModelSerializers::SerializableResource.new(status, serializer: ActivityPub::NoteSerializer, adapter: ActivityPub::Adapter).to_json stub_request(:get, status_url).to_return(body: body, headers: { 'Content-Type' => 'application/activity+json' }) + stub_request(:get, uri).to_return(body: body, headers: { 'Content-Type' => 'application/activity+json' }) end it 'returns status by url' do From 3c315a68afdb3b6ea1bc66b66bc7dcd49a335a08 Mon Sep 17 00:00:00 2001 From: "y.takahashi" Date: Fri, 2 Feb 2024 15:33:53 +0900 Subject: [PATCH 046/211] Fix 'focus the compose textarea' shortcut is not working (#29059) --- app/javascript/mastodon/features/ui/index.jsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/javascript/mastodon/features/ui/index.jsx b/app/javascript/mastodon/features/ui/index.jsx index d3fee272f0..b17b59a0e6 100644 --- a/app/javascript/mastodon/features/ui/index.jsx +++ b/app/javascript/mastodon/features/ui/index.jsx @@ -438,7 +438,7 @@ class UI extends PureComponent { handleHotkeyNew = e => { e.preventDefault(); - const element = this.node.querySelector('.compose-form__autosuggest-wrapper textarea'); + const element = this.node.querySelector('.autosuggest-textarea__textarea'); if (element) { element.focus(); From 1666b1955992e16f4605b414c6563ca25b3a3f18 Mon Sep 17 00:00:00 2001 From: Eugen Rochko Date: Fri, 2 Feb 2024 16:51:26 +0100 Subject: [PATCH 047/211] Fix confirmation e-mails when signing up through an app (#29064) --- app/views/user_mailer/confirmation_instructions.html.haml | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/app/views/user_mailer/confirmation_instructions.html.haml b/app/views/user_mailer/confirmation_instructions.html.haml index 74b2d49a47..13e68c722b 100644 --- a/app/views/user_mailer/confirmation_instructions.html.haml +++ b/app/views/user_mailer/confirmation_instructions.html.haml @@ -8,9 +8,7 @@ %td.email-inner-card-td.email-prose %p= t @resource.approved? ? 'devise.mailer.confirmation_instructions.explanation' : 'devise.mailer.confirmation_instructions.explanation_when_pending', host: site_hostname - if @resource.created_by_application - = render 'application/mailer/button', text: t('settings.account_settings'), url: edit_user_registration_url - = link_to confirmation_url(@resource, confirmation_token: @token, redirect_to_app: 'true') do - %span= t 'devise.mailer.confirmation_instructions.action_with_app', app: @resource.created_by_application.name + = render 'application/mailer/button', text: t('devise.mailer.confirmation_instructions.action_with_app', app: @resource.created_by_application.name), url: confirmation_url(@resource, confirmation_token: @token, redirect_to_app: 'true') - else = render 'application/mailer/button', text: t('devise.mailer.confirmation_instructions.action'), url: confirmation_url(@resource, confirmation_token: @token) %p= t 'devise.mailer.confirmation_instructions.extra_html', terms_path: about_more_url, policy_path: privacy_policy_url From 86500e3312394de52413254e81bbc91f1a9333a0 Mon Sep 17 00:00:00 2001 From: Matt Jankowski Date: Tue, 6 Feb 2024 04:08:07 -0500 Subject: [PATCH 048/211] Extract scenic view model common methods to concern (#28111) --- app/models/account_summary.rb | 14 +++--------- app/models/concerns/database_view_record.rb | 25 +++++++++++++++++++++ app/models/follow_recommendation.rb | 12 ++-------- app/models/instance.rb | 10 ++------- app/models/user_ip.rb | 6 ++--- 5 files changed, 34 insertions(+), 33 deletions(-) create mode 100644 app/models/concerns/database_view_record.rb diff --git a/app/models/account_summary.rb b/app/models/account_summary.rb index 30ada50cc0..327c0ef305 100644 --- a/app/models/account_summary.rb +++ b/app/models/account_summary.rb @@ -10,21 +10,13 @@ # class AccountSummary < ApplicationRecord + include DatabaseViewRecord + self.primary_key = :account_id - has_many :follow_recommendation_suppressions, primary_key: :account_id, foreign_key: :account_id, inverse_of: false + has_many :follow_recommendation_suppressions, primary_key: :account_id, foreign_key: :account_id, inverse_of: false, dependent: nil scope :safe, -> { where(sensitive: false) } scope :localized, ->(locale) { order(Arel::Nodes::Case.new.when(arel_table[:language].eq(locale)).then(1).else(0).desc) } scope :filtered, -> { where.missing(:follow_recommendation_suppressions) } - - def self.refresh - Scenic.database.refresh_materialized_view(table_name, concurrently: true, cascade: false) - rescue ActiveRecord::StatementInvalid - Scenic.database.refresh_materialized_view(table_name, concurrently: false, cascade: false) - end - - def readonly? - true - end end diff --git a/app/models/concerns/database_view_record.rb b/app/models/concerns/database_view_record.rb new file mode 100644 index 0000000000..8b6672e299 --- /dev/null +++ b/app/models/concerns/database_view_record.rb @@ -0,0 +1,25 @@ +# frozen_string_literal: true + +module DatabaseViewRecord + extend ActiveSupport::Concern + + class_methods do + def refresh + Scenic.database.refresh_materialized_view( + table_name, + concurrently: true, + cascade: false + ) + rescue ActiveRecord::StatementInvalid + Scenic.database.refresh_materialized_view( + table_name, + concurrently: false, + cascade: false + ) + end + end + + def readonly? + true + end +end diff --git a/app/models/follow_recommendation.rb b/app/models/follow_recommendation.rb index 6b49a3ca66..7ac9e6dfb9 100644 --- a/app/models/follow_recommendation.rb +++ b/app/models/follow_recommendation.rb @@ -10,6 +10,8 @@ # class FollowRecommendation < ApplicationRecord + include DatabaseViewRecord + self.primary_key = :account_id self.table_name = :global_follow_recommendations @@ -17,14 +19,4 @@ class FollowRecommendation < ApplicationRecord belongs_to :account scope :localized, ->(locale) { joins(:account_summary).merge(AccountSummary.localized(locale)) } - - def self.refresh - Scenic.database.refresh_materialized_view(table_name, concurrently: true, cascade: false) - rescue ActiveRecord::StatementInvalid - Scenic.database.refresh_materialized_view(table_name, concurrently: false, cascade: false) - end - - def readonly? - true - end end diff --git a/app/models/instance.rb b/app/models/instance.rb index 0fd31c8097..3bd4b924ae 100644 --- a/app/models/instance.rb +++ b/app/models/instance.rb @@ -9,6 +9,8 @@ # class Instance < ApplicationRecord + include DatabaseViewRecord + self.primary_key = :domain attr_accessor :failure_days @@ -27,10 +29,6 @@ class Instance < ApplicationRecord scope :by_domain_and_subdomains, ->(domain) { where("reverse('.' || domain) LIKE reverse(?)", "%.#{domain}") } scope :with_domain_follows, ->(domains) { where(domain: domains).where(domain_account_follows) } - def self.refresh - Scenic.database.refresh_materialized_view(table_name, concurrently: true, cascade: false) - end - def self.domain_account_follows Arel.sql( <<~SQL.squish @@ -44,10 +42,6 @@ class Instance < ApplicationRecord ) end - def readonly? - true - end - def delivery_failure_tracker @delivery_failure_tracker ||= DeliveryFailureTracker.new(domain) end diff --git a/app/models/user_ip.rb b/app/models/user_ip.rb index 38287c2a60..87b86a24d4 100644 --- a/app/models/user_ip.rb +++ b/app/models/user_ip.rb @@ -10,11 +10,9 @@ # class UserIp < ApplicationRecord + include DatabaseViewRecord + self.primary_key = :user_id belongs_to :user - - def readonly? - true - end end From f00ba02653ef4e654571e8942b404fcd925662b1 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Tue, 6 Feb 2024 10:20:23 +0100 Subject: [PATCH 049/211] Update dependency nokogiri to v1.16.2 [SECURITY] (#29106) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- Gemfile.lock | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Gemfile.lock b/Gemfile.lock index 01f5b45929..7c10a419ad 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -465,7 +465,7 @@ GEM net-smtp (0.4.0.1) net-protocol nio4r (2.5.9) - nokogiri (1.16.0) + nokogiri (1.16.2) mini_portile2 (~> 2.8.2) racc (~> 1.4) oj (3.16.3) From 916aeb574d24e2dce1cfefac4694066c7caf65ca Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Tue, 6 Feb 2024 10:23:55 +0100 Subject: [PATCH 050/211] Update DefinitelyTyped types (non-major) (#29088) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- yarn.lock | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/yarn.lock b/yarn.lock index 4d1084c229..8055554014 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3179,12 +3179,12 @@ __metadata: linkType: hard "@types/jest@npm:^29.5.2": - version: 29.5.11 - resolution: "@types/jest@npm:29.5.11" + version: 29.5.12 + resolution: "@types/jest@npm:29.5.12" dependencies: expect: "npm:^29.0.0" pretty-format: "npm:^29.0.0" - checksum: 524a3394845214581278bf4d75055927261fbeac7e1a89cd621bd0636da37d265fe0a85eac58b5778758faad1cbd7c7c361dfc190c78ebde03a91cce33463261 + checksum: 25fc8e4c611fa6c4421e631432e9f0a6865a8cb07c9815ec9ac90d630271cad773b2ee5fe08066f7b95bebd18bb967f8ce05d018ee9ab0430f9dfd1d84665b6f languageName: node linkType: hard @@ -3286,13 +3286,13 @@ __metadata: linkType: hard "@types/pg@npm:^8.6.6": - version: 8.10.9 - resolution: "@types/pg@npm:8.10.9" + version: 8.11.0 + resolution: "@types/pg@npm:8.11.0" dependencies: "@types/node": "npm:*" pg-protocol: "npm:*" pg-types: "npm:^4.0.1" - checksum: 6b3bec7230d09da6459636a66dfd6fb538378e466ffff0a0bcd07d67aa4ddce49c73afc7442f53adec92a49dbf9e71d8d847e0075750d7545331735dfd92d22c + checksum: df2c2ac11fa5e8863a98aadce9a9168af5cfc38a226a228d8b1be513ef48d33ceb9bfaa64ef685a87e0611a4f8d94f2e0736bb2812fa00ed264f76679b86945d languageName: node linkType: hard @@ -3476,13 +3476,13 @@ __metadata: linkType: hard "@types/react@npm:*, @types/react@npm:16 || 17 || 18, @types/react@npm:>=16.9.11, @types/react@npm:^18.2.7": - version: 18.2.48 - resolution: "@types/react@npm:18.2.48" + version: 18.2.54 + resolution: "@types/react@npm:18.2.54" dependencies: "@types/prop-types": "npm:*" "@types/scheduler": "npm:*" csstype: "npm:^3.0.2" - checksum: 7e89f18ea2928b1638f564b156d692894dcb9352a7e0a807873c97e858abe1f23dbd165a25dd088a991344e973fdeef88ba5724bfb64504b74072cbc9c220c3a + checksum: ad38193c30a063a481aeec2460de6396c80d8de2f1c7a8cbb80a4e8bc594f74c308ce93e165d743b38507c3ac0a491c24ce0efbd84c9ab21fd5fd38d2963d329 languageName: node linkType: hard @@ -3599,9 +3599,9 @@ __metadata: linkType: hard "@types/uuid@npm:^9.0.0": - version: 9.0.7 - resolution: "@types/uuid@npm:9.0.7" - checksum: b329ebd4f9d1d8e08d4f2cc211be4922d70d1149f73d5772630e4a3acfb5170c6d37b3d7a39a0412f1a56e86e8a844c7f297c798b082f90380608bf766688787 + version: 9.0.8 + resolution: "@types/uuid@npm:9.0.8" + checksum: b411b93054cb1d4361919579ef3508a1f12bf15b5fdd97337d3d351bece6c921b52b6daeef89b62340fd73fd60da407878432a1af777f40648cbe53a01723489 languageName: node linkType: hard From 586b4faf61dac5156a79637b49ce07ca401077d4 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Tue, 6 Feb 2024 10:24:44 +0100 Subject: [PATCH 051/211] Update dependency haml_lint to v0.56.0 (#29082) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- Gemfile.lock | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Gemfile.lock b/Gemfile.lock index 7c10a419ad..960bd48de4 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -319,7 +319,7 @@ GEM activesupport (>= 5.1) haml (>= 4.0.6) railties (>= 5.1) - haml_lint (0.55.0) + haml_lint (0.56.0) haml (>= 5.0) parallel (~> 1.10) rainbow From 5ca45403e24522257da4ed608c265078b558ab8a Mon Sep 17 00:00:00 2001 From: Matt Jankowski Date: Tue, 6 Feb 2024 04:33:11 -0500 Subject: [PATCH 052/211] Update `nsa` gem to version 0.3.0 (#29065) --- Gemfile | 2 +- Gemfile.lock | 18 ++++++------------ 2 files changed, 7 insertions(+), 13 deletions(-) diff --git a/Gemfile b/Gemfile index 906441ec67..5f09b4beb2 100644 --- a/Gemfile +++ b/Gemfile @@ -63,7 +63,7 @@ gem 'kaminari', '~> 1.2' gem 'link_header', '~> 0.0' gem 'mime-types', '~> 3.5.0', require: 'mime/types/columnar' gem 'nokogiri', '~> 1.15' -gem 'nsa', github: 'jhawthorn/nsa', ref: 'e020fcc3a54d993ab45b7194d89ab720296c111b' +gem 'nsa' gem 'oj', '~> 3.14' gem 'ox', '~> 2.14' gem 'parslet' diff --git a/Gemfile.lock b/Gemfile.lock index 960bd48de4..9de0af9a4b 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -7,17 +7,6 @@ GIT hkdf (~> 0.2) jwt (~> 2.0) -GIT - remote: https://github.com/jhawthorn/nsa.git - revision: e020fcc3a54d993ab45b7194d89ab720296c111b - ref: e020fcc3a54d993ab45b7194d89ab720296c111b - specs: - nsa (0.2.8) - activesupport (>= 4.2, < 7.2) - concurrent-ruby (~> 1.0, >= 1.0.2) - sidekiq (>= 3.5) - statsd-ruby (~> 1.4, >= 1.4.0) - GEM remote: https://rubygems.org/ specs: @@ -468,6 +457,11 @@ GEM nokogiri (1.16.2) mini_portile2 (~> 2.8.2) racc (~> 1.4) + nsa (0.3.0) + activesupport (>= 4.2, < 7.2) + concurrent-ruby (~> 1.0, >= 1.0.2) + sidekiq (>= 3.5) + statsd-ruby (~> 1.4, >= 1.4.0) oj (3.16.3) bigdecimal (>= 3.0) omniauth (2.1.1) @@ -886,7 +880,7 @@ DEPENDENCIES net-http (~> 0.4.0) net-ldap (~> 0.18) nokogiri (~> 1.15) - nsa! + nsa oj (~> 3.14) omniauth (~> 2.0) omniauth-cas (~> 3.0.0.beta.1) From a2d8aa1583545d52b4825a38dc1880f7dd81223d Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Tue, 6 Feb 2024 10:33:41 +0100 Subject: [PATCH 053/211] Update dependency tzinfo-data to v1.2024.1 (#29052) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- Gemfile.lock | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Gemfile.lock b/Gemfile.lock index 9de0af9a4b..d6a51e2f0a 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -765,7 +765,7 @@ GEM unf (~> 0.1.0) tzinfo (2.0.6) concurrent-ruby (~> 1.0) - tzinfo-data (1.2023.4) + tzinfo-data (1.2024.1) tzinfo (>= 1.0.0) unf (0.1.4) unf_ext From 779d987fbc42412f80cce93a8f5979525c894d5d Mon Sep 17 00:00:00 2001 From: Matt Jankowski Date: Tue, 6 Feb 2024 04:34:28 -0500 Subject: [PATCH 054/211] Update `codedoc/codecov-action` to v4 (#29036) --- .github/workflows/test-ruby.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/test-ruby.yml b/.github/workflows/test-ruby.yml index 346703ced4..4275f59420 100644 --- a/.github/workflows/test-ruby.yml +++ b/.github/workflows/test-ruby.yml @@ -139,7 +139,7 @@ jobs: - name: Upload coverage reports to Codecov if: matrix.ruby-version == '.ruby-version' - uses: codecov/codecov-action@v3 + uses: codecov/codecov-action@v4 with: files: coverage/lcov/mastodon.lcov From 66dda7c762d19c18dc1d7e3105a26377c5b6e932 Mon Sep 17 00:00:00 2001 From: Claire Date: Tue, 6 Feb 2024 10:35:27 +0100 Subject: [PATCH 055/211] Fix already-invalid reports failing to resolve (#29027) --- app/models/report.rb | 6 ++---- spec/models/report_spec.rb | 13 +++++++++++++ 2 files changed, 15 insertions(+), 4 deletions(-) diff --git a/app/models/report.rb b/app/models/report.rb index 38da26d7b7..1b132753b5 100644 --- a/app/models/report.rb +++ b/app/models/report.rb @@ -47,9 +47,9 @@ class Report < ApplicationRecord delegate :local?, to: :account validates :comment, length: { maximum: 1_000 }, if: :local? - validates :rule_ids, absence: true, unless: :violation? + validates :rule_ids, absence: true, if: -> { (category_changed? || rule_ids_changed?) && !violation? } - validate :validate_rule_ids + validate :validate_rule_ids, if: -> { (category_changed? || rule_ids_changed?) && violation? } # entries here need to be kept in sync with the front-end: # - app/javascript/mastodon/features/notifications/components/report.jsx @@ -162,8 +162,6 @@ class Report < ApplicationRecord end def validate_rule_ids - return unless violation? - errors.add(:rule_ids, I18n.t('reports.errors.invalid_rules')) unless rules.size == rule_ids&.size end diff --git a/spec/models/report_spec.rb b/spec/models/report_spec.rb index c514c63b39..0168268bcb 100644 --- a/spec/models/report_spec.rb +++ b/spec/models/report_spec.rb @@ -133,5 +133,18 @@ describe Report do report = Fabricate.build(:report, account: remote_account, comment: Faker::Lorem.characters(number: 1001)) expect(report.valid?).to be true end + + it 'is invalid if it references invalid rules' do + report = Fabricate.build(:report, category: :violation, rule_ids: [-1]) + expect(report.valid?).to be false + expect(report).to model_have_error_on_field(:rule_ids) + end + + it 'is invalid if it references rules but category is not "violation"' do + rule = Fabricate(:rule) + report = Fabricate.build(:report, category: :spam, rule_ids: rule.id) + expect(report.valid?).to be false + expect(report).to model_have_error_on_field(:rule_ids) + end end end From 9ce914cc897d2b1100cee8cb6d792a2283d877ec Mon Sep 17 00:00:00 2001 From: Claire Date: Tue, 6 Feb 2024 10:35:36 +0100 Subject: [PATCH 056/211] Fix report reason selector in moderation interface not unselecting rules when changing category (#29026) --- .../mastodon/components/admin/ReportReasonSelector.jsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/javascript/mastodon/components/admin/ReportReasonSelector.jsx b/app/javascript/mastodon/components/admin/ReportReasonSelector.jsx index ecce92b309..90f4334a6e 100644 --- a/app/javascript/mastodon/components/admin/ReportReasonSelector.jsx +++ b/app/javascript/mastodon/components/admin/ReportReasonSelector.jsx @@ -124,7 +124,7 @@ class ReportReasonSelector extends PureComponent { api().put(`/api/v1/admin/reports/${id}`, { category, - rule_ids, + rule_ids: category === 'violation' ? rule_ids : [], }).catch(err => { console.error(err); }); From 90f4b8d53a027e39049b5b6f4decfe605f925bda Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Tue, 6 Feb 2024 10:37:03 +0100 Subject: [PATCH 057/211] Update dependency postcss to v8.4.34 (#29103) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- yarn.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/yarn.lock b/yarn.lock index 8055554014..8783c33f86 100644 --- a/yarn.lock +++ b/yarn.lock @@ -13144,13 +13144,13 @@ __metadata: linkType: hard "postcss@npm:^8.2.15, postcss@npm:^8.4.24, postcss@npm:^8.4.33": - version: 8.4.33 - resolution: "postcss@npm:8.4.33" + version: 8.4.34 + resolution: "postcss@npm:8.4.34" dependencies: nanoid: "npm:^3.3.7" picocolors: "npm:^1.0.0" source-map-js: "npm:^1.0.2" - checksum: 16eda83458fcd8a91bece287b5920c7f57164c3ea293e6c80d0ea71ce7843007bcd8592260a5160b9a7f02693e6ac93e2495b02d8c7596d3f3f72c1447e3ba79 + checksum: 4d6f072cdfdc1ced16b4336263d830f8b4397fc47b9b382e02f6448fda9386d881aa9d27fbe0dd124f59c76f3a5da4f360919d25dfc818eca50b48f042af35a8 languageName: node linkType: hard From 62028b1b1bf32623c13e2c5f3419c8ab03fc1db2 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Tue, 6 Feb 2024 10:38:32 +0100 Subject: [PATCH 058/211] Update libretranslate/libretranslate Docker tag to v1.5.5 (#29090) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- .devcontainer/docker-compose.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.devcontainer/docker-compose.yml b/.devcontainer/docker-compose.yml index 88979723c3..ecdf9f5f53 100644 --- a/.devcontainer/docker-compose.yml +++ b/.devcontainer/docker-compose.yml @@ -70,7 +70,7 @@ services: hard: -1 libretranslate: - image: libretranslate/libretranslate:v1.5.4 + image: libretranslate/libretranslate:v1.5.5 restart: unless-stopped volumes: - lt-data:/home/libretranslate/.local From 0bec5c0755cfb270c692fd39b0f22e98ab1b4e0b Mon Sep 17 00:00:00 2001 From: Matt Jankowski Date: Tue, 6 Feb 2024 04:56:24 -0500 Subject: [PATCH 059/211] Remove migration base class switcher from `RailsSettingsMigration` (#29047) --- db/migrate/20161006213403_rails_settings_migration.rb | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/db/migrate/20161006213403_rails_settings_migration.rb b/db/migrate/20161006213403_rails_settings_migration.rb index 401b7a83b7..9764196fab 100644 --- a/db/migrate/20161006213403_rails_settings_migration.rb +++ b/db/migrate/20161006213403_rails_settings_migration.rb @@ -1,12 +1,6 @@ # frozen_string_literal: true -MIGRATION_BASE_CLASS = if ActiveRecord::VERSION::MAJOR >= 5 - ActiveRecord::Migration[5.0] - else - ActiveRecord::Migration[4.2] - end - -class RailsSettingsMigration < MIGRATION_BASE_CLASS +class RailsSettingsMigration < ActiveRecord::Migration[5.0] def self.up create_table :settings do |t| t.string :var, null: false From a31427a629df020a975276cbff157691e51d7456 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Tue, 6 Feb 2024 12:33:06 +0100 Subject: [PATCH 060/211] Update dependency pino to v8.18.0 (#29043) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- yarn.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/yarn.lock b/yarn.lock index 8783c33f86..75b4c355af 100644 --- a/yarn.lock +++ b/yarn.lock @@ -12667,8 +12667,8 @@ __metadata: linkType: hard "pino@npm:^8.17.1, pino@npm:^8.17.2": - version: 8.17.2 - resolution: "pino@npm:8.17.2" + version: 8.18.0 + resolution: "pino@npm:8.18.0" dependencies: atomic-sleep: "npm:^1.0.0" fast-redact: "npm:^3.1.1" @@ -12683,7 +12683,7 @@ __metadata: thread-stream: "npm:^2.0.0" bin: pino: bin.js - checksum: 9e55af6cd9d1833a4dbe64924fc73163295acd3c988a9c7db88926669f2574ab7ec607e8487b6dd71dbdad2d7c1c1aac439f37e59233f37220b1a9d88fa2ce01 + checksum: ca73bb31e4656954413b89f48c486b1680fec0c6bb12d4d796c5ccf8eca40f3ee12c9532a0fa61284ed9a800c14eaa0f496f520057ef70cdee0447114813e8eb languageName: node linkType: hard From 4cf07ed78c0f4959160f22506e1f03dc5737a815 Mon Sep 17 00:00:00 2001 From: Matt Jankowski Date: Tue, 6 Feb 2024 06:34:11 -0500 Subject: [PATCH 061/211] Add missing action logging to `api/v1/admin/reports#update` (#29044) --- .../api/v1/admin/reports_controller.rb | 1 + .../admin/reports_controller_spec.rb | 10 +++++++ spec/requests/api/v1/admin/reports_spec.rb | 26 +++++++++++++++---- 3 files changed, 32 insertions(+), 5 deletions(-) diff --git a/app/controllers/api/v1/admin/reports_controller.rb b/app/controllers/api/v1/admin/reports_controller.rb index 9dfb181a28..7129a5f6ca 100644 --- a/app/controllers/api/v1/admin/reports_controller.rb +++ b/app/controllers/api/v1/admin/reports_controller.rb @@ -35,6 +35,7 @@ class Api::V1::Admin::ReportsController < Api::BaseController def update authorize @report, :update? @report.update!(report_params) + log_action :update, @report render json: @report, serializer: REST::Admin::ReportSerializer end diff --git a/spec/controllers/admin/reports_controller_spec.rb b/spec/controllers/admin/reports_controller_spec.rb index 97daaf8da9..02760154fb 100644 --- a/spec/controllers/admin/reports_controller_spec.rb +++ b/spec/controllers/admin/reports_controller_spec.rb @@ -58,6 +58,7 @@ describe Admin::ReportsController do report.reload expect(report.action_taken_by_account).to eq user.account expect(report.action_taken?).to be true + expect(last_action_log.target).to eq(report) end end @@ -70,6 +71,7 @@ describe Admin::ReportsController do report.reload expect(report.action_taken_by_account).to be_nil expect(report.action_taken?).to be false + expect(last_action_log.target).to eq(report) end end @@ -81,6 +83,7 @@ describe Admin::ReportsController do expect(response).to redirect_to(admin_report_path(report)) report.reload expect(report.assigned_account).to eq user.account + expect(last_action_log.target).to eq(report) end end @@ -92,6 +95,13 @@ describe Admin::ReportsController do expect(response).to redirect_to(admin_report_path(report)) report.reload expect(report.assigned_account).to be_nil + expect(last_action_log.target).to eq(report) end end + + private + + def last_action_log + Admin::ActionLog.last + end end diff --git a/spec/requests/api/v1/admin/reports_spec.rb b/spec/requests/api/v1/admin/reports_spec.rb index 5403457db0..4b0b7e1713 100644 --- a/spec/requests/api/v1/admin/reports_spec.rb +++ b/spec/requests/api/v1/admin/reports_spec.rb @@ -151,7 +151,9 @@ RSpec.describe 'Reports' do let(:params) { { category: 'spam' } } it 'updates the report category', :aggregate_failures do - expect { subject }.to change { report.reload.category }.from('other').to('spam') + expect { subject } + .to change { report.reload.category }.from('other').to('spam') + .and create_an_action_log expect(response).to have_http_status(200) @@ -184,7 +186,9 @@ RSpec.describe 'Reports' do it_behaves_like 'forbidden for wrong role', '' it 'marks report as resolved', :aggregate_failures do - expect { subject }.to change { report.reload.unresolved? }.from(true).to(false) + expect { subject } + .to change { report.reload.unresolved? }.from(true).to(false) + .and create_an_action_log expect(response).to have_http_status(200) end end @@ -200,7 +204,9 @@ RSpec.describe 'Reports' do it_behaves_like 'forbidden for wrong role', '' it 'marks report as unresolved', :aggregate_failures do - expect { subject }.to change { report.reload.unresolved? }.from(false).to(true) + expect { subject } + .to change { report.reload.unresolved? }.from(false).to(true) + .and create_an_action_log expect(response).to have_http_status(200) end end @@ -216,7 +222,9 @@ RSpec.describe 'Reports' do it_behaves_like 'forbidden for wrong role', '' it 'assigns report to the requesting user', :aggregate_failures do - expect { subject }.to change { report.reload.assigned_account_id }.from(nil).to(user.account.id) + expect { subject } + .to change { report.reload.assigned_account_id }.from(nil).to(user.account.id) + .and create_an_action_log expect(response).to have_http_status(200) end end @@ -232,8 +240,16 @@ RSpec.describe 'Reports' do it_behaves_like 'forbidden for wrong role', '' it 'unassigns report from assignee', :aggregate_failures do - expect { subject }.to change { report.reload.assigned_account_id }.from(user.account.id).to(nil) + expect { subject } + .to change { report.reload.assigned_account_id }.from(user.account.id).to(nil) + .and create_an_action_log expect(response).to have_http_status(200) end end + + private + + def create_an_action_log + change(Admin::ActionLog, :count).by(1) + end end From dedefdc303a2438d9b9026797bb00a41930b91e2 Mon Sep 17 00:00:00 2001 From: Matt Jankowski Date: Tue, 6 Feb 2024 06:40:24 -0500 Subject: [PATCH 062/211] Move length value mapping to constant in ids to bigints migration (#29048) --- db/migrate/20170918125918_ids_to_bigints.rb | 152 +++++++++++--------- 1 file changed, 82 insertions(+), 70 deletions(-) diff --git a/db/migrate/20170918125918_ids_to_bigints.rb b/db/migrate/20170918125918_ids_to_bigints.rb index 83c5ab971b..64f1d0093a 100644 --- a/db/migrate/20170918125918_ids_to_bigints.rb +++ b/db/migrate/20170918125918_ids_to_bigints.rb @@ -7,80 +7,73 @@ class IdsToBigints < ActiveRecord::Migration[5.1] include Mastodon::MigrationHelpers include Mastodon::MigrationWarning + TABLE_COLUMN_MAPPING = [ + [:account_domain_blocks, :account_id], + [:account_domain_blocks, :id], + [:accounts, :id], + [:blocks, :account_id], + [:blocks, :id], + [:blocks, :target_account_id], + [:conversation_mutes, :account_id], + [:conversation_mutes, :id], + [:domain_blocks, :id], + [:favourites, :account_id], + [:favourites, :id], + [:favourites, :status_id], + [:follow_requests, :account_id], + [:follow_requests, :id], + [:follow_requests, :target_account_id], + [:follows, :account_id], + [:follows, :id], + [:follows, :target_account_id], + [:imports, :account_id], + [:imports, :id], + [:media_attachments, :account_id], + [:media_attachments, :id], + [:mentions, :account_id], + [:mentions, :id], + [:mutes, :account_id], + [:mutes, :id], + [:mutes, :target_account_id], + [:notifications, :account_id], + [:notifications, :from_account_id], + [:notifications, :id], + [:oauth_access_grants, :application_id], + [:oauth_access_grants, :id], + [:oauth_access_grants, :resource_owner_id], + [:oauth_access_tokens, :application_id], + [:oauth_access_tokens, :id], + [:oauth_access_tokens, :resource_owner_id], + [:oauth_applications, :id], + [:oauth_applications, :owner_id], + [:reports, :account_id], + [:reports, :action_taken_by_account_id], + [:reports, :id], + [:reports, :target_account_id], + [:session_activations, :access_token_id], + [:session_activations, :user_id], + [:session_activations, :web_push_subscription_id], + [:settings, :id], + [:settings, :thing_id], + [:statuses, :account_id], + [:statuses, :application_id], + [:statuses, :in_reply_to_account_id], + [:stream_entries, :account_id], + [:stream_entries, :id], + [:subscriptions, :account_id], + [:subscriptions, :id], + [:tags, :id], + [:users, :account_id], + [:users, :id], + [:web_settings, :id], + [:web_settings, :user_id], + ].freeze + disable_ddl_transaction! def migrate_columns(to_type) - included_columns = [ - [:account_domain_blocks, :account_id], - [:account_domain_blocks, :id], - [:accounts, :id], - [:blocks, :account_id], - [:blocks, :id], - [:blocks, :target_account_id], - [:conversation_mutes, :account_id], - [:conversation_mutes, :id], - [:domain_blocks, :id], - [:favourites, :account_id], - [:favourites, :id], - [:favourites, :status_id], - [:follow_requests, :account_id], - [:follow_requests, :id], - [:follow_requests, :target_account_id], - [:follows, :account_id], - [:follows, :id], - [:follows, :target_account_id], - [:imports, :account_id], - [:imports, :id], - [:media_attachments, :account_id], - [:media_attachments, :id], - [:mentions, :account_id], - [:mentions, :id], - [:mutes, :account_id], - [:mutes, :id], - [:mutes, :target_account_id], - [:notifications, :account_id], - [:notifications, :from_account_id], - [:notifications, :id], - [:oauth_access_grants, :application_id], - [:oauth_access_grants, :id], - [:oauth_access_grants, :resource_owner_id], - [:oauth_access_tokens, :application_id], - [:oauth_access_tokens, :id], - [:oauth_access_tokens, :resource_owner_id], - [:oauth_applications, :id], - [:oauth_applications, :owner_id], - [:reports, :account_id], - [:reports, :action_taken_by_account_id], - [:reports, :id], - [:reports, :target_account_id], - [:session_activations, :access_token_id], - [:session_activations, :user_id], - [:session_activations, :web_push_subscription_id], - [:settings, :id], - [:settings, :thing_id], - [:statuses, :account_id], - [:statuses, :application_id], - [:statuses, :in_reply_to_account_id], - [:stream_entries, :account_id], - [:stream_entries, :id], - [:subscriptions, :account_id], - [:subscriptions, :id], - [:tags, :id], - [:users, :account_id], - [:users, :id], - [:web_settings, :id], - [:web_settings, :user_id], - ] - included_columns << [:deprecated_preview_cards, :id] if table_exists?(:deprecated_preview_cards) - - migration_duration_warning(<<~EXPLANATION) - This migration has some sections that can be safely interrupted - and restarted later, and will tell you when those are occurring. + display_warning - For more information, see https://github.com/mastodon/mastodon/pull/5088 - EXPLANATION - - tables = included_columns.map(&:first).uniq table_sizes = {} # Sort tables by their size @@ -103,6 +96,25 @@ class IdsToBigints < ActiveRecord::Migration[5.1] end end + def display_warning + migration_duration_warning(<<~EXPLANATION) + This migration has some sections that can be safely interrupted + and restarted later, and will tell you when those are occurring. + + For more information, see https://github.com/mastodon/mastodon/pull/5088 + EXPLANATION + end + + def tables + included_columns.map(&:first).uniq + end + + def included_columns + TABLE_COLUMN_MAPPING.dup.tap do |included_columns| + included_columns << [:deprecated_preview_cards, :id] if table_exists?(:deprecated_preview_cards) + end + end + def up migrate_columns(:bigint) end From 4fb7f611de1cf33a74ff57f1c400e9cba7a24771 Mon Sep 17 00:00:00 2001 From: Emelia Smith Date: Tue, 6 Feb 2024 13:38:14 +0100 Subject: [PATCH 063/211] Return domain block digests from admin domain blocks API (#29092) --- app/serializers/rest/admin/domain_block_serializer.rb | 6 +++++- spec/requests/api/v1/admin/domain_blocks_spec.rb | 3 +++ 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/app/serializers/rest/admin/domain_block_serializer.rb b/app/serializers/rest/admin/domain_block_serializer.rb index b955d008a6..e94a337cb8 100644 --- a/app/serializers/rest/admin/domain_block_serializer.rb +++ b/app/serializers/rest/admin/domain_block_serializer.rb @@ -1,11 +1,15 @@ # frozen_string_literal: true class REST::Admin::DomainBlockSerializer < ActiveModel::Serializer - attributes :id, :domain, :created_at, :severity, + attributes :id, :domain, :digest, :created_at, :severity, :reject_media, :reject_reports, :private_comment, :public_comment, :obfuscate def id object.id.to_s end + + def digest + object.domain_digest + end end diff --git a/spec/requests/api/v1/admin/domain_blocks_spec.rb b/spec/requests/api/v1/admin/domain_blocks_spec.rb index 1fb6fc8228..47aaf44d80 100644 --- a/spec/requests/api/v1/admin/domain_blocks_spec.rb +++ b/spec/requests/api/v1/admin/domain_blocks_spec.rb @@ -49,6 +49,7 @@ RSpec.describe 'Domain Blocks' do { id: domain_block.id.to_s, domain: domain_block.domain, + digest: domain_block.domain_digest, created_at: domain_block.created_at.strftime('%Y-%m-%dT%H:%M:%S.%LZ'), severity: domain_block.severity.to_s, reject_media: domain_block.reject_media, @@ -97,6 +98,7 @@ RSpec.describe 'Domain Blocks' do { id: domain_block.id.to_s, domain: domain_block.domain, + digest: domain_block.domain_digest, created_at: domain_block.created_at.strftime('%Y-%m-%dT%H:%M:%S.%LZ'), severity: domain_block.severity.to_s, reject_media: domain_block.reject_media, @@ -188,6 +190,7 @@ RSpec.describe 'Domain Blocks' do { id: domain_block.id.to_s, domain: domain_block.domain, + digest: domain_block.domain_digest, severity: 'suspend', } ) From df7acdcee516d6321a40c0f1cbc55c41b039e3c7 Mon Sep 17 00:00:00 2001 From: Matt Jankowski Date: Tue, 6 Feb 2024 07:47:04 -0500 Subject: [PATCH 064/211] Update markers API spec for error case (#29096) --- spec/requests/api/v1/markers_spec.rb | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/spec/requests/api/v1/markers_spec.rb b/spec/requests/api/v1/markers_spec.rb index a1ca4ba754..b04adf2594 100644 --- a/spec/requests/api/v1/markers_spec.rb +++ b/spec/requests/api/v1/markers_spec.rb @@ -52,5 +52,19 @@ RSpec.describe 'API Markers' do expect(user.markers.first.last_read_id).to eq 70_120 end end + + context 'when database object becomes stale' do + before do + allow(Marker).to receive(:transaction).and_raise(ActiveRecord::StaleObjectError) + post '/api/v1/markers', headers: headers, params: { home: { last_read_id: '69420' } } + end + + it 'returns error json' do + expect(response) + .to have_http_status(409) + expect(body_as_json) + .to include(error: /Conflict during update/) + end + end end end From 577520b6376f5ad14aa343a2aba881e7e1ef1897 Mon Sep 17 00:00:00 2001 From: Matt Jankowski Date: Tue, 6 Feb 2024 07:49:48 -0500 Subject: [PATCH 065/211] Replace deprecated `Sidekiq::Testing` block style (#29097) --- spec/rails_helper.rb | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/spec/rails_helper.rb b/spec/rails_helper.rb index aaf587f49b..5125339096 100644 --- a/spec/rails_helper.rb +++ b/spec/rails_helper.rb @@ -95,8 +95,13 @@ RSpec.configure do |config| self.use_transactional_tests = true end - config.around(:each, :sidekiq_inline) do |example| - Sidekiq::Testing.inline!(&example) + config.around do |example| + if example.metadata[:sidekiq_inline] == true + Sidekiq::Testing.inline! + else + Sidekiq::Testing.fake! + end + example.run end config.before :each, type: :cli do From e8cc98977d081898682e0ca25154be7fb2c358fb Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Tue, 6 Feb 2024 13:52:28 +0100 Subject: [PATCH 066/211] Update dependency bootsnap to '~> 1.18.0' (#29019) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- Gemfile | 2 +- Gemfile.lock | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Gemfile b/Gemfile index 5f09b4beb2..355e69b0c4 100644 --- a/Gemfile +++ b/Gemfile @@ -26,7 +26,7 @@ gem 'blurhash', '~> 0.1' gem 'active_model_serializers', '~> 0.10' gem 'addressable', '~> 2.8' -gem 'bootsnap', '~> 1.17.0', require: false +gem 'bootsnap', '~> 1.18.0', require: false gem 'browser' gem 'charlock_holmes', '~> 0.7.7' gem 'chewy', '~> 7.3' diff --git a/Gemfile.lock b/Gemfile.lock index d6a51e2f0a..57ad96437f 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -144,7 +144,7 @@ GEM binding_of_caller (1.0.0) debug_inspector (>= 0.0.1) blurhash (0.1.7) - bootsnap (1.17.1) + bootsnap (1.18.3) msgpack (~> 1.2) brakeman (6.1.1) racc @@ -823,7 +823,7 @@ DEPENDENCIES better_errors (~> 2.9) binding_of_caller (~> 1.0) blurhash (~> 0.1) - bootsnap (~> 1.17.0) + bootsnap (~> 1.18.0) brakeman (~> 6.0) browser bundler-audit (~> 0.9) From 0877f6fda417d27e7e6b9bd1d888dec1b97a7792 Mon Sep 17 00:00:00 2001 From: Matt Jankowski Date: Tue, 6 Feb 2024 07:56:22 -0500 Subject: [PATCH 067/211] Remove redundant `return` in `IntentsController` (#29099) --- app/controllers/intents_controller.rb | 23 +++++++++++------------ 1 file changed, 11 insertions(+), 12 deletions(-) diff --git a/app/controllers/intents_controller.rb b/app/controllers/intents_controller.rb index ea024e30e6..65c315208d 100644 --- a/app/controllers/intents_controller.rb +++ b/app/controllers/intents_controller.rb @@ -1,27 +1,26 @@ # frozen_string_literal: true class IntentsController < ApplicationController - before_action :check_uri + EXPECTED_SCHEME = 'web+mastodon' + before_action :handle_invalid_uri, unless: :valid_uri? rescue_from Addressable::URI::InvalidURIError, with: :handle_invalid_uri def show - if uri.scheme == 'web+mastodon' - case uri.host - when 'follow' - return redirect_to authorize_interaction_path(uri: uri.query_values['uri'].delete_prefix('acct:')) - when 'share' - return redirect_to share_path(text: uri.query_values['text']) - end + case uri.host + when 'follow' + redirect_to authorize_interaction_path(uri: uri.query_values['uri'].delete_prefix('acct:')) + when 'share' + redirect_to share_path(text: uri.query_values['text']) + else + handle_invalid_uri end - - not_found end private - def check_uri - not_found if uri.blank? + def valid_uri? + uri.present? && uri.scheme == EXPECTED_SCHEME end def handle_invalid_uri From 978fdc71cab327c98b3c03c05f3f716fbeedf6c9 Mon Sep 17 00:00:00 2001 From: Matt Jankowski Date: Tue, 6 Feb 2024 08:04:02 -0500 Subject: [PATCH 068/211] Reduce expectation count in example from `ProcessAccountService` spec (#29100) --- .rubocop_todo.yml | 2 +- .../process_account_service_spec.rb | 24 ++++++++++++------- 2 files changed, 17 insertions(+), 9 deletions(-) diff --git a/.rubocop_todo.yml b/.rubocop_todo.yml index c8165c1edf..09e9fd73d8 100644 --- a/.rubocop_todo.yml +++ b/.rubocop_todo.yml @@ -39,7 +39,7 @@ RSpec/ExampleLength: Max: 22 RSpec/MultipleExpectations: - Max: 8 + Max: 7 # Configuration parameters: AllowSubject. RSpec/MultipleMemoizedHelpers: diff --git a/spec/services/activitypub/process_account_service_spec.rb b/spec/services/activitypub/process_account_service_spec.rb index 9abe03181e..824577d1b0 100644 --- a/spec/services/activitypub/process_account_service_spec.rb +++ b/spec/services/activitypub/process_account_service_spec.rb @@ -21,14 +21,22 @@ RSpec.describe ActivityPub::ProcessAccountService, type: :service do it 'parses out of attachment' do account = subject.call('alice', 'example.com', payload) - expect(account.fields).to be_a Array - expect(account.fields.size).to eq 2 - expect(account.fields[0]).to be_a Account::Field - expect(account.fields[0].name).to eq 'Pronouns' - expect(account.fields[0].value).to eq 'They/them' - expect(account.fields[1]).to be_a Account::Field - expect(account.fields[1].name).to eq 'Occupation' - expect(account.fields[1].value).to eq 'Unit test' + + expect(account.fields) + .to be_an(Array) + .and have_attributes(size: 2) + expect(account.fields.first) + .to be_an(Account::Field) + .and have_attributes( + name: eq('Pronouns'), + value: eq('They/them') + ) + expect(account.fields.last) + .to be_an(Account::Field) + .and have_attributes( + name: eq('Occupation'), + value: eq('Unit test') + ) end end From 2d6ab445562fd6c4d56d7aef5dd406c15de8bbf9 Mon Sep 17 00:00:00 2001 From: Matt Jankowski Date: Tue, 6 Feb 2024 08:10:00 -0500 Subject: [PATCH 069/211] Reduce request/response round-trips in ap/collections controller spec (#29102) --- .../collections_controller_spec.rb | 90 ++++++------------- 1 file changed, 28 insertions(+), 62 deletions(-) diff --git a/spec/controllers/activitypub/collections_controller_spec.rb b/spec/controllers/activitypub/collections_controller_spec.rb index cf484ff5a4..11ef03c842 100644 --- a/spec/controllers/activitypub/collections_controller_spec.rb +++ b/spec/controllers/activitypub/collections_controller_spec.rb @@ -17,34 +17,27 @@ RSpec.describe ActivityPub::CollectionsController do end describe 'GET #show' do + subject(:response) { get :show, params: { id: id, account_username: account.username } } + context 'when id is "featured"' do - context 'without signature' do - subject(:response) { get :show, params: { id: 'featured', account_username: account.username } } + let(:id) { 'featured' } - let(:body) { body_as_json } + context 'without signature' do let(:remote_account) { nil } - it 'returns http success' do + it 'returns http success and correct media type' do expect(response).to have_http_status(200) - end - - it 'returns application/activity+json' do expect(response.media_type).to eq 'application/activity+json' end it_behaves_like 'cacheable response' - it 'returns orderedItems with pinned statuses' do - expect(body[:orderedItems]).to be_an Array - expect(body[:orderedItems].size).to eq 3 - end - - it 'includes URI of private pinned status' do - expect(body[:orderedItems]).to include(ActivityPub::TagManager.instance.uri_for(private_pinned)) - end - - it 'does not include contents of private pinned status' do - expect(response.body).to_not include(private_pinned.text) + it 'returns orderedItems with correct items' do + expect(body_as_json[:orderedItems]) + .to be_an(Array) + .and have_attributes(size: 3) + .and include(ActivityPub::TagManager.instance.uri_for(private_pinned)) + .and not_include(private_pinned.text) end context 'when account is permanently suspended' do @@ -73,33 +66,19 @@ RSpec.describe ActivityPub::CollectionsController do let(:remote_account) { Fabricate(:account, domain: 'example.com') } context 'when getting a featured resource' do - before do - get :show, params: { id: 'featured', account_username: account.username } - end - - it 'returns http success' do + it 'returns http success and correct media type' do expect(response).to have_http_status(200) - end - - it 'returns application/activity+json' do expect(response.media_type).to eq 'application/activity+json' end it_behaves_like 'cacheable response' - it 'returns orderedItems with pinned statuses' do - json = body_as_json - expect(json[:orderedItems]).to be_an Array - expect(json[:orderedItems].size).to eq 3 - end - - it 'includes URI of private pinned status' do - json = body_as_json - expect(json[:orderedItems]).to include(ActivityPub::TagManager.instance.uri_for(private_pinned)) - end - - it 'does not include contents of private pinned status' do - expect(response.body).to_not include(private_pinned.text) + it 'returns orderedItems with expected items' do + expect(body_as_json[:orderedItems]) + .to be_an(Array) + .and have_attributes(size: 3) + .and include(ActivityPub::TagManager.instance.uri_for(private_pinned)) + .and not_include(private_pinned.text) end end @@ -111,50 +90,36 @@ RSpec.describe ActivityPub::CollectionsController do context 'when signed request account is blocked' do before do account.block!(remote_account) - get :show, params: { id: 'featured', account_username: account.username } end - it 'returns http success' do + it 'returns http success and correct media type and cache headers' do expect(response).to have_http_status(200) - end - - it 'returns application/activity+json' do expect(response.media_type).to eq 'application/activity+json' - end - - it 'returns private Cache-Control header' do expect(response.headers['Cache-Control']).to include 'private' end it 'returns empty orderedItems' do - json = body_as_json - expect(json[:orderedItems]).to be_an Array - expect(json[:orderedItems].size).to eq 0 + expect(body_as_json[:orderedItems]) + .to be_an(Array) + .and have_attributes(size: 0) end end context 'when signed request account is domain blocked' do before do account.block_domain!(remote_account.domain) - get :show, params: { id: 'featured', account_username: account.username } end - it 'returns http success' do + it 'returns http success and correct media type and cache headers' do expect(response).to have_http_status(200) - end - - it 'returns application/activity+json' do expect(response.media_type).to eq 'application/activity+json' - end - - it 'returns private Cache-Control header' do expect(response.headers['Cache-Control']).to include 'private' end it 'returns empty orderedItems' do - json = body_as_json - expect(json[:orderedItems]).to be_an Array - expect(json[:orderedItems].size).to eq 0 + expect(body_as_json[:orderedItems]) + .to be_an(Array) + .and have_attributes(size: 0) end end end @@ -162,8 +127,9 @@ RSpec.describe ActivityPub::CollectionsController do end context 'when id is not "featured"' do + let(:id) { 'hoge' } + it 'returns http not found' do - get :show, params: { id: 'hoge', account_username: account.username } expect(response).to have_http_status(404) end end From 69e61fff38b426109bd074ccf93f5d2874d430c2 Mon Sep 17 00:00:00 2001 From: Matt Jankowski Date: Tue, 6 Feb 2024 08:18:37 -0500 Subject: [PATCH 070/211] Move direct serializer usage out of admin view partial (#29028) --- app/helpers/react_component_helper.rb | 11 +++++++++++ app/views/admin/reports/_media_attachments.html.haml | 2 +- 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/app/helpers/react_component_helper.rb b/app/helpers/react_component_helper.rb index ce616e8306..821a6f1e2d 100644 --- a/app/helpers/react_component_helper.rb +++ b/app/helpers/react_component_helper.rb @@ -15,9 +15,20 @@ module ReactComponentHelper div_tag_with_data(data) end + def serialized_media_attachments(media_attachments) + media_attachments.map { |attachment| serialized_attachment(attachment) } + end + private def div_tag_with_data(data) content_tag(:div, nil, data: data) end + + def serialized_attachment(attachment) + ActiveModelSerializers::SerializableResource.new( + attachment, + serializer: REST::MediaAttachmentSerializer + ).as_json + end end diff --git a/app/views/admin/reports/_media_attachments.html.haml b/app/views/admin/reports/_media_attachments.html.haml index 3c52d69178..45cc4c5aa3 100644 --- a/app/views/admin/reports/_media_attachments.html.haml +++ b/app/views/admin/reports/_media_attachments.html.haml @@ -12,6 +12,6 @@ = react_component :media_gallery, height: 343, lang: status.language, - media: status.ordered_media_attachments.map { |a| ActiveModelSerializers::SerializableResource.new(a, serializer: REST::MediaAttachmentSerializer).as_json }, + media: serialized_media_attachments(status.ordered_media_attachments), sensitive: status.sensitive?, visible: false From cf42eba0f997aa8065beac853b79d993e8a2495b Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Tue, 6 Feb 2024 14:31:54 +0100 Subject: [PATCH 071/211] Update dependency brakeman to v6.1.2 (#29062) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- Gemfile.lock | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Gemfile.lock b/Gemfile.lock index 57ad96437f..b76f449b26 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -146,7 +146,7 @@ GEM blurhash (0.1.7) bootsnap (1.18.3) msgpack (~> 1.2) - brakeman (6.1.1) + brakeman (6.1.2) racc browser (5.3.1) brpoplpush-redis_script (0.1.3) From 93a5b3f9df7dcf1965525ee2a1202e5f1e07bf05 Mon Sep 17 00:00:00 2001 From: Matt Jankowski Date: Tue, 6 Feb 2024 08:33:42 -0500 Subject: [PATCH 072/211] Move status serializer chooser to private method (#29030) --- app/controllers/api/v1/statuses_controller.rb | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/app/controllers/api/v1/statuses_controller.rb b/app/controllers/api/v1/statuses_controller.rb index 064e7632a8..702896db24 100644 --- a/app/controllers/api/v1/statuses_controller.rb +++ b/app/controllers/api/v1/statuses_controller.rb @@ -71,7 +71,7 @@ class Api::V1::StatusesController < Api::BaseController with_rate_limit: true ) - render json: @status, serializer: @status.is_a?(ScheduledStatus) ? REST::ScheduledStatusSerializer : REST::StatusSerializer + render json: @status, serializer: serializer_for_status rescue PostStatusService::UnexpectedMentionsError => e unexpected_accounts = ActiveModel::Serializer::CollectionSerializer.new( e.accounts, @@ -155,6 +155,10 @@ class Api::V1::StatusesController < Api::BaseController ) end + def serializer_for_status + @status.is_a?(ScheduledStatus) ? REST::ScheduledStatusSerializer : REST::StatusSerializer + end + def pagination_params(core_params) params.slice(:limit).permit(:limit).merge(core_params) end From 0df86d77fd5f57fc88cfd00a2cf2c265215a2839 Mon Sep 17 00:00:00 2001 From: Matt Jankowski Date: Tue, 6 Feb 2024 09:36:04 -0500 Subject: [PATCH 073/211] Reduce `RSpec/ExampleLength` in PostStatusService spec example (#29105) --- spec/services/post_status_service_spec.rb | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/spec/services/post_status_service_spec.rb b/spec/services/post_status_service_spec.rb index 1e5c420a63..d10a82607e 100644 --- a/spec/services/post_status_service_spec.rb +++ b/spec/services/post_status_service_spec.rb @@ -228,13 +228,7 @@ RSpec.describe PostStatusService, type: :service do subject.call( account, text: 'test status update', - media_ids: [ - Fabricate(:media_attachment, account: account), - Fabricate(:media_attachment, account: account), - Fabricate(:media_attachment, account: account), - Fabricate(:media_attachment, account: account), - Fabricate(:media_attachment, account: account), - ].map(&:id) + media_ids: Array.new(5) { Fabricate(:media_attachment, account: account) }.map(&:id) ) end.to raise_error( Mastodon::ValidationError, From 2f19ddd1fa1c14db1edaedc93f29bb4f66ab2cf0 Mon Sep 17 00:00:00 2001 From: Matt Jankowski Date: Tue, 6 Feb 2024 09:54:26 -0500 Subject: [PATCH 074/211] Move status serializer error handling to private method (#29031) --- app/controllers/api/v1/statuses_controller.rb | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/app/controllers/api/v1/statuses_controller.rb b/app/controllers/api/v1/statuses_controller.rb index 702896db24..01c3718763 100644 --- a/app/controllers/api/v1/statuses_controller.rb +++ b/app/controllers/api/v1/statuses_controller.rb @@ -73,11 +73,7 @@ class Api::V1::StatusesController < Api::BaseController render json: @status, serializer: serializer_for_status rescue PostStatusService::UnexpectedMentionsError => e - unexpected_accounts = ActiveModel::Serializer::CollectionSerializer.new( - e.accounts, - serializer: REST::AccountSerializer - ) - render json: { error: e.message, unexpected_accounts: unexpected_accounts }, status: 422 + render json: unexpected_accounts_error_json(e), status: 422 end def update @@ -159,6 +155,17 @@ class Api::V1::StatusesController < Api::BaseController @status.is_a?(ScheduledStatus) ? REST::ScheduledStatusSerializer : REST::StatusSerializer end + def unexpected_accounts_error_json(error) + { + error: error.message, + unexpected_accounts: serialized_accounts(error.accounts), + } + end + + def serialized_accounts(accounts) + ActiveModel::Serializer::CollectionSerializer.new(accounts, serializer: REST::AccountSerializer) + end + def pagination_params(core_params) params.slice(:limit).permit(:limit).merge(core_params) end From 64300e0fe344b9dee015e65423c327742db246af Mon Sep 17 00:00:00 2001 From: Claire Date: Tue, 6 Feb 2024 16:32:09 +0100 Subject: [PATCH 075/211] Fix self-destruct schedule not actually replacing initial schedule (#29049) --- config/initializers/sidekiq.rb | 1 + 1 file changed, 1 insertion(+) diff --git a/config/initializers/sidekiq.rb b/config/initializers/sidekiq.rb index 9a2743ed5b..53b02edc40 100644 --- a/config/initializers/sidekiq.rb +++ b/config/initializers/sidekiq.rb @@ -26,6 +26,7 @@ Sidekiq.configure_server do |config| 'queue' => 'scheduler', }, } + SidekiqScheduler::Scheduler.instance.reload_schedule! end end From 1e0b0a3486cf04666b7cbd67a4a72cf7f8068c97 Mon Sep 17 00:00:00 2001 From: Matt Jankowski Date: Tue, 6 Feb 2024 11:42:25 -0500 Subject: [PATCH 076/211] Use SQL heredoc on long statement lines in migrations (#29112) --- ...0317193015_add_search_index_to_accounts.rb | 12 +++++++- ...5042_add_case_insensitive_index_to_tags.rb | 29 +++++++++++++++++-- ..._fix_canonical_email_blocks_foreign_key.rb | 17 +++++++++-- .../20220309213005_fix_reblog_deleted_at.rb | 11 ++++++- 4 files changed, 62 insertions(+), 7 deletions(-) diff --git a/db/migrate/20170317193015_add_search_index_to_accounts.rb b/db/migrate/20170317193015_add_search_index_to_accounts.rb index e29da61b15..0edc381549 100644 --- a/db/migrate/20170317193015_add_search_index_to_accounts.rb +++ b/db/migrate/20170317193015_add_search_index_to_accounts.rb @@ -2,7 +2,17 @@ class AddSearchIndexToAccounts < ActiveRecord::Migration[5.0] def up - execute 'CREATE INDEX search_index ON accounts USING gin((setweight(to_tsvector(\'simple\', accounts.display_name), \'A\') || setweight(to_tsvector(\'simple\', accounts.username), \'B\') || setweight(to_tsvector(\'simple\', coalesce(accounts.domain, \'\')), \'C\')));' + execute <<~SQL.squish + CREATE INDEX search_index + ON accounts + USING gin( + ( + setweight(to_tsvector('simple', accounts.display_name), 'A') || + setweight(to_tsvector('simple', accounts.username), 'B') || + setweight(to_tsvector('simple', coalesce(accounts.domain, '')), 'C') + ) + ) + SQL end def down diff --git a/db/migrate/20190726175042_add_case_insensitive_index_to_tags.rb b/db/migrate/20190726175042_add_case_insensitive_index_to_tags.rb index f2d3aa8ee8..02f073e14f 100644 --- a/db/migrate/20190726175042_add_case_insensitive_index_to_tags.rb +++ b/db/migrate/20190726175042_add_case_insensitive_index_to_tags.rb @@ -9,9 +9,32 @@ class AddCaseInsensitiveIndexToTags < ActiveRecord::Migration[5.2] redundant_tag_ids = row['ids'].split(',')[1..] safety_assured do - execute "UPDATE accounts_tags AS t0 SET tag_id = #{canonical_tag_id} WHERE tag_id IN (#{redundant_tag_ids.join(', ')}) AND NOT EXISTS (SELECT t1.tag_id FROM accounts_tags AS t1 WHERE t1.tag_id = #{canonical_tag_id} AND t1.account_id = t0.account_id)" - execute "UPDATE statuses_tags AS t0 SET tag_id = #{canonical_tag_id} WHERE tag_id IN (#{redundant_tag_ids.join(', ')}) AND NOT EXISTS (SELECT t1.tag_id FROM statuses_tags AS t1 WHERE t1.tag_id = #{canonical_tag_id} AND t1.status_id = t0.status_id)" - execute "UPDATE featured_tags AS t0 SET tag_id = #{canonical_tag_id} WHERE tag_id IN (#{redundant_tag_ids.join(', ')}) AND NOT EXISTS (SELECT t1.tag_id FROM featured_tags AS t1 WHERE t1.tag_id = #{canonical_tag_id} AND t1.account_id = t0.account_id)" + execute <<~SQL.squish + UPDATE accounts_tags + AS t0 + SET tag_id = #{canonical_tag_id} + WHERE + tag_id IN (#{redundant_tag_ids.join(', ')}) + AND NOT EXISTS (SELECT t1.tag_id FROM accounts_tags AS t1 WHERE t1.tag_id = #{canonical_tag_id} AND t1.account_id = t0.account_id) + SQL + + execute <<~SQL.squish + UPDATE statuses_tags + AS t0 + SET tag_id = #{canonical_tag_id} + WHERE + tag_id IN (#{redundant_tag_ids.join(', ')}) + AND NOT EXISTS (SELECT t1.tag_id FROM statuses_tags AS t1 WHERE t1.tag_id = #{canonical_tag_id} AND t1.status_id = t0.status_id) + SQL + + execute <<~SQL.squish + UPDATE featured_tags + AS t0 + SET tag_id = #{canonical_tag_id} + WHERE + tag_id IN (#{redundant_tag_ids.join(', ')}) + AND NOT EXISTS (SELECT t1.tag_id FROM featured_tags AS t1 WHERE t1.tag_id = #{canonical_tag_id} AND t1.account_id = t0.account_id) + SQL end Tag.where(id: redundant_tag_ids).in_batches.delete_all diff --git a/db/migrate/20210630000137_fix_canonical_email_blocks_foreign_key.rb b/db/migrate/20210630000137_fix_canonical_email_blocks_foreign_key.rb index 9b475966bb..90a1b1a5cf 100644 --- a/db/migrate/20210630000137_fix_canonical_email_blocks_foreign_key.rb +++ b/db/migrate/20210630000137_fix_canonical_email_blocks_foreign_key.rb @@ -3,13 +3,26 @@ class FixCanonicalEmailBlocksForeignKey < ActiveRecord::Migration[6.1] def up safety_assured do - execute 'ALTER TABLE canonical_email_blocks DROP CONSTRAINT fk_rails_1ecb262096, ADD CONSTRAINT fk_rails_1ecb262096 FOREIGN KEY (reference_account_id) REFERENCES accounts(id) ON DELETE CASCADE;' + execute <<~SQL.squish + ALTER TABLE canonical_email_blocks + DROP CONSTRAINT fk_rails_1ecb262096, + ADD CONSTRAINT fk_rails_1ecb262096 + FOREIGN KEY (reference_account_id) + REFERENCES accounts(id) + ON DELETE CASCADE + SQL end end def down safety_assured do - execute 'ALTER TABLE canonical_email_blocks DROP CONSTRAINT fk_rails_1ecb262096, ADD CONSTRAINT fk_rails_1ecb262096 FOREIGN KEY (reference_account_id) REFERENCES accounts(id);' + execute <<~SQL.squish + ALTER TABLE canonical_email_blocks + DROP CONSTRAINT fk_rails_1ecb262096, + ADD CONSTRAINT fk_rails_1ecb262096 + FOREIGN KEY (reference_account_id) + REFERENCES accounts(id) + SQL end end end diff --git a/db/migrate/20220309213005_fix_reblog_deleted_at.rb b/db/migrate/20220309213005_fix_reblog_deleted_at.rb index e3474beeb1..7fb9bff26c 100644 --- a/db/migrate/20220309213005_fix_reblog_deleted_at.rb +++ b/db/migrate/20220309213005_fix_reblog_deleted_at.rb @@ -4,7 +4,16 @@ class FixReblogDeletedAt < ActiveRecord::Migration[6.1] disable_ddl_transaction! def up - safety_assured { execute 'UPDATE statuses s SET deleted_at = r.deleted_at FROM statuses r WHERE s.reblog_of_id = r.id AND r.deleted_at IS NOT NULL' } + safety_assured do + execute <<~SQL.squish + UPDATE statuses s + SET deleted_at = r.deleted_at + FROM statuses r + WHERE + s.reblog_of_id = r.id + AND r.deleted_at IS NOT NULL + SQL + end end def down; end From 7ee93b74317c0b51516146fbe32e72cd9bbb151c Mon Sep 17 00:00:00 2001 From: Claire Date: Tue, 6 Feb 2024 18:10:17 +0100 Subject: [PATCH 077/211] Change `source` attribute of `Suggestion` entity in `/api/v2/suggestions` back to a string (#29108) --- .../components/inline_follow_suggestions.jsx | 8 ++++---- app/models/account_suggestions.rb | 4 ++-- app/models/account_suggestions/suggestion.rb | 2 +- app/serializers/rest/suggestion_serializer.rb | 15 +++++++++++++- spec/requests/api/v2/suggestions_spec.rb | 20 ++++++++++++++++++- .../rest/suggestion_serializer_spec.rb | 2 +- 6 files changed, 41 insertions(+), 10 deletions(-) diff --git a/app/javascript/mastodon/features/home_timeline/components/inline_follow_suggestions.jsx b/app/javascript/mastodon/features/home_timeline/components/inline_follow_suggestions.jsx index ac414d04d6..f76526e045 100644 --- a/app/javascript/mastodon/features/home_timeline/components/inline_follow_suggestions.jsx +++ b/app/javascript/mastodon/features/home_timeline/components/inline_follow_suggestions.jsx @@ -59,7 +59,7 @@ Source.propTypes = { id: PropTypes.oneOf(['friends_of_friends', 'similar_to_recently_followed', 'featured', 'most_followed', 'most_interactions']), }; -const Card = ({ id, source }) => { +const Card = ({ id, sources }) => { const intl = useIntl(); const account = useSelector(state => state.getIn(['accounts', id])); const relationship = useSelector(state => state.getIn(['relationships', id])); @@ -89,7 +89,7 @@ const Card = ({ id, source }) => {
- {firstVerifiedField ? : } + {firstVerifiedField ? : }
diff --git a/app/models/account_suggestions.rb b/app/models/account_suggestions.rb index 25c8b04d50..98ccf4ad4f 100644 --- a/app/models/account_suggestions.rb +++ b/app/models/account_suggestions.rb @@ -31,12 +31,12 @@ class AccountSuggestions account_ids = account_ids_with_sources[offset, limit] accounts_map = Account.where(id: account_ids.map(&:first)).includes(:account_stat, :user).index_by(&:id) - account_ids.filter_map do |(account_id, source)| + account_ids.filter_map do |(account_id, sources)| next unless accounts_map.key?(account_id) AccountSuggestions::Suggestion.new( account: accounts_map[account_id], - source: source + sources: sources ) end end diff --git a/app/models/account_suggestions/suggestion.rb b/app/models/account_suggestions/suggestion.rb index 2c6f4d27f5..8a5888069a 100644 --- a/app/models/account_suggestions/suggestion.rb +++ b/app/models/account_suggestions/suggestion.rb @@ -1,7 +1,7 @@ # frozen_string_literal: true class AccountSuggestions::Suggestion < ActiveModelSerializers::Model - attributes :account, :source + attributes :account, :sources delegate :id, to: :account, prefix: true end diff --git a/app/serializers/rest/suggestion_serializer.rb b/app/serializers/rest/suggestion_serializer.rb index 3d697fd9f1..c60f343ba4 100644 --- a/app/serializers/rest/suggestion_serializer.rb +++ b/app/serializers/rest/suggestion_serializer.rb @@ -1,7 +1,20 @@ # frozen_string_literal: true class REST::SuggestionSerializer < ActiveModel::Serializer - attributes :source + attributes :source, :sources has_one :account, serializer: REST::AccountSerializer + + LEGACY_SOURCE_TYPE_MAP = { + featured: 'staff', + most_followed: 'global', + most_interactions: 'global', + # NOTE: Those are not completely accurate, but those are personalized interactions + similar_to_recently_followed: 'past_interactions', + friends_of_friends: 'past_interactions', + }.freeze + + def source + LEGACY_SOURCE_TYPE_MAP[object.sources.first] + end end diff --git a/spec/requests/api/v2/suggestions_spec.rb b/spec/requests/api/v2/suggestions_spec.rb index 5f1c97b8ae..a7d6a0864f 100644 --- a/spec/requests/api/v2/suggestions_spec.rb +++ b/spec/requests/api/v2/suggestions_spec.rb @@ -9,10 +9,28 @@ describe 'Suggestions API' do let(:headers) { { 'Authorization' => "Bearer #{token.token}" } } describe 'GET /api/v2/suggestions' do - it 'returns http success' do + let(:bob) { Fabricate(:account) } + let(:jeff) { Fabricate(:account) } + let(:params) { {} } + + before do + Setting.bootstrap_timeline_accounts = [bob, jeff].map(&:acct).join(',') + end + + it 'returns the expected suggestions' do get '/api/v2/suggestions', headers: headers expect(response).to have_http_status(200) + + expect(body_as_json).to match_array( + [bob, jeff].map do |account| + hash_including({ + source: 'staff', + sources: ['featured'], + account: hash_including({ id: account.id.to_s }), + }) + end + ) end end end diff --git a/spec/serializers/rest/suggestion_serializer_spec.rb b/spec/serializers/rest/suggestion_serializer_spec.rb index 60420d8023..b5efba082d 100644 --- a/spec/serializers/rest/suggestion_serializer_spec.rb +++ b/spec/serializers/rest/suggestion_serializer_spec.rb @@ -7,7 +7,7 @@ describe REST::SuggestionSerializer do let(:record) do AccountSuggestions::Suggestion.new( account: account, - source: 'SuggestionSource' + sources: ['SuggestionSource'] ) end let(:account) { Fabricate(:account) } From 90ccf7beb2d56f723014b9a05ed20f94c7875e58 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Tue, 6 Feb 2024 19:47:44 +0100 Subject: [PATCH 078/211] New Crowdin Translations (automated) (#28965) Co-authored-by: GitHub Actions --- app/javascript/mastodon/locales/af.json | 25 ++- app/javascript/mastodon/locales/ar.json | 47 +++++- app/javascript/mastodon/locales/ast.json | 6 + app/javascript/mastodon/locales/be.json | 30 +++- app/javascript/mastodon/locales/bg.json | 17 +- app/javascript/mastodon/locales/br.json | 10 +- app/javascript/mastodon/locales/ca.json | 21 ++- app/javascript/mastodon/locales/cs.json | 39 ++++- app/javascript/mastodon/locales/cy.json | 28 +++- app/javascript/mastodon/locales/da.json | 11 +- app/javascript/mastodon/locales/de.json | 12 +- app/javascript/mastodon/locales/el.json | 5 - app/javascript/mastodon/locales/en-GB.json | 30 +++- app/javascript/mastodon/locales/eo.json | 4 - app/javascript/mastodon/locales/es-AR.json | 30 ++-- app/javascript/mastodon/locales/es-MX.json | 12 +- app/javascript/mastodon/locales/es.json | 15 +- app/javascript/mastodon/locales/et.json | 6 - app/javascript/mastodon/locales/eu.json | 16 +- app/javascript/mastodon/locales/fa.json | 6 - app/javascript/mastodon/locales/fi.json | 158 ++++++++++--------- app/javascript/mastodon/locales/fil.json | 84 +++++++++- app/javascript/mastodon/locales/fo.json | 12 +- app/javascript/mastodon/locales/fr-CA.json | 22 ++- app/javascript/mastodon/locales/fr.json | 22 ++- app/javascript/mastodon/locales/fy.json | 28 +++- app/javascript/mastodon/locales/ga.json | 6 + app/javascript/mastodon/locales/gd.json | 43 ++++- app/javascript/mastodon/locales/gl.json | 28 +++- app/javascript/mastodon/locales/he.json | 15 +- app/javascript/mastodon/locales/hi.json | 2 - app/javascript/mastodon/locales/hr.json | 1 - app/javascript/mastodon/locales/hu.json | 30 ++-- app/javascript/mastodon/locales/ia.json | 60 +++++++ app/javascript/mastodon/locales/id.json | 2 - app/javascript/mastodon/locales/ie.json | 6 - app/javascript/mastodon/locales/io.json | 4 - app/javascript/mastodon/locales/is.json | 16 +- app/javascript/mastodon/locales/it.json | 12 +- app/javascript/mastodon/locales/ja.json | 25 ++- app/javascript/mastodon/locales/kab.json | 4 + app/javascript/mastodon/locales/ko.json | 20 +-- app/javascript/mastodon/locales/lad.json | 149 ++++++++++------- app/javascript/mastodon/locales/lt.json | 71 ++++++++- app/javascript/mastodon/locales/lv.json | 4 - app/javascript/mastodon/locales/ms.json | 4 - app/javascript/mastodon/locales/my.json | 4 - app/javascript/mastodon/locales/nl.json | 28 ++-- app/javascript/mastodon/locales/nn.json | 31 ++-- app/javascript/mastodon/locales/no.json | 6 - app/javascript/mastodon/locales/oc.json | 2 - app/javascript/mastodon/locales/pa.json | 30 ++++ app/javascript/mastodon/locales/pl.json | 19 ++- app/javascript/mastodon/locales/pt-BR.json | 12 +- app/javascript/mastodon/locales/pt-PT.json | 12 +- app/javascript/mastodon/locales/ro.json | 1 - app/javascript/mastodon/locales/ru.json | 30 +++- app/javascript/mastodon/locales/si.json | 3 - app/javascript/mastodon/locales/sk.json | 24 ++- app/javascript/mastodon/locales/sl.json | 28 +++- app/javascript/mastodon/locales/sq.json | 12 +- app/javascript/mastodon/locales/sr-Latn.json | 28 +++- app/javascript/mastodon/locales/sr.json | 12 +- app/javascript/mastodon/locales/sv.json | 13 +- app/javascript/mastodon/locales/th.json | 28 +++- app/javascript/mastodon/locales/tr.json | 28 +++- app/javascript/mastodon/locales/uk.json | 29 +++- app/javascript/mastodon/locales/vi.json | 28 +++- app/javascript/mastodon/locales/zh-CN.json | 12 +- app/javascript/mastodon/locales/zh-HK.json | 12 +- app/javascript/mastodon/locales/zh-TW.json | 12 +- config/locales/activerecord.eu.yml | 2 +- config/locales/activerecord.fi.yml | 6 +- config/locales/activerecord.lad.yml | 2 +- config/locales/af.yml | 10 +- config/locales/ar.yml | 102 ++++++++---- config/locales/be.yml | 30 +++- config/locales/bg.yml | 68 ++++---- config/locales/cy.yml | 12 +- config/locales/devise.ar.yml | 11 +- config/locales/devise.be.yml | 9 ++ config/locales/devise.en-GB.yml | 9 ++ config/locales/devise.fi.yml | 48 +++--- config/locales/devise.ga.yml | 14 ++ config/locales/devise.ia.yml | 17 ++ config/locales/devise.lad.yml | 16 +- config/locales/devise.nl.yml | 2 +- config/locales/devise.uk.yml | 9 ++ config/locales/doorkeeper.be.yml | 2 +- config/locales/doorkeeper.ia.yml | 10 ++ config/locales/doorkeeper.lad.yml | 2 +- config/locales/doorkeeper.tr.yml | 10 +- config/locales/en-GB.yml | 17 ++ config/locales/es-MX.yml | 2 +- config/locales/et.yml | 3 + config/locales/eu.yml | 6 +- config/locales/fi.yml | 20 +-- config/locales/fy.yml | 3 + config/locales/gd.yml | 1 + config/locales/hu.yml | 2 +- config/locales/ia.yml | 139 ++++++++++++++++ config/locales/ko.yml | 2 +- config/locales/lad.yml | 80 +++++++--- config/locales/lt.yml | 21 +++ config/locales/nl.yml | 4 +- config/locales/simple_form.af.yml | 2 + config/locales/simple_form.eu.yml | 4 +- config/locales/simple_form.fi.yml | 68 ++++---- config/locales/simple_form.gd.yml | 6 +- config/locales/simple_form.ja.yml | 2 +- config/locales/simple_form.lad.yml | 2 +- config/locales/simple_form.sr-Latn.yml | 2 +- config/locales/simple_form.sr.yml | 2 +- config/locales/simple_form.tr.yml | 12 +- config/locales/sk.yml | 1 + config/locales/sl.yml | 9 ++ config/locales/sr.yml | 4 +- config/locales/th.yml | 11 +- config/locales/tr.yml | 50 +++--- config/locales/uk.yml | 12 +- 120 files changed, 1804 insertions(+), 716 deletions(-) diff --git a/app/javascript/mastodon/locales/af.json b/app/javascript/mastodon/locales/af.json index d2ac2f8f27..baa7e7bf70 100644 --- a/app/javascript/mastodon/locales/af.json +++ b/app/javascript/mastodon/locales/af.json @@ -33,6 +33,7 @@ "account.follows.empty": "Die gebruiker volg nog niemand.", "account.go_to_profile": "Gaan na profiel", "account.hide_reblogs": "Versteek plasings wat deur @{name} aangestuur is", + "account.in_memoriam": "Ter nagedagtenis.", "account.joined_short": "Aangesluit", "account.link_verified_on": "Eienaarskap van hierdie skakel is nagegaan op {date}", "account.locked_info": "Die rekening se privaatheidstatus is gesluit. Die eienaar hersien handmatig wie hom/haar kan volg.", @@ -71,6 +72,7 @@ "bundle_column_error.network.title": "Netwerkfout", "bundle_column_error.retry": "Probeer weer", "bundle_column_error.return": "Keer terug na die tuisblad", + "bundle_column_error.routing.title": "404", "bundle_modal_error.close": "Sluit", "bundle_modal_error.message": "Die laai van die komponent het iewers skeefgeloop.", "bundle_modal_error.retry": "Probeer weer", @@ -149,6 +151,8 @@ "emoji_button.food": "Eet- en drinkgoed", "emoji_button.nature": "Natuur", "emoji_button.not_found": "Geen passende emoji gevind nie", + "emoji_button.objects": "Voorwerpe", + "emoji_button.people": "Mense", "emoji_button.search": "Soek...", "emoji_button.search_results": "Soekresultate", "empty_column.account_timeline": "Geen plasings hier nie!", @@ -161,7 +165,12 @@ "empty_column.lists": "Jy het nog geen lyste nie. Wanneer jy een skep, sal dit hier vertoon.", "empty_column.notifications": "Jy het nog geen kennisgewings nie. Interaksie van ander mense met jou, sal hier vertoon.", "explore.search_results": "Soekresultate", + "explore.suggested_follows": "Mense", + "explore.trending_links": "Nuus", + "filter_modal.added.settings_link": "instellings bladsy", "filter_modal.select_filter.search": "Soek of skep", + "firehose.local": "Hierdie bediener", + "firehose.remote": "Ander bedieners", "footer.about": "Oor", "footer.directory": "Profielgids", "footer.get_app": "Kry die app", @@ -170,14 +179,21 @@ "footer.privacy_policy": "Privaatheidsbeleid", "footer.source_code": "Wys bronkode", "getting_started.heading": "Kom aan die gang", + "hashtag.column_header.tag_mode.all": "en {additional}", + "hashtag.column_header.tag_mode.any": "of {additional}", + "hashtag.column_header.tag_mode.none": "sonder {additional}", "hashtag.column_settings.select.placeholder": "Voer hutsetikette in…", "hashtag.column_settings.tag_toggle": "Voeg meer etikette by hierdie kolom", "hashtag.follow": "Volg hutsetiket", "home.column_settings.show_reblogs": "Wys aangestuurde plasings", "interaction_modal.description.reblog": "Met 'n rekening op Mastodon kan jy hierdie plasing aanstuur om dit met jou volgers te deel.", "interaction_modal.description.reply": "Met 'n rekening op Mastodon kan jy op hierdie plasing reageer.", + "interaction_modal.title.follow": "Volg {name}", "interaction_modal.title.reblog": "Stuur {name} se plasing aan", "interaction_modal.title.reply": "Reageer op {name} se plasing", + "intervals.full.days": "{number, plural, one {# dag} other {# dae}}", + "intervals.full.hours": "{number, plural, one {# uur} other {# uur}}", + "intervals.full.minutes": "{number, plural, one {# minuut} other {# minute}}", "keyboard_shortcuts.back": "Navigeer terug", "keyboard_shortcuts.blocked": "Vertoon lys van geblokkeerde gebruikers", "keyboard_shortcuts.boost": "Stuur aan", @@ -209,8 +225,11 @@ "keyboard_shortcuts.toot": "Begin ’n nuwe plasing", "keyboard_shortcuts.unfocus": "Fokus uit van teksveld/soekveld", "keyboard_shortcuts.up": "Beweeg opwaarts in die lys", + "lightbox.next": "Volgende", + "lightbox.previous": "Vorige", "limited_account_hint.action": "Vertoon profiel in elk geval", "limited_account_hint.title": "Hierdie profiel is deur moderators van {domain} versteek.", + "link_preview.author": "Deur {name}", "lists.account.add": "Voeg by lys", "lists.account.remove": "Verwyder vanaf lys", "lists.delete": "Verwyder lys", @@ -237,6 +256,7 @@ "notification.reblog": "{name} het jou plasing aangestuur", "notifications.column_settings.push": "Stootkennisgewings", "notifications.column_settings.reblog": "Aangestuurde plasings:", + "notifications.column_settings.sound": "Speel klank", "notifications.column_settings.status": "Nuwe plasings:", "notifications.column_settings.unread_notifications.highlight": "Lig ongelese kennisgewings uit", "notifications.filter.boosts": "Aangestuurde plasings", @@ -300,5 +320,8 @@ "upload_form.audio_description": "Describe for people with hearing loss", "upload_form.description": "Describe for the visually impaired", "upload_form.video_description": "Describe for people with hearing loss or visual impairment", - "upload_progress.label": "Uploading…" + "upload_progress.label": "Uploading…", + "video.fullscreen": "Volskerm", + "video.mute": "Klank afskakel", + "video.unmute": "Klank aanskakel" } diff --git a/app/javascript/mastodon/locales/ar.json b/app/javascript/mastodon/locales/ar.json index 5f2d151fae..790a971cdf 100644 --- a/app/javascript/mastodon/locales/ar.json +++ b/app/javascript/mastodon/locales/ar.json @@ -21,6 +21,7 @@ "account.blocked": "محظور", "account.browse_more_on_origin_server": "تصفح المزيد في الملف الشخصي الأصلي", "account.cancel_follow_request": "إلغاء طلب المتابعة", + "account.copy": "نسخ الرابط إلى الملف الشخصي", "account.direct": "إشارة خاصة لـ @{name}", "account.disable_notifications": "توقف عن إشعاري عندما ينشر @{name}", "account.domain_blocked": "اسم النِّطاق محظور", @@ -31,6 +32,7 @@ "account.featured_tags.last_status_never": "لا توجد رسائل", "account.featured_tags.title": "وسوم {name} المميَّزة", "account.follow": "متابعة", + "account.follow_back": "تابعه بدورك", "account.followers": "مُتابِعون", "account.followers.empty": "لا أحدَ يُتابع هذا المُستخدم إلى حد الآن.", "account.followers_counter": "{count, plural, zero{لا مُتابع} one {مُتابعٌ واحِد} two {مُتابعانِ اِثنان} few {{counter} مُتابِعين} many {{counter} مُتابِعًا} other {{counter} مُتابع}}", @@ -51,6 +53,7 @@ "account.mute_notifications_short": "كتم الإشعارات", "account.mute_short": "اكتم", "account.muted": "مَكتوم", + "account.mutual": "متبادل", "account.no_bio": "لم يتم تقديم وصف.", "account.open_original_page": "افتح الصفحة الأصلية", "account.posts": "منشورات", @@ -143,11 +146,19 @@ "compose_form.lock_disclaimer.lock": "مُقفَل", "compose_form.placeholder": "فِيمَ تُفكِّر؟", "compose_form.poll.duration": "مُدَّة اِستطلاع الرأي", + "compose_form.poll.multiple": "متعدد الخيارات", + "compose_form.poll.option_placeholder": "الخيار {number}", + "compose_form.poll.single": "اختر واحدا", "compose_form.poll.switch_to_multiple": "تغيِير الاستطلاع للسماح باِخيارات مُتعدِّدة", "compose_form.poll.switch_to_single": "تغيِير الاستطلاع للسماح باِخيار واحد فقط", + "compose_form.poll.type": "الأسلوب", + "compose_form.publish": "نشر", "compose_form.publish_form": "منشور جديد", + "compose_form.reply": "ردّ", + "compose_form.save_changes": "تحديث", "compose_form.spoiler.marked": "إزالة تحذير المحتوى", "compose_form.spoiler.unmarked": "إضافة تحذير للمحتوى", + "compose_form.spoiler_placeholder": "تحذير المحتوى (اختياري)", "confirmation_modal.cancel": "إلغاء", "confirmations.block.block_and_report": "حظره والإبلاغ عنه", "confirmations.block.confirm": "حظر", @@ -179,6 +190,7 @@ "conversation.mark_as_read": "اعتبرها كمقروءة", "conversation.open": "اعرض المحادثة", "conversation.with": "مع {names}", + "copy_icon_button.copied": "نُسِخ إلى الحافظة", "copypaste.copied": "تم نسخه", "copypaste.copy_to_clipboard": "نسخ إلى الحافظة", "directory.federated": "مِن الفديفرس المعروف", @@ -210,6 +222,7 @@ "emoji_button.search_results": "نتائج البحث", "emoji_button.symbols": "رموز", "emoji_button.travel": "الأماكن والسفر", + "empty_column.account_hides_collections": "اختار هذا المستخدم عدم إتاحة هذه المعلومات للعامة", "empty_column.account_suspended": "حساب معلق", "empty_column.account_timeline": "لا توجد منشورات هنا!", "empty_column.account_unavailable": "الملف التعريفي غير متوفر", @@ -264,6 +277,12 @@ "follow_request.authorize": "ترخيص", "follow_request.reject": "رفض", "follow_requests.unlocked_explanation": "حتى وإن كان حسابك غير مقفل، يعتقد فريق {domain} أنك قد ترغب في مراجعة طلبات المتابعة من هذه الحسابات يدوياً.", + "follow_suggestions.curated_suggestion": "خيار المحرر", + "follow_suggestions.dismiss": "لا تُظهرها مجدّدًا", + "follow_suggestions.personalized_suggestion": "توصية مخصصة", + "follow_suggestions.popular_suggestion": "توصية رائجة", + "follow_suggestions.view_all": "عرض الكل", + "follow_suggestions.who_to_follow": "حسابات للمُتابَعة", "followed_tags": "الوسوم المتابَعة", "footer.about": "عن", "footer.directory": "دليل الصفحات التعريفية", @@ -290,13 +309,9 @@ "hashtag.follow": "اتبع الوسم", "hashtag.unfollow": "ألغِ متابعة الوسم", "hashtags.and_other": "…و {count, plural, zero {} one {# واحد آخر} two {# اثنان آخران} few {# آخرون} many {# آخَرًا}other {# آخرون}}", - "home.actions.go_to_explore": "اطّلع على ما هو رائج حاليا", - "home.actions.go_to_suggestions": "ابحث عن أشخاص لِمُتابعتهم", "home.column_settings.basic": "الأساسية", "home.column_settings.show_reblogs": "اعرض المعاد نشرها", "home.column_settings.show_replies": "اعرض الردود", - "home.explore_prompt.body": "سوف يحتوي خيط أخبارك الرئيسي على مزيج من المنشورات مِنها التي تحتوي على وسوم اخترتَ متابعتها، وأشخاص اخترتَ متابعتهم والمنشورات التي أعادوا نشرها. ومع ذلك، إن لا زال خيط أخبارك يبدو هادئا جدا، ماذا لو:", - "home.explore_prompt.title": "هذه هي صفحتك الرئيسة في ماستدون.", "home.hide_announcements": "إخفاء الإعلانات", "home.pending_critical_update.body": "يرجى تحديث خادم ماستدون في أقرب وقت ممكن!", "home.pending_critical_update.link": "اطّلع على التحديثات", @@ -377,6 +392,7 @@ "lists.search": "إبحث في قائمة الحسابات التي تُتابِعها", "lists.subheading": "قوائمك", "load_pending": "{count, plural, one {# عنصر جديد} other {# عناصر جديدة}}", + "loading_indicator.label": "جاري التحميل…", "media_gallery.toggle_visible": "{number, plural, zero {} one {اخف الصورة} two {اخف الصورتين} few {اخف الصور} many {اخف الصور} other {اخف الصور}}", "moved_to_account_banner.text": "حسابك {disabledAccount} معطل حاليًا لأنك انتقلت إلى {movedToAccount}.", "mute_modal.duration": "المدة", @@ -464,6 +480,17 @@ "onboarding.follows.empty": "نأسف، لا يمكن عرض نتائج في الوقت الحالي. جرب البحث أو انتقل لصفحة الاستكشاف لإيجاد أشخاص للمتابعة، أو حاول مرة أخرى.", "onboarding.follows.lead": "مقتطفات خيطك الرئيس هي الطريقة الأساسية لتجربة ماستدون. كلما زاد عدد الأشخاص الذين تتبعهم، كلما زاد خيط أخبارك نشاطا وإثارة للاهتمام. بداية، إليك بعض الاقتراحات:", "onboarding.follows.title": "أضفِ طابعا شخصيا على موجزات خيطك الرئيس", + "onboarding.profile.discoverable": "اجعل ملفي الشخصي قابلاً للاكتشاف", + "onboarding.profile.discoverable_hint": "عندما تختار تفعيل إمكانية الاكتشاف على ماستدون، قد تظهر منشوراتك في نتائج البحث والمواضيع الرائجة، وقد يتم اقتراح ملفك الشخصي لأشخاص ذوي اهتمامات مماثلة معك.", + "onboarding.profile.display_name": "الاسم العلني", + "onboarding.profile.display_name_hint": "اسمك الكامل أو اسمك المرح…", + "onboarding.profile.lead": "يمكنك دائمًا إكمال ذلك لاحقًا في الإعدادات، حيث يتوفر المزيد من خيارات التخصيص.", + "onboarding.profile.note": "نبذة عنك", + "onboarding.profile.note_hint": "يمكنك @ذِكر أشخاص آخرين أو استعمال #الوسوم…", + "onboarding.profile.save_and_continue": "حفظ و إستمرار", + "onboarding.profile.title": "إعداد الملف الشخصي", + "onboarding.profile.upload_avatar": "تحميل صورة الملف الشخصي", + "onboarding.profile.upload_header": "تحميل رأسية الملف الشخصي", "onboarding.share.lead": "اسمح للأشخاص بمعرفة إمكانية الوصول إليك على ماستدون!", "onboarding.share.message": "أنا {username} في #Mastodon! تعال لمتابعتي على {url}", "onboarding.share.next_steps": "الخطوات المحتملة التالية:", @@ -497,9 +524,18 @@ "poll_button.add_poll": "إضافة استطلاع للرأي", "poll_button.remove_poll": "إزالة استطلاع الرأي", "privacy.change": "اضبط خصوصية المنشور", + "privacy.direct.long": "كل من ذُكر في المنشور", + "privacy.direct.short": "أشخاص محددون", + "privacy.private.long": "متابعيك فقط", + "privacy.private.short": "للمتابِعين", + "privacy.public.long": "أي شخص على أو خارج ماستدون", "privacy.public.short": "للعامة", + "privacy.unlisted.additional": "هذا يتصرف بالضبط مثل النشر للعامة، باستثناء أن المنشور لن يظهر في الموجزات الحية أو في الوسوم أو في الإستكشاف، أو في نتائج بحث ماستدون، حتى وإن قمت بتفعيله على مستوى الحساب.", + "privacy.unlisted.long": "خوارزميات أقل", + "privacy.unlisted.short": "للعامة دون صخب", "privacy_policy.last_updated": "آخر تحديث {date}", "privacy_policy.title": "سياسة الخصوصية", + "recommended": "موصى به", "refresh": "أنعِش", "regeneration_indicator.label": "جارٍ التحميل…", "regeneration_indicator.sublabel": "جارٍ تجهيز موجزات خيطك الرئيس!", @@ -514,7 +550,9 @@ "relative_time.minutes": "{number}د", "relative_time.seconds": "{number}ثا", "relative_time.today": "اليوم", + "reply_indicator.attachments": "{count, plural, zero {}one {# مرفق} two {# المرفقات} few {# مرفقات} many {# مرفقات} other {# مرفقًا}}", "reply_indicator.cancel": "إلغاء", + "reply_indicator.poll": "استطلاع رأي", "report.block": "حظر", "report.block_explanation": "لن ترى منشوراته ولن يمكنه متابعتك أو رؤية منشوراتك، سيكون بديهيا له أنه مكتوم.", "report.categories.legal": "إشعارات قانونية", @@ -570,6 +608,7 @@ "search.quick_action.status_search": "المنشورات المطابقة لـ {x}", "search.search_or_paste": "ابحث أو أدخل رابطا تشعبيا URL", "search_popout.full_text_search_disabled_message": "غير متوفر على {domain}.", + "search_popout.full_text_search_logged_out_message": "متاح فقط عند تسجيل الدخول.", "search_popout.language_code": "رمز لغة ISO", "search_popout.options": "خيارات البحث", "search_popout.quick_actions": "الإجراءات السريعة", diff --git a/app/javascript/mastodon/locales/ast.json b/app/javascript/mastodon/locales/ast.json index 479c9c9243..18bba99117 100644 --- a/app/javascript/mastodon/locales/ast.json +++ b/app/javascript/mastodon/locales/ast.json @@ -199,6 +199,12 @@ "follow_request.authorize": "Autorizar", "follow_request.reject": "Refugar", "follow_requests.unlocked_explanation": "Magar que la to cuenta nun seya privada, el personal del dominiu «{domain}» pensó qu'a lo meyor quies revisar manualmente les solicitúes de siguimientu d'estes cuentes.", + "follow_suggestions.curated_suggestion": "Escoyeta del sirvidor", + "follow_suggestions.dismiss": "Nun volver amosar", + "follow_suggestions.personalized_suggestion": "Suxerencia personalizada", + "follow_suggestions.popular_suggestion": "Suxerencia popular", + "follow_suggestions.view_all": "Ver too", + "follow_suggestions.who_to_follow": "A quién siguir", "footer.about": "Tocante a", "footer.directory": "Direutoriu de perfiles", "footer.get_app": "Consiguir l'aplicación", diff --git a/app/javascript/mastodon/locales/be.json b/app/javascript/mastodon/locales/be.json index e069515109..daff6563e8 100644 --- a/app/javascript/mastodon/locales/be.json +++ b/app/javascript/mastodon/locales/be.json @@ -146,11 +146,19 @@ "compose_form.lock_disclaimer.lock": "закрыты", "compose_form.placeholder": "Што здарылася?", "compose_form.poll.duration": "Працягласць апытання", + "compose_form.poll.multiple": "Множны выбар", + "compose_form.poll.option_placeholder": "Варыянт {number}", + "compose_form.poll.single": "Адзін варыянт", "compose_form.poll.switch_to_multiple": "Змяніце апытанне, каб дазволіць некалькі варыянтаў адказу", "compose_form.poll.switch_to_single": "Змяніце апытанне, каб дазволіць адзіны варыянт адказу", + "compose_form.poll.type": "Стыль", + "compose_form.publish": "Допіс", "compose_form.publish_form": "Апублікаваць", + "compose_form.reply": "Адказаць", + "compose_form.save_changes": "Абнавіць", "compose_form.spoiler.marked": "Выдаліць папярэджанне аб змесціве", "compose_form.spoiler.unmarked": "Дадаць папярэджанне аб змесціве", + "compose_form.spoiler_placeholder": "Папярэджанне аб змесціве (неабавязкова)", "confirmation_modal.cancel": "Скасаваць", "confirmations.block.block_and_report": "Заблакіраваць і паскардзіцца", "confirmations.block.confirm": "Заблакіраваць", @@ -269,6 +277,12 @@ "follow_request.authorize": "Аўтарызацыя", "follow_request.reject": "Адхіліць", "follow_requests.unlocked_explanation": "Ваш акаўнт не схаваны, аднак прадстаўнікі {domain} палічылі, што вы можаце захацець праглядзець запыты на падпіску з гэтых профіляў уручную.", + "follow_suggestions.curated_suggestion": "Выбар сервера", + "follow_suggestions.dismiss": "Не паказваць зноў", + "follow_suggestions.personalized_suggestion": "Персаналізаваная прапанова", + "follow_suggestions.popular_suggestion": "Папулярная прапанова", + "follow_suggestions.view_all": "Праглядзець усё", + "follow_suggestions.who_to_follow": "На каго падпісацца", "followed_tags": "Падпіскі", "footer.about": "Пра нас", "footer.directory": "Дырэкторыя профіляў", @@ -295,13 +309,9 @@ "hashtag.follow": "Падпісацца на хэштэг", "hashtag.unfollow": "Адпісацца ад хэштэга", "hashtags.and_other": "…і яшчэ {count, plural, other {#}}", - "home.actions.go_to_explore": "Паглядзіце, што ў трэндзе", - "home.actions.go_to_suggestions": "Знайсці людзей, каб падпісацца", "home.column_settings.basic": "Асноўныя", "home.column_settings.show_reblogs": "Паказаць пашырэнні", "home.column_settings.show_replies": "Паказваць адказы", - "home.explore_prompt.body": "Ваша галоўная стужка змяшчае сумесь допісаў з хэштэгамі, за якімі вы вырашылі сачыць, допісаў ад людзей, за якімі вы вырашылі сачыць, і допісаў, якія яны пашыраюць. Зараз усё выглядае даволі ціха, так што як наконт:", - "home.explore_prompt.title": "Гэта ваша апорная кропка ў Mastodon.", "home.hide_announcements": "Схаваць аб'явы", "home.pending_critical_update.body": "Калі ласка, абнавіце свой сервер Mastodon як мага хутчэй!", "home.pending_critical_update.link": "Прагледзець абнаўленні", @@ -514,7 +524,15 @@ "poll_button.add_poll": "Дадаць апытанне", "poll_button.remove_poll": "Выдаліць апытанне", "privacy.change": "Змяніць прыватнасць допісу", + "privacy.direct.long": "Усе згаданыя ў допісе", + "privacy.direct.short": "Канкрэтныя людзі", + "privacy.private.long": "Толькі вашыя падпісчыкі", + "privacy.private.short": "Падпісчыкі", + "privacy.public.long": "Усе, хто ёсць і каго няма ў Mastodon", "privacy.public.short": "Публічны", + "privacy.unlisted.additional": "Паводзіць сябе гэтак жа, як і публічны, за выключэннем таго, што пост не будзе адлюстроўвацца ў жывой стужцы, хэштэгах, аглядзе або ў пошуку Mastodon, нават калі вы ўключылі бачнасць у пошуку ў наладах.", + "privacy.unlisted.long": "Менш фанфар ад алгарытмаў", + "privacy.unlisted.short": "Ціхі публічны", "privacy_policy.last_updated": "Адноўлена {date}", "privacy_policy.title": "Палітыка канфідэнцыйнасці", "recommended": "Рэкамендуем", @@ -532,7 +550,9 @@ "relative_time.minutes": "{number} хв", "relative_time.seconds": "{number} с", "relative_time.today": "сёння", + "reply_indicator.attachments": "{count, plural, one {# далучэнне} few {# далучэнні} many {# далучэнняў} other {# далучэння}}", "reply_indicator.cancel": "Скасаваць", + "reply_indicator.poll": "Апытанне", "report.block": "Заблакіраваць", "report.block_explanation": "Вы перастанеце бачыць допісы гэтага карыстальніка. Ён не зможа сачыць за вамі і бачыць вашы допісы. Ён зможа зразумець, што яго заблакіравалі.", "report.categories.legal": "Права", @@ -664,7 +684,7 @@ "status.show_more": "Паказаць болей", "status.show_more_all": "Разгарнуць усё", "status.show_original": "Паказаць арыгінал", - "status.title.with_attachments": "{user} апублікаваў {attachmentCount, plural, one {укладанне} other {{attachmentCount} укладанні}}", + "status.title.with_attachments": "{user} апублікаваў {attachmentCount, plural, one {далучэнне} few {{attachmentCount} далучэнні} many {{attachmentCount} далучэнняў} other {{attachmentCount} далучэння}}", "status.translate": "Перакласці", "status.translated_from_with": "Перакладзена з {lang} з дапамогай {provider}", "status.uncached_media_warning": "Перадпрагляд недаступны", diff --git a/app/javascript/mastodon/locales/bg.json b/app/javascript/mastodon/locales/bg.json index 213ac090a7..99c0f8b102 100644 --- a/app/javascript/mastodon/locales/bg.json +++ b/app/javascript/mastodon/locales/bg.json @@ -8,7 +8,7 @@ "about.domain_blocks.silenced.title": "Ограничено", "about.domain_blocks.suspended.explanation": "Никакви данни от този сървър няма да се обработват, съхраняват или обменят, правещи невъзможно всяко взаимодействие или комуникация с потребители от тези сървъри.", "about.domain_blocks.suspended.title": "Спряно", - "about.not_available": "Тази информация не е била направена налична на този сървър.", + "about.not_available": "Тази информация не е публична на този сървър.", "about.powered_by": "Децентрализирана социална мрежа, захранвана от {mastodon}", "about.rules": "Правила на сървъра", "account.account_note_header": "Бележка", @@ -145,11 +145,9 @@ "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.multiple": "Множествен избор", "compose_form.poll.option_placeholder": "Избор {number}", - "compose_form.poll.remove_option": "Премахване на тази възможност", "compose_form.poll.single": "Подберете нещо", "compose_form.poll.switch_to_multiple": "Промяна на анкетата, за да се позволят множество възможни избора", "compose_form.poll.switch_to_single": "Промяна на анкетата, за да се позволи един възможен избор", @@ -224,7 +222,7 @@ "emoji_button.search_results": "Резултати от търсене", "emoji_button.symbols": "Символи", "emoji_button.travel": "Пътуване и места", - "empty_column.account_hides_collections": "Този потребител е избрал да не прави това сведение достъпно", + "empty_column.account_hides_collections": "Този потребител е избрал да не дава тази информация", "empty_column.account_suspended": "Спрян акаунт", "empty_column.account_timeline": "Тук няма публикации!", "empty_column.account_unavailable": "Профилът не е наличен", @@ -279,6 +277,12 @@ "follow_request.authorize": "Упълномощаване", "follow_request.reject": "Отхвърляне", "follow_requests.unlocked_explanation": "Въпреки че акаунтът ви не е заключен, служителите на {domain} помислиха, че може да искате да преглеждате ръчно заявките за последване на тези профили.", + "follow_suggestions.curated_suggestion": "Избор от редакторите", + "follow_suggestions.dismiss": "Без ново показване", + "follow_suggestions.personalized_suggestion": "Персонализирано предложение", + "follow_suggestions.popular_suggestion": "Популярно предложение", + "follow_suggestions.view_all": "Преглед на всички", + "follow_suggestions.who_to_follow": "Кого да се следва", "followed_tags": "Последвани хаштагове", "footer.about": "Относно", "footer.directory": "Директория на профилите", @@ -305,13 +309,9 @@ "hashtag.follow": "Следване на хаштаг", "hashtag.unfollow": "Спиране на следване на хаштаг", "hashtags.and_other": "…и {count, plural, other {# още}}", - "home.actions.go_to_explore": "Вижте какво изгрява", - "home.actions.go_to_suggestions": "Намиране на хора за следване", "home.column_settings.basic": "Основно", "home.column_settings.show_reblogs": "Показване на подсилванията", "home.column_settings.show_replies": "Показване на отговорите", - "home.explore_prompt.body": "Вашият начален инфоканал ще е смес на публикации от хаштаговете, които сте избрали да следвате, избраните хора да следвате, а и публикациите, които са подсилили. Ако изглежда твърде тихо в момента, то може да искате да:", - "home.explore_prompt.title": "Това е началната ви база с Mastodon.", "home.hide_announcements": "Скриване на оповестяванията", "home.pending_critical_update.body": "Обновете сървъра си в Mastodon възможно най-скоро!", "home.pending_critical_update.link": "Преглед на обновяванията", @@ -530,6 +530,7 @@ "privacy.private.short": "Последователи", "privacy.public.long": "Всеки във и извън Mastodon", "privacy.public.short": "Публично", + "privacy.unlisted.additional": "Това поведение е точно като публичното, с изключение на това, че публикацията няма да се появява в каналите на живо, хаштаговете, проучването или търсенето в Mastodon, дори ако сте се включили в целия акаунт.", "privacy.unlisted.long": "По-малко алгоритмични фанфари", "privacy.unlisted.short": "Тиха публика", "privacy_policy.last_updated": "Последно осъвременяване на {date}", diff --git a/app/javascript/mastodon/locales/br.json b/app/javascript/mastodon/locales/br.json index 5e83ab4e6d..8cbe4591d5 100644 --- a/app/javascript/mastodon/locales/br.json +++ b/app/javascript/mastodon/locales/br.json @@ -143,9 +143,14 @@ "compose_form.lock_disclaimer.lock": "prennet", "compose_form.placeholder": "Petra emaoc'h o soñjal e-barzh ?", "compose_form.poll.duration": "Pad ar sontadeg", + "compose_form.poll.single": "Dibabit unan", "compose_form.poll.switch_to_multiple": "Kemmañ ar sontadeg evit aotren meur a zibab", "compose_form.poll.switch_to_single": "Kemmañ ar sontadeg evit aotren un dibab hepken", + "compose_form.poll.type": "Neuz", + "compose_form.publish": "Embann", "compose_form.publish_form": "Embann", + "compose_form.reply": "Respont", + "compose_form.save_changes": "Hizivadur", "compose_form.spoiler.marked": "Kuzhet eo an destenn a-dreñv ur c'hemenn", "compose_form.spoiler.unmarked": "N'eo ket kuzhet an destenn", "confirmation_modal.cancel": "Nullañ", @@ -280,12 +285,9 @@ "hashtag.follow": "Heuliañ ar ger-klik", "hashtag.unfollow": "Paouez heuliañ an hashtag", "hashtags.and_other": "…{count, plural, one {hag # all} other {ha # all}}", - "home.actions.go_to_explore": "Gwelet petra zo diouzh ar c'hiz", - "home.actions.go_to_suggestions": "Kavout tud da heuliañ", "home.column_settings.basic": "Diazez", "home.column_settings.show_reblogs": "Diskouez ar skignadennoù", "home.column_settings.show_replies": "Diskouez ar respontoù", - "home.explore_prompt.title": "Homañ eo ho pajenn degemer e-barzh Mastodon.", "home.hide_announcements": "Kuzhat ar c'hemennoù", "home.pending_critical_update.body": "Hizivait ho servijer Mastodon kerkent ha ma c'hallit mar plij!", "home.pending_critical_update.link": "Gwelet an hizivadennoù", @@ -475,6 +477,7 @@ "poll_button.add_poll": "Ouzhpennañ ur sontadeg", "poll_button.remove_poll": "Dilemel ar sontadeg", "privacy.change": "Cheñch prevezded an toud", + "privacy.private.short": "Heulierien", "privacy.public.short": "Publik", "privacy_policy.last_updated": "Hizivadenn ziwezhañ {date}", "privacy_policy.title": "Reolennoù Prevezded", @@ -494,6 +497,7 @@ "relative_time.seconds": "{number}eil", "relative_time.today": "hiziv", "reply_indicator.cancel": "Nullañ", + "reply_indicator.poll": "Sontadeg", "report.block": "Stankañ", "report.block_explanation": "Ne vo ket gwelet toudoù ar gont-se ken. Ne welo ket ho toudoù ha ne c'hello ket ho heuliañ ken. Gouzout a raio eo bet stanket ganeoc'h.", "report.categories.legal": "Lezennel", diff --git a/app/javascript/mastodon/locales/ca.json b/app/javascript/mastodon/locales/ca.json index 0d089bf8b8..0ae471e023 100644 --- a/app/javascript/mastodon/locales/ca.json +++ b/app/javascript/mastodon/locales/ca.json @@ -145,18 +145,16 @@ "compose_form.lock_disclaimer": "El teu compte no està {locked}. Tothom pot seguir-te i veure els tuts de només per a seguidors.", "compose_form.lock_disclaimer.lock": "blocat", "compose_form.placeholder": "Què tens al cap?", - "compose_form.poll.add_option": "Afegiu una opció", "compose_form.poll.duration": "Durada de l'enquesta", "compose_form.poll.multiple": "Opcions múltiples", "compose_form.poll.option_placeholder": "Opció {number}", - "compose_form.poll.remove_option": "Treu aquesta opció", "compose_form.poll.single": "Trieu-ne una", "compose_form.poll.switch_to_multiple": "Canvia l’enquesta per a permetre múltiples opcions", "compose_form.poll.switch_to_single": "Canvia l’enquesta per a permetre una única opció", "compose_form.poll.type": "Estil", "compose_form.publish": "Publica", "compose_form.publish_form": "Nou tut", - "compose_form.reply": "Responeu", + "compose_form.reply": "Respon", "compose_form.save_changes": "Actualitza", "compose_form.spoiler.marked": "Elimina l'avís de contingut", "compose_form.spoiler.unmarked": "Afegeix avís de contingut", @@ -279,6 +277,12 @@ "follow_request.authorize": "Autoritza", "follow_request.reject": "Rebutja", "follow_requests.unlocked_explanation": "Tot i que el teu compte no està blocat, el personal de {domain} ha pensat que és possible que vulguis revisar manualment les sol·licituds de seguiment d’aquests comptes.", + "follow_suggestions.curated_suggestion": "Tria de l'editor", + "follow_suggestions.dismiss": "No ho tornis a mostrar", + "follow_suggestions.personalized_suggestion": "Suggeriment personalitzat", + "follow_suggestions.popular_suggestion": "Suggeriment popular", + "follow_suggestions.view_all": "Mostra-ho tot", + "follow_suggestions.who_to_follow": "A qui seguir", "followed_tags": "Etiquetes seguides", "footer.about": "Quant a", "footer.directory": "Directori de perfils", @@ -305,13 +309,9 @@ "hashtag.follow": "Segueix l'etiqueta", "hashtag.unfollow": "Deixa de seguir l'etiqueta", "hashtags.and_other": "…i {count, plural, other {# més}}", - "home.actions.go_to_explore": "Mira què és tendència", - "home.actions.go_to_suggestions": "Troba persones a seguir", "home.column_settings.basic": "Bàsic", "home.column_settings.show_reblogs": "Mostra els impulsos", "home.column_settings.show_replies": "Mostra les respostes", - "home.explore_prompt.body": "La teva línia de temps Inici tindrà una barreja dels tuts de les etiquetes que has triat seguir, de les persones que has triat seguir i dels tuts que s'impulsen. Ara mateix es veu força tranquil·la, què et sembla si:", - "home.explore_prompt.title": "Aquesta és la teva base inicial a Mastodon.", "home.hide_announcements": "Amaga els anuncis", "home.pending_critical_update.body": "Si us plau actualitza el teu servidor Mastodon tant aviat com sigui possible!", "home.pending_critical_update.link": "Veure actualitzacions", @@ -524,12 +524,15 @@ "poll_button.add_poll": "Afegeix una enquesta", "poll_button.remove_poll": "Elimina l'enquesta", "privacy.change": "Canvia la privacitat del tut", - "privacy.direct.long": "Tothom mencionat en aquesta publicació", + "privacy.direct.long": "Tothom mencionat a la publicació", "privacy.direct.short": "Persones concretes", "privacy.private.long": "Només els vostres seguidors", "privacy.private.short": "Seguidors", "privacy.public.long": "Tothom dins o fora Mastodon", "privacy.public.short": "Públic", + "privacy.unlisted.additional": "Es comporta igual que públic, excepte que la publicació no apareixerà als canals en directe o etiquetes, l'explora o a la cerca de Mastodon, fins i tot si ho heu activat a nivell de compte.", + "privacy.unlisted.long": "Menys fanfàrries algorísmiques", + "privacy.unlisted.short": "Públic tranquil", "privacy_policy.last_updated": "Darrera actualització {date}", "privacy_policy.title": "Política de Privacitat", "recommended": "Recomanat", @@ -547,7 +550,9 @@ "relative_time.minutes": "{number}min", "relative_time.seconds": "{number}s", "relative_time.today": "avui", + "reply_indicator.attachments": "{count, plural, one {# adjunt} other {# adjunts}}", "reply_indicator.cancel": "Cancel·la", + "reply_indicator.poll": "Enquesta", "report.block": "Bloca", "report.block_explanation": "No veuràs els seus tuts. Ells no podran veure els teus tuts ni et podran seguir. Podran saber que estan blocats.", "report.categories.legal": "Legal", diff --git a/app/javascript/mastodon/locales/cs.json b/app/javascript/mastodon/locales/cs.json index 7d91670de0..24248db15c 100644 --- a/app/javascript/mastodon/locales/cs.json +++ b/app/javascript/mastodon/locales/cs.json @@ -32,6 +32,7 @@ "account.featured_tags.last_status_never": "Žádné příspěvky", "account.featured_tags.title": "Hlavní hashtagy uživatele {name}", "account.follow": "Sledovat", + "account.follow_back": "Také sledovat", "account.followers": "Sledující", "account.followers.empty": "Tohoto uživatele zatím nikdo nesleduje.", "account.followers_counter": "{count, plural, one {{counter} Sledující} few {{counter} Sledující} many {{counter} Sledujících} other {{counter} Sledujících}}", @@ -52,6 +53,7 @@ "account.mute_notifications_short": "Ztlumit upozornění", "account.mute_short": "Ztlumit", "account.muted": "Skrytý", + "account.mutual": "Vzájemné", "account.no_bio": "Nebyl poskytnut žádný popis.", "account.open_original_page": "Otevřít původní stránku", "account.posts": "Příspěvky", @@ -144,11 +146,19 @@ "compose_form.lock_disclaimer.lock": "zamčený", "compose_form.placeholder": "Co se vám honí hlavou?", "compose_form.poll.duration": "Doba trvání ankety", + "compose_form.poll.multiple": "Výběr z více možností", + "compose_form.poll.option_placeholder": "Volba {number}", + "compose_form.poll.single": "Vyber jednu", "compose_form.poll.switch_to_multiple": "Povolit u ankety výběr více voleb", "compose_form.poll.switch_to_single": "Povolit u ankety výběr pouze jedné volby", + "compose_form.poll.type": "Styl", + "compose_form.publish": "Odeslat", "compose_form.publish_form": "Zveřejnit", + "compose_form.reply": "Odpovědět", + "compose_form.save_changes": "Aktualizovat", "compose_form.spoiler.marked": "Odebrat varování o obsahu", "compose_form.spoiler.unmarked": "Přidat varování o obsahu", + "compose_form.spoiler_placeholder": "Upozornění na obsah (nepovinné)", "confirmation_modal.cancel": "Zrušit", "confirmations.block.block_and_report": "Blokovat a nahlásit", "confirmations.block.confirm": "Blokovat", @@ -267,6 +277,9 @@ "follow_request.authorize": "Autorizovat", "follow_request.reject": "Zamítnout", "follow_requests.unlocked_explanation": "Přestože váš účet není zamčený, administrátor {domain} usoudil, že byste mohli chtít tyto žádosti o sledování zkontrolovat ručně.", + "follow_suggestions.dismiss": "Znovu nezobrazovat", + "follow_suggestions.popular_suggestion": "Populární návrh", + "follow_suggestions.who_to_follow": "Koho sledovat", "followed_tags": "Sledované hashtagy", "footer.about": "O aplikaci", "footer.directory": "Adresář profilů", @@ -289,13 +302,9 @@ "hashtag.column_settings.tag_toggle": "Zahrnout v tomto sloupci další štítky", "hashtag.follow": "Sledovat hashtag", "hashtag.unfollow": "Přestat sledovat hashtag", - "home.actions.go_to_explore": "Podívejte se, co frčí", - "home.actions.go_to_suggestions": "Najít lidi ke sledování", "home.column_settings.basic": "Základní", "home.column_settings.show_reblogs": "Zobrazit boosty", "home.column_settings.show_replies": "Zobrazit odpovědi", - "home.explore_prompt.body": "Váš domovský kanál bude obsahovat směs příspěvků z hashtagů, které jste se rozhodli sledovat, lidí, které jste se rozhodli sledovat, a příspěvků, které boostují. Pokud vám to připadá příliš klidné, možná budete chtít:", - "home.explore_prompt.title": "Toto je vaše domovská základna uvnitř Mastodonu.", "home.hide_announcements": "Skrýt oznámení", "home.pending_critical_update.body": "Aktualizujte, prosím, svůj Mastodon server co nejdříve!", "home.pending_critical_update.link": "Zobrazit aktualizace", @@ -376,6 +385,7 @@ "lists.search": "Hledejte mezi lidmi, které sledujete", "lists.subheading": "Vaše seznamy", "load_pending": "{count, plural, one {# nová položka} few {# nové položky} many {# nových položek} other {# nových položek}}", + "loading_indicator.label": "Načítání…", "media_gallery.toggle_visible": "{number, plural, one {Skrýt obrázek} few {Skrýt obrázky} many {Skrýt obrázky} other {Skrýt obrázky}}", "moved_to_account_banner.text": "Váš účet {disabledAccount} je momentálně deaktivován, protože jste se přesunul/a na {movedToAccount}.", "mute_modal.duration": "Trvání", @@ -463,6 +473,17 @@ "onboarding.follows.empty": "Bohužel, žádné výsledky nelze momentálně zobrazit. Můžete zkusit vyhledat nebo procházet stránku s průzkumem a najít lidi, kteří budou sledovat, nebo to zkuste znovu později.", "onboarding.follows.lead": "You curate your own home feed. The more people you follow, the more active and interesting it will be. These profiles may be a good starting point—you can always unfollow them later!", "onboarding.follows.title": "Populární na Mastodonu", + "onboarding.profile.discoverable": "Udělat svůj profil vyhledatelným", + "onboarding.profile.discoverable_hint": "Když se rozhodnete být vyhledatelný na Mastodonu, vaše příspěvky se mohou objevit ve výsledcích vyhledávání a v populárních, a váš profil může být navrhován lidem s podobnými zájmy.", + "onboarding.profile.display_name": "Zobrazované jméno", + "onboarding.profile.display_name_hint": "Vaše celé jméno nebo přezdívka…", + "onboarding.profile.lead": "Toto můžete vždy dokončit později v nastavení, kde je k dispozici ještě více možností přizpůsobení.", + "onboarding.profile.note": "O vás", + "onboarding.profile.note_hint": "Můžete @zmínit jiné osoby nebo #hashtagy…", + "onboarding.profile.save_and_continue": "Uložit a pokračovat", + "onboarding.profile.title": "Nastavení profilu", + "onboarding.profile.upload_avatar": "Nahrát profilový obrázek", + "onboarding.profile.upload_header": "Nahrát hlavičku profilu", "onboarding.share.lead": "Dejte lidem vědět, jak vás mohou najít na Mastodonu!", "onboarding.share.message": "Jsem {username} na #Mastodonu! Pojď mě sledovat na {url}", "onboarding.share.next_steps": "Možné další kroky:", @@ -496,9 +517,17 @@ "poll_button.add_poll": "Přidat anketu", "poll_button.remove_poll": "Odebrat anketu", "privacy.change": "Změnit soukromí příspěvku", + "privacy.direct.long": "Všichni zmínění v příspěvku", + "privacy.direct.short": "Vybraní lidé", + "privacy.private.long": "Jen vaši sledující", + "privacy.private.short": "Sledující", + "privacy.public.long": "Kdokoliv na Mastodonu i mimo něj", "privacy.public.short": "Veřejné", + "privacy.unlisted.additional": "Chová se stejně jako veřejný, až na to, že se příspěvek neobjeví v živých kanálech nebo hashtazích, v objevování nebo vyhledávání na Mastodonu, a to i když je účet nastaven tak, aby se zde všude tyto příspěvky zobrazovaly.", + "privacy.unlisted.long": "Méně algoritmických fanfár", "privacy_policy.last_updated": "Naposledy aktualizováno {date}", "privacy_policy.title": "Zásady ochrany osobních údajů", + "recommended": "Doporučeno", "refresh": "Obnovit", "regeneration_indicator.label": "Načítání…", "regeneration_indicator.sublabel": "Váš domovský kanál se připravuje!", @@ -514,6 +543,7 @@ "relative_time.seconds": "{number} s", "relative_time.today": "dnes", "reply_indicator.cancel": "Zrušit", + "reply_indicator.poll": "Anketa", "report.block": "Blokovat", "report.block_explanation": "Neuvidíte příspěvky tohoto uživatele. On neuvidí vaše příspěvky, ani vás nebude moci sledovat. Pozná, že je blokován.", "report.categories.legal": "Právní ustanovení", @@ -569,6 +599,7 @@ "search.quick_action.status_search": "Příspěvky odpovídající {x}", "search.search_or_paste": "Hledat nebo vložit URL", "search_popout.full_text_search_disabled_message": "Nedostupné na {domain}.", + "search_popout.full_text_search_logged_out_message": "Dostupné pouze po přihlášení.", "search_popout.language_code": "Kód jazyka podle ISO", "search_popout.options": "Možnosti hledání", "search_popout.quick_actions": "Rychlé akce", diff --git a/app/javascript/mastodon/locales/cy.json b/app/javascript/mastodon/locales/cy.json index 3cd090e186..f023c5a2a7 100644 --- a/app/javascript/mastodon/locales/cy.json +++ b/app/javascript/mastodon/locales/cy.json @@ -146,11 +146,19 @@ "compose_form.lock_disclaimer.lock": "wedi ei gloi", "compose_form.placeholder": "Beth sydd ar eich meddwl?", "compose_form.poll.duration": "Cyfnod pleidlais", + "compose_form.poll.multiple": "Dewis lluosog", + "compose_form.poll.option_placeholder": "Dewis {number}", + "compose_form.poll.single": "Ddewis un", "compose_form.poll.switch_to_multiple": "Newid pleidlais i adael mwy nag un dewis", "compose_form.poll.switch_to_single": "Newid pleidlais i gyfyngu i un dewis", + "compose_form.poll.type": "Arddull", + "compose_form.publish": "Postiad", "compose_form.publish_form": "Cyhoeddi", + "compose_form.reply": "Ateb", + "compose_form.save_changes": "Diweddariad", "compose_form.spoiler.marked": "Dileu rhybudd cynnwys", "compose_form.spoiler.unmarked": "Ychwanegu rhybudd cynnwys", + "compose_form.spoiler_placeholder": "Rhybudd cynnwys (dewisol)", "confirmation_modal.cancel": "Diddymu", "confirmations.block.block_and_report": "Rhwystro ac Adrodd", "confirmations.block.confirm": "Blocio", @@ -269,6 +277,12 @@ "follow_request.authorize": "Awdurdodi", "follow_request.reject": "Gwrthod", "follow_requests.unlocked_explanation": "Er nid yw eich cyfrif wedi'i gloi, roedd y staff {domain} yn meddwl efallai hoffech adolygu ceisiadau dilyn o'r cyfrifau rhain wrth law.", + "follow_suggestions.curated_suggestion": "Dewis y Golygydd", + "follow_suggestions.dismiss": "Peidio â dangos hwn eto", + "follow_suggestions.personalized_suggestion": "Awgrym personol", + "follow_suggestions.popular_suggestion": "Awgrym poblogaidd", + "follow_suggestions.view_all": "Gweld y cyfan", + "follow_suggestions.who_to_follow": "Pwy i ddilyn", "followed_tags": "Hashnodau rydych yn eu dilyn", "footer.about": "Ynghylch", "footer.directory": "Cyfeiriadur proffiliau", @@ -295,13 +309,9 @@ "hashtag.follow": "Dilyn hashnod", "hashtag.unfollow": "Dad-ddilyn hashnod", "hashtags.and_other": "…a {count, plural, other {# more}}", - "home.actions.go_to_explore": "Gweld beth yw'r tuedd", - "home.actions.go_to_suggestions": "Ffeindio pobl i'w dilyn", "home.column_settings.basic": "Syml", "home.column_settings.show_reblogs": "Dangos hybiau", "home.column_settings.show_replies": "Dangos atebion", - "home.explore_prompt.body": "Bydd eich llif cartref yn cynnwys cymysgedd o bostiadau o'r hashnodau rydych chi wedi dewis eu dilyn, y bobl rydych chi wedi dewis eu dilyn, a'r postiadau maen nhw'n rhoi hwb iddyn nhw. Os yw hynny'n teimlo'n rhy dawel, efallai y byddwch eisiau:", - "home.explore_prompt.title": "Dyma'ch cartref o fewn Mastodon.", "home.hide_announcements": "Cuddio cyhoeddiadau", "home.pending_critical_update.body": "Diweddarwch eich gweinydd Mastodon cyn gynted â phosibl!", "home.pending_critical_update.link": "Gweld y diweddariadau", @@ -514,7 +524,15 @@ "poll_button.add_poll": "Ychwanegu pleidlais", "poll_button.remove_poll": "Tynnu pleidlais", "privacy.change": "Addasu preifatrwdd y post", + "privacy.direct.long": "Pawb sydd â son amdanyn nhw yn y postiad", + "privacy.direct.short": "Pobl benodol", + "privacy.private.long": "Eich dilynwyr yn unig", + "privacy.private.short": "Dilynwyr", + "privacy.public.long": "Unrhyw ar ac oddi ar Mastodon", "privacy.public.short": "Cyhoeddus", + "privacy.unlisted.additional": "Mae hwn yn ymddwyn yn union fel y cyhoeddus, ac eithrio na fydd y postiad yn ymddangos mewn ffrydiau byw neu hashnodau, archwilio, neu chwiliad Mastodon, hyd yn oed os ydych wedi eich cynnwys ar draws y cyfrif.", + "privacy.unlisted.long": "Llai o ddathliadau algorithmig", + "privacy.unlisted.short": "Tewi'r cyhoeddus", "privacy_policy.last_updated": "Diweddarwyd ddiwethaf ar {date}", "privacy_policy.title": "Polisi Preifatrwydd", "recommended": "Argymhellwyd", @@ -532,7 +550,9 @@ "relative_time.minutes": "{number} munud", "relative_time.seconds": "{number} eiliad", "relative_time.today": "heddiw", + "reply_indicator.attachments": "{count, plural, one {# attachment} arall {# attachments}}", "reply_indicator.cancel": "Canslo", + "reply_indicator.poll": "Arolwg", "report.block": "Blocio", "report.block_explanation": "Ni welwch chi eu postiadau. Ni allan nhw weld eich postiadau na'ch dilyn. Byddan nhw'n gallu gweld eu bod nhw wedi'u rhwystro.", "report.categories.legal": "Cyfreithiol", diff --git a/app/javascript/mastodon/locales/da.json b/app/javascript/mastodon/locales/da.json index 5d6cac69d8..548421b3c0 100644 --- a/app/javascript/mastodon/locales/da.json +++ b/app/javascript/mastodon/locales/da.json @@ -145,11 +145,9 @@ "compose_form.lock_disclaimer": "Din konto er ikke {locked}. Enhver kan følge dig og se indlæg kun beregnet for følgere.", "compose_form.lock_disclaimer.lock": "låst", "compose_form.placeholder": "Hvad tænker du på?", - "compose_form.poll.add_option": "Tilføj mulighed", "compose_form.poll.duration": "Afstemningens varighed", "compose_form.poll.multiple": "Multivalg", "compose_form.poll.option_placeholder": "Valgmulighed {number}", - "compose_form.poll.remove_option": "Fjern denne valgmulighed", "compose_form.poll.single": "Vælg én", "compose_form.poll.switch_to_multiple": "Ændr afstemning til flervalgstype", "compose_form.poll.switch_to_single": "Ændr afstemning til enkeltvalgstype", @@ -279,6 +277,11 @@ "follow_request.authorize": "Godkend", "follow_request.reject": "Afvis", "follow_requests.unlocked_explanation": "Selvom din konto ikke er låst, synes {domain}-personalet, du måske bør gennemgå disse anmodninger manuelt.", + "follow_suggestions.dismiss": "Vis ikke igen", + "follow_suggestions.personalized_suggestion": "Personligt forslag", + "follow_suggestions.popular_suggestion": "Populært forslag", + "follow_suggestions.view_all": "Vis alle", + "follow_suggestions.who_to_follow": "Hvem, som skal følges", "followed_tags": "Hashtag, som følges", "footer.about": "Om", "footer.directory": "Profiloversigt", @@ -305,13 +308,9 @@ "hashtag.follow": "Følg hashtag", "hashtag.unfollow": "Stop med at følge hashtag", "hashtags.and_other": "…og {count, plural, one {}other {# flere}}", - "home.actions.go_to_explore": "Se, hvad som trender", - "home.actions.go_to_suggestions": "Find nogle personer at følge", "home.column_settings.basic": "Grundlæggende", "home.column_settings.show_reblogs": "Vis boosts", "home.column_settings.show_replies": "Vis svar", - "home.explore_prompt.body": "Dit hjemmefeed vil have en blanding af indlæg fra de hashtags, du har valgt at følge, de personer, du har valgt at følge, og de indlæg, de booster. Hvis her virker for stille, kan du prøve:", - "home.explore_prompt.title": "Dette er din hjemmebase i Mastodon.", "home.hide_announcements": "Skjul bekendtgørelser", "home.pending_critical_update.body": "Opdater din Mastodon-server snarest muligt!", "home.pending_critical_update.link": "Se opdateringer", diff --git a/app/javascript/mastodon/locales/de.json b/app/javascript/mastodon/locales/de.json index a6dd098bb2..cb90252c7f 100644 --- a/app/javascript/mastodon/locales/de.json +++ b/app/javascript/mastodon/locales/de.json @@ -145,11 +145,9 @@ "compose_form.lock_disclaimer": "Dein Profil ist nicht {locked}. Andere können dir folgen und deine Beiträge sehen, die nur für Follower bestimmt sind.", "compose_form.lock_disclaimer.lock": "geschützt", "compose_form.placeholder": "Was gibt’s Neues?", - "compose_form.poll.add_option": "Auswahl hinzufügen", "compose_form.poll.duration": "Umfragedauer", "compose_form.poll.multiple": "Mehrfachauswahl", "compose_form.poll.option_placeholder": "{number}. Auswahlmöglichkeit", - "compose_form.poll.remove_option": "Dieses Auswahlfeld entfernen", "compose_form.poll.single": "Einfachauswahl", "compose_form.poll.switch_to_multiple": "Mehrfachauswahl erlauben", "compose_form.poll.switch_to_single": "Nur Einfachauswahl erlauben", @@ -279,6 +277,12 @@ "follow_request.authorize": "Genehmigen", "follow_request.reject": "Ablehnen", "follow_requests.unlocked_explanation": "Auch wenn dein Konto öffentlich bzw. nicht geschützt ist, haben die Moderator*innen von {domain} gedacht, dass du diesen Follower lieber manuell bestätigen solltest.", + "follow_suggestions.curated_suggestion": "Vom Server empfohlen", + "follow_suggestions.dismiss": "Nicht mehr anzeigen", + "follow_suggestions.personalized_suggestion": "Personalisierte Empfehlung", + "follow_suggestions.popular_suggestion": "Beliebte Empfehlung", + "follow_suggestions.view_all": "Alle anzeigen", + "follow_suggestions.who_to_follow": "Empfohlene Profile", "followed_tags": "Gefolgte Hashtags", "footer.about": "Über", "footer.directory": "Profilverzeichnis", @@ -305,13 +309,9 @@ "hashtag.follow": "Hashtag folgen", "hashtag.unfollow": "Hashtag entfolgen", "hashtags.and_other": "… und {count, plural, one{# weiterer} other {# weitere}}", - "home.actions.go_to_explore": "Trends ansehen", - "home.actions.go_to_suggestions": "Profile zum Folgen finden", "home.column_settings.basic": "Allgemein", "home.column_settings.show_reblogs": "Geteilte Beiträge anzeigen", "home.column_settings.show_replies": "Antworten anzeigen", - "home.explore_prompt.body": "Deine Startseite wird eine Mischung aus Beiträgen mit Hashtags und den Profilen, denen du folgst sowie den Beiträgen, die sie teilen, enthalten. Sollte es sich zu still anfühlen:", - "home.explore_prompt.title": "Das ist dein Zuhause bei Mastodon.", "home.hide_announcements": "Ankündigungen ausblenden", "home.pending_critical_update.body": "Bitte aktualisiere deinen Mastodon-Server so schnell wie möglich!", "home.pending_critical_update.link": "Updates ansehen", diff --git a/app/javascript/mastodon/locales/el.json b/app/javascript/mastodon/locales/el.json index 068d228906..a5ed320831 100644 --- a/app/javascript/mastodon/locales/el.json +++ b/app/javascript/mastodon/locales/el.json @@ -140,11 +140,9 @@ "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.multiple": "Πολλαπλή επιλογή", "compose_form.poll.option_placeholder": "Επιλογή {number}", - "compose_form.poll.remove_option": "Αφαίρεση επιλογής", "compose_form.poll.switch_to_multiple": "Ενημέρωση δημοσκόπησης με πολλαπλές επιλογές", "compose_form.poll.switch_to_single": "Ενημέρωση δημοσκόπησης με μοναδική επιλογή", "compose_form.poll.type": "Στυλ", @@ -291,12 +289,9 @@ "hashtag.column_settings.tag_toggle": "Προσθήκη επιπλέον ταμπελών για την κολώνα", "hashtag.follow": "Παρακολούθηση ετικέτας", "hashtag.unfollow": "Διακοπή παρακολούθησης ετικέτας", - "home.actions.go_to_suggestions": "Βρείτε άτομα για να ακολουθήσετε", "home.column_settings.basic": "Βασικές ρυθμίσεις", "home.column_settings.show_reblogs": "Εμφάνιση προωθήσεων", "home.column_settings.show_replies": "Εμφάνιση απαντήσεων", - "home.explore_prompt.body": "Your home feed will have a mix of posts from the hashtags you've chosen to follow, the people you've chosen to follow, and the posts they boost. If that feels too quiet, you may want to:\nΗ τροφοδοσία της αρχικής σελίδας σας είναι ένα μίγμα από αναρτήσεις με τις ετικέτες και τα άτομα που επιλέξατε να ακολουθείτε, και τις αναρτήσεις που προωθούν. Εάν αυτό σας φαίνεται πολύ ήσυχο, μπορεί να θέλετε:", - "home.explore_prompt.title": "Αυτό είναι το σπίτι σας στο Mastodon.", "home.hide_announcements": "Απόκρυψη ανακοινώσεων", "home.pending_critical_update.link": "Δείτε ενημερώσεις", "home.pending_critical_update.title": "Κρίσιμη ενημέρωση ασφαλείας διαθέσιμη!", diff --git a/app/javascript/mastodon/locales/en-GB.json b/app/javascript/mastodon/locales/en-GB.json index 2cf1b4dbae..3431d95cb6 100644 --- a/app/javascript/mastodon/locales/en-GB.json +++ b/app/javascript/mastodon/locales/en-GB.json @@ -32,6 +32,7 @@ "account.featured_tags.last_status_never": "No posts", "account.featured_tags.title": "{name}'s featured hashtags", "account.follow": "Follow", + "account.follow_back": "Follow back", "account.followers": "Followers", "account.followers.empty": "No one follows this user yet.", "account.followers_counter": "{count, plural, one {{counter} Follower} other {{counter} Followers}}", @@ -52,6 +53,7 @@ "account.mute_notifications_short": "Mute notifications", "account.mute_short": "Mute", "account.muted": "Muted", + "account.mutual": "Mutual", "account.no_bio": "No description provided.", "account.open_original_page": "Open original page", "account.posts": "Posts", @@ -144,11 +146,19 @@ "compose_form.lock_disclaimer.lock": "locked", "compose_form.placeholder": "What's on your mind?", "compose_form.poll.duration": "Poll duration", + "compose_form.poll.multiple": "Multiple choice", + "compose_form.poll.option_placeholder": "Option {number}", + "compose_form.poll.single": "Pick one", "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.type": "Style", + "compose_form.publish": "Post", "compose_form.publish_form": "New post", + "compose_form.reply": "Reply", + "compose_form.save_changes": "Update", "compose_form.spoiler.marked": "Remove content warning", "compose_form.spoiler.unmarked": "Add content warning", + "compose_form.spoiler_placeholder": "Content warning (optional)", "confirmation_modal.cancel": "Cancel", "confirmations.block.block_and_report": "Block & Report", "confirmations.block.confirm": "Block", @@ -267,6 +277,12 @@ "follow_request.authorize": "Authorise", "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.", + "follow_suggestions.curated_suggestion": "Editors' Choice", + "follow_suggestions.dismiss": "Don't show again", + "follow_suggestions.personalized_suggestion": "Personalised suggestion", + "follow_suggestions.popular_suggestion": "Popular suggestion", + "follow_suggestions.view_all": "View all", + "follow_suggestions.who_to_follow": "Who to follow", "followed_tags": "Followed hashtags", "footer.about": "About", "footer.directory": "Profiles directory", @@ -293,13 +309,9 @@ "hashtag.follow": "Follow hashtag", "hashtag.unfollow": "Unfollow hashtag", "hashtags.and_other": "…and {count, plural, one {}other {# more}}", - "home.actions.go_to_explore": "See what's trending", - "home.actions.go_to_suggestions": "Find people to follow", "home.column_settings.basic": "Basic", "home.column_settings.show_reblogs": "Show boosts", "home.column_settings.show_replies": "Show replies", - "home.explore_prompt.body": "Your home feed will have a mix of posts from the hashtags you've chosen to follow, the people you've chosen to follow, and the posts they boost. If that feels too quiet, you may want to:", - "home.explore_prompt.title": "This is your home base within Mastodon.", "home.hide_announcements": "Hide announcements", "home.pending_critical_update.body": "Please update your Mastodon server as soon as possible!", "home.pending_critical_update.link": "See updates", @@ -512,7 +524,15 @@ "poll_button.add_poll": "Add a poll", "poll_button.remove_poll": "Remove poll", "privacy.change": "Change post privacy", + "privacy.direct.long": "Everyone mentioned in the post", + "privacy.direct.short": "Specific people", + "privacy.private.long": "Only your followers", + "privacy.private.short": "Followers", + "privacy.public.long": "Anyone on and off Mastodon", "privacy.public.short": "Public", + "privacy.unlisted.additional": "This behaves exactly like public, except the post will not appear in live feeds or hashtags, explore, or Mastodon search, even if you are opted-in account-wide.", + "privacy.unlisted.long": "Fewer algorithmic fanfares", + "privacy.unlisted.short": "Quiet public", "privacy_policy.last_updated": "Last updated {date}", "privacy_policy.title": "Privacy Policy", "recommended": "Recommended", @@ -530,7 +550,9 @@ "relative_time.minutes": "{number}m", "relative_time.seconds": "{number}s", "relative_time.today": "today", + "reply_indicator.attachments": "{count, plural, one {# attachment} other {# attachments}}", "reply_indicator.cancel": "Cancel", + "reply_indicator.poll": "Poll", "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.legal": "Legal", diff --git a/app/javascript/mastodon/locales/eo.json b/app/javascript/mastodon/locales/eo.json index 907a918af0..887d754a40 100644 --- a/app/javascript/mastodon/locales/eo.json +++ b/app/javascript/mastodon/locales/eo.json @@ -295,13 +295,9 @@ "hashtag.follow": "Sekvi la kradvorton", "hashtag.unfollow": "Ne plu sekvi la kradvorton", "hashtags.and_other": "…kaj {count, plural,other {# pli}}", - "home.actions.go_to_explore": "Vidi kio populariĝas", - "home.actions.go_to_suggestions": "Trovi homojn por sekvi", "home.column_settings.basic": "Bazaj agordoj", "home.column_settings.show_reblogs": "Montri diskonigojn", "home.column_settings.show_replies": "Montri respondojn", - "home.explore_prompt.body": "Via hejmafiŝaro havos miksitajn afiŝojn de kradvortoj kiujn vi elektis sekvi, personoj kiujn vi elektis sekvi, kaj afiŝoj kiujn ili suprenigis.", - "home.explore_prompt.title": "Ĉi tio estas via hejma paĝo en Mastodon.", "home.hide_announcements": "Kaŝi la anoncojn", "home.pending_critical_update.body": "Ĝisdatigu vian servilon de Mastodon kiel eble plej baldau!", "home.pending_critical_update.link": "Vidi ĝisdatigojn", diff --git a/app/javascript/mastodon/locales/es-AR.json b/app/javascript/mastodon/locales/es-AR.json index 8816f18af6..87ab62cda2 100644 --- a/app/javascript/mastodon/locales/es-AR.json +++ b/app/javascript/mastodon/locales/es-AR.json @@ -146,14 +146,13 @@ "compose_form.lock_disclaimer.lock": "privada", "compose_form.placeholder": "¿Qué onda?", "compose_form.poll.duration": "Duración de la encuesta", - "compose_form.poll.multiple": "Selección múltiple", + "compose_form.poll.multiple": "Múltiples opciones", "compose_form.poll.option_placeholder": "Opción {number}", - "compose_form.poll.remove_option": "Quitar esta opción", - "compose_form.poll.single": "Elige uno", + "compose_form.poll.single": "Elegí una", "compose_form.poll.switch_to_multiple": "Cambiar encuesta para permitir opciones múltiples", "compose_form.poll.switch_to_single": "Cambiar encuesta para permitir una sola opción", "compose_form.poll.type": "Estilo", - "compose_form.publish": "Publicar", + "compose_form.publish": "Enviar", "compose_form.publish_form": "Nuevo mensaje", "compose_form.reply": "Responder", "compose_form.save_changes": "Actualizar", @@ -278,6 +277,12 @@ "follow_request.authorize": "Autorizar", "follow_request.reject": "Rechazar", "follow_requests.unlocked_explanation": "A pesar de que tu cuenta no es privada, el equipo de {domain} pensó que podrías querer revisar manualmente las solicitudes de seguimiento de estas cuentas.", + "follow_suggestions.curated_suggestion": "Cuentas elegidas del servidor", + "follow_suggestions.dismiss": "No mostrar de nuevo", + "follow_suggestions.personalized_suggestion": "Sugerencia personalizada", + "follow_suggestions.popular_suggestion": "Sugerencia popular", + "follow_suggestions.view_all": "Ver todo", + "follow_suggestions.who_to_follow": "A quién seguir", "followed_tags": "Etiquetas seguidas", "footer.about": "Información", "footer.directory": "Directorio de perfiles", @@ -304,13 +309,9 @@ "hashtag.follow": "Seguir etiqueta", "hashtag.unfollow": "Dejar de seguir etiqueta", "hashtags.and_other": "…y {count, plural, other {# más}}", - "home.actions.go_to_explore": "Ver qué está en tendencia", - "home.actions.go_to_suggestions": "Encontrar cuentas para seguir", "home.column_settings.basic": "Básico", "home.column_settings.show_reblogs": "Mostrar adhesiones", "home.column_settings.show_replies": "Mostrar respuestas", - "home.explore_prompt.body": "Tu línea temporal principal tendrá una mezcla de mensajes de etiquetas que hayás decidido seguir, cuentas que hayás seguido y mensajes a los que éstas adhieran. Si está muy tranquilo por acá, quizás quieras:", - "home.explore_prompt.title": "Este es tu inicio en Mastodon.", "home.hide_announcements": "Ocultar anuncios", "home.pending_critical_update.body": "Por favor, ¡actualizá tu servidor de Mastodon lo antes posible!", "home.pending_critical_update.link": "Ver actualizaciones", @@ -523,10 +524,15 @@ "poll_button.add_poll": "Agregar encuesta", "poll_button.remove_poll": "Quitar encuesta", "privacy.change": "Configurar privacidad del mensaje", - "privacy.direct.short": "Personas específicas", + "privacy.direct.long": "Todas las cuentas mencionadas en el mensaje", + "privacy.direct.short": "Cuentas específicas", "privacy.private.long": "Solo tus seguidores", "privacy.private.short": "Seguidores", + "privacy.public.long": "Cualquier persona dentro y fuera de Mastodon", "privacy.public.short": "Público", + "privacy.unlisted.additional": "Esto se comporta exactamente igual que con la configuración de privacidad de mensaje \"Público\", excepto que el mensaje no aparecerá en los líneas temporales en vivo, ni en las etiquetas, ni en la línea temporal \"Explorá\", ni en la búsqueda de Mastodon; incluso si optaste por hacer tu cuenta visible.", + "privacy.unlisted.long": "Menos fanfarrias algorítmicas", + "privacy.unlisted.short": "Público silencioso", "privacy_policy.last_updated": "Última actualización: {date}", "privacy_policy.title": "Política de privacidad", "recommended": "Opción recomendada", @@ -544,7 +550,9 @@ "relative_time.minutes": "{number}m", "relative_time.seconds": "{number}s", "relative_time.today": "hoy", + "reply_indicator.attachments": "{count, plural,one {# adjunto} other {# adjuntos}}", "reply_indicator.cancel": "Cancelar", + "reply_indicator.poll": "Encuesta", "report.block": "Bloquear", "report.block_explanation": "No verás sus mensajes. No podrán ver tus mensajes ni seguirte. Se van a dar cuentra de que están bloqueados.", "report.categories.legal": "Legales", @@ -644,8 +652,8 @@ "status.filter": "Filtrar este mensaje", "status.filtered": "Filtrado", "status.hide": "Ocultar mensaje", - "status.history.created": "Creado por {name} el {date}", - "status.history.edited": "Editado por {name} el {date}", + "status.history.created": "Creado por {name}, {date}", + "status.history.edited": "Editado por {name}, {date}", "status.load_more": "Cargar más", "status.media.open": "Clic para abrir", "status.media.show": "Clic para mostrar", diff --git a/app/javascript/mastodon/locales/es-MX.json b/app/javascript/mastodon/locales/es-MX.json index fdc57ac6d6..95b87b26dd 100644 --- a/app/javascript/mastodon/locales/es-MX.json +++ b/app/javascript/mastodon/locales/es-MX.json @@ -145,11 +145,9 @@ "compose_form.lock_disclaimer": "Tu cuenta no está bloqueada. Todos pueden seguirte para ver tus toots solo para seguidores.", "compose_form.lock_disclaimer.lock": "bloqueado", "compose_form.placeholder": "¿En qué estás pensando?", - "compose_form.poll.add_option": "Agregar opción", "compose_form.poll.duration": "Duración de la encuesta", "compose_form.poll.multiple": "Selección múltiple", "compose_form.poll.option_placeholder": "Opción {number}", - "compose_form.poll.remove_option": "Eliminar esta opción", "compose_form.poll.single": "Seleccione uno", "compose_form.poll.switch_to_multiple": "Modificar encuesta para permitir múltiples opciones", "compose_form.poll.switch_to_single": "Modificar encuesta para permitir una única opción", @@ -279,6 +277,12 @@ "follow_request.authorize": "Autorizar", "follow_request.reject": "Rechazar", "follow_requests.unlocked_explanation": "A pesar de que tu cuenta no es privada, el personal de {domain} ha pensado que quizás deberías revisar manualmente las solicitudes de seguimiento de estas cuentas.", + "follow_suggestions.curated_suggestion": "Recomendaciones del equipo", + "follow_suggestions.dismiss": "No mostrar de nuevo", + "follow_suggestions.personalized_suggestion": "Sugerencia personalizada", + "follow_suggestions.popular_suggestion": "Sugerencia popular", + "follow_suggestions.view_all": "Ver todo", + "follow_suggestions.who_to_follow": "A quién seguir", "followed_tags": "Hashtags seguidos", "footer.about": "Acerca de", "footer.directory": "Directorio de perfiles", @@ -305,13 +309,9 @@ "hashtag.follow": "Seguir etiqueta", "hashtag.unfollow": "Dejar de seguir etiqueta", "hashtags.and_other": "…y {count, plural, other {# más}}", - "home.actions.go_to_explore": "Ver tendencias", - "home.actions.go_to_suggestions": "Encuentra gente a la que seguir", "home.column_settings.basic": "Básico", "home.column_settings.show_reblogs": "Mostrar retoots", "home.column_settings.show_replies": "Mostrar respuestas", - "home.explore_prompt.body": "Tu cronología de inicio tendrá una mezcla de publicaciones de los hashtags que has escogido seguir, las personas que has decidido seguir y las publicaciones que impulsen. Si crees que está demasiado tranquila, quizás quieras:", - "home.explore_prompt.title": "Este es tu punto de partida en Mastodon.", "home.hide_announcements": "Ocultar anuncios", "home.pending_critical_update.body": "¡Por favor actualiza tu servidor Mastodon lo antes posible!", "home.pending_critical_update.link": "Ver actualizaciones", diff --git a/app/javascript/mastodon/locales/es.json b/app/javascript/mastodon/locales/es.json index 2e4ea93177..d5e8f4239e 100644 --- a/app/javascript/mastodon/locales/es.json +++ b/app/javascript/mastodon/locales/es.json @@ -148,7 +148,6 @@ "compose_form.poll.duration": "Duración de la encuesta", "compose_form.poll.multiple": "Selección múltiple", "compose_form.poll.option_placeholder": "Opción {number}", - "compose_form.poll.remove_option": "Quitar esta opción", "compose_form.poll.single": "Elige uno", "compose_form.poll.switch_to_multiple": "Modificar encuesta para permitir múltiples opciones", "compose_form.poll.switch_to_single": "Modificar encuesta para permitir una única opción", @@ -278,6 +277,12 @@ "follow_request.authorize": "Autorizar", "follow_request.reject": "Rechazar", "follow_requests.unlocked_explanation": "A pesar de que tu cuenta no es privada, el personal de {domain} ha pensado que quizás deberías revisar manualmente las solicitudes de seguimiento de estas cuentas.", + "follow_suggestions.curated_suggestion": "Recomendaciones del equipo", + "follow_suggestions.dismiss": "No mostrar de nuevo", + "follow_suggestions.personalized_suggestion": "Sugerencia personalizada", + "follow_suggestions.popular_suggestion": "Sugerencia popular", + "follow_suggestions.view_all": "Ver todo", + "follow_suggestions.who_to_follow": "A quién seguir", "followed_tags": "Etiquetas seguidas", "footer.about": "Acerca de", "footer.directory": "Directorio de perfiles", @@ -304,13 +309,9 @@ "hashtag.follow": "Seguir etiqueta", "hashtag.unfollow": "Dejar de seguir etiqueta", "hashtags.and_other": "…y {count, plural, other {# más}}", - "home.actions.go_to_explore": "Ver tendencias", - "home.actions.go_to_suggestions": "Encuentra personas a las que seguir", "home.column_settings.basic": "Básico", "home.column_settings.show_reblogs": "Mostrar impulsos", "home.column_settings.show_replies": "Mostrar respuestas", - "home.explore_prompt.body": "Tu cronología de inicio tendrá una mezcla de publicaciones de las etiquetas que has escogido seguir, las personas que has decidido seguir y las publicaciones que impulsen. Si crees que está demasiado tranquila, quizás quieras:", - "home.explore_prompt.title": "Este es tu punto de partida en Mastodon.", "home.hide_announcements": "Ocultar anuncios", "home.pending_critical_update.body": "Por favor, ¡actualiza tu servidor Mastodon lo antes posible!", "home.pending_critical_update.link": "Ver actualizaciones", @@ -523,10 +524,13 @@ "poll_button.add_poll": "Añadir una encuesta", "poll_button.remove_poll": "Eliminar encuesta", "privacy.change": "Ajustar privacidad", + "privacy.direct.long": "Todos los mencionados en el post", "privacy.direct.short": "Personas específicas", "privacy.private.long": "Solo tus seguidores", "privacy.private.short": "Seguidores", + "privacy.public.long": "Cualquiera dentro y fuera de Mastodon", "privacy.public.short": "Público", + "privacy.unlisted.short": "Público tranquilo", "privacy_policy.last_updated": "Actualizado por última vez {date}", "privacy_policy.title": "Política de Privacidad", "recommended": "Recomendado", @@ -545,6 +549,7 @@ "relative_time.seconds": "{number} s", "relative_time.today": "hoy", "reply_indicator.cancel": "Cancelar", + "reply_indicator.poll": "Encuesta", "report.block": "Bloquear", "report.block_explanation": "No verás sus publicaciones. No podrán ver tus publicaciones ni seguirte. Podrán saber que están bloqueados.", "report.categories.legal": "Legal", diff --git a/app/javascript/mastodon/locales/et.json b/app/javascript/mastodon/locales/et.json index 5034c25541..be8bec616d 100644 --- a/app/javascript/mastodon/locales/et.json +++ b/app/javascript/mastodon/locales/et.json @@ -145,11 +145,9 @@ "compose_form.lock_disclaimer": "Su konto ei ole {locked}. Igaüks saab sind jälgida, et näha su ainult-jälgijatele postitusi.", "compose_form.lock_disclaimer.lock": "lukus", "compose_form.placeholder": "Millest mõtled?", - "compose_form.poll.add_option": "Lisa valik", "compose_form.poll.duration": "Küsitluse kestus", "compose_form.poll.multiple": "Valikvastustega", "compose_form.poll.option_placeholder": "Valik {number}", - "compose_form.poll.remove_option": "Eemalda see valik", "compose_form.poll.single": "Vali üks", "compose_form.poll.switch_to_multiple": "Muuda küsitlust mitmikvaliku lubamiseks", "compose_form.poll.switch_to_single": "Muuda küsitlust ainult ühe valiku lubamiseks", @@ -305,13 +303,9 @@ "hashtag.follow": "Jälgi silti", "hashtag.unfollow": "Lõpeta sildi jälgimine", "hashtags.and_other": "…ja {count, plural, one {}other {# veel}}", - "home.actions.go_to_explore": "Vaata, mis on populaarne", - "home.actions.go_to_suggestions": "Leia inimesi, keda jälgida", "home.column_settings.basic": "Peamine", "home.column_settings.show_reblogs": "Näita jagamisi", "home.column_settings.show_replies": "Näita vastuseid", - "home.explore_prompt.body": "Sinu koduvoos on koos jälgimiseks valitud siltidega postitused, sinu jälgitavate inimeste postitused ja postitused, mida nad jagavad. Kui see tundub liiga vaikne, võid sa soovida:", - "home.explore_prompt.title": "See on sinu kodubaas Mastodonis.", "home.hide_announcements": "Peida teadaanded", "home.pending_critical_update.body": "Palun uuenda oma Mastodoni server nii ruttu kui võimalik!", "home.pending_critical_update.link": "Vaata uuendusi", diff --git a/app/javascript/mastodon/locales/eu.json b/app/javascript/mastodon/locales/eu.json index cee18e7a51..e80e7fcf46 100644 --- a/app/javascript/mastodon/locales/eu.json +++ b/app/javascript/mastodon/locales/eu.json @@ -132,7 +132,7 @@ "column_header.unpin": "Desfinkatu", "column_subheading.settings": "Ezarpenak", "community.column_settings.local_only": "Lokala soilik", - "community.column_settings.media_only": "Multimedia besterik ez", + "community.column_settings.media_only": "Edukiak soilik", "community.column_settings.remote_only": "Urrunekoa soilik", "compose.language.change": "Aldatu hizkuntza", "compose.language.search": "Bilatu hizkuntzak...", @@ -145,11 +145,9 @@ "compose_form.lock_disclaimer": "Zure kontua ez dago {locked}. Edonork jarraitu zaitzake zure jarraitzaileentzako soilik diren bidalketak ikusteko.", "compose_form.lock_disclaimer.lock": "giltzapetuta", "compose_form.placeholder": "Zer duzu buruan?", - "compose_form.poll.add_option": "Gehitu aukera", "compose_form.poll.duration": "Inkestaren iraupena", "compose_form.poll.multiple": "Aukera aniza", "compose_form.poll.option_placeholder": "{number}. aukera", - "compose_form.poll.remove_option": "Kendu aukera hau", "compose_form.poll.single": "Hautatu bat", "compose_form.poll.switch_to_multiple": "Aldatu inkesta hainbat aukera onartzeko", "compose_form.poll.switch_to_single": "Aldatu inkesta aukera bakarra onartzeko", @@ -279,6 +277,12 @@ "follow_request.authorize": "Baimendu", "follow_request.reject": "Ukatu", "follow_requests.unlocked_explanation": "Zure kontua blokeatuta ez badago ere, {domain} domeinuko arduradunek uste dute kontu hauetako jarraipen eskaerak agian eskuz begiratu nahiko dituzula.", + "follow_suggestions.curated_suggestion": "Zerbitzariaren iradokizunak", + "follow_suggestions.dismiss": "Ez erakutsi berriro", + "follow_suggestions.personalized_suggestion": "Iradokizun pertsonalizatua", + "follow_suggestions.popular_suggestion": "Iradokizun ezaguna", + "follow_suggestions.view_all": "Ikusi denak", + "follow_suggestions.who_to_follow": "Zein jarraitu", "followed_tags": "Jarraitutako traolak", "footer.about": "Honi buruz", "footer.directory": "Profil-direktorioa", @@ -305,13 +309,9 @@ "hashtag.follow": "Jarraitu traolari", "hashtag.unfollow": "Utzi traola jarraitzeari", "hashtags.and_other": "…eta {count, plural, one {}other {# gehiago}}", - "home.actions.go_to_explore": "Ikusi zer dagoen pil-pilean", - "home.actions.go_to_suggestions": "Aurkitu jendea jarraitzeko", "home.column_settings.basic": "Oinarrizkoa", "home.column_settings.show_reblogs": "Erakutsi bultzadak", "home.column_settings.show_replies": "Erakutsi erantzunak", - "home.explore_prompt.body": "Zure hasierako jarioak jarraitzeko aukeratu dituzun traolen, jarraitzeko aukeratu duzun jendearen eta beraiek bultzatutako argitalpenen nahasketa bat edukiko du. Nahiko isila dirudi oraintxe, beraz, zergatik ez:", - "home.explore_prompt.title": "Hau zure hasiera da Mastodonen.", "home.hide_announcements": "Ezkutatu iragarpenak", "home.pending_critical_update.body": "Eguneratu zure Mastodoneko zerbitzaria leheinbailehen!", "home.pending_critical_update.link": "Ikusi eguneraketak", @@ -356,7 +356,7 @@ "keyboard_shortcuts.muted": "mutututako erabiltzaileen zerrenda irekitzeko", "keyboard_shortcuts.my_profile": "zure profila irekitzeko", "keyboard_shortcuts.notifications": "jakinarazpenen zutabea irekitzeko", - "keyboard_shortcuts.open_media": "media zabaltzeko", + "keyboard_shortcuts.open_media": "Ireki edukia", "keyboard_shortcuts.pinned": "Ireki finkatutako bidalketen zerrenda", "keyboard_shortcuts.profile": "egilearen profila irekitzeko", "keyboard_shortcuts.reply": "Erantzun bidalketari", diff --git a/app/javascript/mastodon/locales/fa.json b/app/javascript/mastodon/locales/fa.json index 0b078d1ab3..4050ca9f9f 100644 --- a/app/javascript/mastodon/locales/fa.json +++ b/app/javascript/mastodon/locales/fa.json @@ -145,11 +145,9 @@ "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.multiple": "چند گزینه‌ای", "compose_form.poll.option_placeholder": "گزینهٔ {number}", - "compose_form.poll.remove_option": "برداشتن این گزینه", "compose_form.poll.single": "گزینش یکی", "compose_form.poll.switch_to_multiple": "تغییر نظرسنجی برای اجازه به چندین گزینه", "compose_form.poll.switch_to_single": "تبدیل به نظرسنجی تک‌گزینه‌ای", @@ -305,13 +303,9 @@ "hashtag.follow": "پی‌گرفتن برچسب", "hashtag.unfollow": "پی‌نگرفتن برچسب", "hashtags.and_other": "…و {count, plural, other {# بیش‌تر}}", - "home.actions.go_to_explore": "ببینید چه داغ است", - "home.actions.go_to_suggestions": "یافتن افراد برای پی‌گیری", "home.column_settings.basic": "پایه‌ای", "home.column_settings.show_reblogs": "نمایش تقویت‌ها", "home.column_settings.show_replies": "نمایش پاسخ‌ها", - "home.explore_prompt.body": "خوراک خانگیتان ترکیبی از فرسته‌ها از برچسب‌هایی که برای پی‌گیری گزیده‌اید، افرادی که پی می‌گیرید و فرسته‌هایی که تقویت می‌کنند را خواهد داشت. اگر خیلی خلوت به نظر می‌رسد،‌ شاید بخواهید:", - "home.explore_prompt.title": "این پایگاه خانگیتان در ماستودون است.", "home.hide_announcements": "نهفتن اعلامیه‌ها", "home.pending_critical_update.body": "لطفاً کارساز ماستودونتان را در نخستین فرصت به‌روز کنید!", "home.pending_critical_update.link": "دیدن به‌روز رسانی‌ها", diff --git a/app/javascript/mastodon/locales/fi.json b/app/javascript/mastodon/locales/fi.json index 7b98f99836..277f0f2e72 100644 --- a/app/javascript/mastodon/locales/fi.json +++ b/app/javascript/mastodon/locales/fi.json @@ -2,8 +2,8 @@ "about.blocks": "Moderoidut palvelimet", "about.contact": "Ota yhteys:", "about.disclaimer": "Mastodon on vapaa avoimen lähdekoodin ohjelmisto ja Mastodon gGmbH:n tavaramerkki.", - "about.domain_blocks.no_reason_available": "Syytä ei ole ilmoitettu", - "about.domain_blocks.preamble": "Mastodonin avulla voidaan yleensä tarkastella minkä tahansa fediversumiin kuuluvan palvelimen sisältöä ja vuorovaikuttaa eri palvelinten käyttäjien kanssa. Nämä ovat tälle palvelimelle määritetyt poikkeukset.", + "about.domain_blocks.no_reason_available": "Syy ei ole tiedossa", + "about.domain_blocks.preamble": "Mastodonin avulla voidaan yleensä tarkastella minkä tahansa fediversumiin kuuluvan palvelimen sisältöä, ja olla yhteyksissä eri palvelinten käyttäjien kanssa. Nämä poikkeukset koskevat yksin tätä palvelinta.", "about.domain_blocks.silenced.explanation": "Et yleensä näe tämän palvelimen profiileja ja sisältöä, jollet erityisesti etsi juuri sitä tai liity siihen seuraamalla.", "about.domain_blocks.silenced.title": "Rajoitettu", "about.domain_blocks.suspended.explanation": "Mitään tämän palvelimen tietoja ei käsitellä, tallenneta tai vaihdeta, mikä tekee vuorovaikutuksesta ja viestinnästä sen käyttäjien kanssa mahdotonta.", @@ -19,7 +19,7 @@ "account.block_domain": "Estä verkkotunnus {domain}", "account.block_short": "Estä", "account.blocked": "Estetty", - "account.browse_more_on_origin_server": "Selaile lisää alkuperäisellä palvelimella", + "account.browse_more_on_origin_server": "Selaile kattavampaa alkuperäprofiilia", "account.cancel_follow_request": "Peruuta seurantapyyntö", "account.copy": "Kopioi linkki profiiliin", "account.direct": "Mainitse @{name} yksityisesti", @@ -27,7 +27,7 @@ "account.domain_blocked": "Verkkotunnus estetty", "account.edit_profile": "Muokkaa profiilia", "account.enable_notifications": "Ilmoita minulle, kun @{name} julkaisee", - "account.endorse": "Pidä esillä profiilissa", + "account.endorse": "Suosittele profiilissasi", "account.featured_tags.last_status_at": "Viimeisin julkaisu {date}", "account.featured_tags.last_status_never": "Ei julkaisuja", "account.featured_tags.title": "Käyttäjän {name} esillä pidettävät aihetunnisteet", @@ -39,7 +39,7 @@ "account.following": "Seuratut", "account.following_counter": "{count, plural, one {{counter} seurattu} other {{counter} seurattua}}", "account.follows.empty": "Tämä käyttäjä ei vielä seuraa ketään.", - "account.go_to_profile": "Avaa profiili", + "account.go_to_profile": "Mene profiiliin", "account.hide_reblogs": "Piilota käyttäjän @{name} tehostukset", "account.in_memoriam": "Muistoissamme.", "account.joined_short": "Liittynyt", @@ -64,10 +64,10 @@ "account.share": "Jaa käyttäjän @{name} profiili", "account.show_reblogs": "Näytä käyttäjän @{name} tehostukset", "account.statuses_counter": "{count, plural, one {{counter} julkaisu} other {{counter} julkaisua}}", - "account.unblock": "Poista käyttäjän @{name} esto", - "account.unblock_domain": "Poista verkkotunnuksen {domain} esto", + "account.unblock": "Kumoa käyttäjän @{name} esto", + "account.unblock_domain": "Kumoa verkkotunnuksen {domain} esto", "account.unblock_short": "Poista esto", - "account.unendorse": "Älä pidä esillä profiilissa", + "account.unendorse": "Kumoa suosittelu profiilissasi", "account.unfollow": "Lopeta seuraaminen", "account.unmute": "Poista käyttäjän @{name} mykistys", "account.unmute_notifications_short": "Poista ilmoitusten mykistys", @@ -75,7 +75,7 @@ "account_note.placeholder": "Lisää muistiinpano napsauttamalla", "admin.dashboard.daily_retention": "Käyttäjien pysyvyys rekisteröitymisen jälkeen päivittäin", "admin.dashboard.monthly_retention": "Käyttäjien pysyvyys rekisteröitymisen jälkeen kuukausittain", - "admin.dashboard.retention.average": "Keskimäärin", + "admin.dashboard.retention.average": "Keskiarvo", "admin.dashboard.retention.cohort": "Rekisteröitymis-kk.", "admin.dashboard.retention.cohort_size": "Uusia käyttäjiä", "admin.impact_report.instance_accounts": "Tilien profiilit, jotka tämä poistaisi", @@ -86,7 +86,7 @@ "alert.rate_limited.title": "Pyyntömäärää rajoitettu", "alert.unexpected.message": "Tapahtui odottamaton virhe.", "alert.unexpected.title": "Hups!", - "announcement.announcement": "Ilmoitus", + "announcement.announcement": "Tiedote", "attachments_list.unprocessed": "(käsittelemätön)", "audio.hide": "Piilota ääni", "boost_modal.combo": "Ensi kerralla voit ohittaa tämän painamalla {combo}", @@ -145,14 +145,12 @@ "compose_form.lock_disclaimer": "Tilisi ei ole {locked}. Kuka tahansa voi seurata tiliäsi ja nähdä vain seuraajille rajaamasi julkaisut.", "compose_form.lock_disclaimer.lock": "lukittu", "compose_form.placeholder": "Mitä mietit?", - "compose_form.poll.add_option": "Lisää vaihtoehto", "compose_form.poll.duration": "Äänestyksen kesto", "compose_form.poll.multiple": "Monivalinta", "compose_form.poll.option_placeholder": "Vaihtoehto {number}", - "compose_form.poll.remove_option": "Poista tämä vaihtoehto", "compose_form.poll.single": "Valitse yksi", - "compose_form.poll.switch_to_multiple": "Muuta äänestys monivalinnaksi", - "compose_form.poll.switch_to_single": "Muuta äänestys sallimaan vain yksi valinta", + "compose_form.poll.switch_to_multiple": "Muuta kysely monivalinnaksi", + "compose_form.poll.switch_to_single": "Muuta kysely sallimaan vain yksi valinta", "compose_form.poll.type": "Tyyli", "compose_form.publish": "Julkaise", "compose_form.publish_form": "Uusi julkaisu", @@ -166,13 +164,13 @@ "confirmations.block.confirm": "Estä", "confirmations.block.message": "Haluatko varmasti estää käyttäjän {name}?", "confirmations.cancel_follow_request.confirm": "Peruuta pyyntö", - "confirmations.cancel_follow_request.message": "Haluatko varmasti peruuttaa pyyntösi seurata profiilia {name}?", + "confirmations.cancel_follow_request.message": "Haluatko varmasti perua pyyntösi seurata käyttäjätiliä {name}?", "confirmations.delete.confirm": "Poista", "confirmations.delete.message": "Haluatko varmasti poistaa tämän julkaisun?", "confirmations.delete_list.confirm": "Poista", "confirmations.delete_list.message": "Haluatko varmasti poistaa tämän listan pysyvästi?", "confirmations.discard_edit_media.confirm": "Hylkää", - "confirmations.discard_edit_media.message": "Sinulla on tallentamattomia muutoksia median kuvaukseen tai esikatseluun, hylätäänkö ne silti?", + "confirmations.discard_edit_media.message": "Sinulla on tallentamattomia muutoksia median kuvaukseen tai esikatseluun. Hylätäänkö ne silti?", "confirmations.domain_block.confirm": "Estä koko verkkotunnus", "confirmations.domain_block.message": "Haluatko aivan varmasti estää koko verkkotunnuksen {domain}? Useimmiten muutama kohdistettu esto tai mykistys on riittävä ja suositeltava toimi. Et näe sisältöä tästä verkkotunnuksesta millään julkisilla aikajanoilla tai ilmoituksissa. Tähän verkkotunnukseen kuuluvat seuraajasi poistetaan.", "confirmations.edit.confirm": "Muokkaa", @@ -182,12 +180,12 @@ "confirmations.mute.confirm": "Mykistä", "confirmations.mute.explanation": "Tämä toiminto piilottaa heidän julkaisunsa sinulta – mukaan lukien ne, joissa heidät mainitaan – sallien heidän yhä nähdä julkaisusi ja seurata sinua.", "confirmations.mute.message": "Haluatko varmasti mykistää käyttäjän {name}?", - "confirmations.redraft.confirm": "Poista & palauta muokattavaksi", + "confirmations.redraft.confirm": "Poista ja palauta muokattavaksi", "confirmations.redraft.message": "Haluatko varmasti poistaa julkaisun ja tehdä siitä luonnoksen? Suosikit ja tehostukset menetetään, ja alkuperäisen julkaisun vastaukset jäävät orvoiksi.", "confirmations.reply.confirm": "Vastaa", "confirmations.reply.message": "Jos vastaat nyt, vastaus korvaa parhaillaan työstämäsi viestin. Haluatko varmasti jatkaa?", "confirmations.unfollow.confirm": "Lopeta seuraaminen", - "confirmations.unfollow.message": "Haluatko varmasti lakata seuraamasta profiilia {name}?", + "confirmations.unfollow.message": "Haluatko varmasti lopettaa profiilin {name} seuraamisen?", "conversation.delete": "Poista keskustelu", "conversation.mark_as_read": "Merkitse luetuksi", "conversation.open": "Näytä keskustelu", @@ -201,10 +199,10 @@ "directory.recently_active": "Hiljattain aktiiviset", "disabled_account_banner.account_settings": "Tilin asetukset", "disabled_account_banner.text": "Tilisi {disabledAccount} on tällä hetkellä poissa käytöstä.", - "dismissable_banner.community_timeline": "Nämä ovat viimeisimpiä julkaisuja käyttäjiltä, joiden tili sijaitsee palvelimella {domain}.", + "dismissable_banner.community_timeline": "Nämä ovat tuoreimpia julkaisuja käyttäjiltä, joiden tili on palvelimella {domain}.", "dismissable_banner.dismiss": "Hylkää", "dismissable_banner.explore_links": "Näitä uutisia jaetaan tänään sosiaalisessa verkossa eniten. Uusimmat ja eri käyttäjien eniten lähettämät uutiset nousevat listauksessa korkeimmalle.", - "dismissable_banner.explore_statuses": "Nämä sosiaalisen verkon julkaisut keräävät tänään eniten huomiota. Uusimmat, tehostetuimmat ja suosikiksi lisätyimmät nousevat listauksessa korkeimmalle.", + "dismissable_banner.explore_statuses": "Tänään nämä sosiaalisen verkon julkaisut keräävät eniten huomiota. Uusimmat, tehostetuimmat ja suosikeiksi lisätyimmät julkaisut nousevat listauksessa korkeammalle.", "dismissable_banner.explore_tags": "Nämä sosiaalisen verkon aihetunnisteet keräävät tänään eniten huomiota. Useimman käyttäjän käyttämät aihetunnisteet nousevat listauksessa korkeimmalle.", "dismissable_banner.public_timeline": "Nämä ovat viimeisimpiä julkaisuja sosiaalisen verkon käyttäjiltä, joita seurataan palvelimella {domain}.", "embed.instructions": "Upota julkaisu verkkosivullesi kopioimalla alla oleva koodi.", @@ -216,18 +214,18 @@ "emoji_button.food": "Ruoka ja juoma", "emoji_button.label": "Lisää emoji", "emoji_button.nature": "Luonto", - "emoji_button.not_found": "Vastaavia emojeja ei löytynyt", + "emoji_button.not_found": "Vastaavia emojeita ei löytynyt", "emoji_button.objects": "Esineet", "emoji_button.people": "Ihmiset", "emoji_button.recent": "Usein käytetyt", - "emoji_button.search": "Hae...", + "emoji_button.search": "Etsi...", "emoji_button.search_results": "Hakutulokset", "emoji_button.symbols": "Symbolit", "emoji_button.travel": "Matkailu ja paikat", - "empty_column.account_hides_collections": "Käyttäjä on päättänyt olla julkaisematta näitä tietoja", + "empty_column.account_hides_collections": "Käyttäjä on päättänyt pitää nämä tiedot yksityisinä", "empty_column.account_suspended": "Tili jäädytetty", "empty_column.account_timeline": "Ei viestejä täällä.", - "empty_column.account_unavailable": "Profiilia ei löydy", + "empty_column.account_unavailable": "Profiilia ei ole saatavilla", "empty_column.blocks": "Et ole vielä estänyt käyttäjiä.", "empty_column.bookmarked_statuses": "Et ole vielä lisännyt julkaisuja 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!", @@ -238,17 +236,17 @@ "empty_column.favourites": "Kukaan ei ole vielä lisännyt tätä julkaisua suosikkeihinsa. Kun joku tekee niin, tulee hän tähän näkyviin.", "empty_column.follow_requests": "Et ole vielä vastaanottanut seuraamispyyntöjä. Saamasi pyynnöt näkyvät täällä.", "empty_column.followed_tags": "Et seuraa vielä yhtäkään aihetunnistetta. Kun alat seurata, ne tulevat tähän näkyviin.", - "empty_column.hashtag": "Tällä aihetunnisteella ei ole vielä mitään.", + "empty_column.hashtag": "Tällä aihetunnisteella ei löydy vielä sisältöä.", "empty_column.home": "Kotiaikajanasi on tyhjä! Seuraa useampia henkilöjä, niin näet enemmän sisältöä.", "empty_column.list": "Tällä listalla ei ole vielä mitään. Kun tämän listan jäsenet lähettävät uusia julkaisuja, ne näkyvät tässä.", "empty_column.lists": "Sinulla ei ole vielä yhtään listaa. Kun luot sellaisen, näkyy se tässä.", "empty_column.mutes": "Et ole mykistänyt vielä yhtään käyttäjää.", "empty_column.notifications": "Sinulla ei ole vielä ilmoituksia. Kun keskustelet muille, näet sen täällä.", "empty_column.public": "Täällä ei ole mitään! Kirjoita jotain julkisesti. Voit myös seurata muiden palvelimien käyttäjiä", - "error.unexpected_crash.explanation": "Sivua ei voi näyttää oikein, johtuen bugista tai ongelmasta selaimen yhteensopivuudessa.", + "error.unexpected_crash.explanation": "Sivua ei voida näyttää oikein ohjelmointivirheen tai selaimen yhteensopivuusvajeen vuoksi.", "error.unexpected_crash.explanation_addons": "Sivua ei voitu näyttää oikein. Tämä virhe johtuu todennäköisesti selaimen lisäosasta tai automaattisista käännöstyökaluista.", "error.unexpected_crash.next_steps": "Kokeile päivittää sivu. Jos se ei auta, voi Mastodonin käyttö ehkä onnistua eri selaimella tai natiivisovelluksella.", - "error.unexpected_crash.next_steps_addons": "Yritä poistaa ne käytöstä ja päivittää sivu. Jos se ei auta, voit silti käyttää Mastodonia eri selaimen tai sovelluksen kautta.", + "error.unexpected_crash.next_steps_addons": "Yritä poistaa ne käytöstä, ja virkistä sitten sivunlataus. Mikäli ongelma jatkuu, voit mahdollisesti käyttää Mastodonia eri selaimella tai natiivilla sovelluksella.", "errors.unexpected_crash.copy_stacktrace": "Kopioi pinon jäljitys leikepöydälle", "errors.unexpected_crash.report_issue": "Ilmoita ongelmasta", "explore.search_results": "Hakutulokset", @@ -257,13 +255,13 @@ "explore.trending_links": "Uutiset", "explore.trending_statuses": "Julkaisut", "explore.trending_tags": "Aihetunnisteet", - "filter_modal.added.context_mismatch_explanation": "Tämä suodatinluokka ei koske kontekstia, jossa olet tarkastellut tätä julkaisua. Jos haluat, että julkaisu suodatetaan myös tässä kontekstissa, sinun pitää muokata suodatinta.", - "filter_modal.added.context_mismatch_title": "Konteksti ei täsmää!", - "filter_modal.added.expired_explanation": "Tämä suodatinluokka on vanhentunut, joten sinun on muutettava viimeistä voimassaolopäivää, jotta suodatin on voimassa.", + "filter_modal.added.context_mismatch_explanation": "Tämä suodatinluokka ei koske asiayhteyttä, jossa olet tarkastellut tätä julkaisua. Jos haluat julkaisun suodatettavan myös tässä asiayhteydessä, muokkaa suodatinta.", + "filter_modal.added.context_mismatch_title": "Asiayhteys ei täsmää!", + "filter_modal.added.expired_explanation": "Tämä suodatinluokka on vanhentunut, joten sinun on muutettava viimeistä voimassaolopäivää, jotta suodatusta käytettäisiin.", "filter_modal.added.expired_title": "Vanhentunut suodatin!", - "filter_modal.added.review_and_configure": "Voit tarkastella tätä suodatinluokkaa ja määrittää sen tarkemmin kohdassa {settings_link}.", + "filter_modal.added.review_and_configure": "Voit tarkastella tätä suodatinluokkaa ja määrittää sen tarkemmin {settings_link}.", "filter_modal.added.review_and_configure_title": "Suodattimen asetukset", - "filter_modal.added.settings_link": "asetukset-sivulle", + "filter_modal.added.settings_link": "asetussivulla", "filter_modal.added.short_explanation": "Tämä julkaisu on lisätty seuraavaan suodatinluokkaan: {title}.", "filter_modal.added.title": "Suodatin lisätty!", "filter_modal.select_filter.context_mismatch": "ei sovellu tähän kontekstiin", @@ -279,6 +277,12 @@ "follow_request.authorize": "Valtuuta", "follow_request.reject": "Hylkää", "follow_requests.unlocked_explanation": "Vaikkei tiliäsi ole lukittu, palvelimen {domain} ylläpito on arvioinut, että saatat olla halukas tarkistamaan nämä seuraamispyynnöt erikseen.", + "follow_suggestions.curated_suggestion": "Päätoimittajan valinta", + "follow_suggestions.dismiss": "Älä näytä uudelleen", + "follow_suggestions.personalized_suggestion": "Personoitu ehdotus", + "follow_suggestions.popular_suggestion": "Suosittu ehdotus", + "follow_suggestions.view_all": "Näytä kaikki", + "follow_suggestions.who_to_follow": "Ehdotuksia seurattavaksi", "followed_tags": "Seuratut aihetunnisteet", "footer.about": "Tietoja", "footer.directory": "Profiilihakemisto", @@ -305,15 +309,11 @@ "hashtag.follow": "Seuraa aihetunnistetta", "hashtag.unfollow": "Lopeta aihetunnisteen seuraaminen", "hashtags.and_other": "…ja {count, plural, other {# lisää}}", - "home.actions.go_to_explore": "Katso, mikä on suosittua", - "home.actions.go_to_suggestions": "Löydä seurattavia käyttäjiä", "home.column_settings.basic": "Perusasetukset", "home.column_settings.show_reblogs": "Näytä tehostukset", "home.column_settings.show_replies": "Näytä vastaukset", - "home.explore_prompt.body": "Kotisyötteesi on sekoitus seuraamiasi aihetunnisteita ja käyttäjiä sekä heidän tehostamiaan julkaisuja. Jos se tuntuu liian hiljaiselta, saatat haluta:", - "home.explore_prompt.title": "Tämä on tukikohtasi Mastodonissa.", "home.hide_announcements": "Piilota tiedotteet", - "home.pending_critical_update.body": "Päivitäthän Mastodon-palvelimen mahdollisimman pian!", + "home.pending_critical_update.body": "Päivitäthän Mastodon-palvelinohjelmistosi mahdollisimman pian!", "home.pending_critical_update.link": "Tutustu päivityssisältöihin", "home.pending_critical_update.title": "Kriittinen tietoturvapäivitys saatavilla!", "home.show_announcements": "Näytä tiedotteet", @@ -352,7 +352,7 @@ "keyboard_shortcuts.hotkey": "Pikanäppäin", "keyboard_shortcuts.legend": "Näytä tämä ohje", "keyboard_shortcuts.local": "Avaa paikallinen aikajana", - "keyboard_shortcuts.mention": "Mainitse kirjoittaja", + "keyboard_shortcuts.mention": "Mainitse julkaisija", "keyboard_shortcuts.muted": "Avaa mykistettyjen käyttäjien luettelo", "keyboard_shortcuts.my_profile": "Avaa profiilisi", "keyboard_shortcuts.notifications": "Avaa ilmoitussarake", @@ -370,12 +370,12 @@ "keyboard_shortcuts.unfocus": "Poistu teksti-/hakukentästä", "keyboard_shortcuts.up": "Siirry listassa ylöspäin", "lightbox.close": "Sulje", - "lightbox.compress": "Pakkaa kuvan näkymälaatikko", - "lightbox.expand": "Laajenna kuvan näkymälaatikko", + "lightbox.compress": "Tiivis kuvankatselunäkymä", + "lightbox.expand": "Laajennettu kuvankatselunäkymä", "lightbox.next": "Seuraava", "lightbox.previous": "Edellinen", "limited_account_hint.action": "Näytä profiili joka tapauksessa", - "limited_account_hint.title": "Palvelun {domain} valvojat ovat piilottaneet tämän profiilin.", + "limited_account_hint.title": "Palvelimen {domain} valvojat ovat piilottaneet tämän käyttäjätilin.", "link_preview.author": "Julkaissut {name}", "lists.account.add": "Lisää listalle", "lists.account.remove": "Poista listalta", @@ -389,21 +389,21 @@ "lists.replies_policy.list": "Listan jäsenille", "lists.replies_policy.none": "Ei kellekään", "lists.replies_policy.title": "Näytä vastaukset:", - "lists.search": "Etsi seuraamistasi henkilöistä", + "lists.search": "Etsi seuraamiesi henkilöiden keskuudesta", "lists.subheading": "Omat listasi", "load_pending": "{count, plural, one {# uusi kohde} other {# uutta kohdetta}}", "loading_indicator.label": "Ladataan…", "media_gallery.toggle_visible": "{number, plural, one {Piilota kuva} other {Piilota kuvat}}", "moved_to_account_banner.text": "Tilisi {disabledAccount} on tällä hetkellä poissa käytöstä, koska teit siirron tiliin {movedToAccount}.", "mute_modal.duration": "Kesto", - "mute_modal.hide_notifications": "Piilota tältä käyttäjältä tulevat ilmoitukset?", + "mute_modal.hide_notifications": "Piilotetaanko tältä käyttäjältä tulevat ilmoitukset?", "mute_modal.indefinite": "Ikuisesti", "navigation_bar.about": "Tietoja", "navigation_bar.advanced_interface": "Avaa edistyneessä selainkäyttöliittymässä", "navigation_bar.blocks": "Estetyt käyttäjät", "navigation_bar.bookmarks": "Kirjanmerkit", "navigation_bar.community_timeline": "Paikallinen aikajana", - "navigation_bar.compose": "Kirjoita uusi julkaisu", + "navigation_bar.compose": "Luo uusi julkaisu", "navigation_bar.direct": "Yksityiset maininnat", "navigation_bar.discover": "Löydä uutta", "navigation_bar.domain_blocks": "Estetyt verkkotunnukset", @@ -428,10 +428,10 @@ "notification.admin.sign_up": "{name} rekisteröityi", "notification.favourite": "{name} lisäsi julkaisusi suosikkeihinsa", "notification.follow": "{name} seurasi sinua", - "notification.follow_request": "{name} haluaa seurata sinua", + "notification.follow_request": "{name} on pyytänyt lupaa saada seurata sinua", "notification.mention": "{name} mainitsi sinut", "notification.own_poll": "Äänestyksesi on päättynyt", - "notification.poll": "Äänestys, johon osallistuit, on päättynyt", + "notification.poll": "Kysely, johon osallistuit, on päättynyt", "notification.reblog": "{name} tehosti julkaisuasi", "notification.status": "{name} julkaisi juuri", "notification.update": "{name} muokkasi julkaisua", @@ -478,7 +478,7 @@ "onboarding.actions.go_to_home": "Siirry kotisyötteeseeni", "onboarding.compose.template": "Tervehdys #Mastodon!", "onboarding.follows.empty": "Valitettavasti tuloksia ei voida näyttää juuri nyt. Voit kokeilla hakua tai selata tutustumissivua löytääksesi seurattavaa tai yrittää myöhemmin uudelleen.", - "onboarding.follows.lead": "Kokoat oman kotisyötteesi itse. Mitä enemmän ihmisiä seuraat, sitä aktiivisempi ja kiinnostavampi syöte on. Nämä profiilit voivat olla alkuun hyvä lähtökohta — voit aina lopettaa niiden seuraamisen myöhemmin!", + "onboarding.follows.lead": "Kokoat oman kotisyötteesi itse. Mitä enemmän ihmisiä seuraat, sitä aktiivisempi ja kiinnostavampi syöte on. Nämä profiilit voivat olla alkuun hyvä lähtökohta – voit milloin tahansa myös lopettaa niiden seuraamisen:", "onboarding.follows.title": "Mukauta kotisyötettäsi", "onboarding.profile.discoverable": "Aseta profiilini löydettäväksi", "onboarding.profile.discoverable_hint": "Kun olet määrittänyt itsesi löydettäväksi Mastodonista, julkaisusi voivat näkyä hakutuloksissa ja suosituissa kohteissa. Lisäksi profiiliasi voidaan ehdottaa käyttäjille, jotka ovat kiinnostuneita kanssasi samoista aiheista.", @@ -506,7 +506,7 @@ "onboarding.steps.setup_profile.title": "Mukauta profiiliasi", "onboarding.steps.share_profile.body": "Kerro kavereillesi, kuinka sinut löytää Mastodonista", "onboarding.steps.share_profile.title": "Jaa Mastodon-profiilisi", - "onboarding.tips.2fa": "Tiesitkö? Voit suojata tilisi ottamalla kaksivaiheisen todennuksen käyttöön tilisi asetuksista. Se toimii millä tahansa TOTP-sovelluksella, eikä sen käyttö edellytä puhelinnumeroa!", + "onboarding.tips.2fa": "Tiesitkö? Voit suojata tilisi ottamalla kaksivaiheisen todennuksen käyttöön tilisi asetuksista. Se toimii millä tahansa TOTP-sovelluksella, eikä sen käyttö edellytä puhelinnumeron antoa!", "onboarding.tips.accounts_from_other_servers": "Tiesitkö? Koska Mastodon on hajautettu, osa kohtaamistasi profiileista sijaitsee muilla kuin sinun palvelimellasi. Voit silti viestiä saumattomasti heidän kanssaan! Heidän palvelimensa mainitaan käyttäjänimen jälkiosassa!", "onboarding.tips.migration": "Tiesitkö? Jos koet, ettei {domain} ole jatkossa itsellesi hyvä palvelinvalinta, voit siirtyä toiselle Mastodon-palvelimelle menettämättä seuraajiasi. Voit jopa isännöidä omaa palvelintasi!", "onboarding.tips.verification": "Tiesitkö? Voit vahvistaa tilisi lisäämällä omalle verkkosivustollesi linkin Mastodon-profiiliisi ja lisäämällä sitten verkkosivustosi osoitteen Mastodon-profiilisi lisäkenttään. Tämä ei maksa mitään, eikä sinun tarvitse lähetellä asiakirjoja!", @@ -521,8 +521,8 @@ "poll.vote": "Äänestä", "poll.voted": "Äänestit tätä vastausta", "poll.votes": "{votes, plural, one {# ääni} other {# ääntä}}", - "poll_button.add_poll": "Lisää äänestys", - "poll_button.remove_poll": "Poista äänestys", + "poll_button.add_poll": "Lisää kysely", + "poll_button.remove_poll": "Poista kysely", "privacy.change": "Muuta julkaisun näkyvyyttä", "privacy.direct.long": "Kaikki tässä julkaisussa mainitut", "privacy.direct.short": "Tietyt henkilöt", @@ -530,7 +530,9 @@ "privacy.private.short": "Seuraajat", "privacy.public.long": "Kuka tahansa Mastodonissa ja sen ulkopuolella", "privacy.public.short": "Julkinen", - "privacy.unlisted.additional": "Tämä toimii kuten julkinen, paitsi että julkaisu ei näy livesyötteissä, aihetunnisteissa, selaa-näkymässä tai Mastodon-haussa, vaikka olisit sallinut ne käyttäjätilin laajuisesti.", + "privacy.unlisted.additional": "Tämä on muutoin kuin julkinen julkaisu, mutta sitä ei näytetä livesyöte-, aihetunniste- tai selailunäkymissä eikä Mastodon-hakutuloksissakaan, vaikka ne olisivat käyttäjätililläsi yleisesti sallittuina.", + "privacy.unlisted.long": "Vähemmän algoritmiperusteista sisältöä", + "privacy.unlisted.short": "Vaivihkaisesti julkinen", "privacy_policy.last_updated": "Viimeksi päivitetty {date}", "privacy_policy.title": "Tietosuojakäytäntö", "recommended": "Suositeltu", @@ -553,16 +555,16 @@ "reply_indicator.poll": "Kysely", "report.block": "Estä", "report.block_explanation": "Et näe hänen viestejään, eikä hän voi nähdä viestejäsi tai seurata sinua. Hän näkee, että olet estänyt hänet.", - "report.categories.legal": "Lakiasiat", + "report.categories.legal": "Juridiset tiedot", "report.categories.other": "Muu", "report.categories.spam": "Roskaposti", - "report.categories.violation": "Sisältö rikkoo yhtä tai useampaa palvelimen sääntöä", + "report.categories.violation": "Sisältö rikkoo yhtä tai useampaa palvelimen säännöistä", "report.category.subtitle": "Valitse sopivin", "report.category.title": "Kerro meille, miksi tämä {type} pitää raportoida", - "report.category.title_account": "profiili", - "report.category.title_status": "julkaisu", + "report.category.title_account": "profiilissa", + "report.category.title_status": "julkaisussa", "report.close": "Valmis", - "report.comment.title": "Olisiko jotain muuta, mitä meidän pitäisi tietää?", + "report.comment.title": "Onko vielä jotain muuta, mitä meidän pitäisi tietää?", "report.forward": "Välitä kohteeseen {target}", "report.forward_hint": "Tämä tili on toisella palvelimella. Haluatko lähettää nimettömän raportin myös sinne?", "report.mute": "Mykistä", @@ -570,18 +572,18 @@ "report.next": "Seuraava", "report.placeholder": "Lisäkommentit", "report.reasons.dislike": "En pidä siitä", - "report.reasons.dislike_description": "Et halua nähdä sitä", + "report.reasons.dislike_description": "Sisältö on sen tyyppistä, ettet halua nähdä sitä", "report.reasons.legal": "Se on laitonta", "report.reasons.legal_description": "Katsot sisällön rikkovan maasi tai palvelimen kotimaan lakeja", "report.reasons.other": "Jotain muuta", - "report.reasons.other_description": "Ongelma ei sovi muihin kategorioihin", + "report.reasons.other_description": "Muut raportointisyyt eivät kuvaa ongelmaa", "report.reasons.spam": "Se on roskapostia", - "report.reasons.spam_description": "Haitalliset linkit, väärennetyt sitoutumiset tai toistuvat vastaukset", + "report.reasons.spam_description": "Haitalliset linkit, henkilöväärennökset tai itseään toistavat vastaukset", "report.reasons.violation": "Se rikkoo palvelimen sääntöjä", - "report.reasons.violation_description": "Tiedät, että se rikkoo tiettyjä sääntöjä", + "report.reasons.violation_description": "Tiedät sisällön rikkovan tiettyjä sääntöjä", "report.rules.subtitle": "Valitse kaikki sopivat", "report.rules.title": "Mitä sääntöjä rikotaan?", - "report.statuses.subtitle": "Valitse kaikki sopivat", + "report.statuses.subtitle": "Valitse kaikki soveltuvat julkaisut", "report.statuses.title": "Onko julkaisuja, jotka tukevat tätä raporttia?", "report.submit": "Lähetä", "report.target": "Raportoidaan {target}", @@ -595,14 +597,14 @@ "report_notification.categories.legal": "Laillinen", "report_notification.categories.other": "Muu", "report_notification.categories.spam": "Roskaposti", - "report_notification.categories.violation": "Sääntöjen rikkominen", + "report_notification.categories.violation": "Sääntörikkomus", "report_notification.open": "Avaa raportti", "search.no_recent_searches": "Ei viimeaikaisia hakuja", "search.placeholder": "Hae", "search.quick_action.account_search": "Profiilit haulla {x}", "search.quick_action.go_to_account": "Siirry profiiliin {x}", "search.quick_action.go_to_hashtag": "Siirry aihetunnisteeseen {x}", - "search.quick_action.open_url": "Avaa URL-osoite Mastodonissa", + "search.quick_action.open_url": "Avaa verkko-osoite Mastodonissa", "search.quick_action.status_search": "Julkaisut haulla {x}", "search.search_or_paste": "Hae tai liitä URL-osoite", "search_popout.full_text_search_disabled_message": "Ei saatavilla palvelimella {domain}.", @@ -611,16 +613,16 @@ "search_popout.options": "Hakuvalinnat", "search_popout.quick_actions": "Pikatoiminnot", "search_popout.recent": "Viimeaikaiset haut", - "search_popout.specific_date": "tarkka päiväys", + "search_popout.specific_date": "tietty päivämäärä", "search_popout.user": "käyttäjä", "search_results.accounts": "Profiilit", "search_results.all": "Kaikki", "search_results.hashtags": "Aihetunnisteet", - "search_results.nothing_found": "Näille hakusanoille ei löytynyt mitään", + "search_results.nothing_found": "Hakusi ei tuottanut tuloksia", "search_results.see_all": "Näytä kaikki", "search_results.statuses": "Julkaisut", "search_results.title": "Hae {q}", - "server_banner.about_active_users": "Palvelinta käyttäneet ihmiset viimeisen 30 päivän aikana (kuukauden aktiiviset käyttäjät)", + "server_banner.about_active_users": "Palvelimen käyttäjät viimeisten 30 päivän ajalta (kuukauden aktiiviset käyttäjät)", "server_banner.active_users": "aktiivista käyttäjää", "server_banner.administered_by": "Ylläpitäjä:", "server_banner.introduction": "{domain} kuuluu hajautettuun sosiaaliseen verkostoon, jonka voimanlähde on {mastodon}.", @@ -657,7 +659,7 @@ "status.media.show": "Napsauta näyttääksesi", "status.media_hidden": "Media piilotettu", "status.mention": "Mainitse @{name}", - "status.more": "Lisää", + "status.more": "Enemmän", "status.mute": "Mykistä @{name}", "status.mute_conversation": "Mykistä keskustelu", "status.open": "Laajenna julkaisu", @@ -679,14 +681,14 @@ "status.show_filter_reason": "Näytä joka tapauksessa", "status.show_less": "Näytä vähemmän", "status.show_less_all": "Näytä kaikista vähemmän", - "status.show_more": "Näytä lisää", + "status.show_more": "Näytä enemmän", "status.show_more_all": "Näytä kaikista enemmän", "status.show_original": "Näytä alkuperäinen", "status.title.with_attachments": "{user} liitti {attachmentCount, plural, one {{attachmentCount} tiedoston} other {{attachmentCount} tiedostoa}}", "status.translate": "Käännä", - "status.translated_from_with": "Käännetty kielestä {lang} käyttäen {provider}", + "status.translated_from_with": "Käännetty kielestä {lang} käyttäen palvelua {provider}", "status.uncached_media_warning": "Esikatselu ei ole käytettävissä", - "status.unmute_conversation": "Poista keskustelun mykistys", + "status.unmute_conversation": "Kumoa keskustelun mykistys", "status.unpin": "Irrota profiilista", "subscribed_languages.lead": "Vain valituilla kielillä kirjoitetut julkaisut näkyvät koti- ja lista-aikajanoillasi muutoksen jälkeen. Älä valitse mitään, jos haluat nähdä julkaisuja kaikilla kielillä.", "subscribed_languages.save": "Tallenna muutokset", @@ -696,9 +698,9 @@ "time_remaining.days": "{number, plural, one {# päivä} other {# päivää}} jäljellä", "time_remaining.hours": "{number, plural, one {# tunti} other {# tuntia}} jäljellä", "time_remaining.minutes": "{number, plural, one {# minuutti} other {# minuuttia}} jäljellä", - "time_remaining.moments": "Hetki jäljellä", + "time_remaining.moments": "Hetkiä jäljellä", "time_remaining.seconds": "{number, plural, one {# sekunti} other {# sekuntia}} jäljellä", - "timeline_hint.remote_resource_not_displayed": "{resource} muilta palvelimilta ei näytetä.", + "timeline_hint.remote_resource_not_displayed": "Muiden palvelinten {resource}-tietoa ei näytetä täällä.", "timeline_hint.resources.followers": "Seuraajat", "timeline_hint.resources.follows": "seurattua", "timeline_hint.resources.statuses": "Vanhemmat julkaisut", @@ -711,23 +713,23 @@ "upload_area.title": "Lataa raahaamalla ja pudottamalla tähän", "upload_button.label": "Lisää kuvia, video tai äänitiedosto", "upload_error.limit": "Tiedostolatauksien rajoitus ylitetty.", - "upload_error.poll": "Tiedoston lataaminen ei ole sallittua äänestyksissä.", + "upload_error.poll": "Tiedostojen lisääminen ei ole sallittua kyselyjen ohessa.", "upload_form.audio_description": "Kuvaile sisältöä kuuroille ja kuulorajoitteisille", "upload_form.description": "Kuvaile sisältöä sokeille ja näkörajoitteisille", "upload_form.edit": "Muokkaa", - "upload_form.thumbnail": "Vaihda pikkukuva", + "upload_form.thumbnail": "Vaihda pienoiskuva", "upload_form.video_description": "Kuvaile sisältöä kuuroille, kuulorajoitteisille, sokeille tai näkörajoitteisille", "upload_modal.analyzing_picture": "Analysoidaan kuvaa…", "upload_modal.apply": "Käytä", - "upload_modal.applying": "Asetetaan…", + "upload_modal.applying": "Otetaan käyttöön…", "upload_modal.choose_image": "Valitse kuva", "upload_modal.description_placeholder": "Nopea ruskea kettu hyppää laiskan koiran yli", "upload_modal.detect_text": "Tunnista teksti kuvasta", "upload_modal.edit_media": "Muokkaa mediaa", - "upload_modal.hint": "Klikkaa tai vedä ympyrä esikatselussa valitaksesi keskipiste, joka näkyy aina pienoiskuvissa.", + "upload_modal.hint": "Napsauta tai vedä ympyrä esikatselussa valitaksesi keskipiste, joka näkyy aina pienoiskuvissa.", "upload_modal.preparing_ocr": "Valmistellaan tekstintunnistusta…", "upload_modal.preview_label": "Esikatselu ({ratio})", - "upload_progress.label": "Ladataan...", + "upload_progress.label": "Tallennetaan...", "upload_progress.processing": "Käsitellään…", "username.taken": "Käyttäjänimi on jo varattu. Kokeile toista", "video.close": "Sulje video", @@ -737,7 +739,7 @@ "video.fullscreen": "Koko näyttö", "video.hide": "Piilota video", "video.mute": "Mykistä ääni", - "video.pause": "Keskeytä", + "video.pause": "Tauko", "video.play": "Toista", "video.unmute": "Palauta ääni" } diff --git a/app/javascript/mastodon/locales/fil.json b/app/javascript/mastodon/locales/fil.json index ec27c8f60e..b677f9d197 100644 --- a/app/javascript/mastodon/locales/fil.json +++ b/app/javascript/mastodon/locales/fil.json @@ -27,6 +27,7 @@ "account.featured_tags.last_status_never": "Walang mga post", "account.featured_tags.title": "Nakatampok na hashtag ni {name}", "account.follow": "Sundan", + "account.follow_back": "Sundan pabalik", "account.followers": "Mga tagasunod", "account.followers.empty": "Wala pang sumusunod sa tagagamit na ito.", "account.following": "Sinusundan", @@ -41,6 +42,11 @@ "account.media": "Medya", "account.mention": "Banggitin si @{name}", "account.moved_to": "Ipinahihiwatig ni {name} na ang kanilang bagong account ngayon ay:", + "account.open_original_page": "Buksan ang pinagmulang pahina", + "account.report": "I-ulat si/ang @{name}", + "account.requested_follow": "Hinihiling ni {name} na sundan ka", + "account.show_reblogs": "Ipakita ang mga pagpapalakas mula sa/kay {name}", + "admin.dashboard.retention.cohort_size": "Mga bagong tagagamit", "bundle_column_error.error.title": "Naku!", "bundle_column_error.network.body": "Nagkaroon ng kamalian habang sinusubukang i-karga ang pahinang ito. Maaaring dahil ito sa pansamantalang problema ng iyong koneksyon sa internet o ang server na ito.", "bundle_column_error.network.title": "Kamaliang network", @@ -91,6 +97,19 @@ "compose_form.direct_message_warning_learn_more": "Matuto pa", "compose_form.encryption_warning": "Ang mga post sa Mastodon ay hindi naka-encrypt nang dulo-dulo. Huwag magbahagi ng anumang sensitibong impormasyon sa Mastodon.", "compose_form.hashtag_warning": "Hindi maililista ang post na ito sa anumang hashtag dahil hindi ito nakapubliko. Mga nakapublikong post lamang ang mahahanap ayon sa hashtag.", + "compose_form.placeholder": "Anong nangyari?", + "compose_form.poll.single": "Piliin ang isa", + "compose_form.reply": "Tumugon", + "compose_form.spoiler.unmarked": "Idagdag ang babala sa nilalaman", + "confirmation_modal.cancel": "Pagpaliban", + "confirmations.block.block_and_report": "Harangan at i-ulat", + "confirmations.block.confirm": "Harangan", + "confirmations.block.message": "Sigurado ka bang gusto mong harangan si {name}?", + "confirmations.cancel_follow_request.confirm": "Bawiin ang kahilingan", + "confirmations.cancel_follow_request.message": "Sigurdo ka bang gusto mong bawiin ang kahilingang sundan si/ang {name}?", + "confirmations.domain_block.confirm": "Harangan ang buong domain", + "confirmations.edit.confirm": "Baguhin", + "confirmations.reply.confirm": "Tumugon", "copy_icon_button.copied": "Sinipi sa clipboard", "copypaste.copied": "Sinipi", "copypaste.copy_to_clipboard": "I-sipi sa clipboard", @@ -140,5 +159,68 @@ "empty_column.hashtag": "Wala pang laman ang hashtag na ito.", "empty_column.home": "Walang laman ang timeline ng tahanan mo! Sumunod sa marami pang tao para mapunan ito.", "empty_column.list": "Wala pang laman ang listahang ito. Kapag naglathala ng mga bagong post ang mga miyembro ng listahang ito, makikita iyon dito.", - "empty_column.lists": "Wala ka pang mga listahan. Kapag gumawa ka ng isa, makikita yun dito." + "empty_column.lists": "Wala ka pang mga listahan. Kapag gumawa ka ng isa, makikita yun dito.", + "explore.search_results": "Mga resulta ng paghahanap", + "firehose.all": "Lahat", + "firehose.local": "Itong serbiro", + "firehose.remote": "Ibang mga serbiro", + "follow_request.authorize": "Tanggapin", + "follow_request.reject": "Tanggihan", + "follow_suggestions.dismiss": "Huwag nang ipakita muli", + "follow_suggestions.view_all": "Tingnan lahat", + "follow_suggestions.who_to_follow": "Sinong maaaring sundan", + "footer.about": "Tungkol dito", + "footer.get_app": "Kunin ang app", + "generic.saved": "Nakaimbak", + "hashtag.column_header.tag_mode.all": "at {additional}", + "hashtag.column_header.tag_mode.any": "o {additional}", + "home.pending_critical_update.body": "Mangyaring i-update ang iyong serbiro ng Mastodon sa lalong madaling panahon!", + "interaction_modal.no_account_yet": "Wala sa Mastodon?", + "interaction_modal.on_another_server": "Sa ibang serbiro", + "interaction_modal.on_this_server": "Sa serbirong ito", + "interaction_modal.title.follow": "Sundan si {name}", + "keyboard_shortcuts.description": "Paglalarawan", + "keyboard_shortcuts.down": "Ilipat pababa sa talaan", + "keyboard_shortcuts.requests": "Buksan ang talaan ng mga kahilingan sa pagsunod", + "keyboard_shortcuts.up": "Ilipat pataas sa talaan", + "lightbox.close": "Isara", + "lightbox.next": "Susunod", + "lightbox.previous": "Nakaraan", + "lists.new.create": "Idagdag sa talaan", + "lists.new.title_placeholder": "Bagong pangalan ng talaan", + "lists.replies_policy.title": "Ipakita ang mga tugon sa:", + "lists.subheading": "Iyong mga talaan", + "navigation_bar.about": "Tungkol dito", + "navigation_bar.blocks": "Nakaharang na mga tagagamit", + "navigation_bar.favourites": "Mga paborito", + "navigation_bar.lists": "Mga listahan", + "notification.admin.report": "Iniulat ni {name} si {target}", + "notification.follow": "Sinundan ka ni {name}", + "notification.follow_request": "Hinihiling ni {name} na sundan ka", + "notifications.column_settings.admin.report": "Mga bagong ulat:", + "notifications.column_settings.favourite": "Mga paborito:", + "notifications.column_settings.follow": "Mga bagong tagasunod:", + "notifications.filter.all": "Lahat", + "onboarding.action.back": "Ibalik mo ako", + "onboarding.actions.back": "Ibalik mo ako", + "onboarding.share.next_steps": "Mga posibleng susunod na hakbang:", + "poll.voted": "Binoto mo para sa sagot na ito", + "relative_time.full.just_now": "ngayon lang", + "relative_time.just_now": "ngayon", + "reply_indicator.cancel": "Ipagpaliban", + "report.block": "Harangan", + "report.categories.other": "Iba pa", + "report.close": "Tapos na", + "report.next": "Sunod", + "server_banner.learn_more": "Matuto nang higit pa", + "status.more": "Higit pa", + "status.reply": "Tumugon", + "status.share": "Ibahagi", + "status.show_less": "Magpakita ng mas kaunti", + "status.show_less_all": "Magpakita ng mas kaunti para sa lahat", + "status.show_more": "Magpakita ng higit pa", + "status.show_more_all": "Magpakita ng higit pa para sa lahat", + "status.translate": "Isalin", + "status.translated_from_with": "Isalin mula sa {lang} gamit ang {provider}", + "status.uncached_media_warning": "Hindi makuha ang paunang tigin" } diff --git a/app/javascript/mastodon/locales/fo.json b/app/javascript/mastodon/locales/fo.json index a4c5296086..abd2ab2681 100644 --- a/app/javascript/mastodon/locales/fo.json +++ b/app/javascript/mastodon/locales/fo.json @@ -145,11 +145,9 @@ "compose_form.lock_disclaimer": "Kontoin hjá tær er ikki {locked}. Øll kunnu fylgja tær og lesa tað, tú bert letur fyljgarar lesa.", "compose_form.lock_disclaimer.lock": "læst", "compose_form.placeholder": "Hvat hevur tú í huga?", - "compose_form.poll.add_option": "Legg valmøguleika afturat", "compose_form.poll.duration": "Atkvøðugreiðslutíð", "compose_form.poll.multiple": "Fleiri valmøguleikar", "compose_form.poll.option_placeholder": "Valmøguleiki {number}", - "compose_form.poll.remove_option": "Strika hendan valmøguleikan", "compose_form.poll.single": "Vel ein", "compose_form.poll.switch_to_multiple": "Broyt atkvøðugreiðslu til at loyva fleiri svarum", "compose_form.poll.switch_to_single": "Broyt atkvøðugreiðslu til einstakt svar", @@ -279,6 +277,12 @@ "follow_request.authorize": "Veit myndugleika", "follow_request.reject": "Nokta", "follow_requests.unlocked_explanation": "Sjálvt um konta tín ikki er læst, so hugsa {domain} starvsfólkini, at tú kanska hevur hug at kanna umbønir um at fylgja frá hesum kontum við hond.", + "follow_suggestions.curated_suggestion": "Val umsjónarfólksins", + "follow_suggestions.dismiss": "Lat vera við at vísa", + "follow_suggestions.personalized_suggestion": "Persónligt uppskot", + "follow_suggestions.popular_suggestion": "Vælumtókt uppskot", + "follow_suggestions.view_all": "Vís øll", + "follow_suggestions.who_to_follow": "Hvørji tú átti at fylgt", "followed_tags": "Fylgd frámerki", "footer.about": "Um", "footer.directory": "Vangaskrá", @@ -305,13 +309,9 @@ "hashtag.follow": "Fylg frámerki", "hashtag.unfollow": "Gevst at fylgja frámerki", "hashtags.and_other": "…og {count, plural, other {# afturat}}", - "home.actions.go_to_explore": "Sí rákið", - "home.actions.go_to_suggestions": "Finn fólk at fylgja", "home.column_settings.basic": "Grundleggjandi", "home.column_settings.show_reblogs": "Vís lyft", "home.column_settings.show_replies": "Vís svar", - "home.explore_prompt.body": "Heimarásin fer at hava eitt bland av postum frá frámerkjunum, sum tú hevur valt at fylgja, brúkarunum, tú hevur valt at fylgja, og postunum, sum tey stimbra. Um tað kennist ov friðarligt, so kanst tú:", - "home.explore_prompt.title": "Hetta er tín heimastøð í Mastodon.", "home.hide_announcements": "Fjal kunngerðir", "home.pending_critical_update.body": "Vinarliga dagfør Mastodon ambætaran hjá tær so skjótt sum møguligt!", "home.pending_critical_update.link": "Sí dagføringar", diff --git a/app/javascript/mastodon/locales/fr-CA.json b/app/javascript/mastodon/locales/fr-CA.json index 66a7da6d15..49db30d75e 100644 --- a/app/javascript/mastodon/locales/fr-CA.json +++ b/app/javascript/mastodon/locales/fr-CA.json @@ -146,11 +146,19 @@ "compose_form.lock_disclaimer.lock": "verrouillé", "compose_form.placeholder": "À quoi pensez-vous?", "compose_form.poll.duration": "Durée du sondage", + "compose_form.poll.multiple": "Choix multiple", + "compose_form.poll.option_placeholder": "Option {number}", + "compose_form.poll.single": "Choisissez-en un", "compose_form.poll.switch_to_multiple": "Changer le sondage pour autoriser plusieurs choix", "compose_form.poll.switch_to_single": "Changer le sondage pour n'autoriser qu'un seul choix", + "compose_form.poll.type": "Style", + "compose_form.publish": "Publier", "compose_form.publish_form": "Publier", + "compose_form.reply": "Répondre", + "compose_form.save_changes": "Mis à jour", "compose_form.spoiler.marked": "Enlever l'avertissement de contenu", "compose_form.spoiler.unmarked": "Ajouter un avertissement de contenu", + "compose_form.spoiler_placeholder": "Avertissement de contenu (optionnel)", "confirmation_modal.cancel": "Annuler", "confirmations.block.block_and_report": "Bloquer et signaler", "confirmations.block.confirm": "Bloquer", @@ -295,13 +303,9 @@ "hashtag.follow": "Suivre ce hashtag", "hashtag.unfollow": "Ne plus suivre ce hashtag", "hashtags.and_other": "…et {count, plural, other {# de plus}}", - "home.actions.go_to_explore": "Voir les tendances", - "home.actions.go_to_suggestions": "Trouver des personnes à suivre", "home.column_settings.basic": "Basique", "home.column_settings.show_reblogs": "Afficher boosts", "home.column_settings.show_replies": "Afficher réponses", - "home.explore_prompt.body": "Votre fil d'actualité aura un mélange de messages depuis les hashtags que vous avez choisi de suivre, les personnes que vous avez choisi de suivre, et les messages qu'elles boostent. Si ça vous semble trop calme à votre goût, n’hésitez pas à :", - "home.explore_prompt.title": "C'est votre page d'accueil dans Mastodon.", "home.hide_announcements": "Masquer les annonces", "home.pending_critical_update.body": "Veuillez mettre à jour votre serveur Mastodon dès que possible !", "home.pending_critical_update.link": "Voir les mises à jour", @@ -514,7 +518,15 @@ "poll_button.add_poll": "Ajouter un sondage", "poll_button.remove_poll": "Supprimer le sondage", "privacy.change": "Changer la confidentialité des messages", + "privacy.direct.long": "Toutes les personnes mentionnées dans le post", + "privacy.direct.short": "Personnes spécifiques", + "privacy.private.long": "Seulement vos abonnés", + "privacy.private.short": "Abonnés", + "privacy.public.long": "Tout le monde sur et en dehors de Mastodon", "privacy.public.short": "Public", + "privacy.unlisted.additional": "Cette option se comporte exactement comme l'option publique, sauf que le message n'apparaîtra pas dans les flux en direct, les hashtags, l'exploration ou la recherche Mastodon, même si vous avez opté pour l'option publique pour l'ensemble de votre compte.", + "privacy.unlisted.long": "Moins de fanfares algorithmiques", + "privacy.unlisted.short": "Public calme", "privacy_policy.last_updated": "Dernière mise à jour {date}", "privacy_policy.title": "Politique de confidentialité", "recommended": "Recommandé", @@ -532,7 +544,9 @@ "relative_time.minutes": "{number} min", "relative_time.seconds": "{number} s", "relative_time.today": "aujourd’hui", + "reply_indicator.attachments": "{count, plural, one {# pièce jointe} other {# pièces jointes}}", "reply_indicator.cancel": "Annuler", + "reply_indicator.poll": "Sondage", "report.block": "Bloquer", "report.block_explanation": "Vous ne verrez plus les publications de ce compte. Il ne pourra ni vous suivre ni voir vos publications. Il pourra savoir qu'il a été bloqué.", "report.categories.legal": "Légal", diff --git a/app/javascript/mastodon/locales/fr.json b/app/javascript/mastodon/locales/fr.json index 2d0fa3b7dd..1f657c8185 100644 --- a/app/javascript/mastodon/locales/fr.json +++ b/app/javascript/mastodon/locales/fr.json @@ -146,11 +146,19 @@ "compose_form.lock_disclaimer.lock": "verrouillé", "compose_form.placeholder": "Qu’avez-vous en tête ?", "compose_form.poll.duration": "Durée du sondage", + "compose_form.poll.multiple": "Choix multiple", + "compose_form.poll.option_placeholder": "Option {number}", + "compose_form.poll.single": "Choisissez-en un", "compose_form.poll.switch_to_multiple": "Changer le sondage pour autoriser plusieurs choix", "compose_form.poll.switch_to_single": "Modifier le sondage pour autoriser qu'un seul choix", + "compose_form.poll.type": "Style", + "compose_form.publish": "Publier", "compose_form.publish_form": "Nouvelle publication", + "compose_form.reply": "Répondre", + "compose_form.save_changes": "Mis à jour", "compose_form.spoiler.marked": "Enlever l’avertissement de contenu", "compose_form.spoiler.unmarked": "Ajouter un avertissement de contenu", + "compose_form.spoiler_placeholder": "Avertissement de contenu (optionnel)", "confirmation_modal.cancel": "Annuler", "confirmations.block.block_and_report": "Bloquer et signaler", "confirmations.block.confirm": "Bloquer", @@ -295,13 +303,9 @@ "hashtag.follow": "Suivre le hashtag", "hashtag.unfollow": "Ne plus suivre le hashtag", "hashtags.and_other": "…et {count, plural, other {# de plus}}", - "home.actions.go_to_explore": "Voir les tendances", - "home.actions.go_to_suggestions": "Trouver des personnes à suivre", "home.column_settings.basic": "Basique", "home.column_settings.show_reblogs": "Afficher les partages", "home.column_settings.show_replies": "Afficher les réponses", - "home.explore_prompt.body": "Votre fil d'actualité aura un mélange de messages depuis les hashtags que vous avez choisi de suivre, les personnes que vous avez choisi de suivre, et les messages qu'elles boostent. Si ça vous semble trop calme à votre goût, n’hésitez pas à :", - "home.explore_prompt.title": "C'est votre page d'accueil dans Mastodon.", "home.hide_announcements": "Masquer les annonces", "home.pending_critical_update.body": "Veuillez mettre à jour votre serveur Mastodon dès que possible !", "home.pending_critical_update.link": "Voir les mises à jour", @@ -514,7 +518,15 @@ "poll_button.add_poll": "Ajouter un sondage", "poll_button.remove_poll": "Supprimer le sondage", "privacy.change": "Ajuster la confidentialité du message", + "privacy.direct.long": "Toutes les personnes mentionnées dans le post", + "privacy.direct.short": "Personnes spécifiques", + "privacy.private.long": "Seulement vos abonnés", + "privacy.private.short": "Abonnés", + "privacy.public.long": "Tout le monde sur et en dehors de Mastodon", "privacy.public.short": "Public", + "privacy.unlisted.additional": "Cette option se comporte exactement comme l'option publique, sauf que le message n'apparaîtra pas dans les flux en direct, les hashtags, l'exploration ou la recherche Mastodon, même si vous avez opté pour l'option publique pour l'ensemble de votre compte.", + "privacy.unlisted.long": "Moins de fanfares algorithmiques", + "privacy.unlisted.short": "Public calme", "privacy_policy.last_updated": "Dernière mise à jour {date}", "privacy_policy.title": "Politique de confidentialité", "recommended": "Recommandé", @@ -532,7 +544,9 @@ "relative_time.minutes": "{number} min", "relative_time.seconds": "{number} s", "relative_time.today": "aujourd’hui", + "reply_indicator.attachments": "{count, plural, one {# pièce jointe} other {# pièces jointes}}", "reply_indicator.cancel": "Annuler", + "reply_indicator.poll": "Sondage", "report.block": "Bloquer", "report.block_explanation": "Vous ne verrez plus les messages de ce profil, et il ne pourra ni vous suivre ni voir vos messages. Il pourra savoir qu'il a été bloqué.", "report.categories.legal": "Légal", diff --git a/app/javascript/mastodon/locales/fy.json b/app/javascript/mastodon/locales/fy.json index d5f22d2ee1..9bd5327c8f 100644 --- a/app/javascript/mastodon/locales/fy.json +++ b/app/javascript/mastodon/locales/fy.json @@ -146,11 +146,19 @@ "compose_form.lock_disclaimer.lock": "beskoattele", "compose_form.placeholder": "Wat wolle jo kwyt?", "compose_form.poll.duration": "Doer fan de enkête", + "compose_form.poll.multiple": "Mearkar", + "compose_form.poll.option_placeholder": "Opsje {number}", + "compose_form.poll.single": "Kies ien", "compose_form.poll.switch_to_multiple": "Enkête wizigje om meardere karren ta te stean", "compose_form.poll.switch_to_single": "Enkête wizigje om in inkelde kar ta te stean", + "compose_form.poll.type": "Styl", + "compose_form.publish": "Toot", "compose_form.publish_form": "Publisearje", + "compose_form.reply": "Reagearje", + "compose_form.save_changes": "Bywurkje", "compose_form.spoiler.marked": "Ynhâldswarskôging fuortsmite", "compose_form.spoiler.unmarked": "Ynhâldswarskôging tafoegje", + "compose_form.spoiler_placeholder": "Ynhâldswarskôging (opsjoneel)", "confirmation_modal.cancel": "Annulearje", "confirmations.block.block_and_report": "Blokkearje en rapportearje", "confirmations.block.confirm": "Blokkearje", @@ -269,6 +277,12 @@ "follow_request.authorize": "Goedkarre", "follow_request.reject": "Wegerje", "follow_requests.unlocked_explanation": "Ek al is jo account net besletten, de meiwurkers fan {domain} tinke dat jo miskien de folgjende folchfersiken hânmjittich kontrolearje.", + "follow_suggestions.curated_suggestion": "Kar fan de moderator", + "follow_suggestions.dismiss": "Net mear werjaan", + "follow_suggestions.personalized_suggestion": "Personalisearre suggestje", + "follow_suggestions.popular_suggestion": "Populêre suggestje", + "follow_suggestions.view_all": "Alles werjaan", + "follow_suggestions.who_to_follow": "Wa te folgjen", "followed_tags": "Folge hashtags", "footer.about": "Oer", "footer.directory": "Profylmap", @@ -295,13 +309,9 @@ "hashtag.follow": "Hashtag folgje", "hashtag.unfollow": "Hashtag ûntfolgje", "hashtags.and_other": "…en {count, plural, one {}other {# mear}}", - "home.actions.go_to_explore": "De aktuele trends besjen", - "home.actions.go_to_suggestions": "Sykje minsken om te folgjen", "home.column_settings.basic": "Algemien", "home.column_settings.show_reblogs": "Boosts toane", "home.column_settings.show_replies": "Reaksjes toane", - "home.explore_prompt.body": "Jo starttiidline befettet in miks fan berjochten mei hashtags dy’t jo keazen hawwe om te folgjen, fan minsken dy’t jo keazen hawwe om te folgjen en berjochten dy’t se booste. As jo dit te rêstich fine, kinne jo:", - "home.explore_prompt.title": "Dit is jo thúsbasis op Mastodon.", "home.hide_announcements": "Meidielingen ferstopje", "home.pending_critical_update.body": "Fernij sa gau as mooglik jo Mastodon-server!", "home.pending_critical_update.link": "Fernijingen besjen", @@ -514,7 +524,15 @@ "poll_button.add_poll": "Poll tafoegje", "poll_button.remove_poll": "Enkête fuortsmite", "privacy.change": "Sichtberheid fan berjocht oanpasse", + "privacy.direct.long": "Elkenien dy’ yn it berjocht fermeld wurdt", + "privacy.direct.short": "Bepaalde minsken", + "privacy.private.long": "Allinnich jo folgers", + "privacy.private.short": "Folgers", + "privacy.public.long": "Elkenien op Mastodon en dêrbûten", "privacy.public.short": "Iepenbier", + "privacy.unlisted.additional": "Dit is fergelykber mei iepenbier, útsein dat it berjocht net ferskynt op iepenbiere tiidlijnen of hashtags, ûnder ferkenne of Mastodon sykje, sels as jo jo account dêrfoar ynsteld hawwe.", + "privacy.unlisted.long": "Minder algoritmyske fanfare", + "privacy.unlisted.short": "Minder iepenbier", "privacy_policy.last_updated": "Lêst bywurke op {date}", "privacy_policy.title": "Privacybelied", "recommended": "Oanrekommandearre", @@ -532,7 +550,9 @@ "relative_time.minutes": "{number}m", "relative_time.seconds": "{number}s", "relative_time.today": "hjoed", + "reply_indicator.attachments": "{count, plural, one {# bylage} other {# bylagen}}", "reply_indicator.cancel": "Annulearje", + "reply_indicator.poll": "Peiling", "report.block": "Blokkearje", "report.block_explanation": "Jo sille harren berjochten net sjen kinne. Se sille jo berjochten net sjen kinne en jo net folgje kinne. Se sille wol sjen kinne dat se blokkearre binne.", "report.categories.legal": "Juridysk", diff --git a/app/javascript/mastodon/locales/ga.json b/app/javascript/mastodon/locales/ga.json index 855a27d057..329286277d 100644 --- a/app/javascript/mastodon/locales/ga.json +++ b/app/javascript/mastodon/locales/ga.json @@ -226,6 +226,12 @@ "follow_request.authorize": "Ceadaigh", "follow_request.reject": "Diúltaigh", "follow_requests.unlocked_explanation": "Cé nach bhfuil do chuntas faoi ghlas, cheap foireann {domain} gur mhaith leat súil siar ar iarratais leanúnaí as na cuntais seo.", + "follow_suggestions.curated_suggestion": "Rogha an eagarthóra", + "follow_suggestions.dismiss": "Ná taispeáin arís", + "follow_suggestions.personalized_suggestion": "Nod pearsantaithe", + "follow_suggestions.popular_suggestion": "Nod coiteann", + "follow_suggestions.view_all": "Féach uile", + "follow_suggestions.who_to_follow": "Cé le leanúint", "footer.about": "Maidir le", "footer.directory": "Eolaire próifílí", "footer.get_app": "Faigh an aip", diff --git a/app/javascript/mastodon/locales/gd.json b/app/javascript/mastodon/locales/gd.json index 0c7ef79cd8..47b1e23192 100644 --- a/app/javascript/mastodon/locales/gd.json +++ b/app/javascript/mastodon/locales/gd.json @@ -21,6 +21,7 @@ "account.blocked": "’Ga bhacadh", "account.browse_more_on_origin_server": "Rùraich barrachd dheth air a’ phròifil thùsail", "account.cancel_follow_request": "Sguir dhen leantainn", + "account.copy": "Dèan lethbhreac dhen cheangal dhan phròifil", "account.direct": "Thoir iomradh air @{name} gu prìobhaideach", "account.disable_notifications": "Na cuir brath thugam tuilleadh nuair a chuireas @{name} post ris", "account.domain_blocked": "Chaidh an àrainn a bhacadh", @@ -31,6 +32,7 @@ "account.featured_tags.last_status_never": "Gun phost", "account.featured_tags.title": "Na tagaichean hais brosnaichte aig {name}", "account.follow": "Lean", + "account.follow_back": "Lean air ais", "account.followers": "Luchd-leantainn", "account.followers.empty": "Chan eil neach sam bith a’ leantainn air a’ chleachdaiche seo fhathast.", "account.followers_counter": "{count, plural, one {{counter} neach-leantainn} two {{counter} neach-leantainn} few {{counter} luchd-leantainn} other {{counter} luchd-leantainn}}", @@ -51,6 +53,7 @@ "account.mute_notifications_short": "Mùch na brathan", "account.mute_short": "Mùch", "account.muted": "’Ga mhùchadh", + "account.mutual": "Co-dhàimh", "account.no_bio": "Cha deach tuairisgeul a sholar.", "account.open_original_page": "Fosgail an duilleag thùsail", "account.posts": "Postaichean", @@ -143,11 +146,19 @@ "compose_form.lock_disclaimer.lock": "glaiste", "compose_form.placeholder": "Dè tha air d’ aire?", "compose_form.poll.duration": "Faide a’ chunntais-bheachd", + "compose_form.poll.multiple": "Iomadh roghainn", + "compose_form.poll.option_placeholder": "Roghainn {number}", + "compose_form.poll.single": "Tagh aonan", "compose_form.poll.switch_to_multiple": "Atharraich an cunntas-bheachd ach an gabh iomadh roghainn a thaghadh", "compose_form.poll.switch_to_single": "Atharraich an cunntas-bheachd gus nach gabh ach aon roghainn a thaghadh", + "compose_form.poll.type": "Stoidhle", + "compose_form.publish": "Postaich", "compose_form.publish_form": "Post ùr", + "compose_form.reply": "Freagair", + "compose_form.save_changes": "Ùraich", "compose_form.spoiler.marked": "Thoir air falbh an rabhadh susbainte", "compose_form.spoiler.unmarked": "Cuir rabhadh susbainte ris", + "compose_form.spoiler_placeholder": "Rabhadh susbainte (roghainneil)", "confirmation_modal.cancel": "Sguir dheth", "confirmations.block.block_and_report": "Bac ⁊ dèan gearan", "confirmations.block.confirm": "Bac", @@ -179,6 +190,7 @@ "conversation.mark_as_read": "Cuir comharra gun deach a leughadh", "conversation.open": "Seall an còmhradh", "conversation.with": "Còmhla ri {names}", + "copy_icon_button.copied": "Chaidh lethbhreac dheth a chur air an stòr-bhòrd", "copypaste.copied": "Chaidh lethbhreac dheth a dhèanamh", "copypaste.copy_to_clipboard": "Cuir lethbhreac dheth air an stòr-bhòrd", "directory.federated": "On cho-shaoghal aithnichte", @@ -210,6 +222,7 @@ "emoji_button.search_results": "Toraidhean an luirg", "emoji_button.symbols": "Samhlaidhean", "emoji_button.travel": "Siubhal ⁊ àitichean", + "empty_column.account_hides_collections": "Chuir an cleachdaiche seo roimhe nach eil am fiosrachadh seo ri fhaighinn", "empty_column.account_suspended": "Chaidh an cunntas a chur à rèim", "empty_column.account_timeline": "Chan eil post an-seo!", "empty_column.account_unavailable": "Chan eil a’ phròifil ri làimh", @@ -264,6 +277,12 @@ "follow_request.authorize": "Ùghdarraich", "follow_request.reject": "Diùlt", "follow_requests.unlocked_explanation": "Ged nach eil an cunntas agad glaiste, tha sgioba {domain} dhen bheachd gum b’ fheàirrde thu lèirmheas a dhèanamh air na h-iarrtasan leantainn o na cunntasan seo a làimh.", + "follow_suggestions.curated_suggestion": "Roghainn an deasaiche", + "follow_suggestions.dismiss": "Na seall seo a-rithist", + "follow_suggestions.personalized_suggestion": "Moladh pearsanaichte", + "follow_suggestions.popular_suggestion": "Moladh air a bheil fèill mhòr", + "follow_suggestions.view_all": "Seall na h-uile", + "follow_suggestions.who_to_follow": "Cò a leanas tu", "followed_tags": "Tagaichean hais ’gan leantainn", "footer.about": "Mu dhèidhinn", "footer.directory": "Eòlaire nam pròifil", @@ -290,13 +309,9 @@ "hashtag.follow": "Lean an taga hais", "hashtag.unfollow": "Na lean an taga hais tuilleadh", "hashtags.and_other": "…agus {count, plural, one {# eile} two {# eile} few {# eile} other {# eile}}", - "home.actions.go_to_explore": "Faic na tha a’ treandadh", - "home.actions.go_to_suggestions": "Lorg daoine gus an leantainn", "home.column_settings.basic": "Bunasach", "home.column_settings.show_reblogs": "Seall na brosnachaidhean", "home.column_settings.show_replies": "Seall na freagairtean", - "home.explore_prompt.body": "Bidh measgachadh de phostaichean o na tagaichean hais a leanas tu, na daoine a leanas tu is na postaichean a bhrosnaicheas iad air do dhachaigh. Ma tha cùisean ro shàmhach dhut, seo nas urrainn dhut a dhèanamh:", - "home.explore_prompt.title": "Seo do dhachaigh am broinn Mastodon.", "home.hide_announcements": "Falaich na brathan-fios", "home.pending_critical_update.body": "Ùraich am frithealaiche Mastodon agad cho luath ’s a ghabhas!", "home.pending_critical_update.link": "Faic na h-ùrachaidhean", @@ -377,6 +392,7 @@ "lists.search": "Lorg am measg nan daoine a leanas tu", "lists.subheading": "Na liostaichean agad", "load_pending": "{count, plural, one {# nì ùr} two {# nì ùr} few {# nithean ùra} other {# nì ùr}}", + "loading_indicator.label": "’Ga luchdadh…", "media_gallery.toggle_visible": "{number, plural, 1 {Falaich an dealbh} one {Falaich na dealbhan} two {Falaich na dealbhan} few {Falaich na dealbhan} other {Falaich na dealbhan}}", "moved_to_account_banner.text": "Tha an cunntas {disabledAccount} agad à comas on a rinn thu imrich gu {movedToAccount}.", "mute_modal.duration": "Faide", @@ -464,6 +480,15 @@ "onboarding.follows.empty": "Gu mì-fhortanach, chan urrainn dhuinn toradh a shealltainn an-dràsta. Feuch gleus an luirg no duilleag an rùrachaidh airson daoine ri leantainn a lorg no feuch ris a-rithist an ceann tamaill.", "onboarding.follows.lead": "’S e do prìomh-doras do Mhastodon a th’ ann san dachaigh. Mar as motha an t-uiread de dhaoine a leanas tu ’s ann nas beòthaile inntinniche a bhios i. Seo moladh no dhà dhut airson tòiseachadh:", "onboarding.follows.title": "Cuir dreach pearsanta air do dhachaigh", + "onboarding.profile.discoverable": "Bu mhath leam gun gabh a’ phròifil agam a lorg", + "onboarding.profile.display_name": "Ainm-taisbeanaidh", + "onboarding.profile.display_name_hint": "D’ ainm slàn no spòrsail…", + "onboarding.profile.note": "Cunntas-beatha", + "onboarding.profile.note_hint": "’S urrainn dhut @iomradh a thoirt air càch no air #tagaicheanHais…", + "onboarding.profile.save_and_continue": "Sàbhail ’s lean air adhart", + "onboarding.profile.title": "Suidheachadh na pròifile", + "onboarding.profile.upload_avatar": "Luchdaich suas dealbh na pròifil", + "onboarding.profile.upload_header": "Luchdaich suas bann-cinn na pròifil", "onboarding.share.lead": "Innis do dhaoine mar a gheibh iad grèim ort air Mastodon!", "onboarding.share.message": "Is mise {username} air #Mastodon! Thig ’gam leantainn air {url}", "onboarding.share.next_steps": "Ceuman eile as urrainn dhut gabhail:", @@ -497,9 +522,16 @@ "poll_button.add_poll": "Cuir cunntas-bheachd ris", "poll_button.remove_poll": "Thoir air falbh an cunntas-bheachd", "privacy.change": "Cuir gleus air prìobhaideachd a’ phuist", + "privacy.direct.long": "A h-uile duine air a bheil iomradh sa phost", + "privacy.direct.short": "Daoine àraidh", + "privacy.private.long": "An luchd-leantainn agad a-mhàin", + "privacy.private.short": "Luchd-leantainn", + "privacy.public.long": "Duine sam bith taobh a-staigh no a-muigh Mhastodon", "privacy.public.short": "Poblach", + "privacy.unlisted.short": "Poblach ach sàmhach", "privacy_policy.last_updated": "An t-ùrachadh mu dheireadh {date}", "privacy_policy.title": "Poileasaidh prìobhaideachd", + "recommended": "Molta", "refresh": "Ath-nuadhaich", "regeneration_indicator.label": "’Ga luchdadh…", "regeneration_indicator.sublabel": "Tha do dhachaigh ’ga ullachadh!", @@ -514,7 +546,9 @@ "relative_time.minutes": "{number}m", "relative_time.seconds": "{number}d", "relative_time.today": "an-diugh", + "reply_indicator.attachments": "{count, plural, one {# cheanglachan} two {# cheanglachan} few {# ceanglachain} other {# ceanglachan}}", "reply_indicator.cancel": "Sguir dheth", + "reply_indicator.poll": "Cunntas-bheachd", "report.block": "Bac", "report.block_explanation": "Chan fhaic thu na postaichean aca. Chan fhaic iad na postaichean agad is chan urrainn dhaibh do leantainn. Bheir iad an aire gun deach am bacadh.", "report.categories.legal": "Laghail", @@ -570,6 +604,7 @@ "search.quick_action.status_search": "Postaichean a fhreagras ri {x}", "search.search_or_paste": "Dèan lorg no cuir a-steach URL", "search_popout.full_text_search_disabled_message": "Chan eil seo ri fhaighinn air {domain}.", + "search_popout.full_text_search_logged_out_message": "Chan eil seo ri fhaighinn ach nuair a bhios tu air do chlàradh a-steach.", "search_popout.language_code": "Còd cànain ISO", "search_popout.options": "Roghainnean luirg", "search_popout.quick_actions": "Grad-ghnìomhan", diff --git a/app/javascript/mastodon/locales/gl.json b/app/javascript/mastodon/locales/gl.json index ffd01a547d..7512740c5e 100644 --- a/app/javascript/mastodon/locales/gl.json +++ b/app/javascript/mastodon/locales/gl.json @@ -146,11 +146,19 @@ "compose_form.lock_disclaimer.lock": "bloqueada", "compose_form.placeholder": "Que contas?", "compose_form.poll.duration": "Duración da enquisa", + "compose_form.poll.multiple": "Escolla múltiple", + "compose_form.poll.option_placeholder": "Opción {number}", + "compose_form.poll.single": "Elixe unha", "compose_form.poll.switch_to_multiple": "Mudar a enquisa para permitir múltiples escollas", "compose_form.poll.switch_to_single": "Mudar a enquisa para permitir unha soa opción", + "compose_form.poll.type": "Estilo", + "compose_form.publish": "Publicar", "compose_form.publish_form": "Publicar", + "compose_form.reply": "Responder", + "compose_form.save_changes": "Actualizar", "compose_form.spoiler.marked": "Retirar o aviso sobre o contido", "compose_form.spoiler.unmarked": "Engadir aviso sobre o contido", + "compose_form.spoiler_placeholder": "Aviso sobre o contido (optativo)", "confirmation_modal.cancel": "Cancelar", "confirmations.block.block_and_report": "Bloquear e denunciar", "confirmations.block.confirm": "Bloquear", @@ -269,6 +277,12 @@ "follow_request.authorize": "Autorizar", "follow_request.reject": "Rexeitar", "follow_requests.unlocked_explanation": "Malia que a túa conta non é privada, a administración de {domain} pensou que quizabes terías que revisar de xeito manual as solicitudes de seguiminto.", + "follow_suggestions.curated_suggestion": "O servidor suxíreche", + "follow_suggestions.dismiss": "Non mostrar máis", + "follow_suggestions.personalized_suggestion": "Suxestión personalizada", + "follow_suggestions.popular_suggestion": "Suxestión popular", + "follow_suggestions.view_all": "Ver todas", + "follow_suggestions.who_to_follow": "A quen seguir", "followed_tags": "Cancelos seguidos", "footer.about": "Acerca de", "footer.directory": "Directorio de perfís", @@ -295,13 +309,9 @@ "hashtag.follow": "Seguir cancelo", "hashtag.unfollow": "Deixar de seguir cancelo", "hashtags.and_other": "…e {count, plural, one {}other {# máis}}", - "home.actions.go_to_explore": "Mira do que se está a falar", - "home.actions.go_to_suggestions": "Atopa persoas ás que seguir", "home.column_settings.basic": "Básico", "home.column_settings.show_reblogs": "Amosar compartidos", "home.column_settings.show_replies": "Amosar respostas", - "home.explore_prompt.body": "A túa cronoloxía de inicio vai ter unha mistura de publicacións procedentes dos cancelos que segues, das persoas que elexiches seguir e das publicacións que elas promoven. Se non tes moito que ler, podes probar a:", - "home.explore_prompt.title": "Iste é o teu fogar en Mastodon.", "home.hide_announcements": "Agochar anuncios", "home.pending_critical_update.body": "Por favor actualiza o antes posible o teu servidor Mastodon!", "home.pending_critical_update.link": "Mira as actualizacións", @@ -514,7 +524,15 @@ "poll_button.add_poll": "Engadir unha enquisa", "poll_button.remove_poll": "Eliminar enquisa", "privacy.change": "Axustar privacidade", + "privacy.direct.long": "Todas as mencionadas na publicación", + "privacy.direct.short": "Persoas concretas", + "privacy.private.long": "Só para seguidoras", + "privacy.private.short": "Seguidoras", + "privacy.public.long": "Para todas dentro e fóra de Mastodon", "privacy.public.short": "Público", + "privacy.unlisted.additional": "Do mesmo xeito que público, menos que a publicación non aparecerá nas cronoloxías en directo ou nos cancelos, en descubrir ou nas buscas de Mastodon, incluso se estivese establecido nas opcións xerais da conta.", + "privacy.unlisted.long": "Menor implicación dos algoritmos", + "privacy.unlisted.short": "Público limitado", "privacy_policy.last_updated": "Actualizado por última vez no {date}", "privacy_policy.title": "Política de Privacidade", "recommended": "Aconsellable", @@ -532,7 +550,9 @@ "relative_time.minutes": "{number}m", "relative_time.seconds": "{number}s", "relative_time.today": "hoxe", + "reply_indicator.attachments": "{count, plural, one {# adxunto} other {# adxuntos}}", "reply_indicator.cancel": "Desbotar", + "reply_indicator.poll": "Enquisa", "report.block": "Bloquear", "report.block_explanation": "Non vas ver as súas publicacións. Nin verá as túas publicacións nin poderá seguirte. Poderá comprobar que as bloqueaches.", "report.categories.legal": "Legal", diff --git a/app/javascript/mastodon/locales/he.json b/app/javascript/mastodon/locales/he.json index d88a8c49c3..bf182a1657 100644 --- a/app/javascript/mastodon/locales/he.json +++ b/app/javascript/mastodon/locales/he.json @@ -145,11 +145,9 @@ "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.multiple": "בחירה מרובה", "compose_form.poll.option_placeholder": "אפשרות {number}", - "compose_form.poll.remove_option": "הסרת אפשרות זו", "compose_form.poll.single": "נא לבחור", "compose_form.poll.switch_to_multiple": "אפשרו בחירה מרובה בסקר", "compose_form.poll.switch_to_single": "אפשרו בחירה בודדת בסקר", @@ -279,6 +277,12 @@ "follow_request.authorize": "הרשאה", "follow_request.reject": "דחיה", "follow_requests.unlocked_explanation": "למרות שחשבונך אינו נעול, צוות {domain} חושב שאולי כדאי לוודא את בקשות המעקב האלה ידנית.", + "follow_suggestions.curated_suggestion": "בחירת העורכים", + "follow_suggestions.dismiss": "לא להציג שוב", + "follow_suggestions.personalized_suggestion": "הצעות מותאמות אישית", + "follow_suggestions.popular_suggestion": "הצעה פופולרית", + "follow_suggestions.view_all": "צפיה בכל", + "follow_suggestions.who_to_follow": "אחרי מי לעקוב", "followed_tags": "התגיות שהחשבון שלך עוקב אחריהן", "footer.about": "אודות", "footer.directory": "ספריית פרופילים", @@ -305,13 +309,9 @@ "hashtag.follow": "לעקוב אחרי תגית", "hashtag.unfollow": "להפסיק לעקוב אחרי תגית", "hashtags.and_other": "…{count, plural,other {ועוד #}}", - "home.actions.go_to_explore": "הצגת מגמות", - "home.actions.go_to_suggestions": "למצוא א.נשים לעקוב אחריהן.ם", "home.column_settings.basic": "למתחילים", "home.column_settings.show_reblogs": "הצגת הדהודים", "home.column_settings.show_replies": "הצגת תגובות", - "home.explore_prompt.body": "פיד הבית שלך יכיל תערובת של הודעות מהתגיות והאנשים שבחרת למעקב, וההודעות שהנעקבים בוחרים להדהד. אם זה נראה שקט מדי כרגע אז מה לגבי:", - "home.explore_prompt.title": "זהו בסיס הבית שלך בתוך מסטודון.", "home.hide_announcements": "הסתר הכרזות", "home.pending_critical_update.body": "יש לעדכן את תוכנת מסטודון בהקדם האפשרי!", "home.pending_critical_update.link": "צפיה בעדכונים", @@ -530,6 +530,9 @@ "privacy.private.short": "עוקבים", "privacy.public.long": "כל הגולשים, מחוברים למסטודון או לא", "privacy.public.short": "פומבי", + "privacy.unlisted.additional": "ההתנהגות דומה להודעה ציבורית, מלבד שההודעה לא תופיע בפיד החי המקומי או בתגיות, תגליות או חיפוש מסטודון, אפילו אם ביקשת שהחשבון כולו יהיה פומבי.", + "privacy.unlisted.long": "פחות חשיפה לאלגוריתמים", + "privacy.unlisted.short": "ציבורי שקט", "privacy_policy.last_updated": "עודכן לאחרונה {date}", "privacy_policy.title": "מדיניות פרטיות", "recommended": "מומלץ", diff --git a/app/javascript/mastodon/locales/hi.json b/app/javascript/mastodon/locales/hi.json index 42f4ca4efa..f88fe19569 100644 --- a/app/javascript/mastodon/locales/hi.json +++ b/app/javascript/mastodon/locales/hi.json @@ -277,8 +277,6 @@ "hashtag.column_settings.tag_toggle": "Include additional tags in this column", "hashtag.follow": "हैशटैग को फॉलो करें", "hashtag.unfollow": "हैशटैग को उनफ़ोल्लोव करें", - "home.actions.go_to_explore": "देखिए क्या पक रहा है", - "home.actions.go_to_suggestions": "अनुसरने के लिए लोगो को ढूंढे", "home.column_settings.basic": "बुनियादी", "home.column_settings.show_reblogs": "बूस्ट दिखाए", "home.column_settings.show_replies": "जवाबों को दिखाए", diff --git a/app/javascript/mastodon/locales/hr.json b/app/javascript/mastodon/locales/hr.json index cada365fc8..9fe15f5a2d 100644 --- a/app/javascript/mastodon/locales/hr.json +++ b/app/javascript/mastodon/locales/hr.json @@ -261,7 +261,6 @@ "hashtag.column_settings.tag_toggle": "Uključi dodatne oznake za ovaj stupac", "hashtag.follow": "Prati hashtag", "hashtag.unfollow": "Prestani pratiti hashtag", - "home.actions.go_to_explore": "Vidi trendove", "home.column_settings.basic": "Osnovno", "home.column_settings.show_reblogs": "Pokaži boostove", "home.column_settings.show_replies": "Pokaži odgovore", diff --git a/app/javascript/mastodon/locales/hu.json b/app/javascript/mastodon/locales/hu.json index 31bca5652b..8f979e5558 100644 --- a/app/javascript/mastodon/locales/hu.json +++ b/app/javascript/mastodon/locales/hu.json @@ -145,12 +145,10 @@ "compose_form.lock_disclaimer": "A fiókod nincs {locked}. Bárki követni tud, hogy megtekintse a kizárólag követőknek szánt bejegyzéseket.", "compose_form.lock_disclaimer.lock": "zárolva", "compose_form.placeholder": "Mi jár a fejedben?", - "compose_form.poll.add_option": "Opció hozzáadása", "compose_form.poll.duration": "Szavazás időtartama", - "compose_form.poll.multiple": "Több választás", - "compose_form.poll.option_placeholder": "Opció {number}", - "compose_form.poll.remove_option": "Opció eltávolítása", - "compose_form.poll.single": "Egy választása", + "compose_form.poll.multiple": "Több lehetőség", + "compose_form.poll.option_placeholder": "Válasz {number}", + "compose_form.poll.single": "Egyetlen válasz", "compose_form.poll.switch_to_multiple": "Szavazás megváltoztatása több választásosra", "compose_form.poll.switch_to_single": "Szavazás megváltoztatása egyetlen választásosra", "compose_form.poll.type": "Stílus", @@ -160,7 +158,7 @@ "compose_form.save_changes": "Frissítés", "compose_form.spoiler.marked": "Tartalmi figyelmeztetés eltávolítása", "compose_form.spoiler.unmarked": "Tartalmi figyelmeztetés hozzáadása", - "compose_form.spoiler_placeholder": "Tartalom figyelmeztetés (opcionális)", + "compose_form.spoiler_placeholder": "Tartalmi figyelmeztetés (opcionális)", "confirmation_modal.cancel": "Mégsem", "confirmations.block.block_and_report": "Letiltás és jelentés", "confirmations.block.confirm": "Letiltás", @@ -279,6 +277,12 @@ "follow_request.authorize": "Hitelesítés", "follow_request.reject": "Elutasítás", "follow_requests.unlocked_explanation": "Bár a fiókod nincs zárolva, a(z) {domain} csapata úgy gondolta, hogy talán kézzel szeretnéd ellenőrizni ezen fiókok követési kéréseit.", + "follow_suggestions.curated_suggestion": "Szerkesztői ajánlat", + "follow_suggestions.dismiss": "Ne jelenjen meg újra", + "follow_suggestions.personalized_suggestion": "Személyre szabott javaslat", + "follow_suggestions.popular_suggestion": "Népszerű javaslat", + "follow_suggestions.view_all": "Összes megtekintése", + "follow_suggestions.who_to_follow": "Kit érdemes követni", "followed_tags": "Követett hashtagek", "footer.about": "Névjegy", "footer.directory": "Profiltár", @@ -305,13 +309,9 @@ "hashtag.follow": "Hashtag követése", "hashtag.unfollow": "Hashtag követésének megszüntetése", "hashtags.and_other": "…és {count, plural, other {# további}}", - "home.actions.go_to_explore": "Felkapottak megtekintése", - "home.actions.go_to_suggestions": "Követhetők keresése", "home.column_settings.basic": "Általános", "home.column_settings.show_reblogs": "Megtolások megjelenítése", "home.column_settings.show_replies": "Válaszok megjelenítése", - "home.explore_prompt.body": "A saját hírfolyam a követésre kiválasztott hashtagek, a követésre kiválasztott személyek és az általuk népszerűsített bejegyzések keverékét tartalmazza. Ha csendesnek tűnik, akkor megpróbálhatod ezeket:", - "home.explore_prompt.title": "Ez a kezdőpontod a Mastodonon belül.", "home.hide_announcements": "Közlemények elrejtése", "home.pending_critical_update.body": "A lehető leghamarabb frissítsd a Mastodon kiszolgálódat!", "home.pending_critical_update.link": "Frissítések megtekintése", @@ -524,15 +524,15 @@ "poll_button.add_poll": "Új szavazás", "poll_button.remove_poll": "Szavazás eltávolítása", "privacy.change": "Bejegyzés láthatóságának módosítása", - "privacy.direct.long": "Mindenki, akit a bejegyzésben említettek", - "privacy.direct.short": "Adott személyek", - "privacy.private.long": "Csak a követők", + "privacy.direct.long": "Mindenki, akit a bejegyzés említ", + "privacy.direct.short": "Megadott személyek", + "privacy.private.long": "Csak a követőid", "privacy.private.short": "Követők", "privacy.public.long": "Bárki a Mastodonon és azon kívül", "privacy.public.short": "Nyilvános", - "privacy.unlisted.additional": "Ez pontosan úgy viselkedik, mint a nyilvános, kivéve, hogy a bejegyzés nem jelenik meg élő hírcsatornákban vagy hashtagokban, felfedezésben vagy a Mastodon keresésben, még akkor sem, ha az egész fiókra bejelentkezetünk.", + "privacy.unlisted.additional": "Ez pontosan úgy viselkedik, mint a nyilvános, kivéve, hogy a bejegyzés nem jelenik meg élő hírfolyamokban, hashtagekben, felfedezésben vagy a Mastodonos keresésben, még akkor sem, ha ezt az egész fiókra engedélyezted.", "privacy.unlisted.long": "Kevesebb algoritmikus fanfár", - "privacy.unlisted.short": "Csendes nyilvánosság", + "privacy.unlisted.short": "Csendes nyilvános", "privacy_policy.last_updated": "Utoljára frissítve: {date}", "privacy_policy.title": "Adatvédelmi szabályzat", "recommended": "Ajánlott", diff --git a/app/javascript/mastodon/locales/ia.json b/app/javascript/mastodon/locales/ia.json index 14b75a17f4..7b9ab3742b 100644 --- a/app/javascript/mastodon/locales/ia.json +++ b/app/javascript/mastodon/locales/ia.json @@ -7,10 +7,12 @@ "account.add_or_remove_from_list": "Adder o remover ab listas", "account.badges.group": "Gruppo", "account.block": "Blocar @{name}", + "account.block_domain": "Blocar dominio {domain}", "account.block_short": "Blocar", "account.blocked": "Blocate", "account.browse_more_on_origin_server": "Navigar plus sur le profilo original", "account.copy": "Copiar ligamine a profilo", + "account.disable_notifications": "Stoppar le notificationes quando @{name} publica", "account.domain_blocked": "Dominio blocate", "account.edit_profile": "Modificar profilo", "account.enable_notifications": "Notifica me quando @{name} publica", @@ -24,8 +26,10 @@ "account.followers.empty": "Iste usator ancora non ha sequitores.", "account.followers_counter": "{count, plural, one {{counter} sequitor} other {{counter} sequitores}}", "account.following": "Sequente", + "account.follows.empty": "Iste usator ancora non seque nemo.", "account.go_to_profile": "Vader al profilo", "account.hide_reblogs": "Celar boosts de @{name}", + "account.in_memoriam": "In Memoriam.", "account.languages": "Cambiar le linguas subscribite", "account.link_verified_on": "Le proprietate de iste ligamine esseva verificate le {date}", "account.locked_info": "Le stato de confidentialitate de iste conto es definite a blocate. Le proprietario revisa manualmente qui pote sequer lo.", @@ -39,12 +43,16 @@ "account.open_original_page": "Aperir le pagina original", "account.posts": "Messages", "account.posts_with_replies": "Messages e responsas", + "account.requested": "Attendente le approbation. Clicca pro cancellar le requesta de sequer", + "account.requested_follow": "{name} habeva requestate sequer te", "account.share": "Compartir profilo de @{name}", "account.show_reblogs": "Monstrar responsas de @{name}", + "account.statuses_counter": "{count, plural, one {{counter} message} other {{counter} messages}}", "account.unblock": "Disblocar @{name}", "account.unblock_domain": "Disblocar dominio {domain}", "account.unblock_short": "Disblocar", "account.unendorse": "Non evidentiar sur le profilo", + "account.unfollow": "Non plus sequer", "account.unmute": "Non plus silentiar @{name}", "account.unmute_notifications_short": "Non plus silentiar le notificationes", "account.unmute_short": "Non plus silentiar", @@ -76,11 +84,14 @@ "column.mutes": "Usatores silentiate", "column.notifications": "Notificationes", "column.public": "Chronologia federate", + "column_back_button.label": "Retro", "column_header.hide_settings": "Celar le parametros", "column_header.moveLeft_settings": "Mover columna al sinistra", "column_header.moveRight_settings": "Mover columna al dextra", "column_header.show_settings": "Monstrar le parametros", "column_subheading.settings": "Parametros", + "community.column_settings.local_only": "Solmente local", + "community.column_settings.media_only": "Solmente medios", "compose.language.change": "Cambiar le lingua", "compose.language.search": "Cercar linguas...", "compose.published.body": "Message publicate.", @@ -89,11 +100,23 @@ "compose_form.direct_message_warning_learn_more": "Apprender plus", "compose_form.lock_disclaimer": "Tu conto non es {locked}. Quicunque pote sequer te pro vider tu messages solo pro sequitores.", "compose_form.lock_disclaimer.lock": "blocate", + "compose_form.poll.duration": "Duration del inquesta", + "compose_form.poll.multiple": "Selection multiple", + "compose_form.poll.option_placeholder": "Option {number}", + "compose_form.poll.single": "Seliger un", + "compose_form.poll.switch_to_multiple": "Cambiar inquesta pro permitter selectiones multiple", + "compose_form.poll.type": "Stylo", + "compose_form.publish": "Publicar", "compose_form.publish_form": "Nove message", + "compose_form.reply": "Responder", + "compose_form.save_changes": "Actualisar", "compose_form.spoiler.marked": "Remover advertimento de contento", "compose_form.spoiler.unmarked": "Adder advertimento de contento", + "compose_form.spoiler_placeholder": "Advertimento de contento (optional)", "confirmation_modal.cancel": "Cancellar", + "confirmations.block.block_and_report": "Blocar e signalar", "confirmations.block.confirm": "Blocar", + "confirmations.block.message": "Es tu secur que tu vole blocar {name}?", "confirmations.delete.confirm": "Deler", "confirmations.delete.message": "Es tu secur que tu vole deler iste message?", "confirmations.delete_list.confirm": "Deler", @@ -105,6 +128,8 @@ "confirmations.mute.confirm": "Silentiar", "confirmations.mute.message": "Es tu secur que tu vole silentiar {name}?", "confirmations.reply.confirm": "Responder", + "confirmations.unfollow.confirm": "Non plus sequer", + "confirmations.unfollow.message": "Es tu secur que tu vole non plus sequer {name}?", "conversation.delete": "Deler conversation", "conversation.mark_as_read": "Marcar como legite", "conversation.open": "Vider conversation", @@ -114,6 +139,7 @@ "copypaste.copy_to_clipboard": "Copiar al area de transferentia", "directory.federated": "Ab le fediverso cognoscite", "directory.local": "Solmente ab {domain}", + "directory.new_arrivals": "Nove arrivatas", "directory.recently_active": "Recentemente active", "disabled_account_banner.account_settings": "Parametros de conto", "disabled_account_banner.text": "Tu conto {disabledAccount} es actualmente disactivate.", @@ -121,15 +147,24 @@ "emoji_button.activity": "Activitate", "emoji_button.clear": "Rader", "emoji_button.custom": "Personalisate", + "emoji_button.flags": "Bandieras", + "emoji_button.food": "Alimentos e bibitas", + "emoji_button.label": "Inserer emoji", + "emoji_button.nature": "Natura", + "emoji_button.people": "Personas", "emoji_button.recent": "Frequentemente usate", "emoji_button.search": "Cercar...", "emoji_button.search_results": "Resultatos de recerca", + "emoji_button.symbols": "Symbolos", + "emoji_button.travel": "Viages e locos", + "empty_column.account_hides_collections": "Le usator ha seligite non facer iste information disponibile", "empty_column.account_suspended": "Conto suspendite", "empty_column.account_timeline": "Nulle messages hic!", "empty_column.account_unavailable": "Profilo non disponibile", "empty_column.blocks": "Tu non ha blocate alcun usator ancora.", "errors.unexpected_crash.report_issue": "Signalar un defecto", "explore.search_results": "Resultatos de recerca", + "explore.suggested_follows": "Personas", "explore.title": "Explorar", "explore.trending_links": "Novas", "explore.trending_statuses": "Messages", @@ -145,6 +180,11 @@ "firehose.all": "Toto", "firehose.local": "Iste servitor", "firehose.remote": "Altere servitores", + "follow_suggestions.curated_suggestion": "Selection del editores", + "follow_suggestions.dismiss": "Non monstrar novemente", + "follow_suggestions.personalized_suggestion": "Suggestion personalisate", + "follow_suggestions.popular_suggestion": "Suggestion personalisate", + "follow_suggestions.view_all": "Vider toto", "footer.about": "A proposito de", "footer.directory": "Directorio de profilos", "footer.get_app": "Obtene le application", @@ -156,15 +196,20 @@ "getting_started.heading": "Prime passos", "hashtag.column_header.tag_mode.all": "e {additional}", "hashtag.column_header.tag_mode.any": "o {additional}", + "hashtag.column_header.tag_mode.none": "sin {additional}", "hashtag.column_settings.select.no_options_message": "Nulle suggestiones trovate", "hashtag.column_settings.select.placeholder": "Insere hashtags…", "hashtag.follow": "Sequer hashtag", + "hashtag.unfollow": "Non sequer plus le hashtag", + "hashtags.and_other": "…e {count, plural, one {}other {# plus}}", "home.column_settings.show_reblogs": "Monstrar boosts", "home.column_settings.show_replies": "Monstrar responsas", "home.hide_announcements": "Celar annuncios", "home.pending_critical_update.body": "Actualisa tu servitor de Mastodon le plus tosto possibile!", "home.pending_critical_update.link": "Vider actualisationes", + "home.pending_critical_update.title": "Actualisation de securitate critic disponibile!", "home.show_announcements": "Monstrar annuncios", + "interaction_modal.login.prompt": "Dominio de tu servitor, p.e. mastodon.social", "interaction_modal.no_account_yet": "Non sur Mstodon?", "interaction_modal.on_another_server": "In un servitor differente", "interaction_modal.on_this_server": "In iste servitor", @@ -183,8 +228,10 @@ "keyboard_shortcuts.muted": "Aperir lista de usatores silentiate", "keyboard_shortcuts.my_profile": "Aperir tu profilo", "keyboard_shortcuts.notifications": "Aperir columna de notificationes", + "keyboard_shortcuts.profile": "Aperir le profilo del autor", "keyboard_shortcuts.reply": "Responder al message", "keyboard_shortcuts.spoilers": "Monstrar/celar le campo CW", + "keyboard_shortcuts.toggle_sensitivity": "Monstrar/celar medios", "keyboard_shortcuts.toot": "Initiar un nove message", "lightbox.close": "Clauder", "lightbox.next": "Sequente", @@ -198,8 +245,11 @@ "lists.exclusive": "Celar iste messages ab le initio", "lists.new.create": "Adder lista", "lists.new.title_placeholder": "Nove titulo del lista", + "lists.replies_policy.none": "Nemo", "lists.replies_policy.title": "Monstrar responsas a:", "lists.subheading": "Tu listas", + "loading_indicator.label": "Cargante…", + "media_gallery.toggle_visible": "{number, plural, one {Celar imagine} other {Celar imagines}}", "mute_modal.duration": "Duration", "mute_modal.hide_notifications": "Celar notificationes de iste usator?", "navigation_bar.about": "A proposito de", @@ -215,24 +265,34 @@ "navigation_bar.lists": "Listas", "navigation_bar.logout": "Clauder le session", "navigation_bar.mutes": "Usatores silentiate", + "navigation_bar.opened_in_classic_interface": "Messages, contos e altere paginas specific es aperite per predefinition in le interfacie web classic.", + "navigation_bar.personal": "Personal", "navigation_bar.preferences": "Preferentias", "navigation_bar.public_timeline": "Chronologia federate", "navigation_bar.search": "Cercar", "navigation_bar.security": "Securitate", + "notification.own_poll": "Tu inquesta finiva", "notification.update": "{name} modificava un message", "notifications.clear": "Rader notificationes", "notifications.column_settings.alert": "Notificationes de scriptorio", + "notifications.column_settings.favourite": "Favoritos:", "notifications.column_settings.filter_bar.advanced": "Monstrar tote le categorias", "notifications.column_settings.follow": "Nove sequitores:", "notifications.column_settings.mention": "Mentiones:", + "notifications.column_settings.poll": "Resultatos del inquesta:", "notifications.column_settings.push": "Notificationes push", + "notifications.column_settings.show": "Monstrar in columna", "notifications.column_settings.sound": "Reproducer sono", "notifications.column_settings.status": "Nove messages:", + "notifications.column_settings.unread_notifications.category": "Notificationes non legite", "notifications.filter.all": "Toto", "notifications.filter.favourites": "Favoritos", "notifications.filter.mentions": "Mentiones", + "notifications.filter.polls": "Resultatos del inquesta", + "notifications.filter.statuses": "Actualisationes de personas que tu seque", "notifications.grant_permission": "Conceder permission.", "notifications.group": "{count} notificationes", + "notifications_permission_banner.enable": "Activar notificationes de scriptorio", "onboarding.compose.template": "Salute #Mastodon!", "onboarding.profile.save_and_continue": "Salvar e continuar", "onboarding.share.next_steps": "Sequente passos possibile:", diff --git a/app/javascript/mastodon/locales/id.json b/app/javascript/mastodon/locales/id.json index 1670d616fb..88e99a7086 100644 --- a/app/javascript/mastodon/locales/id.json +++ b/app/javascript/mastodon/locales/id.json @@ -270,8 +270,6 @@ "hashtag.column_settings.tag_toggle": "Include additional tags in this column", "hashtag.follow": "Ikuti tagar", "hashtag.unfollow": "Batalkan pengikutan tagar", - "home.actions.go_to_explore": "Lihat apa yang lagi tranding", - "home.actions.go_to_suggestions": "Temukan Orang untuk Diikuti", "home.column_settings.basic": "Dasar", "home.column_settings.show_reblogs": "Tampilkan boost", "home.column_settings.show_replies": "Tampilkan balasan", diff --git a/app/javascript/mastodon/locales/ie.json b/app/javascript/mastodon/locales/ie.json index 5188d137e3..d39aa6cf61 100644 --- a/app/javascript/mastodon/locales/ie.json +++ b/app/javascript/mastodon/locales/ie.json @@ -145,11 +145,9 @@ "compose_form.lock_disclaimer": "Tui conto ne es {locked}. Quicunc posse sequer te por vider tui postas solmen por sequitores.", "compose_form.lock_disclaimer.lock": "cludet", "compose_form.placeholder": "Quo es in tui spiritu?", - "compose_form.poll.add_option": "Adjunter option", "compose_form.poll.duration": "Duration del balotation", "compose_form.poll.multiple": "Selection multiplic", "compose_form.poll.option_placeholder": "Option {number}", - "compose_form.poll.remove_option": "Remover ti-ci option", "compose_form.poll.single": "Selecter un", "compose_form.poll.switch_to_multiple": "Changea li balotation por permisser multiplic selectiones", "compose_form.poll.switch_to_single": "Changea li balotation por permisser un singul selection", @@ -304,13 +302,9 @@ "hashtag.follow": "Sequer hashtag", "hashtag.unfollow": "Dessequer hashtag", "hashtags.and_other": "…e {count, plural, other {# in plu}}", - "home.actions.go_to_explore": "Vider lu populari", - "home.actions.go_to_suggestions": "Trovar gente por sequer", "home.column_settings.basic": "Basic", "home.column_settings.show_reblogs": "Monstrar boosts", "home.column_settings.show_replies": "Monstrar responses", - "home.explore_prompt.body": "Tui hemal témpor-linea have un mixtura del hashtags queles tu selectet sequer, li gente quem tu selectet sequer, e li postas queles ili boosta. Si to sembla tro quiet, tu fórsan vole:", - "home.explore_prompt.title": "To-ci es tui hemal págine in Mastodon.", "home.hide_announcements": "Celar proclamationes", "home.pending_critical_update.body": "Ples actualisar tui Mastodon-servitor tam rapid quam es possibil!", "home.pending_critical_update.link": "Vider actualisationes", diff --git a/app/javascript/mastodon/locales/io.json b/app/javascript/mastodon/locales/io.json index a9dd32c06c..c468f689ab 100644 --- a/app/javascript/mastodon/locales/io.json +++ b/app/javascript/mastodon/locales/io.json @@ -292,13 +292,9 @@ "hashtag.follow": "Sequez hashtago", "hashtag.unfollow": "Desequez hashtago", "hashtags.and_other": "…e {count, plural, one {# plusa}other {# plusa}}", - "home.actions.go_to_explore": "Videz quo es populara nun", - "home.actions.go_to_suggestions": "Trovez personi por sequar", "home.column_settings.basic": "Simpla", "home.column_settings.show_reblogs": "Montrar repeti", "home.column_settings.show_replies": "Montrar respondi", - "home.explore_prompt.body": "Vua hemala fluo havos mixuro de la hashtagi quin vu selektis sequar, la personi quin vu selektis sequar, e la posti quin ili repetis. Se to semblas tro tacanta, vu darfas volar:", - "home.explore_prompt.title": "Co es vua hemo en Mastodon.", "home.hide_announcements": "Celez anunci", "home.pending_critical_update.body": "Voluntez aktualigar vua Mastodon-servilo tam balde kam es posibla!", "home.pending_critical_update.link": "Vidar aktualigaji", diff --git a/app/javascript/mastodon/locales/is.json b/app/javascript/mastodon/locales/is.json index dfece102bb..3c2337efd2 100644 --- a/app/javascript/mastodon/locales/is.json +++ b/app/javascript/mastodon/locales/is.json @@ -145,11 +145,9 @@ "compose_form.lock_disclaimer": "Aðgangurinn þinn er ekki {locked}. Hver sem er getur fylgst með þér til að sjá þær færslur sem einungis eru til fylgjenda þinna.", "compose_form.lock_disclaimer.lock": "læstur", "compose_form.placeholder": "Hvað liggur þér á hjarta?", - "compose_form.poll.add_option": "Bæta við valkosti", "compose_form.poll.duration": "Tímalengd könnunar", "compose_form.poll.multiple": "Margir valkostir", "compose_form.poll.option_placeholder": "Valkostur {number}", - "compose_form.poll.remove_option": "Fjarlægja þennan valkost", "compose_form.poll.single": "Veldu eitt", "compose_form.poll.switch_to_multiple": "Breyta könnun svo hægt sé að hafa marga valkosti", "compose_form.poll.switch_to_single": "Breyta könnun svo hægt sé að hafa einn stakan valkost", @@ -279,13 +277,19 @@ "follow_request.authorize": "Heimila", "follow_request.reject": "Hafna", "follow_requests.unlocked_explanation": "Jafnvel þótt aðgangurinn þinn sé ekki læstur, hafa umsjónarmenn {domain} ímyndað sér að þú gætir viljað yfirfara handvirkt fylgjendabeiðnir frá þessum notendum.", + "follow_suggestions.curated_suggestion": "Úrval umsjónarfólks", + "follow_suggestions.dismiss": "Ekki birta þetta aftur", + "follow_suggestions.personalized_suggestion": "Persónuaðlöguð tillaga", + "follow_suggestions.popular_suggestion": "Vinsæl tillaga", + "follow_suggestions.view_all": "Skoða allt", + "follow_suggestions.who_to_follow": "Hverjum á að fylgjast með", "followed_tags": "Myllumerki sem fylgst er með", "footer.about": "Nánari upplýsingar", "footer.directory": "Notandasniðamappa", "footer.get_app": "Ná í forritið", "footer.invite": "Bjóða fólki", "footer.keyboard_shortcuts": "Flýtileiðir á lyklaborði", - "footer.privacy_policy": "Persónuverndarstefna", + "footer.privacy_policy": "Meðferð persónuupplýsinga", "footer.source_code": "Skoða frumkóða", "footer.status": "Staða", "generic.saved": "Vistað", @@ -305,13 +309,9 @@ "hashtag.follow": "Fylgjast með myllumerki", "hashtag.unfollow": "Hætta að fylgjast með myllumerki", "hashtags.and_other": "…og {count, plural, other {# til viðbótar}}", - "home.actions.go_to_explore": "Sjá hvað er í umræðunni", - "home.actions.go_to_suggestions": "Finna fólk til að fylgjast með", "home.column_settings.basic": "Einfalt", "home.column_settings.show_reblogs": "Sýna endurbirtingar", "home.column_settings.show_replies": "Birta svör", - "home.explore_prompt.body": "Heimastreymið þitt verður með blöndu af færslum úr myllumerkjunum sem þú hefur valið að fylgja, færslum frá fólki sem þú hefur valið að fylgja og færslum sem þau endurbirta. Ef þér finnst þetta allt of kyrrlátt, gætirðu viljað:", - "home.explore_prompt.title": "Þetta er bækistöð þín innan samfélagsins.", "home.hide_announcements": "Fela auglýsingar", "home.pending_critical_update.body": "Uppfærðu Mastodon-þjóninn þinn eins fljótt og mögulegt er!", "home.pending_critical_update.link": "Skoða uppfærslur", @@ -672,7 +672,7 @@ "status.reblogs.empty": "Enginn hefur ennþá endurbirt þessa færslu. Þegar einhver gerir það, mun það birtast hér.", "status.redraft": "Eyða og endurvinna drög", "status.remove_bookmark": "Fjarlægja bókamerki", - "status.replied_to": "Svaraði {name}", + "status.replied_to": "Svaraði til {name}", "status.reply": "Svara", "status.replyAll": "Svara þræði", "status.report": "Kæra @{name}", diff --git a/app/javascript/mastodon/locales/it.json b/app/javascript/mastodon/locales/it.json index 920b80d5a6..db8e88bd2a 100644 --- a/app/javascript/mastodon/locales/it.json +++ b/app/javascript/mastodon/locales/it.json @@ -145,11 +145,9 @@ "compose_form.lock_disclaimer": "Il tuo profilo non è {locked}. Chiunque può seguirti per visualizzare i tuoi post per soli seguaci.", "compose_form.lock_disclaimer.lock": "bloccato", "compose_form.placeholder": "Cos'hai in mente?", - "compose_form.poll.add_option": "Aggiungi opzione", "compose_form.poll.duration": "Durata del sondaggio", "compose_form.poll.multiple": "Scelta multipla", "compose_form.poll.option_placeholder": "Opzione {number}", - "compose_form.poll.remove_option": "Rimuovi questa opzione", "compose_form.poll.single": "Scegli uno", "compose_form.poll.switch_to_multiple": "Modifica il sondaggio per consentire scelte multiple", "compose_form.poll.switch_to_single": "Modifica il sondaggio per consentire una singola scelta", @@ -279,6 +277,12 @@ "follow_request.authorize": "Autorizza", "follow_request.reject": "Rifiuta", "follow_requests.unlocked_explanation": "Anche se il tuo profilo non è privato, lo staff di {domain} ha pensato che potresti voler revisionare manualmente le richieste di seguirti da questi profili.", + "follow_suggestions.curated_suggestion": "Scelta dell'editore", + "follow_suggestions.dismiss": "Non visualizzare più", + "follow_suggestions.personalized_suggestion": "Suggerimenti personalizzati", + "follow_suggestions.popular_suggestion": "Suggerimento frequente", + "follow_suggestions.view_all": "Vedi tutto", + "follow_suggestions.who_to_follow": "Chi seguire", "followed_tags": "Hashtag seguiti", "footer.about": "Info", "footer.directory": "Cartella dei profili", @@ -305,13 +309,9 @@ "hashtag.follow": "Segui l'hashtag", "hashtag.unfollow": "Smetti di seguire l'hashtag", "hashtags.and_other": "…e {count, plural, other {# in più}}", - "home.actions.go_to_explore": "Scopri cosa sia di tendenza", - "home.actions.go_to_suggestions": "Trova persone da seguire", "home.column_settings.basic": "Base", "home.column_settings.show_reblogs": "Mostra reblog", "home.column_settings.show_replies": "Mostra risposte", - "home.explore_prompt.body": "La tua home feed conterrà un mix di post degli hashtag che hai scelto di seguire, delle persone che hai scelto di seguire e dei post che condividono. Sembra abbastanza tranquillo in questo momento, quindi che ne dici di:", - "home.explore_prompt.title": "Questa è la tua base all'interno di Mastodon.", "home.hide_announcements": "Nascondi annunci", "home.pending_critical_update.body": "Ti preghiamo di aggiornare il tuo server di Mastodon, il prima possibile!", "home.pending_critical_update.link": "Visualizza aggiornamenti", diff --git a/app/javascript/mastodon/locales/ja.json b/app/javascript/mastodon/locales/ja.json index e0cc96d571..180963e9e6 100644 --- a/app/javascript/mastodon/locales/ja.json +++ b/app/javascript/mastodon/locales/ja.json @@ -146,11 +146,19 @@ "compose_form.lock_disclaimer.lock": "承認制", "compose_form.placeholder": "今なにしてる?", "compose_form.poll.duration": "アンケート期間", + "compose_form.poll.multiple": "複数選択", + "compose_form.poll.option_placeholder": "項目{number}", + "compose_form.poll.single": "単一選択", "compose_form.poll.switch_to_multiple": "複数選択に変更", "compose_form.poll.switch_to_single": "単一選択に変更", + "compose_form.poll.type": "スタイル", + "compose_form.publish": "投稿", "compose_form.publish_form": "投稿", + "compose_form.reply": "返信", + "compose_form.save_changes": "更新", "compose_form.spoiler.marked": "本文は警告の後ろに隠されます", "compose_form.spoiler.unmarked": "本文は隠されていません", + "compose_form.spoiler_placeholder": "閲覧注意 (オプション)", "confirmation_modal.cancel": "キャンセル", "confirmations.block.block_and_report": "ブロックし通報", "confirmations.block.confirm": "ブロック", @@ -269,6 +277,7 @@ "follow_request.authorize": "許可", "follow_request.reject": "拒否", "follow_requests.unlocked_explanation": "あなたのアカウントは承認制ではありませんが、{domain}のスタッフはこれらのアカウントからのフォローリクエストの確認が必要であると判断しました。", + "follow_suggestions.view_all": "すべて表示", "followed_tags": "フォロー中のハッシュタグ", "footer.about": "概要", "footer.directory": "ディレクトリ", @@ -291,17 +300,13 @@ "hashtag.column_settings.tag_toggle": "このカラムに追加のタグを含める", "hashtag.counter_by_accounts": "{count, plural, other {{counter}人投稿}}", "hashtag.counter_by_uses": "{count, plural, other {{counter}件}}", - "hashtag.counter_by_uses_today": "今日{count, plural, other {{counter}件}}", + "hashtag.counter_by_uses_today": "本日{count, plural, other {#件}}", "hashtag.follow": "ハッシュタグをフォローする", "hashtag.unfollow": "ハッシュタグのフォローを解除", "hashtags.and_other": "ほか{count, plural, other {#個}}", - "home.actions.go_to_explore": "話題をさがす", - "home.actions.go_to_suggestions": "フォローするユーザーを検索", "home.column_settings.basic": "基本設定", "home.column_settings.show_reblogs": "ブースト表示", "home.column_settings.show_replies": "返信表示", - "home.explore_prompt.body": "ユーザーやハッシュタグをフォローすると、この「ホーム」タイムラインに投稿やブーストが流れるようになります。タイムラインをもう少しにぎやかにしてみませんか?", - "home.explore_prompt.title": "Mastodonのタイムラインへようこそ。", "home.hide_announcements": "お知らせを隠す", "home.pending_critical_update.body": "速やかにMastodonサーバーをアップデートしてください。", "home.pending_critical_update.link": "詳細", @@ -514,7 +519,15 @@ "poll_button.add_poll": "アンケートを追加", "poll_button.remove_poll": "アンケートを削除", "privacy.change": "公開範囲を変更", + "privacy.direct.long": "本文で指定した相手のみ", + "privacy.direct.short": "特定の人", + "privacy.private.long": "フォロワーのみ", + "privacy.private.short": "フォロワー", + "privacy.public.long": "すべての人 (Mastodon以外も含む)", "privacy.public.short": "公開", + "privacy.unlisted.additional": "「公開」とほとんど同じですが、リアルタイムフィードやハッシュタグ、探索機能、Mastodon検索などに投稿が表示されない点で「公開」と異なります。また、アカウント設定で投稿の検索や表示を許可している場合でも、この公開範囲を設定した投稿は前述の機能には表示されません。", + "privacy.unlisted.long": "より表示機会の少ない公開", + "privacy.unlisted.short": "ひかえめな公開", "privacy_policy.last_updated": "{date}に更新", "privacy_policy.title": "プライバシーポリシー", "recommended": "おすすめ", @@ -532,7 +545,9 @@ "relative_time.minutes": "{number}分前", "relative_time.seconds": "{number}秒前", "relative_time.today": "今日", + "reply_indicator.attachments": "{count, plural, other {#件のメディア}}", "reply_indicator.cancel": "キャンセル", + "reply_indicator.poll": "アンケート", "report.block": "ブロック", "report.block_explanation": "相手の投稿が表示されなくなります。相手はあなたの投稿を見ることやフォローすることができません。相手はブロックされていることがわかります。", "report.categories.legal": "法令違反", diff --git a/app/javascript/mastodon/locales/kab.json b/app/javascript/mastodon/locales/kab.json index d9388c7048..7fb617518c 100644 --- a/app/javascript/mastodon/locales/kab.json +++ b/app/javascript/mastodon/locales/kab.json @@ -22,6 +22,7 @@ "account.followers_counter": "{count, plural, one {{count} n umeḍfar} other {{count} n imeḍfaren}}", "account.following_counter": "{count, plural, one {{counter} yettwaḍfaren} other {{counter} yettwaḍfaren}}", "account.follows.empty": "Ar tura, amseqdac-agi ur yeṭṭafaṛ yiwen.", + "account.go_to_profile": "Ddu ɣer umaɣnu", "account.hide_reblogs": "Ffer ayen i ibeṭṭu @{name}", "account.link_verified_on": "Taɣara n useɣwen-a tettwasenqed ass n {date}", "account.locked_info": "Amiḍan-agi uslig isekweṛ. D bab-is kan i izemren ad yeǧǧ, s ufus-is, win ara t-iḍefṛen.", @@ -99,6 +100,7 @@ "compose_form.lock_disclaimer.lock": "yettwacekkel", "compose_form.placeholder": "D acu i itezzin deg wallaɣ?", "compose_form.poll.duration": "Tanzagt n tefrant", + "compose_form.poll.single": "Fren yiwen", "compose_form.publish_form": "Suffeɣ", "compose_form.spoiler.marked": "Kkes aḍris yettwaffren deffir n walɣu", "compose_form.spoiler.unmarked": "Rnu aḍris yettwaffren deffir n walɣu", @@ -368,7 +370,9 @@ "report.close": "Immed", "report.forward": "Bren-it ɣeṛ {target}", "report.mute": "Sgugem", + "report.next": "Uḍfiṛ", "report.placeholder": "Iwenniten-nniḍen", + "report.reasons.dislike": "Ur t-ḥemmleɣ ara", "report.reasons.spam": "D aspam", "report.submit": "Azen", "report.target": "Mmel {target}", diff --git a/app/javascript/mastodon/locales/ko.json b/app/javascript/mastodon/locales/ko.json index eae7f8faea..50d9959994 100644 --- a/app/javascript/mastodon/locales/ko.json +++ b/app/javascript/mastodon/locales/ko.json @@ -145,11 +145,9 @@ "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.multiple": "다중 선택", "compose_form.poll.option_placeholder": "{option}번째 항목", - "compose_form.poll.remove_option": "이 항목 삭제", "compose_form.poll.single": "단일 선택", "compose_form.poll.switch_to_multiple": "다중 선택이 가능한 투표로 변경", "compose_form.poll.switch_to_single": "단일 선택 투표로 변경", @@ -160,7 +158,7 @@ "compose_form.save_changes": "수정", "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": "차단", @@ -279,6 +277,12 @@ "follow_request.authorize": "허가", "follow_request.reject": "거부", "follow_requests.unlocked_explanation": "귀하의 계정이 잠긴 계정이 아닐지라도, {domain} 스태프는 이 계정들의 팔로우 요청을 수동으로 처리해 주시면 좋겠다고 생각했습니다.", + "follow_suggestions.curated_suggestion": "중재자의 추천", + "follow_suggestions.dismiss": "다시 보지 않기", + "follow_suggestions.personalized_suggestion": "개인화된 추천", + "follow_suggestions.popular_suggestion": "인기있는 추천", + "follow_suggestions.view_all": "모두 보기", + "follow_suggestions.who_to_follow": "팔로우할 만한 사람", "followed_tags": "팔로우 중인 해시태그", "footer.about": "정보", "footer.directory": "프로필 책자", @@ -305,13 +309,9 @@ "hashtag.follow": "팔로우", "hashtag.unfollow": "팔로우 해제", "hashtags.and_other": "…그리고 {count, plural,other {#개 더}}", - "home.actions.go_to_explore": "무엇이 유행인지 보기", - "home.actions.go_to_suggestions": "팔로우할 사람 찾기", "home.column_settings.basic": "기본", "home.column_settings.show_reblogs": "부스트 표시", "home.column_settings.show_replies": "답글 표시", - "home.explore_prompt.body": "홈 피드에는 내가 팔로우한 해시태그 그리고 팔로우한 사람과 부스트가 함께 나타납니다. 너무 고요하게 느껴진다면, 다음 것들을 살펴볼 수 있습니다.", - "home.explore_prompt.title": "이곳은 마스토돈의 내 본거지입니다.", "home.hide_announcements": "공지사항 숨기기", "home.pending_critical_update.body": "서둘러 마스토돈 서버를 업데이트 하세요!", "home.pending_critical_update.link": "업데이트 보기", @@ -477,7 +477,7 @@ "onboarding.actions.go_to_explore": "무엇이 유행인지 보러 가기", "onboarding.actions.go_to_home": "홈 피드로 가기", "onboarding.compose.template": "안녕 #마스토돈!", - "onboarding.follows.empty": "안타깝지만 아직은 아무 것도 보여드릴 수 없습니다. 검색을 이용하거나 발견하기 페이지에서 팔로우 할 사람을 찾을 수 있습니다. 아니면 잠시 후에 다시 시도하세요.", + "onboarding.follows.empty": "안타깝지만 아직은 아무 것도 보여드릴 수 없습니다. 검색을 이용하거나 둘러보기 페이지에서 팔로우 할 사람을 찾을 수 있습니다. 아니면 잠시 후에 다시 시도하세요.", "onboarding.follows.lead": "홈 피드는 마스토돈을 경험하는 주된 경로입니다. 더 많은 사람들을 팔로우 할수록 더 활발하고 흥미로워질 것입니다. 여기 시작을 위한 몇몇 추천을 드립니다:", "onboarding.follows.title": "내게 맞는 홈 피드 꾸미기", "onboarding.profile.discoverable": "내 프로필을 발견 가능하도록 설정", @@ -526,11 +526,11 @@ "privacy.change": "게시물의 프라이버시 설정을 변경", "privacy.direct.long": "이 게시물에서 언급된 모두", "privacy.direct.short": "특정 인물", - "privacy.private.long": "내 팔로워들에게만", + "privacy.private.long": "내 팔로워만", "privacy.private.short": "팔로워", "privacy.public.long": "마스토돈 내외 모두", "privacy.public.short": "공개", - "privacy.unlisted.additional": "공개와 똑같지만 게시물이 라이브 피드나 해시태그, 발견하기, (계정 설정에서 허용했더라도) 마스토돈 검색에서 제외됩니다.", + "privacy.unlisted.additional": "공개와 똑같지만 게시물이 실시간 피드나 해시태그, 둘러보기, (계정 설정에서 허용했더라도) 마스토돈 검색에서 제외됩니다.", "privacy.unlisted.long": "더 적은 알고리즘 팡파레", "privacy.unlisted.short": "조용한 공개", "privacy_policy.last_updated": "{date}에 마지막으로 업데이트됨", diff --git a/app/javascript/mastodon/locales/lad.json b/app/javascript/mastodon/locales/lad.json index ba99f5cd30..3ec3b6af1b 100644 --- a/app/javascript/mastodon/locales/lad.json +++ b/app/javascript/mastodon/locales/lad.json @@ -4,16 +4,16 @@ "about.disclaimer": "Mastodon es un programario libero, kon kodiche avierto i una marka komersiala de Mastodon gGmbH.", "about.domain_blocks.no_reason_available": "Razon no desponivle", "about.domain_blocks.preamble": "Mastodon djeneralmente te permete ver kontenido de i enteraktuar kon utilizadores de kualseker otro sirvidor en el fediverso. Estas son las eksepsiones en este sirvidor en partikolar.", - "about.domain_blocks.silenced.explanation": "\"Djeneralmente no veras profiles i kontenido de este sirvidor, salvo ke eksplisitamente lo bushkes o sigas algun kuento de el.", + "about.domain_blocks.silenced.explanation": "Djeneralmente no veras profiles i kontenido de este sirvidor, salvo ke eksplisitamente lo bushkes o sigas algun kuento de el.", "about.domain_blocks.silenced.title": "Limitado", - "about.domain_blocks.suspended.explanation": "Dingunos datos de este sirvidor sera prosesado, magazinado o enterkambiado kon este sirvidor. Enteraksyon o komunikasyon kon sus utilizadores sera imposivle.", + "about.domain_blocks.suspended.explanation": "Dingunos datos de este sirvidor seran prosesados, magazinados o enterkambiados. Enteraksyon o komunikasyon kon sus utilizadores sera imposivle.", "about.domain_blocks.suspended.title": "Suspendido", "about.not_available": "Esta enformasyon no esta desponivle en este sirvidor.", "about.powered_by": "Redes sosyalas desentralizadas kon uzo de {mastodon}", "about.rules": "Reglas del sirvidor", "account.account_note_header": "Nota", "account.add_or_remove_from_list": "Adjusta a o kita de listas", - "account.badges.bot": "Bot", + "account.badges.bot": "Otomatizado", "account.badges.group": "Grupo", "account.block": "Bloka @{name}", "account.block_domain": "Bloka el domeno {domain}", @@ -23,13 +23,13 @@ "account.cancel_follow_request": "Anula solisitud de segir", "account.copy": "Kopia atadijo de profil", "account.direct": "Enmenta a @{name} en privado", - "account.disable_notifications": "No me avizes mas sovre publikasyones de @{name}", + "account.disable_notifications": "Desha de avizarme sovre publikasyones de @{name}", "account.domain_blocked": "Domeno blokado", "account.edit_profile": "Edita profil", "account.enable_notifications": "Avizame kuando @{name} publike", "account.endorse": "Avalia en profil", "account.featured_tags.last_status_at": "Ultima publikasyon de {date}", - "account.featured_tags.last_status_never": "\"No ay publikasyones", + "account.featured_tags.last_status_never": "No ay publikasyones", "account.featured_tags.title": "Etiketas avaliadas de {name}", "account.follow": "Sige", "account.follow_back": "Sige tamyen", @@ -38,19 +38,19 @@ "account.followers_counter": "{count, plural, one {{counter} suivante} other {{counter} suivantes}}", "account.following": "Sigiendo", "account.following_counter": "{count, plural, other {Sigiendo a {counter}}}", - "account.follows.empty": "Este utilizador ainda no sige a ningun.", + "account.follows.empty": "Este utilizador ainda no sige a dingun.", "account.go_to_profile": "Va al profil", "account.hide_reblogs": "Eskonde repartajasyones de @{name}", "account.in_memoriam": "De bendicha memoria.", "account.joined_short": "Adjunto", - "account.languages": "Troka linguas suskrividas", + "account.languages": "Troka linguas abonadas", "account.link_verified_on": "La propriedad de este atadijo fue verifikada el {date}", "account.locked_info": "El estado de privasita de este konto esta konfigurado komo serado. El proprietario reviza manualmente kien le puede segir.", "account.media": "Multimedia", "account.mention": "Enmenta a @{name}", "account.moved_to": "{name} tiene endikado ke su muevo kuento agora es:", "account.mute": "Silensia a @{name}", - "account.mute_notifications_short": "Silensia avizos de @{name}", + "account.mute_notifications_short": "Silensia avizos", "account.mute_short": "Silensia", "account.muted": "Silensiado", "account.mutual": "Mutual", @@ -64,7 +64,7 @@ "account.share": "Partaja el profil de @{name}", "account.show_reblogs": "Amostra repartajasyones de @{name}", "account.statuses_counter": "{count, plural, one {{counter} publikasyon} other {{counter} publikasyones}}", - "account.unblock": "Dezbloka @{name}", + "account.unblock": "Dezbloka a @{name}", "account.unblock_domain": "Dezbloka domeno {domain}", "account.unblock_short": "Dezbloka", "account.unendorse": "No avalia en profil", @@ -79,8 +79,8 @@ "admin.dashboard.retention.cohort": "Mez de enrejistrasyon", "admin.dashboard.retention.cohort_size": "Muevos utilizadores", "admin.impact_report.instance_accounts": "Profiles de kuentos esto efasaria", - "admin.impact_report.instance_followers": "Suivantes a los kualos nuestros utilizadores perderian", - "admin.impact_report.instance_follows": "Suivantes a los kualos sus utilizadores perderian", + "admin.impact_report.instance_followers": "Suivantes a los kualos nuestros utilizadores pedrerian", + "admin.impact_report.instance_follows": "Suivantes a los kualos sus utilizadores pedrerian", "admin.impact_report.title": "Rezumen de impakto", "alert.rate_limited.message": "Por favor aprova dempues de {retry_time, time, medium}.", "alert.rate_limited.title": "Trafiko limitado", @@ -88,7 +88,7 @@ "alert.unexpected.title": "Atyo!", "announcement.announcement": "Pregon", "attachments_list.unprocessed": "(no prosesado)", - "audio.hide": "Eskonder audio", + "audio.hide": "Eskonde audio", "boost_modal.combo": "Puedes klikar {combo} para ometer esto la proksima vez", "bundle_column_error.copy_stacktrace": "Kopia el raporto de yerro", "bundle_column_error.error.body": "La pajina solisitada no pudo ser renderada. Podria ser por un yerro en muestro kodiche o un problem de kompatibilita kon el navigador.", @@ -110,7 +110,7 @@ "column.about": "Sovre mozotros", "column.blocks": "Utilizadores blokados", "column.bookmarks": "Markadores", - "column.community": "Linya de tiempo lokala", + "column.community": "Linya lokala", "column.direct": "Enmentaduras privadas", "column.directory": "Eksplora profiles", "column.domain_blocks": "Domenos blokados", @@ -122,7 +122,7 @@ "column.mutes": "Utilizadores silensiados", "column.notifications": "Avizos", "column.pins": "Publikasyones fiksadas", - "column.public": "Linya de tiempo federada", + "column.public": "Linya federada", "column_back_button.label": "Atras", "column_header.hide_settings": "Eskonde opsyones", "column_header.moveLeft_settings": "Move kolumna a la siedra", @@ -146,11 +146,19 @@ "compose_form.lock_disclaimer.lock": "serrado", "compose_form.placeholder": "Ke haber?", "compose_form.poll.duration": "Durasion de anketa", - "compose_form.poll.switch_to_multiple": "Trokar anketa para permeter a eskojer mas ke una opsyon", - "compose_form.poll.switch_to_single": "Trokar anketa para permeter a eskojer solo una opsyon", + "compose_form.poll.multiple": "Multiples opsyones", + "compose_form.poll.option_placeholder": "Opsyon {number}", + "compose_form.poll.single": "Eskoje uno", + "compose_form.poll.switch_to_multiple": "Troka anketa para permeter a eskojer mas ke una opsyon", + "compose_form.poll.switch_to_single": "Troka anketa para permeter a eskojer solo una opsyon", + "compose_form.poll.type": "Estilo", + "compose_form.publish": "Publika", "compose_form.publish_form": "Mueva publikasyon", + "compose_form.reply": "Arisponde", + "compose_form.save_changes": "Aktualiza", "compose_form.spoiler.marked": "Kita avertensya de kontenido", "compose_form.spoiler.unmarked": "Adjusta avertensya de kontenido", + "compose_form.spoiler_placeholder": "Avertensya de kontenido (opsyonal)", "confirmation_modal.cancel": "Anula", "confirmations.block.block_and_report": "Bloka i raporta", "confirmations.block.confirm": "Bloka", @@ -166,16 +174,16 @@ "confirmations.domain_block.confirm": "Bloka domeno entero", "confirmations.domain_block.message": "Estas totalmente siguro ke keres blokar todo el domeno {domain}? En djeneral unos kuantos blokos o silensiamientos son sufisientes i preferavles. No veras kontenido de akel domeno en dinguna linya de tiempo publika ni ent tus avizos. Tus suivantes de akel domeno seran kitados.", "confirmations.edit.confirm": "Edita", - "confirmations.edit.message": "Editar agora kitara el mesaj kualo estas eskriviendo aktualmente. Estas siguro ke keres fazerlo?", + "confirmations.edit.message": "Si edites agora, kitaras el mesaj kualo estas eskriviendo aktualmente. Estas siguro ke keres fazerlo?", "confirmations.logout.confirm": "Sal", "confirmations.logout.message": "Estas siguro ke keres salir de tu kuento?", "confirmations.mute.confirm": "Silensia", "confirmations.mute.explanation": "Esto eskondera las publikasyones de este kuento i publikasyones ke lo enmentan, pero ainda les permetera segirte.", "confirmations.mute.message": "Estas siguro ke keres silensiar a {name}?", - "confirmations.redraft.confirm": "Efasar i reeskrivir", + "confirmations.redraft.confirm": "Efasa i reeskrive", "confirmations.redraft.message": "Estas siguro ke keres efasar esta publikasyon i reeskrivirla? Pedreras todos los favoritos i repartajasyones asosiados kon esta publikasyon i repuestas a eya seran guerfanadas.", "confirmations.reply.confirm": "Arisponde", - "confirmations.reply.message": "Arispondir agora kitara el mesaj kualo estas eskriviendo aktualmente. Estas siguro ke keres fazerlo?", + "confirmations.reply.message": "Si arispondas agora, kitaras el mesaj kualo estas eskriviendo aktualmente. Estas siguro ke keres fazerlo?", "confirmations.unfollow.confirm": "Desige", "confirmations.unfollow.message": "Estas siguro ke keres deshar de segir a {name}?", "conversation.delete": "Efasa konversasyon", @@ -198,13 +206,13 @@ "dismissable_banner.explore_tags": "Estas etiketas estan agora popularas en la red sosyala. Etiketas uzadas por mas djente aparesen primero.", "dismissable_banner.public_timeline": "Estas son las publikasyones publikas mas resientes de personas en la red sosyala a las kualas la djente de {domain} sige.", "embed.instructions": "Enkrusta esta publikasyon en tu sitio internetiko kopiando este kodiche.", - "embed.preview": "Ansi paresera:", + "embed.preview": "Paresera ansina:", "emoji_button.activity": "Aktivita", "emoji_button.clear": "Alimpia", "emoji_button.custom": "Personalizado", "emoji_button.flags": "Bandieras", "emoji_button.food": "Kumidas i beverajes", - "emoji_button.label": "Adjustar emoji", + "emoji_button.label": "Adjusta emoji", "emoji_button.nature": "Natura", "emoji_button.not_found": "Emojis no topados", "emoji_button.objects": "Objektos", @@ -214,7 +222,7 @@ "emoji_button.search_results": "Rizultados de bushkeda", "emoji_button.symbols": "Simbolos", "emoji_button.travel": "Viajes i lugares", - "empty_column.account_hides_collections": "Este utilizador desidio no mostrar esta enformasyon", + "empty_column.account_hides_collections": "Este utilizador desidio no amostrar esta enformasyon", "empty_column.account_suspended": "Kuento suspendido", "empty_column.account_timeline": "No ay publikasyones aki!", "empty_column.account_unavailable": "Profil no desponivle", @@ -225,9 +233,9 @@ "empty_column.domain_blocks": "Ainda no ay domenos blokados.", "empty_column.explore_statuses": "No ay dingunos trendes agora. Mira mas tadre!", "empty_column.favourited_statuses": "Ainda no tienes publikasyones favoritas. Kuando indikes ke una te plaze, se amostrara aki.", - "empty_column.favourites": "Nadie tiene indikado ke le plaze una de tus publikasyones. Kuando algun lo aga, se amostrara aki.", + "empty_column.favourites": "Dingun no tiene indikado ke le plaze una de tus publikasyones. Kuando algun lo ayga, se amostrara aki.", "empty_column.follow_requests": "No tienes dinguna solisitud de suivante. Kuando risivas una, se amostrara aki.", - "empty_column.followed_tags": "Ainda no tienes segido dinguna etiketa. Kuando lo agas, se amostraran aki.", + "empty_column.followed_tags": "Ainda no tienes segido dinguna etiketa. Kuando lo aygas, se amostraran aki.", "empty_column.hashtag": "Ainda no ay niente en esta etiketa.", "empty_column.home": "Tu linya de tiempo esta vaziya! Sige a mas personas para inchirla.", "empty_column.list": "Ainda no ay niente en esta lista. Kuando miembros de esta lista publiken muevas publikasyones, se amostraran aki.", @@ -236,14 +244,14 @@ "empty_column.notifications": "Ainda no tienes dingun avizo. Kuando otras personas enteraktuen kontigo, se amostraran aki.", "empty_column.public": "No ay niente aki! Eskrive algo publikamente o manualmente sige utilizadores de otros sirvidores para inchirlo", "error.unexpected_crash.explanation": "Por un yerro en muestro kodiche o un problem de kompatibilita kon el navigador, no se puede amostrar esta pajina djustamente.", - "error.unexpected_crash.explanation_addons": "No se puede amostrar esta pajina djustamente. Este yerro probavlemente fue kauzado por un komplimento del navigador o por un enstrumento de traduksion.", + "error.unexpected_crash.explanation_addons": "No se puede amostrar esta pajina djustamente. Este yerro probavlemente fue kauzado por un komplimento del navigador o por un enstrumento de traduksyon.", "error.unexpected_crash.next_steps": "Aprova arefreskar la pajina. Si esto no ayuda, es posivle ke ainda puedas kulaenar Mastodon kon otro navigador u otra aplikasyon nativa.", - "error.unexpected_crash.next_steps_addons": "Aprova inkapasitarlos i arefreskar la pajina. Si esto no ayuda, es posivle ke ainda puedas kulanear Mastodon kon otro navigador u otra aplikasyon nativa.", - "errors.unexpected_crash.copy_stacktrace": "Kopiar stacktrace al portapapeles", - "errors.unexpected_crash.report_issue": "Raportar problema", + "error.unexpected_crash.next_steps_addons": "Aprova inkapasitarlos i arefreskar la pajina. Si esto no te ayuda, es posivle ke ainda puedas kulanear Mastodon kon otro navigador u otra aplikasyon nativa.", + "errors.unexpected_crash.copy_stacktrace": "Kopia stacktrace al portapapeles", + "errors.unexpected_crash.report_issue": "Raporta problema", "explore.search_results": "Rizultados de bushkeda", "explore.suggested_follows": "Djente", - "explore.title": "Eksplorar", + "explore.title": "Eksplora", "explore.trending_links": "Haberes", "explore.trending_statuses": "Publikasyones", "explore.trending_tags": "Etiketas", @@ -259,22 +267,28 @@ "filter_modal.select_filter.context_mismatch": "no se aplika a este konteksto", "filter_modal.select_filter.expired": "kadukado", "filter_modal.select_filter.prompt_new": "Mueva kategoria: {name}", - "filter_modal.select_filter.search": "Bushkar o kriyar", - "filter_modal.select_filter.subtitle": "Kulanear una kategoria egzistente o kriya mueva", - "filter_modal.select_filter.title": "Filtrar esta publikasyon", - "filter_modal.title.status": "Filtrar una publikasyon", + "filter_modal.select_filter.search": "Bushka o kriya", + "filter_modal.select_filter.subtitle": "Kulanea una kategoria egzistente o kriya mueva", + "filter_modal.select_filter.title": "Filtra esta publikasyon", + "filter_modal.title.status": "Filtra una publikasyon", "firehose.all": "Todo", "firehose.local": "Este sirvidor", "firehose.remote": "Otros sirvidores", "follow_request.authorize": "Autoriza", "follow_request.reject": "Refuza", "follow_requests.unlocked_explanation": "Aunke tu kuento no esta serrado, la taifa de {domain} kreye ke talvez keres revizar manualmente las solisitudes de segimento de estos kuentos.", + "follow_suggestions.curated_suggestion": "Sujestion del sirvidor", + "follow_suggestions.dismiss": "No amostra mas", + "follow_suggestions.personalized_suggestion": "Sujestion personalizada", + "follow_suggestions.popular_suggestion": "Sujestion populara", + "follow_suggestions.view_all": "Ve todos", + "follow_suggestions.who_to_follow": "A ken segir", "followed_tags": "Etiketas segidas", "footer.about": "Sovre mozotros", "footer.directory": "Katalogo de profiles", "footer.get_app": "Abasha aplikasyon", - "footer.invite": "Envitar a djente", - "footer.keyboard_shortcuts": "Akortamientos de klavye", + "footer.invite": "Envita a djente", + "footer.keyboard_shortcuts": "Akortamientos de klaviatura", "footer.privacy_policy": "Politika de privasita", "footer.source_code": "Ve kodiche fuente", "footer.status": "Estado", @@ -284,24 +298,20 @@ "hashtag.column_header.tag_mode.any": "o {additional}", "hashtag.column_header.tag_mode.none": "sin {additional}", "hashtag.column_settings.select.no_options_message": "Rekomendasyones no topadas", - "hashtag.column_settings.select.placeholder": "Meter etiketas…", + "hashtag.column_settings.select.placeholder": "Mete etiketas…", "hashtag.column_settings.tag_mode.all": "Todos estos", "hashtag.column_settings.tag_mode.any": "Kualsekera de estos", "hashtag.column_settings.tag_mode.none": "Dinguno de estos", - "hashtag.column_settings.tag_toggle": "Inkluir etiketas adisionalas en esta kolumna", + "hashtag.column_settings.tag_toggle": "Inkluye etiketas adisionalas en esta kolumna", "hashtag.counter_by_accounts": "{count, plural, one {{counter} partisipante} other {{counter} partisipantes}}", "hashtag.counter_by_uses": "{count, plural, one {{counter} publikasyon} other {{counter} publikasyones}}", "hashtag.counter_by_uses_today": "{count, plural, one {{counter} publikasyon} other {{counter} publikasyones}} oy", - "hashtag.follow": "Segir etiketa", - "hashtag.unfollow": "Desegir etiketa", + "hashtag.follow": "Sige etiketa", + "hashtag.unfollow": "Desige etiketa", "hashtags.and_other": "…i {count, plural, one {}other {# mas}}", - "home.actions.go_to_explore": "Ve los trendes", - "home.actions.go_to_suggestions": "Topa a djente para segir", "home.column_settings.basic": "Opsyones bazikas", - "home.column_settings.show_reblogs": "Amostrar repartajasyones", - "home.column_settings.show_replies": "Amostrar repuestas", - "home.explore_prompt.body": "Tu linya prinsipala es una mikstura de publikasyones kon etiketas a las kualas eskojites a segir, la djente a la kuala eskojites a segir i las publikasyones ke eyos repartajan. Si esta demaziado trankila, puedes:", - "home.explore_prompt.title": "Esta es tu baza prinsipala en Mastodon.", + "home.column_settings.show_reblogs": "Amostra repartajasyones", + "home.column_settings.show_replies": "Amostra repuestas", "home.hide_announcements": "Eskonde pregones", "home.pending_critical_update.body": "Por favor aktualiza tu sirvidor de Mastodon pishin!", "home.pending_critical_update.link": "Ve aktualizasyones", @@ -337,7 +347,7 @@ "keyboard_shortcuts.favourite": "Endika ke te plaze una publikasyon", "keyboard_shortcuts.favourites": "Avre lista de favoritos", "keyboard_shortcuts.federated": "Avre linya federada", - "keyboard_shortcuts.heading": "Akortamientos de klavye", + "keyboard_shortcuts.heading": "Akortamientos de klaviatura", "keyboard_shortcuts.home": "Avre linya prinsipala", "keyboard_shortcuts.hotkey": "Klave rapido", "keyboard_shortcuts.legend": "Amostra esta lejenda", @@ -397,7 +407,7 @@ "navigation_bar.direct": "Enmentaduras privadas", "navigation_bar.discover": "Diskuvre", "navigation_bar.domain_blocks": "Domenos blokados", - "navigation_bar.explore": "Eksplorar", + "navigation_bar.explore": "Eksplora", "navigation_bar.favourites": "Te plazen", "navigation_bar.filters": "Biervos silensiados", "navigation_bar.follow_requests": "Solisitudes de segimiento", @@ -410,7 +420,7 @@ "navigation_bar.personal": "Personal", "navigation_bar.pins": "Publikasyones fiksadas", "navigation_bar.preferences": "Preferensyas", - "navigation_bar.public_timeline": "Linya de tiempo federada", + "navigation_bar.public_timeline": "Linya federada", "navigation_bar.search": "Bushka", "navigation_bar.security": "Segurita", "not_signed_in_indicator.not_signed_in": "Nesesitas konektarse kon tu kuento para akseder este rekurso.", @@ -425,7 +435,7 @@ "notification.reblog": "{name} repartajo tu publikasyon", "notification.status": "{name} publiko algo", "notification.update": "{name} edito una publikasyon", - "notifications.clear": "Efasar avizos", + "notifications.clear": "Efasa avizos", "notifications.clear_confirmation": "Estas siguro ke keres permanentemente efasar todos tus avizos?", "notifications.column_settings.admin.report": "Muveos raportos:", "notifications.column_settings.admin.sign_up": "Muevas enrejistrasyones:", @@ -441,10 +451,10 @@ "notifications.column_settings.push": "Avizos arrepushados", "notifications.column_settings.reblog": "Repartajasyones:", "notifications.column_settings.show": "Amostra en kolumna", - "notifications.column_settings.sound": "Reproduzir son", + "notifications.column_settings.sound": "Reproduse son", "notifications.column_settings.status": "Publikasyones muevas:", "notifications.column_settings.unread_notifications.category": "Avizos no meldados", - "notifications.column_settings.unread_notifications.highlight": "Avaliar avizos no meldados", + "notifications.column_settings.unread_notifications.highlight": "Avalia avizos no meldados", "notifications.column_settings.update": "Edisyones:", "notifications.filter.all": "Todos", "notifications.filter.boosts": "Repartajasyones", @@ -459,17 +469,19 @@ "notifications.permission_denied": "Avizos de ensimameza no estan desponivles porke ya se tiene refuzado el permiso", "notifications.permission_denied_alert": "\"No se pueden kapasitar los avizos de ensimameza, porke ya se tiene refuzado el permiso de navigador", "notifications.permission_required": "Avizos de ensimameza no estan desponivles porke los nesesarios permisos no tienen sido risividos.", - "notifications_permission_banner.enable": "Kapasitar avizos de ensimameza", + "notifications_permission_banner.enable": "Kapasita avizos de ensimameza", "notifications_permission_banner.how_to_control": "Para risivir avizos kuando Mastodon no esta avierto, kapasita avizos de ensimameza. Puedes kontrolar presizamente kualos tipos de enteraksiones djeneren avizos de ensimameza kon el boton {icon} arriva kuando esten kapasitadas.", - "notifications_permission_banner.title": "Nunka te piedres niente", + "notifications_permission_banner.title": "Nunkua te piedres niente", "onboarding.action.back": "Va atras", "onboarding.actions.back": "Va atras", "onboarding.actions.go_to_explore": "Va a los trendes", "onboarding.actions.go_to_home": "Va a tu linya prinsipala", "onboarding.compose.template": "Ke haber, #Mastodon?", "onboarding.follows.empty": "Malorozamente, no se pueden amostrar rezultados en este momento. Puedes aprovar uzar la bushkeda o navigar por la pajina de eksplorasyon para topar personas a las que segir, o aprovarlo de muevo mas tadre.", + "onboarding.follows.lead": "Tu linya prinsipala es la forma prinsipala de eksperiensa de Mastodon. Kuantas mas personas sigas, sera mas aktiva o interesante. Para ampesar, aki ay algunas sujestyones:", "onboarding.follows.title": "Personaliza tu linya prinsipala", "onboarding.profile.discoverable": "Faz ke mi profil apareska en bushkedas", + "onboarding.profile.discoverable_hint": "Kuando permites ke tu profil sea diskuvriravle en Mastodon, tus publikasyones podran apareser en rezultados de bushkedas i trendes i tu profil podra ser sujerido a personas kon intereses similares a los tuyos.", "onboarding.profile.display_name": "Nombre amostrado", "onboarding.profile.display_name_hint": "Tu nombre para amostrar.", "onboarding.profile.lead": "Siempre puedes kompletar esto mas tadre en las preferensyas, ande tambien ay mas opsyones de personalizasyon.", @@ -483,16 +495,21 @@ "onboarding.share.message": "Soy {username} en #Mastodon! Segidme en {url}", "onboarding.share.next_steps": "Posivles sigientes pasos:", "onboarding.share.title": "Partaja tu profil", + "onboarding.start.lead": "Agora eres parte de Mastodon, una red sosyala unika y desentralizada ande tu, no un algoritmo, puedes personalizar tu propya eksperyensya. Te entrodiziramos a esta mueva frontera sosyala:", "onboarding.start.skip": "No nesesitas ayudo para ampesar?", "onboarding.start.title": "Lo logrates!", "onboarding.steps.follow_people.body": "El buto de Mastodon es segir a djente interesante.", "onboarding.steps.follow_people.title": "Personaliza tu linya prinsipala", - "onboarding.steps.publish_status.body": "Puedes introdusirte al mundo con teksto, fotos, videos o anketas {emoji}", + "onboarding.steps.publish_status.body": "Puedes introdusirte al mundo kon teksto, fotos, videos o anketas {emoji}", "onboarding.steps.publish_status.title": "Eskrive tu primera publikasyon", "onboarding.steps.setup_profile.body": "Kompleta tu profil para aumentar tus enteraksyones.", "onboarding.steps.setup_profile.title": "Personaliza tu profil", - "onboarding.steps.share_profile.body": "Informe a tus amigos komo toparte en Mastodon", + "onboarding.steps.share_profile.body": "Informa a tus amigos komo toparte en Mastodon", "onboarding.steps.share_profile.title": "Partaja tu profil de Mastodon", + "onboarding.tips.2fa": "Saviyas? Puedes protejar tu kuento konfigurando la autentifikasyon de dos pasos en la konfigurasyon de tu kuento. Funksyona kon kualsekera aplikasyon de TOTP ke eskojas. No ay menester de uzar tu numero de telefon!", + "onboarding.tips.accounts_from_other_servers": "Saviyas? komo Mastodon es desentralizado, algunos profiles que topas estan lokalizados en sirvidores distinktos del tuyo. I malgrado esto, puedes enteraktuar kon eyos! Sus sirvidor forma la sigunda mitad de sus nombres de utilizador!", + "onboarding.tips.migration": "Savias? Si en el avenir pensas ke {domain} no es el sirvidor adekuado para ti, puedes moverte a otruno sirvidor de Mastodon sir pedrer a tus suivantes. Inkluzo puedes ser el balabay de tu propyo sirvidor!", + "onboarding.tips.verification": "Savias? Puedes verifikar tu kuento ponyendo un atadijo a tu profil de Mastodon en tu propio sitio web i adjustando el sitio a tu profil. No ay menester de pagamyentos o dokumentos!", "password_confirmation.exceeds_maxlength": "La konfirmasyon de kod es demaziado lunga", "password_confirmation.mismatching": "Los dos kodes son desferentes", "picture_in_picture.restore": "Restora", @@ -507,7 +524,15 @@ "poll_button.add_poll": "Adjusta anketa", "poll_button.remove_poll": "Kita anketa", "privacy.change": "Troka privasita de publikasyon", + "privacy.direct.long": "Todos enmentados en la publikasyon", + "privacy.direct.short": "Djente espesifika", + "privacy.private.long": "Solo para tus suivantes", + "privacy.private.short": "Suivantes", + "privacy.public.long": "Todos en i afuera de Mastodon", "privacy.public.short": "Publiko", + "privacy.unlisted.additional": "Esto funksyona exaktamente komo publiko, eksepto ke la publikasyon no aparesera en linyas publikas o etiketas, la eksplorasyon o bushkedas de Mastodon, inkluzo si kapasites esto para tu kuento.", + "privacy.unlisted.long": "Vizivle para todos, ama no en trendes, etiketas o linyas publikas", + "privacy.unlisted.short": "Publiko i silensyozo", "privacy_policy.last_updated": "Ultima aktualizasyon: {date}", "privacy_policy.title": "Politika de privasita", "recommended": "Rekomendado", @@ -525,7 +550,9 @@ "relative_time.minutes": "{number} m", "relative_time.seconds": "{number} s", "relative_time.today": "oy", + "reply_indicator.attachments": "{count, plural, one {# anekso} other {# aneksos}}", "reply_indicator.cancel": "Anula", + "reply_indicator.poll": "Anketa", "report.block": "Bloka", "report.block_explanation": "No veras sus publikasyones. No podra ver tus publikasyones ni segirte. Podra saver ke le blokates.", "report.categories.legal": "Legal", @@ -538,7 +565,7 @@ "report.category.title_status": "publikasyon", "report.close": "Fecho", "report.comment.title": "Ay algo mas ke deveriamos saver?", - "report.forward": "Reembiar a {target}", + "report.forward": "Reembia a {target}", "report.forward_hint": "Este kuento es de otro sirvidor. Embiar una kopia anonimizada del raporto ayi tamyen?", "report.mute": "Silensia", "report.mute_explanation": "No veras sus publikasyones. Ainda pueden segirte i no va saver ke le silensiates.", @@ -558,19 +585,19 @@ "report.rules.title": "Kualas reglas estan violadas?", "report.statuses.subtitle": "Eskoje todas ke korespondan", "report.statuses.title": "Ay alguna publikasyon ke suporta este raporto?", - "report.submit": "Embiar", + "report.submit": "Embia", "report.target": "Raportando a {target}", "report.thanks.take_action": "Aki estan tus opsyones para kontrolar lo ke ves en Mastodon:", "report.thanks.take_action_actionable": "Mientres revizamos esto, puedes tomar aksyones kontra @{name}:", "report.thanks.title": "No keres ver esto?", "report.thanks.title_actionable": "Mersi por raportarlo, vamos revizarlo.", - "report.unfollow": "Desegir a @{name}", + "report.unfollow": "Desige a @{name}", "report.unfollow_explanation": "Estas sigiendo este kuento. Para no ver sus publikasyones en tu linya de tiempo, puedes deshar de segirlo.", "report_notification.attached_statuses": "{count, plural, one {{count} publikasyon} other {{count} publikasyones}} atadas", "report_notification.categories.legal": "Legal", "report_notification.categories.other": "Otros", "report_notification.categories.spam": "Spam", - "report_notification.categories.violation": "Violasion de reglas", + "report_notification.categories.violation": "Violasyon de reglas", "report_notification.open": "Avre raporto", "search.no_recent_searches": "No ay bushkedas resientes", "search.placeholder": "Bushka", @@ -584,7 +611,7 @@ "search_popout.full_text_search_logged_out_message": "Solo desponivle kuando estas konektado kon tu kuento.", "search_popout.language_code": "kodiche ISO de lingua", "search_popout.options": "Opsyones de bushkeda", - "search_popout.quick_actions": "Aksiones rapidas", + "search_popout.quick_actions": "Aksyones rapidas", "search_popout.recent": "Bushkedas resientes", "search_popout.specific_date": "dato espesifiko", "search_popout.user": "utilizador", @@ -661,7 +688,7 @@ "status.translate": "Trezlada", "status.translated_from_with": "Trezladado dizde {lang} kon {provider}", "status.uncached_media_warning": "Vista previa no desponivle", - "status.unmute_conversation": "Desilensiar konversasyon", + "status.unmute_conversation": "Desilensia konversasyon", "status.unpin": "Defiksar del profil", "subscribed_languages.lead": "Solo publikasyones en linguas eskojidas se amostraran en tus linya de tiempo prinsipala i listas dempues del trokamiento. Eskoje dinguna para risivir publikasyones en todas las linguas.", "subscribed_languages.save": "Guadra trokamientos", diff --git a/app/javascript/mastodon/locales/lt.json b/app/javascript/mastodon/locales/lt.json index 14fa09e973..0923a10065 100644 --- a/app/javascript/mastodon/locales/lt.json +++ b/app/javascript/mastodon/locales/lt.json @@ -145,11 +145,9 @@ "compose_form.lock_disclaimer": "Tavo paskyra nėra {locked}. Bet kas gali sekti tave ir peržiūrėti tik sekėjams skirtus įrašus.", "compose_form.lock_disclaimer.lock": "užrakinta", "compose_form.placeholder": "Kas tavo mintyse?", - "compose_form.poll.add_option": "Pridėti pasirinkimą", "compose_form.poll.duration": "Apklausos trukmė", "compose_form.poll.multiple": "Keli pasirinkimai", "compose_form.poll.option_placeholder": "{number} pasirinkimas", - "compose_form.poll.remove_option": "Pašalinti šį pasirinkimą", "compose_form.poll.single": "Pasirinkti vieną", "compose_form.poll.switch_to_multiple": "Keisti apklausą, kad būtų galima pasirinkti kelis pasirinkimus", "compose_form.poll.switch_to_single": "Pakeisti apklausą, kad būtų galima pasirinkti vieną variantą", @@ -271,6 +269,12 @@ "follow_request.authorize": "Autorizuoti", "follow_request.reject": "Atmesti", "follow_requests.unlocked_explanation": "Nors tavo paskyra neužrakinta, {domain} personalas mano, kad galbūt norėsi rankiniu būdu patikrinti šių paskyrų sekimo užklausas.", + "follow_suggestions.curated_suggestion": "Redaktorių pasirinkimas", + "follow_suggestions.dismiss": "Daugiau nerodyti", + "follow_suggestions.personalized_suggestion": "Suasmenintas pasiūlymas", + "follow_suggestions.popular_suggestion": "Populiarus pasiūlymas", + "follow_suggestions.view_all": "Peržiūrėti viską", + "follow_suggestions.who_to_follow": "Ką sekti", "followed_tags": "Sekamos saitažodžiai", "footer.about": "Apie", "footer.directory": "Profilių katalogas", @@ -297,18 +301,19 @@ "hashtag.follow": "Sekti grotažymę", "hashtag.unfollow": "Nesekti grotažymės", "hashtags.and_other": "…ir{count, plural,other {#daugiau}}", - "home.actions.go_to_explore": "Žiūrėti kas populiaru", - "home.actions.go_to_suggestions": "Rasti žmonių sekimui", "home.column_settings.basic": "Pagrindinis", "home.column_settings.show_reblogs": "Rodyti \"boosts\"", "home.column_settings.show_replies": "Rodyti atsakymus", "home.hide_announcements": "Slėpti skelbimus", + "home.pending_critical_update.link": "Žiūrėti atnaujinimus", + "home.pending_critical_update.title": "Galimas kritinis saugumo atnaujinimas!", "interaction_modal.no_account_yet": "Nesi Mastodon?", "interaction_modal.on_another_server": "Kitame serveryje", "interaction_modal.on_this_server": "Šiame serveryje", "interaction_modal.sign_in": "Nesi prisijungęs (-usi) prie šio serverio. Kur yra laikoma tavo paskyra?", "interaction_modal.sign_in_hint": "Patarimas: tai svetainė, kurioje užsiregistravai. Jei neprisimeni, ieškok sveikinimo el. laiško savo pašto dėžutėje. Taip pat gali įvesti visą savo naudotojo vardą (pvz., @Mastodon@mastodon.social).", "interaction_modal.title.favourite": "Mėgstamiausias {name} įrašas", + "interaction_modal.title.follow": "Sekti {name}", "keyboard_shortcuts.back": "to navigate back", "keyboard_shortcuts.blocked": "to open blocked users list", "keyboard_shortcuts.boost": "to boost", @@ -341,7 +346,24 @@ "keyboard_shortcuts.unfocus": "to un-focus compose textarea/search", "keyboard_shortcuts.up": "to move up in the list", "lightbox.close": "Uždaryti", + "lightbox.next": "Kitas", + "lightbox.previous": "Ankstesnis", + "limited_account_hint.action": "Vis tiek rodyti profilį", + "limited_account_hint.title": "Šį profilį paslėpė {domain} moderatoriai.", + "link_preview.author": "Sukūrė {name}", + "lists.account.add": "Pridėti į sąrašą", + "lists.account.remove": "Pašalinti iš sąrašo", + "lists.delete": "Ištrinti sąrašą", + "lists.edit": "Redaguoti sąrašą", + "lists.edit.submit": "Prierašo pakeitimas", "lists.new.create": "Pridėti sąrašą", + "lists.new.title_placeholder": "Naujas sąrašo pavadinimas", + "lists.replies_policy.followed": "Bet kuris sekamas naudotojas", + "lists.replies_policy.list": "Sąrašo nariai", + "lists.replies_policy.none": "Nei vienas", + "lists.replies_policy.title": "Rodyti atsakymus:", + "lists.search": "Ieškoti tarp sekamų žmonių", + "lists.subheading": "Jūsų sąrašai", "loading_indicator.label": "Kraunama…", "media_gallery.toggle_visible": "{number, plural, one {Slėpti vaizdą} few {Slėpti vaizdus} many {Slėpti vaizdo} other {Slėpti vaizdų}}", "moved_to_account_banner.text": "Tavo paskyra {disabledAccount} šiuo metu yra išjungta, nes persikėlei į {movedToAccount}.", @@ -506,6 +528,11 @@ "report.reasons.legal": "Tai nelegalu", "report.reasons.legal_description": "Manai, kad tai pažeidžia tavo arba serverio šalies įstatymus", "report.reasons.other": "Tai kažkas kita", + "report.reasons.other_description": "Šis klausimas neatitinka kitų kategorijų", + "report.reasons.spam": "Tai šlamštas", + "report.reasons.spam_description": "Kenkėjiškos nuorodos, netikras įsitraukimas arba pasikartojantys atsakymai", + "report.reasons.violation": "Tai pažeidžia serverio taisykles", + "report.reasons.violation_description": "Žinai, kad tai pažeidžia konkrečias taisykles", "report.rules.subtitle": "Pasirink viską, kas tinka", "report.rules.title": "Kokios taisyklės pažeidžiamos?", "report.statuses.subtitle": "Pasirinkti viską, kas tinka", @@ -519,35 +546,71 @@ "report.unfollow": "Nebesekti @{name}", "report.unfollow_explanation": "Jūs sekate šią paskyrą. Norėdami nebematyti jų įrašų savo pagrindiniame kanale, panaikinkite jų sekimą.", "report_notification.attached_statuses": "{count, plural, one {# post} other {# posts}} attached", + "report_notification.categories.legal": "Legalus", + "report_notification.categories.other": "Kita", + "report_notification.categories.spam": "Šlamštas", + "report_notification.categories.violation": "Taisyklės pažeidimas", + "search.no_recent_searches": "Paieškos įrašų nėra", "search.placeholder": "Paieška", + "search.quick_action.account_search": "Profiliai, atitinkantys {x}", + "search.quick_action.go_to_account": "Eiti į profilį {x}", + "search.quick_action.go_to_hashtag": "Eiti į hashtag {x}", + "search.quick_action.open_url": "Atidaryti URL adresą Mastodon", + "search.quick_action.status_search": "Pranešimai, atitinkantys {x}", "search.search_or_paste": "Ieškok arba įklijuok URL", "search_popout.full_text_search_disabled_message": "Nepasiekima {domain}.", "search_popout.full_text_search_logged_out_message": "Pasiekiama tik prisijungus.", "search_popout.language_code": "ISO kalbos kodas", + "search_popout.options": "Paieškos nustatymai", + "search_popout.quick_actions": "Greiti veiksmai", + "search_popout.recent": "Naujausios paieškos", "search_popout.specific_date": "konkreti data", "search_popout.user": "naudotojas", "search_results.accounts": "Profiliai", "search_results.all": "Visi", "search_results.hashtags": "Saitažodžiai", "search_results.nothing_found": "Nepavyko rasti nieko pagal šiuos paieškos terminus.", + "search_results.see_all": "Žiūrėti viską", "search_results.statuses": "Toots", + "search_results.title": "Ieškoti {q}", "server_banner.about_active_users": "Žmonės, kurie naudojosi šiuo serveriu per pastarąsias 30 dienų (mėnesio aktyvūs naudotojai)", "server_banner.active_users": "aktyvūs naudotojai", + "server_banner.administered_by": "Administruoja:", + "server_banner.introduction": "{domain} yra decentralizuoto socialinio tinklo, kurį valdo {mastodon}, dalis.", + "server_banner.learn_more": "Sužinoti daugiau", + "server_banner.server_stats": "Serverio statistika:", + "sign_in_banner.create_account": "Sukurti paskyrą", "sign_in_banner.sign_in": "Prisijungimas", + "sign_in_banner.sso_redirect": "Prisijungti arba Registruotis", "sign_in_banner.text": "Prisijunk, kad galėtum sekti profilius arba saitažodžius, mėgsti, bendrinti ir atsakyti į įrašus. Taip pat gali bendrauti iš savo paskyros kitame serveryje.", + "status.admin_account": "Atvira moderavimo sąsaja @{name}", + "status.admin_domain": "Atvira moderavimo sąsaja {domain}", "status.admin_status": "Open this status in the moderation interface", + "status.block": "Blokuoti @{name}", + "status.bookmark": "Žymė", "status.copy": "Kopijuoti nuorodą į įrašą", "status.delete": "Ištrinti", + "status.detailed_status": "Išsami pokalbio peržiūra", + "status.direct": "Privačiai paminėti @{name}", + "status.direct_indicator": "Privatus paminėjimas", "status.edit": "Redaguoti", "status.edited": "Redaguota {date}", "status.edited_x_times": "Edited {count, plural, one {# time} other {# times}}", + "status.embed": "Įterptas", + "status.favourite": "Mėgstamiausias", + "status.filter": "Filtruoti šį įrašą", + "status.filtered": "Filtruota", "status.hide": "Slėpti įrašą", + "status.history.created": "{name} sukurtas {date}", + "status.history.edited": "{name} redaguotas {date}", "status.load_more": "Pakrauti daugiau", "status.media.open": "Spausk, kad atidaryti", "status.media.show": "Spausk, kad matyti", "status.media_hidden": "Paslėpta medija", "status.mention": "Paminėti @{name}", "status.more": "Daugiau", + "status.mute": "Nutildyti @{name}", + "status.mute_conversation": "Nutildyti pokalbį", "status.open": "Expand this status", "status.pin": "Prisegti prie profilio", "status.pinned": "Prisegtas įrašas", diff --git a/app/javascript/mastodon/locales/lv.json b/app/javascript/mastodon/locales/lv.json index b4426b4c45..07a7b25a79 100644 --- a/app/javascript/mastodon/locales/lv.json +++ b/app/javascript/mastodon/locales/lv.json @@ -291,13 +291,9 @@ "hashtag.follow": "Sekot tēmturim", "hashtag.unfollow": "Pārstāt sekot tēmturim", "hashtags.and_other": "..un {count, plural, other {# vairāk}}", - "home.actions.go_to_explore": "Skatīt tendences", - "home.actions.go_to_suggestions": "Atrodi cilvēkus kam sekot", "home.column_settings.basic": "Pamata", "home.column_settings.show_reblogs": "Rādīt pastiprinātos ierakstus", "home.column_settings.show_replies": "Rādīt atbildes", - "home.explore_prompt.body": "Tavā mājas plūsmā būs dažādu ziņu sajaukums no atsaucēm, kurām esi izvēlējies sekot, personām, kurām esi izvēlējies sekot, un ziņām, kuras tās izceļ. Ja tas šķiet pārāk kluss, iespējams, vēlēsies:", - "home.explore_prompt.title": "Šī ir tava Mastodon mājvieta.", "home.hide_announcements": "Slēpt paziņojumus", "home.pending_critical_update.body": "Lūdzu, pēc iespējas ātrāk atjaunini savu Mastodon serveri!", "home.pending_critical_update.link": "Skatīt jauninājumus", diff --git a/app/javascript/mastodon/locales/ms.json b/app/javascript/mastodon/locales/ms.json index 8c1ff63376..2c3221cfdd 100644 --- a/app/javascript/mastodon/locales/ms.json +++ b/app/javascript/mastodon/locales/ms.json @@ -287,13 +287,9 @@ "hashtag.follow": "Ikuti hashtag", "hashtag.unfollow": "Nyahikut tanda pagar", "hashtags.and_other": "…dan {count, plural, other {# more}}", - "home.actions.go_to_explore": "Lihat apa yand sedang tren", - "home.actions.go_to_suggestions": "Cari orang untuk diikuti", "home.column_settings.basic": "Asas", "home.column_settings.show_reblogs": "Tunjukkan galakan", "home.column_settings.show_replies": "Tunjukkan balasan", - "home.explore_prompt.body": "Suapan rumah anda akan mempunyai gabungan pos daripada hashtag yang telah anda pilih untuk diikuti, orang yang telah anda pilih untuk diikuti dan pos yang mereka tingkatkan. Jika itu terasa terlalu senyap, anda mungkin mahu:", - "home.explore_prompt.title": "Ini adalah pusat operasi anda dalam Mastodon.", "home.hide_announcements": "Sembunyikan pengumuman", "home.pending_critical_update.body": "Sila kemas kini pelayan Mastodon anda secepat yang mungkin!", "home.pending_critical_update.link": "Lihat pengemaskinian", diff --git a/app/javascript/mastodon/locales/my.json b/app/javascript/mastodon/locales/my.json index 396a72ac45..0d5985b1ce 100644 --- a/app/javascript/mastodon/locales/my.json +++ b/app/javascript/mastodon/locales/my.json @@ -292,13 +292,9 @@ "hashtag.follow": "Hashtag ကို စောင့်ကြည့်မယ်", "hashtag.unfollow": "Hashtag ကို မစောင့်ကြည့်ပါ", "hashtags.and_other": "{count, plural, other {# more}} နှင့်", - "home.actions.go_to_explore": "ခေတ်စားနေသည်များကို ကြည့်ပါ", - "home.actions.go_to_suggestions": "စောင့်ကြည့်သူများရှာပါ", "home.column_settings.basic": "အခြေခံ", "home.column_settings.show_reblogs": "Boost များကို ပြပါ", "home.column_settings.show_replies": "ပြန်စာများကို ပြပါ", - "home.explore_prompt.body": "သင့်ရဲ့သတင်းစဥ် မှာ သင် စောင့်ကြည့်​နေတယ့် ခေါင်းစဥ်​တွေ၊သင်​စောင့်ကြည့်​နေတယ့်အ​ကောင့်​တွေ နဲ့ အဆိုပါ အ​ကောင့်​တွေပြန်မျှ​ဝေထားတယ့် ပိုစ့်​တွေကို မြင်ရမှာပါ။:", - "home.explore_prompt.title": "ဤသည်မှာ Mastodon ရှိ သင့်ပင်မစာမျက်နှာဖြစ်သည်။", "home.hide_announcements": "ကြေညာချက်များကို ဖျောက်ပါ", "home.pending_critical_update.body": "သင့် Mastodon ဆာဗာ အမြန်ဆုံး အပ်ဒိတ်လုပ်ပါ။", "home.pending_critical_update.link": "အပ်ဒိတ်များကြည့်ရန်", diff --git a/app/javascript/mastodon/locales/nl.json b/app/javascript/mastodon/locales/nl.json index e38f8fd0ba..24099f2d33 100644 --- a/app/javascript/mastodon/locales/nl.json +++ b/app/javascript/mastodon/locales/nl.json @@ -145,22 +145,20 @@ "compose_form.lock_disclaimer": "Jouw account is niet {locked}. Iedereen kan jou volgen en kan de berichten zien die je alleen aan jouw volgers hebt gericht.", "compose_form.lock_disclaimer.lock": "vergrendeld", "compose_form.placeholder": "Wat wil je kwijt?", - "compose_form.poll.add_option": "Optie toevoegen", "compose_form.poll.duration": "Duur van de peiling", "compose_form.poll.multiple": "Meerkeuze", "compose_form.poll.option_placeholder": "Optie {number}", - "compose_form.poll.remove_option": "Deze optie verwijderen", - "compose_form.poll.single": "Kies een", + "compose_form.poll.single": "Enkele keuze", "compose_form.poll.switch_to_multiple": "Peiling wijzigen om meerdere keuzes toe te staan", "compose_form.poll.switch_to_single": "Peiling wijzigen om een enkele keuze toe te staan", "compose_form.poll.type": "Stijl", - "compose_form.publish": "Plaatsen", + "compose_form.publish": "Toot", "compose_form.publish_form": "Nieuw bericht", "compose_form.reply": "Reageren", "compose_form.save_changes": "Bijwerken", "compose_form.spoiler.marked": "Inhoudswaarschuwing verwijderen", "compose_form.spoiler.unmarked": "Inhoudswaarschuwing toevoegen", - "compose_form.spoiler_placeholder": "Waarschuwing inhoud (optioneel)", + "compose_form.spoiler_placeholder": "Inhoudswaarschuwing (optioneel)", "confirmation_modal.cancel": "Annuleren", "confirmations.block.block_and_report": "Blokkeren en rapporteren", "confirmations.block.confirm": "Blokkeren", @@ -279,6 +277,12 @@ "follow_request.authorize": "Goedkeuren", "follow_request.reject": "Afwijzen", "follow_requests.unlocked_explanation": "Ook al is jouw account niet besloten, de medewerkers van {domain} denken dat jij misschien de volgende volgverzoeken handmatig wil controleren.", + "follow_suggestions.curated_suggestion": "Keuze van de moderator(en)", + "follow_suggestions.dismiss": "Niet meer weergeven", + "follow_suggestions.personalized_suggestion": "Gepersonaliseerde aanbeveling", + "follow_suggestions.popular_suggestion": "Populaire aanbeveling", + "follow_suggestions.view_all": "Alles weergeven", + "follow_suggestions.who_to_follow": "Wie te volgen", "followed_tags": "Gevolgde hashtags", "footer.about": "Over", "footer.directory": "Gebruikersgids", @@ -305,13 +309,9 @@ "hashtag.follow": "Hashtag volgen", "hashtag.unfollow": "Hashtag ontvolgen", "hashtags.and_other": "…en {count, plural, one {}other {# meer}}", - "home.actions.go_to_explore": "De huidige trends bekijken", - "home.actions.go_to_suggestions": "Zoek mensen om te volgen", "home.column_settings.basic": "Algemeen", "home.column_settings.show_reblogs": "Boosts tonen", "home.column_settings.show_replies": "Reacties tonen", - "home.explore_prompt.body": "Jouw starttijdlijn bevat een mix van berichten met hashtags die je volgt, van accounts die je volgt en van berichten die deze accounts boosten. Wanneer je dit te stil vind, kun je:", - "home.explore_prompt.title": "Dit is jouw thuisbasis op Mastodon.", "home.hide_announcements": "Mededelingen verbergen", "home.pending_critical_update.body": "Update alstublieft zo snel mogelijk jouw Mastodon-server!", "home.pending_critical_update.link": "Bekijk updates", @@ -524,15 +524,15 @@ "poll_button.add_poll": "Peiling toevoegen", "poll_button.remove_poll": "Peiling verwijderen", "privacy.change": "Zichtbaarheid van bericht aanpassen", - "privacy.direct.long": "Iedereen genoemd in de post", - "privacy.direct.short": "Specifieke mensen", + "privacy.direct.long": "Iedereen die in het bericht wordt vermeld", + "privacy.direct.short": "Bepaalde mensen", "privacy.private.long": "Alleen jouw volgers", "privacy.private.short": "Volgers", "privacy.public.long": "Iedereen op Mastodon en daarbuiten", "privacy.public.short": "Openbaar", - "privacy.unlisted.additional": "Dit is vergelijkbaar met publiek, behalve dat de post niet zal verschijnen in live feeds of hashtags, verkennen of Mastodon zoeken, zelfs als je gekozen hebt voor account-breed.", - "privacy.unlisted.long": "Minder algoritmische fanfare", - "privacy.unlisted.short": "Stil publiek", + "privacy.unlisted.additional": "Dit is vergelijkbaar met openbaar, behalve dat het beticht niet verschijnt op openbare tijdlijnen of hashtags, onder verkennen of Mastodon zoeken, zelfs als je je account daarvoor hebt ingesteld.", + "privacy.unlisted.long": "Voor iedereen zichtbaar, maar niet onder trends, hashtags en op openbare tijdlijnen", + "privacy.unlisted.short": "Minder openbaar", "privacy_policy.last_updated": "Laatst bijgewerkt op {date}", "privacy_policy.title": "Privacybeleid", "recommended": "Aanbevolen", diff --git a/app/javascript/mastodon/locales/nn.json b/app/javascript/mastodon/locales/nn.json index 9bb4f59197..2118eb5739 100644 --- a/app/javascript/mastodon/locales/nn.json +++ b/app/javascript/mastodon/locales/nn.json @@ -145,12 +145,10 @@ "compose_form.lock_disclaimer": "Kontoen din er ikkje {locked}. Kven som helst kan fylgja deg for å sjå innlegga dine.", "compose_form.lock_disclaimer.lock": "låst", "compose_form.placeholder": "Kva har du på hjarta?", - "compose_form.poll.add_option": "Legg til alternativ", "compose_form.poll.duration": "Varigheit for rundspørjing", - "compose_form.poll.multiple": "Flervalg", - "compose_form.poll.option_placeholder": "Valg {number}", - "compose_form.poll.remove_option": "Fjern dette valget", - "compose_form.poll.single": "Velg en", + "compose_form.poll.multiple": "Fleirval", + "compose_form.poll.option_placeholder": "Alternativ {number}", + "compose_form.poll.single": "Vel ein", "compose_form.poll.switch_to_multiple": "Endre rundspørjinga til å tillate fleire val", "compose_form.poll.switch_to_single": "Endre rundspørjinga til å tillate berre eitt val", "compose_form.poll.type": "Stil", @@ -160,7 +158,7 @@ "compose_form.save_changes": "Oppdater", "compose_form.spoiler.marked": "Fjern innhaldsåtvaring", "compose_form.spoiler.unmarked": "Legg til innhaldsåtvaring", - "compose_form.spoiler_placeholder": "Innholdsadvarsel (valgfritt)", + "compose_form.spoiler_placeholder": "Innhaldsåtvaring (valfritt)", "confirmation_modal.cancel": "Avbryt", "confirmations.block.block_and_report": "Blokker & rapporter", "confirmations.block.confirm": "Blokker", @@ -279,6 +277,11 @@ "follow_request.authorize": "Autoriser", "follow_request.reject": "Avvis", "follow_requests.unlocked_explanation": "Sjølv om kontoen din ikkje er låst tenkte dei som driv {domain} at du kanskje ville gå gjennom førespurnadar frå desse kontoane manuelt.", + "follow_suggestions.dismiss": "Ikkje vis igjen", + "follow_suggestions.personalized_suggestion": "Personleg forslag", + "follow_suggestions.popular_suggestion": "Populært forslag", + "follow_suggestions.view_all": "Vis alle", + "follow_suggestions.who_to_follow": "Kven som skal følgjast", "followed_tags": "Fylgde emneknaggar", "footer.about": "Om", "footer.directory": "Profilmappe", @@ -305,13 +308,9 @@ "hashtag.follow": "Fylg emneknagg", "hashtag.unfollow": "Slutt å fylgje emneknaggen", "hashtags.and_other": "…og {count, plural, one {}other {# fleire}}", - "home.actions.go_to_explore": "Sjå kva som er populært", - "home.actions.go_to_suggestions": "Finn folk å følgje", "home.column_settings.basic": "Grunnleggjande", "home.column_settings.show_reblogs": "Vis framhevingar", "home.column_settings.show_replies": "Vis svar", - "home.explore_prompt.body": "Tidslinja di vil ha ei blanding av innlegg frå emneknaggar du har vald å følgje, personane du har vald å følgje, og innlegga dei framhevar. Om det ser ganske stille ut akkurat no, så kan du:", - "home.explore_prompt.title": "Dette er heimen din i Mastodon.", "home.hide_announcements": "Skjul kunngjeringar", "home.pending_critical_update.body": "Oppdater mastodontenaren din så snart som mogleg!", "home.pending_critical_update.link": "Sjå oppdateringar", @@ -523,14 +522,14 @@ "poll_button.add_poll": "Lag ei rundspørjing", "poll_button.remove_poll": "Fjern rundspørjing", "privacy.change": "Endre personvernet på innlegg", - "privacy.direct.long": "Alle nevnt i innlegget", + "privacy.direct.long": "Alle nemnde i innlegget", "privacy.direct.short": "Spesifikke folk", - "privacy.private.long": "Bare følgerne dine", - "privacy.private.short": "Følgere", - "privacy.public.long": "Alle på og utenfor Mastodon", + "privacy.private.long": "Berre dine følgjarar", + "privacy.private.short": "Følgjarar", + "privacy.public.long": "Kven som helst på og av Mastodon", "privacy.public.short": "Offentleg", - "privacy.unlisted.long": "Færre algoritmiske fanfarer", - "privacy.unlisted.short": "Stille offentlig", + "privacy.unlisted.long": "Færre algoritmiske fanfarar", + "privacy.unlisted.short": "Stille offentleg", "privacy_policy.last_updated": "Sist oppdatert {date}", "privacy_policy.title": "Personvernsreglar", "recommended": "Anbefalt", diff --git a/app/javascript/mastodon/locales/no.json b/app/javascript/mastodon/locales/no.json index 8da9853bee..27ca611722 100644 --- a/app/javascript/mastodon/locales/no.json +++ b/app/javascript/mastodon/locales/no.json @@ -145,11 +145,9 @@ "compose_form.lock_disclaimer": "Din konto er ikke {locked}. Hvem som helst kan følge deg og se dine private poster.", "compose_form.lock_disclaimer.lock": "låst", "compose_form.placeholder": "Hva har du på hjertet?", - "compose_form.poll.add_option": "Legg til alternativ", "compose_form.poll.duration": "Avstemningens varighet", "compose_form.poll.multiple": "Flervalg", "compose_form.poll.option_placeholder": "Valg {number}", - "compose_form.poll.remove_option": "Fjern dette valget", "compose_form.poll.single": "Velg en", "compose_form.poll.switch_to_multiple": "Endre avstemning til å tillate flere valg", "compose_form.poll.switch_to_single": "Endre avstemning til å tillate ett valg", @@ -305,13 +303,9 @@ "hashtag.follow": "Følg emneknagg", "hashtag.unfollow": "Slutt å følge emneknagg", "hashtags.and_other": "…og {count, plural, one{en til} other {# til}}", - "home.actions.go_to_explore": "Se hva som er populært", - "home.actions.go_to_suggestions": "Finn folk å følge", "home.column_settings.basic": "Enkelt", "home.column_settings.show_reblogs": "Vis fremhevinger", "home.column_settings.show_replies": "Vis svar", - "home.explore_prompt.body": "Tidslinjen din inneholder en blanding av innlegg fra emneknagger du har valgt å følge, personene du har valgt å følge, og innleggene de fremhever. Hvis det føles for stille, kan det være lurt å:", - "home.explore_prompt.title": "Dette er hjemmet ditt i Mastodon.", "home.hide_announcements": "Skjul kunngjøring", "home.pending_critical_update.body": "Vennligst oppdater Mastodon-serveren din så snart som mulig!", "home.pending_critical_update.link": "Se oppdateringer", diff --git a/app/javascript/mastodon/locales/oc.json b/app/javascript/mastodon/locales/oc.json index 8660a3bc05..5e122064fc 100644 --- a/app/javascript/mastodon/locales/oc.json +++ b/app/javascript/mastodon/locales/oc.json @@ -262,8 +262,6 @@ "hashtag.follow": "Sègre l’etiqueta", "hashtag.unfollow": "Quitar de sègre l’etiqueta", "hashtags.and_other": "…e {count, plural, one {}other {# de mai}}", - "home.actions.go_to_explore": "Agachatz las tendéncias", - "home.actions.go_to_suggestions": "Trobatz de monde de sègre", "home.column_settings.basic": "Basic", "home.column_settings.show_reblogs": "Mostrar los partatges", "home.column_settings.show_replies": "Mostrar las responsas", diff --git a/app/javascript/mastodon/locales/pa.json b/app/javascript/mastodon/locales/pa.json index de085cf985..ee47c1872d 100644 --- a/app/javascript/mastodon/locales/pa.json +++ b/app/javascript/mastodon/locales/pa.json @@ -1,5 +1,6 @@ { "about.contact": "ਸੰਪਰਕ:", + "about.domain_blocks.no_reason_available": "ਕਾਰਨ ਮੌਜੂਦ ਨਹੀਂ ਹੈ", "about.domain_blocks.silenced.title": "ਸੀਮਿਤ", "about.domain_blocks.suspended.title": "ਮੁਅੱਤਲ ਕੀਤੀ", "about.rules": "ਸਰਵਰ ਨਿਯਮ", @@ -12,12 +13,17 @@ "account.block_short": "ਪਾਬੰਦੀ", "account.blocked": "ਪਾਬੰਦੀਸ਼ੁਦਾ", "account.cancel_follow_request": "ਫ਼ਾਲੋ ਕਰਨ ਨੂੰ ਰੱਦ ਕਰੋ", + "account.copy": "ਪਰੋਫਾਇਲ ਲਈ ਲਿੰਕ ਕਾਪੀ ਕਰੋ", + "account.direct": "ਨਿੱਜੀ ਜ਼ਿਕਰ @{name}", "account.edit_profile": "ਪਰੋਫਾਈਲ ਨੂੰ ਸੋਧੋ", + "account.featured_tags.last_status_at": "{date} ਨੂੰ ਆਖਰੀ ਪੋਸਟ", + "account.featured_tags.last_status_never": "ਕੋਈ ਪੋਸਟ ਨਹੀਂ", "account.follow": "ਫ਼ਾਲੋ", "account.followers": "ਫ਼ਾਲੋਅਰ", "account.followers.empty": "ਇਸ ਵਰਤੋਂਕਾਰ ਨੂੰ ਹਾਲੇ ਕੋਈ ਫ਼ਾਲੋ ਨਹੀਂ ਕਰਦਾ ਹੈ।", "account.following": "ਫ਼ਾਲੋ ਕੀਤਾ", "account.follows.empty": "ਇਹ ਵਰਤੋਂਕਾਰ ਹਾਲੇ ਕਿਸੇ ਨੂੰ ਫ਼ਾਲੋ ਨਹੀਂ ਕਰਦਾ ਹੈ।", + "account.go_to_profile": "ਪਰੋਫਾਇਲ ਉੱਤੇ ਜਾਓ", "account.media": "ਮੀਡੀਆ", "account.muted": "ਮੌਨ ਕੀਤੀਆਂ", "account.posts": "ਪੋਸਟਾਂ", @@ -35,9 +41,13 @@ "admin.dashboard.retention.cohort_size": "ਨਵੇਂ ਵਰਤੋਂਕਾਰ", "alert.unexpected.title": "ਓਹੋ!", "announcement.announcement": "ਹੋਕਾ", + "bundle_column_error.error.title": "ਓਹ ਹੋ!", "bundle_column_error.network.title": "ਨੈੱਟਵਰਕ ਦੀ ਸਮੱਸਿਆ", "bundle_column_error.retry": "ਮੁੜ-ਕੋਸ਼ਿਸ਼ ਕਰੋ", + "bundle_column_error.return": "ਵਾਪਸ ਮੁੱਖ ਸਫ਼ੇ ਉੱਤੇ ਜਾਓ", + "bundle_column_error.routing.title": "404", "bundle_modal_error.close": "ਬੰਦ ਕਰੋ", + "bundle_modal_error.message": "ਭਾਗ ਲੋਡ ਕਰਨ ਦੌਰਾਨ ਕੁਝ ਗਲਤ ਵਾਪਰਿਆ ਹੈ।", "bundle_modal_error.retry": "ਮੁੜ-ਕੋਸ਼ਿਸ਼ ਕਰੋ", "column.about": "ਸਾਡੇ ਬਾਰੇ", "column.blocks": "ਪਾਬੰਦੀ ਲਾਏ ਵਰਤੋਂਕਾਰ", @@ -67,10 +77,16 @@ "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.lock": "ਲਾਕ ਹੈ", "compose_form.placeholder": "What is on your mind?", + "compose_form.poll.type": "ਸਟਾਈਲ", + "compose_form.publish": "ਪੋਸਟ", "compose_form.publish_form": "Publish", + "compose_form.reply": "ਜਵਾਬ ਦਿਓ", + "compose_form.save_changes": "ਅੱਪਡੇਟ", "compose_form.spoiler.marked": "ਸਮੱਗਰੀ ਚੇਤਾਵਨੀ ਨੂੰ ਹਟਾਓ", "compose_form.spoiler.unmarked": "ਸਮੱਗਰੀ ਬਾਰੇ ਚੇਤਾਵਨੀ ਜੋੜੋ", + "compose_form.spoiler_placeholder": "ਸਮੱਗਰੀ ਬਾਰੇ ਚੇਤਾਵਨੀ (ਚੋਣਵਾਂ)", "confirmation_modal.cancel": "ਰੱਦ ਕਰੋ", + "confirmations.block.block_and_report": "ਰੋਕ ਲਾਓ ਤੇ ਰਿਪੋਰਟ ਕਰੋ", "confirmations.block.confirm": "ਪਾਬੰਦੀ", "confirmations.delete.confirm": "ਹਟਾਓ", "confirmations.delete.message": "ਕੀ ਤੁਸੀਂ ਇਹ ਪੋਸਟ ਨੂੰ ਹਟਾਉਣਾ ਚਾਹੁੰਦੇ ਹੋ?", @@ -116,7 +132,10 @@ "firehose.local": "ਇਹ ਸਰਵਰ", "firehose.remote": "ਹੋਰ ਸਰਵਰ", "follow_request.reject": "ਰੱਦ ਕਰੋ", + "follow_suggestions.dismiss": "ਮੁੜ ਨਾ ਵੇਖਾਓ", + "follow_suggestions.view_all": "ਸਭ ਵੇਖੋ", "footer.about": "ਸਾਡੇ ਬਾਰੇ", + "footer.directory": "ਪਰੋਫਾਇਲ ਡਾਇਰੈਕਟਰੀ", "footer.get_app": "ਐਪ ਲਵੋ", "footer.invite": "ਲੋਕਾਂ ਨੂੰ ਸੱਦਾ ਭੇਜੋ", "footer.keyboard_shortcuts": "ਕੀਬੋਰਡ ਸ਼ਾਰਟਕੱਟ", @@ -128,12 +147,14 @@ "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.tag_mode.any": "ਇਹਨਾਂ ਵਿੱਚੋਂ ਕੋਈ", "hashtag.column_settings.tag_mode.none": "ਇਹਨਾਂ ਵਿੱਚੋਂ ਕੋਈ ਨਹੀਂ", "hashtag.column_settings.tag_toggle": "Include additional tags in this column", "hashtag.follow": "ਹੈਸ਼ਟੈਗ ਨੂੰ ਫ਼ਾਲੋ ਕਰੋ", "hashtag.unfollow": "ਹੈਸ਼ਟੈਗ ਨੂੰ ਅਣ-ਫ਼ਾਲੋ ਕਰੋ", "home.column_settings.basic": "ਆਮ", + "home.pending_critical_update.link": "ਅੱਪਡੇਟ ਵੇਖੋ", "interaction_modal.title.follow": "{name} ਨੂੰ ਫ਼ਾਲੋ ਕਰੋ", "keyboard_shortcuts.back": "ਪਿੱਛੇ ਜਾਓ", "keyboard_shortcuts.blocked": "ਪਾਬੰਦੀ ਲਾਏ ਵਰਤੋਂਕਾਰਾਂ ਦੀ ਸੂਚੀ ਖੋਲ੍ਹੋ", @@ -188,11 +209,13 @@ "navigation_bar.domain_blocks": "ਪਾਬੰਦੀ ਲਾਏ ਡੋਮੇਨ", "navigation_bar.explore": "ਪੜਚੋਲ ਕਰੋ", "navigation_bar.favourites": "ਮਨਪਸੰਦ", + "navigation_bar.filters": "ਮੌਨ ਕੀਤੇ ਸ਼ਬਦ", "navigation_bar.follow_requests": "ਫ਼ਾਲੋ ਦੀਆਂ ਬੇਨਤੀਆਂ", "navigation_bar.followed_tags": "ਫ਼ਾਲੋ ਕੀਤੇ ਹੈਸ਼ਟੈਗ", "navigation_bar.follows_and_followers": "ਫ਼ਾਲੋ ਅਤੇ ਫ਼ਾਲੋ ਕਰਨ ਵਾਲੇ", "navigation_bar.lists": "ਸੂਚੀਆਂ", "navigation_bar.logout": "ਲਾਗ ਆਉਟ", + "navigation_bar.mutes": "ਮੌਨ ਕੀਤੇ ਵਰਤੋਂਕਾਰ", "navigation_bar.personal": "ਨਿੱਜੀ", "navigation_bar.pins": "ਟੰਗੀਆਂ ਪੋਸਟਾਂ", "navigation_bar.preferences": "ਪਸੰਦਾਂ", @@ -202,6 +225,8 @@ "notification.follow": "{name} ਨੇ ਤੁਹਾਨੂੰ ਫ਼ਾਲੋ ਕੀਤਾ", "notification.follow_request": "{name} ਨੇ ਤੁਹਾਨੂੰ ਫ਼ਾਲੋ ਕਰਨ ਦੀ ਬੇਨਤੀ ਕੀਤੀ ਹੈ", "notification.reblog": "{name} boosted your status", + "notifications.column_settings.alert": "ਡੈਸਕਟਾਪ ਸੂਚਨਾਵਾਂ", + "notifications.column_settings.favourite": "ਮਨਪਸੰਦ:", "notifications.column_settings.follow": "ਨਵੇਂ ਫ਼ਾਲੋਅਰ:", "notifications.column_settings.follow_request": "ਨਵੀਆਂ ਫ਼ਾਲੋ ਬੇਨਤੀਆਂ:", "notifications.column_settings.status": "ਨਵੀਆਂ ਪੋਸਟਾਂ:", @@ -261,9 +286,11 @@ "report.target": "{target} ਰਿਪੋਰਟ", "report.unfollow": "@{name} ਨੂੰ ਅਣ-ਫ਼ਾਲੋ ਕਰੋ", "report_notification.attached_statuses": "{count, plural, one {# post} other {# posts}} attached", + "report_notification.categories.legal": "ਕਨੂੰਨੀ", "report_notification.categories.other": "ਬਾਕੀ", "report_notification.categories.spam": "ਸਪੈਮ", "report_notification.categories.violation": "ਨਿਯਮ ਦੀ ਉਲੰਘਣਾ", + "report_notification.open": "ਰਿਪੋਰਟ ਨੂੰ ਖੋਲ੍ਹੋ", "search.placeholder": "ਖੋਜੋ", "search_popout.quick_actions": "ਫੌਰੀ ਕਾਰਵਾਈਆਂ", "search_popout.specific_date": "ਖਾਸ ਤਾਰੀਖ", @@ -271,10 +298,13 @@ "search_results.accounts": "ਪਰੋਫਾਈਲ", "search_results.all": "ਸਭ", "search_results.hashtags": "ਹੈਸ਼ਟੈਗ", + "search_results.see_all": "ਸਭ ਵੇਖੋ", "search_results.statuses": "ਪੋਸਟਾਂ", + "search_results.title": "{q} ਲਈ ਖੋਜ", "server_banner.learn_more": "ਹੋਰ ਜਾਣੋ", "sign_in_banner.create_account": "ਖਾਤਾ ਬਣਾਓ", "sign_in_banner.sign_in": "ਲਾਗਇਨ", + "sign_in_banner.sso_redirect": "ਲਾਗਇਨ ਜਾਂ ਰਜਿਸਟਰ ਕਰੋ", "status.admin_status": "", "status.block": "@{name} ਉੱਤੇ ਪਾਬੰਦੀ ਲਾਓ", "status.bookmark": "ਬੁੱਕਮਾਰਕ", diff --git a/app/javascript/mastodon/locales/pl.json b/app/javascript/mastodon/locales/pl.json index 2eaeeaab55..814d0f2de0 100644 --- a/app/javascript/mastodon/locales/pl.json +++ b/app/javascript/mastodon/locales/pl.json @@ -145,11 +145,9 @@ "compose_form.lock_disclaimer": "Twoje konto nie jest {locked}. Każdy, kto Cię obserwuje, może wyświetlać Twoje wpisy przeznaczone tylko dla obserwujących.", "compose_form.lock_disclaimer.lock": "zablokowane", "compose_form.placeholder": "Co chodzi ci po głowie?", - "compose_form.poll.add_option": "Dodaj opcję", "compose_form.poll.duration": "Czas trwania głosowania", "compose_form.poll.multiple": "Wielokrotny wybór", "compose_form.poll.option_placeholder": "Opcja {number}", - "compose_form.poll.remove_option": "Usuń tę opcję", "compose_form.poll.single": "Wybierz jedną", "compose_form.poll.switch_to_multiple": "Pozwól na wybranie wielu opcji", "compose_form.poll.switch_to_single": "Pozwól na wybranie tylko jednej opcji", @@ -160,6 +158,7 @@ "compose_form.save_changes": "Aktualizuj", "compose_form.spoiler.marked": "Usuń ostrzeżenie o treści", "compose_form.spoiler.unmarked": "Dodaj ostrzeżenie o treści", + "compose_form.spoiler_placeholder": "Ostrzeżenie o treści (opcjonalne)", "confirmation_modal.cancel": "Anuluj", "confirmations.block.block_and_report": "Zablokuj i zgłoś", "confirmations.block.confirm": "Zablokuj", @@ -278,6 +277,12 @@ "follow_request.authorize": "Autoryzuj", "follow_request.reject": "Odrzuć", "follow_requests.unlocked_explanation": "Mimo że Twoje konto nie jest zablokowane, zespół {domain} uznał że możesz chcieć ręcznie przejrzeć prośby o możliwość obserwacji.", + "follow_suggestions.curated_suggestion": "Wybór redakcji", + "follow_suggestions.dismiss": "Nie pokazuj ponownie", + "follow_suggestions.personalized_suggestion": "Sugestia spersonalizowana", + "follow_suggestions.popular_suggestion": "Sugestia popularna", + "follow_suggestions.view_all": "Pokaż wszystkie", + "follow_suggestions.who_to_follow": "Kogo obserwować", "followed_tags": "Obserwowane hasztagi", "footer.about": "O serwerze", "footer.directory": "Katalog profilów", @@ -304,13 +309,9 @@ "hashtag.follow": "Obserwuj hasztag", "hashtag.unfollow": "Przestań obserwować hashtag", "hashtags.and_other": "…i {count, plural, other {jeszcze #}}", - "home.actions.go_to_explore": "Zobacz, co jest teraz popularne", - "home.actions.go_to_suggestions": "Znajdź ludzi wartych obserwowania", "home.column_settings.basic": "Podstawowe", "home.column_settings.show_reblogs": "Pokazuj podbicia", "home.column_settings.show_replies": "Pokazuj odpowiedzi", - "home.explore_prompt.body": "Twój kanał główny będzie zawierał kombinację postów z tagów i osób które obserwujesz oraz wpisów przezeń podbitych. Jeżeli wydaje się to za spokojnym, spróbuj czegoś poniżej.", - "home.explore_prompt.title": "To twój punkt podparcia w Mastodonie.", "home.hide_announcements": "Ukryj ogłoszenia", "home.pending_critical_update.body": "Zaktualizuj serwer jak tylko będzie to możliwe!", "home.pending_critical_update.link": "Pokaż aktualizacje", @@ -523,11 +524,15 @@ "poll_button.add_poll": "Dodaj głosowanie", "poll_button.remove_poll": "Usuń głosowanie", "privacy.change": "Dostosuj widoczność wpisów", + "privacy.direct.long": "Wszyscy wspomnieni w tym wpisie", "privacy.direct.short": "Konkretni ludzie", "privacy.private.long": "Tylko ci, którzy cię obserwują", "privacy.private.short": "Obserwujący", "privacy.public.long": "Ktokolwiek na i poza Mastodonem", "privacy.public.short": "Publiczny", + "privacy.unlisted.additional": "Taki sam jak \"Publiczny\", ale wpis nie pojawi się w kanałach na żywo, hasztagach, odkrywaniu, ani w wyszukiwaniu w Mastodonie, nawet jeżeli jest to włączone w ustawieniach konta.", + "privacy.unlisted.long": "Widoczne dla każdego, z wyłączeniem funkcji odkrywania", + "privacy.unlisted.short": "Niewidoczny", "privacy_policy.last_updated": "Data ostatniej aktualizacji: {date}", "privacy_policy.title": "Polityka prywatności", "recommended": "Zalecane", @@ -545,7 +550,9 @@ "relative_time.minutes": "{number} min.", "relative_time.seconds": "{number} s.", "relative_time.today": "dzisiaj", + "reply_indicator.attachments": "{count, plural, one {# załącznik} few {# załączniki} many {# załączników} other {# załączniku}}", "reply_indicator.cancel": "Anuluj", + "reply_indicator.poll": "Ankieta", "report.block": "Zablokuj", "report.block_explanation": "Nie zobaczysz ich wpisów. Nie będą mogli zobaczyć Twoich postów ani cię obserwować. Będą mogli domyślić się, że są zablokowani.", "report.categories.legal": "Prawne", diff --git a/app/javascript/mastodon/locales/pt-BR.json b/app/javascript/mastodon/locales/pt-BR.json index bb009239d4..eced6ca7ad 100644 --- a/app/javascript/mastodon/locales/pt-BR.json +++ b/app/javascript/mastodon/locales/pt-BR.json @@ -145,11 +145,9 @@ "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", "compose_form.placeholder": "No que você está pensando?", - "compose_form.poll.add_option": "Adicionar opção", "compose_form.poll.duration": "Duração da enquete", "compose_form.poll.multiple": "Múltipla escolha", "compose_form.poll.option_placeholder": "Opção {number}", - "compose_form.poll.remove_option": "Remover esta opção", "compose_form.poll.single": "Escolha uma", "compose_form.poll.switch_to_multiple": "Permitir múltiplas escolhas", "compose_form.poll.switch_to_single": "Opção única", @@ -279,6 +277,12 @@ "follow_request.authorize": "Aprovar", "follow_request.reject": "Recusar", "follow_requests.unlocked_explanation": "Apesar de seu perfil não ser trancado, {domain} exige que você revise a solicitação para te seguir destes perfis manualmente.", + "follow_suggestions.curated_suggestion": "Escolha dos editores", + "follow_suggestions.dismiss": "Não mostrar novamente", + "follow_suggestions.personalized_suggestion": "Sugestão personalizada", + "follow_suggestions.popular_suggestion": "Sugestão popular", + "follow_suggestions.view_all": "Visualizar tudo", + "follow_suggestions.who_to_follow": "Quem seguir", "followed_tags": "Hashtags seguidas", "footer.about": "Sobre", "footer.directory": "Diretório de perfis", @@ -305,13 +309,9 @@ "hashtag.follow": "Seguir hashtag", "hashtag.unfollow": "Parar de seguir hashtag", "hashtags.and_other": "…e {count, plural, one {}other {outros #}}", - "home.actions.go_to_explore": "Veja o que está acontecendo", - "home.actions.go_to_suggestions": "Encontre pessoas para seguir", "home.column_settings.basic": "Básico", "home.column_settings.show_reblogs": "Mostrar boosts", "home.column_settings.show_replies": "Mostrar respostas", - "home.explore_prompt.body": "Seu feed inicial terá uma mistura de publicações das hashtags que você escolheu seguir, das pessoas que você escolheu seguir e das publicações que elas impulsionam. Se está parecendo tranquilo demais, então que tal:", - "home.explore_prompt.title": "Esta é a sua base principal dentro do Mastodon.", "home.hide_announcements": "Ocultar comunicados", "home.pending_critical_update.body": "Por favor, atualize o seu servidor Mastodon o mais rápido possível!", "home.pending_critical_update.link": "Ver atualizações", diff --git a/app/javascript/mastodon/locales/pt-PT.json b/app/javascript/mastodon/locales/pt-PT.json index 22bb1bbfd2..3674126144 100644 --- a/app/javascript/mastodon/locales/pt-PT.json +++ b/app/javascript/mastodon/locales/pt-PT.json @@ -145,11 +145,9 @@ "compose_form.lock_disclaimer": "A sua conta não é {locked}. Qualquer pessoa pode segui-lo e ver as publicações direcionadas apenas a seguidores.", "compose_form.lock_disclaimer.lock": "fechada", "compose_form.placeholder": "Em que está a pensar?", - "compose_form.poll.add_option": "Adicionar opção", "compose_form.poll.duration": "Duração do inquérito", "compose_form.poll.multiple": "Escolha múltipla", "compose_form.poll.option_placeholder": "Opção {number}", - "compose_form.poll.remove_option": "Eliminar esta opção", "compose_form.poll.single": "Escolha uma", "compose_form.poll.switch_to_multiple": "Alterar o inquérito para permitir várias respostas", "compose_form.poll.switch_to_single": "Alterar o inquérito para permitir uma única resposta", @@ -279,6 +277,12 @@ "follow_request.authorize": "Autorizar", "follow_request.reject": "Rejeitar", "follow_requests.unlocked_explanation": "Apesar de a sua não ser privada, a administração de {domain} pensa que poderá querer rever manualmente os pedidos de seguimento dessas contas.", + "follow_suggestions.curated_suggestion": "Escolha dos Editores", + "follow_suggestions.dismiss": "Não mostrar novamente", + "follow_suggestions.personalized_suggestion": "Sugestão personalizada", + "follow_suggestions.popular_suggestion": "Sugestão popular", + "follow_suggestions.view_all": "Ver tudo", + "follow_suggestions.who_to_follow": "Quem seguir", "followed_tags": "Hashtags seguidas", "footer.about": "Sobre", "footer.directory": "Diretório de perfis", @@ -305,13 +309,9 @@ "hashtag.follow": "Seguir #etiqueta", "hashtag.unfollow": "Deixar de seguir #etiqueta", "hashtags.and_other": "…e {count, plural, other {mais #}}", - "home.actions.go_to_explore": "Veja as tendências atuais", - "home.actions.go_to_suggestions": "Encontrar pessoas para seguir", "home.column_settings.basic": "Básico", "home.column_settings.show_reblogs": "Mostrar impulsos", "home.column_settings.show_replies": "Mostrar respostas", - "home.explore_prompt.body": "A sua página inicial terá uma mistura de publicações com as hashtags que escolheu seguir, das pessoas que escolheu seguir e as publicações que elas partilham. Parece bastante sossegado por agora, talvez queira:", - "home.explore_prompt.title": "Esta é a sua base principal dentro do Mastodon.", "home.hide_announcements": "Ocultar comunicações", "home.pending_critical_update.body": "Por favor, atualize o seu servidor Mastodon assim que possível!", "home.pending_critical_update.link": "Ver atualizações", diff --git a/app/javascript/mastodon/locales/ro.json b/app/javascript/mastodon/locales/ro.json index e6d881a986..d236ba4969 100644 --- a/app/javascript/mastodon/locales/ro.json +++ b/app/javascript/mastodon/locales/ro.json @@ -266,7 +266,6 @@ "hashtag.column_settings.tag_toggle": "Adaugă etichete suplimentare pentru această coloană", "hashtag.follow": "Urmărește haștagul", "hashtag.unfollow": "Nu mai urmări haștagul", - "home.actions.go_to_suggestions": "Găsește persoane de urmărit", "home.column_settings.basic": "De bază", "home.column_settings.show_reblogs": "Afișează distribuirile", "home.column_settings.show_replies": "Afișează răspunsurile", diff --git a/app/javascript/mastodon/locales/ru.json b/app/javascript/mastodon/locales/ru.json index eefa9c7298..623b403832 100644 --- a/app/javascript/mastodon/locales/ru.json +++ b/app/javascript/mastodon/locales/ru.json @@ -146,11 +146,19 @@ "compose_form.lock_disclaimer.lock": "не закрыта", "compose_form.placeholder": "О чём думаете?", "compose_form.poll.duration": "Продолжительность опроса", + "compose_form.poll.multiple": "Несколько вариантов ответа", + "compose_form.poll.option_placeholder": "Вариант {number}", + "compose_form.poll.single": "Выберите один", "compose_form.poll.switch_to_multiple": "Разрешить выбор нескольких вариантов", "compose_form.poll.switch_to_single": "Переключить в режим выбора одного ответа", + "compose_form.poll.type": "Стиль", + "compose_form.publish": "Опубликовать", "compose_form.publish_form": "Опубликовать", + "compose_form.reply": "Ответить", + "compose_form.save_changes": "Сохранить", "compose_form.spoiler.marked": "Текст скрыт за предупреждением", "compose_form.spoiler.unmarked": "Текст не скрыт", + "compose_form.spoiler_placeholder": "Предупреждение о контенте (опционально)", "confirmation_modal.cancel": "Отмена", "confirmations.block.block_and_report": "Заблокировать и пожаловаться", "confirmations.block.confirm": "Заблокировать", @@ -229,7 +237,7 @@ "empty_column.follow_requests": "Вам ещё не приходили запросы на подписку. Все новые запросы будут показаны здесь.", "empty_column.followed_tags": "Вы еще не подписались ни на один хэштег. Когда вы это сделаете, они появятся здесь.", "empty_column.hashtag": "С этим хэштегом пока ещё ничего не постили.", - "empty_column.home": "Ваша лента совсем пуста! Подпишитесь на других, чтобы заполнить её. {suggestions}", + "empty_column.home": "Ваша лента совсем пуста! Подписывайтесь на других, чтобы заполнить её.", "empty_column.list": "В этом списке пока ничего нет.", "empty_column.lists": "У вас ещё нет списков. Созданные вами списки будут показаны здесь.", "empty_column.mutes": "Вы ещё никого не добавляли в список игнорируемых.", @@ -269,6 +277,12 @@ "follow_request.authorize": "Авторизовать", "follow_request.reject": "Отказать", "follow_requests.unlocked_explanation": "Хотя ваша учетная запись не закрыта, команда {domain} подумала, что вы захотите просмотреть запросы от этих учетных записей вручную.", + "follow_suggestions.curated_suggestion": "Выбор редакции", + "follow_suggestions.dismiss": "Больше не показывать", + "follow_suggestions.personalized_suggestion": "Персонализированное предложение", + "follow_suggestions.popular_suggestion": "Популярное предложение", + "follow_suggestions.view_all": "Посмотреть все", + "follow_suggestions.who_to_follow": "На кого подписаться", "followed_tags": "Отслеживаемые хэштеги", "footer.about": "О проекте", "footer.directory": "Каталог профилей", @@ -295,13 +309,9 @@ "hashtag.follow": "Подписаться на новые посты", "hashtag.unfollow": "Отписаться", "hashtags.and_other": "...и {count, plural, other {# ещё}}", - "home.actions.go_to_explore": "Посмотреть, что актуально", - "home.actions.go_to_suggestions": "Подпишитесь на людей", "home.column_settings.basic": "Основные", "home.column_settings.show_reblogs": "Показывать продвижения", "home.column_settings.show_replies": "Показывать ответы", - "home.explore_prompt.body": "В вашем доме появятся сообщения из хэштегов, на которые вы хотите подписаться, люди, которых вы выбрали подписаться, и сообщения, которые они увеличили. Сейчас выглядит спокойно, так что:", - "home.explore_prompt.title": "Это ваша домашняя база в Мастодоне.", "home.hide_announcements": "Скрыть объявления", "home.pending_critical_update.body": "Пожалуйста, обновите свой сервер Mastodon как можно скорее!", "home.pending_critical_update.link": "Посмотреть обновления", @@ -514,7 +524,15 @@ "poll_button.add_poll": "Добавить опрос", "poll_button.remove_poll": "Удалить опрос", "privacy.change": "Изменить видимость поста", + "privacy.direct.long": "Все упомянутые в посте", + "privacy.direct.short": "Определённые люди", + "privacy.private.long": "Только ваши подписчики", + "privacy.private.short": "Подписчики", + "privacy.public.long": "Любой, находящийся на Mastodon и вне его", "privacy.public.short": "Публичный", + "privacy.unlisted.additional": "Работает точно так же, как public, за исключением того, что пост не будет отображаться в прямых лентах, хэштегах, исследованиях или поиске Mastodon, даже если ваш аккаунт подписан на это на уровне всего аккаунта.", + "privacy.unlisted.long": "Меньше алгоритмических фанфар", + "privacy.unlisted.short": "Тихий публичный", "privacy_policy.last_updated": "Последнее обновление {date}", "privacy_policy.title": "Политика конфиденциальности", "recommended": "Рекомендуется", @@ -532,7 +550,9 @@ "relative_time.minutes": "{number} мин", "relative_time.seconds": "{number} с", "relative_time.today": "сегодня", + "reply_indicator.attachments": "{count, plural, one {# вложение} other {# вложения}}", "reply_indicator.cancel": "Отмена", + "reply_indicator.poll": "Опрос", "report.block": "Заблокировать", "report.block_explanation": "Вы перестанете видеть посты этого пользователя, и он(а) больше не сможет подписаться на вас и читать ваши посты. Он(а) сможет понять, что вы заблокировали его/её.", "report.categories.legal": "Правовая информация", diff --git a/app/javascript/mastodon/locales/si.json b/app/javascript/mastodon/locales/si.json index 1b2eb17633..2058d1415b 100644 --- a/app/javascript/mastodon/locales/si.json +++ b/app/javascript/mastodon/locales/si.json @@ -201,11 +201,8 @@ "hashtag.column_settings.tag_mode.all": "මේ සියල්ලම", "hashtag.column_settings.tag_mode.none": "මේ කිසිවක් නැත", "hashtag.column_settings.tag_toggle": "මෙම තීරුවේ අමතර ටැග් ඇතුළත් කරන්න", - "home.actions.go_to_explore": "නැගී එන දෑ බලන්න", - "home.actions.go_to_suggestions": "පුද්ගලයින් සොයන්න", "home.column_settings.basic": "මූලික", "home.column_settings.show_replies": "පිළිතුරු පෙන්වන්න", - "home.explore_prompt.title": "මෙය ඔබගේ මාස්ටඩන් මුල් පිටුවයි.", "home.hide_announcements": "නිවේදන සඟවන්න", "home.pending_critical_update.link": "යාවත්කාල බලන්න", "home.show_announcements": "නිවේදන පෙන්වන්න", diff --git a/app/javascript/mastodon/locales/sk.json b/app/javascript/mastodon/locales/sk.json index 5b1203aeea..b91c45bb29 100644 --- a/app/javascript/mastodon/locales/sk.json +++ b/app/javascript/mastodon/locales/sk.json @@ -35,7 +35,7 @@ "account.follow_back": "Nasleduj späť", "account.followers": "Sledovatelia", "account.followers.empty": "Tohto používateľa ešte nikto nenasleduje.", - "account.followers_counter": "{count, plural, one {{counter} Sledujúci} few {{counter} Sledujúci} many {{counter} Sledujúcich} other {{counter} Sledujúcich}}", + "account.followers_counter": "{count, plural, one {{counter} Sledujúci} other {{counter} Sledujúci}}", "account.following": "Sledujem", "account.following_counter": "{count, plural, one {{counter} Sledovaných} other {{counter} Sledujúcich}}", "account.follows.empty": "Tento používateľ ešte nikoho nesleduje.", @@ -142,15 +142,23 @@ "compose_form.direct_message_warning_learn_more": "Zisti viac", "compose_form.encryption_warning": "Príspevky na Mastodon nie sú end-to-end šifrované. Nezdieľajte cez Mastodon žiadne citlivé informácie.", "compose_form.hashtag_warning": "Tento príspevok nebude zobrazený pod žiadným haštagom, lebo nieje verejne listovaný. Iba verejné príspevky môžu byť nájdené podľa haštagu.", - "compose_form.lock_disclaimer": "Tvoj účet nie je {locked}. Ktokoľvek ťa môže nasledovať a vidieť tvoje správy pre sledujúcich.", + "compose_form.lock_disclaimer": "Tvoj účet nie je {locked}. Ktokoľvek ťa môže nasledovať a vidieť tvoje príspevky pre sledujúcich.", "compose_form.lock_disclaimer.lock": "zamknutý", "compose_form.placeholder": "Čo máš na mysli?", "compose_form.poll.duration": "Trvanie ankety", + "compose_form.poll.multiple": "Viacero možností", + "compose_form.poll.option_placeholder": "Voľba {number}", + "compose_form.poll.single": "Vyber jednu", "compose_form.poll.switch_to_multiple": "Zmeň anketu pre povolenie viacerých možností", "compose_form.poll.switch_to_single": "Zmeň anketu na takú s jedinou voľbou", + "compose_form.poll.type": "Typ", + "compose_form.publish": "Prispej", "compose_form.publish_form": "Zverejniť", + "compose_form.reply": "Odpovedz", + "compose_form.save_changes": "Aktualizácia", "compose_form.spoiler.marked": "Text je ukrytý za varovaním", "compose_form.spoiler.unmarked": "Text nieje ukrytý", + "compose_form.spoiler_placeholder": "Varovanie o obsahu (voliteľné)", "confirmation_modal.cancel": "Zruš", "confirmations.block.block_and_report": "Zablokuj a nahlás", "confirmations.block.confirm": "Blokuj", @@ -269,6 +277,10 @@ "follow_request.authorize": "Povoľ prístup", "follow_request.reject": "Odmietni", "follow_requests.unlocked_explanation": "Síce Váš učet nie je uzamknutý, ale {domain} tím si myslel že môžete chcieť skontrolovať žiadosti o sledovanie z týchto účtov manuálne.", + "follow_suggestions.dismiss": "Znovu nezobrazuj", + "follow_suggestions.personalized_suggestion": "Prispôsobené odporúčania", + "follow_suggestions.view_all": "Zobraz všetky", + "follow_suggestions.who_to_follow": "Koho nasledovať", "followed_tags": "Nasledované haštagy", "footer.about": "O", "footer.directory": "Adresár profilov", @@ -289,19 +301,15 @@ "hashtag.column_settings.tag_mode.any": "Hociktorý z týchto", "hashtag.column_settings.tag_mode.none": "Žiaden z týchto", "hashtag.column_settings.tag_toggle": "Vlož dodatočné haštagy pre tento stĺpec", - "hashtag.counter_by_accounts": "{count, plural, one {{counter} sledujúci} few {{counter} sledujúci} many {{counter} sledujúcich} other {{counter} sledujúcich}}", + "hashtag.counter_by_accounts": "{count, plural, one {{counter} účastník} other {{counter} účastníci}}", "hashtag.counter_by_uses": "{count, plural, one {{counter} príspevok} few {{counter} príspevky} many {{counter} príspevkov} other {{counter} príspevkov}}", "hashtag.counter_by_uses_today": "{count, plural, one {{counter} príspevok} few {{counter} príspevky} many {{counter} príspevkov} other {{counter} príspevkov}} dnes", "hashtag.follow": "Sleduj haštag", "hashtag.unfollow": "Nesleduj haštag", "hashtags.and_other": "…a {count, plural, one {} few {# ďalšie} many {# ďalších}other {# ďalších}}", - "home.actions.go_to_explore": "Pozrieť, čo je trendy", - "home.actions.go_to_suggestions": "Nájdi ľudí na sledovanie", "home.column_settings.basic": "Základné", "home.column_settings.show_reblogs": "Ukáž vyzdvihnuté", "home.column_settings.show_replies": "Ukáž odpovede", - "home.explore_prompt.body": "Váš domovský informačný kanál bude obsahovať mix príspevkov z mriežok, ktoré ste sa rozhodli sledovať, ľudí, ktorých ste sa rozhodli sledovať, a príspevkov, ktoré preferujú. Ak sa vám to zdá príliš málo, možno budete chcieť:", - "home.explore_prompt.title": "Toto je tvoja domovina v rámci Mastodonu.", "home.hide_announcements": "Skry oznámenia", "home.pending_critical_update.body": "Prosím aktualizuj si svoj Mastodon server, ako náhle to bude možné!", "home.pending_critical_update.link": "Pozri aktualizácie", @@ -513,6 +521,7 @@ "poll_button.add_poll": "Pridaj anketu", "poll_button.remove_poll": "Odstráň anketu", "privacy.change": "Uprav súkromie príspevku", + "privacy.private.short": "Sledovatelia", "privacy.public.short": "Verejné", "privacy_policy.last_updated": "Posledná úprava {date}", "privacy_policy.title": "Zásady súkromia", @@ -532,6 +541,7 @@ "relative_time.seconds": "{number}sek", "relative_time.today": "dnes", "reply_indicator.cancel": "Zrušiť", + "reply_indicator.poll": "Anketa", "report.block": "Blokuj", "report.block_explanation": "Ich príspevky neuvidíte. Nebudú môcť vidieť vaše príspevky ani vás sledovať. Budú môcť zistiť, že sú zablokovaní.", "report.categories.legal": "Právne ujednania", diff --git a/app/javascript/mastodon/locales/sl.json b/app/javascript/mastodon/locales/sl.json index 559b05db72..3aae75dc36 100644 --- a/app/javascript/mastodon/locales/sl.json +++ b/app/javascript/mastodon/locales/sl.json @@ -146,11 +146,19 @@ "compose_form.lock_disclaimer.lock": "zaklenjen", "compose_form.placeholder": "O čem razmišljate?", "compose_form.poll.duration": "Trajanje ankete", + "compose_form.poll.multiple": "Več možnosti", + "compose_form.poll.option_placeholder": "Možnost {number}", + "compose_form.poll.single": "Izberite eno možnost", "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.poll.type": "Slog", + "compose_form.publish": "Objavi", "compose_form.publish_form": "Objavi", + "compose_form.reply": "Odgovori", + "compose_form.save_changes": "Posodobi", "compose_form.spoiler.marked": "Odstrani opozorilo o vsebini", "compose_form.spoiler.unmarked": "Dodaj opozorilo o vsebini", + "compose_form.spoiler_placeholder": "Opozorilo o vsebini (ni obvezno)", "confirmation_modal.cancel": "Prekliči", "confirmations.block.block_and_report": "Blokiraj in prijavi", "confirmations.block.confirm": "Blokiraj", @@ -269,6 +277,12 @@ "follow_request.authorize": "Overi", "follow_request.reject": "Zavrni", "follow_requests.unlocked_explanation": "Čeprav vaš račun ni zaklenjen, zaposleni pri {domain} menijo, da bi morda želeli pregledati zahteve za sledenje teh računov ročno.", + "follow_suggestions.curated_suggestion": "Izbor urednikov", + "follow_suggestions.dismiss": "Ne pokaži več", + "follow_suggestions.personalized_suggestion": "Osebno prilagojen predlog", + "follow_suggestions.popular_suggestion": "Priljubljen predlog", + "follow_suggestions.view_all": "Pokaži vse", + "follow_suggestions.who_to_follow": "Komu slediti", "followed_tags": "Sledeni ključniki", "footer.about": "O Mastodonu", "footer.directory": "Imenik profilov", @@ -295,13 +309,9 @@ "hashtag.follow": "Sledi ključniku", "hashtag.unfollow": "Nehaj slediti ključniku", "hashtags.and_other": "…in še {count, plural, other {#}}", - "home.actions.go_to_explore": "Poglejte, kaj je v trendu", - "home.actions.go_to_suggestions": "Poiščite osebe, ki jim želite slediti", "home.column_settings.basic": "Osnovno", "home.column_settings.show_reblogs": "Pokaži izpostavitve", "home.column_settings.show_replies": "Pokaži odgovore", - "home.explore_prompt.body": "Vaš domači vir bo vseboval mešanico objav ključnikov, ki ste jih izbrali za sledenje, oseb, ki ste jih izbrali za sledenje, in objav, ki jih ti izpostavljajo. Če se vam to zdi preveč tiho, morda želite:", - "home.explore_prompt.title": "To je vaš dom v okviru Mastodona.", "home.hide_announcements": "Skrij obvestila", "home.pending_critical_update.body": "Čim prej posodobite svoj strežnik Mastodon!", "home.pending_critical_update.link": "Glejte posodobitve", @@ -514,7 +524,15 @@ "poll_button.add_poll": "Dodaj anketo", "poll_button.remove_poll": "Odstrani anketo", "privacy.change": "Spremeni zasebnost objave", + "privacy.direct.long": "Vsem omenjenim v objavi", + "privacy.direct.short": "Določenim ljudem", + "privacy.private.long": "Samo vašim sledilcem", + "privacy.private.short": "Sledilcem", + "privacy.public.long": "Vsem, ki so ali niso na Mastodonu", "privacy.public.short": "Javno", + "privacy.unlisted.additional": "Učinek je enak kot pri javni objavi, le da se ta ne bo prikazala v živih virih, med ključniki, raziskovanjem ali iskanjem, četudi ste to vključili na ravni računa.", + "privacy.unlisted.long": "Manj vsebine po izboru algoritma", + "privacy.unlisted.short": "Tiho javno", "privacy_policy.last_updated": "Zadnja posodobitev {date}", "privacy_policy.title": "Pravilnik o zasebnosti", "recommended": "Priporočeno", @@ -532,7 +550,9 @@ "relative_time.minutes": "{number} m", "relative_time.seconds": "{number} s", "relative_time.today": "danes", + "reply_indicator.attachments": "{count, plural, one {# priloga} two {# prilogi} few {# priloge} other {# prilog}}", "reply_indicator.cancel": "Prekliči", + "reply_indicator.poll": "Anketa", "report.block": "Blokiraj", "report.block_explanation": "Njihovih objav ne boste videli. Oni ne bodo videli vaših objav, niti vam ne morejo slediti. Lahko bodo ugotovili, da so blokirani.", "report.categories.legal": "Pravno obvestilo", diff --git a/app/javascript/mastodon/locales/sq.json b/app/javascript/mastodon/locales/sq.json index bfc674248b..496e35fe76 100644 --- a/app/javascript/mastodon/locales/sq.json +++ b/app/javascript/mastodon/locales/sq.json @@ -145,11 +145,9 @@ "compose_form.lock_disclaimer": "Llogaria juaj s’është {locked}. Mund ta ndjekë cilido, për të parë postimet tuaja vetëm për ndjekësit.", "compose_form.lock_disclaimer.lock": "e kyçur", "compose_form.placeholder": "Ç’bluani në mendje?", - "compose_form.poll.add_option": "Shtoni mundësi", "compose_form.poll.duration": "Kohëzgjatje pyetësori", "compose_form.poll.multiple": "Shumë zgjedhje", "compose_form.poll.option_placeholder": "Mundësia {number}", - "compose_form.poll.remove_option": "Hiqe këtë mundësi", "compose_form.poll.single": "Zgjidhni një", "compose_form.poll.switch_to_multiple": "Ndrysho votimin për të lejuar shumë zgjedhje", "compose_form.poll.switch_to_single": "Ndrysho votimin për të lejuar vetëm një zgjedhje", @@ -279,6 +277,12 @@ "follow_request.authorize": "Autorizoje", "follow_request.reject": "Hidhe tej", "follow_requests.unlocked_explanation": "Edhe pse llogaria juaj s’është e kyçur, ekipi i {domain} mendoi se mund të donit të shqyrtonit dorazi kërkesa ndjekjeje prej këtyre llogarive.", + "follow_suggestions.curated_suggestion": "Zgjedhur nga Ekipi", + "follow_suggestions.dismiss": "Mos shfaq më", + "follow_suggestions.personalized_suggestion": "Sugjerim i personalizuar", + "follow_suggestions.popular_suggestion": "Sugjerim popullor", + "follow_suggestions.view_all": "Shihni krejt", + "follow_suggestions.who_to_follow": "Cilët të ndiqen", "followed_tags": "Hashtag-ë të ndjekur", "footer.about": "Mbi", "footer.directory": "Drejtori profilesh", @@ -305,13 +309,9 @@ "hashtag.follow": "Ndiqe hashtag-un", "hashtag.unfollow": "Hiqe ndjekjen e hashtag-ut", "hashtags.and_other": "…dhe {count, plural, one {}other {# më tepër}}", - "home.actions.go_to_explore": "Shihni ç’është në modë", - "home.actions.go_to_suggestions": "Gjeni persona për ndjekje", "home.column_settings.basic": "Bazë", "home.column_settings.show_reblogs": "Shfaq përforcime", "home.column_settings.show_replies": "Shfaq përgjigje", - "home.explore_prompt.body": "Prurja juaj bazë do të ketë një përzierje postimesh nga hashtag-ë që keni zgjedhur të ndiqni, persona që keni zgjedhur të ndiqni dhe postime që ata përforcojnë. Nëse kjo duket si shumë qetësi, mund të doni të:", - "home.explore_prompt.title": "Kjo është baza juaj brenda Mastodon-it.", "home.hide_announcements": "Fshihi lajmërimet", "home.pending_critical_update.body": "Ju lutemi, përditësoni sa më shpejt të jetë e mundur shërbyesin tuaj Mastodon!", "home.pending_critical_update.link": "Shihni përditësime", diff --git a/app/javascript/mastodon/locales/sr-Latn.json b/app/javascript/mastodon/locales/sr-Latn.json index b0348748a6..d9490ef70d 100644 --- a/app/javascript/mastodon/locales/sr-Latn.json +++ b/app/javascript/mastodon/locales/sr-Latn.json @@ -146,11 +146,19 @@ "compose_form.lock_disclaimer.lock": "zaključan", "compose_form.placeholder": "O čemu razmišljate?", "compose_form.poll.duration": "Trajanje ankete", + "compose_form.poll.multiple": "Višestruki izbor", + "compose_form.poll.option_placeholder": "Opcija {number}", + "compose_form.poll.single": "Odaberite jedno", "compose_form.poll.switch_to_multiple": "Promenite anketu da biste omogućili više izbora", "compose_form.poll.switch_to_single": "Promenite anketu da biste omogućili jedan izbor", + "compose_form.poll.type": "Stil", + "compose_form.publish": "Objavi", "compose_form.publish_form": "Objavi", + "compose_form.reply": "Odgovori", + "compose_form.save_changes": "Ažuriraj", "compose_form.spoiler.marked": "Ukloni upozorenje o sadržaju", "compose_form.spoiler.unmarked": "Dodaj upozorenje o sadržaju", + "compose_form.spoiler_placeholder": "Upozorenje o sadržaju (opciono)", "confirmation_modal.cancel": "Otkaži", "confirmations.block.block_and_report": "Blokiraj i prijavi", "confirmations.block.confirm": "Blokiraj", @@ -269,6 +277,12 @@ "follow_request.authorize": "Odobri", "follow_request.reject": "Odbij", "follow_requests.unlocked_explanation": "Iako vaš nalog nije zaključan, osoblje {domain} smatra da biste možda želeli da ručno pregledate zahteve za praćenje sa ovih naloga.", + "follow_suggestions.curated_suggestion": "Izbor urednika", + "follow_suggestions.dismiss": "Ne prikazuj ponovo", + "follow_suggestions.personalized_suggestion": "Personalizovani predlog", + "follow_suggestions.popular_suggestion": "Popularni predlog", + "follow_suggestions.view_all": "Prikaži sve", + "follow_suggestions.who_to_follow": "Koga pratiti", "followed_tags": "Praćene heš oznake", "footer.about": "Osnovni podaci", "footer.directory": "Direktorijum profila", @@ -295,13 +309,9 @@ "hashtag.follow": "Zaprati heš oznaku", "hashtag.unfollow": "Otprati heš oznaku", "hashtags.and_other": "…i {count, plural, one {još #} few {još #}other {još #}}", - "home.actions.go_to_explore": "Pogledate šta je u trendu", - "home.actions.go_to_suggestions": "Pronađete ljude koje biste pratili", "home.column_settings.basic": "Osnovna", "home.column_settings.show_reblogs": "Prikaži podržavanja", "home.column_settings.show_replies": "Prikaži odgovore", - "home.explore_prompt.body": "Vaša početna stranica će imati mešavinu objava od heš oznaka koje ste izabrali da pratite, ljudi koje ste izabrali da pratite i objava koje su podržali. Ako izgleda previše tiho, možda ćete želeti da:", - "home.explore_prompt.title": "Ovo je vaša matična baza u Mastodon-u.", "home.hide_announcements": "Sakrij najave", "home.pending_critical_update.body": "Ažurirajte svoj Mastodon server što je pre moguće!", "home.pending_critical_update.link": "Pogledajte ažuriranja", @@ -514,7 +524,15 @@ "poll_button.add_poll": "Dodaj anketu", "poll_button.remove_poll": "Ukloni anketu", "privacy.change": "Promeni privatnost objave", + "privacy.direct.long": "Svi pomenuti u objavi", + "privacy.direct.short": "Određeni ljudi", + "privacy.private.long": "Samo vaši pratioci", + "privacy.private.short": "Pratioci", + "privacy.public.long": "Bilo ko na Mastodon-u i van njega", "privacy.public.short": "Javno", + "privacy.unlisted.additional": "Ovo se ponaša potpuno kao javno, osim što se objava neće pojavljivati u izvorima uživo ili heš oznakama, istraživanjima ili pretrazi Mastodon-a, čak i ako ste uključeni u celom nalogu.", + "privacy.unlisted.long": "Manje algoritamskih fanfara", + "privacy.unlisted.short": "Tiha javnost", "privacy_policy.last_updated": "Poslednje ažuriranje {date}", "privacy_policy.title": "Politika privatnosti", "recommended": "Preporučeno", @@ -532,7 +550,9 @@ "relative_time.minutes": "{number} min.", "relative_time.seconds": "{number} sek.", "relative_time.today": "danas", + "reply_indicator.attachments": "{count, plural, one {# prilog} few {# priloga} other {# priloga}}", "reply_indicator.cancel": "Otkaži", + "reply_indicator.poll": "Anketa", "report.block": "Blokiraj", "report.block_explanation": "Nećete videti objave korisnika. Ni on neće videti Vaše objave niti će moći da Vas prati. Takođe će moći da sazna da je blokiran.", "report.categories.legal": "Pravni", diff --git a/app/javascript/mastodon/locales/sr.json b/app/javascript/mastodon/locales/sr.json index 4e4956e1a2..fd09f5db49 100644 --- a/app/javascript/mastodon/locales/sr.json +++ b/app/javascript/mastodon/locales/sr.json @@ -145,11 +145,9 @@ "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.multiple": "Вишеструки избор", "compose_form.poll.option_placeholder": "Опција {number}", - "compose_form.poll.remove_option": "Уклони ову опцију", "compose_form.poll.single": "Одаберите једно", "compose_form.poll.switch_to_multiple": "Промените анкету да бисте омогућили више избора", "compose_form.poll.switch_to_single": "Промените анкету да бисте омогућили један избор", @@ -279,6 +277,12 @@ "follow_request.authorize": "Одобри", "follow_request.reject": "Одбиј", "follow_requests.unlocked_explanation": "Иако ваш налог није закључан, особље {domain} сматра да бисте можда желели да ручно прегледате захтеве за праћење са ових налога.", + "follow_suggestions.curated_suggestion": "Избор уредника", + "follow_suggestions.dismiss": "Не приказуј поново", + "follow_suggestions.personalized_suggestion": "Персонализовани предлог", + "follow_suggestions.popular_suggestion": "Популарни предлог", + "follow_suggestions.view_all": "Прикажи све", + "follow_suggestions.who_to_follow": "Кога пратити", "followed_tags": "Праћене хеш ознаке", "footer.about": "Основни подаци", "footer.directory": "Директоријум профила", @@ -305,13 +309,9 @@ "hashtag.follow": "Запрати хеш ознаку", "hashtag.unfollow": "Отпрати хеш ознаку", "hashtags.and_other": "…и {count, plural, one {још #} few {још #}other {још #}}", - "home.actions.go_to_explore": "Погледате шта је у тренду", - "home.actions.go_to_suggestions": "Пронађете људе које бисте пратили", "home.column_settings.basic": "Основна", "home.column_settings.show_reblogs": "Прикажи подржавања", "home.column_settings.show_replies": "Прикажи одговоре", - "home.explore_prompt.body": "Ваша почетна страница ће имати мешавину објава од хеш ознака које сте изабрали да пратите, људи које сте изабрали да пратите и објава које су подржали. Ако изгледа превише тихо, можда ћете желети да:", - "home.explore_prompt.title": "Ово је ваша матична база у Mastodon-у.", "home.hide_announcements": "Сакриј најаве", "home.pending_critical_update.body": "Ажурирајте свој Mastodon сервер што је пре могуће!", "home.pending_critical_update.link": "Погледајте ажурирања", diff --git a/app/javascript/mastodon/locales/sv.json b/app/javascript/mastodon/locales/sv.json index d6e6555b53..f9356fd279 100644 --- a/app/javascript/mastodon/locales/sv.json +++ b/app/javascript/mastodon/locales/sv.json @@ -145,12 +145,13 @@ "compose_form.lock_disclaimer": "Ditt konto är inte {locked}. Vem som helst kan följa dig för att se dina inlägg som endast är för följare.", "compose_form.lock_disclaimer.lock": "låst", "compose_form.placeholder": "Vad tänker du på?", - "compose_form.poll.add_option": "Lägg till alternativ", "compose_form.poll.duration": "Varaktighet för omröstning", + "compose_form.poll.multiple": "Flera val", "compose_form.poll.option_placeholder": "Alternativ {number}", "compose_form.poll.switch_to_multiple": "Ändra enkät för att tillåta flera val", "compose_form.poll.switch_to_single": "Ändra enkät för att tillåta ett enda val", "compose_form.poll.type": "Stil", + "compose_form.publish": "Publicera", "compose_form.publish_form": "Publicera", "compose_form.reply": "Svara", "compose_form.save_changes": "Uppdatera", @@ -275,6 +276,10 @@ "follow_request.authorize": "Godkänn", "follow_request.reject": "Avvisa", "follow_requests.unlocked_explanation": "Även om ditt konto inte är låst tror {domain} personalen att du kanske vill granska dessa följares förfrågningar manuellt.", + "follow_suggestions.dismiss": "Visa inte igen", + "follow_suggestions.personalized_suggestion": "Personligt förslag", + "follow_suggestions.popular_suggestion": "Populärt förslag", + "follow_suggestions.view_all": "Visa alla", "followed_tags": "Följda hashtags", "footer.about": "Om", "footer.directory": "Profilkatalog", @@ -301,13 +306,9 @@ "hashtag.follow": "Följ hashtagg", "hashtag.unfollow": "Avfölj hashtagg", "hashtags.and_other": "…och {count, plural, one {}other {# mer}}", - "home.actions.go_to_explore": "Se vad som trendar", - "home.actions.go_to_suggestions": "Hitta personer att följa", "home.column_settings.basic": "Grundläggande", "home.column_settings.show_reblogs": "Visa boostar", "home.column_settings.show_replies": "Visa svar", - "home.explore_prompt.body": "Din hemflöde kommer att ha en blandning av inlägg från taggar du har valt att följa, de människor som du har valt att följa och de inlägg som de boostar. Om det känns för tyst kanske du vill:", - "home.explore_prompt.title": "Detta är din hembas inom Mastodon.", "home.hide_announcements": "Dölj notiser", "home.pending_critical_update.body": "Uppdatera din Mastodon-server så snart som möjligt!", "home.pending_critical_update.link": "Se uppdateringar", @@ -518,6 +519,7 @@ "poll_button.add_poll": "Lägg till en omröstning", "poll_button.remove_poll": "Ta bort omröstning", "privacy.change": "Ändra inläggsintegritet", + "privacy.direct.long": "Alla som nämns i inlägget", "privacy.private.long": "Endast dina följare", "privacy.private.short": "Följare", "privacy.public.long": "Alla på och utanför Mastodon", @@ -539,6 +541,7 @@ "relative_time.minutes": "{number}min", "relative_time.seconds": "{number}sek", "relative_time.today": "idag", + "reply_indicator.attachments": "{count, plural, one {# bilaga} other {# bilagor}}", "reply_indicator.cancel": "Ångra", "reply_indicator.poll": "Omröstning", "report.block": "Blockera", diff --git a/app/javascript/mastodon/locales/th.json b/app/javascript/mastodon/locales/th.json index 4437afa78c..72ecb11ed1 100644 --- a/app/javascript/mastodon/locales/th.json +++ b/app/javascript/mastodon/locales/th.json @@ -146,11 +146,19 @@ "compose_form.lock_disclaimer.lock": "ล็อคอยู่", "compose_form.placeholder": "คุณกำลังคิดอะไรอยู่?", "compose_form.poll.duration": "ระยะเวลาการสำรวจความคิดเห็น", + "compose_form.poll.multiple": "หลายตัวเลือก", + "compose_form.poll.option_placeholder": "ตัวเลือก {number}", + "compose_form.poll.single": "เลือกอย่างใดอย่างหนึ่ง", "compose_form.poll.switch_to_multiple": "เปลี่ยนการสำรวจความคิดเห็นเป็นอนุญาตหลายตัวเลือก", "compose_form.poll.switch_to_single": "เปลี่ยนการสำรวจความคิดเห็นเป็นอนุญาตตัวเลือกเดี่ยว", + "compose_form.poll.type": "ลักษณะ", + "compose_form.publish": "โพสต์", "compose_form.publish_form": "โพสต์ใหม่", + "compose_form.reply": "ตอบกลับ", + "compose_form.save_changes": "อัปเดต", "compose_form.spoiler.marked": "เอาคำเตือนเนื้อหาออก", "compose_form.spoiler.unmarked": "เพิ่มคำเตือนเนื้อหา", + "compose_form.spoiler_placeholder": "คำเตือนเนื้อหา (ไม่จำเป็น)", "confirmation_modal.cancel": "ยกเลิก", "confirmations.block.block_and_report": "ปิดกั้นแล้วรายงาน", "confirmations.block.confirm": "ปิดกั้น", @@ -269,6 +277,12 @@ "follow_request.authorize": "อนุญาต", "follow_request.reject": "ปฏิเสธ", "follow_requests.unlocked_explanation": "แม้ว่าไม่มีการล็อคบัญชีของคุณ พนักงานของ {domain} คิดว่าคุณอาจต้องการตรวจทานคำขอติดตามจากบัญชีเหล่านี้ด้วยตนเอง", + "follow_suggestions.curated_suggestion": "คัดสรรโดยบรรณาธิการ", + "follow_suggestions.dismiss": "ไม่ต้องแสดงอีก", + "follow_suggestions.personalized_suggestion": "คำแนะนำเฉพาะบุคคล", + "follow_suggestions.popular_suggestion": "คำแนะนำยอดนิยม", + "follow_suggestions.view_all": "ดูทั้งหมด", + "follow_suggestions.who_to_follow": "ติดตามใครดี", "followed_tags": "แฮชแท็กที่ติดตาม", "footer.about": "เกี่ยวกับ", "footer.directory": "ไดเรกทอรีโปรไฟล์", @@ -295,13 +309,9 @@ "hashtag.follow": "ติดตามแฮชแท็ก", "hashtag.unfollow": "เลิกติดตามแฮชแท็ก", "hashtags.and_other": "…และอีก {count, plural, other {# เพิ่มเติม}}", - "home.actions.go_to_explore": "ดูสิ่งที่กำลังนิยม", - "home.actions.go_to_suggestions": "ค้นหาผู้คนที่จะติดตาม", "home.column_settings.basic": "พื้นฐาน", "home.column_settings.show_reblogs": "แสดงการดัน", "home.column_settings.show_replies": "แสดงการตอบกลับ", - "home.explore_prompt.body": "ฟีดหน้าแรกของคุณจะมีการผสมผสานของโพสต์จากแฮชแท็กที่คุณได้เลือกติดตาม, ผู้คนที่คุณได้เลือกติดตาม และโพสต์ที่เขาดัน หากนั่นรู้สึกเงียบเกินไป คุณอาจต้องการ:", - "home.explore_prompt.title": "นี่คือฐานหน้าแรกของคุณภายใน Mastodon", "home.hide_announcements": "ซ่อนประกาศ", "home.pending_critical_update.body": "โปรดอัปเดตเซิร์ฟเวอร์ Mastodon ของคุณโดยเร็วที่สุดเท่าที่จะเป็นไปได้!", "home.pending_critical_update.link": "ดูการอัปเดต", @@ -514,7 +524,15 @@ "poll_button.add_poll": "เพิ่มการสำรวจความคิดเห็น", "poll_button.remove_poll": "เอาการสำรวจความคิดเห็นออก", "privacy.change": "เปลี่ยนความเป็นส่วนตัวของโพสต์", + "privacy.direct.long": "ทุกคนที่กล่าวถึงในโพสต์", + "privacy.direct.short": "ผู้คนที่เฉพาะเจาะจง", + "privacy.private.long": "เฉพาะผู้ติดตามของคุณเท่านั้น", + "privacy.private.short": "ผู้ติดตาม", + "privacy.public.long": "ใครก็ตามที่อยู่ในและนอก Mastodon", "privacy.public.short": "สาธารณะ", + "privacy.unlisted.additional": "สิ่งนี้ทำงานเหมือนกับสาธารณะทุกประการ ยกเว้นโพสต์จะไม่ปรากฏในฟีดสดหรือแฮชแท็ก, การสำรวจ หรือการค้นหา Mastodon แม้ว่าคุณได้เลือกรับทั่วทั้งบัญชีก็ตาม", + "privacy.unlisted.long": "การประโคมอัลกอริทึมที่น้อยลง", + "privacy.unlisted.short": "สาธารณะแบบเงียบ", "privacy_policy.last_updated": "อัปเดตล่าสุดเมื่อ {date}", "privacy_policy.title": "นโยบายความเป็นส่วนตัว", "recommended": "แนะนำ", @@ -532,7 +550,9 @@ "relative_time.minutes": "{number} นาที", "relative_time.seconds": "{number} วินาที", "relative_time.today": "วันนี้", + "reply_indicator.attachments": "{count, plural, other {# ไฟล์แนบ}}", "reply_indicator.cancel": "ยกเลิก", + "reply_indicator.poll": "การสำรวจความคิดเห็น", "report.block": "ปิดกั้น", "report.block_explanation": "คุณจะไม่เห็นโพสต์ของเขา เขาจะไม่สามารถเห็นโพสต์ของคุณหรือติดตามคุณ เขาจะสามารถบอกได้ว่ามีการปิดกั้นเขา", "report.categories.legal": "กฎหมาย", diff --git a/app/javascript/mastodon/locales/tr.json b/app/javascript/mastodon/locales/tr.json index 6811c158d4..7ab370b8bc 100644 --- a/app/javascript/mastodon/locales/tr.json +++ b/app/javascript/mastodon/locales/tr.json @@ -146,11 +146,19 @@ "compose_form.lock_disclaimer.lock": "kilitli", "compose_form.placeholder": "Aklında ne var?", "compose_form.poll.duration": "Anket süresi", + "compose_form.poll.multiple": "Çoktan seçmeli", + "compose_form.poll.option_placeholder": "Seçenek {number}", + "compose_form.poll.single": "Birini seç", "compose_form.poll.switch_to_multiple": "Birden çok seçeneğe izin vermek için anketi değiştir", "compose_form.poll.switch_to_single": "Tek bir seçeneğe izin vermek için anketi değiştir", + "compose_form.poll.type": "Stil", + "compose_form.publish": "Gönder", "compose_form.publish_form": "Gönder", + "compose_form.reply": "Yanıtla", + "compose_form.save_changes": "Güncelle", "compose_form.spoiler.marked": "Metin uyarının arkasına gizlenir", "compose_form.spoiler.unmarked": "Metin gizli değil", + "compose_form.spoiler_placeholder": "İçerik uyarısı (isteğe bağlı)", "confirmation_modal.cancel": "İptal", "confirmations.block.block_and_report": "Engelle ve Bildir", "confirmations.block.confirm": "Engelle", @@ -269,6 +277,12 @@ "follow_request.authorize": "İzin Ver", "follow_request.reject": "Reddet", "follow_requests.unlocked_explanation": "Hesabınız kilitli olmasa da, {domain} personeli bu hesaplardan gelen takip isteklerini gözden geçirmek isteyebileceğinizi düşündü.", + "follow_suggestions.curated_suggestion": "Editörün Seçimi", + "follow_suggestions.dismiss": "Tekrar gösterme", + "follow_suggestions.personalized_suggestion": "Kişiselleşmiş öneriler", + "follow_suggestions.popular_suggestion": "Popüler öneriler", + "follow_suggestions.view_all": "Tümünü gör", + "follow_suggestions.who_to_follow": "Takip edebileceklerin", "followed_tags": "Takip edilen etiketler", "footer.about": "Hakkında", "footer.directory": "Profil dizini", @@ -295,13 +309,9 @@ "hashtag.follow": "Etiketi takip et", "hashtag.unfollow": "Etiketi takibi bırak", "hashtags.and_other": "…ve {count, plural, one {}other {# fazlası}}", - "home.actions.go_to_explore": "Öne çıkanları gör", - "home.actions.go_to_suggestions": "Takip edecek kişileri bulun", "home.column_settings.basic": "Temel", "home.column_settings.show_reblogs": "Yeniden paylaşımları göster", "home.column_settings.show_replies": "Yanıtları göster", - "home.explore_prompt.body": "Ana sayfa akışınızda, takip etmeyi seçtiğiniz ETİKETlerden, takip etmeyi seçtiğiniz kişilerden ve öne çıkardıkları gönderilerden oluşan bir karışım bulunur. Şu anda oldukça sessiz görünüyor, gör ve takip et :", - "home.explore_prompt.title": "Burası Mastodon'daki Anasayfanız.", "home.hide_announcements": "Duyuruları gizle", "home.pending_critical_update.body": "Lütfen Mastodon sunucunuzu en kısa sürede güncelleyin!", "home.pending_critical_update.link": "Güncellemelerini görün", @@ -514,7 +524,15 @@ "poll_button.add_poll": "Bir anket ekleyin", "poll_button.remove_poll": "Anketi kaldır", "privacy.change": "Gönderi gizliliğini değiştir", + "privacy.direct.long": "Gönderide değinilen herkes", + "privacy.direct.short": "Belirli kişiler", + "privacy.private.long": "Sadece takipçileriniz", + "privacy.private.short": "Takipçiler", + "privacy.public.long": "Mastodon'da olan olmayan herkes", "privacy.public.short": "Herkese açık", + "privacy.unlisted.additional": "Bu neredeyse herkese açık gibi çalışır, tek farkı gönderi canlı akışlarda veya etiketlerde, keşfette, veya Mastodon aramasında gözükmez, hesap çapında öyle seçmiş olsanız bile.", + "privacy.unlisted.long": "Daha az algoritmik tantana", + "privacy.unlisted.short": "Sessizce herkese açık", "privacy_policy.last_updated": "Son güncelleme {date}", "privacy_policy.title": "Gizlilik Politikası", "recommended": "Önerilen", @@ -532,7 +550,9 @@ "relative_time.minutes": "{number}m", "relative_time.seconds": "{number}sn", "relative_time.today": "bugün", + "reply_indicator.attachments": "{count, plural, one {# ek} other {# ek}}", "reply_indicator.cancel": "İptal", + "reply_indicator.poll": "Anket", "report.block": "Engelle", "report.block_explanation": "Gönderilerini göremeyeceksiniz. Gönderilerinizi göremezler veya sizi takip edemezler. Engelli olduklarını anlayabilecekler.", "report.categories.legal": "Yasal", diff --git a/app/javascript/mastodon/locales/uk.json b/app/javascript/mastodon/locales/uk.json index 38e5f9cfbd..0504ec60d8 100644 --- a/app/javascript/mastodon/locales/uk.json +++ b/app/javascript/mastodon/locales/uk.json @@ -145,13 +145,20 @@ "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.multiple": "Кілька варіантів", + "compose_form.poll.option_placeholder": "Варіант {number}", + "compose_form.poll.single": "Виберіть варіант", "compose_form.poll.switch_to_multiple": "Дозволити вибір декількох відповідей", "compose_form.poll.switch_to_single": "Перемкнути у режим вибору однієї відповіді", + "compose_form.poll.type": "Стиль", + "compose_form.publish": "Опублікувати", "compose_form.publish_form": "Новий допис", + "compose_form.reply": "Відповісти", + "compose_form.save_changes": "Оновити", "compose_form.spoiler.marked": "Прибрати попередження про вміст", "compose_form.spoiler.unmarked": "Додати попередження про вміст", + "compose_form.spoiler_placeholder": "Попередження про вміст (необов'язково)", "confirmation_modal.cancel": "Скасувати", "confirmations.block.block_and_report": "Заблокувати та поскаржитися", "confirmations.block.confirm": "Заблокувати", @@ -270,6 +277,12 @@ "follow_request.authorize": "Авторизувати", "follow_request.reject": "Відмовити", "follow_requests.unlocked_explanation": "Хоча ваш обліковий запис не заблоковано, персонал {domain} припускає, що, можливо, ви хотіли б переглянути ці запити на підписку.", + "follow_suggestions.curated_suggestion": "Вибір редакції", + "follow_suggestions.dismiss": "Більше не показувати", + "follow_suggestions.personalized_suggestion": "Персоналізована пропозиція", + "follow_suggestions.popular_suggestion": "Популярна пропозиція", + "follow_suggestions.view_all": "Переглянути все", + "follow_suggestions.who_to_follow": "На кого підписатися", "followed_tags": "Відстежувані хештеґи", "footer.about": "Про проєкт", "footer.directory": "Каталог профілів", @@ -296,13 +309,9 @@ "hashtag.follow": "Стежити за хештегом", "hashtag.unfollow": "Не стежити за хештегом", "hashtags.and_other": "…і {count, plural, other {ще #}}", - "home.actions.go_to_explore": "Переглянути тенденції", - "home.actions.go_to_suggestions": "Знайти людей, аби підписатися", "home.column_settings.basic": "Основні", "home.column_settings.show_reblogs": "Показувати поширення", "home.column_settings.show_replies": "Показувати відповіді", - "home.explore_prompt.body": "Ваша домашня стрічка буде сумішшю дописів з обраних для стеження хештегів, людей і поширених ними дописів. Якщо цього замало, ви також можете:", - "home.explore_prompt.title": "Це ваша домашня база у Mastodon.", "home.hide_announcements": "Приховати оголошення", "home.pending_critical_update.body": "Якнайшвидше оновіть свій сервер Mastodon!", "home.pending_critical_update.link": "Переглянути оновлення", @@ -515,7 +524,15 @@ "poll_button.add_poll": "Додати опитування", "poll_button.remove_poll": "Видалити опитування", "privacy.change": "Змінити видимість допису", + "privacy.direct.long": "Усі згадані в дописі", + "privacy.direct.short": "Певні люди", + "privacy.private.long": "Лише ваші підписники", + "privacy.private.short": "Підписники", + "privacy.public.long": "Усі з Mastodon", "privacy.public.short": "Публічно", + "privacy.unlisted.additional": "Має таку ж поведінку, як у людей, але повідомлення не з'являтимуться у стрічках або хештегах, оглядах, або пошуку Mastodon, навіть якщо ви використовуєте облікові записи.", + "privacy.unlisted.long": "Менше взаємодій з алгоритмами", + "privacy.unlisted.short": "Без додавання до стрічки", "privacy_policy.last_updated": "Оновлено {date}", "privacy_policy.title": "Політика приватності", "recommended": "Рекомендовано", @@ -533,7 +550,9 @@ "relative_time.minutes": "{number}х", "relative_time.seconds": "{number}с", "relative_time.today": "сьогодні", + "reply_indicator.attachments": "{count, plural, one {# вкладення} few {# вкладення} many {# вкладень} other {# вкладення}}", "reply_indicator.cancel": "Скасувати", + "reply_indicator.poll": "Опитування", "report.block": "Заблокувати", "report.block_explanation": "Ви не будете бачити дописи цього користувача, а вони не зможуть бачити ваші дописи або підписуватися на вас. Вони будуть бачити, що ви їх заблокували.", "report.categories.legal": "Правові положення", diff --git a/app/javascript/mastodon/locales/vi.json b/app/javascript/mastodon/locales/vi.json index 73a11b9573..626f40783c 100644 --- a/app/javascript/mastodon/locales/vi.json +++ b/app/javascript/mastodon/locales/vi.json @@ -146,11 +146,19 @@ "compose_form.lock_disclaimer.lock": "khóa", "compose_form.placeholder": "Bạn đang nghĩ gì?", "compose_form.poll.duration": "Hết hạn vào", + "compose_form.poll.multiple": "Nhiều lựa chọn", + "compose_form.poll.option_placeholder": "Lựa chọn {number}", + "compose_form.poll.single": "Chọn một", "compose_form.poll.switch_to_multiple": "Có thể chọn nhiều lựa chọn", "compose_form.poll.switch_to_single": "Chỉ cho phép chọn duy nhất một lựa chọn", + "compose_form.poll.type": "Loại", + "compose_form.publish": "Đăng", "compose_form.publish_form": "Đăng", + "compose_form.reply": "Trả lời", + "compose_form.save_changes": "Cập nhật", "compose_form.spoiler.marked": "Hủy nội dung ẩn", "compose_form.spoiler.unmarked": "Tạo nội dung ẩn", + "compose_form.spoiler_placeholder": "Nội dung ẩn (tùy chọn)", "confirmation_modal.cancel": "Hủy bỏ", "confirmations.block.block_and_report": "Chặn & Báo cáo", "confirmations.block.confirm": "Chặn", @@ -269,6 +277,12 @@ "follow_request.authorize": "Cho phép", "follow_request.reject": "Từ chối", "follow_requests.unlocked_explanation": "Mặc dù tài khoản của bạn đang ở chế độ công khai, quản trị viên của {domain} vẫn tin rằng bạn sẽ muốn xem lại yêu cầu theo dõi từ những người khác.", + "follow_suggestions.curated_suggestion": "Lựa chọn của máy chủ", + "follow_suggestions.dismiss": "Không hiện lại", + "follow_suggestions.personalized_suggestion": "Gợi ý cá nhân hóa", + "follow_suggestions.popular_suggestion": "Những người nổi tiếng", + "follow_suggestions.view_all": "Xem tất cả", + "follow_suggestions.who_to_follow": "Gợi ý theo dõi", "followed_tags": "Hashtag theo dõi", "footer.about": "Giới thiệu", "footer.directory": "Cộng đồng", @@ -295,13 +309,9 @@ "hashtag.follow": "Theo dõi hashtag", "hashtag.unfollow": "Bỏ theo dõi hashtag", "hashtags.and_other": "…và {count, plural, other {# nữa}}", - "home.actions.go_to_explore": "Khám phá xu hướng", - "home.actions.go_to_suggestions": "Tìm người theo dõi", "home.column_settings.basic": "Tùy chỉnh", "home.column_settings.show_reblogs": "Hiện những lượt đăng lại", "home.column_settings.show_replies": "Hiện những tút dạng trả lời", - "home.explore_prompt.body": "Bảng tin của bạn sẽ bao gồm các tút có hashtag bạn theo dõi, những người bạn theo dõi và các tút mà họ đăng lại. Lúc này có vẻ hơi trống, sao bạn không:", - "home.explore_prompt.title": "Đây là ngôi nhà Mastodon của bạn.", "home.hide_announcements": "Ẩn thông báo máy chủ", "home.pending_critical_update.body": "Vui lòng cập nhật máy chủ Mastodon của bạn càng sớm càng tốt!", "home.pending_critical_update.link": "Xem bản cập nhật", @@ -514,7 +524,15 @@ "poll_button.add_poll": "Tạo bình chọn", "poll_button.remove_poll": "Hủy cuộc bình chọn", "privacy.change": "Chọn kiểu tút", + "privacy.direct.long": "Những người được nhắc trong tút", + "privacy.direct.short": "Người cụ thể", + "privacy.private.long": "Chỉ người theo dõi", + "privacy.private.short": "Người theo dõi", + "privacy.public.long": "Bất cứ ai", "privacy.public.short": "Công khai", + "privacy.unlisted.additional": "Giống hệt như công khai, ngoại trừ tút sẽ không xuất hiện trong bảng tin hoặc hashtag, khám phá hoặc tìm kiếm Mastodon, ngay cả khi bạn chọn cho phép trong cài đặt tài khoản.", + "privacy.unlisted.long": "Ít hướng thuật toán hơn", + "privacy.unlisted.short": "Hạn chế", "privacy_policy.last_updated": "Cập nhật lần cuối {date}", "privacy_policy.title": "Chính sách bảo mật", "recommended": "Đề xuất", @@ -532,7 +550,9 @@ "relative_time.minutes": "{number} phút", "relative_time.seconds": "{number}s", "relative_time.today": "hôm nay", + "reply_indicator.attachments": "{count, plural, other {# tập tin đính kèm}}", "reply_indicator.cancel": "Hủy bỏ", + "reply_indicator.poll": "Bình chọn", "report.block": "Chặn", "report.block_explanation": "Bạn sẽ không còn thấy tút của người này. Họ sẽ không thể thấy tút của bạn hoặc theo dõi bạn. Họ biết là bạn đã chặn họ.", "report.categories.legal": "Phạm pháp", diff --git a/app/javascript/mastodon/locales/zh-CN.json b/app/javascript/mastodon/locales/zh-CN.json index 9b55e51b1f..9d0da95c81 100644 --- a/app/javascript/mastodon/locales/zh-CN.json +++ b/app/javascript/mastodon/locales/zh-CN.json @@ -145,11 +145,9 @@ "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.multiple": "多选", "compose_form.poll.option_placeholder": "选项 {number}", - "compose_form.poll.remove_option": "删除此选项", "compose_form.poll.single": "单选", "compose_form.poll.switch_to_multiple": "将投票改为多选", "compose_form.poll.switch_to_single": "将投票改为单选", @@ -279,6 +277,12 @@ "follow_request.authorize": "同意", "follow_request.reject": "拒绝", "follow_requests.unlocked_explanation": "尽管你没有锁嘟,但是 {domain} 的工作人员认为你也许会想手动审核审核这些账号的关注请求。", + "follow_suggestions.curated_suggestion": "主编推荐", + "follow_suggestions.dismiss": "不再显示", + "follow_suggestions.personalized_suggestion": "个性化建议", + "follow_suggestions.popular_suggestion": "热门建议", + "follow_suggestions.view_all": "查看全部", + "follow_suggestions.who_to_follow": "推荐关注", "followed_tags": "关注的话题标签", "footer.about": "关于", "footer.directory": "用户目录", @@ -305,13 +309,9 @@ "hashtag.follow": "关注话题标签", "hashtag.unfollow": "取消关注话题标签", "hashtags.and_other": "… 和另外 {count, plural, other {# 个话题}}", - "home.actions.go_to_explore": "查看热门话题", - "home.actions.go_to_suggestions": "寻找要关注的人", "home.column_settings.basic": "基本设置", "home.column_settings.show_reblogs": "显示转嘟", "home.column_settings.show_replies": "显示回复", - "home.explore_prompt.body": "你的主页动态会推送一系列关注的话题标签和用户,以及转发的嘟文。如果你觉得过于清净,不妨试一下:", - "home.explore_prompt.title": "这是你在 Mastodon 的主页。", "home.hide_announcements": "隐藏公告", "home.pending_critical_update.body": "请尽快更新您的 Mastodon 服务器!", "home.pending_critical_update.link": "查看更新", diff --git a/app/javascript/mastodon/locales/zh-HK.json b/app/javascript/mastodon/locales/zh-HK.json index 5890c4df4b..c1a69591ff 100644 --- a/app/javascript/mastodon/locales/zh-HK.json +++ b/app/javascript/mastodon/locales/zh-HK.json @@ -145,11 +145,9 @@ "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.multiple": "多選", "compose_form.poll.option_placeholder": "選項 {number}", - "compose_form.poll.remove_option": "移除此選項", "compose_form.poll.single": "選擇一個", "compose_form.poll.switch_to_multiple": "變更投票為允許多個選項", "compose_form.poll.switch_to_single": "變更投票為限定單一選項", @@ -279,6 +277,12 @@ "follow_request.authorize": "批准", "follow_request.reject": "拒絕", "follow_requests.unlocked_explanation": "即使您的帳號未上鎖,{domain} 的工作人員認為您可能會想手動審核來自這些帳號的追蹤請求。", + "follow_suggestions.curated_suggestion": "編輯推薦", + "follow_suggestions.dismiss": "不再顯示", + "follow_suggestions.personalized_suggestion": "個人化推薦", + "follow_suggestions.popular_suggestion": "熱門推薦", + "follow_suggestions.view_all": "查看所有", + "follow_suggestions.who_to_follow": "追蹤對象", "followed_tags": "已追蹤標籤", "footer.about": "關於", "footer.directory": "個人檔案目錄", @@ -305,13 +309,9 @@ "hashtag.follow": "追蹤主題標籤", "hashtag.unfollow": "取消追蹤主題標籤", "hashtags.and_other": "…及{count, plural, other {其他 # 個}}", - "home.actions.go_to_explore": "即時熱門話題", - "home.actions.go_to_suggestions": "尋找追蹤對象", "home.column_settings.basic": "基本", "home.column_settings.show_reblogs": "顯示被轉推的文章", "home.column_settings.show_replies": "顯示回應文章", - "home.explore_prompt.body": "你的首頁時間軸將顯示來自你追蹤的標籤、使用者及他們轉推的帖文。如果時間軸感覺太安靜,你可以考慮:", - "home.explore_prompt.title": "這是你在 Mastodon 中的主頁。", "home.hide_announcements": "隱藏公告", "home.pending_critical_update.body": "請盡快更新你的 Mastodon 伺服器!", "home.pending_critical_update.link": "查看更新", diff --git a/app/javascript/mastodon/locales/zh-TW.json b/app/javascript/mastodon/locales/zh-TW.json index c365e67e07..d83b523d1e 100644 --- a/app/javascript/mastodon/locales/zh-TW.json +++ b/app/javascript/mastodon/locales/zh-TW.json @@ -145,11 +145,9 @@ "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.multiple": "多選", "compose_form.poll.option_placeholder": "選項 {number}", - "compose_form.poll.remove_option": "移除此選項", "compose_form.poll.single": "選擇一個", "compose_form.poll.switch_to_multiple": "變更投票為允許多個選項", "compose_form.poll.switch_to_single": "變更投票為允許單一選項", @@ -279,6 +277,12 @@ "follow_request.authorize": "授權", "follow_request.reject": "拒絕", "follow_requests.unlocked_explanation": "即便您的帳號未被鎖定,{domain} 的管理員認為您可能想要自己審核這些帳號的跟隨請求。", + "follow_suggestions.curated_suggestion": "精選內容", + "follow_suggestions.dismiss": "不再顯示", + "follow_suggestions.personalized_suggestion": "個人化推薦", + "follow_suggestions.popular_suggestion": "熱門推薦", + "follow_suggestions.view_all": "檢視全部", + "follow_suggestions.who_to_follow": "推薦跟隨帳號", "followed_tags": "已跟隨主題標籤", "footer.about": "關於", "footer.directory": "個人檔案目錄", @@ -305,13 +309,9 @@ "hashtag.follow": "跟隨主題標籤", "hashtag.unfollow": "取消跟隨主題標籤", "hashtags.and_other": "…及其他 {count, plural, other {# 個}}", - "home.actions.go_to_explore": "看看發生什麼新鮮事", - "home.actions.go_to_suggestions": "尋找一些人來跟隨", "home.column_settings.basic": "基本設定", "home.column_settings.show_reblogs": "顯示轉嘟", "home.column_settings.show_replies": "顯示回覆", - "home.explore_prompt.body": "您的首頁時間軸將由您所跟隨之主題標籤、帳號以及其轉嘟所組成。若目前流速有點慢,您可以考慮以下幾點:", - "home.explore_prompt.title": "這是您於 Mastodon 的基地", "home.hide_announcements": "隱藏公告", "home.pending_critical_update.body": "請立即升級您的 Mastodon 伺服器!", "home.pending_critical_update.link": "檢視更新內容", diff --git a/config/locales/activerecord.eu.yml b/config/locales/activerecord.eu.yml index 818dab939c..a67c1403c5 100644 --- a/config/locales/activerecord.eu.yml +++ b/config/locales/activerecord.eu.yml @@ -19,7 +19,7 @@ eu: account: attributes: username: - invalid: letrak, zenbakiak eta gidoi baxuak besterik ez + invalid: letrak, zenbakiak eta azpimarrak soilik izan behar ditu reserved: erreserbatuta dago admin/webhook: attributes: diff --git a/config/locales/activerecord.fi.yml b/config/locales/activerecord.fi.yml index 93f338b5d5..feb4fbf4c5 100644 --- a/config/locales/activerecord.fi.yml +++ b/config/locales/activerecord.fi.yml @@ -4,7 +4,7 @@ fi: attributes: poll: expires_at: Määräaika - options: Valinnat + options: Vaihtoehdot user: agreement: Palvelusopimus email: Sähköpostiosoite @@ -36,7 +36,7 @@ fi: status: attributes: reblog: - taken: tila on jo olemassa + taken: tästä julkaisusta on jo tehty user: attributes: email: @@ -47,7 +47,7 @@ fi: user_role: attributes: permissions_as_keys: - dangerous: sisältää oikeudet, jotka eivät ole turvallisia perusroolille + dangerous: sisältää oikeuksia, jotka eivät ole turvallisia perusroolille elevated: ei voi sisältää oikeuksia, joita nykyisellä roolillasi ei ole own_role: ei voi muuttaa nykyisellä roolillasi position: diff --git a/config/locales/activerecord.lad.yml b/config/locales/activerecord.lad.yml index 71a63d1cd1..31e0223cca 100644 --- a/config/locales/activerecord.lad.yml +++ b/config/locales/activerecord.lad.yml @@ -11,7 +11,7 @@ lad: locale: Lingua password: Kod user/account: - username: Nombre de uzador + username: Nombre de utilizador user/invite_request: text: Razon errors: diff --git a/config/locales/af.yml b/config/locales/af.yml index 74d3495914..62c52fa493 100644 --- a/config/locales/af.yml +++ b/config/locales/af.yml @@ -2,7 +2,7 @@ af: about: contact_missing: Nie ingestel nie - contact_unavailable: NVT + contact_unavailable: n.v.t hosted_on: Mastodon gehuisves op %{domain} title: Aangaande accounts: @@ -23,13 +23,18 @@ af: account_moderation_notes: create: Los nota accounts: + email: E-pos + ip: IP location: local: Plaaslik moderation: silenced: Beperk + reset_password: Herstel wagwoord search: Soek silenced: Beperk action_logs: + action_types: + reset_password_user: Herstel Wagwoord actions: silence_account_html: "%{name} het %{target} se rekening beperk" deleted_account: geskrapte rekening @@ -97,6 +102,7 @@ af: auth: apply_for_account: Doen aansoek om ’n rekening logout: Teken uit + reset_password: Herstel wagwoord datetime: distance_in_words: about_x_hours: "%{count} uur" @@ -121,6 +127,8 @@ af: invalid: Hierdie uitnodiging is nie geldig nie title: Nooi ander login_activities: + authentication_methods: + password: wagwoord description_html: Indien jy onbekende aktiwiteite gewaar, oorweeg dit om jou wagwoord te verander en tweefaktorverifikasie te aktiveer. navigation: toggle_menu: Wisselkieslys diff --git a/config/locales/ar.yml b/config/locales/ar.yml index e6d653c674..0927fba0af 100644 --- a/config/locales/ar.yml +++ b/config/locales/ar.yml @@ -42,7 +42,7 @@ ar: add_email_domain_block: حظر نطاق البريد الإلكتروني هذا approve: صادِق عليه approved_msg: تمت الموافقة على تسجيل %{username} - are_you_sure: متأكد ؟ + are_you_sure: هل أنت متأكد؟ avatar: الصورة الرمزية by_domain: النطاق change_email: @@ -55,17 +55,17 @@ ar: change_role: changed_msg: تم تغيير بنجاح! label: تغيير الدور - no_role: لا رتب - title: تم تغيير الرتب ل %{username} + no_role: بلا دور + title: تغيير دور %{username} confirm: تأكيد confirmed: مؤكَّد confirming: التأكد custom: مخصص delete: حذف البيانات - deleted: تمت إزالته - demote: إنزال الرُتبة الوظيفية + deleted: محذوف + demote: إنزال الدور الوظيفي destroyed_msg: بيانات حساب %{username} الآن في قائمة الانتظار ليتم حذفها قريباً - disable: تعطيل + disable: تجميد disable_sign_in_token_auth: تعطيل مصادقة رمز البريد الإلكتروني disable_two_factor_authentication: تعطيل المصادقة بخطوتين disabled: معطَّل @@ -91,7 +91,7 @@ ar: local: المحلي remote: عن بُعد title: الموقع - login_status: وضع الدخول + login_status: حالة الولوج media_attachments: الوسائط المرفقة memorialize: تحويل الحساب إلى صفحة ذكرى memorialized: تذكاري @@ -203,10 +203,10 @@ ar: destroy_canonical_email_block: حذف نطاق للبريد destroy_custom_emoji: احذف الإيموجي المخصص destroy_domain_allow: حذف النطاق المسموح به - destroy_domain_block: حذف كتلة النطاق - destroy_email_domain_block: حذف نطاق بريد إلكتروني + destroy_domain_block: إزالة حظر النطاق + destroy_email_domain_block: حذف حظر نطاق بريد إلكتروني destroy_instance: تنظيف النطاق - destroy_ip_block: حذف قانون IP + destroy_ip_block: حذف قاعدة IP destroy_status: حذف المنشور destroy_unavailable_domain: حذف نطاق غير متوفر destroy_user_role: حذف الدور @@ -225,7 +225,7 @@ ar: reopen_report: إعادة فتح التقرير resend_user: إعادة إرسال بريد التأكيد reset_password_user: إعادة تعيين كلمة المرور - resolve_report: حل الشكوى + resolve_report: معالجة الشكوى sensitive_account: وضع علامة على الوسائط في حسابك على أنها حساسة silence_account: كتم الحساب suspend_account: تعليق الحساب @@ -236,14 +236,14 @@ ar: unsuspend_account: إلغاء تعليق الحساب update_announcement: تحديث الإعلان update_custom_emoji: تحديث الإيموجي المخصص - update_domain_block: تحديث كتلة النطاق + update_domain_block: تحديث حظر النطاق update_ip_block: تحديث قاعدة IP update_status: تحديث المنشور update_user_role: تحديث الدور actions: - approve_appeal_html: وافق %{name} على استئناف قرار الاعتدال من %{target} - approve_user_html: قبل %{name} تسجيل %{target} - assigned_to_self_report_html: قام %{name} بتعيين التقرير %{target} لأنفسهم + approve_appeal_html: وافق %{name} على استئناف الطعن بشأن قرار الإشراف من %{target} + approve_user_html: وافق %{name} على تسجيل %{target} + assigned_to_self_report_html: قام %{name} بإسناد التقرير %{target} لأنفسهم change_email_user_html: غيّر %{name} عنوان البريد الإلكتروني للمستخدم %{target} change_role_user_html: قام %{name} بإنشاء قاعدة للـIP %{target} confirm_user_html: "%{name} قد قام بتأكيد عنوان البريد الإلكتروني لـ %{target}" @@ -284,7 +284,7 @@ ar: reopen_report_html: قام %{name} بإعادة فتح الشكوى %{target} resend_user_html: "%{name} إعادة إرسال البريد الإلكتروني للتأكيد لـ %{target}" reset_password_user_html: قام %{name} بإعادة تعيين كلمة مرور المستخدم %{target} - resolve_report_html: قام %{name} بحل الشكوى %{target} + resolve_report_html: قام %{name} بمعالجة الشكوى %{target} sensitive_account_html: قام %{name} بوضع علامة حساس على محتوى %{target} silence_account_html: قام %{name} بكتم حساب %{target} suspend_account_html: قام %{name} بتعليق حساب %{target} @@ -299,7 +299,7 @@ ar: update_ip_block_html: قام %{name} بإنشاء قاعدة للـIP %{target} update_status_html: قام %{name} بتحديث منشور من %{target} update_user_role_html: "%{name} تغيير رتبه %{target}" - deleted_account: احذف الحساب + deleted_account: حذف الحساب empty: لم يتم العثور على سجلات. filter_by_action: تصفية بحسب الإجراء filter_by_user: تصفية حسب المستخدم @@ -309,14 +309,14 @@ ar: edit: title: تعديل الإعلان empty: لم يتم العثور على أية إعلانات. - live: على المباشر + live: حي new: create: إنشاء إعلان title: إعلان جديد publish: نشر published_msg: تم نشر الإعلان بنجاح! scheduled_for: بُرمِج على %{time} - scheduled_msg: تمت جدولة نشر الإعلان! + scheduled_msg: تمت برمجة نشر الإعلان! title: الإعلانات unpublish: إلغاء النشر unpublished_msg: تم إلغاء نشر الإعلان بنجاح! @@ -390,8 +390,8 @@ ar: other: "%{count} مستخدماً قيدَ الانتظار" two: "%{count} مستخدمان قيدَ الانتظار" zero: "%{count} مستخدمٍ قيدَ الانتظار" - resolved_reports: تقارير تم حلها - software: البرنامج + resolved_reports: تقارير تم معالجتها + software: البرمجيات sources: مصادر التسجيل space: المساحة المستخدَمة title: لوح المراقبة @@ -453,6 +453,7 @@ ar: view: عرض كتلة النطاق email_domain_blocks: add_new: إضافة + allow_registrations_with_approval: السماح بالتسجيلات وإنشاء الحسابات بعد الموافقة attempts_over_week: few: "%{count} محاولات تسجيل في آخر أسبوع" many: "%{count} محاولات تسجيل في آخر أسبوع" @@ -645,8 +646,8 @@ ar: actions_description_remote_html: حدّد الإجراءات التي يتعين اتخاذها لحل هذا التقرير. هذا سيؤثر فقط على كيفية اتصال خادمك بهذا الحساب البعيد والتعامل مع محتوياته. add_to_report: أضف المزيد إلى التقرير are_you_sure: هل أنت متأكد ؟ - assign_to_self: عين لي - assigned: تعين رئيس + assign_to_self: اسنده لي + assigned: المشرف المُسنَد by_target_domain: نطاق الحساب المبلّغ عنه cancel: إلغاء category: الفئة @@ -659,14 +660,15 @@ ar: created_at: ذكرت delete_and_resolve: احذف المنشورات forwarded: أُعيد توجيهه + forwarded_replies_explanation: هذا التقرير من مستخدم عن بُعد وحول محتوى عن بُعد. تم تحويله إليك لأن المحتوى المُبلَغ عنه هو ردّ على أحد مستخدميك. forwarded_to: أُعيد توجيهه إلى %{domain} - mark_as_resolved: اعتبار الشكوى كمحلولة + mark_as_resolved: اعتبار الشكوى كمعالَجة mark_as_sensitive: تعيينه كمنشور حساس - mark_as_unresolved: علم كغير محلولة + mark_as_unresolved: وضع علامة لم يتم معالجتها no_one_assigned: لا أحد notes: create: اضف ملاحظة - create_and_resolve: الحل مع ملاحظة + create_and_resolve: معالجة مرفوقة بملاحظة create_and_unresolve: إعادة فتح مع ملاحظة delete: حذف placeholder: قم بوصف الإجراءات التي تم اتخاذها أو أي تحديثات أخرى ذات علاقة... @@ -680,7 +682,7 @@ ar: reported_account: حساب مُبلّغ عنه reported_by: أبلغ عنه من طرف resolved: معالجة - resolved_msg: تم حل تقرير بنجاح! + resolved_msg: تمت معالجة الشكوى بنجاح! skip_to_actions: تخطي إلى الإجراءات status: الحالة statuses: المحتوى المبلغ عنه @@ -1116,6 +1118,9 @@ ar: clicking_this_link: اضغط على هذا الرابط login_link: تسجيل الدخول proceed_to_login_html: يمكنكَ الآن الاستمرار إلى %{login_link}. + redirect_to_app_html: كان من المفترض إعادة توجيهك إلى تطبيق %{app_name}. إن لم يحدث ذلك، حاول %{clicking_this_link} أو العودة يدويًا إلى التطبيق. + registration_complete: اكتمل تسجيل حسابك على %{domain} الآن! + welcome_title: أهلاً بك، %{name}! wrong_email_hint: إذا كان عنوان البريد الإلكتروني هذا غير صحيح، يمكنك تغييره في إعدادات الحساب. delete_account: احذف الحساب delete_account_html: إن كنت ترغب في حذف حسابك يُمكنك المواصلة هنا. سوف يُطلَبُ منك التأكيد قبل الحذف. @@ -1177,6 +1182,7 @@ ar: functional: حسابك يعمل بشكل كامل. pending: إن طلبك قيد المراجعة من قبل فريقنا. قد يستغرق هذا بعض الوقت. سوف تتلقى بريدا إلكترونيا إذا تمت الموافقة على طلبك. redirecting_to: حسابك غير نشط لأنه تم تحويله حاليا إلى %{acct}. + self_destruct: نظرًا لإغلاق %{domain}، ستحصل فقط على وصول محدود إلى حسابك. view_strikes: عرض العقوبات السابقة المُطَبَّقة ضد حسابك too_fast: تم إرسال النموذج بسرعة كبيرة، حاول مرة أخرى. use_security_key: استخدام مفتاح الأمان @@ -1354,6 +1360,20 @@ ar: title: الرسائل المصفّاة generic: all: الكل + all_items_on_page_selected_html: + few: تم تحديد كافة العناصر التي يبلغ عددها %{count} في هذه الصفحة. + many: تم تحديد كافة العناصر التي يبلغ عددها %{count} في هذه الصفحة. + one: تم تحديد كافة العناصر التي يبلغ عددها %{count} في هذه الصفحة. + other: تم تحديد كافة العناصر التي يبلغ عددها %{count} في هذه الصفحة. + two: تم تحديد كافة العناصر التي يبلغ عددها %{count} في هذه الصفحة. + zero: تم تحديد كافة العناصر التي يبلغ عددها %{count} في هذه الصفحة. + all_matching_items_selected_html: + few: تم تحديد كافة العناصر التي تشمل عددها %{count} في هذه الصفحة. + many: تم تحديد كافة العناصر التي تشمل عددها %{count} في هذه الصفحة. + one: تم تحديد كافة العناصر التي تشمل عددها %{count} في هذه الصفحة. + other: تم تحديد كافة العناصر التي تشمل عددها %{count} في هذه الصفحة. + two: تم تحديد كافة العناصر التي تشمل عددها %{count} في هذه الصفحة. + zero: تم تحديد كافة العناصر التي تشمل عددها %{count} في هذه الصفحة. cancel: إلغاء changes_saved_msg: تم حفظ التعديلات بنجاح! confirm: تأكيد @@ -1363,6 +1383,13 @@ ar: none: لا شيء order_by: ترتيب بحسب save_changes: حفظ التغييرات + select_all_matching_items: + few: حدد كافة العناصر الـ %{count} المطابقة لبحثك. + many: حدد كافة العناصر الـ %{count} المطابقة لبحثك. + one: حدد العنصر المطابق لبحثك. + other: حدد كافة العناصر الـ %{count} المطابقة لبحثك. + two: حدد العنصران المطابقان لبحثك. + zero: حدد كافة العناصر الـ %{count} المطابقة لبحثك. today: اليوم validation_errors: few: هناك شيء ما ليس على ما يرام! يُرجى مراجعة الأخطاء الـ %{count} أدناه @@ -1441,6 +1468,7 @@ ar: '86400': يوم واحد expires_in_prompt: أبدا generate: توليد + invalid: هذه الدعوة غير صالحة invited_by: 'تمت دعوتك من طرف:' max_uses: few: "%{count} استخدامات" @@ -1622,6 +1650,9 @@ ar: errors: limit_reached: تم بلوغ الحد الأقصى لردود الفعل المختلفة unrecognized_emoji: لم يتم التعرف على أنه إيموجي + redirects: + prompt: إن كنت واثق من هذا الرابط، انقر عليه للمتابعة. + title: إنّك مغادر %{instance}. relationships: activity: نشاط الحساب confirm_follow_selected_followers: هل أنت متأكد من أنك تريد متابعة المتابِعين المحددين؟ @@ -1657,6 +1688,9 @@ ar: over_daily_limit: لقد تجاوزتَ حد الـ %{limit} منشورات مُبَرمَجة مسموح بها اليوم over_total_limit: لقد بلغت حد الـ %{limit} مِن المنشورات المبرمَجة too_soon: يجب أن يكون تاريخ البرمجة في المستقبَل + self_destruct: + lead_html: للأسف، سيتم إغلاق %{domain} بشكل دائم. إذا كان لديك حساب هناك، لن تكون قادرًا على الاستمرار في استخدامه، غير أنه يمكنك طلب نسخة احتياطية لبياناتك. + title: سيُغلق هذا الخادم أبوابه sessions: activity: آخر نشاط browser: المتصفح @@ -1681,6 +1715,7 @@ ar: unknown_browser: متصفح غير معروف weibo: وايبو current_session: الجلسة الحالية + date: التاريخ description: "%{browser} على %{platform}" explanation: ها هي قائمة مُتصفِّحات الويب التي تستخدِم حاليًا حساب ماستدون الخاص بك. ip: عنوان الإيبي @@ -1871,16 +1906,27 @@ ar: webauthn: مفاتيح الأمان user_mailer: appeal_approved: + action: إعدادات الحساب explanation: تمت الموافقة على استئناف السجل ضد حسابك في %{strike_date} الذي قدمته في %{appeal_date}. حسابك مرة أخرى في حالة جيدة. subject: تم قبول طعنك الذي قدمته بتاريخ %{date} + subtitle: حسابك في وضع جيد مجدّدا. title: تم قبول طعنك appeal_rejected: explanation: تم رفض استئناف السجل ضد حسابك في %{strike_date} الذي قدمته في %{appeal_date}. subject: تم رفض طعنك الذي قدمته بتاريخ %{date} + subtitle: تم رفض طعنك. title: رُفض الاستئناف backup_ready: + explanation: لقد قمت بطلب نسخة كاملة لحسابك على ماستدون. + extra: إنه الآن جاهز للتحميل! subject: نسخة بيانات حسابك جاهزة للتنزيل title: المغادرة بأرشيف الحساب + failed_2fa: + details: 'فيما يلي تفاصيل محاولة تسجيل الدخول:' + explanation: حاول شخص ما تسجيل الدخول إلى حسابك ولكنه قدم عامل مصادقة ثانٍ غير صالح. + further_actions_html: إن لم تكن أنت، نوصي بأن تقوم بـ %{action} على الفور، حيث قد يكون الحساب قد تعرض للاختراق. + subject: فشل المصادقة على العامل الثاني + title: فشل المصادقة على العامل الثاني suspicious_sign_in: change_password: غيّر كلمتك السرية details: 'فيما يلي تفاصيل تسجيل الدخول:' @@ -1934,7 +1980,7 @@ ar: go_to_sso_account_settings: انتقل إلى إعدادات حساب مزود الهوية الخاص بك invalid_otp_token: رمز المصادقة بخطوتين غير صالح otp_lost_help_html: إن فقدتَهُما ، يمكنك الاتصال بـ %{email} - rate_limited: عدد محاولات التحقق كثير جدًا، يرجى المحاولة مرة أخرى لاحقًا. + rate_limited: عدد محاولات المصادقة كثير جداً، حاول مرة أخرى لاحقاً. seamless_external_login: لقد قمت بتسجيل الدخول عبر خدمة خارجية، إنّ إعدادات الكلمة السرية و البريد الإلكتروني غير متوفرة. signed_in_as: 'تم تسجيل دخولك بصفة:' verification: diff --git a/config/locales/be.yml b/config/locales/be.yml index c0ed043f8e..9bfc46e2a7 100644 --- a/config/locales/be.yml +++ b/config/locales/be.yml @@ -88,7 +88,7 @@ be: remote: Адлеглы title: Месцазнаходжанне login_status: Стан уваходу - media_attachments: Медыя дадаткі + media_attachments: Медыя далучэнні memorialize: Даданае да памяці memorialized: Запомненае memorialized_msg: Уліковы запіс %{username} ператвораны ў мемарыяльны @@ -522,7 +522,7 @@ be: instance_followers_measure: нашых падпісчыкаў там instance_follows_measure: іх падпісчыкаў тут instance_languages_dimension: Папулярныя мовы - instance_media_attachments_measure: захаваныя медыя-ўкладанні + instance_media_attachments_measure: захаваныя медыя-далучэнні instance_reports_measure: справаздач пра іх instance_statuses_measure: захаваных паведамленняў delivery: @@ -555,7 +555,7 @@ be: total_followed_by_them: Іхнія падпіскі total_followed_by_us: Нашыя падпіскі total_reported: Скаргі на іх - total_storage: Медыя дадаткі + total_storage: Медыя далучэнні totals_time_period_hint_html: Паказаныя агульныя значэнні ніжэй уключаюць даныя за ўвесь час. unknown_instance: На дадзены момант няма запісаў аб гэтым дамене на гэтым серверы. invites: @@ -1462,9 +1462,9 @@ be: title: Адпісацца media_attachments: validations: - images_and_video: Немагчыма прымацаваць відэа да допісу, які ўжо змяшчае выявы - not_ready: Няможна дадаць файлы, апрацоўка якіх яшчэ не скончылася. Паспрабуйце яшчэ раз праз хвілінку! - too_many: Няможна дадаць больш за 4 файлы + images_and_video: Немагчыма далучыць відэа да допісу, які ўжо змяшчае выявы + not_ready: Няможна далучыць файлы, апрацоўка якіх яшчэ не скончылася. Паспрабуйце яшчэ раз праз хвілінку! + too_many: Немагчыма далучыць больш за 4 файлы migrations: acct: Перамешчана ў cancel: Скасаваць перанакіраванне @@ -1598,6 +1598,9 @@ be: errors: limit_reached: Дасягнуты ліміт розных рэакцый unrecognized_emoji: невядомае эмодзі + redirects: + prompt: Калі вы давяраеце гэтай спасылцы, націсніце на яе, каб працягнуць. + title: Вы пакідаеце %{instance}. relationships: activity: Актыўнасць ул. запісу confirm_follow_selected_followers: Вы ўпэўнены, што жадаеце падпісацца на выбраных падпісчыкаў? @@ -1660,6 +1663,7 @@ be: unknown_browser: Невядомы браўзер weibo: Weibo current_session: Бягучая сесія + date: Дата description: "%{browser} на %{platform}" explanation: Гэта вэб-браўзэры, з якіх выкананы ўваход у ваш уліковы запіс Mastodon. ip: IP @@ -1776,7 +1780,7 @@ be: interaction_exceptions_explanation: Звярніце ўвагу, што няма гарантыі выдалення пастоў, калі колькасць іх упадабанняў ці пашырэннняў упадзе ніжэй за ліміт, хаця некалі гэтая колькасць перавышала яго. keep_direct: Захаваць асабістыя паведамленні keep_direct_hint: Не выдаляць асабістыя паведамленні - keep_media: Захоўваць допісы з медыя дадаткамі + keep_media: Захоўваць допісы з далучаным медыя keep_media_hint: Не выдаляць вашыя допісы, якія ўтрымліваюць медыя keep_pinned: Захаваць замацаваныя допісы keep_pinned_hint: Не выдаляць вашыя замацаваныя допісы @@ -1838,16 +1842,27 @@ be: webauthn: Ключы бяспекі user_mailer: appeal_approved: + action: Налады ўліковага запісу explanation: Апеляцыя на папярэджанне супраць вашага ўліковага запісу ад %{strike_date}, якую вы падалі %{appeal_date}, была ўхвалена. Ваш уліковы запіс зноў на добрым рахунку. subject: Вашая апеляцыя ад %{date} была ўхваленая + subtitle: Ваш уліковы запіс зноў знаходзіцца ў добрым стане. title: Абскарджанне ўхвалена appeal_rejected: explanation: Апеляцыя на папярэджанне супраць вашага ўліковага запісу ад %{strike_date}, якую вы падалі %{appeal_date}, была адхілена. subject: Вашая апеляцыя ад %{date} была адхіленая + subtitle: Ваша абскарджанне было адхілена. title: Абскарджанне адхілена backup_ready: + explanation: Вы запыталі поўную рэзервовую копію вашага ўліковага запісу Mastodon. + extra: Цяпер ён гатовы да загрузкі! subject: Ваш архіў гатовы да спампавання title: Ваш архіў можна спампаваць + failed_2fa: + details: 'Вось падрабязнасці ўваходу:' + explanation: Хтосьці спрабаваў увайсці ў ваш уліковы запіс, але ўвёў няправільны другі фактар аўтэнтыфікацыі. + further_actions_html: Калі гэта не вы, мы рэкамендуем неадкладна %{action}, бо ён можа быць скампраметаваны. + subject: Збой аўтэнтыфікацыі па другім фактары + title: Няўдалая аўтэнтыфікацыя па другім фактары suspicious_sign_in: change_password: змяніць свой пароль details: 'Вось падрабязнасці ўваходу:' @@ -1901,6 +1916,7 @@ be: go_to_sso_account_settings: Перайдзіце ў налады ідэнтыфікацыі вашага ўліковага запісу invalid_otp_token: Няправільны код двухфактарнай аўтэнтыфікацыі otp_lost_help_html: Калі вы страцілі доступ да абодвух, вы можаце скарыстацца %{email} + rate_limited: Занадта шмат спробаў аўтэнтыфікацыі, паспрабуйце пазней. seamless_external_login: Вы ўвайшлі праз знешні сэрвіс, таму налады пароля і эл. пошты недаступныя. signed_in_as: 'Увайшлі як:' verification: diff --git a/config/locales/bg.yml b/config/locales/bg.yml index 9c8456a05f..b1229ac906 100644 --- a/config/locales/bg.yml +++ b/config/locales/bg.yml @@ -7,7 +7,7 @@ bg: hosted_on: Mastodon е разположен на хост %{domain} title: Относно accounts: - follow: Последвай + follow: Последване followers: one: Последовател other: Последователи @@ -28,7 +28,7 @@ bg: title: Извършване на модериращо действие за %{acct} account_moderation_notes: create: Оставяне на бележка - created_msg: Бележката за модерация е създадена успешно! + created_msg: Успешно създадена бележка за модерация! destroyed_msg: Успешно унищожена бележка за модериране! accounts: add_email_domain_block: Блокиране на домейн на имейл @@ -757,7 +757,7 @@ bg: follow_recommendations: Препоръки за следване preamble: За потребители, които са нови и не познават никого в Mastodon, показването на интересно съдържание е ключово. Настройте начина, по който различни функции по откриване на съдържание работят на вашия сървър. profile_directory: Указател на профила - public_timelines: Публични часови оси + public_timelines: Публични хронологии publish_discovered_servers: Публикуване на откритите сървъри publish_statistics: Публикуване на статистиката title: Откриване @@ -804,7 +804,7 @@ bg: remove_from_report: Премахване от доклада report: Докладване deleted: Изтрито - favourites: Любими + favourites: Харесвани history: История на версиите in_reply_to: Отговор до language: Език @@ -840,7 +840,7 @@ bg: elasticsearch_health_yellow: message_html: Клъстерът Elasticsearch е нездрав (жълто състояние), може да искате да разследвате причината elasticsearch_index_mismatch: - message_html: Картографиранията на показатели в Elasticsearch са остарели. Пуснете tootctl search deploy --only=%{value} + message_html: Речниковите съответствия в Elasticsearch са с изтекла давност. Пуснете tootctl search deploy --only=%{value} elasticsearch_preset: action: Преглед на документацията message_html: Вашият клъстер в Elasticsearch има повече от един възел, но Mastodon не е настроен да ги употребява. @@ -905,14 +905,14 @@ bg: statuses: allow: Позволяване на публикацията allow_account: Позволяване на автора - description_html: Има публикации, за които сървърът ви знае, че в момента са често споделяни или означавани като любими. Биха помогнали на вашите нови и завръщащи се потребители да открият повече хора за последване. Никоя от публикациите няма да бъде показана публично, докато не одобрите автора и докато авторът не позволи акаунтът му да бъде предлган на другите. Може още да позволявате или отхвърляте отделни публикации. + description_html: Това са публикации, за които сървърът ви знае, че са често споделяни или харесвани в момента. Това може да помогне на вашите нови и завръщащи се потребители да открият повече хора за следване. Никоя от публикациите няма да бъде показана публично, докато не одобрите автора и докато авторът не позволи акаунтът му да бъде предлган на другите. Също така можете да позволявате или отхвърляте отделни публикации. disallow: Забраняване на публикацията disallow_account: Забрана на автора no_status_selected: Няма промяна, тъй като няма избрана нашумяла публикация not_discoverable: Авторът не е избрал да е откриваем shared_by: - one: Споделено или сложено веднъж в любими - other: Споделено или сложено в любими %{friendly_count} пъти + one: Споделено или харесано веднъж + other: Споделено или харесано %{friendly_count} пъти title: Налагащи се публикации tags: current_score: Текущ резултат %{score} @@ -1009,7 +1009,7 @@ bg: remove: Разкачвне на псевдонима appearance: advanced_web_interface: Разширен уеб интерфейс - advanced_web_interface_hint: 'Ако желаете да се възползвате от пълната ширина на своя екран, разширеният уеб интерфейс ще ви позволи да настроите най-различни колони, за да виждате едновременно множество информация: Начало, известия, федериран инфопоток, множество списъци и хаштагове.' + advanced_web_interface_hint: 'Ако желаете да се възползвате от цялата ширина на своя екран, разширеният уеб интерфейс ще ви позволи да настроите няколко различни колони, за да виждате едновременно различна информация: Начало, известия, федерирана хронология, множество списъци и хаштагове.' animations_and_accessibility: Анимация и достъпност confirmation_dialogs: Диалогов прозорец за потвърждение discovery: Откриване @@ -1231,13 +1231,13 @@ bg: add_new: Добавяне на нов errors: limit: Вече достигнахте максималния брой хаштагове - hint_html: "Какво представляват актуалните хаштагове? Те се показват ясно на вашия публичен профил и позволяват на хората да преглеждат публичните ви публикации с тези хаштагове. Те са чудесен инструмент, с който може да се следи творческа работа или дългосрочни проекти." + hint_html: "Изтъкнете най-важните си хаштагове на профила? Чудесен инструмент за организиране на вашите творби и дългосрочни проекти, изтъкнатите хаштагове са отчетливо видими на вашия профил и позволяват лесен достъп до вашите собствени публикации." filters: contexts: account: Профили home: Начало и списъци notifications: Известия - public: Публични инфопотоци + public: Публични хронологии thread: Разговори edit: add_keyword: Добавяне на ключова дума @@ -1400,11 +1400,11 @@ bg: confirmation_html: Наистина ли искате да спрете абонамента от получаването на %{type} за Mastodon в %{domain} към имейла си при %{email}? Може винаги пак да се абонирате от своите настройки за известяване по е-поща. emails: notification_emails: - favourite: е-писма с любими известия + favourite: е-писма за харесани известия follow: е-писма с известия за последване follow_request: е-писма със заявки за следване mention: е-писма с известия за споменаване - reblog: е-писма с известия за подсилване + reblog: е-писма с известия за раздуване resubscribe_html: Ако погрешка сте спрели абонамента, то може пак да се абонирате от своите настройки за известия по е-поща. success_html: Повече няма да получавате %{type} за Mastodon в %{domain} към имейла си при %{email}. title: Спиране на абонамента @@ -1459,9 +1459,9 @@ bg: sign_up: subject: "%{name} се регистрира" favourite: - body: 'Вашата публикация беше добавена в любими от %{name}:' + body: 'Вашата публикация беше харесана от %{name}:' subject: "%{name} хареса вашата публикация" - title: Нова любима публикация + title: Нова харесана публикация follow: body: "%{name} те последва!" subject: "%{name} те последва" @@ -1479,9 +1479,9 @@ bg: poll: subject: Анкетата от %{name} приключи reblog: - body: 'Ваша публикация беше подсилена от %{name}:' - subject: "%{name} подсили ваша публикация" - title: Ново подсилване + body: 'Ваша публикация беше раздута от %{name}:' + subject: "%{name} разду ваша публикация" + title: Ново раздуване status: subject: "%{name} току-що публикува" update: @@ -1530,7 +1530,7 @@ bg: preferences: other: Друго posting_defaults: По подразбиране за публикации - public_timelines: Публични инфопотоци + public_timelines: Публични хронологии privacy: hint_html: "Персонализирайте как искате профилът ви и публикациите ви да се намират. Разнообразие от функции в Mastodon може да ви помогнат да достигнете по-широка публика, когато е включено. Отделете малко време, за да прегледате тези настройки, за да се уверите, че отговарят на вашия случай на употреба." privacy: Поверителност @@ -1668,7 +1668,7 @@ bg: video: one: "%{count} видео" other: "%{count} видеозаписа" - boosted_from_html: Подсилено от %{acct_link} + boosted_from_html: Раздуто от %{acct_link} content_warning: 'Предупреждение за съдържание: %{warning}' default_language: Същият като езика на интерфейса disallowed_hashtags: @@ -1680,10 +1680,10 @@ bg: open_in_web: Отвори в уеб over_character_limit: прехвърлен лимит от %{max} символа pin_errors: - direct: Публикациите, които са видими само за споменати потребители не може да се закачат + direct: Публикациите, които са видими само за потребители споменати в тях, не могат да бъдат закачани limit: Вече сте закачили максималния брой публикации - ownership: Публикация на някого другиго не може да се закачи - reblog: Подсилване не може да се закача + ownership: Публикация на някого другиго не може да бъде закачена + reblog: Раздуване не може да бъде закачано poll: total_people: one: "%{count} човек" @@ -1704,27 +1704,27 @@ bg: public: Публично public_long: Всеки ги вижда unlisted: Публично, но не показвай в публичния канал - unlisted_long: Всеки ги вижда, но са скрити от публичните инфопотоци + unlisted_long: Всеки ги вижда, но са скрити от публичните хронологии statuses_cleanup: enabled: Автоматично изтриване на стари публикации enabled_hint: От само себе си трие публикациите ви, щом достигнат указания възрастов праг, освен ако не съвпаднат с някое от изключенията долу exceptions: Изключения explanation: Тъй като изтриването на публикации е скъпа операция, това се прави бавно във времето, когато сървърът иначе не е зает. Поради тази причина публикациите ви може да се изтрият известно време след като достигнат възрастовия праг. ignore_favs: Игнориране на харесвания - ignore_reblogs: Игнориране на подсилвания + ignore_reblogs: Игнориране на раздувания interaction_exceptions: Изключения въз основа на взаимодействия - interaction_exceptions_explanation: Забележете, че няма гаранция, че публикацията ще се изтрият, ако паднат под прага на брой маркирания като любими/подсилвания, след като са го надвишили. + interaction_exceptions_explanation: Забележете, че няма гаранция, че публикациите ще бъдат изтрити, ако паднат под прага на брой маркирания като харесвани или раздувани, след като са го надвишили. keep_direct: Запазване на директните съобщения keep_direct_hint: Директните ви съобщения не се изтриват keep_media: Задържане на публикации с прикачена мултимедия keep_media_hint: Не изтрива публикации, които съдържат мултимедийни прикачвания - keep_pinned: Запазване на закачените публикации - keep_pinned_hint: Не изтрива закачени публикации + keep_pinned: Задържане на закачените публикации + keep_pinned_hint: Не изтрива закачените ви публикации keep_polls: Запазване на запитванията keep_polls_hint: Не изтрива запитвания keep_self_bookmark: Запазване на публикации, добавени в отметки keep_self_bookmark_hint: Не се изтриват ваши публикации, ако сте ги добавили към отметки - keep_self_fav: Запазване на публикации, които сте маркирали като любими + keep_self_fav: Задържане на публикации, които сте харесали keep_self_fav_hint: Не се изтриват публикации, които сте харесали min_age: '1209600': 2 седмици @@ -1736,10 +1736,10 @@ bg: '63113904': 2 години '7889238': 3 месеца min_age_label: Възрастов праг - min_favs: Запазване на публикации, маркирани като любими поне - min_favs_hint: Не се изтриват никоя от публикациите ви, маркирани като любими поне толкова пъти. Оставете празно, за да изтриете публикациите независимо от броя маркирания като любими - min_reblogs: Запазване на публикации с поне толкова споделяния - min_reblogs_hint: Не се изтриват ваши публикации, споделени поне толкова пъти. Оставете празно, за да изтриете публикациите независимо от техния брой споделяния + min_favs: Запазване на харесани публикации поне + min_favs_hint: Не се изтрива никоя от публикациите, които сте харесали поне толкова пъти. Оставете празно, за да изтриете публикациите независимо от броя харесвания + min_reblogs: Запазване на публикации с поне толкова раздувания + min_reblogs_hint: Не се изтриват ваши публикации, споделени поне толкова пъти. Оставете празно, за да изтриете публикациите независимо от броя на техния раздувания stream_entries: sensitive_content: Деликатно съдържание strikes: @@ -1842,7 +1842,7 @@ bg: edit_profile_step: Може да настроите профила си, качвайки снимката на профила, променяйки показваното си име и други неща. Може да се включите за преглед на нови последователи преди да бъдат позволени да ви последват. explanation: Ето няколко стъпки за начало final_action: Начало на публикуване - final_step: 'Публикувайте! Дори без последователи, вашите публични публикации ще бъдат видени от други, например в местния инфопоток или под хаштагове. Не забравяйте да се представите с хаштаг #introductions.' + final_step: 'Публикувайте! Дори без да имате последователи, вашите публични публикации ще бъдат видени от други, например в местната хронология или под хаштагове. Не забравяйте да се представите с хаштаг #introductions.' full_handle: Пълното ви име full_handle_hint: Ето какво бихте казали на приятелите си, за да могат да ви изпращат съобщения или да ви последват от друг сървър. subject: Добре дошли в Mastodon diff --git a/config/locales/cy.yml b/config/locales/cy.yml index 768dd3e0c8..5085942fb7 100644 --- a/config/locales/cy.yml +++ b/config/locales/cy.yml @@ -1650,6 +1650,9 @@ cy: errors: limit_reached: Cyrhaeddwyd terfyn y gwahanol adweithiau unrecognized_emoji: nid yw'n emoji cydnabyddedig + redirects: + prompt: Os ydych chi'n ymddiried yn y ddolen hon, cliciwch arni i barhau. + title: Rydych chi'n gadael %{instance}. relationships: activity: Gweithgareddau cyfrif confirm_follow_selected_followers: Ydych chi'n siŵr eich bod am ddilyn y dilynwyr a ddewiswyd? @@ -1911,13 +1914,19 @@ cy: appeal_rejected: explanation: Mae apêl y rhybudd yn erbyn eich cyfrif ar %{strike_date} a gyflwynwyd gennych ar %{appeal_date} wedi'i gwrthod. subject: Mae eich apêl ar %{date} wedi'i gwrthod - subtitle: Mae eich apêl wedi'i gwrthod + subtitle: Mae eich apêl wedi'i gwrthod. title: Mae'r apêl wedi'i gwrthod backup_ready: explanation: Rydych wedi gofyn am gopi wrth gefn llawn o'ch cyfrif Mastodon. extra: Mae nawr yn barod i'w lwytho i lawr! subject: Mae eich archif yn barod i'w lawrlwytho title: Allfudo archif + failed_2fa: + details: 'Dyma fanylion yr ymgais i fewngofnodi:' + explanation: Mae rhywun wedi ceisio mewngofnodi i'ch cyfrif ond wedi darparu ail ffactor dilysu annilys. + further_actions_html: Os nad chi oedd hwn, rydym yn argymell eich bod yn %{action} ar unwaith oherwydd gall fod o dan fygythiad. + subject: Methiant dilysu ail ffactor + title: Wedi methu dilysu ail ffactor suspicious_sign_in: change_password: newidiwch eich cyfrinair details: 'Dyma fanylion y mewngofnodi:' @@ -1971,6 +1980,7 @@ cy: go_to_sso_account_settings: Ewch i osodiadau cyfrif eich darparwr hunaniaeth invalid_otp_token: Côd dau-ffactor annilys otp_lost_help_html: Os colloch chi fynediad i'r ddau, mae modd i chi gysylltu a %{email} + rate_limited: Gormod o geisiadau dilysu, ceisiwch eto yn nes ymlaen. seamless_external_login: Yr ydych wedi'ch mewngofnodi drwy wasanaeth allanol, felly nid yw gosodiadau cyfrinair ac e-bost ar gael. signed_in_as: 'Wedi mewngofnodi fel:' verification: diff --git a/config/locales/devise.ar.yml b/config/locales/devise.ar.yml index 28e721e667..4e6adf42e5 100644 --- a/config/locales/devise.ar.yml +++ b/config/locales/devise.ar.yml @@ -47,14 +47,19 @@ ar: subject: 'ماستدون: تعليمات استعادة كلمة المرور' title: إعادة تعيين كلمة السر two_factor_disabled: + explanation: أصبح الولوج الآن ممكنا باستخدام عنوان البريد الإلكتروني وكلمة المرور فقط. subject: 'ماستدون: نظام المصادقة بخطوتين مُعطّل' + subtitle: تم تعطيل المصادقة بعاملين لحسابك. title: إنّ 2FA معطّل two_factor_enabled: + explanation: سيتعين استخدام رمز يتم إنشاؤه بواسطة تطبيق TOTP المقترن لتسجيل الدخول. subject: 'ماستدون: تم تفعيل نظام المصادقة بخطوتين' - title: إنّ 2FA نشِط + subtitle: تم تفعيل المصادقة الثنائية لحسابك. + title: الاستيثاق الثنائي 2FA مُفعّل two_factor_recovery_codes_changed: explanation: لقد تم إلغاء رموز الاسترداد السابقة وأنشئت رموز جديدة. subject: 'ماستدون: تم إعادة توليد رموز استرجاع المصادقة بخطوتين' + subtitle: تم إبطال رموز الاسترداد السابقة وإنشاء رموز جديدة. title: تم استبدال رموز استرجاع 2FA unlock_instructions: subject: 'ماستدون: تعليمات فك القفل' @@ -68,9 +73,13 @@ ar: subject: 'ماستدون: تم حذف مفتاح الأمان' title: تم حذف أحد مفاتيح الأمان الخاصة بك webauthn_disabled: + explanation: تم تعطيل المصادقة باستخدام مفاتيح الأمان لحسابك. + extra: يمكن الآن تسجيل الدخول باستخدام الرمز المميز الذي تم إنشاؤه بواسطة تطبيق TOTP المقترن فقط. subject: 'ماستدون: الاستيثاق مع مفاتيح الأمان معطلة' title: مفاتيح الأمان معطلة webauthn_enabled: + explanation: تم تمكين مصادقة مفتاح الأمان لحسابك. + extra: يمكن الآن استخدام مفتاح الأمان الخاص بك لتسجيل الدخول. subject: 'ماستدون: تم تفعيل نظام استيثاق مفتاح الأمان' title: مفاتيح الأمان مفعلة omniauth_callbacks: diff --git a/config/locales/devise.be.yml b/config/locales/devise.be.yml index 8679275c20..18785d16ab 100644 --- a/config/locales/devise.be.yml +++ b/config/locales/devise.be.yml @@ -47,14 +47,19 @@ be: subject: 'Mastodon: Інструкцыі па скіданню пароля' title: Скіданне пароля two_factor_disabled: + explanation: Уваход у сістэму цяпер магчымы толькі з выкарыстаннем адраса электроннай пошты і пароля. subject: 'Mastodon: двухфактарная аўтэнтыфікацыя адключана' + subtitle: Двухфактарная аўтэнтыфікацыя для вашага ўліковага запісу была адключаная. title: двухэтапнае спраўджанне адключана two_factor_enabled: + explanation: Для ўваходу ў сістэму патрабуецца токен, згенераваны спалучанай праграмай TOTP. subject: 'Mastodon: двухфактарная аўтэнтыфікацыя ўключана' + subtitle: Для вашага ўліковага запісу была ўключаная двухфактарная аўтэнтыфікацыя. title: двухэтапнае спраўджанне уключана two_factor_recovery_codes_changed: explanation: Папярэднія коды аднаўлення былі ануляваны і створаны новыя. subject: 'Mastodon: створаны новыя коды аднаўлення' + subtitle: Папярэднія коды аднаўлення былі ануляваны і замест іх створаны новыя. title: 2FA коды аднаўлення былі зменены unlock_instructions: subject: 'Mastodon: інструкцыя па разблакаванні' @@ -68,9 +73,13 @@ be: subject: 'Mastodon: ключ бяспекі выдалены' title: Адзін з вашых ключоў бяспекі быў выдалены webauthn_disabled: + explanation: Аўтэнтыфікацыя з дапамогай ключоў бяспекі была адключаная для вашага ўліковага запісу. + extra: Зараз уваход у сістэму магчымы толькі з выкарыстаннем токена, згенераванага спалучанай праграмай TOTP. subject: 'Mastodon: Аўтэнтыфікацыя з дапамогай ключоў бяспекі адключана' title: Ключы бяспекі адключаны webauthn_enabled: + explanation: Для вашага ўліковага запісу ўключана аўтэнтыфікацыя па ключу бяспекі. + extra: Цяпер ваш ключ бяспекі можна выкарыстоўваць для ўваходу ў сістэму. subject: 'Mastodon: Аўтэнтыфікацыя праз ключ бяспекі была ўключана' title: Ключы бяспекі ўключаны omniauth_callbacks: diff --git a/config/locales/devise.en-GB.yml b/config/locales/devise.en-GB.yml index 8fa02bbd4a..823be9aa6c 100644 --- a/config/locales/devise.en-GB.yml +++ b/config/locales/devise.en-GB.yml @@ -47,14 +47,19 @@ en-GB: subject: 'Mastodon: Reset password instructions' title: Password reset two_factor_disabled: + explanation: Login is now possible using only e-mail address and password. subject: 'Mastodon: Two-factor authentication disabled' + subtitle: Two-factor authentication for your account has been disabled. title: 2FA disabled two_factor_enabled: + explanation: A token generated by the paired TOTP app will be required for login. subject: 'Mastodon: Two-factor authentication enabled' + subtitle: Two-factor authentication has been enabled for your account. title: 2FA enabled two_factor_recovery_codes_changed: explanation: The previous recovery codes have been invalidated and new ones generated. subject: 'Mastodon: Two-factor recovery codes re-generated' + subtitle: The previous recovery codes have been invalidated and new ones generated. title: 2FA recovery codes changed unlock_instructions: subject: 'Mastodon: Unlock instructions' @@ -68,9 +73,13 @@ en-GB: subject: 'Mastodon: Security key deleted' title: One of your security keys has been deleted webauthn_disabled: + explanation: Authentication with security keys has been disabled for your account. + extra: Login is now possible using only the token generated by the paired TOTP app. subject: 'Mastodon: Authentication with security keys disabled' title: Security keys disabled webauthn_enabled: + explanation: Security key authentication has been enabled for your account. + extra: Your security key can now be used for login. subject: 'Mastodon: Security key authentication enabled' title: Security keys enabled omniauth_callbacks: diff --git a/config/locales/devise.fi.yml b/config/locales/devise.fi.yml index 22fd7ff47b..66616d16b1 100644 --- a/config/locales/devise.fi.yml +++ b/config/locales/devise.fi.yml @@ -13,32 +13,32 @@ fi: locked: Tilisi on lukittu. not_found_in_database: Virheellinen %{authentication_keys} tai salasana. pending: Tilisi on vielä tarkistamatta. - timeout: Istuntosi on umpeutunut. Jatka kirjautumalla uudelleen sisään. + timeout: Istuntosi on vanhentunut. Jatkaaksesi käyttöä, kirjaudu uudelleen. unauthenticated: Sinun on kirjauduttava tai rekisteröidyttävä ennen kuin voit jatkaa. unconfirmed: Vahvista sähköpostiosoitteesi, ennen kuin jatkat. mailer: confirmation_instructions: action: Vahvista sähköpostiosoite action_with_app: Vahvista ja palaa %{app} - explanation: Olet luonut tilin palvelimelle %{host} käyttäen tätä sähköpostiosoitetta. Olet painalluksen päässä tilin aktivoinnista. Jos et luonut tiliä itse, voit jättää tämän viestin huomiotta. + explanation: Olet luonut käyttäjätilin palvelimelle %{host} tätä sähköpostiosoitetta käyttäen. Olet painalluksen päässä tilin aktivoinnista. Jos et luonut tiliä itse, voit jättää tämän viestin huomiotta. explanation_when_pending: Teit hakemuksen kutsusta palvelimelle %{host} tällä sähköpostiosoitteella. Kun olet vahvistanut sähköpostiosoitteesi, tarkistamme hakemuksesi. Voit kirjautua sisään muuttaaksesi hakemuksen sisältöä tai poistaaksesi tilin, mutta et voi käyttää suurinta osaa toiminnallisuudesta ennen kuin hakemuksesi on hyväksytty. Jos hakemuksesi hylätään, tietosi poistetaan eikä sinulta tarvita enempää toimia. Jos sinä et tehnyt hakemusta, voit jättää tämän viestin huomiotta. extra_html: Tutustu myös palvelimen sääntöihin ja palveluehtoihimme. subject: 'Mastodon: Vahvistusohjeet instanssille %{instance}' title: Vahvista sähköpostiosoite email_changed: explanation: 'Tilin sähköpostiosoitteeksi vaihdetaan:' - extra: Jos et vaihtanut sähköpostiosoitettasi, joku muu on todennäköisesti päässyt käyttämään tiliäsi. Vaihda salasanasi viipymättä, tai ota yhteys palvelimen ylläpitäjään, jos et pääse kirjautumaan tilillesi. + extra: Jos et vaihtanut sähköpostiosoitettasi, joku muu on todennäköisesti päässyt käyttämään tiliäsi. Vaihda salasanasi viipymättä, tai ota yhteys palvelimen ylläpitoon, ellet pääse sisään käyttäjätilillesi. subject: 'Mastodon: Sähköpostiosoite vaihdettu' title: Uusi sähköpostiosoite password_change: explanation: Tilisi salasana on vaihdettu. - extra: Jos et vaihtanut salasanaasi, joku muu on todennäköisesti päässyt käyttämään tiliäsi. Vaihda salasanasi viipymättä, tai ota yhteys palvelimen ylläpitäjään, jos et pääse kirjautumaan tilillesi. + extra: Ellet vaihtanut salasanaasi, joku muu on todennäköisesti päässyt käyttäjätilillesi. Vaihda salasanasi viipymättä, tai ota yhteys palvelimen ylläpitoon, jos kirjautuminen käyttäjätilillesi ei onnistu. subject: 'Mastodon: salasana vaihdettu' title: Salasana vaihdettu reconfirmation_instructions: explanation: Vahvista uusi sähköpostiosoite, niin muutos astuu voimaan. extra: Jos et tehnyt muutosta itse, voit jättää tämän viestin huomiotta. Mastodon-tilin sähköpostiosoitetta ei vaihdeta, ennen kuin klikkaat yllä olevaa linkkiä. - subject: 'Mastodon: vahvista sähköpostiosoite: %{instance}' + subject: 'Mastodon: Vahvista sähköpostiosoite palvelimelle %{instance}' title: Vahvista sähköpostiosoite reset_password_instructions: action: Vaihda salasana @@ -55,27 +55,27 @@ fi: explanation: Sisäänkirjautuminen edellyttää liitetyn TOTP-sovelluksen luomaa aikarajattua kertatunnuslukua. subject: 'Mastodon: kaksivaiheinen todennus otettu käyttöön' subtitle: Kaksivaiheinen todennus on otettu käyttöön tilillesi. - title: 2-vaiheinen todennus käytössä + title: Kaksivaiheinen todennus käytössä two_factor_recovery_codes_changed: - explanation: Uudet palautuskoodit on nyt luotu ja vanhat on mitätöity. - subject: 'Mastodon: kaksivaiheisen todennuksen palautuskoodit luotiin uudelleen' - subtitle: Aiemmat palautuskoodit on mitätöity ja tilalle on luotu uudet. + explanation: Uudet palautuskoodit on nyt luotu, ja vanhat mitätöity. + subject: 'Mastodon: Kaksivaihetodennuksen palautuskoodit luotiin uudelleen' + subtitle: Aiemmat palautuskoodit on mitätöity, ja korvaavat uudet koodit on luotu. title: 2-vaiheisen todennuksen palautuskoodit vaihdettiin unlock_instructions: subject: 'Mastodon: lukituksen poistamisen ohjeet' webauthn_credential: added: explanation: Seuraava suojausavain on lisätty tilillesi - subject: 'Mastodon: uusi suojausavain' + subject: 'Mastodon: Uusi suojausavain' title: Uusi suojausavain on lisätty deleted: explanation: Seuraava suojausavain on poistettu tililtäsi - subject: 'Mastodon: suojausavain poistettu' + subject: 'Mastodon: Suojausavain poistettu' title: Yksi suojausavaimistasi on poistettu webauthn_disabled: - explanation: Turva-avaimin kirjautuminen on poistettu käytöstä tililtäsi. - extra: Sisäänkirjautuminen on nyt mahdollista pelkällä palveluun liitetyn TOTP-sovelluksen luomalla aikarajoitteisella kertatunnusluvulla. - subject: 'Mastodon: Todennus suojausavaimilla poistettu käytöstä' + explanation: Turva-avaimin kirjautuminen tilillesi on kytketty pois käytöstä. + extra: Olet nyt mahdollistanut sisäänkirjautumisen käyttäjätilillesi pelkästään palveluun liitetyn TOTP-sovelluksen luomalla aikarajoitteisella kertatunnusluvulla. + subject: 'Mastodon: Turva-avaintodennus on poistettu käytöstä' title: Suojausavaimet poistettu käytöstä webauthn_enabled: explanation: Turva-avaimella kirjautuminen on otettu käyttöön tilillesi. @@ -86,20 +86,20 @@ fi: failure: Tunnistautuminen lähteestä %{kind} ei onnistunut, koska "%{reason}". success: Tunnistautuminen tililtä %{kind} onnistui. passwords: - no_token: Tälle sivulle pääsee vain salasananvaihtoviestin kautta. Jos tiedät tulevasi salasananvaihtoviestin kautta, varmista, että käytät koko viestissä mainittua URL-osoitetta. - send_instructions: Jos sähköpostiosoite on tietokannassamme, siihen lähetetään pian linkki salasanan vaihtoon. Jos et saa viestiä, tarkista roskapostikansio. - send_paranoid_instructions: Jos sähköpostiosoite on tietokannassamme, siihen lähetetään pian linkki salasanan vaihtoon. Jos et saa viestiä, tarkista roskapostikansio. + no_token: Tälle sivulle pääsee vain salasananvaihtoviestin kautta. Jos tiedät tulevasi sen kautta, varmista, että käytät viestissä mainittua URL-osoitetta kokonaisuudessaan. + send_instructions: Jos sähköpostiosoite on tietokannassamme, siihen lähetetään pian viesti, jossa on linkki salasanan vaihtamiseksi. Mikäli viestiä ei kuulu, tarkista myös roskapostisi. + send_paranoid_instructions: Jos sähköpostiosoite on tietokannassamme, siihen lähetetään pian viesti, jossa on linkki salasanan vaihtamiseksi. Mikäli viestiä ei kuulu, tarkista myös roskapostisi. updated: Salasanan vaihto onnistui. Olet nyt kirjautunut sisään. updated_not_active: Salasanan vaihto onnistui. registrations: - destroyed: Tilisi on poistettu. Näkemiin ja tervetuloa uudelleen! + destroyed: Tilisi on poistettu. Näkemiin ja tervetuloa uudelleen. signed_up: Tervetuloa! Rekisteröityminen onnistui. - signed_up_but_inactive: Rekisteröityminen onnistui. Emme kuitenkaan voi kirjata sinua sisään, sillä tiliäsi ei ole vielä aktivoitu. - signed_up_but_locked: Rekisteröityminen onnistui. Emme kuitenkaan voi kirjata sinua sisään, sillä tilisi on lukittu. - signed_up_but_pending: Sähköpostiosoitteeseesi on lähetetty vahvistuslinkki. Kun olet klikannut linkkiä, tarkistamme hakemuksesi. Sinulle tiedotetaan jos se hyväksytään. - signed_up_but_unconfirmed: Sähköpostiosoitteeseesi on lähetetty vahvistuslinkki. Aktivoi tili seuraamalla linkkiä. Jos et saanut viestiä, tarkista roskapostikansio. - update_needs_confirmation: Tilin päivitys onnistui, mutta uusi sähköpostiosoite on vahvistettava. Tarkista sähköpostisi ja vahvista uusi sähköpostiosoite seuraamalla vahvistuslinkkiä. Jos et saanut viestiä, tarkista roskapostikansio. - updated: Tilin päivitys onnistui. + signed_up_but_inactive: Rekisteröityminen onnistui. Emme kuitenkaan voi kirjata sinua sisään, sillä käyttäjätiliäsi ei ole vielä aktivoitu. + signed_up_but_locked: Rekisteröityminen onnistui. Emme kuitenkaan voi kirjata sinua sisään, sillä käyttäjätilisi on lukittuna. + signed_up_but_pending: Sähköpostiosoitteeseesi on lähetetty vahvistuslinkki. Sen avattuasi tarkistamme hakemuksesi, ja ilmoitamme hyväksynnästä. + signed_up_but_unconfirmed: Sähköpostiosoitteeseesi on lähetetty vahvistuslinkki. Aktivoi käyttäjätilisi seuraamalla linkkiä. Mikäli sitä ei kuulu, tarkista myös roskapostisi. + update_needs_confirmation: Tilin päivitys onnistui. Uusi sähköpostiosoite on kuitenkin vahvistettava. Tarkista saapuneet viestisi, ja vahvista uusi sähköpostiosoitteesi vahvistuslinkkiä seuraten. Mikäli viestiä ei kuulu, tarkista myös roskapostisi. + updated: Käyttäjätilisi tietojen päivittäminen onnistui. sessions: already_signed_out: Uloskirjautuminen onnistui. signed_in: Sisäänkirjautuminen onnistui. diff --git a/config/locales/devise.ga.yml b/config/locales/devise.ga.yml index 0949e140d1..6e6bd0a013 100644 --- a/config/locales/devise.ga.yml +++ b/config/locales/devise.ga.yml @@ -1,9 +1,23 @@ --- ga: devise: + confirmations: + confirmed: D'éirigh le deimhniú do ríomhphost. + send_instructions: Gheobhaidh tú r-phost go gairid ina mbeidh treoracha faoi conas do sheoladh r-phost a dheimhniú. Féach i d'fhillteán turscair mura bhfuair tú an r-phost seo. + send_paranoid_instructions: Más ann do do r-phost inár mbonneagar, gheobhaidh tú r-phost i gceann cúpla nóiméad faoi conas do sheoladh r-phost a dheimhniú. Féach i d'fhillteán turscair mura bhfuair tú an r-phost seo. failure: + already_authenticated: Tá tú sínithe isteach cheana. + inactive: Níl do chuntas gníomhachtaithe fós. + invalid: "%{authentication_keys} nó pasfhocal neamhbhailí." + last_attempt: Tá iarracht amháin eile agat sula gcuirtear do chuntas faoi ghlas. locked: Tá do chuntas faoi ghlas. + pending: Tá do chuntas fós faoi athbhreithniú. + unauthenticated: Ní mór duit lógáil isteach nó síniú suas roimh leanúint leat. + unconfirmed: Caithfidh tú do r-phost a dheimhniú roimh leanúint leat. mailer: + confirmation_instructions: + action: Deimhnigh seoladh r-phost + action_with_app: Deimhnigh agus fill ar %{app} email_changed: title: Seoladh ríomhphoist nua password_change: diff --git a/config/locales/devise.ia.yml b/config/locales/devise.ia.yml index c45994160c..c07e75feff 100644 --- a/config/locales/devise.ia.yml +++ b/config/locales/devise.ia.yml @@ -11,16 +11,33 @@ ia: email_changed: title: Nove adresse de e-mail password_change: + subject: 'Mastodon: Contrasigno cambiate' title: Contrasigno cambiate reconfirmation_instructions: + explanation: Confirma le nove adresse pro cambiar tu email. title: Verificar adresse de e-mail reset_password_instructions: action: Cambiar contrasigno + subject: 'Mastodon: Instructiones pro reinitialisar le contrasigno' title: Reinitialisar contrasigno two_factor_disabled: title: 2FA disactivate two_factor_enabled: title: 2FA activate + unlock_instructions: + subject: 'Mastodon: Instructiones pro disblocar' + webauthn_credential: + added: + explanation: Le sequente clave de securitate esseva addite a tu conto + subject: 'Mastodon: Nove clave de securitate' + title: Un nove clave de securitate esseva addite + deleted: + explanation: Le sequente clave de securitate esseva delite de tu conto + subject: 'Mastodon: Clave de securitate delite' + webauthn_disabled: + title: Claves de securitate disactivate + webauthn_enabled: + title: Claves de securitate activate registrations: updated: Tu conto ha essite actualisate con successo. unlocks: diff --git a/config/locales/devise.lad.yml b/config/locales/devise.lad.yml index 2b6b8aafb1..88099f48c4 100644 --- a/config/locales/devise.lad.yml +++ b/config/locales/devise.lad.yml @@ -3,7 +3,7 @@ lad: devise: confirmations: confirmed: Tu adreso de posta elektronika tyene sido konfirmado korektamente. - send_instructions: Risiviras una posta elektronika kon instruksyones para konfirmar tu adreso de posta elektronika en unos minutos. Por favor, komprova tu kuti de spam si no risivites esta posta elektronika. + send_instructions: Risiviras una mesaj de posta elektronika kon instruksyones para konfirmar tu adreso de posta elektronika en unos minutos. Por favor, komprova tu kuti de spam si no risivites esta posta elektronika. send_paranoid_instructions: Si tu adreso de posta elektronika existe en muestra baza de datos, risiviras una posta elektronika kon instruksyones sobre komo konfirmar tu adreso de posta elektronika en pokos minutos. failure: already_authenticated: Ya te konektates kon tu kuento. @@ -12,7 +12,7 @@ lad: last_attempt: Aprova una vez mas antes de ke tu kuento sea blokado. locked: Tu kuento esta blokado. not_found_in_database: Inkorekto %{authentication_keys} o kod. - pending: Tu ainda esta basho revizyon. + pending: Tu kuento ainda esta basho revizyon. timeout: Tu sesyon tiene kadukado. Por favor konektate kon tu kuento de muevo para kontinuar. unauthenticated: Kale konektarte kon tu kuento o enregistrarte antes de kontinuar. unconfirmed: Tyenes ke konfirmar tu adreso de posta elektronika antes de kontinuar. @@ -45,17 +45,17 @@ lad: explanation: Solisitates un muevo kod para tu kuento. extra: Si no solisitates esto, por favor ignora esta posta. Tu kod no trokara asta ke tu aksedas al atadijo arriva i kriyes un muevo. subject: 'Mastodon: Instruksyones para reinisyar kod' - title: Reinisyar kod + title: Reinisya kod two_factor_disabled: explanation: Agora puedes konektarte kon tu kuento uzando solo tu adreso de posta i kod. subject: 'Mastodon: La autentifikasyon de dos pasos esta inkapasitada' subtitle: La autentifikasyon en dos pasos para tu kuento tiene sido inkapasitada. - title: Autentifikasyon 2FA inkapasitada + title: Autentifikasyon de dos pasos inkapasitada two_factor_enabled: explanation: Se rekierira un token djenerado por la aplikasyon TOTP konektada para entrar. subject: 'Mastodon: La autentifikasyon de dos pasos esta kapasitada' subtitle: La autentifikasyon de dos pasos para tu kuento tiene sido kapasitada. - title: Autentifikasyon 2FA aktivada + title: Autentifikasyon de dos pasos aktivada two_factor_recovery_codes_changed: explanation: Los kodiches de rekuperasyon previos tienen sido invalidados i se djeneraron kodiches muevos. subject: 'Mastodon: Los kodiches de rekuperasyon de dos pasos fueron rejenerados' @@ -69,9 +69,9 @@ lad: subject: 'Mastodon: Mueva yave de sigurita' title: Se tiene adjustado una mueva yave de sigurita deleted: - explanation: La sigiente yave de sigurita a sido supremida de tu kuento + explanation: La sigiente yave de sigurita a sido suprimida de tu kuento subject: 'Mastodon: Yave de sigurita supremida' - title: Una de tus yaves de sigurita tiene sido supremida + title: Una de tus yaves de sigurita tiene sido suprimida webauthn_disabled: explanation: La autentifikasyon kon yaves de sigurita tiene sido inkapasitada para tu kuento. extra: Agora el inisyo de sesyon solo es posivle utilizando el token djeenerado por la aplikasyon TOTP konektada. @@ -89,7 +89,7 @@ lad: no_token: No puedes akseder a esta pajina si no vienes dizde una posta elektronika de restablesimyento de kod. Si vienes dizde una posta elektronika de restablesimyento de kod, por favor asigurate de utilizar el URL kompleto embiado. send_instructions: Si tu adreso de posta elektronika existe en muestra baza de datos, risiviras un atadijo de rekuperasyon de kod en tu adreso de posta elektronika en pokos minutos. Por favor, komprova tu kuti de posta spam si no risives akeya posta elektronika. send_paranoid_instructions: Si tu adreso de posta elektronika existe en muestra baza de datos, risiviras un atadijo de rekuperasyon de kod en tu adreso de posta elektronika en pokos minutos. Por favor, komprova tu kuti de posta no deseado si no risives akeya posta elektronika. - updated: Tu kod a sido trokado kon reusho. Tinenes entrado en kuento. + updated: Tu kod a sido trokado kon reusho. Tyenes entrado en kuento. updated_not_active: Tu kod se tiene trokado kon reusho. registrations: destroyed: Tu kuento a sido efasado kon reusho. Asperamos verte de muevo pronto. diff --git a/config/locales/devise.nl.yml b/config/locales/devise.nl.yml index 33d777e2cc..0aaf376f7f 100644 --- a/config/locales/devise.nl.yml +++ b/config/locales/devise.nl.yml @@ -74,7 +74,7 @@ nl: title: Een van jouw beveiligingssleutels is verwijderd webauthn_disabled: explanation: Verificatie met beveiligingssleutels is uitgeschakeld voor je account. - extra: Het is nu alleen mogelijk om te te loggen met een door de authenticatie-app gegeneerde toegangscode. + extra: Het is nu alleen mogelijk om in te loggen met een door de authenticatie-app gegeneerde toegangscode. subject: 'Mastodon: Verificatie met beveiligingssleutels is uitgeschakeld' title: Beveiligingssleutels uitgeschakeld webauthn_enabled: diff --git a/config/locales/devise.uk.yml b/config/locales/devise.uk.yml index 55429b3c76..3b3883fa9c 100644 --- a/config/locales/devise.uk.yml +++ b/config/locales/devise.uk.yml @@ -47,14 +47,19 @@ uk: subject: 'Mastodon: Інструкції для скидання паролю' title: Скидання пароля two_factor_disabled: + explanation: Вхід можливий лише за допомогою адреси електронної пошти та пароля. subject: 'Mastodon: двофакторну авторизацію вимкнено' + subtitle: Двоетапна перевірка для вашого облікового запису вимкнена. title: Двофакторна автентифікація вимкнена two_factor_enabled: + explanation: Для входу необхідний токен створений пов'язаним застосунком TOTP. subject: 'Mastodon: двофакторну авторизацію увімкнено' + subtitle: Двоетапна перевірка увімкнена для вашого облікового запису. title: Двофакторна автентифікація увімкнена two_factor_recovery_codes_changed: explanation: Попередні коди відновлення були анульовані і генеруються нові. subject: 'Mastodon: коди двофакторного відновлення повторно згенеровано' + subtitle: Попередні коди відновлення анульовані та генеруються нові. title: Коди двофакторного відновлення змінено unlock_instructions: subject: 'Mastodon: Інструкції для розблокування' @@ -68,9 +73,13 @@ uk: subject: 'Mastodon: Ключ безпеки видалено' title: Один з ваших ключів безпеки було видалено webauthn_disabled: + explanation: Автентифікація з ключами безпеки була вимкнена для вашого облікового запису. + extra: Тепер можна ввійти використовуючи лише токен, згенерований застосунком TOTP. subject: 'Mastodon: Аутентифікація за допомогою ключів безпеки вимкнена' title: Ключі безпеки вимкнуто webauthn_enabled: + explanation: Вхід за допомогою ключів безпеки ввімкнено для вашого облікового запису. + extra: Тепер ви можете використовувати ваш ключ безпеки для входу. subject: 'Mastodon: Авторизація ключа безпеки увімкнена' title: Ключі безпеки увімкнено omniauth_callbacks: diff --git a/config/locales/doorkeeper.be.yml b/config/locales/doorkeeper.be.yml index 4524dd707e..748cbeafa1 100644 --- a/config/locales/doorkeeper.be.yml +++ b/config/locales/doorkeeper.be.yml @@ -132,7 +132,7 @@ be: follow: Падпіскі, ігнараванне і блакіроўка follows: Падпіскі lists: Спісы - media: Мультымедыйныя ўкладанні + media: Мультымедыйныя далучэнні mutes: Ігнараваныя notifications: Апавяшчэнні push: Push-апавяшчэнні diff --git a/config/locales/doorkeeper.ia.yml b/config/locales/doorkeeper.ia.yml index d689354f61..e7e6f03cdb 100644 --- a/config/locales/doorkeeper.ia.yml +++ b/config/locales/doorkeeper.ia.yml @@ -34,6 +34,7 @@ ia: confirmations: revoke: Es tu secur? index: + never_used: Nunquam usate scopes: Permissiones title: Tu applicationes autorisate flash: @@ -53,6 +54,7 @@ ia: conversations: Conversationes favourites: Favoritos lists: Listas + mutes: Silentiates notifications: Notificationes push: Notificationes push search: Cercar @@ -63,15 +65,23 @@ ia: applications: Applicationes oauth2_provider: Fornitor OAuth2 scopes: + admin:read: leger tote le datos in le servitor + read: leger tote le datos de tu conto + read:accounts: vider informationes de conto read:favourites: vider tu favoritos + read:filters: vider tu filtros read:lists: vider tu listas read:notifications: vider tu notificationes + read:reports: vider tu reportos read:statuses: vider tote le messages write:accounts: modificar tu profilo write:blocks: blocar contos e dominios + write:conversations: silentiar e deler conversationes write:favourites: messages favorite write:filters: crear filtros + write:follows: sequer personas write:lists: crear listas write:media: incargar files de medios + write:mutes: silentiar personas e conversationes write:notifications: rader tu notificationes write:statuses: publicar messages diff --git a/config/locales/doorkeeper.lad.yml b/config/locales/doorkeeper.lad.yml index f52bac39c2..b2c140b9c2 100644 --- a/config/locales/doorkeeper.lad.yml +++ b/config/locales/doorkeeper.lad.yml @@ -130,7 +130,7 @@ lad: favourites: Favoritos filters: Filtros follow: Segimientos, silensiasyones i blokos - follows: Segimientos + follows: Segimyentos lists: Listas media: Aneksos de multimedia mutes: Silensiasyones diff --git a/config/locales/doorkeeper.tr.yml b/config/locales/doorkeeper.tr.yml index fce8c646e8..2dde5f6322 100644 --- a/config/locales/doorkeeper.tr.yml +++ b/config/locales/doorkeeper.tr.yml @@ -15,7 +15,7 @@ tr: fragment_present: parça içeremez. invalid_uri: geçerli bir URL olmalıdır. relative_uri: mutlaka bir URL olmalıdır. - secured_uri: HTTPS/SSL URL olması gerekir. + secured_uri: HTTPS/SSL URI olması gerekir. doorkeeper: applications: buttons: @@ -84,7 +84,7 @@ tr: credential_flow_not_configured: Kaynak Sahibi Parolası Kimlik Bilgileri akışı Doorkeeper.configure.resource_owner_from_credentials 'ın yapılandırılmamış olması nedeniyle başarısız oldu. invalid_client: İstemcinin kimlik doğrulaması bilinmeyen istemci, istemci kimlik doğrulamasının dahil olmaması veya desteklenmeyen kimlik doğrulama yöntemi nedeniyle başarısız oldu. invalid_grant: Sağlanan yetkilendirme izni geçersiz, süresi dolmuş, iptal edilmiş, yetkilendirme isteğinde kullanılan yönlendirme URL'siyle eşleşmiyor veya başka bir istemciye verilmiş. - invalid_redirect_uri: Dahil edilmiş yönlendirme URL'si geçersiz. + invalid_redirect_uri: Dahil edilmiş yönlendirme uri'si geçersiz. invalid_request: missing_param: 'Gerekli parametre eksik: %{value}.' request_not_authorized: İsteğin yetkilendirilmesi gerekiyor. İsteği yetkilendirmek için gereken parametre eksik veya geçersiz. @@ -128,7 +128,7 @@ tr: conversations: Sohbetler crypto: Uçtan uca şifreleme favourites: Favoriler - filters: Filtreler + filters: Süzgeçler follow: Takipler, Sessizler ve Engeller follows: Takip edilenler lists: Listeler @@ -161,7 +161,7 @@ tr: admin:write:domain_allows: alan adı izinleri için denetleme eylemleri gerçekleştirin admin:write:domain_blocks: alan adı engellemeleri için denetleme eylemleri gerçekleştirin admin:write:email_domain_blocks: e-posta alan adı engellemeleri için denetleme eylemleri gerçekleştirin - admin:write:ip_blocks: IP engellemeleri için denetleme eylemleri gerçekleştirin + admin:write:ip_blocks: IP blokları üzerinde moderasyon eylemleri gerçekleştir admin:write:reports: raporlarda denetleme eylemleri gerçekleştirin crypto: uçtan uca şifreleme kullan follow: hesap ilişkilerini değiştirin @@ -171,7 +171,7 @@ tr: read:blocks: engellemelerinizi görün read:bookmarks: yer imlerinizi görün read:favourites: favorilerinizi görün - read:filters: filtrelerinizi görün + read:filters: süzgeçlerinizi görün read:follows: takip ettiklerinizi görün read:lists: listelerinizi görün read:mutes: sessize aldıklarınızı görün diff --git a/config/locales/en-GB.yml b/config/locales/en-GB.yml index b11c6de11f..d4840c84e9 100644 --- a/config/locales/en-GB.yml +++ b/config/locales/en-GB.yml @@ -425,6 +425,7 @@ en-GB: view: View domain block email_domain_blocks: add_new: Add new + allow_registrations_with_approval: Allow registrations with approval attempts_over_week: one: "%{count} attempt over the last week" other: "%{count} sign-up attempts over the last week" @@ -1545,6 +1546,9 @@ en-GB: errors: limit_reached: Limit of different reactions reached unrecognized_emoji: is not a recognised emoji + redirects: + prompt: If you trust this link, click it to continue. + title: You are leaving %{instance}. relationships: activity: Account activity confirm_follow_selected_followers: Are you sure you want to follow selected followers? @@ -1607,6 +1611,7 @@ en-GB: unknown_browser: Unknown Browser weibo: Weibo current_session: Current session + date: Date description: "%{browser} on %{platform}" explanation: These are the web browsers currently logged in to your Mastodon account. ip: IP @@ -1773,16 +1778,27 @@ en-GB: webauthn: Security keys user_mailer: appeal_approved: + action: Account Settings explanation: The appeal of the strike against your account on %{strike_date} that you submitted on %{appeal_date} has been approved. Your account is once again in good standing. subject: Your appeal from %{date} has been approved + subtitle: Your account is once again in good standing. title: Appeal approved appeal_rejected: explanation: The appeal of the strike against your account on %{strike_date} that you submitted on %{appeal_date} has been rejected. subject: Your appeal from %{date} has been rejected + subtitle: Your appeal has been rejected. title: Appeal rejected backup_ready: + explanation: You requested a full backup of your Mastodon account. + extra: It's now ready for download! subject: Your archive is ready for download title: Archive takeout + failed_2fa: + details: 'Here are details of the sign-in attempt:' + explanation: Someone has tried to sign in to your account but provided an invalid second authentication factor. + further_actions_html: If this wasn't you, we recommend that you %{action} immediately as it may be compromised. + subject: Second factor authentication failure + title: Failed second factor authentication suspicious_sign_in: change_password: change your password details: 'Here are details of the login:' @@ -1836,6 +1852,7 @@ en-GB: go_to_sso_account_settings: Go to your identity provider's account settings invalid_otp_token: Invalid two-factor code otp_lost_help_html: If you lost access to both, you may get in touch with %{email} + rate_limited: Too many authentication attempts, try again later. seamless_external_login: You are logged in via an external service, so password and e-mail settings are not available. signed_in_as: 'Logged in as:' verification: diff --git a/config/locales/es-MX.yml b/config/locales/es-MX.yml index 4d228e98d4..a8b918a8fe 100644 --- a/config/locales/es-MX.yml +++ b/config/locales/es-MX.yml @@ -1548,7 +1548,7 @@ es-MX: unrecognized_emoji: no es un emoji conocido redirects: prompt: Si confías en este enlace, púlsalo para continuar. - title: Vas a salir de %{instance}. + title: Estás saliendo de %{instance}. relationships: activity: Actividad de la cuenta confirm_follow_selected_followers: "¿Estás seguro de que quieres seguir a las cuentas seleccionadas?" diff --git a/config/locales/et.yml b/config/locales/et.yml index f82ee6cb8f..c21ea0b971 100644 --- a/config/locales/et.yml +++ b/config/locales/et.yml @@ -1546,6 +1546,9 @@ et: errors: limit_reached: Jõutud on erinevate reaktsioonide limiidini unrecognized_emoji: ei ole tuntud emotikoon + redirects: + prompt: Kui te usaldate seda linki, klõpsake sellele, et jätkata. + title: Te lahkute %{instance}. relationships: activity: Konto tegevus confirm_follow_selected_followers: Oled kindel, et soovid jälgida valitud jälgijaid? diff --git a/config/locales/eu.yml b/config/locales/eu.yml index 444d0e2c5f..7acccea006 100644 --- a/config/locales/eu.yml +++ b/config/locales/eu.yml @@ -336,7 +336,7 @@ eu: not_permitted: Ez daukazu ekintza hau burutzeko baimenik overwrite: Gainidatzi shortcode: Laster-kodea - shortcode_hint: Gutxienez 2 karaktere, alfanumerikoak eta azpimarra besterik ez + shortcode_hint: Gutxienez 2 karaktere, alfanumerikoak eta azpimarrak soilik title: Emoji pertsonalak uncategorized: Kategoriarik gabe unlist: Kendu zerrendatik @@ -1703,8 +1703,8 @@ eu: title: '%{name}: "%{quote}"' visibilities: direct: Zuzena - private: Jarraitzaileak besterik ez - private_long: Erakutsi jarraitzaileei besterik ez + private: Jarraitzaileak soilik + private_long: Erakutsi jarraitzaileei soilik public: Publikoa public_long: Edonork ikusi dezake unlisted: Zerrendatu gabea diff --git a/config/locales/fi.yml b/config/locales/fi.yml index 856532f8f1..15f448bc91 100644 --- a/config/locales/fi.yml +++ b/config/locales/fi.yml @@ -387,7 +387,7 @@ fi: cancel: Peruuta confirm: Jäädytä permanent_action: Jäädytyksen kumoaminen ei palauta mitään tietoja tai suhteita. - preamble_html: Olet jäädyttämässä verkkotunnuksen %{domain} ja sen aliverkkotunnukset. + preamble_html: Olet jäädyttämässä verkkotunnuksen %{domain} aliverkkotunnuksineen. remove_all_data: Tämä toiminto poistaa palvelimeltasi kaiken sisällön, median ja profiilitiedot tämän palvelun tileiltä. stop_communication: Palvelimesi lopettaa viestinnän näiden palvelinten kanssa. title: Vahvista verkkotunnuksen %{domain} esto @@ -831,7 +831,7 @@ fi: suspend: "%{name} jäädytti käyttäjän %{target} tilin" appeal_approved: Valitti appeal_pending: Valitus vireillä - appeal_rejected: Muutoksenhaku hylättiin + appeal_rejected: Vetoomus hylättiin system_checks: database_schema_check: message_html: Tietokannan siirto on vireillä. Suorita ne varmistaaksesi, että sovellus toimii odotetulla tavalla @@ -1043,10 +1043,10 @@ fi: confirmations: awaiting_review: Sähköpostiosoitteesi on vahvistettu! Seuraavaksi palvelimen %{domain} ylläpito tarkistaa rekisteröitymisesi, ja saat lopuksi ilmoituksen sähköpostitse, jos tilisi hyväksytään! awaiting_review_title: Rekisteröitymisesi on tarkistettavana - clicking_this_link: tästä linkistä + clicking_this_link: napsauttaa tätä linkkiä login_link: kirjautumalla sisään proceed_to_login_html: Voit nyt jatkaa %{login_link}. - redirect_to_app_html: Sinun olisi pitänyt ohjautua sovellukseen %{app_name}. Jos näin ei tapahtunut, yritä avata se %{clicking_this_link} tai palaa sovellukseen manuaalisesti. + redirect_to_app_html: Sinun olisi pitänyt ohjautua sovellukseen %{app_name}. Jos näin ei tapahtunut, voit %{clicking_this_link} tai palata sovellukseen käsikäyttöisesti. registration_complete: Rekisteröitymisesi palvelimelle %{domain} on nyt valmis! welcome_title: Tervetuloa, %{name}! wrong_email_hint: Jos sähköpostiosoite ei ole oikein, voit muuttaa sen tilin asetuksista. @@ -1547,7 +1547,7 @@ fi: limit_reached: Erilaisten reaktioiden raja saavutettu unrecognized_emoji: ei ole tunnistettu emoji redirects: - prompt: Jos luotat tähän linkkiin, jatka napsauttamalla. + prompt: Mikäli luotat linkkiin, jatka napsauttaen sitä. title: Olet poistumassa palvelimelta %{instance}. relationships: activity: Tilin aktiivisuus @@ -1560,7 +1560,7 @@ fi: followers: Seuraajat following: Seuratut invited: Kutsutut - last_active: Viimeksi aktiivinen + last_active: Viimeksi aktiiviset most_recent: Viimeisimmät moved: Muuttaneet mutual: Seuraatte toisianne @@ -1794,11 +1794,11 @@ fi: subject: Arkisto on valmiina ladattavaksi title: Arkiston tallennus failed_2fa: - details: 'Tässä on tietoja kirjautumisyrityksestä:' - explanation: Joku on yrittänyt kirjautua tilillesi mutta on antanut virheellisen toisen vaiheen todennustekijän. + details: 'Sisäänkirjautumispyrkimyksen yksityiskohtaiset tiedot:' + explanation: Joku on yrittänyt kirjautua tilillesi antaen väärän toisen todennustunnisteen. further_actions_html: Jos se et ollut sinä, suosittelemme, että %{action} välittömästi, sillä se on saattanut vaarantua. subject: Kaksivaiheisen todennuksen virhe - title: Epäonnistunut kaksivaiheinen todennus + title: Kaksivaihekirjautumisen toinen vaihe epäonnistui suspicious_sign_in: change_password: vaihda salasanasi details: 'Tässä on tiedot kirjautumisesta:' @@ -1852,7 +1852,7 @@ fi: go_to_sso_account_settings: Avaa identiteettitarjoajasi tiliasetukset invalid_otp_token: Virheellinen kaksivaiheisen todentamisen koodi otp_lost_help_html: Jos sinulla ei ole pääsyä kumpaankaan, voit ottaa yhteyden osoitteeseen %{email} - rate_limited: Liian monta todennusyritystä. Yritä myöhemmin uudelleen. + rate_limited: Liian monta todennusyritystä – yritä uudelleen myöhemmin. seamless_external_login: Olet kirjautunut ulkoisen palvelun kautta, joten salasana- ja sähköpostiasetukset eivät ole käytettävissä. signed_in_as: 'Kirjautunut tilillä:' verification: diff --git a/config/locales/fy.yml b/config/locales/fy.yml index c59ad72725..2cbb69010d 100644 --- a/config/locales/fy.yml +++ b/config/locales/fy.yml @@ -1546,6 +1546,9 @@ fy: errors: limit_reached: Limyt fan ferskate emoji-reaksjes berikt unrecognized_emoji: is gjin besteande emoji-reaksje + redirects: + prompt: As jo dizze keppeling fertrouwe, klik der dan op om troch te gean. + title: Jo ferlitte %{instance}. relationships: activity: Accountaktiviteit confirm_follow_selected_followers: Binne jo wis dat jo de selektearre folgers folgje wolle? diff --git a/config/locales/gd.yml b/config/locales/gd.yml index 521f4fd60d..d3dab8273d 100644 --- a/config/locales/gd.yml +++ b/config/locales/gd.yml @@ -439,6 +439,7 @@ gd: view: Seall bacadh na h-àrainne email_domain_blocks: add_new: Cuir tè ùr ris + allow_registrations_with_approval: Ceadaich clàradh le aontachadh attempts_over_week: few: "%{count} oidhirpean clàraidh rè na seachdain seo chaidh" one: "%{count} oidhirp clàraidh rè na seachdain seo chaidh" diff --git a/config/locales/hu.yml b/config/locales/hu.yml index 545da69d9c..34ae9a21c8 100644 --- a/config/locales/hu.yml +++ b/config/locales/hu.yml @@ -1548,7 +1548,7 @@ hu: unrecognized_emoji: nem ismert emodzsi redirects: prompt: Ha megbízol ebben a hivatkozásban, kattints rá a folytatáshoz. - title: Épp elhagyni készülöd a %{instance} kiszolgálót. + title: Elhagyod a(z) %{instance} kiszolgálót. relationships: activity: Fiók aktivitás confirm_follow_selected_followers: Biztos, hogy követni akarod a kiválasztott követőket? diff --git a/config/locales/ia.yml b/config/locales/ia.yml index 48a802a2cd..bf7da9a314 100644 --- a/config/locales/ia.yml +++ b/config/locales/ia.yml @@ -33,11 +33,27 @@ ia: username: Nomine de usator action_logs: action_types: + create_announcement: Crear annuncio + destroy_ip_block: Deler le regula IP + destroy_status: Deler le message + destroy_unavailable_domain: Deler le dominio non disponibile + disable_user: Disactivar le usator + enable_user: Activar le usator reset_password_user: Reinitialisar contrasigno + update_announcement: Actualisar annuncio + update_custom_emoji: Actualisar emoji personalisate + actions: + change_email_user_html: "%{name} cambiava le adresse de e-mail address del usator %{target}" + create_announcement_html: "%{name} creava un nove annuncio %{target}" announcements: + edit: + title: Modificar annuncio + empty: Necun annuncios trovate. new: create: Crear annuncio title: Nove annuncio + publish: Publicar + published_msg: Annuncio publicate con successo! title: Annuncios custom_emojis: by_domain: Dominio @@ -46,9 +62,16 @@ ia: delete: Deler disable: Disactivar disabled: Disactivate + enable: Activar + enabled: Activate + enabled_msg: Emoji activate con successo + new: + title: Adder nove emoji personalisate dashboard: active_users: usatores active + media_storage: Immagazinage de medios new_users: nove usatores + opened_reports: reportos aperte website: Sito web domain_allows: add_new: Permitter federation con dominio @@ -58,9 +81,14 @@ ia: domain: Dominio export: Exportar import: Importar + private_comment: Commento private + public_comment: Commento public email_domain_blocks: add_new: Adder nove delete: Deler + domain: Dominio + new: + create: Adder un dominio export_domain_allows: no_file: Necun file seligite follow_recommendations: @@ -79,6 +107,7 @@ ia: filter: available: Disponibile ip_blocks: + add_new: Crear regula delete: Deler expires_in: '1209600': 2 septimanas @@ -95,8 +124,118 @@ ia: enable: Activar enabled: Activate reports: + add_to_report: Adder plus al reporto are_you_sure: Es tu secur? cancel: Cancellar + delete_and_resolve: Deler le messages + notes: + delete: Deler + skip_to_actions: Saltar al actiones + status: Stato + updated_at: Actualisate + view_profile: Vider profilo + roles: + everyone: Permissiones predefinite + privileges: + manage_users: Gerer usatores + rules: + delete: Deler + settings: + about: + title: A proposito de + appearance: + preamble: Personalisar le interfacie web de Mastodon. + title: Apparentia + discovery: + profile_directory: Directorio de profilos + public_timelines: Chronologias public + trends: Tendentias + title: Parametros de servitor + site_uploads: + delete: Deler file incargate + statuses: + language: Lingua + metadata: Metadatos + open: Aperir message + original_status: Message original + title: Messages del conto + trending: Tendentias + visibility: Visibilitate + strikes: + actions: + none: "%{name} ha inviate un advertimento a %{target}" + system_checks: + rules_check: + action: Gerer le regulas del servitor + software_version_critical_check: + action: Vider le actualisationes disponibile + software_version_patch_check: + action: Vider le actualisationes disponibile + upload_check_privacy_error: + action: Verifica hic pro plus de information + edit_profile: + other: Alteres + existing_username_validator: + not_found_multiple: non poteva trovar %{usernames} + exports: + archive_takeout: + date: Data + download: Discargar tu archivo + size: Dimension + blocks: Tu ha blocate + bookmarks: Marcapaginas + csv: CSV + mutes: Tu ha silentiate + storage: Immagazinage de medios + featured_tags: + add_new: Adder nove + filters: + contexts: + account: Profilos + home: Pagina de initio e listas + notifications: Notificationes + public: Chronologias public + thread: Conversationes + edit: + add_keyword: Adder parola clave + keywords: Parolas clave + statuses: Messages individual + title: Modificar filtro + index: + delete: Deler + generic: + all: Toto + cancel: Cancellar + changes_saved_msg: Cambios salveguardate con successo! + confirm: Confirmar + copy: Copiar + delete: Deler + order_by: Ordinar per + save_changes: Salvar le cambios + today: hodie + imports: + errors: + empty: File CSV vacue + too_large: Le file es troppo longe + failures: Fallimentos + status: Stato + types: + lists: Listas + invites: + expires_in: + '1800': 30 minutas + '21600': 6 horas + '3600': 1 hora + '43200': 12 horas + '604800': 1 septimana + '86400': 1 die + expires_in_prompt: Nunquam + login_activities: + authentication_methods: + password: contrasigno + migrations: + errors: + not_found: non poterea esser trovate statuses_cleanup: min_age: '1209600': 2 septimanas diff --git a/config/locales/ko.yml b/config/locales/ko.yml index 9f4f1343c7..2e354828bd 100644 --- a/config/locales/ko.yml +++ b/config/locales/ko.yml @@ -525,7 +525,7 @@ ko: total_followed_by_us: 우리가 한 팔로우 total_reported: 이들에 대한 신고 total_storage: 미디어 첨부 - totals_time_period_hint_html: 아래에 표시된 총계에는 모든 시간에 대한 데이터가 포함됩니다. + totals_time_period_hint_html: 아래에 표시된 총계는 역대 데이터에 대한 것입니다. unknown_instance: 현재 이 서버에서 해당 도메인에 대한 기록은 없습니다. invites: deactivate_all: 전부 비활성화 diff --git a/config/locales/lad.yml b/config/locales/lad.yml index 02308cf2f0..d4f772095e 100644 --- a/config/locales/lad.yml +++ b/config/locales/lad.yml @@ -18,6 +18,9 @@ lad: nothing_here: No ay niente aki! pin_errors: following: Deves estar sigiendo a la persona a la ke keres achetar + posts: + one: Publikasyon + other: Publikasyones posts_tab_heading: Publikasyones admin: account_actions: @@ -82,7 +85,7 @@ lad: title: Lokalizasyon login_status: Estado de koneksyon kon kuento media_attachments: Aneksos de multimedia - memorialize: Konvirtir en memorial + memorialize: Konvirte en memorial memorialized: Kuento komemorativo memorialized_msg: "%{username} se konvirtido kon sukseso en un kuento komemorativo" moderation: @@ -106,14 +109,14 @@ lad: previous_strikes_description_html: one: Este kuento tiene un amonestamiento. other: Este kuento tiene %{count} amonestamientos. - promote: Promosyonar + promote: Promosyona protocol: Protokol public: Publiko push_subscription_expires: Ekspirasyon del abonamiento PuSH - redownload: Arefreskar profil + redownload: Arefreska profil redownloaded_msg: Se aktualizo djustamente el profil de %{username} dizde el orijin reject: Refuza - rejected_msg: La solisitasyon de enrejistrasyon de %{username} a sido refuzada kon sukseso + rejected_msg: La solisitasyon de enrejistrasyon de %{username} tyene sido refuzada kon sukseso remote_suspension_irreversible: Los datos de este kuento fueron irreversivlemente supremidos. remote_suspension_reversible_hint_html: El kuento fue suspendido en este sirvidor i los datos seran totalmente supremidos el %{date}. Asta estonses el sirvidor remoto puede restaurar este kuento sin dingun efekto negativo. Si keres supremir todos los datos del kuento pishin, puedes fazerlo a kontinuasyon. remove_avatar: Efasa imaje de profil @@ -288,7 +291,7 @@ lad: empty: No se toparon rejistros. filter_by_action: Filtra por aksion filter_by_user: Filtra por utilizador - title: Log de revizyon + title: Defter de revizyon announcements: destroyed_msg: Pregon supremido kon sukseso! edit: @@ -303,12 +306,12 @@ lad: scheduled_for: Programado para %{time} scheduled_msg: Pregon programado para su publikasyon! title: Pregones - unpublish: Retirar publikasyon + unpublish: Retira publikasyon unpublished_msg: Pregon retirado kon sukseso! updated_msg: Pregon aktualizado kon sukseso! critical_update_pending: Aktualizasyon kritika esta asperando custom_emojis: - assign_category: Asinyar kategoria + assign_category: Asinya kategoria by_domain: Domeno copied_msg: Kopia lokala del emoji kriyada kon sukseso copy: Kopia @@ -328,7 +331,7 @@ lad: list: Lista listed: Listados new: - title: Adjustar muevo emoji personalizado + title: Adjusta muevo emoji personalizado no_emoji_selected: No se troko dingun emoji porke no eskojites dinguno not_permitted: No tienes permiso para realizar esta aksyon overwrite: Sobreskrive @@ -506,8 +509,8 @@ lad: all: Todos clear: Alimpiar yerros de entrega failing: Fayando - restart: Reinisyar entrega - stop: Detener entrega + restart: Reinisya entrega + stop: Deten entrega unavailable: No desponivle delivery_available: Entrega desponivle delivery_error_days: Diyas de yerro de entrega @@ -632,7 +635,7 @@ lad: reported_by: Raportado por resolved: Rezolvido resolved_msg: Tienes rezolvido la denunsia djustamente! - skip_to_actions: Ir direktamente a las aksyones + skip_to_actions: Va direktamente a las aksyones status: Estado statuses: Kontenido raportado statuses_description_html: El kontenido ofensivo se sitara en la komunikasyon kon el kuento raportado @@ -643,12 +646,12 @@ lad: silence_html: 'Vas limitar el kuento de @%{acct}''''. Esto va:' suspend_html: 'Vas suspender el kuento de @%{acct}''''. Esto va:' actions: - delete_html: Kitar las publikasyones ofensivas - mark_as_sensitive_html: Markar los multimedios de la publikasyon komo sensivles - silence_html: Severamente limitar la vizivilita de @%{acct}, fazendo su profil i kontenido vizivles solo para las personas ke ya lo sigen o manualmente bushkan su profil - suspend_html: Suspender @%{acct}, faziendo su profil i kontenido inaksesivle i no disponivle para interaksiones - close_report: 'Markar raporto #%{id} komo rezolvido' - close_reports_html: Markar todos los raportos kontra @%{acct} komo rezolvidos + delete_html: Kita las publikasyones ofensivas + mark_as_sensitive_html: Marka los multimedios de la publikasyon komo sensivles + silence_html: Severamente limita la vizivilita de @%{acct}, fazendo su profil i kontenido vizivles solo para las personas ke ya lo sigen o manualmente bushkan su profil + suspend_html: Suspende @%{acct}, faziendo su profil i kontenido inaksesivle i no disponivle para interaksiones + close_report: 'Marka raporto #%{id} komo rezolvido' + close_reports_html: Marka todos los raportos kontra @%{acct} komo rezolvidos delete_data_html: Efasa el profil i kontenido de @%{acct} en 30 dias si no sea desuspendido en akel tiempo preview_preamble_html: "@%{acct} resivira una avertensya komo esta:" record_strike_html: Enrejistra un amonestamiento kontra @%{acct} para ke te ayude eskalar las violasyones de reglas de este kuento en el avenir @@ -656,7 +659,7 @@ lad: warning_placeholder: Adisionalas, opsionalas razones la aksyon de moderasyon. target_origin: Orijin del kuento raportado title: Raportos - unassign: Dezasinyar + unassign: Dezasinya unknown_action_msg: 'Aksyon no konesida: %{action}' unresolved: No rezolvido updated_at: Aktualizado @@ -742,6 +745,7 @@ lad: preamble: La marka de tu sirvidor lo desferensia de otros sirvidores de la red. Esta enformasyon puede amostrarse por una varieta de entornos, komo en la enterfaz web de Mastodon, en aplikasyones nativas, en previsualizasiones de atadijos en otros sitios internetikos i en aplikasyones de mesajes, etc. Por esta razon, es mijor mantener esta enformasyon klara, breve i konsiza. title: Marka captcha_enabled: + desc_html: Esto se baza en eskriptos eksternos de hCaptcha, ke pueden ser una influensya negra a la sigurita i privasita. Ademas, esto puede rezultar en un proseso de enrejistrasyon signifikativamente manko aksesivle para algunas personas (espesyalmente diskapasitadas). Por estas razones, por favor, konsidera otras alternativas komo rejistrasyon por aprovasyon manuala o kon envitasyon. title: Solisita ke los muevos utilizadores rezolven un CAPTCHA para konfirmar su konto content_retention: preamble: Kontrola komo el kontenido jenerado por el utilizador se magazina en Mastodon. @@ -771,6 +775,8 @@ lad: none: Permete a los utilizadores trokar la konfigurasyon del sitio open: Kualkiera puede enrejistrarse security: + authorized_fetch: Rekere autentifikasyon de sirvidores federados + authorized_fetch_hint: Rekerir autentifikasyon de sirvidores federados permite un forsamyento mas estrikto de los blokos a nivel de utilizador i a nivel de sirvidor. Malgrado esto, el koste de esto es una penalizasyon de efisyensya, reduksyon del alkanse de tus repuestas i puede introduzir problemas de kompatibilita kon algunos sirvisyos federados. Ademas, esto no impidira ke aktores dedikados obtengan tus kuentos publikos i publikasyones publikas. authorized_fetch_overridden_hint: Agora no puedes trokar esta konfigurasyon dkee esta sovreeskrita por una variable de entorno. federation_authentication: Forzamyento de autentifikasyon para la federasyon title: Konfigurasyon del sirvidor @@ -779,6 +785,7 @@ lad: destroyed_msg: Dosya supremida kon sukseso! software_updates: critical_update: Kritiko – por favor aktualiza pishin + description: Rekomendamos ke mantengas aktualizada tu enstalasyon de Mastodon para benefisyar de las muevas koreksyones y funksyones. Ademas, a vezes es kritiko aktualizar Mastodon punktualmente para evitar problemas de sigurita. Por estas razones, Mastodon komprova si ay aktualizasyones kada 30 minutos, i te avizara de akodro a tus preferensyas de avizos por posta elektronika. documentation_link: Ambezate mas release_notes: Notas sovre la versyon title: Aktualizasyones desponivles @@ -832,11 +839,16 @@ lad: message_html: El klaster de Elasticsearch no es sano (estado kolorado), funksyones de bushkeda no estan disponivles elasticsearch_health_yellow: message_html: El klaster de Elasticsearch no es sano (estado amariyo), es posivle ke keras investigar la razon + elasticsearch_index_mismatch: + message_html: Las mapas de indeksos Elasticsearch estan dezaktualizadas. Por favor, uza tootctl search deploy --only=%{value} elasticsearch_preset: action: Ve dokumentasyon message_html: Tu klaster de Elasticsearch tiene mas ke un nodo, ama Mastodon no esta konfigurado para uzarlos. elasticsearch_preset_single_node: action: Ve dokumentasyon + message_html: Tu klaster de Elasticsearch solo tyene un nodo, ES_PRESET deve estableserse a single_node_cluster. + elasticsearch_reset_chewy: + message_html: Tu indekso del sistema Elasticsearch esta dezaktualizado por un trokamyento de konfigurasyon. Por favor uza tootctl search deploy --reset-chewy para aktualizarlo. elasticsearch_running_check: message_html: No se pudo konektar a Elasticsearch. Por favor, averigua ke esta egzekutandose, o dezaktiva la bushkeda de teksto kompleto elasticsearch_version_check: @@ -1089,6 +1101,7 @@ lad: preamble_html: Konektate kon tus kredensiales de %{domain}. Si tu kuento esta balabayado en otruno servidor, no puedras konektarte aki. title: Konektate kon %{domain} sign_up: + manual_review: Las enrejistrasyones en %{domain} pasan por la revizyon manuala de muestros moderadores. Para ayudarmos a prosesar tu enrejistrasyon, eskrive un poko sovre ti i por ke keres un kuento en %{domain}. preamble: Kon un kuento en este sirvidor de Mastodon, podras segir a kualkier otra persona en la red, endependientemente del sirvidor en el ke se tope. title: Kriya kuento de Mastodon en %{domain}. status: @@ -1103,7 +1116,7 @@ lad: use_security_key: Uza la yave de sigurita challenge: confirm: Kontinua - hint_html: "Tip: No retornaremos a demandarte por el kod durante la sigiente ora." + hint_html: "Konsejo: No retornaremos a demandarte por el kod durante la sigiente ora." invalid_password: Kod inkorekto prompt: Konfirma kod para segir crypto: @@ -1179,6 +1192,7 @@ lad: invalid_domain: no es un nombre de domeno valido edit_profile: basic_information: Enformasyon bazika + hint_html: "Personaliza lo ke la djente ve en tu profil publiko i kon tus publikasyones. Es mas probavle ke otras personas te sigan i enteraktuen kontigo kuando kompletas tu profil i foto." other: Otros errors: '400': La solisitasyon ke enviates no fue valida o fue malformada. @@ -1258,9 +1272,16 @@ lad: batch: remove: Kita del filtro index: + hint: Este filtro se aplika a la seleksyon de publikasyones individualas independentemente de otros kriteryos. Puedes adjustar mas publikasyones a este filtro dizde la enterfaz de web. title: Publikasyones filtradas generic: all: Todos + all_items_on_page_selected_html: + one: "%{count} elemento en esta pajina esta eskojido." + other: Todos los %{count} elementos en esta pajina estan eskojidos. + all_matching_items_selected_html: + one: "%{count} elemento ke koenside con tu bushkeda esta eskojido." + other: Todos los %{count} elementos ke koensiden con tu bushkeda estan eskojidos. cancel: Anula changes_saved_msg: Trokamientos guadrados kon reusho! confirm: Konfirma @@ -1286,6 +1307,7 @@ lad: too_large: Dosya es mas grande failures: Yerros imported: Importado + mismatched_types_warning: Parese ke podrias eskojer el tipo inkorekto para este importo, por favor verifikalo de muevo. modes: merge: Une merge_long: Manten rejistros egzistentes i adjusta muevos @@ -1303,6 +1325,7 @@ lad: bookmarks_html: Estas a punto de adjustar asta %{total_items} publikasyones de %{filename} a tus markadores. domain_blocking_html: Estas a punto de blokar asta %{total_items} domenos de %{filename}. following_html: Estas a punto de segir asta %{total_items} kuentos de %{filename}. + lists_html: Estas a punto de adjustar %{total_items} kuentos dizde %{filename} a tus listas. Se kriyaran muevas listas si no ay listas para adjustarlas. muting_html: Estas a punto de silensyar asta %{total_items} kuentos de %{filename}. preface: Puedes importar siertos datos, komo todas las personas a las kualas estas sigiendo o blokando en tu kuento en esta instansya, dizde dosyas eksportadas de otra instansya. recent_imports: Importasyones resyentes @@ -1374,6 +1397,7 @@ lad: unsubscribe: action: Si, dezabona complete: Dezabonado + confirmation_html: Estas siguro de ke ya no keres risivir %{type} de Mastodon en %{domain} a tu posta elektronika %{email}? Syempre podras reabonarte dizde las opsyones de avizos por posta.. emails: notification_emails: favourite: avizos de favoritos por posta @@ -1381,6 +1405,8 @@ lad: follow_request: avizos de solisitasyones de segimyento por posta mention: avizos de enmentaduras por posta reblog: avizos de repartajasyones por posta + resubscribe_html: Si tyenes deabonado por yerro, puedes reabonar en tus opsyones de avizos por posta elektronika. + success_html: Ya no risiviras %{type} de Mastodon en %{domain} a tu posta en %{email}. title: Dezabona media_attachments: validations: @@ -1506,9 +1532,13 @@ lad: posting_defaults: Konfigurasyon predeterminada de publikasyones public_timelines: Linyas de tiempo publikas privacy: + hint_html: "Personaliza el diskuvrimyento de tu profil y tus publikasyones. En Mastodon tyenes distinktas funksyones ke te ayudaran a alkansar una audiensya mas ancha si las aktivas. Reviza estas opsyones por un momento para estar siguro ke kaven tus nesesidades." privacy: Privasita + privacy_hint_html: Kontrola kuanto keres revelar a otros. Las personas diskuvren profiles i aplikasyones interesantes navigando por los suivantes de otras personas i vyendo dizde ke aplikasyones publikan, ama puede ke preferas mantenerlo eskondido. reach: Alkanse + reach_hint_html: Kontrola si keres ke te diskuvren i sigen muevas personas. Keres ke tus publikasyones se amostren en la seksyon de Eksplorasyon? Keres que tu kuento este rekomendado a otras personas? Keres achetar otomatikamente a todos los muevos suivantes o tener kontrol sovre kada uno de eyos? search: Bushkeda + search_hint_html: Kontrola komo keres ke te topen. Keres ke otras personas te topan por lo ke tyenes publikado publikamente? Keres ke las personas de fuera de Mastodon topen tu profil al bushkar en la web? Por favor, akodrate de ke la ekskluzyon totala de todos los bushkadores no puede ser garantizada para enformasyon publika. title: Privasita i alkanse privacy_policy: title: Politika de privasita @@ -1555,6 +1585,7 @@ lad: over_total_limit: Tienes superado el limito de %{limit} publikasyones programadas too_soon: La data programada deve estar en el avenir self_destruct: + lead_html: Malorozamente, %{domain} va serrar permanentemente. Si teniyas un kuento ayi, ya no podras utilizarlo, ama ainda puedes solisitar una kopya de tus datos. title: Este sirvidor esta serrando sessions: activity: Ultima aktivita @@ -1728,6 +1759,7 @@ lad: with_time_zone: "%d de %b del %Y, %H:%M %Z" translation: errors: + quota_exceeded: La kuota de uzo del sirvisyo de traduksyon para todo el sirvidor tiene sido sovrepasada. too_many_requests: Ay demaziadas solisitudes de servisyo de traduksyon. two_factor_authentication: add: Adjusta @@ -1740,7 +1772,7 @@ lad: lost_recovery_codes: Los kodiches de rekuperasyon te permeten obtener akseso a tu kuento si piedres tu telefon. Si tienes pedrido tus kodiches de rekuperasyon, puedes redjenerarlos aki. Tus viejos kodiches de rekuperasyon se aran malatos. methods: Metodos de autentifikasyon de dos pasos otp: Aplikasyon de autentifikasyon - recovery_codes: Fazer kopias de sigurita de tus kodiches de rekuperasyon + recovery_codes: Faz kopias de sigurita de tus kodiches de rekuperasyon recovery_codes_regenerated: Kodiches de rekupersayon redjenerados kon sukseso recovery_instructions_html: Si piedres akseso a tu telefon, puedes uzar uno de los sigientes kodiches de rekuperasyon para obtener akseso a tu kuento. Mantenlos a salvo. Por enshemplo, puedes imprimirlos i guadrarlos kon otros dokumentos emportantes. webauthn: Yaves de sigurita @@ -1757,11 +1789,16 @@ lad: subtitle: Tu apelasyon fue refuzada. title: Apelasyon refuzada backup_ready: + explanation: Tienes solisitado una kopia de sigurita de tu kuento de Mastodon. extra: Agora esta pronto para abashar! subject: Tu dosya esta pronta para abashar title: Abasha dosya failed_2fa: details: 'Aki estan los peratim de las provas de koneksyon kon tu kuento:' + explanation: Algun ha intentado konektarte kon tu cuenta ama prokuro un sigundo paso de autentifikasyon invalido. + further_actions_html: Si no fuites tu, rekomendamos %{action} inmediatamente deke puede estar komprometido. + subject: Autentikasyon del sigundo paso sin sukseso + title: Autentifikasyon del sigundo paso no reushida suspicious_sign_in: change_password: troka tu kod details: 'Aki estan los peratim de la koneksyon kon tu kuento:' @@ -1819,7 +1856,10 @@ lad: seamless_external_login: Estas konektado por un servisyo eksterno i estonses la konfigurasyon de kod i konto de posta no estan disponivles. signed_in_as: 'Konektado komo:' verification: + extra_instructions_html: Konsejo: El atadijo en tu web puede ser invizivle. La parte importante es rel="me", ke evita la suplantasyon de identita en sitios kon kontenido jenerado por el utilizador. Puedes inkluzo uzar una etiketa atadijo en la kavesera de la pajina en vez de a, ama el HTML deve ser aksesivle sin exekutar JavaScript. here_is_how: Ansina es komo + hint_html: "La verifikasyon de identita en Mastodon es para todos. Bazado en estandardes abiertos, agora i para syempre. Todo lo ke nesesitas es un sitio web propio ke la gente rekonozka. Kuando adjustas un atadijo a este sitio web dizde tu profil, komprovaremos ke el sitio web se ata a tu profil i lo amostraremos vizualmente." + instructions_html: Kopia i apega este kodiche en el HTML de tu sitio web. Estonses, adjusta el adreso de tu sitio web en uno de los kutis adisyonales de tu profil dizde la seksyon "Edita profil" i guadra los trokamyentos. verification: Verifikasyon verified_links: Tus atadijos verifikados webauthn_credentials: diff --git a/config/locales/lt.yml b/config/locales/lt.yml index 1d159bf45a..f00cc97fbb 100644 --- a/config/locales/lt.yml +++ b/config/locales/lt.yml @@ -102,14 +102,27 @@ lt: public: Viešas push_subscription_expires: PuSH prenumeramivas pasibaigė redownload: Perkrauti profilį + rejected_msg: Sėkmingai patvirtinta %{username} registracijos paraiška + remote_suspension_irreversible: Šios paskyros duomenys negrįžtamai ištrinti. + remote_suspension_reversible_hint_html: Paskyra jų serveryje buvo sustabdyta, o duomenys bus visiškai pašalinti %{date}. Iki to laiko nuotolinis serveris gali atkurti šią paskyrą be jokių neigiamų pasekmių. Jei norite iš karto pašalinti visus paskyros duomenis, galite tai padaryti toliau. remove_avatar: Panaikinti profilio nuotrauką remove_header: Panaikinti antraštę + removed_header_msg: Sėkmingai pašalintas %{username} antraštės paveikslėlis resend_confirmation: already_confirmed: Šis vartotojas jau patvirtintas + send: Dar kartą išsiųsti patvirtinimo nuorodą + success: Patvirtinimo laiškas sėkmingai išsiųstas! reset: Iš naujo reset_password: Atkurti slaptažodį resubscribe: Per prenumeruoti + role: Vaidmuo search: Ieškoti + search_same_email_domain: Kiti tą patį el. pašto domeną turintys naudotojai + search_same_ip: Kiti tą patį IP turintys naudotojai + security: Apsauga + security_measures: + only_password: Tik slaptažodis + password_and_2fa: Slaptažodis ir 2FA sensitized: Pažymėti kaip jautrią informaciją shared_inbox_url: Bendroji gautųjų URL show: @@ -120,13 +133,21 @@ lt: statuses: Statusai subscribe: Prenumeruoti suspended: Užrakintas + suspension_irreversible: Šios paskyros duomenys negrįžtamai ištrinti. Galite atšaukti paskyros sustabdymą, kad ja būtų galima naudotis, tačiau nebus atkurti jokie anksčiau turėti duomenys. + suspension_reversible_hint_html: Paskyra sustabdyta, o duomenys bus visiškai pašalinti %{date}. Iki to laiko paskyrą galima atkurti be jokių neigiamų pasekmių. Jei norite iš karto pašalinti visus paskyros duomenis, galite tai padaryti toliau. title: Vartotojai + unblock_email: El. pašto adreso atblokavimas + unblocked_email_msg: Sėkmingai atblokuotas %{username} el. pašto adresas unconfirmed_email: Nepatvirtintas el pašto adresas undo_silenced: Atšaukti užtildymą undo_suspension: Atšaukti užrakinimą + unsilenced_msg: Sėkmingai panaikintas %{username} paskyros apribojimas unsubscribe: Nebeprenumeruoti + unsuspended_msg: Sėkmingai panaikintas %{username} paskyros apribojimas username: Slapyvardis + view_domain: Peržiūrėti domeno santrauką warn: Įspėti + whitelisted: Leidžiama federacijai action_logs: title: Audito žurnalas custom_emojis: diff --git a/config/locales/nl.yml b/config/locales/nl.yml index a3657890da..1c31ed9e2b 100644 --- a/config/locales/nl.yml +++ b/config/locales/nl.yml @@ -1794,10 +1794,10 @@ nl: subject: Jouw archief staat klaar om te worden gedownload title: Archief ophalen failed_2fa: - details: 'Hier zijn details van de aanmeldpoging:' + details: 'Hier zijn details van de inlogpoging:' explanation: Iemand heeft geprobeerd om in te loggen op jouw account maar heeft een ongeldige tweede verificatiefactor opgegeven. further_actions_html: Als jij dit niet was, raden we je aan om onmiddellijk %{action} aangezien het in gevaar kan zijn. - subject: Tweede factor authenticatiefout + subject: Tweestapsverificatiefout title: Tweestapsverificatie mislukt suspicious_sign_in: change_password: je wachtwoord te wijzigen diff --git a/config/locales/simple_form.af.yml b/config/locales/simple_form.af.yml index 6c87a7a636..a7c449f86d 100644 --- a/config/locales/simple_form.af.yml +++ b/config/locales/simple_form.af.yml @@ -14,6 +14,8 @@ af: labels: defaults: locale: Koppelvlaktaal + new_password: Newe wagwoord + password: Wagwoord featured_tag: name: Hutsetiket form_admin_settings: diff --git a/config/locales/simple_form.eu.yml b/config/locales/simple_form.eu.yml index 6f2bbfd969..ffd3081c93 100644 --- a/config/locales/simple_form.eu.yml +++ b/config/locales/simple_form.eu.yml @@ -44,7 +44,7 @@ eu: context: Iragazkia aplikatzeko testuinguru bat edo batzuk current_password: Segurtasunagatik sartu uneko kontuaren pasahitza current_username: Berresteko sartu uneko kontuaren erabiltzaile-izena - digest: Jarduerarik gabeko epe luze bat eta gero mezu pertsonalen bat jaso baduzu, besterik ez + digest: Jarduerarik gabeko epe luze bat eta gero mezu pertsonalen bat jaso baduzu soilik email: Baieztapen e-mail bat bidaliko zaizu header: PNG, GIF edo JPG. Gehienez %{size}. %{dimensions}px eskalara txikituko da inbox_url: Kopiatu erabili nahi duzun errelearen hasiera orriaren URLa @@ -126,7 +126,7 @@ eu: tag: name: Letrak maiuskula/minuskulara aldatu ditzakezu besterik ez, adibidez irakurterrazago egiteko user: - chosen_languages: Ezer markatzekotan, hautatutako hizkuntzetan dauden tootak besterik ez dira erakutsiko + chosen_languages: Markatzean, hautatutako hizkuntzetan dauden tutak besterik ez dira erakutsiko. role: Rolak erabiltzaileak dituen baimenak kontrolatzen ditu user_role: color: Rolarentzat erabiltzaile interfazean erabiliko den kolorea, formatu hamaseitarreko RGB bezala diff --git a/config/locales/simple_form.fi.yml b/config/locales/simple_form.fi.yml index 29f2398a90..d208feed6c 100644 --- a/config/locales/simple_form.fi.yml +++ b/config/locales/simple_form.fi.yml @@ -5,7 +5,7 @@ fi: account: discoverable: Julkisia julkaisujasi ja profiiliasi voidaan pitää esillä tai suositella Mastodonin eri alueilla ja profiiliasi voidaan ehdottaa toisille käyttäjille. display_name: Koko nimesi tai lempinimesi. - fields: Kotisivusi, pronominit, ikä, mitä ikinä haluat. + fields: Verkkosivustosi, pronominisi, ikäsi ja mitä ikinä haluatkaan ilmoittaa. indexable: Julkiset julkaisusi voivat näkyä hakutuloksissa Mastodonissa. Ihmiset, jotka ovat olleet vuorovaikutuksessa julkaisujesi kanssa, voivat etsiä niitä asetuksesta riippumatta. note: 'Voit @mainita muita käyttäjiä tai #aihetunnisteita.' show_collections: Käyttäjät voivat selata seurattujasi ja seuraajiasi. Käyttäjät, joita seuraat, näkevät joka tapauksessa, että seuraat heitä. @@ -55,14 +55,14 @@ fi: scopes: Mihin sovellusliittymiin sovellus pääsee käsiksi. Jos valitset ylätason laajuuden, sinun ei tarvitse valita yksittäisiä. setting_aggregate_reblogs: Älä näytä uusia tehostuksia julkaisuille, joita on äskettäin tehostettu (koskee vain juuri vastaanotettuja tehostuksia) setting_always_send_emails: Yleensä sähköposti-ilmoituksia ei lähetetä, kun käytät Mastodonia aktiivisesti - setting_default_sensitive: Arkaluonteinen media on oletuksena piilotettu, ja se voidaan näyttää yhdellä napsautuksella + setting_default_sensitive: Arkaluonteinen media piilotetaan oletusarvoisesti, ja se voidaan näyttää yhdellä napsautuksella setting_display_media_default: Piilota arkaluonteiseksi merkitty media - setting_display_media_hide_all: Piilota media aina - setting_display_media_show_all: Näytä media aina + setting_display_media_hide_all: Piilota mediasisältö aina + setting_display_media_show_all: Näytä mediasisältö aina setting_use_blurhash: Liukuvärit perustuvat piilotettujen kuvien väreihin mutta sumentavat yksityiskohdat setting_use_pending_items: Piilota aikajanan päivitykset napsautuksen taakse syötteen automaattisen vierityksen sijaan username: Voit käyttää kirjaimia, numeroita ja alaviivoja - whole_word: Kun avainsana tai -fraasi on kokonaan aakkosnumeerinen, se on voimassa vain, jos se vastaa koko sanaa + whole_word: Kun avainsana tai -fraasi on täysin aakkosnumeerinen, suodatin aktivoituu vain sen täysvastineille domain_allow: domain: Tämä verkkotunnus voi noutaa tietoja tältä palvelimelta ja sieltä saapuvat tiedot käsitellään ja tallennetaan email_domain_block: @@ -78,7 +78,7 @@ fi: form_admin_settings: activity_api_enabled: Paikallisesti julkaistujen julkaisujen, aktiivisten käyttäjien ja rekisteröitymisten viikoittainen määrä backups_retention_period: Säilytä luodut arkistot määritetyn määrän päiviä. - bootstrap_timeline_accounts: Nämä tilit kiinnitetään uusien käyttäjien seuraamissuositusten yläpuolelle. + bootstrap_timeline_accounts: Nämä tilit kiinnitetään uusien käyttäjien seuraamissuosituslistojen alkuun. closed_registrations_message: Näkyy, kun rekisteröityminen on suljettu content_cache_retention_period: Kaikki julkaisut ja tehostukset muilta palvelimilta poistetaan, kun määritelty määrä päiviä on kulunut. Osaa julkaisuista voi olla mahdoton palauttaa. Kaikki julkaisuihin liittyvät kirjanmerkit, suosikit ja tehostukset menetetään, eikä niitä voi palauttaa. custom_css: Voit käyttää mukautettuja tyylejä Mastodonin verkkoversiossa. @@ -108,26 +108,26 @@ fi: text: Tämä auttaa meitä arvioimaan hakemustasi ip_block: comment: Valinnainen. Muista miksi lisäsit tämän säännön. - expires_in: IP-osoitteet ovat rajallinen resurssi, joskus niitä jaetaan ja vaihtavat usein omistajaa. Tästä syystä epämääräisiä IP-lohkoja ei suositella. - ip: Kirjoita IPv4- tai IPv6-osoite. Voit estää kokonaisia alueita käyttämällä CIDR-syntaksia. Varo, että et lukitse itseäsi ulos! + expires_in: IP-osoitteet ovat rajallinen resurssi – joskus niitä jaetaan, ja ne vaihtavat usein omistajaa. Niinpä epämääräisiä IP-lohkoja ei suositella. + ip: Kirjoita IPv4- tai IPv6-osoite. Voit estää kokonaisia IP-osoitealueita CIDR-syntaksin avulla. Varo lukitsemasta itseäsi ulos! severities: no_access: Estä pääsy kaikkiin resursseihin sign_up_block: Uudet rekisteröitymiset eivät ole mahdollisia sign_up_requires_approval: Uudet rekisteröitymiset edellyttävät hyväksyntääsi severity: Valitse, mitä tapahtuu tämän IP-osoitteen pyynnöille rule: - text: Kuvaile sääntöä tai vaatimusta tämän palvelimen käyttäjille. Yritä pitää se lyhyenä ja yksinkertaisena + text: Kuvaile sääntöä tai edellytystä palvelimesi käyttäjille. Suosi tiivistä, yksinkertaista ilmaisua sessions: - otp: Syötä puhelimeen saamasi kaksivaiheisen tunnistautumisen koodi tai käytä palautuskoodia. + otp: 'Näppäile mobiilisovelluksessa näkyvä kaksivaiheisen todennuksen tunnusluku, tai käytä tarvittaessa palautuskoodia:' webauthn: Jos kyseessä on USB-avain, muista laittaa se paikalleen ja tarvittaessa napauttaa sitä. settings: indexable: Profiilisi voi näkyä Googlen, Bingin ja muiden hakukoneiden hakutuloksissa. show_application: Voit silti aina nähdä, mistä sovelluksesta julkaisusi lähetettiin. tag: - name: Voit muuttaa esimerkiksi kirjaimia paremmin luettavaksi + name: Voit esimerkiksi vaihtaa suur- ja pienaakkosten kesken helppolukuistaaksesi tekstiäsi user: - chosen_languages: Kun valittu, vain valituilla kielillä kirjoitetut julkaisut näkyvät julkisilla aikajanoilla - role: Rooli määrää, mitkä käyttöoikeudet käyttäjällä on + chosen_languages: Jos valitset kieliä oheisesta listauksesta, vain niidenkieliset julkaisut näkyvät julkisilla aikajanoilla sinulle + role: Rooli vaikuttaa käyttäjän käyttöoikeuksiin user_role: color: Väri, jota käytetään roolille kaikkialla käyttöliittymässä, RGB-heksadesimaalimuodossa highlighted: Tämä tekee roolista julkisesti näkyvän @@ -152,22 +152,22 @@ fi: account_migration: acct: Uuden tilin käyttäjänimi account_warning_preset: - text: Esiasetettu teksti + text: Esimääritetty teksti title: Nimi admin_account_action: - include_statuses: Sisällytä raportoidut viestit sähköpostiin + include_statuses: Sisällytä raportoidut viestit sähköposti-ilmoitukseen send_email_notification: Ilmoita käyttäjälle sähköpostitse text: Mukautettu varoitus type: Toimi types: - disable: Poista kirjautuminen käytöstä - none: Älä tee mitään + disable: Jäädytä + none: Lähetä varoitus sensitive: Arkaluonteinen silence: Rajoita suspend: Jäädytä - warning_preset_id: Käytä varoitusmallia + warning_preset_id: Käytä varoituspohjaa announcement: - all_day: Koko päivän kestävä tapahtuma + all_day: Koko päivän tapahtuma ends_at: Tapahtuman loppu scheduled_at: Ajoita julkaisu starts_at: Tapahtuman alku @@ -196,7 +196,7 @@ fi: max_uses: Käyttökertoja enintään new_password: Uusi salasana note: Elämäkerta - otp_attempt: Kaksivaiheisen tunnistuksen koodi + otp_attempt: Kaksivaiheisen todennuksen tunnusluku password: Salasana phrase: Avainsana tai -fraasi setting_advanced_layout: Ota edistynyt selainkäyttöliittymä käyttöön @@ -208,19 +208,19 @@ fi: setting_default_privacy: Julkaisun näkyvyys setting_default_sensitive: Merkitse media aina arkaluonteiseksi setting_delete_modal: Kysy vahvistusta ennen julkaisun poistamista - setting_disable_swiping: Poista pyyhkäisyt käytöstä + setting_disable_swiping: Poista pyyhkäisyeleet käytöstä setting_display_media: Median näyttäminen setting_display_media_default: Oletus setting_display_media_hide_all: Piilota kaikki setting_display_media_show_all: Näytä kaikki setting_expand_spoilers: Laajenna aina sisältövaroituksilla merkityt julkaisut - setting_hide_network: Piilota verkkosi + setting_hide_network: Piilota verkostotietosi setting_reduce_motion: Vähennä animaatioiden liikettä setting_system_font_ui: Käytä järjestelmän oletusfonttia setting_theme: Sivuston teema setting_trends: Näytä päivän trendit setting_unfollow_modal: Kysy vahvistusta ennen seuraamisen lopettamista - setting_use_blurhash: Näytä värikkäät liukuvärit piilotetulle medialle + setting_use_blurhash: Käytä värikästä liukusävytystä piilotetulle medialle setting_use_pending_items: Hidas tila severity: Vakavuus sign_in_token_attempt: Turvakoodi @@ -230,13 +230,13 @@ fi: username_or_email: Käyttäjänimi tai sähköpostiosoite whole_word: Koko sana email_domain_block: - with_dns_records: Sisällytä toimialueen MX tietueet ja IP-osoite + with_dns_records: Sisällytä toimialueen MX-tietueet ja IP-osoitteet featured_tag: name: Aihetunniste filters: actions: hide: Piilota kokonaan - warn: Piilota ja näytä varoitus + warn: Piilota varoittaen form_admin_settings: activity_api_enabled: Julkaise yhteenlasketut tilastot käyttäjätoiminnasta ohjelmointirajapinnassa backups_retention_period: Käyttäjän arkiston säilytysaika @@ -244,9 +244,9 @@ fi: closed_registrations_message: Mukautettu viesti, kun rekisteröityminen ei ole saatavilla content_cache_retention_period: Sisällön välimuistin säilytysaika custom_css: Mukautettu CSS - mascot: Mukautettu maskotti (legacy) - media_cache_retention_period: Median välimuistin säilytysaika - peers_api_enabled: Julkaise löydettyjen instanssien luettelo ohjelmointirajapinnassa + mascot: Mukautettu maskotti (vanhentunut ominaisuus) + media_cache_retention_period: Mediasisältövälimuistin säilytysaika + peers_api_enabled: Julkaise löydettyjen palvelinten luettelo ohjelmointirajapinnassa profile_directory: Ota profiilihakemisto käyttöön registrations_mode: Kuka voi rekisteröityä require_invite_text: Vaadi syy liittyä @@ -260,11 +260,11 @@ fi: site_title: Palvelimen nimi status_page_url: Tilasivun URL-osoite theme: Oletusteema - thumbnail: Palvelimen pikkukuva + thumbnail: Palvelimen pienoiskuva timeline_preview: Salli todentamaton pääsy julkisille aikajanoille - trendable_by_default: Salli trendit ilman ennakkotarkastusta + trendable_by_default: Salli suositun sisällön koonti ilman ennakkotarkastusta trends: Ota trendit käyttöön - trends_as_landing_page: Käytä trendejä aloitussivuna + trends_as_landing_page: Käytä suosittua sisältöä aloitussivuna interactions: must_be_follower: Estä ilmoitukset käyttäjiltä, jotka eivät seuraa sinua must_be_following: Estä ilmoitukset käyttäjiltä, joita et seuraa @@ -318,7 +318,7 @@ fi: permissions_as_keys: Oikeudet position: Prioriteetti webhook: - events: Tapahtumat käytössä + events: Käytössä olevat tapahtumat template: Hyötykuormapohja url: Päätepisteen URL 'no': Ei @@ -327,8 +327,8 @@ fi: recommended: Suositeltu required: mark: "*" - text: pakollinen tieto + text: vaadittu tieto title: sessions: - webauthn: Käytä jotakin suojausavainta kirjautuaksesi sisään + webauthn: Käytä yhtä turva-avaimistasi kirjautuaksesi sisään 'yes': Kyllä diff --git a/config/locales/simple_form.gd.yml b/config/locales/simple_form.gd.yml index f567866c3e..a38dd43ad6 100644 --- a/config/locales/simple_form.gd.yml +++ b/config/locales/simple_form.gd.yml @@ -304,10 +304,10 @@ gd: indexable: Gabh a-staigh duilleag na pròifil sna h-einnseanan-luirg show_application: Seall dè an aplacaid a chuir thu post leatha tag: - listable: Leig leis an taga hais seo gun nochd e ann an toraidhean luirg ’s am measg nam molaidhean + listable: Faodaidh an taga hais seo nochdadh ann an toraidhean luirg ’s am measg nam molaidhean name: Taga hais - trendable: Leig leis an taga hais seo gun nochd e am measg nan treandaichean - usable: Leig le postaichean an taga hais seo a chleachdadh + trendable: Faodaidh an taga hais seo nochdadh am measg nan treandaichean + usable: Faodaidh postaichean an taga hais seo a chleachdadh user: role: Dreuchd time_zone: Roinn-tìde diff --git a/config/locales/simple_form.ja.yml b/config/locales/simple_form.ja.yml index 08e866b55e..e9fb3da9fa 100644 --- a/config/locales/simple_form.ja.yml +++ b/config/locales/simple_form.ja.yml @@ -294,7 +294,7 @@ ja: software_updates: all: すべてのアップデートを通知する critical: 緊急のアップデートのみ通知する - label: 新しいMastodonバージョンが利用可能です + label: 新しいMastodonバージョンが利用可能になった時 none: 通知しない (非推奨) patch: 緊急のアップデートとバグ修正アップデートを通知する trending_tag: 新しいトレンドのレビューをする必要がある時 diff --git a/config/locales/simple_form.lad.yml b/config/locales/simple_form.lad.yml index c23960e07d..afa26b7873 100644 --- a/config/locales/simple_form.lad.yml +++ b/config/locales/simple_form.lad.yml @@ -32,7 +32,7 @@ lad: announcement: all_day: Kuando esta eskojido solo se amostraran las datas del rango de tiempo ends_at: Opsyonal. El pregon dezaparesera otomatikamente en este momento - scheduled_at: Deshar en blanko para publikar el pregon pishin + scheduled_at: Desha en blanko para publikar el pregon pishin starts_at: Opsyonal. En caso de ke tu pregon este atado a un intervalo de tiempo espesifiko text: Puedes kulanear la sintaksa de publikasyones. Por favor nota el espasyo ke okupara el pregon en el ekran del utilizador appeal: diff --git a/config/locales/simple_form.sr-Latn.yml b/config/locales/simple_form.sr-Latn.yml index 6405ee338a..6e6b6ce8b8 100644 --- a/config/locales/simple_form.sr-Latn.yml +++ b/config/locales/simple_form.sr-Latn.yml @@ -192,7 +192,7 @@ sr-Latn: honeypot: "%{label} (ne popunjavaj)" inbox_url: URL od relejnog prijemnog sandučeta irreversible: Ispustiti umesto sakriti - locale: Jezik + locale: Jezik okruženja max_uses: Maksimalni broj korišćenja new_password: Nova lozinka note: Biografija diff --git a/config/locales/simple_form.sr.yml b/config/locales/simple_form.sr.yml index da1ac81233..71fbe299ec 100644 --- a/config/locales/simple_form.sr.yml +++ b/config/locales/simple_form.sr.yml @@ -192,7 +192,7 @@ sr: honeypot: "%{label} (не попуњавај)" inbox_url: URL од релејног пријемног сандучета irreversible: Испустити уместо сакрити - locale: Језик + locale: Језик окружења max_uses: Максимални број коришћења new_password: Нова лозинка note: Биографија diff --git a/config/locales/simple_form.tr.yml b/config/locales/simple_form.tr.yml index 7d16531eae..3053c04431 100644 --- a/config/locales/simple_form.tr.yml +++ b/config/locales/simple_form.tr.yml @@ -48,7 +48,7 @@ tr: email: Onay e-postası gönderilir header: PNG, GIF ya da JPG. En fazla %{size}. %{dimensions}px boyutuna küçültülecek inbox_url: Kullanmak istediğiniz aktarıcının ön sayfasından URL'yi kopyalayın - irreversible: Filtrelenmiş gönderiler, filtre daha sonra kaldırılsa bile, geri dönüşümsüz biçimde kaybolur + irreversible: Süzgeçlenmiş gönderiler, filtre daha sonra kaldırılsa bile, geri dönüşümsüz biçimde kaybolur locale: Kullanıcı arayüzünün dili, e-postalar ve push bildirimleri password: En az 8 karakter kullanın phrase: Metnin büyük/küçük harf durumundan veya gönderinin içerik uyarısından bağımsız olarak eşleştirilecek @@ -74,7 +74,7 @@ tr: action: Bir gönderi filtreyle eşleştiğinde hangi eylemin yapılacağını seçin actions: hide: Filtrelenmiş içeriği tamamen gizle, sanki varolmamış gibi - warn: Filtrelenmiş içeriği, filtrenin başlığından söz eden bir uyarının arkasında gizle + warn: Süzgeçlenmiş içeriği, süzgecinin başlığından söz eden bir uyarının arkasında gizle form_admin_settings: activity_api_enabled: Yerel olarak yayınlanan gönderi, etkin kullanıcı ve yeni kayıtların haftalık sayıları backups_retention_period: Üretilen kullanıcı arşivlerini belirli gün sayısı kadar sakla. @@ -118,7 +118,7 @@ tr: rule: text: Bu sunucu üzerindeki kullanıcılar için bir kural veya gereksinimi tanımlayın. Kuralı kısa ve yalın tutmaya çalışın sessions: - otp: Telefonunuzdaki two-factor kodunuzu giriniz veya kurtarma kodlarınızdan birini giriniz. + otp: 'Telefonunuzdaki two-factor kodunuzu giriniz veya kurtarma kodlarınızdan birini giriniz:' webauthn: Bir USB anahtarıysa, taktığınızdan ve gerekirse üzerine tıkladığınızdan emin olun. settings: indexable: Profil sayfanız Google, Bing ve diğerlerindeki arama sonuçlarında görüntülenebilir. @@ -178,10 +178,10 @@ tr: autofollow: Hesabınızı takip etmeye davet edin avatar: Profil resmi bot: Bu bir bot hesabı - chosen_languages: Dilleri filtrele + chosen_languages: Dilleri süzgeçle confirm_new_password: Yeni parolayı onayla confirm_password: Parolayı doğrula - context: İçeriği filtrele + context: İçeriği süzgeçle current_password: Güncel parola data: Veri display_name: Görünen isim @@ -203,7 +203,7 @@ tr: setting_aggregate_reblogs: Zaman çizelgesindeki boostları grupla setting_always_send_emails: Her zaman e-posta bildirimleri gönder setting_auto_play_gif: Hareketli GIF'leri otomatik oynat - setting_boost_modal: Boostlamadan önce onay iletişim kutusu göster + setting_boost_modal: Paylaşmadan önce onay iletişim kutusu göster setting_default_language: Gönderi dili setting_default_privacy: Gönderi gizliliği setting_default_sensitive: Medyayı her zaman hassas olarak işaretle diff --git a/config/locales/sk.yml b/config/locales/sk.yml index 20df763463..5ffbf45bde 100644 --- a/config/locales/sk.yml +++ b/config/locales/sk.yml @@ -363,6 +363,7 @@ sk: silence: Obmedz suspend: Pozastav title: Nové blokovanie domény + no_domain_block_selected: Žiadne blokovanie domén nebolo zmenené, keďže žiadne neboli vybrané not_permitted: Nemáš povolenie na vykonanie tohto kroku obfuscate: Zatemniť názov domény private_comment: Súkromný komentár diff --git a/config/locales/sl.yml b/config/locales/sl.yml index ba707f49eb..54a4da3ea2 100644 --- a/config/locales/sl.yml +++ b/config/locales/sl.yml @@ -1598,6 +1598,9 @@ sl: errors: limit_reached: Dosežena omejitev različnih reakcij/odzivov unrecognized_emoji: ni prepoznan emotikon + redirects: + prompt: Če zaupate tej povezavi, jo kliknite za nadaljevanje. + title: Zapuščate %{instance}. relationships: activity: Dejavnost računa confirm_follow_selected_followers: Ali ste prepričani, da želite slediti izbranim sledilcem? @@ -1854,6 +1857,12 @@ sl: extra: Zdaj je na voljo za prenos! subject: Vaš arhiv je pripravljen za prenos title: Prevzem arhiva + failed_2fa: + details: 'Tukaj so podrobnosti poskusa prijave:' + explanation: Nekdo se je poskusil prijaviti v vaš račun, vendar ni podal veljavnega drugega faktorja preverjanja pristnosti. + further_actions_html: Če to niste bili vi, priporočamo, da takoj %{action}, ker je lahko ogrožena varnost. + subject: Napaka preverjanja pristnosti z drugim faktorjem + title: Preverjanje pristnosti z drugim faktorjem je spodletelo suspicious_sign_in: change_password: spremenite svoje geslo details: 'Tukaj so podrobnosti prijave:' diff --git a/config/locales/sr.yml b/config/locales/sr.yml index 8de7c90e73..9e67e9692d 100644 --- a/config/locales/sr.yml +++ b/config/locales/sr.yml @@ -1781,8 +1781,8 @@ sr: does_not_match_previous_name: не поклапа се са претходним именом themes: contrast: Велики контраст - default: Mastodon (тамно) - mastodon-light: Mastodon (светло) + default: Mastodon (тамна) + mastodon-light: Mastodon (светла) time: formats: default: "%d %b %Y, %H:%M" diff --git a/config/locales/th.yml b/config/locales/th.yml index ac5cfbacf5..74fc1b26b7 100644 --- a/config/locales/th.yml +++ b/config/locales/th.yml @@ -1364,7 +1364,7 @@ th: webauthn: กุญแจความปลอดภัย description_html: หากคุณเห็นกิจกรรมที่คุณไม่รู้จัก พิจารณาเปลี่ยนรหัสผ่านของคุณและเปิดใช้งานการรับรองความถูกต้องด้วยสองปัจจัย empty: ไม่มีประวัติการรับรองความถูกต้อง - failed_sign_in_html: ความพยายามลงชื่อเข้าด้วย %{method} จาก %{ip} (%{browser}) ล้มเหลว + failed_sign_in_html: ความพยายามในการลงชื่อเข้าด้วย %{method} จาก %{ip} (%{browser}) ล้มเหลว successful_sign_in_html: ลงชื่อเข้าด้วย %{method} จาก %{ip} (%{browser}) สำเร็จ title: ประวัติการรับรองความถูกต้อง mail_subscriptions: @@ -1520,6 +1520,9 @@ th: errors: limit_reached: ถึงขีดจำกัดของการตอบสนองต่าง ๆ แล้ว unrecognized_emoji: ไม่ใช่อีโมจิที่รู้จัก + redirects: + prompt: หากคุณเชื่อถือลิงก์นี้ ให้คลิกลิงก์เพื่อดำเนินการต่อ + title: คุณกำลังจะออกจาก %{instance} relationships: activity: กิจกรรมบัญชี confirm_follow_selected_followers: คุณแน่ใจหรือไม่ว่าต้องการติดตามผู้ติดตามที่เลือก? @@ -1758,6 +1761,12 @@ th: extra: ตอนนี้ข้อมูลสำรองพร้อมสำหรับการดาวน์โหลดแล้ว! subject: การเก็บถาวรของคุณพร้อมสำหรับการดาวน์โหลดแล้ว title: การส่งออกการเก็บถาวร + failed_2fa: + details: 'นี่คือรายละเอียดของความพยายามในการลงชื่อเข้า:' + explanation: ใครสักคนได้ลองลงชื่อเข้าบัญชีของคุณแต่ให้การรับรองความถูกต้องด้วยปัจจัยที่สองที่ไม่ถูกต้อง + further_actions_html: หากนี่ไม่ใช่คุณ เราแนะนำให้คุณ %{action} ทันทีเนื่องจากอาจมีการบุกรุกบัญชี + subject: ความล้มเหลวการรับรองความถูกต้องด้วยปัจจัยที่สอง + title: การรับรองความถูกต้องด้วยปัจจัยที่สองล้มเหลว suspicious_sign_in: change_password: เปลี่ยนรหัสผ่านของคุณ details: 'นี่คือรายละเอียดของการลงชื่อเข้า:' diff --git a/config/locales/tr.yml b/config/locales/tr.yml index b3a52715b7..2b605e5073 100644 --- a/config/locales/tr.yml +++ b/config/locales/tr.yml @@ -1201,8 +1201,8 @@ tr: '406': Bu sayfa istenen formatta mevcut değil. '410': Aradığınız sayfa artık yok. '422': - content: Güvenlik doğrulaması başarısız oldu. Site cookie'lerini engellemiş olabilirsiniz. - title: Güvenlik doğrulamasu başarısız + content: Güvenlik doğrulaması başarısız oldu. Site çerezlerini engellemiş olabilirmisiniz? + title: Güvenlik doğrulaması başarısız '429': Kısıtlandı '500': content: Üzgünüz, ancak bir şey ters gitti. @@ -1243,15 +1243,15 @@ tr: add_keyword: Anahtar sözcük ekle keywords: Anahtar Sözcükler statuses: Tekil gönderiler - statuses_hint_html: Bu filtre, aşağıdaki anahtar kelimelerle eşleşip eşleşmediklerinden bağımsız olarak tekil gönderileri seçmek için uygulanıyor. Filtredeki gönderileri inceleyin veya kaldırın. - title: Filtreyi düzenle + statuses_hint_html: Bu süzgeçlere, aşağıdaki anahtar kelimelerle eşleşip eşleşmediklerinden bağımsız olarak tekil gönderileri seçmek için uygulanıyor. Süzgeçlerdeki gönderileri inceleyin veya kaldırın. + title: Süzgeci düzenle errors: - deprecated_api_multiple_keywords: Bu parametreler, birden fazla filtre anahtar sözcüğü için geçerli olduğundan dolayı bu uygulama içerisinden değiştirilemezler. Daha yeni bir uygulama veya web arayüzünü kullanın. + deprecated_api_multiple_keywords: Bu parametreler, birden fazla süzgeç anahtar sözcüğü için geçerli olduğundan dolayı bu uygulama içerisinden değiştirilemezler. Daha yeni bir uygulama veya web arayüzünü kullanın. invalid_context: Sıfır ya da geçersiz içerik sağlandı index: contexts: "%{contexts} içindeki filtreler" delete: Sil - empty: Hiç filtreniz yok. + empty: Hiç süzgeciniz yok. expires_in: "%{distance} sürede sona eriyor" expires_on: "%{date} tarihinde sona eriyor" keywords: @@ -1263,16 +1263,16 @@ tr: statuses_long: one: "%{count} tekil gönderi gizli" other: "%{count} tekil gönderi gizli" - title: Filtreler + title: Süzgeçler new: - save: Yeni filtre kaydet - title: Yeni filtre ekle + save: Yeni süzgeç kaydet + title: Yeni süzgeç ekle statuses: - back_to_filter: Filtreye dön + back_to_filter: Süzgeçe dön batch: - remove: Filtreden kaldır + remove: Süzgeçden kaldır index: - hint: Bu filtre diğer ölçütlerden bağımsız olarak tekil gönderileri seçmek için uygulanıyor. Web arayüzünü kullanarak bu filtreye daha fazla gönderi ekleyebilirsiniz. + hint: Bu süzgece diğer ölçütlerden bağımsız olarak tekil gönderileri seçmek için uygulanıyor. Web arayüzünü kullanarak bu süzgece daha fazla gönderi ekleyebilirsiniz. title: Süzgeçlenmiş gönderiler generic: all: Tümü @@ -1480,8 +1480,8 @@ tr: subject: Anket %{name} tarafından sonlandırıldı reblog: body: "%{name} durumunuzu boostladı:" - subject: "%{name} durumunuzu boostladı" - title: Yeni boost + subject: "%{name} durumunuzu paylaştı" + title: Yeni paylaşım status: subject: "%{name} az önce gönderdi" update: @@ -1544,7 +1544,7 @@ tr: title: Gizlilik Politikası reactions: errors: - limit_reached: Farklı reaksiyonların sınırına ulaşıldı + limit_reached: Farklı tepkilerin sınırına ulaşıldı unrecognized_emoji: tanınan bir emoji değil redirects: prompt: Eğer bu bağlantıya güveniyorsanız, tıklayıp devam edebilirsiniz. @@ -1663,17 +1663,17 @@ tr: other: "%{count} ses" description: 'Ekli: %{attached}' image: - one: "%{count} resim" - other: "%{count} resim" + one: "%{count} görsel" + other: "%{count} görseller" video: one: "%{count} video" - other: "%{count} video" - boosted_from_html: "%{acct_link} kişisinden boostladı" + other: "%{count} videolar" + boosted_from_html: "%{acct_link} kişisinden paylaştı" content_warning: 'İçerik uyarısı: %{warning}' default_language: Arayüz diliyle aynı disallowed_hashtags: one: 'izin verilmeyen bir etiket içeriyordu: %{tags}' - other: 'izin verilmeyen hashtag''leri içeriyordu: %{tags}' + other: 'izin verilmeyen etiketler içeriyordu: %{tags}' edited_at_html: "%{date} tarihinde düzenlendi" errors: in_reply_not_found: Yanıtlamaya çalıştığınız durum yok gibi görünüyor. @@ -1683,14 +1683,14 @@ tr: direct: Sadece değinilen kullanıcıların görebileceği gönderiler üstte tutulamaz limit: Halihazırda maksimum sayıda gönderi sabitlediniz ownership: Başkasının gönderisi sabitlenemez - reblog: Bir boost sabitlenemez + reblog: Bir gönderi sabitlenemez poll: total_people: one: "%{count} kişi" - other: "%{count} kişi" + other: "%{count} kişiler" total_votes: one: "%{count} oy" - other: "%{count} oy" + other: "%{count} oylar" vote: Oy Ver show_more: Daha fazlasını göster show_newer: Yenileri göster @@ -1756,7 +1756,7 @@ tr: default: "%d %b %Y %H:%M" month: "%b %Y" time: "%H:%M" - with_time_zone: "%d.%m.%Y %H:%M %Z" + with_time_zone: "%b %d, %Y, %H:%M %Z" translation: errors: quota_exceeded: Çeviri hizmetinin sunucu kapsamındaki kullanım kotası aşıldı. @@ -1774,7 +1774,7 @@ tr: otp: Authenticator uygulaması recovery_codes: Kurtarma kodlarını yedekle recovery_codes_regenerated: Kurtarma kodları başarıyla yeniden oluşturuldu - recovery_instructions_html: 'Eğer telefonunuza erişiminizi kaybederseniz, aşağıdaki kurtarma kodlarından birini kullanarak hesabınıza giriş yapabilirsiniz. Kurtarma kodlarınızı güvenli halde tutunuz. Örneğin: kodların çıktısını alıp diğer önemli belgeleriniz ile birlikte saklayabilirsiniz.' + recovery_instructions_html: 'Eğer telefonunuza erişiminizi kaybederseniz, aşağıdaki kurtarma kodlarından birini kullanarak hesabınıza giriş yapabilirsiniz. Kurtarma kodlarınızı güvenli halde tutunuz. Örneğin: kodların çıktısını alıp diğer önemli belgeleriniz ile birlikte saklayabilirsiniz.' webauthn: Güvenlik anahtarları user_mailer: appeal_approved: diff --git a/config/locales/uk.yml b/config/locales/uk.yml index 531bdb3d59..237305c0e9 100644 --- a/config/locales/uk.yml +++ b/config/locales/uk.yml @@ -1845,14 +1845,24 @@ uk: action: Налаштування облікового запису explanation: Оскарження попередження вашому обліковому запису %{strike_date}, яке ви надіслали %{appeal_date} було схвалено. Ваш обліковий запис знову вважається добропорядним. subject: Вашу апеляцію від %{date} було схвалено + subtitle: Ваш обліковий запис знову готовий до користування. title: Апеляцію схвалено appeal_rejected: explanation: Оскарження попередження вашому обліковому запису %{strike_date}, яке ви надіслали %{appeal_date} було відхилено. subject: Вашу апеляцію від %{date} було відхилено + subtitle: Вашу апеляцію відхилено. title: Апеляцію відхилено backup_ready: + explanation: Ви просили про створення резервної копії вашого облікового запису Mastodon. + extra: Вона готова до завантаження! subject: Ваш архів готовий до завантаження title: Винесення архіву + failed_2fa: + details: 'Подробиці спроби входу:' + explanation: Хтось намагався ввійти у ваш обліковий запис, але надав недійсний другий фактор автентифікації. + further_actions_html: Якщо це не ви, ми радимо вам негайно %{action}, оскільки обліковий запис може бути скомпрометованим. + subject: Помилка другого фактору автентифікації + title: Помилка другого фактора автентифікації suspicious_sign_in: change_password: змінити свій пароль details: 'Відомості про вхід:' @@ -1906,7 +1916,7 @@ uk: go_to_sso_account_settings: Перейдіть до налаштувань облікового запису постачальника ідентифікації invalid_otp_token: Введено неправильний код otp_lost_help_html: Якщо ви втратили доступ до обох, ви можете отримати доступ з %{email} - rate_limited: Занадто багато спроб з'єднання. Спробуйте ще раз пізніше. + rate_limited: Забагато спроб з'єднання. Спробуйте ще раз пізніше. seamless_external_login: Ви увійшли за допомогою зовнішнього сервісу, тому налаштування паролю та електронної пошти недоступні. signed_in_as: 'Ви увійшли як:' verification: From aaa58d4807377e04649499ebee91757b16b9a007 Mon Sep 17 00:00:00 2001 From: Claire Date: Tue, 6 Feb 2024 21:48:11 +0100 Subject: [PATCH 079/211] Fix tagging of manual security nightly builds (#29061) --- .github/workflows/build-security.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/build-security.yml b/.github/workflows/build-security.yml index b03b787d5f..1e2455d3d9 100644 --- a/.github/workflows/build-security.yml +++ b/.github/workflows/build-security.yml @@ -38,7 +38,7 @@ jobs: tags: | type=raw,value=edge type=raw,value=nightly - type=schedule,pattern=${{ needs.compute-suffix.outputs.prerelease }} + type=raw,value=${{ needs.compute-suffix.outputs.prerelease }} secrets: inherit build-image-streaming: @@ -60,5 +60,5 @@ jobs: tags: | type=raw,value=edge type=raw,value=nightly - type=schedule,pattern=${{ needs.compute-suffix.outputs.prerelease }} + type=raw,value=${{ needs.compute-suffix.outputs.prerelease }} secrets: inherit From 492e25da0651195873e0c2e9632a7f183ea6b2ef Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 7 Feb 2024 11:56:52 +0100 Subject: [PATCH 080/211] Update dependency webmock to v3.20.0 (#29120) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- Gemfile.lock | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/Gemfile.lock b/Gemfile.lock index b76f449b26..d60def5222 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -182,7 +182,8 @@ GEM cose (1.3.0) cbor (~> 0.5.9) openssl-signature_algorithm (~> 1.0) - crack (0.4.5) + crack (0.4.6) + bigdecimal rexml crass (1.0.6) css_parser (1.14.0) @@ -314,7 +315,7 @@ GEM rainbow rubocop (>= 1.0) sysexits (~> 1.1) - hashdiff (1.0.1) + hashdiff (1.1.0) hashie (5.0.0) hcaptcha (7.1.0) json @@ -792,7 +793,7 @@ GEM webfinger (1.2.0) activesupport httpclient (>= 2.4) - webmock (3.19.1) + webmock (3.20.0) addressable (>= 2.8.0) crack (>= 0.3.2) hashdiff (>= 0.4.0, < 2.0.0) From da50217b8899f36137c5405423a41b8520dfdfb2 Mon Sep 17 00:00:00 2001 From: Matt Jankowski Date: Wed, 7 Feb 2024 05:59:32 -0500 Subject: [PATCH 081/211] Combine repeated requests in `admin/accounts` controller spec (#29119) --- .../admin/accounts_controller_spec.rb | 48 +++++++++---------- 1 file changed, 24 insertions(+), 24 deletions(-) diff --git a/spec/controllers/admin/accounts_controller_spec.rb b/spec/controllers/admin/accounts_controller_spec.rb index ef3053b6b3..b90bb414b0 100644 --- a/spec/controllers/admin/accounts_controller_spec.rb +++ b/spec/controllers/admin/accounts_controller_spec.rb @@ -9,18 +9,8 @@ RSpec.describe Admin::AccountsController do describe 'GET #index' do let(:current_user) { Fabricate(:user, role: UserRole.find_by(name: 'Admin')) } - - around do |example| - default_per_page = Account.default_per_page - Account.paginates_per 1 - example.run - Account.paginates_per default_per_page - end - - it 'filters with parameters' do - account_filter = instance_double(AccountFilter, results: Account.all) - allow(AccountFilter).to receive(:new).and_return(account_filter) - params = { + let(:params) do + { origin: 'local', by_domain: 'domain', status: 'active', @@ -29,25 +19,35 @@ RSpec.describe Admin::AccountsController do email: 'local-part@domain', ip: '0.0.0.42', } + end - get :index, params: params - - expect(AccountFilter).to have_received(:new).with(hash_including(params)) + around do |example| + default_per_page = Account.default_per_page + Account.paginates_per 1 + example.run + Account.paginates_per default_per_page end - it 'paginates accounts' do + before do Fabricate(:account) - get :index, params: { page: 2 } - - accounts = assigns(:accounts) - expect(accounts.count).to eq 1 - expect(accounts.klass).to be Account + account_filter = instance_double(AccountFilter, results: Account.all) + allow(AccountFilter).to receive(:new).and_return(account_filter) end - it 'returns http success' do - get :index - expect(response).to have_http_status(200) + it 'returns success and paginates and filters with parameters' do + get :index, params: params.merge(page: 2) + + expect(response) + .to have_http_status(200) + expect(assigns(:accounts)) + .to have_attributes( + count: eq(1), + klass: be(Account) + ) + expect(AccountFilter) + .to have_received(:new) + .with(hash_including(params)) end end From eeabf9af72bf27dbc7e997b73737ac3bf1122813 Mon Sep 17 00:00:00 2001 From: Claire Date: Wed, 7 Feb 2024 12:52:38 +0100 Subject: [PATCH 082/211] Fix compatibility with Redis <6.2 (#29123) --- app/controllers/auth/sessions_controller.rb | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/app/controllers/auth/sessions_controller.rb b/app/controllers/auth/sessions_controller.rb index 962b78de65..6ed7b2baac 100644 --- a/app/controllers/auth/sessions_controller.rb +++ b/app/controllers/auth/sessions_controller.rb @@ -183,7 +183,9 @@ class Auth::SessionsController < Devise::SessionsController ) # Only send a notification email every hour at most - return if redis.set("2fa_failure_notification:#{user.id}", '1', ex: 1.hour, get: true).present? + return if redis.get("2fa_failure_notification:#{user.id}").present? + + redis.set("2fa_failure_notification:#{user.id}", '1', ex: 1.hour) UserMailer.failed_2fa(user, request.remote_ip, request.user_agent, Time.now.utc).deliver_later! end From 2912829411867d221c13b35f37ab6aa0aac2edd7 Mon Sep 17 00:00:00 2001 From: Claire Date: Wed, 7 Feb 2024 13:09:43 +0100 Subject: [PATCH 083/211] Add support for specifying custom CA cert for Elasticsearch (#29122) --- config/initializers/chewy.rb | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/config/initializers/chewy.rb b/config/initializers/chewy.rb index 076f383324..0fb311dbb3 100644 --- a/config/initializers/chewy.rb +++ b/config/initializers/chewy.rb @@ -7,6 +7,9 @@ user = ENV.fetch('ES_USER', nil).presence password = ENV.fetch('ES_PASS', nil).presence fallback_prefix = ENV.fetch('REDIS_NAMESPACE', nil).presence prefix = ENV.fetch('ES_PREFIX') { fallback_prefix } +ca_file = ENV.fetch('ES_CA_CERT', nil).presence + +transport_options = { ssl: { ca_file: ca_file } } if ca_file.present? Chewy.settings = { host: "#{host}:#{port}", @@ -18,6 +21,7 @@ Chewy.settings = { index: { number_of_replicas: ['single_node_cluster', nil].include?(ENV['ES_PRESET'].presence) ? 0 : 1, }, + transport_options: transport_options, } # We use our own async strategy even outside the request-response From 17052714a28e3b30c5d2053d8dbea4a352c4199b Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Wed, 7 Feb 2024 13:38:37 +0100 Subject: [PATCH 084/211] New Crowdin Translations (automated) (#29121) Co-authored-by: GitHub Actions --- app/javascript/mastodon/locales/tok.json | 167 +++++++++++++++++++++++ config/locales/activerecord.tok.yml | 6 + config/locales/devise.tok.yml | 1 + config/locales/doorkeeper.tok.yml | 1 + config/locales/simple_form.tok.yml | 14 ++ config/locales/tok.yml | 1 + 6 files changed, 190 insertions(+) create mode 100644 app/javascript/mastodon/locales/tok.json create mode 100644 config/locales/activerecord.tok.yml create mode 100644 config/locales/devise.tok.yml create mode 100644 config/locales/doorkeeper.tok.yml create mode 100644 config/locales/simple_form.tok.yml create mode 100644 config/locales/tok.yml diff --git a/app/javascript/mastodon/locales/tok.json b/app/javascript/mastodon/locales/tok.json new file mode 100644 index 0000000000..a0227969dd --- /dev/null +++ b/app/javascript/mastodon/locales/tok.json @@ -0,0 +1,167 @@ +{ + "about.contact": "toki:", + "about.domain_blocks.no_reason_available": "mi sona ala e tan", + "about.not_available": "lon kulupu ni la sina ken alasa ala e sona ni.", + "about.rules": "lawa kulupu", + "account.account_note_header": "sona awen", + "account.block": "o weka e @{name}", + "account.block_domain": "o weka e ma {domain}", + "account.block_short": "o weka e jan", + "account.blocked": "jan ni li weka", + "account.browse_more_on_origin_server": "sina tawa ma tan pi jan ni la sina ken lukin e mute", + "account.cancel_follow_request": "o pini wile kute", + "account.copy": "o pali same e linja pi lipu jan", + "account.direct": "len la o mu e @{name}", + "account.disable_notifications": "@{name} li toki la o toki ala e toki ona tawa mi", + "account.domain_blocked": "ma ni li weka tawa sina", + "account.edit_profile": "o ante e lipu mi", + "account.enable_notifications": "@{name} li toki la o toki e toki ona tawa mi", + "account.endorse": "lipu jan la o suli e ni", + "account.featured_tags.last_status_at": "sitelen pini pi jan ni li lon tenpo {date}", + "account.featured_tags.last_status_never": "toki ala li lon", + "account.follow": "o kute", + "account.follow_back": "jan ni li kute e sina. o kute", + "account.followers": "jan kute", + "account.followers.empty": "jan ala li kute e jan ni", + "account.following": "sina kute e jan ni", + "account.follows.empty": "jan ni li kute e jan ala", + "account.go_to_profile": "o tawa lipu jan", + "account.hide_reblogs": "o lukin ala e pana toki tan @{name}", + "account.languages": "sina wile lukin e sitelen pi toki seme", + "account.locked_info": "sina wile kute e jan ni la ona o toki e ken", + "account.mention": "o toki e jan @{name}", + "account.moved_to": "lipu jan sin pi jan {name} li ni:", + "account.mute": "o kute ala e @{name}", + "account.mute_notifications_short": "o kute ala e mu tan jan ni", + "account.mute_short": "o kute ala", + "account.muted": "sina kute ala e jan ni", + "account.no_bio": "lipu li weka", + "account.posts": "toki suli", + "account.posts_with_replies": "toki ale", + "account.report": "jan @{name} la o toki e lawa", + "account.requested": "jan ni o ken e kute sina. sina pini wile kute la o luka e ni", + "account.requested_follow": "{name} li wile kute e sina", + "account.show_reblogs": "o lukin e pana toki tan @{name}", + "account.unblock_short": "o pini weka", + "account.unfollow": "o pini kute", + "account.unmute": "o ken lukin e sitelen tan @{name}", + "account.unmute_notifications_short": "o kute e mu tan jan ni", + "account.unmute_short": "o ken kute e jan ni", + "alert.unexpected.message": "pakala li lon", + "alert.unexpected.title": "pakala", + "announcement.announcement": "toki suli", + "audio.hide": "o len e kalama", + "bundle_column_error.error.title": "pakala!", + "bundle_column_error.network.title": "pakala la ilo sina li toki ala tawa ilo ante", + "bundle_column_error.retry": "o ni sin", + "bundle_column_error.routing.body": "ilo li sona ala e lipu wile. sina pana ala pana e nasin pona tawa lipu?", + "bundle_column_error.routing.title": "pakala nanpa 404", + "bundle_modal_error.message": "ilo li wile kama e ijo ni, taso pakala li lon.", + "bundle_modal_error.retry": "o ni sin", + "column.mutes": "sina wile ala kute e jan ni", + "compose.language.change": "o ante e nasin toki", + "compose.language.search": "o alasa e nasin toki...", + "compose.saved.body": "ilo li awen e ijo pana sina.", + "compose_form.direct_message_warning_learn_more": "o kama sona e ijo ante", + "compose_form.placeholder": "o toki", + "compose_form.poll.option_placeholder": "ken nanpa {number}", + "compose_form.poll.switch_to_multiple": "o ante e nasin pana. pana mute o ken", + "compose_form.poll.switch_to_single": "o ante e nasin pana. pana wan taso o lon", + "compose_form.publish": "o toki", + "compose_form.publish_form": "o open toki sin", + "compose_form.reply": "o toki lon ijo ni", + "compose_form.save_changes": "o sin e ni", + "compose_form.spoiler.marked": "o weka e toki pi ijo ike ken", + "confirmations.cancel_follow_request.confirm": "o weka e wile sina", + "confirmations.cancel_follow_request.message": "sina awen ala awen wile weka e wile kute sina lon {name}?", + "confirmations.delete.confirm": "o pakala", + "confirmations.delete.message": "sina wile ala wile pakala e toki ni", + "confirmations.delete_list.confirm": "o pakala", + "confirmations.delete_list.message": "sina wile ala wile pakala e lipu ni", + "confirmations.discard_edit_media.confirm": "o weka", + "confirmations.edit.confirm": "o ante", + "confirmations.logout.confirm": "o weka", + "confirmations.logout.message": "sina wile ala wile weka", + "confirmations.mute.confirm": "sina wile ala kute e jan ni", + "confirmations.mute.message": "sina awen ala awen wile kute ala e {name}?", + "confirmations.redraft.confirm": "o pakala o pali sin e toki", + "conversation.mark_as_read": "ni o sin ala", + "conversation.open": "o lukin e toki", + "conversation.with": "lon {names}", + "directory.new_arrivals": "jan pi kama sin", + "dismissable_banner.dismiss": "o weka", + "emoji_button.flags": "len ma", + "emoji_button.food": "moku", + "emoji_button.label": "o pana e Emosi", + "emoji_button.nature": "soweli en kasi", + "emoji_button.not_found": "sitelen Emosi ala li lon", + "emoji_button.objects": "ijo", + "emoji_button.people": "jan", + "emoji_button.search": "o alasa", + "emoji_button.search_results": "ijo pi alasa ni", + "emoji_button.symbols": "sitelen", + "emoji_button.travel": "ma en tawa", + "empty_column.account_timeline": "toki ala li lon!", + "empty_column.followed_tags": "sina alasa ala e toki ꞏ sina alasa e toki la toki li lon ni", + "empty_column.hashtag": "ala li lon toki ni", + "empty_column.mutes": "jan ala la sina wile ala kute.", + "explore.search_results": "ijo pi alasa ni", + "explore.suggested_follows": "jan", + "explore.title": "o alasa", + "explore.trending_links": "sin", + "explore.trending_statuses": "toki", + "filter_modal.select_filter.search": "o alasa anu pali", + "firehose.all": "ale", + "firehose.local": "ilo ni", + "firehose.remote": "ilo ante", + "follow_suggestions.view_all": "o lukin e ale", + "footer.privacy_policy": "lawa len", + "footer.source_code": "o lukin e toki ilo", + "footer.status": "lon", + "hashtag.column_settings.tag_mode.all": "ale ni", + "hashtag.column_settings.tag_mode.any": "wan ni", + "hashtag.column_settings.tag_mode.none": "ala ni", + "home.pending_critical_update.link": "o lukin e ijo ilo sin", + "interaction_modal.title.follow": "o kute e {name}", + "keyboard_shortcuts.muted": "sina wile ala kute e jan la o lukin e ona ale", + "lists.edit.submit": "o ante e nimi", + "mute_modal.duration": "tenpo seme", + "mute_modal.indefinite": "tenpo ale", + "navigation_bar.filters": "sina wile ala kute e nimi ni", + "navigation_bar.mutes": "sina wile ala kute e jan ni", + "report.block_explanation": "sina kama lukin ala e toki ona. ona li kama ala ken lukin e toki sina li kama ala ken kute e sina. ona li ken sona e kama ni.", + "report.category.title": "ike seme li lon {type} ni", + "report.mute": "o kute ala e ona", + "report.mute_explanation": "sina kama ala lukin e ijo pana ona. ona li awen ken kute e sina li awen ken lukin e sina li sona ala e weka kute sina e weka lukin sina.", + "search_popout.language_code": "nimi toki kepeken nasin ISO", + "status.edit": "o ante", + "status.edited": "ni li ante lon {date}", + "status.embed": "ni o lon insa pi lipu ante", + "status.history.created": "{name} li pali e ni lon {date}", + "status.history.edited": "{name} li ante lon {date}", + "status.load_more": "o kama e ijo ante", + "status.mute": "o kute ala e @{name}", + "status.mute_conversation": "o kute ala e ijo pi toki ni", + "status.show_less": "o lili e ni", + "status.show_less_all": "o lili e ale", + "status.show_more": "o suli e ni", + "status.show_more_all": "o suli e ale", + "status.show_original": "ijo mama pi ijo ni li seme", + "status.unmute_conversation": "o ken kute e ijo pi toki ni", + "timeline_hint.resources.statuses": "ijo pi tenpo suli", + "units.short.million": "{count}AAA", + "upload_error.limit": "ilo li ken ala e suli pi ijo ni.", + "upload_form.audio_description": "o toki e ijo kute tawa jan pi kute ala, tawa jan pi kute lili", + "upload_form.description": "o toki e ijo lukin tawa jan pi lukin ala, tawa jan pi lukin lili", + "upload_form.edit": "o ante", + "upload_form.video_description": "o toki e ijo kute tawa jan pi kute ala, tawa jan pi kute lili, e ijo lukin tawa jan pi lukin ala, tawa jan pi lukin lili", + "upload_modal.choose_image": "sitelen seme", + "upload_modal.description_placeholder": "mi pu jaki tan soweli", + "upload_modal.detect_text": "ilo o alasa e nimi tan sitelen", + "upload_modal.preparing_ocr": "ilo li open e alasa nimi lon sitelen…", + "upload_progress.label": "ilo li kama jo e ijo sina...", + "upload_progress.processing": "ilo li pali…", + "video.mute": "o kalama ala", + "video.pause": "o lape e ni", + "video.unmute": "o kalama" +} diff --git a/config/locales/activerecord.tok.yml b/config/locales/activerecord.tok.yml new file mode 100644 index 0000000000..5623538ba9 --- /dev/null +++ b/config/locales/activerecord.tok.yml @@ -0,0 +1,6 @@ +--- +tok: + activerecord: + attributes: + poll: + expires_at: pini tenpo diff --git a/config/locales/devise.tok.yml b/config/locales/devise.tok.yml new file mode 100644 index 0000000000..d15ecd21b2 --- /dev/null +++ b/config/locales/devise.tok.yml @@ -0,0 +1 @@ +tok: diff --git a/config/locales/doorkeeper.tok.yml b/config/locales/doorkeeper.tok.yml new file mode 100644 index 0000000000..d15ecd21b2 --- /dev/null +++ b/config/locales/doorkeeper.tok.yml @@ -0,0 +1 @@ +tok: diff --git a/config/locales/simple_form.tok.yml b/config/locales/simple_form.tok.yml new file mode 100644 index 0000000000..9c60144bb5 --- /dev/null +++ b/config/locales/simple_form.tok.yml @@ -0,0 +1,14 @@ +--- +tok: + simple_form: + hints: + account: + display_name: nimi sina ale anu nimi sina musi. + labels: + defaults: + expires_in: ona o moli lon + setting_theme: kule lipu + user_role: + name: nimi + required: + text: ni li ken ala lon ala diff --git a/config/locales/tok.yml b/config/locales/tok.yml new file mode 100644 index 0000000000..d15ecd21b2 --- /dev/null +++ b/config/locales/tok.yml @@ -0,0 +1 @@ +tok: From 7efc33b909da0ec8a75521efab4357280a2f40ff Mon Sep 17 00:00:00 2001 From: Claire Date: Wed, 7 Feb 2024 14:35:37 +0100 Subject: [PATCH 085/211] Move HTTP Signature parsing code to its own class (#28932) --- .../activitypub/inboxes_controller.rb | 5 +- .../concerns/signature_verification.rb | 41 +------------- app/lib/signature_parser.rb | 53 +++++++++++++++++++ spec/lib/signature_parser_spec.rb | 34 ++++++++++++ 4 files changed, 91 insertions(+), 42 deletions(-) create mode 100644 app/lib/signature_parser.rb create mode 100644 spec/lib/signature_parser_spec.rb diff --git a/app/controllers/activitypub/inboxes_controller.rb b/app/controllers/activitypub/inboxes_controller.rb index ba85e0a722..e8b0f47cde 100644 --- a/app/controllers/activitypub/inboxes_controller.rb +++ b/app/controllers/activitypub/inboxes_controller.rb @@ -62,11 +62,10 @@ class ActivityPub::InboxesController < ActivityPub::BaseController return if raw_params.blank? || ENV['DISABLE_FOLLOWERS_SYNCHRONIZATION'] == 'true' || signed_request_account.nil? # Re-using the syntax for signature parameters - tree = SignatureParamsParser.new.parse(raw_params) - params = SignatureParamsTransformer.new.apply(tree) + params = SignatureParser.parse(raw_params) ActivityPub::PrepareFollowersSynchronizationService.new.call(signed_request_account, params) - rescue Parslet::ParseFailed + rescue SignatureParser::ParsingError Rails.logger.warn 'Error parsing Collection-Synchronization header' end diff --git a/app/controllers/concerns/signature_verification.rb b/app/controllers/concerns/signature_verification.rb index 92f1eb5a16..3155866271 100644 --- a/app/controllers/concerns/signature_verification.rb +++ b/app/controllers/concerns/signature_verification.rb @@ -12,39 +12,6 @@ module SignatureVerification class SignatureVerificationError < StandardError; end - class SignatureParamsParser < Parslet::Parser - rule(:token) { match("[0-9a-zA-Z!#$%&'*+.^_`|~-]").repeat(1).as(:token) } - rule(:quoted_string) { str('"') >> (qdtext | quoted_pair).repeat.as(:quoted_string) >> str('"') } - # qdtext and quoted_pair are not exactly according to spec but meh - rule(:qdtext) { match('[^\\\\"]') } - rule(:quoted_pair) { str('\\') >> any } - rule(:bws) { match('\s').repeat } - rule(:param) { (token.as(:key) >> bws >> str('=') >> bws >> (token | quoted_string).as(:value)).as(:param) } - rule(:comma) { bws >> str(',') >> bws } - # Old versions of node-http-signature add an incorrect "Signature " prefix to the header - rule(:buggy_prefix) { str('Signature ') } - rule(:params) { buggy_prefix.maybe >> (param >> (comma >> param).repeat).as(:params) } - root(:params) - end - - class SignatureParamsTransformer < Parslet::Transform - rule(params: subtree(:param)) do - (param.is_a?(Array) ? param : [param]).each_with_object({}) { |(key, value), hash| hash[key] = value } - end - - rule(param: { key: simple(:key), value: simple(:val) }) do - [key, val] - end - - rule(quoted_string: simple(:string)) do - string.to_s - end - - rule(token: simple(:string)) do - string.to_s - end - end - def require_account_signature! render json: signature_verification_failure_reason, status: signature_verification_failure_code unless signed_request_account end @@ -135,12 +102,8 @@ module SignatureVerification end def signature_params - @signature_params ||= begin - raw_signature = request.headers['Signature'] - tree = SignatureParamsParser.new.parse(raw_signature) - SignatureParamsTransformer.new.apply(tree) - end - rescue Parslet::ParseFailed + @signature_params ||= SignatureParser.parse(request.headers['Signature']) + rescue SignatureParser::ParsingError raise SignatureVerificationError, 'Error parsing signature parameters' end diff --git a/app/lib/signature_parser.rb b/app/lib/signature_parser.rb new file mode 100644 index 0000000000..c09ab0c841 --- /dev/null +++ b/app/lib/signature_parser.rb @@ -0,0 +1,53 @@ +# frozen_string_literal: true + +class SignatureParser + class ParsingError < StandardError; end + + # The syntax of this header is defined in: + # https://datatracker.ietf.org/doc/html/draft-cavage-http-signatures-12#section-4 + # See https://datatracker.ietf.org/doc/html/rfc7235#appendix-C + # and https://datatracker.ietf.org/doc/html/rfc7230#section-3.2.6 + + # In addition, ignore a `Signature ` string prefix that was added by old versions + # of `node-http-signatures` + + class SignatureParamsParser < Parslet::Parser + rule(:token) { match("[0-9a-zA-Z!#$%&'*+.^_`|~-]").repeat(1).as(:token) } + rule(:quoted_string) { str('"') >> (qdtext | quoted_pair).repeat.as(:quoted_string) >> str('"') } + # qdtext and quoted_pair are not exactly according to spec but meh + rule(:qdtext) { match('[^\\\\"]') } + rule(:quoted_pair) { str('\\') >> any } + rule(:bws) { match('\s').repeat } + rule(:param) { (token.as(:key) >> bws >> str('=') >> bws >> (token | quoted_string).as(:value)).as(:param) } + rule(:comma) { bws >> str(',') >> bws } + # Old versions of node-http-signature add an incorrect "Signature " prefix to the header + rule(:buggy_prefix) { str('Signature ') } + rule(:params) { buggy_prefix.maybe >> (param >> (comma >> param).repeat).as(:params) } + root(:params) + end + + class SignatureParamsTransformer < Parslet::Transform + rule(params: subtree(:param)) do + (param.is_a?(Array) ? param : [param]).each_with_object({}) { |(key, value), hash| hash[key] = value } + end + + rule(param: { key: simple(:key), value: simple(:val) }) do + [key, val] + end + + rule(quoted_string: simple(:string)) do + string.to_s + end + + rule(token: simple(:string)) do + string.to_s + end + end + + def self.parse(raw_signature) + tree = SignatureParamsParser.new.parse(raw_signature) + SignatureParamsTransformer.new.apply(tree) + rescue Parslet::ParseFailed + raise ParsingError + end +end diff --git a/spec/lib/signature_parser_spec.rb b/spec/lib/signature_parser_spec.rb new file mode 100644 index 0000000000..183b486d56 --- /dev/null +++ b/spec/lib/signature_parser_spec.rb @@ -0,0 +1,34 @@ +# frozen_string_literal: true + +require 'rails_helper' + +RSpec.describe SignatureParser do + describe '.parse' do + subject { described_class.parse(header) } + + context 'with Signature headers conforming to draft-cavage-http-signatures-12' do + let(:header) do + # This example signature string deliberately mixes uneven spacing + # and quoting styles to ensure everything is covered + 'keyId = "https://remote.domain/users/bob#main-key",algorithm= rsa-sha256 , headers="host date digest (request-target)",signature="gmhMjgMROGElJU3fpehV2acD5kMHeELi8EFP2UPHOdQ54H0r55AxIpji+J3lPe+N2qSb/4H1KXIh6f0lRu8TGSsu12OQmg5hiO8VA9flcA/mh9Lpk+qwlQZIPRqKP9xUEfqD+Z7ti5wPzDKrWAUK/7FIqWgcT/mlqB1R1MGkpMFc/q4CIs2OSNiWgA4K+Kp21oQxzC2kUuYob04gAZ7cyE/FTia5t08uv6lVYFdRsn4XNPn1MsHgFBwBMRG79ng3SyhoG4PrqBEi5q2IdLq3zfre/M6He3wlCpyO2VJNdGVoTIzeZ0Zz8jUscPV3XtWUchpGclLGSaKaq/JyNZeiYQ=="' # rubocop:disable Layout/LineLength + end + + it 'correctly parses the header' do + expect(subject).to eq({ + 'keyId' => 'https://remote.domain/users/bob#main-key', + 'algorithm' => 'rsa-sha256', + 'headers' => 'host date digest (request-target)', + 'signature' => 'gmhMjgMROGElJU3fpehV2acD5kMHeELi8EFP2UPHOdQ54H0r55AxIpji+J3lPe+N2qSb/4H1KXIh6f0lRu8TGSsu12OQmg5hiO8VA9flcA/mh9Lpk+qwlQZIPRqKP9xUEfqD+Z7ti5wPzDKrWAUK/7FIqWgcT/mlqB1R1MGkpMFc/q4CIs2OSNiWgA4K+Kp21oQxzC2kUuYob04gAZ7cyE/FTia5t08uv6lVYFdRsn4XNPn1MsHgFBwBMRG79ng3SyhoG4PrqBEi5q2IdLq3zfre/M6He3wlCpyO2VJNdGVoTIzeZ0Zz8jUscPV3XtWUchpGclLGSaKaq/JyNZeiYQ==', # rubocop:disable Layout/LineLength + }) + end + end + + context 'with a malformed Signature header' do + let(:header) { 'hello this is malformed!' } + + it 'raises an error' do + expect { subject }.to raise_error(SignatureParser::ParsingError) + end + end + end +end From b2133fee5f365a5be370a08ff61187b5c40c9266 Mon Sep 17 00:00:00 2001 From: Matt Jankowski Date: Wed, 7 Feb 2024 08:37:10 -0500 Subject: [PATCH 086/211] Update artifact preservation to use `save_path` value (#29035) --- .github/workflows/test-ruby.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/test-ruby.yml b/.github/workflows/test-ruby.yml index 4275f59420..7fd259ae01 100644 --- a/.github/workflows/test-ruby.yml +++ b/.github/workflows/test-ruby.yml @@ -224,7 +224,7 @@ jobs: if: failure() with: name: e2e-screenshots - path: tmp/screenshots/ + path: tmp/capybara/ test-search: name: Elastic Search integration testing @@ -328,4 +328,4 @@ jobs: if: failure() with: name: test-search-screenshots - path: tmp/screenshots/ + path: tmp/capybara/ From dbafec88e5abdd1692007450d3f35fc9488afd7b Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 7 Feb 2024 15:10:38 +0100 Subject: [PATCH 087/211] Update dependency @reduxjs/toolkit to v2.1.0 (#28879) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- yarn.lock | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/yarn.lock b/yarn.lock index 75b4c355af..7bfb524907 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2612,11 +2612,11 @@ __metadata: linkType: hard "@reduxjs/toolkit@npm:^2.0.1": - version: 2.0.1 - resolution: "@reduxjs/toolkit@npm:2.0.1" + version: 2.1.0 + resolution: "@reduxjs/toolkit@npm:2.1.0" dependencies: immer: "npm:^10.0.3" - redux: "npm:^5.0.0" + redux: "npm:^5.0.1" redux-thunk: "npm:^3.1.0" reselect: "npm:^5.0.1" peerDependencies: @@ -2627,7 +2627,7 @@ __metadata: optional: true react-redux: optional: true - checksum: 161b9b8e11d9688890ab97b604a4c10c0d41b1369425a5fa821586932db4cd5a391d15799732b3612e6120a6336458ff577ff254219315c05ecd68da5d15fd79 + checksum: 4ea9e9ea8cc2cab1c997127dc332c165cebc55bf8e95812ba4dc40d48dd87d5ee4bf3316b9eab49b5cce056eda6bdcb4b2a7dc3a15f056f64f76134f148f9f10 languageName: node linkType: hard @@ -14068,7 +14068,7 @@ __metadata: languageName: node linkType: hard -"redux@npm:^5.0.0": +"redux@npm:^5.0.1": version: 5.0.1 resolution: "redux@npm:5.0.1" checksum: b10c28357194f38e7d53b760ed5e64faa317cc63de1fb95bc5d9e127fab956392344368c357b8e7a9bedb0c35b111e7efa522210cfdc3b3c75e5074718e9069c From 95da28d201b9a9536331abe1fce6e7e571f3ff4a Mon Sep 17 00:00:00 2001 From: Matt Jankowski Date: Wed, 7 Feb 2024 09:53:29 -0500 Subject: [PATCH 088/211] Add common `ThreadingHelper` module for specs (#29116) --- spec/lib/request_pool_spec.rb | 14 ++++----- spec/models/account_spec.rb | 13 ++------ spec/models/concerns/account/counters_spec.rb | 30 +++++-------------- spec/rails_helper.rb | 1 + spec/services/resolve_account_service_spec.rb | 22 +++++--------- spec/support/threading_helpers.rb | 17 +++++++++++ 6 files changed, 40 insertions(+), 57 deletions(-) create mode 100644 spec/support/threading_helpers.rb diff --git a/spec/lib/request_pool_spec.rb b/spec/lib/request_pool_spec.rb index a31d078327..a82eb5a188 100644 --- a/spec/lib/request_pool_spec.rb +++ b/spec/lib/request_pool_spec.rb @@ -33,18 +33,14 @@ describe RequestPool do subject - threads = Array.new(5) do - Thread.new do - subject.with('http://example.com') do |http_client| - http_client.get('/').flush - # Nudge scheduler to yield and exercise the full pool - sleep(0.01) - end + multi_threaded_execution(5) do + subject.with('http://example.com') do |http_client| + http_client.get('/').flush + # Nudge scheduler to yield and exercise the full pool + sleep(0.01) end end - threads.map(&:join) - expect(subject.size).to be > 1 end diff --git a/spec/models/account_spec.rb b/spec/models/account_spec.rb index 7ef5ca94cc..b1dca52dc5 100644 --- a/spec/models/account_spec.rb +++ b/spec/models/account_spec.rb @@ -1035,19 +1035,10 @@ RSpec.describe Account do it 'increments the count in multi-threaded an environment when account_stat is not yet initialized' do subject - increment_by = 15 - wait_for_start = true - - threads = Array.new(increment_by) do - Thread.new do - true while wait_for_start - described_class.find(subject.id).increment_count!(:followers_count) - end + multi_threaded_execution(15) do + described_class.find(subject.id).increment_count!(:followers_count) end - wait_for_start = false - threads.each(&:join) - expect(subject.reload.followers_count).to eq 15 end end diff --git a/spec/models/concerns/account/counters_spec.rb b/spec/models/concerns/account/counters_spec.rb index 2e1cd700bc..3c063a2fa2 100644 --- a/spec/models/concerns/account/counters_spec.rb +++ b/spec/models/concerns/account/counters_spec.rb @@ -6,6 +6,8 @@ describe Account::Counters do let!(:account) { Fabricate(:account) } describe '#increment_count!' do + let(:increment_by) { 15 } + it 'increments the count' do expect(account.followers_count).to eq 0 account.increment_count!(:followers_count) @@ -13,24 +15,17 @@ describe Account::Counters do end it 'increments the count in multi-threaded an environment' do - increment_by = 15 - wait_for_start = true - - threads = Array.new(increment_by) do - Thread.new do - true while wait_for_start - account.increment_count!(:statuses_count) - end + multi_threaded_execution(increment_by) do + account.increment_count!(:statuses_count) end - wait_for_start = false - threads.each(&:join) - expect(account.statuses_count).to eq increment_by end end describe '#decrement_count!' do + let(:decrement_by) { 10 } + it 'decrements the count' do account.followers_count = 15 account.save! @@ -40,22 +35,13 @@ describe Account::Counters do end it 'decrements the count in multi-threaded an environment' do - decrement_by = 10 - wait_for_start = true - account.statuses_count = 15 account.save! - threads = Array.new(decrement_by) do - Thread.new do - true while wait_for_start - account.decrement_count!(:statuses_count) - end + multi_threaded_execution(decrement_by) do + account.decrement_count!(:statuses_count) end - wait_for_start = false - threads.each(&:join) - expect(account.statuses_count).to eq 5 end end diff --git a/spec/rails_helper.rb b/spec/rails_helper.rb index 5125339096..cde5a439db 100644 --- a/spec/rails_helper.rb +++ b/spec/rails_helper.rb @@ -86,6 +86,7 @@ RSpec.configure do |config| config.include ActiveSupport::Testing::TimeHelpers config.include Chewy::Rspec::Helpers config.include Redisable + config.include ThreadingHelpers config.include SignedRequestHelpers, type: :request config.include CommandLineHelpers, type: :cli diff --git a/spec/services/resolve_account_service_spec.rb b/spec/services/resolve_account_service_spec.rb index 1c4c3b4016..b82e5b3865 100644 --- a/spec/services/resolve_account_service_spec.rb +++ b/spec/services/resolve_account_service_spec.rb @@ -219,27 +219,19 @@ RSpec.describe ResolveAccountService, type: :service do end it 'processes one remote account at a time using locks' do - wait_for_start = true fail_occurred = false return_values = Concurrent::Array.new - threads = Array.new(5) do - Thread.new do - true while wait_for_start - - begin - return_values << described_class.new.call('foo@ap.example.com') - rescue ActiveRecord::RecordNotUnique - fail_occurred = true - ensure - RedisConfiguration.pool.checkin if Thread.current[:redis] - end + multi_threaded_execution(5) do + begin + return_values << described_class.new.call('foo@ap.example.com') + rescue ActiveRecord::RecordNotUnique + fail_occurred = true + ensure + RedisConfiguration.pool.checkin if Thread.current[:redis] end end - wait_for_start = false - threads.each(&:join) - expect(fail_occurred).to be false expect(return_values).to_not include(nil) end diff --git a/spec/support/threading_helpers.rb b/spec/support/threading_helpers.rb new file mode 100644 index 0000000000..edf45822ca --- /dev/null +++ b/spec/support/threading_helpers.rb @@ -0,0 +1,17 @@ +# frozen_string_literal: true + +module ThreadingHelpers + def multi_threaded_execution(thread_count) + wait_for_start = true + + threads = Array.new(thread_count) do + Thread.new do + true while wait_for_start + yield + end + end + + wait_for_start = false + threads.each(&:join) + end +end From 79b4b94f3a3ec0ee7d81acf152e66b802e250b39 Mon Sep 17 00:00:00 2001 From: Matt Jankowski Date: Wed, 7 Feb 2024 09:54:40 -0500 Subject: [PATCH 089/211] Configure `CountAsOne` value for `RSpec/ExampleLength` cop (#29115) --- .rubocop.yml | 5 +++++ .rubocop_todo.yml | 2 +- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/.rubocop.yml b/.rubocop.yml index 330c40de1b..a8310489ea 100644 --- a/.rubocop.yml +++ b/.rubocop.yml @@ -134,6 +134,11 @@ Rails/UnusedIgnoredColumns: Rails/NegateInclude: Enabled: false +# Reason: Enforce default limit, but allow some elements to span lines +# https://docs.rubocop.org/rubocop-rspec/cops_rspec.html#rspecexamplelength +RSpec/ExampleLength: + CountAsOne: ['array', 'heredoc', 'method_call'] + # Reason: Deprecated cop, will be removed in 3.0, replaced by SpecFilePathFormat # https://docs.rubocop.org/rubocop-rspec/cops_rspec.html#rspecfilepath RSpec/FilePath: diff --git a/.rubocop_todo.yml b/.rubocop_todo.yml index 09e9fd73d8..11ac570836 100644 --- a/.rubocop_todo.yml +++ b/.rubocop_todo.yml @@ -36,7 +36,7 @@ Metrics/PerceivedComplexity: # Configuration parameters: CountAsOne. RSpec/ExampleLength: - Max: 22 + Max: 20 # Override default of 5 RSpec/MultipleExpectations: Max: 7 From eff447a4554e5285f5869432e1ea9e1ca884a806 Mon Sep 17 00:00:00 2001 From: Claire Date: Wed, 7 Feb 2024 18:24:42 +0100 Subject: [PATCH 090/211] Rewrite signature verification using regexps and `StringScanner` (#29133) --- app/lib/signature_parser.rb | 47 +++++++++++-------------------- spec/lib/signature_parser_spec.rb | 4 +-- 2 files changed, 19 insertions(+), 32 deletions(-) diff --git a/app/lib/signature_parser.rb b/app/lib/signature_parser.rb index c09ab0c841..7a75080d98 100644 --- a/app/lib/signature_parser.rb +++ b/app/lib/signature_parser.rb @@ -11,43 +11,30 @@ class SignatureParser # In addition, ignore a `Signature ` string prefix that was added by old versions # of `node-http-signatures` - class SignatureParamsParser < Parslet::Parser - rule(:token) { match("[0-9a-zA-Z!#$%&'*+.^_`|~-]").repeat(1).as(:token) } - rule(:quoted_string) { str('"') >> (qdtext | quoted_pair).repeat.as(:quoted_string) >> str('"') } - # qdtext and quoted_pair are not exactly according to spec but meh - rule(:qdtext) { match('[^\\\\"]') } - rule(:quoted_pair) { str('\\') >> any } - rule(:bws) { match('\s').repeat } - rule(:param) { (token.as(:key) >> bws >> str('=') >> bws >> (token | quoted_string).as(:value)).as(:param) } - rule(:comma) { bws >> str(',') >> bws } + TOKEN_RE = /[0-9a-zA-Z!#$%&'*+.^_`|~-]+/ + # qdtext and quoted_pair are not exactly according to spec but meh + QUOTED_STRING_RE = /"([^\\"]|(\\.))*"/ + PARAM_RE = /(?#{TOKEN_RE})\s*=\s*((?#{TOKEN_RE})|(?#{QUOTED_STRING_RE}))/ + + def self.parse(raw_signature) # Old versions of node-http-signature add an incorrect "Signature " prefix to the header - rule(:buggy_prefix) { str('Signature ') } - rule(:params) { buggy_prefix.maybe >> (param >> (comma >> param).repeat).as(:params) } - root(:params) - end + raw_signature = raw_signature.delete_prefix('Signature ') - class SignatureParamsTransformer < Parslet::Transform - rule(params: subtree(:param)) do - (param.is_a?(Array) ? param : [param]).each_with_object({}) { |(key, value), hash| hash[key] = value } - end + params = {} + scanner = StringScanner.new(raw_signature) - rule(param: { key: simple(:key), value: simple(:val) }) do - [key, val] - end + # Use `skip` instead of `scan` as we only care about the subgroups + while scanner.skip(PARAM_RE) + # This is not actually correct with regards to quoted pairs, but it's consistent + # with our previous implementation, and good enough in practice. + params[scanner[:key]] = scanner[:value] || scanner[:quoted_value][1...-1] - rule(quoted_string: simple(:string)) do - string.to_s - end + scanner.skip(/\s*/) + return params if scanner.eos? - rule(token: simple(:string)) do - string.to_s + raise ParsingError unless scanner.skip(/\s*,\s*/) end - end - def self.parse(raw_signature) - tree = SignatureParamsParser.new.parse(raw_signature) - SignatureParamsTransformer.new.apply(tree) - rescue Parslet::ParseFailed raise ParsingError end end diff --git a/spec/lib/signature_parser_spec.rb b/spec/lib/signature_parser_spec.rb index 183b486d56..08e9bea66c 100644 --- a/spec/lib/signature_parser_spec.rb +++ b/spec/lib/signature_parser_spec.rb @@ -10,12 +10,12 @@ RSpec.describe SignatureParser do let(:header) do # This example signature string deliberately mixes uneven spacing # and quoting styles to ensure everything is covered - 'keyId = "https://remote.domain/users/bob#main-key",algorithm= rsa-sha256 , headers="host date digest (request-target)",signature="gmhMjgMROGElJU3fpehV2acD5kMHeELi8EFP2UPHOdQ54H0r55AxIpji+J3lPe+N2qSb/4H1KXIh6f0lRu8TGSsu12OQmg5hiO8VA9flcA/mh9Lpk+qwlQZIPRqKP9xUEfqD+Z7ti5wPzDKrWAUK/7FIqWgcT/mlqB1R1MGkpMFc/q4CIs2OSNiWgA4K+Kp21oQxzC2kUuYob04gAZ7cyE/FTia5t08uv6lVYFdRsn4XNPn1MsHgFBwBMRG79ng3SyhoG4PrqBEi5q2IdLq3zfre/M6He3wlCpyO2VJNdGVoTIzeZ0Zz8jUscPV3XtWUchpGclLGSaKaq/JyNZeiYQ=="' # rubocop:disable Layout/LineLength + 'keyId = "https://remote.domain/users/bob#main-key,",algorithm= rsa-sha256 , headers="host date digest (request-target)",signature="gmhMjgMROGElJU3fpehV2acD5kMHeELi8EFP2UPHOdQ54H0r55AxIpji+J3lPe+N2qSb/4H1KXIh6f0lRu8TGSsu12OQmg5hiO8VA9flcA/mh9Lpk+qwlQZIPRqKP9xUEfqD+Z7ti5wPzDKrWAUK/7FIqWgcT/mlqB1R1MGkpMFc/q4CIs2OSNiWgA4K+Kp21oQxzC2kUuYob04gAZ7cyE/FTia5t08uv6lVYFdRsn4XNPn1MsHgFBwBMRG79ng3SyhoG4PrqBEi5q2IdLq3zfre/M6He3wlCpyO2VJNdGVoTIzeZ0Zz8jUscPV3XtWUchpGclLGSaKaq/JyNZeiYQ=="' # rubocop:disable Layout/LineLength end it 'correctly parses the header' do expect(subject).to eq({ - 'keyId' => 'https://remote.domain/users/bob#main-key', + 'keyId' => 'https://remote.domain/users/bob#main-key,', 'algorithm' => 'rsa-sha256', 'headers' => 'host date digest (request-target)', 'signature' => 'gmhMjgMROGElJU3fpehV2acD5kMHeELi8EFP2UPHOdQ54H0r55AxIpji+J3lPe+N2qSb/4H1KXIh6f0lRu8TGSsu12OQmg5hiO8VA9flcA/mh9Lpk+qwlQZIPRqKP9xUEfqD+Z7ti5wPzDKrWAUK/7FIqWgcT/mlqB1R1MGkpMFc/q4CIs2OSNiWgA4K+Kp21oQxzC2kUuYob04gAZ7cyE/FTia5t08uv6lVYFdRsn4XNPn1MsHgFBwBMRG79ng3SyhoG4PrqBEi5q2IdLq3zfre/M6He3wlCpyO2VJNdGVoTIzeZ0Zz8jUscPV3XtWUchpGclLGSaKaq/JyNZeiYQ==', # rubocop:disable Layout/LineLength From 2a362d62a81a5ec54f15cced02e1d197636d1773 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Thu, 8 Feb 2024 10:43:02 +0100 Subject: [PATCH 091/211] New Crowdin Translations (automated) (#29145) Co-authored-by: GitHub Actions --- app/javascript/mastodon/locales/sk.json | 5 ++ app/javascript/mastodon/locales/tok.json | 73 ++++++++++++++++++++++-- config/locales/devise.lad.yml | 22 +++---- config/locales/lad.yml | 4 +- config/locales/simple_form.tok.yml | 3 + config/locales/sk.yml | 5 ++ 6 files changed, 95 insertions(+), 17 deletions(-) diff --git a/app/javascript/mastodon/locales/sk.json b/app/javascript/mastodon/locales/sk.json index b91c45bb29..7a05eb4f7e 100644 --- a/app/javascript/mastodon/locales/sk.json +++ b/app/javascript/mastodon/locales/sk.json @@ -277,6 +277,7 @@ "follow_request.authorize": "Povoľ prístup", "follow_request.reject": "Odmietni", "follow_requests.unlocked_explanation": "Síce Váš učet nie je uzamknutý, ale {domain} tím si myslel že môžete chcieť skontrolovať žiadosti o sledovanie z týchto účtov manuálne.", + "follow_suggestions.curated_suggestion": "Výber zo servera", "follow_suggestions.dismiss": "Znovu nezobrazuj", "follow_suggestions.personalized_suggestion": "Prispôsobené odporúčania", "follow_suggestions.view_all": "Zobraz všetky", @@ -521,8 +522,12 @@ "poll_button.add_poll": "Pridaj anketu", "poll_button.remove_poll": "Odstráň anketu", "privacy.change": "Uprav súkromie príspevku", + "privacy.direct.short": "Konkrétni ľudia", + "privacy.private.long": "Iba tvoji nasledovatelia", "privacy.private.short": "Sledovatelia", + "privacy.public.long": "Ktokoľvek na, aj mimo Mastodonu", "privacy.public.short": "Verejné", + "privacy.unlisted.short": "Verejný v tichosti", "privacy_policy.last_updated": "Posledná úprava {date}", "privacy_policy.title": "Zásady súkromia", "recommended": "Odporúčané", diff --git a/app/javascript/mastodon/locales/tok.json b/app/javascript/mastodon/locales/tok.json index a0227969dd..1c84356238 100644 --- a/app/javascript/mastodon/locales/tok.json +++ b/app/javascript/mastodon/locales/tok.json @@ -1,9 +1,11 @@ { + "about.blocks": "ma lawa", "about.contact": "toki:", "about.domain_blocks.no_reason_available": "mi sona ala e tan", "about.not_available": "lon kulupu ni la sina ken alasa ala e sona ni.", "about.rules": "lawa kulupu", "account.account_note_header": "sona awen", + "account.badges.group": "kulupu", "account.block": "o weka e @{name}", "account.block_domain": "o weka e ma {domain}", "account.block_short": "o weka e jan", @@ -29,6 +31,7 @@ "account.hide_reblogs": "o lukin ala e pana toki tan @{name}", "account.languages": "sina wile lukin e sitelen pi toki seme", "account.locked_info": "sina wile kute e jan ni la ona o toki e ken", + "account.media": "sitelen", "account.mention": "o toki e jan @{name}", "account.moved_to": "lipu jan sin pi jan {name} li ni:", "account.mute": "o kute ala e @{name}", @@ -36,17 +39,25 @@ "account.mute_short": "o kute ala", "account.muted": "sina kute ala e jan ni", "account.no_bio": "lipu li weka", + "account.open_original_page": "o open e lipu open", "account.posts": "toki suli", "account.posts_with_replies": "toki ale", "account.report": "jan @{name} la o toki e lawa", "account.requested": "jan ni o ken e kute sina. sina pini wile kute la o luka e ni", "account.requested_follow": "{name} li wile kute e sina", + "account.share": "o pana e lipu jan @{name}", "account.show_reblogs": "o lukin e pana toki tan @{name}", + "account.unblock": "o weka ala e jan {name}", + "account.unblock_domain": "o weka ala e ma {domain}", "account.unblock_short": "o pini weka", "account.unfollow": "o pini kute", - "account.unmute": "o ken lukin e sitelen tan @{name}", + "account.unmute": "o kute e @{name}", "account.unmute_notifications_short": "o kute e mu tan jan ni", "account.unmute_short": "o ken kute e jan ni", + "admin.dashboard.retention.average": "sama", + "admin.dashboard.retention.cohort": "tenpo mun open", + "admin.dashboard.retention.cohort_size": "jan sin", + "alert.rate_limited.message": "tenpo {retry_time, time, medium} la o pali awen", "alert.unexpected.message": "pakala li lon", "alert.unexpected.title": "pakala", "announcement.announcement": "toki suli", @@ -56,14 +67,21 @@ "bundle_column_error.retry": "o ni sin", "bundle_column_error.routing.body": "ilo li sona ala e lipu wile. sina pana ala pana e nasin pona tawa lipu?", "bundle_column_error.routing.title": "pakala nanpa 404", + "bundle_modal_error.close": "o pini", "bundle_modal_error.message": "ilo li wile kama e ijo ni, taso pakala li lon.", "bundle_modal_error.retry": "o ni sin", + "closed_registrations_modal.find_another_server": "o alasa e ma ante", + "column.blocks": "kulupu pi jan weka", + "column.lists": "lipu pi lipu mute", "column.mutes": "sina wile ala kute e jan ni", + "community.column_settings.local_only": "toki lon ni taso", + "community.column_settings.media_only": "sitelen taso", "compose.language.change": "o ante e nasin toki", "compose.language.search": "o alasa e nasin toki...", + "compose.published.open": "o lukin", "compose.saved.body": "ilo li awen e ijo pana sina.", "compose_form.direct_message_warning_learn_more": "o kama sona e ijo ante", - "compose_form.placeholder": "o toki", + "compose_form.placeholder": "sina toki insa e seme", "compose_form.poll.option_placeholder": "ken nanpa {number}", "compose_form.poll.switch_to_multiple": "o ante e nasin pana. pana mute o ken", "compose_form.poll.switch_to_single": "o ante e nasin pana. pana wan taso o lon", @@ -72,6 +90,8 @@ "compose_form.reply": "o toki lon ijo ni", "compose_form.save_changes": "o sin e ni", "compose_form.spoiler.marked": "o weka e toki pi ijo ike ken", + "confirmations.block.confirm": "o weka.", + "confirmations.block.message": "sina o wile ala wile weka e jan {name}?", "confirmations.cancel_follow_request.confirm": "o weka e wile sina", "confirmations.cancel_follow_request.message": "sina awen ala awen wile weka e wile kute sina lon {name}?", "confirmations.delete.confirm": "o pakala", @@ -79,12 +99,16 @@ "confirmations.delete_list.confirm": "o pakala", "confirmations.delete_list.message": "sina wile ala wile pakala e lipu ni", "confirmations.discard_edit_media.confirm": "o weka", + "confirmations.domain_block.confirm": "o weka.", "confirmations.edit.confirm": "o ante", "confirmations.logout.confirm": "o weka", "confirmations.logout.message": "sina wile ala wile weka", "confirmations.mute.confirm": "sina wile ala kute e jan ni", "confirmations.mute.message": "sina awen ala awen wile kute ala e {name}?", "confirmations.redraft.confirm": "o pakala o pali sin e toki", + "confirmations.unfollow.confirm": "o pini kute", + "confirmations.unfollow.message": "sina o wile ala wile pini kute e jan {name}?", + "conversation.delete": "o weka e toki ni", "conversation.mark_as_read": "ni o sin ala", "conversation.open": "o lukin e toki", "conversation.with": "lon {names}", @@ -102,6 +126,7 @@ "emoji_button.symbols": "sitelen", "emoji_button.travel": "ma en tawa", "empty_column.account_timeline": "toki ala li lon!", + "empty_column.account_unavailable": "ken ala lukin e lipu jan", "empty_column.followed_tags": "sina alasa ala e toki ꞏ sina alasa e toki la toki li lon ni", "empty_column.hashtag": "ala li lon toki ni", "empty_column.mutes": "jan ala la sina wile ala kute.", @@ -110,36 +135,73 @@ "explore.title": "o alasa", "explore.trending_links": "sin", "explore.trending_statuses": "toki", + "filter_modal.select_filter.expired": "tenpo pini", "filter_modal.select_filter.search": "o alasa anu pali", "firehose.all": "ale", "firehose.local": "ilo ni", "firehose.remote": "ilo ante", + "follow_request.authorize": "o sina kama", + "follow_request.reject": "o weka", "follow_suggestions.view_all": "o lukin e ale", "footer.privacy_policy": "lawa len", "footer.source_code": "o lukin e toki ilo", "footer.status": "lon", + "hashtag.column_header.tag_mode.all": "en {additional}", + "hashtag.column_header.tag_mode.any": "anu {additional}", "hashtag.column_settings.tag_mode.all": "ale ni", "hashtag.column_settings.tag_mode.any": "wan ni", "hashtag.column_settings.tag_mode.none": "ala ni", "home.pending_critical_update.link": "o lukin e ijo ilo sin", + "interaction_modal.on_another_server": "lon ma ante", + "interaction_modal.on_this_server": "lon ma ni", "interaction_modal.title.follow": "o kute e {name}", "keyboard_shortcuts.muted": "sina wile ala kute e jan la o lukin e ona ale", + "keyboard_shortcuts.open_media": "o open e sitelen", + "keyboard_shortcuts.toggle_sensitivity": "sitelen la o len anu lukin", + "lightbox.close": "o pini", + "link_preview.author": "{name} li pali e ni", "lists.edit.submit": "o ante e nimi", - "mute_modal.duration": "tenpo seme", + "lists.replies_policy.none": "jan ala", + "mute_modal.duration": "tenpo", "mute_modal.indefinite": "tenpo ale", "navigation_bar.filters": "sina wile ala kute e nimi ni", "navigation_bar.mutes": "sina wile ala kute e jan ni", + "notification.follow": "jan {name} li kama kute e sina", + "notification.follow_request": "{name} li wile kute e sina", + "notification.mention": "jan {name} li toki e sina", + "notifications.column_settings.follow": "jan kute sin", + "notifications.filter.all": "ale", + "onboarding.start.title": "sina o kama pona a!", + "privacy.public.short": "jan ale", + "relative_time.full.just_now": "tenpo ni", + "relative_time.just_now": "tenpo ni", + "relative_time.today": "tenpo suno ni", + "report.block": "o weka e jan", "report.block_explanation": "sina kama lukin ala e toki ona. ona li kama ala ken lukin e toki sina li kama ala ken kute e sina. ona li ken sona e kama ni.", "report.category.title": "ike seme li lon {type} ni", + "report.close": "o pini", "report.mute": "o kute ala e ona", "report.mute_explanation": "sina kama ala lukin e ijo pana ona. ona li awen ken kute e sina li awen ken lukin e sina li sona ala e weka kute sina e weka lukin sina.", + "report.reasons.dislike": "ni li ike tawa mi", + "report.thanks.title": "sina wile ala lukin e ni anu seme?", + "search.placeholder": "o alasa", + "search.quick_action.go_to_account": "o tawa lipu jan {x}", "search_popout.language_code": "nimi toki kepeken nasin ISO", + "search_results.all": "ale", + "search_results.see_all": "ale", + "search_results.statuses": "toki", + "search_results.title": "o alasa e {q}", + "status.block": "o weka e @{name}", + "status.delete": "o weka", "status.edit": "o ante", "status.edited": "ni li ante lon {date}", "status.embed": "ni o lon insa pi lipu ante", "status.history.created": "{name} li pali e ni lon {date}", "status.history.edited": "{name} li ante lon {date}", "status.load_more": "o kama e ijo ante", + "status.media.open": "o open", + "status.media.show": "o lukin", + "status.media_hidden": "sitelen li len", "status.mute": "o kute ala e @{name}", "status.mute_conversation": "o kute ala e ijo pi toki ni", "status.show_less": "o lili e ni", @@ -147,6 +209,7 @@ "status.show_more": "o suli e ni", "status.show_more_all": "o suli e ale", "status.show_original": "ijo mama pi ijo ni li seme", + "status.uncached_media_warning": "lukin lili li weka", "status.unmute_conversation": "o ken kute e ijo pi toki ni", "timeline_hint.resources.statuses": "ijo pi tenpo suli", "units.short.million": "{count}AAA", @@ -155,12 +218,14 @@ "upload_form.description": "o toki e ijo lukin tawa jan pi lukin ala, tawa jan pi lukin lili", "upload_form.edit": "o ante", "upload_form.video_description": "o toki e ijo kute tawa jan pi kute ala, tawa jan pi kute lili, e ijo lukin tawa jan pi lukin ala, tawa jan pi lukin lili", - "upload_modal.choose_image": "sitelen seme", + "upload_modal.choose_image": "o wile e sitelen", "upload_modal.description_placeholder": "mi pu jaki tan soweli", "upload_modal.detect_text": "ilo o alasa e nimi tan sitelen", + "upload_modal.edit_media": "o ante e sitelen", "upload_modal.preparing_ocr": "ilo li open e alasa nimi lon sitelen…", "upload_progress.label": "ilo li kama jo e ijo sina...", "upload_progress.processing": "ilo li pali…", + "username.taken": "jan ante li jo e nimi ni. sina o pali e nimi sin.", "video.mute": "o kalama ala", "video.pause": "o lape e ni", "video.unmute": "o kalama" diff --git a/config/locales/devise.lad.yml b/config/locales/devise.lad.yml index 88099f48c4..d2ce53760c 100644 --- a/config/locales/devise.lad.yml +++ b/config/locales/devise.lad.yml @@ -89,25 +89,25 @@ lad: no_token: No puedes akseder a esta pajina si no vienes dizde una posta elektronika de restablesimyento de kod. Si vienes dizde una posta elektronika de restablesimyento de kod, por favor asigurate de utilizar el URL kompleto embiado. send_instructions: Si tu adreso de posta elektronika existe en muestra baza de datos, risiviras un atadijo de rekuperasyon de kod en tu adreso de posta elektronika en pokos minutos. Por favor, komprova tu kuti de posta spam si no risives akeya posta elektronika. send_paranoid_instructions: Si tu adreso de posta elektronika existe en muestra baza de datos, risiviras un atadijo de rekuperasyon de kod en tu adreso de posta elektronika en pokos minutos. Por favor, komprova tu kuti de posta no deseado si no risives akeya posta elektronika. - updated: Tu kod a sido trokado kon reusho. Tyenes entrado en kuento. - updated_not_active: Tu kod se tiene trokado kon reusho. + updated: Tu kod a sido trokado kon reushita. Tyenes entrado en kuento. + updated_not_active: Tu kod se tiene trokado kon reushita. registrations: - destroyed: Tu kuento a sido efasado kon reusho. Asperamos verte de muevo pronto. + destroyed: Tu kuento a sido efasado kon reushita. Asperamos verte de muevo pronto. signed_up: Bienvenido! Te tienes enrejistrado djustamente. - signed_up_but_inactive: Te tienes enrejistrado kon reusho. Entanto, no se pudio inisyar sesyon porke tu kuento ainda no esta aktivado. - signed_up_but_locked: Te tienes enrejistrado kon reusho. Entanto, no pudites konektarte kon tu kuento porke tu kuento esta blokado. + signed_up_but_inactive: Te tienes enrejistrado kon reushita. Entanto, no se pudio inisyar sesyon porke tu kuento ainda no esta aktivado. + signed_up_but_locked: Te tienes enrejistrado kon reushita. Entanto, no pudites konektarte kon tu kuento porke tu kuento esta blokado. signed_up_but_pending: Un mesaj kon un atadijo de konfirmasyon a sido enviado a tu adreso de posta elektronika. Dempues de klikar en el atadijo, revizaremos tu solisitud. Seras avizado si se acheta. signed_up_but_unconfirmed: Un mesaj kon un atadijo de konfirmasyon a sido enviado a tu adreso de posta elektronika. Por favor, sigue el atadijo para aktivar tu kuento. Por favor, komprova tu kuti de posta spam si no risives akeya posta elektronika. - update_needs_confirmation: Tienes aktualizado tu kuento kon reusho, pero kale verifikar tu muevo adreso de posta elektronika. Por favor, komprova tu posta elektronika i sige el atadijo de konfirmasyon para konfirmar tu muevo adreso de posta elektronika. Por favor, komprova tu kuti de posta spam si no risives akeya posta elektronika. - updated: Tu kuento se aktualizo kon reusho. + update_needs_confirmation: Tienes aktualizado tu kuento kon reushita, pero kale verifikar tu muevo adreso de posta elektronika. Por favor, komprova tu posta elektronika i sige el atadijo de konfirmasyon para konfirmar tu muevo adreso de posta elektronika. Por favor, komprova tu kuti de posta spam si no risives akeya posta elektronika. + updated: Tu kuento se aktualizo kon reushita. sessions: - already_signed_out: Salites del kuento kon reusho. - signed_in: Konektates kon tu kuento kon reusho. - signed_out: Salites del kuento kon reusho. + already_signed_out: Salites del kuento kon reushita. + signed_in: Konektates kon tu kuento kon reushita. + signed_out: Salites del kuento kon reushita. unlocks: send_instructions: En unos minutos risiviras una posta elektronika kon instruksyones para dezblokar tu kuento. Por favor, komprova tu kuti de posta spam si no risives akeya posta elektronika. send_paranoid_instructions: Si tu kuento existe, en unos minutos risiviras una posta elektronika kon instruksyones para dezblokarlo. Por favor, reviza tu kuti de posta spam si no risives akeya posta elektronika. - unlocked: Tu kuento fue dezblokado kon reusho. Por favor, konektate kon tu kuento para kontinuar. + unlocked: Tu kuento fue dezblokado kon reushita. Por favor, konektate kon tu kuento para kontinuar. errors: messages: already_confirmed: ya estaba konfirmado, por favor aprova konektarte kon tu kuento diff --git a/config/locales/lad.yml b/config/locales/lad.yml index d4f772095e..77501e3b32 100644 --- a/config/locales/lad.yml +++ b/config/locales/lad.yml @@ -1146,7 +1146,7 @@ lad: confirm_password: Eskrive tu kod aktual para demostrar tu identita confirm_username: Eskrive tu nombre de utilizador para konfirmar proceed: Efasa kuento - success_msg: Tu kuento fue efasado kon reusho + success_msg: Tu kuento fue efasado kon reushita warning: before: 'Antes de kontinuar, por favor melda kon atensyon las sigientes notas:' caches: El kontenido ke tiene sido magazinado en kashe por otros sirvidores puede persistir @@ -1283,7 +1283,7 @@ lad: one: "%{count} elemento ke koenside con tu bushkeda esta eskojido." other: Todos los %{count} elementos ke koensiden con tu bushkeda estan eskojidos. cancel: Anula - changes_saved_msg: Trokamientos guadrados kon reusho! + changes_saved_msg: Trokamientos guadrados kon reushita! confirm: Konfirma copy: Kopia delete: Efasa diff --git a/config/locales/simple_form.tok.yml b/config/locales/simple_form.tok.yml index 9c60144bb5..1eb7d5be87 100644 --- a/config/locales/simple_form.tok.yml +++ b/config/locales/simple_form.tok.yml @@ -4,6 +4,9 @@ tok: hints: account: display_name: nimi sina ale anu nimi sina musi. + defaults: + setting_display_media_hide_all: tenpo ale la, o weka e sitelen + setting_display_media_show_all: tenpo ale la, o awen e sitelen labels: defaults: expires_in: ona o moli lon diff --git a/config/locales/sk.yml b/config/locales/sk.yml index 5ffbf45bde..f13a15d795 100644 --- a/config/locales/sk.yml +++ b/config/locales/sk.yml @@ -260,6 +260,11 @@ sk: suspend_account_html: "%{name} zablokoval/a účet používateľa %{target}" unassigned_report_html: "%{name} odobral/a report od %{target}" unsuspend_account_html: "%{name} spojazdnil/a účet %{target}" + update_announcement_html: "%{name} aktualizoval/a oboznámenie %{target}" + update_custom_emoji_html: "%{name} aktualizoval/a emotikonu %{target}" + update_domain_block_html: "%{name} aktualizoval/a blokovanie domény pre %{target}" + update_ip_block_html: "%{name} zmenil/a pravidlo pre IP %{target}" + update_status_html: "%{name} aktualizoval/a príspevok od %{target}" update_user_role_html: "%{name} zmenil/a rolu pre %{target}" deleted_account: zmazaný účet empty: Žiadne záznamy nenájdené. From 52986f35b87d97b71e99536b01f41f7a77ca5ec6 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Thu, 8 Feb 2024 10:49:24 +0100 Subject: [PATCH 092/211] Update dependency postcss to v8.4.35 (#29136) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- yarn.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/yarn.lock b/yarn.lock index 7bfb524907..fb34729048 100644 --- a/yarn.lock +++ b/yarn.lock @@ -13144,13 +13144,13 @@ __metadata: linkType: hard "postcss@npm:^8.2.15, postcss@npm:^8.4.24, postcss@npm:^8.4.33": - version: 8.4.34 - resolution: "postcss@npm:8.4.34" + version: 8.4.35 + resolution: "postcss@npm:8.4.35" dependencies: nanoid: "npm:^3.3.7" picocolors: "npm:^1.0.0" source-map-js: "npm:^1.0.2" - checksum: 4d6f072cdfdc1ced16b4336263d830f8b4397fc47b9b382e02f6448fda9386d881aa9d27fbe0dd124f59c76f3a5da4f360919d25dfc818eca50b48f042af35a8 + checksum: e8dd04e48001eb5857abc9475365bf08f4e508ddf9bc0b8525449a95d190f10d025acebc5b56ac2e94b3c7146790e4ae78989bb9633cb7ee20d1cc9b7dc909b2 languageName: node linkType: hard From 5271131658181bd94eb8a57cc877ef281855e132 Mon Sep 17 00:00:00 2001 From: Matt Jankowski Date: Thu, 8 Feb 2024 05:02:53 -0500 Subject: [PATCH 093/211] Extract helper method for repeated form fill in admin/domain_blocks feature spec (#29128) --- spec/features/admin/domain_blocks_spec.rb | 31 +++++++++++++---------- 1 file changed, 17 insertions(+), 14 deletions(-) diff --git a/spec/features/admin/domain_blocks_spec.rb b/spec/features/admin/domain_blocks_spec.rb index 6a1405cdf6..99aa7cf1a7 100644 --- a/spec/features/admin/domain_blocks_spec.rb +++ b/spec/features/admin/domain_blocks_spec.rb @@ -12,9 +12,7 @@ describe 'blocking domains through the moderation interface' do it 'adds a new domain block' do visit new_admin_domain_block_path - fill_in 'domain_block_domain', with: 'example.com' - select I18n.t('admin.domain_blocks.new.severity.silence'), from: 'domain_block_severity' - click_on I18n.t('admin.domain_blocks.new.create') + submit_domain_block('example.com', 'silence') expect(DomainBlock.exists?(domain: 'example.com', severity: 'silence')).to be true expect(DomainBlockWorker).to have_received(:perform_async) @@ -25,9 +23,7 @@ describe 'blocking domains through the moderation interface' do it 'presents a confirmation screen before suspending the domain' do visit new_admin_domain_block_path - fill_in 'domain_block_domain', with: 'example.com' - select I18n.t('admin.domain_blocks.new.severity.suspend'), from: 'domain_block_severity' - click_on I18n.t('admin.domain_blocks.new.create') + submit_domain_block('example.com', 'suspend') # It doesn't immediately block but presents a confirmation screen expect(page).to have_title(I18n.t('admin.domain_blocks.confirm_suspension.title', domain: 'example.com')) @@ -47,9 +43,7 @@ describe 'blocking domains through the moderation interface' do visit new_admin_domain_block_path - fill_in 'domain_block_domain', with: 'example.com' - select I18n.t('admin.domain_blocks.new.severity.suspend'), from: 'domain_block_severity' - click_on I18n.t('admin.domain_blocks.new.create') + submit_domain_block('example.com', 'suspend') # It doesn't immediately block but presents a confirmation screen expect(page).to have_title(I18n.t('admin.domain_blocks.confirm_suspension.title', domain: 'example.com')) @@ -69,9 +63,7 @@ describe 'blocking domains through the moderation interface' do visit new_admin_domain_block_path - fill_in 'domain_block_domain', with: 'subdomain.example.com' - select I18n.t('admin.domain_blocks.new.severity.suspend'), from: 'domain_block_severity' - click_on I18n.t('admin.domain_blocks.new.create') + submit_domain_block('subdomain.example.com', 'suspend') # It doesn't immediately block but presents a confirmation screen expect(page).to have_title(I18n.t('admin.domain_blocks.confirm_suspension.title', domain: 'subdomain.example.com')) @@ -84,8 +76,11 @@ describe 'blocking domains through the moderation interface' do expect(DomainBlockWorker).to have_received(:perform_async) # And leaves the previous block alone - expect(domain_block.reload.severity).to eq 'silence' - expect(domain_block.reload.domain).to eq 'example.com' + expect(domain_block.reload) + .to have_attributes( + severity: eq('silence'), + domain: eq('example.com') + ) end end @@ -109,4 +104,12 @@ describe 'blocking domains through the moderation interface' do expect(domain_block.reload.severity).to eq 'suspend' end end + + private + + def submit_domain_block(domain, severity) + fill_in 'domain_block_domain', with: domain + select I18n.t("admin.domain_blocks.new.severity.#{severity}"), from: 'domain_block_severity' + click_on I18n.t('admin.domain_blocks.new.create') + end end From 15437e4ad9a741eef2d309d5c56a431504d5a45e Mon Sep 17 00:00:00 2001 From: Matt Jankowski Date: Thu, 8 Feb 2024 05:03:04 -0500 Subject: [PATCH 094/211] Add `context` and `before` to lengthy tag manager spec examples (#29129) --- spec/lib/activitypub/tag_manager_spec.rb | 70 ++++++++++++++---------- 1 file changed, 42 insertions(+), 28 deletions(-) diff --git a/spec/lib/activitypub/tag_manager_spec.rb b/spec/lib/activitypub/tag_manager_spec.rb index 55e9b4bb51..05d2609b0d 100644 --- a/spec/lib/activitypub/tag_manager_spec.rb +++ b/spec/lib/activitypub/tag_manager_spec.rb @@ -52,20 +52,27 @@ RSpec.describe ActivityPub::TagManager do expect(subject.to(status)).to include(subject.followers_uri_for(mentioned)) end - it "returns URIs of mentions for direct silenced author's status only if they are followers or requesting to be" do - bob = Fabricate(:account, username: 'bob') - alice = Fabricate(:account, username: 'alice') - foo = Fabricate(:account) - author = Fabricate(:account, username: 'author', silenced: true) - status = Fabricate(:status, visibility: :direct, account: author) - bob.follow!(author) - FollowRequest.create!(account: foo, target_account: author) - status.mentions.create(account: alice) - status.mentions.create(account: bob) - status.mentions.create(account: foo) - expect(subject.to(status)).to include(subject.uri_for(bob)) - expect(subject.to(status)).to include(subject.uri_for(foo)) - expect(subject.to(status)).to_not include(subject.uri_for(alice)) + context 'with followers and requested followers' do + let!(:bob) { Fabricate(:account, username: 'bob') } + let!(:alice) { Fabricate(:account, username: 'alice') } + let!(:foo) { Fabricate(:account) } + let!(:author) { Fabricate(:account, username: 'author', silenced: true) } + let!(:status) { Fabricate(:status, visibility: :direct, account: author) } + + before do + bob.follow!(author) + FollowRequest.create!(account: foo, target_account: author) + status.mentions.create(account: alice) + status.mentions.create(account: bob) + status.mentions.create(account: foo) + end + + it "returns URIs of mentions for direct silenced author's status only if they are followers or requesting to be" do + expect(subject.to(status)) + .to include(subject.uri_for(bob)) + .and include(subject.uri_for(foo)) + .and not_include(subject.uri_for(alice)) + end end end @@ -97,20 +104,27 @@ RSpec.describe ActivityPub::TagManager do expect(subject.cc(status)).to include(subject.uri_for(mentioned)) end - it "returns URIs of mentions for silenced author's non-direct status only if they are followers or requesting to be" do - bob = Fabricate(:account, username: 'bob') - alice = Fabricate(:account, username: 'alice') - foo = Fabricate(:account) - author = Fabricate(:account, username: 'author', silenced: true) - status = Fabricate(:status, visibility: :public, account: author) - bob.follow!(author) - FollowRequest.create!(account: foo, target_account: author) - status.mentions.create(account: alice) - status.mentions.create(account: bob) - status.mentions.create(account: foo) - expect(subject.cc(status)).to include(subject.uri_for(bob)) - expect(subject.cc(status)).to include(subject.uri_for(foo)) - expect(subject.cc(status)).to_not include(subject.uri_for(alice)) + context 'with followers and requested followers' do + let!(:bob) { Fabricate(:account, username: 'bob') } + let!(:alice) { Fabricate(:account, username: 'alice') } + let!(:foo) { Fabricate(:account) } + let!(:author) { Fabricate(:account, username: 'author', silenced: true) } + let!(:status) { Fabricate(:status, visibility: :public, account: author) } + + before do + bob.follow!(author) + FollowRequest.create!(account: foo, target_account: author) + status.mentions.create(account: alice) + status.mentions.create(account: bob) + status.mentions.create(account: foo) + end + + it "returns URIs of mentions for silenced author's non-direct status only if they are followers or requesting to be" do + expect(subject.cc(status)) + .to include(subject.uri_for(bob)) + .and include(subject.uri_for(foo)) + .and not_include(subject.uri_for(alice)) + end end it 'returns poster of reblogged post, if reblog' do From 13840d685c3a19dee6f99d3b74a8bfd3a45cb2ab Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Thu, 8 Feb 2024 11:03:30 +0100 Subject: [PATCH 095/211] Update dependency irb to v1.11.2 (#29135) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- Gemfile.lock | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Gemfile.lock b/Gemfile.lock index d60def5222..aa3d95715d 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -351,7 +351,7 @@ GEM terminal-table (>= 1.5.1) idn-ruby (0.1.5) io-console (0.7.2) - irb (1.11.1) + irb (1.11.2) rdoc reline (>= 0.4.2) jmespath (1.6.2) From d4db1c497bb25e8a8cb8b0a505d49bb3a99e308c Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Thu, 8 Feb 2024 11:03:39 +0100 Subject: [PATCH 096/211] Update dependency pghero to v3.4.1 (#29144) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- Gemfile.lock | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Gemfile.lock b/Gemfile.lock index aa3d95715d..152436b47a 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -506,7 +506,7 @@ GEM pastel (0.8.0) tty-color (~> 0.5) pg (1.5.4) - pghero (3.4.0) + pghero (3.4.1) activerecord (>= 6) posix-spawn (0.3.15) premailer (1.21.0) From 67ec192d7dbb350511059a858d573daf49ecaf4f Mon Sep 17 00:00:00 2001 From: Claire Date: Thu, 8 Feb 2024 12:40:22 +0100 Subject: [PATCH 097/211] Clean up some unused CSS definitions (#29146) --- .../styles/mastodon/components.scss | 51 ------------------- 1 file changed, 51 deletions(-) diff --git a/app/javascript/styles/mastodon/components.scss b/app/javascript/styles/mastodon/components.scss index f70fa12a51..427144ed8e 100644 --- a/app/javascript/styles/mastodon/components.scss +++ b/app/javascript/styles/mastodon/components.scss @@ -4711,43 +4711,6 @@ a.status-card { animation: heartbeat 1.5s ease-in-out infinite both; } -@keyframes shake-bottom { - 0%, - 100% { - transform: rotate(0deg); - transform-origin: 50% 100%; - } - - 10% { - transform: rotate(2deg); - } - - 20%, - 40%, - 60% { - transform: rotate(-4deg); - } - - 30%, - 50%, - 70% { - transform: rotate(4deg); - } - - 80% { - transform: rotate(-2deg); - } - - 90% { - transform: rotate(2deg); - } -} - -.no-reduce-motion .shake-bottom { - transform-origin: 50% 100%; - animation: shake-bottom 0.8s cubic-bezier(0.455, 0.03, 0.515, 0.955) 2s 2 both; -} - .emoji-picker-dropdown__menu { position: relative; margin-top: 5px; @@ -5353,20 +5316,6 @@ a.status-card { } } -.search-results__hashtag { - display: block; - padding: 10px; - color: $secondary-text-color; - text-decoration: none; - - &:hover, - &:active, - &:focus { - color: lighten($secondary-text-color, 4%); - text-decoration: underline; - } -} - .search-results__info { padding: 20px; color: $darker-text-color; From a9e91eb95565a7da74d7c961e56e9c7d6d6b94b1 Mon Sep 17 00:00:00 2001 From: Matt Jankowski Date: Thu, 8 Feb 2024 09:26:45 -0500 Subject: [PATCH 098/211] Add common stub setup for resolv dns in email mx validator spec (#29140) --- spec/validators/email_mx_validator_spec.rb | 96 +++++++++++----------- 1 file changed, 46 insertions(+), 50 deletions(-) diff --git a/spec/validators/email_mx_validator_spec.rb b/spec/validators/email_mx_validator_spec.rb index 21b1ad0a11..bc26be8729 100644 --- a/spec/validators/email_mx_validator_spec.rb +++ b/spec/validators/email_mx_validator_spec.rb @@ -5,6 +5,7 @@ require 'rails_helper' describe EmailMxValidator do describe '#validate' do let(:user) { instance_double(User, email: 'foo@example.com', sign_up_ip: '1.2.3.4', errors: instance_double(ActiveModel::Errors, add: nil)) } + let(:resolv_dns_double) { instance_double(Resolv::DNS) } context 'with an e-mail domain that is explicitly allowed' do around do |block| @@ -15,13 +16,7 @@ describe EmailMxValidator do end it 'does not add errors if there are no DNS records' do - resolver = instance_double(Resolv::DNS) - - allow(resolver).to receive(:getresources).with('example.com', Resolv::DNS::Resource::IN::MX).and_return([]) - allow(resolver).to receive(:getresources).with('example.com', Resolv::DNS::Resource::IN::A).and_return([]) - allow(resolver).to receive(:getresources).with('example.com', Resolv::DNS::Resource::IN::AAAA).and_return([]) - allow(resolver).to receive(:timeouts=).and_return(nil) - allow(Resolv::DNS).to receive(:open).and_yield(resolver) + configure_resolver('example.com') subject.validate(user) expect(user.errors).to_not have_received(:add) @@ -29,13 +24,7 @@ describe EmailMxValidator do end it 'adds no error if there are DNS records for the e-mail domain' do - resolver = instance_double(Resolv::DNS) - - allow(resolver).to receive(:getresources).with('example.com', Resolv::DNS::Resource::IN::MX).and_return([]) - allow(resolver).to receive(:getresources).with('example.com', Resolv::DNS::Resource::IN::A).and_return([Resolv::DNS::Resource::IN::A.new('192.0.2.42')]) - allow(resolver).to receive(:getresources).with('example.com', Resolv::DNS::Resource::IN::AAAA).and_return([]) - allow(resolver).to receive(:timeouts=).and_return(nil) - allow(Resolv::DNS).to receive(:open).and_yield(resolver) + configure_resolver('example.com', a: resolv_double_a('192.0.2.42')) subject.validate(user) expect(user.errors).to_not have_received(:add) @@ -58,13 +47,7 @@ describe EmailMxValidator do end it 'adds an error if the email domain name contains empty labels' do - resolver = instance_double(Resolv::DNS) - - allow(resolver).to receive(:getresources).with('example..com', Resolv::DNS::Resource::IN::MX).and_return([]) - allow(resolver).to receive(:getresources).with('example..com', Resolv::DNS::Resource::IN::A).and_return([Resolv::DNS::Resource::IN::A.new('192.0.2.42')]) - allow(resolver).to receive(:getresources).with('example..com', Resolv::DNS::Resource::IN::AAAA).and_return([]) - allow(resolver).to receive(:timeouts=).and_return(nil) - allow(Resolv::DNS).to receive(:open).and_yield(resolver) + configure_resolver('example..com', a: resolv_double_a('192.0.2.42')) user = instance_double(User, email: 'foo@example..com', sign_up_ip: '1.2.3.4', errors: instance_double(ActiveModel::Errors, add: nil)) subject.validate(user) @@ -72,30 +55,15 @@ describe EmailMxValidator do end it 'adds an error if there are no DNS records for the e-mail domain' do - resolver = instance_double(Resolv::DNS) - - allow(resolver).to receive(:getresources).with('example.com', Resolv::DNS::Resource::IN::MX).and_return([]) - allow(resolver).to receive(:getresources).with('example.com', Resolv::DNS::Resource::IN::A).and_return([]) - allow(resolver).to receive(:getresources).with('example.com', Resolv::DNS::Resource::IN::AAAA).and_return([]) - allow(resolver).to receive(:timeouts=).and_return(nil) - allow(Resolv::DNS).to receive(:open).and_yield(resolver) + configure_resolver('example.com') subject.validate(user) expect(user.errors).to have_received(:add) end it 'adds an error if a MX record does not lead to an IP' do - resolver = instance_double(Resolv::DNS) - - allow(resolver).to receive(:getresources) - .with('example.com', Resolv::DNS::Resource::IN::MX) - .and_return([instance_double(Resolv::DNS::Resource::MX, exchange: 'mail.example.com')]) - allow(resolver).to receive(:getresources).with('example.com', Resolv::DNS::Resource::IN::A).and_return([]) - allow(resolver).to receive(:getresources).with('example.com', Resolv::DNS::Resource::IN::AAAA).and_return([]) - allow(resolver).to receive(:getresources).with('mail.example.com', Resolv::DNS::Resource::IN::A).and_return([]) - allow(resolver).to receive(:getresources).with('mail.example.com', Resolv::DNS::Resource::IN::AAAA).and_return([]) - allow(resolver).to receive(:timeouts=).and_return(nil) - allow(Resolv::DNS).to receive(:open).and_yield(resolver) + configure_resolver('example.com', mx: resolv_double_mx('mail.example.com')) + configure_resolver('mail.example.com') subject.validate(user) expect(user.errors).to have_received(:add) @@ -103,20 +71,48 @@ describe EmailMxValidator do it 'adds an error if the MX record is blacklisted' do EmailDomainBlock.create!(domain: 'mail.example.com') - resolver = instance_double(Resolv::DNS) - - allow(resolver).to receive(:getresources) - .with('example.com', Resolv::DNS::Resource::IN::MX) - .and_return([instance_double(Resolv::DNS::Resource::MX, exchange: 'mail.example.com')]) - allow(resolver).to receive(:getresources).with('example.com', Resolv::DNS::Resource::IN::A).and_return([]) - allow(resolver).to receive(:getresources).with('example.com', Resolv::DNS::Resource::IN::AAAA).and_return([]) - allow(resolver).to receive(:getresources).with('mail.example.com', Resolv::DNS::Resource::IN::A).and_return([instance_double(Resolv::DNS::Resource::IN::A, address: '2.3.4.5')]) - allow(resolver).to receive(:getresources).with('mail.example.com', Resolv::DNS::Resource::IN::AAAA).and_return([instance_double(Resolv::DNS::Resource::IN::AAAA, address: 'fd00::2')]) - allow(resolver).to receive(:timeouts=).and_return(nil) - allow(Resolv::DNS).to receive(:open).and_yield(resolver) + + configure_resolver( + 'example.com', + mx: resolv_double_mx('mail.example.com') + ) + configure_resolver( + 'mail.example.com', + a: instance_double(Resolv::DNS::Resource::IN::A, address: '2.3.4.5'), + aaaa: instance_double(Resolv::DNS::Resource::IN::AAAA, address: 'fd00::2') + ) subject.validate(user) expect(user.errors).to have_received(:add) end end + + def configure_resolver(domain, options = {}) + allow(resolv_dns_double) + .to receive(:getresources) + .with(domain, Resolv::DNS::Resource::IN::MX) + .and_return(Array(options[:mx])) + allow(resolv_dns_double) + .to receive(:getresources) + .with(domain, Resolv::DNS::Resource::IN::A) + .and_return(Array(options[:a])) + allow(resolv_dns_double) + .to receive(:getresources) + .with(domain, Resolv::DNS::Resource::IN::AAAA) + .and_return(Array(options[:aaaa])) + allow(resolv_dns_double) + .to receive(:timeouts=) + .and_return(nil) + allow(Resolv::DNS) + .to receive(:open) + .and_yield(resolv_dns_double) + end + + def resolv_double_mx(domain) + instance_double(Resolv::DNS::Resource::MX, exchange: domain) + end + + def resolv_double_a(domain) + Resolv::DNS::Resource::IN::A.new(domain) + end end From ca8fbda5d031b9671447445a83acac96b4fab2fb Mon Sep 17 00:00:00 2001 From: Claire Date: Thu, 8 Feb 2024 20:13:44 +0100 Subject: [PATCH 099/211] Add end-to-end test for OCR in media uploads (#29148) --- .../compose/components/upload_button.jsx | 1 + spec/fixtures/files/text.png | Bin 0 -> 16219 bytes spec/system/ocr_spec.rb | 33 ++++++++++++++++++ 3 files changed, 34 insertions(+) create mode 100644 spec/fixtures/files/text.png create mode 100644 spec/system/ocr_spec.rb diff --git a/app/javascript/mastodon/features/compose/components/upload_button.jsx b/app/javascript/mastodon/features/compose/components/upload_button.jsx index 3866f239d7..50c9ad6321 100644 --- a/app/javascript/mastodon/features/compose/components/upload_button.jsx +++ b/app/javascript/mastodon/features/compose/components/upload_button.jsx @@ -65,6 +65,7 @@ class UploadButton extends ImmutablePureComponent { key={resetFileKey} ref={this.setRef} type='file' + name='file-upload-input' multiple accept={acceptContentTypes.toArray().join(',')} onChange={this.handleChange} diff --git a/spec/fixtures/files/text.png b/spec/fixtures/files/text.png new file mode 100644 index 0000000000000000000000000000000000000000..7463b54fd558938e4c59e71f5a90027692c28d7f GIT binary patch literal 16219 zcmeHu^;=bI)GZb&pdOV*;D{hdOE*f2bhBxsTiJA~2$CW#o9+%tX%&_3k`{?gcjuk! zeD^;0Ke#_#o@aYF8`x{D`ObIFF~=Bhppt_04Lou@92}e*GS4JbaBwaW!1wvraN*zf z4-_TvpX)E5q0l%uHye@H1->h)wD2aGqokIjs=b+`i;;sVj*E*6tEHVa+Sur&DXYDM zdHk9XIS$UhI5HAX)m#%+C(N~oG|#SXOp$%0xu)@txP+wS4d+lgt#n*9=HCIzzJc+i z=NPIoa#fqa++Uqiy!l1s_vE==P5Kulw6V z+qm;x{QX@W>m83m(02dAP2u3YrvGS@c;UZqOAM}&{`bw3+ZU0i!NE~__xgW+M0nru zzc+9s|NpQ2KaI<*#WKN@Img95It)MhA!lWmj(z=4-?wj>6|ASf`>p)><{NZw9@2ZX zyIlSAI;_>gpJr+wllM0%RZbdxeJ>U2)e?7emylm3Fuc3JK4nh9YsW>-PCzLT70~kc z;`(fBqzN;NOhiG%O~?eQfh6k>A3jL97QG=#mAUiZf;04;;y2;5)qN$v_3d@i_u5r= z-~35pOGP$S;}op#Hb<0R@kc@eJ>M~%DCjcuKo%!@vc_ro_urqv@@IPOF)Ws6Cx<+2 znpANDPK<&cdj+kH6r$cj^*epC&Slh)V4I6n?DzOyzK)KLCezDyS)X*?WM^hzNHOp} zl;k#aJzlK}+*rKzgrv2#RcwDQ`R9)xJp;L_)nQ>_#3LLsQc}35tM)#|baZqN&nujtb7J#;HwStSKkl4_Ut6# zeun8E_>|g=aHOAWw)4VeSpF-EN8q|~>6CK^VG??#X8&hsI$f%*Mop*3vQo^oZ zsLdUJ>kw+&hB@*VVnG1`>__LO?J;+n%zgxIl9bUn~DIvN{fTMK3e&aj-`0%ji z=6NieK^CWZ*Fr=r{M++0n1twj9gCF~_SpL|jQqarf1egX8z>b3&|nrq z!TTY-i4zCsHNQPD7KYUoW7ZuMtYlW7BeadfM9F-u|oFuQ@X-t1py- zm*Mf_a3UfiWoKue+qczoRs6;$CUTuuM`zd9yD7M>BnI=;%U;>FhXn*&J6kSpWW>D! z37-ye?CjHw-%b_s(sMo7xUX019IB$CqGe~tYHDt-s;^HaOn#c{zPmKLwx+PVJdAB< zXc&O>dQsphZ<81sD?MDKmmU&A5EB_G&d<*u6(28~nVC7eu<#77_ke_i#KFml&feZ$ zztP)kYj>AUT3Se%WYq02; z4>Lm%$UZo5jfskqaC380)76zzP*9kipO>1PoE#`Xajvbe8%!6aLZ(9OiRm6bEFG(| zS2Z%aPee%g&uwM6h1S8rXiqP%T;+7Bx~IOlv$L}%Gxu~1U@Pj?xrR?bS=idzIx9OL z%-5u6V`H=WU2@-ksDP~c%a`AL*-MN=gQ)B9JiRe2I$Cma1eAi#Arp0OscO$IW|uPd_3p&P#ELGvY9cDCt|>PxrG~EV$&d5($@=(-MxSI44-XyTRge9(-Xvj< zkgj_67eB7m5|HBI;Vm3&&M-fG=#T8=wrD2iM~?#A+S(+%y8;4)goJXOmWPmg5*HUg zEbA7Ly?OKIsM)v#5=JE9;5Pd?-W^aK`0~p5Y^AJQ1$JnTYPN!z zfhv5LM$a96H%^e2mGy(EiHVk@Jinlzs-a;DUA$5hEVWLhjnVPmYWhrbSQ&&gJo$0j z6z)~mwQ8*ERD+l0LQm>=f4^#^khVBP4a$1V>O^fUtWREHS3+W9u52u;5EoaJ{|$;? zrza;nEm?z!!X7a^_LChSsD#^KuSoj&`9avay1E8F8%w*x=N|N=idTPTYtrWTITIoy z!2Nmd;p(as`A|N@PCUkRw9!X&tke{Lb-X%qqQOgt1vS62A_vc$4T}zy+{-0R;C&aG}`;25*0e=Ld7>tx0H$au`A@FtgP$+D`yIw$zd%|v$%_1A%TJZ z;lt6Bq+a7VUi+k_io192Y`wQOAIMRb^4VUknzC}Z<#W0_EY%MgwL;zJb#{nV-?tqq zKw)OpV@$9c{&Nnz!ZV=JM40Q%$@-J=!fB^*YGN zwCvA1DfT(d_nhw_i`*K{kh$BrMO(^c^ZTRD@uy@Vw?1~ygO?*efBs~2bA0t`y6OF` zSj9vE(|+s4?qPKklZ<<$q!zsm`~m`7BnFvmixO-oM?JIWNI=gJ4 zQ6IQWdC|v4M_YQ|?7TtRl_YF!F;-cqzCSiH64#w5sL4Z0z*ApDZSW5}DQe}B;TN~< zETgZlFJOpk!r0()^H8UTZ5kO>zkW?B2`wA9+d%iQ$6g5;Yr(J0iw=zGUHPUbe7k3NR;Oqv;kV=8-S%jZ&GPZIQ$w5o$MAU_--$DD=5= z#WrVVXZL@+FaCRFq^w;tOj0m1Awllx)2DqAbh4ya-B_;vzCH`c{gu=GDf3^W#u^Wy zFmai6kfzgr9Yu5Gbk?&wuV}@0*Z=#wL5mY^VW7fV(-PVfCWh10)D++s+h;|Q!*|#B zzTx0Q`R@ZDIU-H%mGRr9Wi%)_coDLni9*1U0Xkwoojgq%?2}R`bY;?ssEU_>Mwj|B zg9%AUvQgw&0Uth?B?>r2yf8L)lHKlz;~dD8C9zx{Ds)b4-!C^sWg)jzzuhJ1{K_|mSF=brwJT9j7TcX% zC37_8ear$)mr(zsH_7eWMqGvgfT^@ob)kb<4;TF$$G`ae`E!dO0k=DT>k`GduT~6e znV8VFJ*G4!(e<~_MpClwE{^fnNNFP7dzTR-ms#9Y4hV}4wl|6Mlmt{ofK3O{L z$Y=Y;)0q16vtu&@+6Y?ZP7F8Fa7)+}2V6v$O8f zD+q0#FD@>Yqp=D+jtfe`#oLfxoW^X-L`G{@6crV>c6MmZ&CMB^nKM>aY&fc71`XMj zBqT0d!@eGrmPXY$K2kj%P5<%pryun4*8cuT2xJTFH0a zfKe1{UQWM7HM%%CWdbZvfdZOSP!OV`s+yaV(=xl70If#fb^40s`Ppgd`}glrZpz#J zilU$0w&&xV^Z*Eid3t*0Ksf4BQeH#)^#Zt3lm1s$Mke*mrK``Osh6VSDtiEsk3ci- zJaf>iveR=wqaVmb+q@b1b;SQOEOotn1%-N&tJbvAs7pLGe^emkOmXGSJYFg0kYcH7i3*K_RPCWoHT~P|T8ughbWV z^$YAddL8QkEC59J_4@sH?aDqrKIH6%I6l*UBn<5AA4N}h`V}$Ke?_rfu;edZ&>*M` zc|m4NU%f?T0+pP2?ilI@RuPXcJv|)-ZK8Jy5JL2D0jfW3r<1HG3atQXXJp=$aQiG2 zK+O$O_Sf(I{FK9}guf&wPf>s1#U|KI*2%z_`2un@4Iu7g6tRb~bD5YSG?LUz%uC$0Y*kqrib4!uy3Oi%>=)>0Hh?q1OH28GCynG{a zID2=(I$kkZL>}5vsm!;x#l>u)WSsu*-@V&_fSq-pJO$|PIQ{*~XoWS2PPIek#&H01 z`_9pFF(-s!vfjfba<54RCWkEO;AFyQP?pjlvYQ_$1tY@3Ztd^wWocJfDL;LB0jaOB zm3~7lU|?hnqNAm~mVMeKxLyK9U~PWhY}5Ob*UWfBt-4r_*r^RIUz1DUzU7fKHMEPxB)Yt*zqCuC+0#EQ*j;5i7x)l zo0S$?d$6s=pFInB=?;*xO4}`mn4N*;&6_tT065IDb(EA07y7fqdPIhyq{c=?X`NCL z|DRZeka0>aq+Q3ykHp8rE2u1n8Oy)%WR6YDvRJQn=40$g!0q-&gxc?C7 zj+%s8fY~iHY%#_4dzhccFy|T#Zq=f(UE_Vl3~BA*52Ohc$rYytwlgag-LDeB6j0-` z&Z>4cP^33z)wDn*=-lyVaq&@LzwQ}$ooYYTP|Drj1Gts~hzIq4N@4eM z`N{BAhu=|QB1Zv_f6?l&v1pg~>>hM{dMwUe4+XwIh=}QnudnYzH?2~W>zWkxfMb}- zjhk=A-`X@)#KXszF&Vfl6JY@@YzslbgF66#I}F?x>53}#EiE5;0k;=@G#=Q|YPgmo zFlPjh4OzUHG+$!WbnqkaZYb6H$%*G^om-jYu%)MGUGF)p9|q(zPxq12-;qNJg$I})rRX`H)(9A8uW&-n8rrYLW9O6oic*m z-QCPE(KD@Gq4kk6=_o3X%pEi7QP5p_?~5{B3g;(#E-NcPYNo7w z8!kJ!FpfWG>PTA%2v63DHW_f2PL$O1=Rv(B0aJpZZ?7P;wpBL^O&YYLeB8i!cWk1| zyNls~*%)r-GXJ&rIgVet_7u1cO#N?Ys2G^(mfbtMl0^*`=sa5^=;|PkH58|sntX}b z^qI@MA)Zz4N6$%(%Uw5Lpn|=U_+HVtyn6MxMnOu--^wq5_#gJ)fqwWTc}1K6XHzZ4 zRA5dRNSD5qz6`^I^um?uQZ0BEt8dz6X7Wb>4!D^%B&!Snm})CTs8e0Od|3&`62kN3 zm>8+7u7U=qWsUSmGN<*)L~?E`leULU1+WHr3c4-}J@=>Yb0tgIDqIWyLmmRuW<&rkafTMBim-ieGg9L~pM2EGfe z4Qd+9DT#;7b&vN_5i0KNv zOV4UA}c#_v1s&l)qNKY``;2rfyy+_sjzN4YxzfLQ^mHWA% zGNd0Bd~sgIWVyNCfyaE3!A}18#k-sQhiozt3;Vsd2~Po>xc<4*+u(JqHoQ2PPqM$c z*?XTiV>C5(p=uPkzFQhg+t|fL8RR=54QOlMxitWrl=aSYHu>L}8N$?mNy|~m#LJzy z3wg}pacsqAPr|C3V%+>8uKu*m4rY?PeJQ9#IglSUm)lN{_en6*?m((NjP*c-lG9G; zG4c}yC|K6!Xfy39V&8919zTAZcg)Pu<6jXVG^~)o_Y`msW?sB~UNel#vhUphqbke> z?;pxU%ge|FS{VU$zp*q?TeVgZX=S@}=kDD{^z_o%$xqV^E?(&wPFc5#?cH&_y-+5)$t$$?|FI>gqzy&LQK>>}z3O&0DV9YGdky z`|eao=eTR>&ksFsVsunBRRTM`of$N@UrP+I zpb0%B3y{K#d-@zEE&mL9vqKCqnkKkcu2@#P(Hs>TC?K3)k#Vp{hBF!amzo+C;EZh= z7J4r;09P3l6ckd_pDKQ}XoyM^zguWKr1u=%W!tAZm6QP(8lZyu@bY+dSHRNaYEHNIM}!82|^V2amzC}ezmTyCU5vfK{War3X_ zpz-YLs{9QKo&hfEuzby8Dj05Zi(KF*om*c?(^FFZ)oXL8IQvjtUF~i%bL*ayqViV& zN?(Q&pG)XgJNT6+1tXMK9_@g7;m>7er&R%-5B_N% zm9WzE>GsGJc9A$wj5M08a|^=0f;wUYh%%^I#$@eEp;SPxDpa^cQJ*BeM(@P4({&$J z5D)%0?GFrk33Sg$>K9fQo@#4jMush5qi_TFG$5r=?R_e+yEdWY4rAOwhD;<?XAL z&81;5b9Hbi?cGi_{rYEmI`v3>K-)X{tNbeiSR$v^=9v`^!yGvY)-?b{%O4}p=^Ts$ zgt!<>fBcXbbkZ)jcnVNPV0OMyf+_(~mFnt*@-zxD3e}~GFxK&c9)v3M_X5R6@uW>t zOY0dFJa&P7F*i!e+>(-yd#hv3X=!N-8`Di4#EC0_JUY)P_>zS$$ZnQK%gbJag_18i$!*H>O`d zovj)6xcGHS@TZjq{(T2;Nyf|q;KZHFk><5b`|zQa#_flF(!aC^+7cro?j$;FfwXNS zml3)KyUMRY;?vA@)BB*A=zMt<@g1GWgf_Vh{s@+b0eA!iw9v-}(XRVzdU)5a^*qwt z%Y|tNVb6YE&!G}>eFBwlMP}8B7nt>s!Mxb!YLYv5?pS<#d&LF-LC26+6tfq@2WrtI z9|(;cZHdn;l&~FO(}GWz4bEv`;u(TkxincXxIR=!;j}g$x2)b|(G3)bUqi^Ua3mCS zCN$qod>kCAal{M2ZP_Q`)Y1xQ9j{R>3)Z|SeV=3&Kw>yZph}Y+@bDF9ZANw&nr;)c z<;2LzE35qvEN1RfUk!~LNpz(^B^b6F| z+0)R_KqYD>S}y~ouQ%nXZ_kBfAJHq_BwGv zChQyJd%MEXHK5!Og!~)8NXOD}F&h$G42LNmr@80(*7J<;UDkWU>EJT-eMY4y6Fo@dO27g8nA_~o+* zD2zM+0*;)+B;fBQNdNceob8KMsqLL{HoE|Qshm=Cu-pY)FKJgLas_hn#DFaZ!c{k6r>}VUgH`Y8)2@f#2a2w%or~j>?x<2D;%xE z3o9Gum>d#6AKez2sm{7_nSdv2|7EQ%1?%K`;O`cYUS=mjA67gX^)M6k$UwB zVbG~{-SrKijVMWneyD07lBSX2~9Cir>bb} z!C$R3&~XUK$Xa3WU}DoQ54Z}=b?YL??2_W|Z<+#UZ0EN`@d7)Sv?TEBi0L%0g;Riy zP0`h3C~a`lH01h3dnI3ET6*PlbyjHGgm2SL=)!s4B2cI!5zMOkLC!e8yK66vLzs`r z7c?Fb`$?gnB#XccmmrimLOZ}%vNw5e5mMXaznP{OE?jQXdIyz%pAZ-U8*=r*9A)2! z3JEQsrL~~Z=trP=o^G|X5#GJq1hBB6PdXT_0Kb4iBSeYg#fey<6Y&;OKcW!Tj<|N>K!YAmy!$8UJ@GcS5xU{Y)06!-3 z7_L-M8*0a|-k_OFD!hmr4!6FyPh*-P+$a>E4k?#6c7BRqSu|YQQtjm6Al7~(G({#N zG%#c|JSxhh(UyXdKYT>Yws*7Fko_7_5m07xXLCPC2h7ZP_MF}XFwoF^&pZ5F33!7& zvz46sIsrjOOUpBP-zzj@;}mJgUGnjL>W<@l-~8hTkm(~^z=O=fCVYuD-%Awn5&**c zvxCAez1G^uY;|;8TrQ?)fw@~k0{Ai_vMlv|ufeU!+iq;1B}>@c?N+P#E!_Mes!*wl zwMpsd>6bs=Wp9SDJ+npuX79C3O);^H(J?W3McF^uBj+Xn#a36#hFFMTyALQAY)5FO_|4bB}T&6+(?=EHb7o{`}CZg0JBbv`r4G41S5Hoe!Z0n z_JuX@cIoflT^`((%VoHIops=0P+2AHxf(R~gV`9#^$4JBxMdAmGi77dhQD#j3;x$& z7vHkj$^Fw0Fn7=ilFHHNWs;za!fs{;bb=ZMCjmMRW~ zi-%LClT1{jvvqIzEP!)_)2!nU_!+hu&vw~Z1-4hAYHN9WH~gyZk9k%do1CmTTx>8b z!Wo84P)cQwRWS!g$H)0a=(7{I=~a~PP&Z-tw#V8yKR7WQpxzBSot&Jk)O^np0_D*d zMs`g->_Tt)T!U0znicSuR?})qN>9$u_8WIwx_kl%3s`h22kz6)MOJqP4PZD&v;l!x z6?y}I$9nt{!iuL{#Lvgq16}hF%r0}lr{xqGsHlj+)G+5h<>l%5jP^<2@x5TRC|7s) zh(`u~NubdFPedlVAyq9f`mnEUlCGlr30nm}UA^ENiVRG<)1HT0rg_&^^_kKjV9KD1 zstpTz9hDdP%D+4oMfcgAcrym0ky)+m$$q& zR;BpM$&lUNNtzztmJVa`a2^ia87hN_Um4L97VL8Y6Mzp{1i! z21X(4&{Y?BLM1fkWrESC5G}}dwZheprg1zrzmh4DGW zA#WK$>+i>-6oIsXRh7rf(FZ}lHp%17vx5E<{U-6X$@;N|TQOv?5*B?KGI_(HpJmQN zZj(_r0+(K38=nV^ao+OEc(rO3x`RI(77%NPb%C_bL&rUfFxfi1@(PH8uK;A!*fwB&@a0P{A1#kn6)y?Y zI_}dmr3IW%}h3{s)Bo%|rk8b%WI*iPfN?K-zf$xG~4=dHKOzxMR`fk+STi1`tR_ zW>+yY@FPqW-$A`^c}lv{)=33h|*wiKS|kS`PY@VkN0ir1Q-v;-sN4(ZM9_tf4wC8j9g z57dWc6cu@`$7r^x7Y4)Ypx28X9yW`frM6cS$LVB%NHI{T!y9?&FYt|nPC!RA?eOgd zlduiVxi)~63xbcBWx(sPT{m9iB)ecO1w-;`L*IY9=BoSNO72l>WWYkxEm5^Xe%w=T z`^f}}U#92t@%Cz>x!P8+04v}9;A29;;dCYcHQ@X$sZjFpQI1!CC3MWy16q{8X_1SW zpN6Va4tpMtg8fTvZDe}-CciRWYn^m)3yD8CbQT?Kz{-O-Uh?Kzw&vRX%!sNaK*$1G zN5QEPB&?3kxGQ{M`pKs}2C70Ee0y2VXE2V}s0$%FUA|s6uJ4*Btj&0 zZx}gHw%2dnVk2o*HSyeq#%hUq|421UZ6PQO2>U_r%OG(gapxpl=8sy06jB>*?d~4- zTnmKR;c>V^^ZW)c|`^AlC zc{=C}>4%C*1vLsFS3@s<8YvP}%H03%`d!*^L#2#9B4*#$-xOeZ`+_; z?OXX~a%N^(Jq$w8GEm+YfM?Pa_5n4Xkcx^`*z=$#ZxNXD*PRLcs=G$tNz`^(mzPi|-T?T??UJ(`=7U-ql(DKGm zcbAX( z30?(RubFpG$$3QIqXRM0mVt~0s`rf^J7GM@EZE3j+1)PwaybZFY z12lc^_DJS-$Jv(K<+D*GvYi#P>%dve>Z??vre&EwVIs-5&q4=uML>)s}X=4XZ*zKFH3*6buu}1C#*&G~CA{ zK0d9Wz`)NIf-%?d@n>kt8qr;g6~p?*KrX4&Uk!OoO0d%_P5rpHI2Bj@NZ|95`)$vky+eoZ0{S!X+)3|1y)kj{-q{4=PW%ngzyeF3@>X zPr+G)n3A8tD%Q7lNB#Z#0>f#3a~Zruw4=Ry5ULpnEbk*q zU%6#}2gcWY=2vI|+VKxE-k@eew%*T)B z2a{W-&)Ige*f&P43)t}#?B9ijmcW(;4wp4u)VimzWnfqsZ_ZqFzyT<_1xZsdI=9kT ziZ%ePzX9l~{rm(gis;#7pb5U~tMS+`GJ-w0g&6i=)Y1Y`pwdbkIMh;$WblO+*Z9B= zuWWmTY>dz>I+;6F^VPLp$Cck8ei>*IQqmR@X03mxfa7{qdy86x3+(S-*`Y;_OiWB< ztTrC}4R(H|xaeg6?%lhn_S64sWF%f6gUTewXn+`5Gz+!qpgNIH0NyJy0=&NkpxUIO z^emXI;iI^iSjc=+bMyQ7G9Mtl)mduw^z_^sy-#PMX0-z`7y|>SgNq|!l|DJ1i|P--)F|!*Z7j64xgN|uJ(adPky|s%%k84aE1ZYW z&TunlXxdAsK}YaMKD{w)i>|KRekzHChzNBm0#2SpnSDhN*AC%e0<%H2!_Nih{{H?O z;6;msVbH?SY=H3B3+Y$gD*6s@Ih1$u4^S4j$<>1w zs@Gy$23RJk*#9n0?P1Y{iVx)b;#5h5zp z5nO-^3l_wbl=2a@k3~gAA;>coR)aLZNI^X8>x}0`0ja$tBHDVq-q_vSivnVIbf_2-W@t`F^~OEEkD%=@^907`fM=!;N-xd+%7`k|>?D~+M5BTJeFruD8}V;| zo!ziv=9CsOHa5bl*}}Y#agvphp#;Mw>R7A7N`17!t5!E#ffDU)_ZejFPb9>|eRXcz za&3*w?NQ+12NRD*wLZ9izBdBey^JqV)_8~F%&;x$kr1>rix0RZY~UiEg8)R=*VWlX zct3k~Z3>JoHfyxXN}q+dJ2=aoSGDz|Ni2KQu1HEtx6`bqG6lgxse)^09A<@lJD0`2 zOd$q_mb|fY|JSc^1VC-Fk!iM*g>xf8;4Ek41q!v_5jZr6n+UM7diuHucn6WU4q7l+ zDHot1{Q=7C2Do2(glz$ebtUk70$+ZO*aqia6;HY?>lTNOt56#RI6hPfDHYKqBf$Kt}NG_UM zuf{Rez~^*u>D$F#`-)D`m?M$;R(q^Hv%anf=ynSvQ%A4Q6vFOYqRuOy#!HOE_4*K3 zAw0p^q{q7DkxdcoPuOyrH*egifbkw2SYhj<6~VA-id9??Nejq@6QD~=gZER~S{j~{ zDXGCKX;;}%ib8yt1@OWuU>c4-+YIwTd^TK^^ zG?LI5l)?p=|Na2B39qkPopwy|@lx01?9z zU?c2Kz5enuxd_@L7~+ub$7OlF2do1i6GYi`h9?!I!Za!*BBGC&4yt~AtauJ9t*P(k zhtzSqi&<@W_JnhCV2VVD97Nce?M;_PYieqC_Q5HYOel`q;HZ3SQ0pu&0_!(s_=uhI+Sk*IX9qh`JdiIx5IPGQbgO~aE)h6Eva{ysdhI)3&37kv+mC;_uLu)g zm6zREB@1{#wqSy6f!TNt?2}aM{n>~saEQ*!7?*(bD;z4A1r1~qGz1-|F(@|K$p0~E z7PZizuUJ@uCU*k6V+$yO>K5JSR^+^Pa&Xx>_{1o%@E3j*U*6u?$$;9o2@s$SSmctW z(>XXc0V?nuoRNwFg*4C2lp@DC0qr&a@q7Y+pSt-30Rcg|`?nV#fY}@^GY?y;DhA;) ze)lm0xOd?QRS8(FdLXu1Vq$Mw(_MsA;NXwdX!)b{p43abi~aADJl6P&eqOsP@!#pM zPoGHBn=7G(AeK_%Y$t%S&lMCjw(Iy$;UqYn=twMbHDZ8@+{t zLqalOtH%vkPIY#M!UXjVyd8=#7-k3cRDENH&)@GOF>^nyeQ{o0TLi#rOHHii{_6|n(J+`m_@GAru$yX-2PrHayqIm>-SjY7 z0rEf&X2C%Y}XQ#(e;AMehjtHlToWg=0m8YIh41;bI zhR3!I7^ThR>G*bh;9nu$jzDiXgZ2a_r*z0b1WUYqdy$cag%0tgE2sbRY3oMFNB{+( zGdx-xv8+pL?d;5ilYUAnDtExJlLh&&1T+Aw4NPPdAl@he^3MS)%K#MDNzgkP?N3V` z92^$FLWp1h?4c7UF$b!1t=})u>DHl;2v@w z4J33WI6wzL27;&t^#BgQWdd^j@8;k*Sn8v~Q?ajbP7uC={%QN~?DA`{*ZlWJ$~8DU qh?~VWeEB}w Date: Fri, 9 Feb 2024 10:55:30 +0100 Subject: [PATCH 100/211] New Crowdin Translations (automated) (#29152) Co-authored-by: GitHub Actions --- app/javascript/mastodon/locales/ia.json | 22 +++ app/javascript/mastodon/locales/sk.json | 9 +- app/javascript/mastodon/locales/tok.json | 177 ++++++++++++++++++----- config/locales/activerecord.tok.yml | 8 + config/locales/doorkeeper.tok.yml | 50 +++++++ config/locales/simple_form.tok.yml | 4 +- config/locales/sk.yml | 2 +- config/locales/tok.yml | 4 + 8 files changed, 230 insertions(+), 46 deletions(-) diff --git a/app/javascript/mastodon/locales/ia.json b/app/javascript/mastodon/locales/ia.json index 7b9ab3742b..10328efd0e 100644 --- a/app/javascript/mastodon/locales/ia.json +++ b/app/javascript/mastodon/locales/ia.json @@ -2,6 +2,8 @@ "about.blocks": "Servitores moderate", "about.contact": "Contacto:", "about.disclaimer": "Mastodon es software libere, de codice aperte, e un marca de Mastodon gGmbH.", + "about.domain_blocks.silenced.title": "Limitate", + "about.domain_blocks.suspended.title": "Suspendite", "about.rules": "Regulas del servitor", "account.account_note_header": "Nota", "account.add_or_remove_from_list": "Adder o remover ab listas", @@ -12,6 +14,7 @@ "account.blocked": "Blocate", "account.browse_more_on_origin_server": "Navigar plus sur le profilo original", "account.copy": "Copiar ligamine a profilo", + "account.direct": "Mentionar privatemente a @{name}", "account.disable_notifications": "Stoppar le notificationes quando @{name} publica", "account.domain_blocked": "Dominio blocate", "account.edit_profile": "Modificar profilo", @@ -33,6 +36,7 @@ "account.languages": "Cambiar le linguas subscribite", "account.link_verified_on": "Le proprietate de iste ligamine esseva verificate le {date}", "account.locked_info": "Le stato de confidentialitate de iste conto es definite a blocate. Le proprietario revisa manualmente qui pote sequer lo.", + "account.media": "Multimedia", "account.mention": "Mentionar @{name}", "account.moved_to": "{name} indicava que lor nove conto ora es:", "account.mute": "Silentiar @{name}", @@ -57,6 +61,7 @@ "account.unmute_notifications_short": "Non plus silentiar le notificationes", "account.unmute_short": "Non plus silentiar", "account_note.placeholder": "Clicca pro adder un nota", + "admin.dashboard.retention.average": "Median", "admin.dashboard.retention.cohort_size": "Nove usatores", "admin.impact_report.instance_followers": "Sequitores que nostre usatores poterea perder", "admin.impact_report.instance_follows": "Sequitores que lor usatores poterea perder", @@ -69,6 +74,7 @@ "bundle_column_error.return": "Retornar al initio", "bundle_modal_error.close": "Clauder", "bundle_modal_error.retry": "Tentar novemente", + "closed_registrations_modal.description": "Crear un conto in {domain} actualmente non es possibile, ma considera que tu non besonia un conto specific in {domain} pro usar Mastodon.", "closed_registrations_modal.find_another_server": "Trovar altere servitor", "column.about": "A proposito de", "column.blocks": "Usatores blocate", @@ -105,6 +111,7 @@ "compose_form.poll.option_placeholder": "Option {number}", "compose_form.poll.single": "Seliger un", "compose_form.poll.switch_to_multiple": "Cambiar inquesta pro permitter selectiones multiple", + "compose_form.poll.switch_to_single": "Cambiar inquesta pro permitter selection singule", "compose_form.poll.type": "Stylo", "compose_form.publish": "Publicar", "compose_form.publish_form": "Nove message", @@ -117,6 +124,8 @@ "confirmations.block.block_and_report": "Blocar e signalar", "confirmations.block.confirm": "Blocar", "confirmations.block.message": "Es tu secur que tu vole blocar {name}?", + "confirmations.cancel_follow_request.confirm": "Retirar requesta", + "confirmations.cancel_follow_request.message": "Es tu secur que tu vole retirar tu requesta a sequer a {name}?", "confirmations.delete.confirm": "Deler", "confirmations.delete.message": "Es tu secur que tu vole deler iste message?", "confirmations.delete_list.confirm": "Deler", @@ -320,6 +329,8 @@ "report.placeholder": "Commentos additional", "report.reasons.dislike": "Non me place", "report_notification.categories.other": "Alteres", + "report_notification.open": "Aperir reporto", + "search.no_recent_searches": "Nulle recercas recente", "search.quick_action.go_to_account": "Vader al profilo {x}", "search.quick_action.go_to_hashtag": "Vader al hashtag {x}", "search.quick_action.open_url": "Aperir URL in Mastodon", @@ -333,14 +344,20 @@ "search_results.hashtags": "Hashtags", "search_results.see_all": "Vider toto", "search_results.statuses": "Messages", + "server_banner.active_users": "usatores active", "server_banner.learn_more": "Apprender plus", + "server_banner.server_stats": "Statos del servitor:", "sign_in_banner.create_account": "Crear un conto", "sign_in_banner.sign_in": "Initiar le session", "status.block": "Blocar @{name}", "status.copy": "Copiar ligamine a message", "status.delete": "Deler", + "status.direct": "Mentionar privatemente a @{name}", "status.direct_indicator": "Mention private", "status.edit": "Modificar", + "status.edited": "Modificate le {date}", + "status.edited_x_times": "Modificate {count, plural, one {{count} tempore} other {{count} tempores}}", + "status.favourite": "Adder al favoritos", "status.filter": "Filtrar iste message", "status.hide": "Celar le message", "status.history.created": "create per {name} le {date}", @@ -351,12 +368,17 @@ "status.mute_conversation": "Silentiar conversation", "status.read_more": "Leger plus", "status.share": "Compartir", + "status.show_less": "Monstrar minus", + "status.show_more": "Monstrar plus", "status.translate": "Traducer", "status.translated_from_with": "Traducite ab {lang} usante {provider}", + "status.uncached_media_warning": "Previsualisation non disponibile", + "subscribed_languages.save": "Salveguardar le cambiamentos", "tabs_bar.home": "Initio", "tabs_bar.notifications": "Notificationes", "timeline_hint.resources.statuses": "Messages ancian", "trends.trending_now": "Ora in tendentias", + "upload_button.label": "Adde imagines, un video o un file de audio", "upload_modal.choose_image": "Seliger un imagine", "upload_modal.detect_text": "Deteger texto ab un pictura", "video.close": "Clauder le video", diff --git a/app/javascript/mastodon/locales/sk.json b/app/javascript/mastodon/locales/sk.json index 7a05eb4f7e..ad7837cab2 100644 --- a/app/javascript/mastodon/locales/sk.json +++ b/app/javascript/mastodon/locales/sk.json @@ -280,6 +280,7 @@ "follow_suggestions.curated_suggestion": "Výber zo servera", "follow_suggestions.dismiss": "Znovu nezobrazuj", "follow_suggestions.personalized_suggestion": "Prispôsobené odporúčania", + "follow_suggestions.popular_suggestion": "Populárne návrhy", "follow_suggestions.view_all": "Zobraz všetky", "follow_suggestions.who_to_follow": "Koho nasledovať", "followed_tags": "Nasledované haštagy", @@ -355,7 +356,7 @@ "keyboard_shortcuts.muted": "otvor zoznam stíšených užívateľov", "keyboard_shortcuts.my_profile": "otvor svoj profil", "keyboard_shortcuts.notifications": "Otvor panel oznámení", - "keyboard_shortcuts.open_media": "na otvorenie médií", + "keyboard_shortcuts.open_media": "Otvorenie médií", "keyboard_shortcuts.pinned": "otvor zoznam pripnutých príspevkov", "keyboard_shortcuts.profile": "otvor autorov profil", "keyboard_shortcuts.reply": "odpovedať", @@ -364,7 +365,7 @@ "keyboard_shortcuts.spoilers": "to show/hide CW field", "keyboard_shortcuts.start": "otvor panel ''začíname''", "keyboard_shortcuts.toggle_hidden": "ukáž/skry text za CW", - "keyboard_shortcuts.toggle_sensitivity": "pre zobrazenie/skrytie médií", + "keyboard_shortcuts.toggle_sensitivity": "Ukáž/skry médiá", "keyboard_shortcuts.toot": "začni úplne nový príspevok", "keyboard_shortcuts.unfocus": "nesústreď sa na písaciu plochu, alebo hľadanie", "keyboard_shortcuts.up": "posuň sa vyššie v zozname", @@ -493,7 +494,7 @@ "onboarding.share.message": "Na Mastodone som {username}. Príď ma nasledovať na {url}", "onboarding.share.next_steps": "Ďalšie možné kroky:", "onboarding.share.title": "Zdieľaj svoj profil", - "onboarding.start.lead": "Your new Mastodon account is ready to go. Here's how you can make the most of it:", + "onboarding.start.lead": "Teraz si súčasťou Mastodonu, unikátnej, decentralizovanej sociálnej platformy, kde ty, nie algoritmus, spravuješ svoj vlastný zážitok. Poďme ťa naštartovať na tomto novom sociálnom pomedzí:", "onboarding.start.skip": "Want to skip right ahead?", "onboarding.start.title": "Zvládli ste to!", "onboarding.steps.follow_people.body": "You curate your own feed. Lets fill it with interesting people.", @@ -705,7 +706,7 @@ "units.short.million": "{count}mil.", "units.short.thousand": "{count}tis.", "upload_area.title": "Pretiahni a pusť pre nahratie", - "upload_button.label": "Pridaj médiálny súbor (JPEG, PNG, GIF, WebM, MP4, MOV)", + "upload_button.label": "Pridaj obrázky, video, alebo zvukový súbor", "upload_error.limit": "Limit pre nahrávanie súborov bol prekročený.", "upload_error.poll": "Nahrávanie súborov pri anketách nieje možné.", "upload_form.audio_description": "Popíš, pre ľudí so stratou sluchu", diff --git a/app/javascript/mastodon/locales/tok.json b/app/javascript/mastodon/locales/tok.json index 1c84356238..7270d52067 100644 --- a/app/javascript/mastodon/locales/tok.json +++ b/app/javascript/mastodon/locales/tok.json @@ -2,16 +2,18 @@ "about.blocks": "ma lawa", "about.contact": "toki:", "about.domain_blocks.no_reason_available": "mi sona ala e tan", + "about.domain_blocks.suspended.title": "weka", "about.not_available": "lon kulupu ni la sina ken alasa ala e sona ni.", "about.rules": "lawa kulupu", "account.account_note_header": "sona awen", + "account.badges.bot": "ilo nanpa li lawa e ni", "account.badges.group": "kulupu", "account.block": "o weka e @{name}", "account.block_domain": "o weka e ma {domain}", - "account.block_short": "o weka e jan", - "account.blocked": "jan ni li weka", + "account.block_short": "o weka e jan tawa mi", + "account.blocked": "jan ni li weka tawa mi", "account.browse_more_on_origin_server": "sina tawa ma tan pi jan ni la sina ken lukin e mute", - "account.cancel_follow_request": "o pini wile kute", + "account.cancel_follow_request": "o pini kute", "account.copy": "o pali same e linja pi lipu jan", "account.direct": "len la o mu e @{name}", "account.disable_notifications": "@{name} li toki la o toki ala e toki ona tawa mi", @@ -34,15 +36,15 @@ "account.media": "sitelen", "account.mention": "o toki e jan @{name}", "account.moved_to": "lipu jan sin pi jan {name} li ni:", - "account.mute": "o kute ala e @{name}", + "account.mute": "o len e @{name}", "account.mute_notifications_short": "o kute ala e mu tan jan ni", "account.mute_short": "o kute ala", - "account.muted": "sina kute ala e jan ni", + "account.muted": "sina len e jan ni", "account.no_bio": "lipu li weka", "account.open_original_page": "o open e lipu open", "account.posts": "toki suli", "account.posts_with_replies": "toki ale", - "account.report": "jan @{name} la o toki e lawa", + "account.report": "jan @{name} la o toki tawa lawa", "account.requested": "jan ni o ken e kute sina. sina pini wile kute la o luka e ni", "account.requested_follow": "{name} li wile kute e sina", "account.share": "o pana e lipu jan @{name}", @@ -51,20 +53,21 @@ "account.unblock_domain": "o weka ala e ma {domain}", "account.unblock_short": "o pini weka", "account.unfollow": "o pini kute", - "account.unmute": "o kute e @{name}", + "account.unmute": "o len ala e @{name}", "account.unmute_notifications_short": "o kute e mu tan jan ni", - "account.unmute_short": "o ken kute e jan ni", + "account.unmute_short": "o len ala", "admin.dashboard.retention.average": "sama", "admin.dashboard.retention.cohort": "tenpo mun open", "admin.dashboard.retention.cohort_size": "jan sin", "alert.rate_limited.message": "tenpo {retry_time, time, medium} la o pali awen", "alert.unexpected.message": "pakala li lon", - "alert.unexpected.title": "pakala", + "alert.unexpected.title": "pakala a!", "announcement.announcement": "toki suli", "audio.hide": "o len e kalama", - "bundle_column_error.error.title": "pakala!", + "bundle_column_error.error.title": "ike a!", "bundle_column_error.network.title": "pakala la ilo sina li toki ala tawa ilo ante", "bundle_column_error.retry": "o ni sin", + "bundle_column_error.return": "o tawa tomo", "bundle_column_error.routing.body": "ilo li sona ala e lipu wile. sina pana ala pana e nasin pona tawa lipu?", "bundle_column_error.routing.title": "pakala nanpa 404", "bundle_modal_error.close": "o pini", @@ -72,64 +75,92 @@ "bundle_modal_error.retry": "o ni sin", "closed_registrations_modal.find_another_server": "o alasa e ma ante", "column.blocks": "kulupu pi jan weka", - "column.lists": "lipu pi lipu mute", - "column.mutes": "sina wile ala kute e jan ni", - "community.column_settings.local_only": "toki lon ni taso", + "column.home": "lipu open", + "column.lists": "kulupu lipu", + "column.mutes": "jan len", + "column.pins": "toki sewi", + "column_header.hide_settings": "o len e lawa", + "column_header.pin": "o sewi", + "column_header.show_settings": "o lukin e lawa", + "column_header.unpin": "o sewi ala", + "community.column_settings.local_only": "toki tan ni taso", "community.column_settings.media_only": "sitelen taso", + "community.column_settings.remote_only": "toki tan ante taso", "compose.language.change": "o ante e nasin toki", "compose.language.search": "o alasa e nasin toki...", + "compose.published.body": "toki li pana.", "compose.published.open": "o lukin", "compose.saved.body": "ilo li awen e ijo pana sina.", "compose_form.direct_message_warning_learn_more": "o kama sona e ijo ante", - "compose_form.placeholder": "sina toki insa e seme", + "compose_form.placeholder": "sina wile toki e seme?", + "compose_form.poll.duration": "tenpo pana", + "compose_form.poll.multiple": "pana mute", "compose_form.poll.option_placeholder": "ken nanpa {number}", + "compose_form.poll.single": "pana pi wan taso", "compose_form.poll.switch_to_multiple": "o ante e nasin pana. pana mute o ken", "compose_form.poll.switch_to_single": "o ante e nasin pana. pana wan taso o lon", + "compose_form.poll.type": "nasin", "compose_form.publish": "o toki", "compose_form.publish_form": "o open toki sin", "compose_form.reply": "o toki lon ijo ni", "compose_form.save_changes": "o sin e ni", "compose_form.spoiler.marked": "o weka e toki pi ijo ike ken", - "confirmations.block.confirm": "o weka.", + "confirmation_modal.cancel": "o pini", + "confirmations.block.confirm": "o weka", "confirmations.block.message": "sina o wile ala wile weka e jan {name}?", "confirmations.cancel_follow_request.confirm": "o weka e wile sina", "confirmations.cancel_follow_request.message": "sina awen ala awen wile weka e wile kute sina lon {name}?", - "confirmations.delete.confirm": "o pakala", - "confirmations.delete.message": "sina wile ala wile pakala e toki ni", - "confirmations.delete_list.confirm": "o pakala", - "confirmations.delete_list.message": "sina wile ala wile pakala e lipu ni", + "confirmations.delete.confirm": "o weka", + "confirmations.delete.message": "sina wile ala wile weka e toki ni?", + "confirmations.delete_list.confirm": "o weka", + "confirmations.delete_list.message": "sina wile ala wile weka e lipu ni?", "confirmations.discard_edit_media.confirm": "o weka", + "confirmations.discard_edit_media.message": "toki sitelen anu lukin lili sitelen la ante pi awen ala li lon. sina wile weka e ante ni?", "confirmations.domain_block.confirm": "o weka.", "confirmations.edit.confirm": "o ante", "confirmations.logout.confirm": "o weka", "confirmations.logout.message": "sina wile ala wile weka", - "confirmations.mute.confirm": "sina wile ala kute e jan ni", + "confirmations.mute.confirm": "o len", "confirmations.mute.message": "sina awen ala awen wile kute ala e {name}?", - "confirmations.redraft.confirm": "o pakala o pali sin e toki", + "confirmations.redraft.confirm": "o weka o pali sin e toki", + "confirmations.redraft.message": "pali sin e toki ni la sina wile ala wile weka e ona? sina ni la suli pi toki ni en wawa pi toki ni li weka. kin la toki lon toki ni li jo e mama ala.", + "confirmations.reply.confirm": "toki lon toki ni", + "confirmations.reply.message": "toki tawa ona li weka e toki pali sina ꞏ sina wile ala wile ni", "confirmations.unfollow.confirm": "o pini kute", "confirmations.unfollow.message": "sina o wile ala wile pini kute e jan {name}?", "conversation.delete": "o weka e toki ni", "conversation.mark_as_read": "ni o sin ala", "conversation.open": "o lukin e toki", "conversation.with": "lon {names}", + "directory.local": "tan {domain} taso", "directory.new_arrivals": "jan pi kama sin", + "directory.recently_active": "jan lon tenpo poka", + "disabled_account_banner.account_settings": "wile pi lipu jan", + "disabled_account_banner.text": "sina ken ala kepeken e lipu jan sina pi nimi {disabledAccount}.", + "dismissable_banner.community_timeline": "ni li toki pi tenpo poka tawa ale tan jan lon ma lawa pi nimi {domain}.", "dismissable_banner.dismiss": "o weka", + "dismissable_banner.explore_links": "ni li toki pi ijo sin ꞏ jan mute li pana e ni lon tenpo suno ni ꞏ sin la jan mute li pana la ni li kama suli", + "embed.preview": "ni li jo e sitelen ni:", + "emoji_button.activity": "musi", "emoji_button.flags": "len ma", "emoji_button.food": "moku", - "emoji_button.label": "o pana e Emosi", + "emoji_button.label": "o pana e sitelen pilin", "emoji_button.nature": "soweli en kasi", - "emoji_button.not_found": "sitelen Emosi ala li lon", + "emoji_button.not_found": "sitelen pilin ala li lon", "emoji_button.objects": "ijo", "emoji_button.people": "jan", - "emoji_button.search": "o alasa", + "emoji_button.search": "o alasa...", "emoji_button.search_results": "ijo pi alasa ni", "emoji_button.symbols": "sitelen", "emoji_button.travel": "ma en tawa", + "empty_column.account_hides_collections": "jan ni li wile len e sona ni", "empty_column.account_timeline": "toki ala li lon!", "empty_column.account_unavailable": "ken ala lukin e lipu jan", + "empty_column.blocks": "jan ala li weka tawa sina.", "empty_column.followed_tags": "sina alasa ala e toki ꞏ sina alasa e toki la toki li lon ni", "empty_column.hashtag": "ala li lon toki ni", - "empty_column.mutes": "jan ala la sina wile ala kute.", + "empty_column.mutes": "jan ala li len tawa sina.", + "errors.unexpected_crash.report_issue": "o toki e pakala tawa lawa", "explore.search_results": "ijo pi alasa ni", "explore.suggested_follows": "jan", "explore.title": "o alasa", @@ -138,52 +169,102 @@ "filter_modal.select_filter.expired": "tenpo pini", "filter_modal.select_filter.search": "o alasa anu pali", "firehose.all": "ale", - "firehose.local": "ilo ni", - "firehose.remote": "ilo ante", - "follow_request.authorize": "o sina kama", - "follow_request.reject": "o weka", + "firehose.local": "kulupu ni", + "firehose.remote": "kulupu ante", + "follow_request.authorize": "o ken", + "follow_request.reject": "o ala", "follow_suggestions.view_all": "o lukin e ale", + "follow_suggestions.who_to_follow": "sina o kute e ni", + "footer.get_app": "o jo e ilo", "footer.privacy_policy": "lawa len", "footer.source_code": "o lukin e toki ilo", "footer.status": "lon", + "generic.saved": "ni li awen", "hashtag.column_header.tag_mode.all": "en {additional}", "hashtag.column_header.tag_mode.any": "anu {additional}", + "hashtag.column_header.tag_mode.none": "en {additional} ala", "hashtag.column_settings.tag_mode.all": "ale ni", "hashtag.column_settings.tag_mode.any": "wan ni", "hashtag.column_settings.tag_mode.none": "ala ni", "home.pending_critical_update.link": "o lukin e ijo ilo sin", "interaction_modal.on_another_server": "lon ma ante", "interaction_modal.on_this_server": "lon ma ni", + "interaction_modal.title.favourite": "o suli e toki {name}", "interaction_modal.title.follow": "o kute e {name}", - "keyboard_shortcuts.muted": "sina wile ala kute e jan la o lukin e ona ale", - "keyboard_shortcuts.open_media": "o open e sitelen", - "keyboard_shortcuts.toggle_sensitivity": "sitelen la o len anu lukin", + "interaction_modal.title.reblog": "o wawa e toki {name}", + "keyboard_shortcuts.blocked": "o lukin e lipu sina pi jan weka", + "keyboard_shortcuts.down": "o tawa anpa lon lipu", + "keyboard_shortcuts.enter": "o lukin e toki", + "keyboard_shortcuts.favourite": "o suli e toki", + "keyboard_shortcuts.favourites": "o lukin e lipu sina pi toki suli", + "keyboard_shortcuts.muted": "o lukin e lipu sina pi jan len", + "keyboard_shortcuts.my_profile": "o lukin e lipu sina", + "keyboard_shortcuts.open_media": "o lukin e sitelen", + "keyboard_shortcuts.pinned": "o lukin pi lipu sina pi toki sewi", + "keyboard_shortcuts.toggle_sensitivity": "o ante e ken lukin", + "keyboard_shortcuts.up": "o tawa sewi lon lipu", "lightbox.close": "o pini", - "link_preview.author": "{name} li pali e ni", + "lightbox.compress": "o lili e sitelen", + "lightbox.expand": "o suli e sitelen", + "lightbox.next": "sinpin", + "lightbox.previous": "monsi", + "link_preview.author": "tan {name}", + "lists.account.add": "o pana tawa kulupu lipu", + "lists.account.remove": "o weka tan kulupu lipu", + "lists.delete": "o weka e kulupu lipu", + "lists.edit": "o ante e kulupu lipu", "lists.edit.submit": "o ante e nimi", + "lists.exclusive": "o len e toki lon lipu open", + "lists.new.create": "o sin e kulupu lipu", + "lists.replies_policy.followed": "jan kute ale", + "lists.replies_policy.list": "jan pi kulupu ni taso", "lists.replies_policy.none": "jan ala", + "lists.subheading": "kulupu lipu sina", + "load_pending": "{count, plural, other {ijo sin #}}", + "loading_indicator.label": "ni li kama…", + "media_gallery.toggle_visible": "{number, plural, other {o len e sitelen}}", "mute_modal.duration": "tenpo", "mute_modal.indefinite": "tenpo ale", - "navigation_bar.filters": "sina wile ala kute e nimi ni", + "navigation_bar.blocks": "jan weka", + "navigation_bar.compose": "o pali e toki sin", + "navigation_bar.favourites": "toki suli", + "navigation_bar.filters": "nimi len", + "navigation_bar.lists": "kulupu lipu", "navigation_bar.mutes": "sina wile ala kute e jan ni", - "notification.follow": "jan {name} li kama kute e sina", + "navigation_bar.pins": "toki sewi", + "navigation_bar.preferences": "wile sina", + "navigation_bar.search": "o alasa", + "notification.admin.sign_up": "{name} li kama", + "notification.favourite": "{name} li suli e toki sina", + "notification.follow": " {name} li kute e sina", "notification.follow_request": "{name} li wile kute e sina", "notification.mention": "jan {name} li toki e sina", + "notification.reblog": "{name} li wawa e toki sina", + "notification.status": "{name} li toki", + "notification.update": "{name} li ante e toki", "notifications.column_settings.follow": "jan kute sin", "notifications.filter.all": "ale", + "onboarding.compose.template": "toki a, #Mastodon o!", "onboarding.start.title": "sina o kama pona a!", - "privacy.public.short": "jan ale", + "poll.total_people": "{count, plural, other {jan #}}", + "privacy.public.short": "tawa ale", "relative_time.full.just_now": "tenpo ni", "relative_time.just_now": "tenpo ni", "relative_time.today": "tenpo suno ni", "report.block": "o weka e jan", "report.block_explanation": "sina kama lukin ala e toki ona. ona li kama ala ken lukin e toki sina li kama ala ken kute e sina. ona li ken sona e kama ni.", "report.category.title": "ike seme li lon {type} ni", + "report.category.title_account": "lipu", + "report.category.title_status": "toki", "report.close": "o pini", "report.mute": "o kute ala e ona", "report.mute_explanation": "sina kama ala lukin e ijo pana ona. ona li awen ken kute e sina li awen ken lukin e sina li sona ala e weka kute sina e weka lukin sina.", "report.reasons.dislike": "ni li ike tawa mi", + "report.reasons.legal": "ni li ike tawa lawa", + "report.reasons.other": "ni li ike tan ante", + "report.reasons.spam": "ni li ike tan toki mute", "report.thanks.title": "sina wile ala lukin e ni anu seme?", + "report.unfollow": "o pini kute e {name}", "search.placeholder": "o alasa", "search.quick_action.go_to_account": "o tawa lipu jan {x}", "search_popout.language_code": "nimi toki kepeken nasin ISO", @@ -196,27 +277,40 @@ "status.edit": "o ante", "status.edited": "ni li ante lon {date}", "status.embed": "ni o lon insa pi lipu ante", + "status.favourite": "o suli", + "status.hide": "o len", "status.history.created": "{name} li pali e ni lon {date}", "status.history.edited": "{name} li ante lon {date}", "status.load_more": "o kama e ijo ante", "status.media.open": "o open", "status.media.show": "o lukin", "status.media_hidden": "sitelen li len", - "status.mute": "o kute ala e @{name}", + "status.mute": "o len e @{name}", "status.mute_conversation": "o kute ala e ijo pi toki ni", + "status.pin": "o sewi lon lipu sina", + "status.pinned": "toki sewi", + "status.reblog": "o wawa", + "status.share": "o pana tawa ante", "status.show_less": "o lili e ni", "status.show_less_all": "o lili e ale", "status.show_more": "o suli e ni", "status.show_more_all": "o suli e ale", - "status.show_original": "ijo mama pi ijo ni li seme", + "status.show_original": "o lukin e mama", + "status.translate": "o ante pi nasin toki", + "status.translated_from_with": "toki li ante tan {lang} kepeken {provider}", "status.uncached_media_warning": "lukin lili li weka", "status.unmute_conversation": "o ken kute e ijo pi toki ni", + "status.unpin": "o sewi ala lon lipu sina", + "subscribed_languages.save": "o awen e ante", + "tabs_bar.home": "lipu open", "timeline_hint.resources.statuses": "ijo pi tenpo suli", "units.short.million": "{count}AAA", + "upload_button.label": "o pana e sitelen anu kalama", "upload_error.limit": "ilo li ken ala e suli pi ijo ni.", "upload_form.audio_description": "o toki e ijo kute tawa jan pi kute ala, tawa jan pi kute lili", "upload_form.description": "o toki e ijo lukin tawa jan pi lukin ala, tawa jan pi lukin lili", "upload_form.edit": "o ante", + "upload_form.thumbnail": "o ante e sitelen lili", "upload_form.video_description": "o toki e ijo kute tawa jan pi kute ala, tawa jan pi kute lili, e ijo lukin tawa jan pi lukin ala, tawa jan pi lukin lili", "upload_modal.choose_image": "o wile e sitelen", "upload_modal.description_placeholder": "mi pu jaki tan soweli", @@ -225,7 +319,12 @@ "upload_modal.preparing_ocr": "ilo li open e alasa nimi lon sitelen…", "upload_progress.label": "ilo li kama jo e ijo sina...", "upload_progress.processing": "ilo li pali…", - "username.taken": "jan ante li jo e nimi ni. sina o pali e nimi sin.", + "username.taken": "jan ante li kepeken e nimi ni. sina o kepeken e nimi sin", + "video.close": "o weka e ni", + "video.download": "o jo e ni", + "video.exit_fullscreen": "o weka tan sitelen suli", + "video.expand": "o suli e ni", + "video.hide": "o len e sitelen", "video.mute": "o kalama ala", "video.pause": "o lape e ni", "video.unmute": "o kalama" diff --git a/config/locales/activerecord.tok.yml b/config/locales/activerecord.tok.yml index 5623538ba9..9862a7f953 100644 --- a/config/locales/activerecord.tok.yml +++ b/config/locales/activerecord.tok.yml @@ -4,3 +4,11 @@ tok: attributes: poll: expires_at: pini tenpo + user/account: + username: nimi jan + errors: + models: + account: + attributes: + username: + reserved: jan ante li jo e nimi ni diff --git a/config/locales/doorkeeper.tok.yml b/config/locales/doorkeeper.tok.yml index d15ecd21b2..6aef4fb34b 100644 --- a/config/locales/doorkeeper.tok.yml +++ b/config/locales/doorkeeper.tok.yml @@ -1 +1,51 @@ +--- tok: + doorkeeper: + applications: + buttons: + cancel: o pini + destroy: o weka + edit: o ante + submit: o awen + confirmations: + destroy: ni li pona ala pona? + edit: + title: o ante e ilo nanpa + form: + error: 'pakala a! o lukin e ni: lipu sina li jo ala jo e pakala.' + index: + delete: o weka + empty: sina li jo e ilo nanpa ala. + name: nimi + new: o pali e ilo nanpa sin + title: ilo nanpa sina + new: + title: o pali e ilo nanpa sin + show: + title: ilo nanpa pi nimi %{name} + authorizations: + error: + title: pakala li lon. + authorized_applications: + confirmations: + revoke: ni li pona ala pona? + index: + scopes: ken + errors: + messages: + invalid_request: + missing_param: o pana e sona "%{value}". + flash: + applications: + create: + notice: sina pali e ilo nanpa. + destroy: + notice: sina weka e ilo nanpa. + update: + notice: sina ante e ilo nanpa. + authorized_applications: + destroy: + notice: sina weka e ilo nanpa tawa sina. + grouped_scopes: + access: + read: lukin taso diff --git a/config/locales/simple_form.tok.yml b/config/locales/simple_form.tok.yml index 1eb7d5be87..37b0ee765a 100644 --- a/config/locales/simple_form.tok.yml +++ b/config/locales/simple_form.tok.yml @@ -5,8 +5,8 @@ tok: account: display_name: nimi sina ale anu nimi sina musi. defaults: - setting_display_media_hide_all: tenpo ale la, o weka e sitelen - setting_display_media_show_all: tenpo ale la, o awen e sitelen + setting_display_media_hide_all: sitelen ale li len + setting_display_media_show_all: sitelen ale li len ala labels: defaults: expires_in: ona o moli lon diff --git a/config/locales/sk.yml b/config/locales/sk.yml index f13a15d795..88617967ff 100644 --- a/config/locales/sk.yml +++ b/config/locales/sk.yml @@ -88,7 +88,7 @@ sk: remote: Federované title: Umiestnenie login_status: Stav prihlásenia - media_attachments: Prílohy + media_attachments: Mediálne prílohy memorialize: Zmeň na "Navždy budeme spomínať" memorialized: Spomienka na memorialized_msg: Úspešne zmenené %{username} na spomienkové konto diff --git a/config/locales/tok.yml b/config/locales/tok.yml index d15ecd21b2..9f962d2b53 100644 --- a/config/locales/tok.yml +++ b/config/locales/tok.yml @@ -1 +1,5 @@ +--- tok: + admin: + accounts: + are_you_sure: ni li pona ala pona? From 8125dae5a84e3115be6f487b337ac942c70a81f0 Mon Sep 17 00:00:00 2001 From: Claire Date: Mon, 12 Feb 2024 10:54:06 +0100 Subject: [PATCH 101/211] Rename `ES_CA_CERT` to `ES_CA_FILE` for consistency (#29147) --- config/initializers/chewy.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/config/initializers/chewy.rb b/config/initializers/chewy.rb index 0fb311dbb3..0d9fc75e99 100644 --- a/config/initializers/chewy.rb +++ b/config/initializers/chewy.rb @@ -7,7 +7,7 @@ user = ENV.fetch('ES_USER', nil).presence password = ENV.fetch('ES_PASS', nil).presence fallback_prefix = ENV.fetch('REDIS_NAMESPACE', nil).presence prefix = ENV.fetch('ES_PREFIX') { fallback_prefix } -ca_file = ENV.fetch('ES_CA_CERT', nil).presence +ca_file = ENV.fetch('ES_CA_FILE', nil).presence transport_options = { ssl: { ca_file: ca_file } } if ca_file.present? From 6482948547beb35ecd5ad583a49e2c47c35cb0dd Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Mon, 12 Feb 2024 09:59:05 +0000 Subject: [PATCH 102/211] New Crowdin Translations (automated) (#29156) Co-authored-by: GitHub Actions --- app/javascript/mastodon/locales/be.json | 4 ++-- app/javascript/mastodon/locales/bg.json | 12 ++++++------ app/javascript/mastodon/locales/ca.json | 2 +- app/javascript/mastodon/locales/de.json | 12 ++++++------ app/javascript/mastodon/locales/ia.json | 8 ++++++++ app/javascript/mastodon/locales/sv.json | 1 + app/javascript/mastodon/locales/tok.json | 6 ++++-- config/locales/ca.yml | 2 +- config/locales/devise.ia.yml | 2 ++ config/locales/devise.ro.yml | 9 +++++++++ config/locales/doorkeeper.ia.yml | 1 + config/locales/ia.yml | 3 +++ config/locales/simple_form.bg.yml | 2 +- config/locales/simple_form.ia.yml | 1 + config/locales/simple_form.zh-TW.yml | 4 ++-- config/locales/sk.yml | 4 +++- 16 files changed, 51 insertions(+), 22 deletions(-) diff --git a/app/javascript/mastodon/locales/be.json b/app/javascript/mastodon/locales/be.json index daff6563e8..7e21703b4a 100644 --- a/app/javascript/mastodon/locales/be.json +++ b/app/javascript/mastodon/locales/be.json @@ -152,8 +152,8 @@ "compose_form.poll.switch_to_multiple": "Змяніце апытанне, каб дазволіць некалькі варыянтаў адказу", "compose_form.poll.switch_to_single": "Змяніце апытанне, каб дазволіць адзіны варыянт адказу", "compose_form.poll.type": "Стыль", - "compose_form.publish": "Допіс", - "compose_form.publish_form": "Апублікаваць", + "compose_form.publish": "Даслаць", + "compose_form.publish_form": "Новы допіс", "compose_form.reply": "Адказаць", "compose_form.save_changes": "Абнавіць", "compose_form.spoiler.marked": "Выдаліць папярэджанне аб змесціве", diff --git a/app/javascript/mastodon/locales/bg.json b/app/javascript/mastodon/locales/bg.json index 99c0f8b102..95572a7932 100644 --- a/app/javascript/mastodon/locales/bg.json +++ b/app/javascript/mastodon/locales/bg.json @@ -3,7 +3,7 @@ "about.contact": "За контакти:", "about.disclaimer": "Mastodon е безплатен софтуер с отворен изходен код и търговска марка на Mastodon gGmbH.", "about.domain_blocks.no_reason_available": "Няма налична причина", - "about.domain_blocks.preamble": "Mastodon обикновено позволява да разглеждате съдържание и да взаимодействате с други потребители от всякакви сървъри във Федивърс. Има изключения, направени конкретно за този сървър.", + "about.domain_blocks.preamble": "Mastodon обикновено позволява да разглеждате съдържание и да взаимодействате с други потребители от всякакви сървъри във Федивселената. Има изключения, направени конкретно за този сървър.", "about.domain_blocks.silenced.explanation": "Обикновено няма да виждате профили и съдържание, освен ако изрично не го потърсите или се включете в него, следвайки го.", "about.domain_blocks.silenced.title": "Ограничено", "about.domain_blocks.suspended.explanation": "Никакви данни от този сървър няма да се обработват, съхраняват или обменят, правещи невъзможно всяко взаимодействие или комуникация с потребители от тези сървъри.", @@ -110,7 +110,7 @@ "column.about": "Относно", "column.blocks": "Блокирани потребители", "column.bookmarks": "Отметки", - "column.community": "Локална часова ос", + "column.community": "Локален инфопоток", "column.direct": "Частни споменавания", "column.directory": "Разглеждане на профили", "column.domain_blocks": "Блокирани домейни", @@ -228,7 +228,7 @@ "empty_column.account_unavailable": "Профилът не е наличен", "empty_column.blocks": "Още не сте блокирали никакви потребители.", "empty_column.bookmarked_statuses": "Още не сте отметнали публикации. Отметвайки някоя, то тя ще се покаже тук.", - "empty_column.community": "Местната часова ос е празна. Напишете нещо обществено, за да завъртите нещата!", + "empty_column.community": "Локалният инфопоток е празен. Публикувайте нещо, за да започнете!", "empty_column.direct": "Още нямате никакви частни споменавания. Тук ще се показват, изпращайки или получавайки едно.", "empty_column.domain_blocks": "Още няма блокирани домейни.", "empty_column.explore_statuses": "Няма нищо налагащо се в момента. Проверете пак по-късно!", @@ -348,10 +348,10 @@ "keyboard_shortcuts.favourites": "Отваряне на списъка с любими", "keyboard_shortcuts.federated": "Отваряне на федерирания инфопоток", "keyboard_shortcuts.heading": "Клавишни съчетания", - "keyboard_shortcuts.home": "Отваряне на началната часова ос", + "keyboard_shortcuts.home": "Отваряне на личния инфопоток", "keyboard_shortcuts.hotkey": "Бърз клавиш", "keyboard_shortcuts.legend": "Показване на тази легенда", - "keyboard_shortcuts.local": "Отваряне на местна часова ос", + "keyboard_shortcuts.local": "Отваряне на локалния инфопоток", "keyboard_shortcuts.mention": "Споменаване на автора", "keyboard_shortcuts.muted": "Отваряне на списъка със заглушени потребители", "keyboard_shortcuts.my_profile": "Отваряне на профила ви", @@ -402,7 +402,7 @@ "navigation_bar.advanced_interface": "Отваряне в разширен уебинтерфейс", "navigation_bar.blocks": "Блокирани потребители", "navigation_bar.bookmarks": "Отметки", - "navigation_bar.community_timeline": "Локална часова ос", + "navigation_bar.community_timeline": "Локален инфопоток", "navigation_bar.compose": "Съставяне на нова публикация", "navigation_bar.direct": "Частни споменавания", "navigation_bar.discover": "Откриване", diff --git a/app/javascript/mastodon/locales/ca.json b/app/javascript/mastodon/locales/ca.json index 0ae471e023..42de594cdc 100644 --- a/app/javascript/mastodon/locales/ca.json +++ b/app/javascript/mastodon/locales/ca.json @@ -532,7 +532,7 @@ "privacy.public.short": "Públic", "privacy.unlisted.additional": "Es comporta igual que públic, excepte que la publicació no apareixerà als canals en directe o etiquetes, l'explora o a la cerca de Mastodon, fins i tot si ho heu activat a nivell de compte.", "privacy.unlisted.long": "Menys fanfàrries algorísmiques", - "privacy.unlisted.short": "Públic tranquil", + "privacy.unlisted.short": "Públic silenciós", "privacy_policy.last_updated": "Darrera actualització {date}", "privacy_policy.title": "Política de Privacitat", "recommended": "Recomanat", diff --git a/app/javascript/mastodon/locales/de.json b/app/javascript/mastodon/locales/de.json index cb90252c7f..f29d016b07 100644 --- a/app/javascript/mastodon/locales/de.json +++ b/app/javascript/mastodon/locales/de.json @@ -146,12 +146,12 @@ "compose_form.lock_disclaimer.lock": "geschützt", "compose_form.placeholder": "Was gibt’s Neues?", "compose_form.poll.duration": "Umfragedauer", - "compose_form.poll.multiple": "Mehrfachauswahl", - "compose_form.poll.option_placeholder": "{number}. Auswahlmöglichkeit", + "compose_form.poll.multiple": "Mul­ti­ple-Choice", + "compose_form.poll.option_placeholder": "Option {number}", "compose_form.poll.single": "Einfachauswahl", "compose_form.poll.switch_to_multiple": "Mehrfachauswahl erlauben", "compose_form.poll.switch_to_single": "Nur Einfachauswahl erlauben", - "compose_form.poll.type": "Art", + "compose_form.poll.type": "Stil", "compose_form.publish": "Veröffentlichen", "compose_form.publish_form": "Neuer Beitrag", "compose_form.reply": "Antworten", @@ -277,9 +277,9 @@ "follow_request.authorize": "Genehmigen", "follow_request.reject": "Ablehnen", "follow_requests.unlocked_explanation": "Auch wenn dein Konto öffentlich bzw. nicht geschützt ist, haben die Moderator*innen von {domain} gedacht, dass du diesen Follower lieber manuell bestätigen solltest.", - "follow_suggestions.curated_suggestion": "Vom Server empfohlen", + "follow_suggestions.curated_suggestion": "Auswahl des Herausgebers", "follow_suggestions.dismiss": "Nicht mehr anzeigen", - "follow_suggestions.personalized_suggestion": "Personalisierte Empfehlung", + "follow_suggestions.personalized_suggestion": "Persönliche Empfehlung", "follow_suggestions.popular_suggestion": "Beliebte Empfehlung", "follow_suggestions.view_all": "Alle anzeigen", "follow_suggestions.who_to_follow": "Empfohlene Profile", @@ -528,7 +528,7 @@ "privacy.direct.short": "Bestimmte Profile", "privacy.private.long": "Nur deine Follower", "privacy.private.short": "Follower", - "privacy.public.long": "Alle auf und außerhalb von Mastodon", + "privacy.public.long": "Alle in und außerhalb von Mastodon", "privacy.public.short": "Öffentlich", "privacy.unlisted.additional": "Das Verhalten ist wie bei „Öffentlich“, jedoch erscheint dieser Beitrag nicht in „Live-Feeds“, „Erkunden“, Hashtags oder über die Mastodon-Suchfunktion – selbst wenn du das in den Einstellungen aktiviert hast.", "privacy.unlisted.long": "Weniger im Algorithmus berücksichtigt", diff --git a/app/javascript/mastodon/locales/ia.json b/app/javascript/mastodon/locales/ia.json index 10328efd0e..0796662851 100644 --- a/app/javascript/mastodon/locales/ia.json +++ b/app/javascript/mastodon/locales/ia.json @@ -2,8 +2,10 @@ "about.blocks": "Servitores moderate", "about.contact": "Contacto:", "about.disclaimer": "Mastodon es software libere, de codice aperte, e un marca de Mastodon gGmbH.", + "about.domain_blocks.no_reason_available": "Ration non disponibile", "about.domain_blocks.silenced.title": "Limitate", "about.domain_blocks.suspended.title": "Suspendite", + "about.not_available": "Iste information non faceva disponibile in iste servitor.", "about.rules": "Regulas del servitor", "account.account_note_header": "Nota", "account.add_or_remove_from_list": "Adder o remover ab listas", @@ -153,6 +155,7 @@ "disabled_account_banner.account_settings": "Parametros de conto", "disabled_account_banner.text": "Tu conto {disabledAccount} es actualmente disactivate.", "dismissable_banner.dismiss": "Dimitter", + "embed.preview": "Hic es como il parera:", "emoji_button.activity": "Activitate", "emoji_button.clear": "Rader", "emoji_button.custom": "Personalisate", @@ -171,6 +174,11 @@ "empty_column.account_timeline": "Nulle messages hic!", "empty_column.account_unavailable": "Profilo non disponibile", "empty_column.blocks": "Tu non ha blocate alcun usator ancora.", + "empty_column.domain_blocks": "Il non ha dominios blocate ancora.", + "empty_column.explore_statuses": "Nihil es in tendentias ora mesme. Retorna postea!", + "empty_column.favourited_statuses": "Tu non ha necun messages favorite ancora. Quando tu marca un como favorito, ille essera monstrate hic.", + "empty_column.followed_tags": "Tu ancora non ha sequite necun hashtags. Quando tu lo face, illes essera monstrate hic.", + "empty_column.hashtag": "Ancora non il ha nihil in iste hashtag.", "errors.unexpected_crash.report_issue": "Signalar un defecto", "explore.search_results": "Resultatos de recerca", "explore.suggested_follows": "Personas", diff --git a/app/javascript/mastodon/locales/sv.json b/app/javascript/mastodon/locales/sv.json index f9356fd279..4a15c60ed8 100644 --- a/app/javascript/mastodon/locales/sv.json +++ b/app/javascript/mastodon/locales/sv.json @@ -148,6 +148,7 @@ "compose_form.poll.duration": "Varaktighet för omröstning", "compose_form.poll.multiple": "Flera val", "compose_form.poll.option_placeholder": "Alternativ {number}", + "compose_form.poll.single": "Välj en", "compose_form.poll.switch_to_multiple": "Ändra enkät för att tillåta flera val", "compose_form.poll.switch_to_single": "Ändra enkät för att tillåta ett enda val", "compose_form.poll.type": "Stil", diff --git a/app/javascript/mastodon/locales/tok.json b/app/javascript/mastodon/locales/tok.json index 7270d52067..ba45f84453 100644 --- a/app/javascript/mastodon/locales/tok.json +++ b/app/javascript/mastodon/locales/tok.json @@ -11,12 +11,12 @@ "account.block": "o weka e @{name}", "account.block_domain": "o weka e ma {domain}", "account.block_short": "o weka e jan tawa mi", - "account.blocked": "jan ni li weka tawa mi", + "account.blocked": "jan li weka tawa mi", "account.browse_more_on_origin_server": "sina tawa ma tan pi jan ni la sina ken lukin e mute", "account.cancel_follow_request": "o pini kute", "account.copy": "o pali same e linja pi lipu jan", "account.direct": "len la o mu e @{name}", - "account.disable_notifications": "@{name} li toki la o toki ala e toki ona tawa mi", + "account.disable_notifications": "@{name} li toki la o mu ala e mi", "account.domain_blocked": "ma ni li weka tawa sina", "account.edit_profile": "o ante e lipu mi", "account.enable_notifications": "@{name} li toki la o toki e toki ona tawa mi", @@ -92,6 +92,7 @@ "compose.published.open": "o lukin", "compose.saved.body": "ilo li awen e ijo pana sina.", "compose_form.direct_message_warning_learn_more": "o kama sona e ijo ante", + "compose_form.encryption_warning": "toki li len ala lon ilo Masoton ꞏ o pana ala e sona suli len lon ilo Masoton", "compose_form.placeholder": "sina wile toki e seme?", "compose_form.poll.duration": "tenpo pana", "compose_form.poll.multiple": "pana mute", @@ -117,6 +118,7 @@ "confirmations.discard_edit_media.confirm": "o weka", "confirmations.discard_edit_media.message": "toki sitelen anu lukin lili sitelen la ante pi awen ala li lon. sina wile weka e ante ni?", "confirmations.domain_block.confirm": "o weka.", + "confirmations.domain_block.message": "sina wile ala a wile a len e ma {domain} ꞏ ken suli la len jan taso li pona ꞏ len pi ma ni la sina ken ala lukin e ijo pi ma ni lon lipu toki ale anu lukin toki ꞏ len ni la jan kute sina pi ma ni li weka", "confirmations.edit.confirm": "o ante", "confirmations.logout.confirm": "o weka", "confirmations.logout.message": "sina wile ala wile weka", diff --git a/config/locales/ca.yml b/config/locales/ca.yml index 58f6e26374..f79d63a459 100644 --- a/config/locales/ca.yml +++ b/config/locales/ca.yml @@ -1548,7 +1548,7 @@ ca: unrecognized_emoji: no és un emoji reconegut redirects: prompt: Si confieu en aquest enllaç, feu-hi clic per a continuar. - title: Esteu sortint de %{instance}. + title: Deixeu %{instance}. relationships: activity: Activitat del compte confirm_follow_selected_followers: Segur que vols seguir els seguidors seleccionats? diff --git a/config/locales/devise.ia.yml b/config/locales/devise.ia.yml index c07e75feff..4b4d1f441b 100644 --- a/config/locales/devise.ia.yml +++ b/config/locales/devise.ia.yml @@ -39,6 +39,8 @@ ia: webauthn_enabled: title: Claves de securitate activate registrations: + destroyed: A revider! Tu conto esseva cancellate con successo. Nos spera vider te novemente tosto. + signed_up_but_pending: Un message con un ligamine de confirmation esseva inviate a tu conto de email. Post que tu clicca le ligamine, nos revidera tu application. Tu essera notificate si illo es approbate. updated: Tu conto ha essite actualisate con successo. unlocks: unlocked: Tu conto ha essite disblocate con successo. Initia session a continuar. diff --git a/config/locales/devise.ro.yml b/config/locales/devise.ro.yml index 1a6a3ecd77..868bb4b3a1 100644 --- a/config/locales/devise.ro.yml +++ b/config/locales/devise.ro.yml @@ -47,14 +47,19 @@ ro: subject: Instrucțiuni pentru resetarea parolei title: Resetare parolă two_factor_disabled: + explanation: Conectarea este acum posibilă folosind doar adresa de e-mail și parola. subject: Autentificare cu doi factori dezactivată + subtitle: Autentificarea cu doi factori pentru contul dvs. a fost dezactivată. title: 2FA dezactivat two_factor_enabled: + explanation: Pentru autentificare va fi necesar un token generat de aplicația TOTP asociată. subject: Autentificare în doi pași activată + subtitle: Autentificarea cu doi factori a fost activată pentru contul dvs. title: 2FA activat two_factor_recovery_codes_changed: explanation: Codurile anterioare de recuperare au fost invalidate și unele noi generate. subject: Recuperare în doi factori + subtitle: Codurile de recuperare anterioare au fost invalidate și s-au generat altele noi. title: Coduri de recuperare 2FA modificate unlock_instructions: subject: Instrucțiuni de deblocare @@ -68,9 +73,13 @@ ro: subject: 'Mastodon: Cheie de securitate ștearsă' title: Una dintre cheile tale de securitate a fost ștearsă webauthn_disabled: + explanation: Autentificarea cu chei de securitate a fost dezactivată pentru contul dvs. + extra: Conectarea este acum posibilă folosind doar token-ul generat de aplicația TOTP asociată. subject: 'Mastodon: Autentificarea cu chei de securitate dezactivată' title: Chei de securitate dezactivate webauthn_enabled: + explanation: Autentificarea cu cheie de securitate a fost activată pentru contul dvs. + extra: Cheia ta de securitate poate fi acum folosită pentru conectare. subject: 'Mastodon: Autentificarea cheii de securitate activată' title: Chei de securitate activate omniauth_callbacks: diff --git a/config/locales/doorkeeper.ia.yml b/config/locales/doorkeeper.ia.yml index e7e6f03cdb..443342b404 100644 --- a/config/locales/doorkeeper.ia.yml +++ b/config/locales/doorkeeper.ia.yml @@ -34,6 +34,7 @@ ia: confirmations: revoke: Es tu secur? index: + last_used_at: Ultime uso in %{date} never_used: Nunquam usate scopes: Permissiones title: Tu applicationes autorisate diff --git a/config/locales/ia.yml b/config/locales/ia.yml index bf7da9a314..a85af012f3 100644 --- a/config/locales/ia.yml +++ b/config/locales/ia.yml @@ -236,6 +236,8 @@ ia: migrations: errors: not_found: non poterea esser trovate + preferences: + public_timelines: Chronologias public statuses_cleanup: min_age: '1209600': 2 septimanas @@ -254,6 +256,7 @@ ia: disable: Disactivar 2FA user_mailer: welcome: + final_step: 'Comencia a publicar! Mesmo sin sequitores, tu messages public poterea esser reguardate per alteres, per exemplo in le chronologia local o in hashtags. Tu poterea voler introducer te con le hashtag #introductiones.' subject: Benvenite in Mastodon webauthn_credentials: delete: Deler diff --git a/config/locales/simple_form.bg.yml b/config/locales/simple_form.bg.yml index 68e45ef47b..a4637a6810 100644 --- a/config/locales/simple_form.bg.yml +++ b/config/locales/simple_form.bg.yml @@ -261,7 +261,7 @@ bg: status_page_url: URL адрес на страница със състоянието theme: Стандартна тема thumbnail: Образче на сървъра - timeline_preview: Позволяване на неупълномощен достъп до публични часови оси + timeline_preview: Позволяване на неудостоверен достъп до публични инфопотоци trendable_by_default: Без преглед на налагащото се trends: Включване на налагащи се trends_as_landing_page: Употреба на налагащото се като целева страница diff --git a/config/locales/simple_form.ia.yml b/config/locales/simple_form.ia.yml index 552abb2550..af198d932a 100644 --- a/config/locales/simple_form.ia.yml +++ b/config/locales/simple_form.ia.yml @@ -26,6 +26,7 @@ ia: username: Nomine de usator username_or_email: Nomine de usator o e-mail form_admin_settings: + bootstrap_timeline_accounts: Recommenda sempre iste contos a nove usatores custom_css: CSS personalisate profile_directory: Activar directorio de profilos site_contact_email: Adresse de e-mail de contacto diff --git a/config/locales/simple_form.zh-TW.yml b/config/locales/simple_form.zh-TW.yml index a31ad5eb11..696fd5fed9 100644 --- a/config/locales/simple_form.zh-TW.yml +++ b/config/locales/simple_form.zh-TW.yml @@ -200,12 +200,12 @@ zh-TW: password: 密碼 phrase: 關鍵字或片語 setting_advanced_layout: 啟用進階網頁介面 - setting_aggregate_reblogs: 時間軸中的群組轉嘟 + setting_aggregate_reblogs: 於時間軸中不重複顯示轉嘟 setting_always_send_emails: 總是發送電子郵件通知 setting_auto_play_gif: 自動播放 GIF 動畫 setting_boost_modal: 轉嘟前先詢問我 setting_default_language: 嘟文語言 - setting_default_privacy: 嘟文可見範圍 + setting_default_privacy: 嘟文隱私設定 setting_default_sensitive: 總是將媒體標記為敏感內容 setting_delete_modal: 刪除嘟文前先詢問我 setting_disable_swiping: 停用滑動手勢 diff --git a/config/locales/sk.yml b/config/locales/sk.yml index 88617967ff..520b64f886 100644 --- a/config/locales/sk.yml +++ b/config/locales/sk.yml @@ -251,14 +251,16 @@ sk: enable_user_html: "%{name} povolil/a prihlásenie pre používateľa %{target}" memorialize_account_html: "%{name} zmenil/a účet %{target} na pamätnú stránku" reject_appeal_html: "%{name} zamietol/la námietku moderovacieho rozhodnutia od %{target}" + remove_avatar_user_html: "%{name} vymazal/a %{target}/ov/in avatar" reopen_report_html: "%{name} znovu otvoril/a nahlásenie %{target}" resend_user_html: "%{name} znovu odoslal/a potvrdzovací email pre %{target}" reset_password_user_html: "%{name} resetoval/a heslo používateľa %{target}" resolve_report_html: "%{name} vyriešil/a nahlásenie %{target}" - sensitive_account_html: "%{name} označil médium od %{target} za chúlostivé" + sensitive_account_html: "%{name} označil/a médium od %{target} za chúlostivé" silence_account_html: "%{name} obmedzil/a účet %{target}" suspend_account_html: "%{name} zablokoval/a účet používateľa %{target}" unassigned_report_html: "%{name} odobral/a report od %{target}" + unsensitive_account_html: "%{name} odznačil/a médium od %{target} ako chúlostivé" unsuspend_account_html: "%{name} spojazdnil/a účet %{target}" update_announcement_html: "%{name} aktualizoval/a oboznámenie %{target}" update_custom_emoji_html: "%{name} aktualizoval/a emotikonu %{target}" From 58918844a90b9a3f5bd39d3ed525f7bcbe02ef32 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 12 Feb 2024 11:20:54 +0100 Subject: [PATCH 103/211] Update peter-evans/create-pull-request action to v6 (#29167) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- .github/workflows/crowdin-download.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/crowdin-download.yml b/.github/workflows/crowdin-download.yml index d3988d2f1a..a676ff12fc 100644 --- a/.github/workflows/crowdin-download.yml +++ b/.github/workflows/crowdin-download.yml @@ -52,7 +52,7 @@ jobs: # Create or update the pull request - name: Create Pull Request - uses: peter-evans/create-pull-request@v5.0.2 + uses: peter-evans/create-pull-request@v6.0.0 with: commit-message: 'New Crowdin translations' title: 'New Crowdin Translations (automated)' From cf0d6bef8b62acd8f4594f56e9096817149a6135 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 12 Feb 2024 11:21:17 +0100 Subject: [PATCH 104/211] Update eslint (non-major) (#29166) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- yarn.lock | 122 +++++++++++++++++++++++++++--------------------------- 1 file changed, 61 insertions(+), 61 deletions(-) diff --git a/yarn.lock b/yarn.lock index fb34729048..351fd31ab4 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1697,14 +1697,14 @@ __metadata: languageName: node linkType: hard -"@es-joy/jsdoccomment@npm:~0.41.0": - version: 0.41.0 - resolution: "@es-joy/jsdoccomment@npm:0.41.0" +"@es-joy/jsdoccomment@npm:~0.42.0": + version: 0.42.0 + resolution: "@es-joy/jsdoccomment@npm:0.42.0" dependencies: comment-parser: "npm:1.4.1" esquery: "npm:^1.5.0" jsdoc-type-pratt-parser: "npm:~4.0.0" - checksum: 1fa27531eba32e4699664da53a0865aeeda1f7e83ac156fe53b7a6b09d2f3816baa94a34845ff019c10289b09572bda5519ec917e3e241088975477fa880f72d + checksum: a8122762d2df3c6501a9c459e2822315a23c0078c4aeb0b40fb3c84b99e21a78e85e67f962d6b5dde5eb751792a1c67c6a170b619573db7151098a19950abe35 languageName: node linkType: hard @@ -3663,14 +3663,14 @@ __metadata: linkType: hard "@typescript-eslint/eslint-plugin@npm:^6.0.0": - version: 6.20.0 - resolution: "@typescript-eslint/eslint-plugin@npm:6.20.0" + version: 6.21.0 + resolution: "@typescript-eslint/eslint-plugin@npm:6.21.0" dependencies: "@eslint-community/regexpp": "npm:^4.5.1" - "@typescript-eslint/scope-manager": "npm:6.20.0" - "@typescript-eslint/type-utils": "npm:6.20.0" - "@typescript-eslint/utils": "npm:6.20.0" - "@typescript-eslint/visitor-keys": "npm:6.20.0" + "@typescript-eslint/scope-manager": "npm:6.21.0" + "@typescript-eslint/type-utils": "npm:6.21.0" + "@typescript-eslint/utils": "npm:6.21.0" + "@typescript-eslint/visitor-keys": "npm:6.21.0" debug: "npm:^4.3.4" graphemer: "npm:^1.4.0" ignore: "npm:^5.2.4" @@ -3683,44 +3683,44 @@ __metadata: peerDependenciesMeta: typescript: optional: true - checksum: 5020faac39be476de056342f58f2bf68bb788f230e2fa4a2e27ceab8a5187dc450beba7333b0aa741a43aeaff45a117558132953f9390b5eca4c2cc004fde716 + checksum: f911a79ee64d642f814a3b6cdb0d324b5f45d9ef955c5033e78903f626b7239b4aa773e464a38c3e667519066169d983538f2bf8e5d00228af587c9d438fb344 languageName: node linkType: hard "@typescript-eslint/parser@npm:^6.17.0": - version: 6.20.0 - resolution: "@typescript-eslint/parser@npm:6.20.0" + version: 6.21.0 + resolution: "@typescript-eslint/parser@npm:6.21.0" dependencies: - "@typescript-eslint/scope-manager": "npm:6.20.0" - "@typescript-eslint/types": "npm:6.20.0" - "@typescript-eslint/typescript-estree": "npm:6.20.0" - "@typescript-eslint/visitor-keys": "npm:6.20.0" + "@typescript-eslint/scope-manager": "npm:6.21.0" + "@typescript-eslint/types": "npm:6.21.0" + "@typescript-eslint/typescript-estree": "npm:6.21.0" + "@typescript-eslint/visitor-keys": "npm:6.21.0" debug: "npm:^4.3.4" peerDependencies: eslint: ^7.0.0 || ^8.0.0 peerDependenciesMeta: typescript: optional: true - checksum: d84ad5e2282b1096c80dedb903c83ecc31eaf7be1aafcb14c18d9ec2d4a319f2fd1e5a9038b944d9f42c36c1c57add5e4292d4026ca7d3d5441d41286700d402 + checksum: a8f99820679decd0d115c0af61903fb1de3b1b5bec412dc72b67670bf636de77ab07f2a68ee65d6da7976039bbf636907f9d5ca546db3f0b98a31ffbc225bc7d languageName: node linkType: hard -"@typescript-eslint/scope-manager@npm:6.20.0": - version: 6.20.0 - resolution: "@typescript-eslint/scope-manager@npm:6.20.0" +"@typescript-eslint/scope-manager@npm:6.21.0": + version: 6.21.0 + resolution: "@typescript-eslint/scope-manager@npm:6.21.0" dependencies: - "@typescript-eslint/types": "npm:6.20.0" - "@typescript-eslint/visitor-keys": "npm:6.20.0" - checksum: f6768ed2dcd2d1771d55ed567ff392a6569ffd683a26500067509dd41769f8838c43686460fe7337144f324fd063df33f5d5646d44e5df4998ceffb3ad1fb790 + "@typescript-eslint/types": "npm:6.21.0" + "@typescript-eslint/visitor-keys": "npm:6.21.0" + checksum: eaf868938d811cbbea33e97e44ba7050d2b6892202cea6a9622c486b85ab1cf801979edf78036179a8ba4ac26f1dfdf7fcc83a68c1ff66be0b3a8e9a9989b526 languageName: node linkType: hard -"@typescript-eslint/type-utils@npm:6.20.0": - version: 6.20.0 - resolution: "@typescript-eslint/type-utils@npm:6.20.0" +"@typescript-eslint/type-utils@npm:6.21.0": + version: 6.21.0 + resolution: "@typescript-eslint/type-utils@npm:6.21.0" dependencies: - "@typescript-eslint/typescript-estree": "npm:6.20.0" - "@typescript-eslint/utils": "npm:6.20.0" + "@typescript-eslint/typescript-estree": "npm:6.21.0" + "@typescript-eslint/utils": "npm:6.21.0" debug: "npm:^4.3.4" ts-api-utils: "npm:^1.0.1" peerDependencies: @@ -3728,23 +3728,23 @@ __metadata: peerDependenciesMeta: typescript: optional: true - checksum: 8f622fbb14268f1d00b2948f995b570f0ef82be02c12be41d90385290a56ea0dbd34d855d6a5aff100b57f3bdd300ff0c300f16c78f12d6064f7ae6e34fd71bf + checksum: 7409c97d1c4a4386b488962739c4f1b5b04dc60cf51f8cd88e6b12541f84d84c6b8b67e491a147a2c95f9ec486539bf4519fb9d418411aef6537b9c156468117 languageName: node linkType: hard -"@typescript-eslint/types@npm:6.20.0": - version: 6.20.0 - resolution: "@typescript-eslint/types@npm:6.20.0" - checksum: 37589003b0e06f83c1945e3748e91af85918cfd997766894642a08e6f355f611cfe11df4e7632dda96e3a9b3441406283fe834ab0906cf81ea97fd43ca2aebe3 +"@typescript-eslint/types@npm:6.21.0": + version: 6.21.0 + resolution: "@typescript-eslint/types@npm:6.21.0" + checksum: 020631d3223bbcff8a0da3efbdf058220a8f48a3de221563996ad1dcc30d6c08dadc3f7608cc08830d21c0d565efd2db19b557b9528921c78aabb605eef2d74d languageName: node linkType: hard -"@typescript-eslint/typescript-estree@npm:6.20.0": - version: 6.20.0 - resolution: "@typescript-eslint/typescript-estree@npm:6.20.0" +"@typescript-eslint/typescript-estree@npm:6.21.0": + version: 6.21.0 + resolution: "@typescript-eslint/typescript-estree@npm:6.21.0" dependencies: - "@typescript-eslint/types": "npm:6.20.0" - "@typescript-eslint/visitor-keys": "npm:6.20.0" + "@typescript-eslint/types": "npm:6.21.0" + "@typescript-eslint/visitor-keys": "npm:6.21.0" debug: "npm:^4.3.4" globby: "npm:^11.1.0" is-glob: "npm:^4.0.3" @@ -3754,34 +3754,34 @@ __metadata: peerDependenciesMeta: typescript: optional: true - checksum: 551f13445a303882d9fc0fbe14ef8507eb8414253fd87a5f13d2e324b5280b626421a238b8ec038e628bc80128dc06c057757f668738e82e64d5b39a9083c27d + checksum: af1438c60f080045ebb330155a8c9bb90db345d5069cdd5d01b67de502abb7449d6c75500519df829f913a6b3f490ade3e8215279b6bdc63d0fb0ae61034df5f languageName: node linkType: hard -"@typescript-eslint/utils@npm:6.20.0, @typescript-eslint/utils@npm:^6.18.1": - version: 6.20.0 - resolution: "@typescript-eslint/utils@npm:6.20.0" +"@typescript-eslint/utils@npm:6.21.0, @typescript-eslint/utils@npm:^6.18.1": + version: 6.21.0 + resolution: "@typescript-eslint/utils@npm:6.21.0" dependencies: "@eslint-community/eslint-utils": "npm:^4.4.0" "@types/json-schema": "npm:^7.0.12" "@types/semver": "npm:^7.5.0" - "@typescript-eslint/scope-manager": "npm:6.20.0" - "@typescript-eslint/types": "npm:6.20.0" - "@typescript-eslint/typescript-estree": "npm:6.20.0" + "@typescript-eslint/scope-manager": "npm:6.21.0" + "@typescript-eslint/types": "npm:6.21.0" + "@typescript-eslint/typescript-estree": "npm:6.21.0" semver: "npm:^7.5.4" peerDependencies: eslint: ^7.0.0 || ^8.0.0 - checksum: 0a8ede3d80a365b52ae96d88e4a9f6e6abf3569c6b60ff9f42ff900cd843ae7c5493cd95f8f2029d90bb0acbf31030980206af98e581d760d6d41e0f80e9fb86 + checksum: ab2df3833b2582d4e5467a484d08942b4f2f7208f8e09d67de510008eb8001a9b7460f2f9ba11c12086fd3cdcac0c626761c7995c2c6b5657d5fa6b82030a32d languageName: node linkType: hard -"@typescript-eslint/visitor-keys@npm:6.20.0": - version: 6.20.0 - resolution: "@typescript-eslint/visitor-keys@npm:6.20.0" +"@typescript-eslint/visitor-keys@npm:6.21.0": + version: 6.21.0 + resolution: "@typescript-eslint/visitor-keys@npm:6.21.0" dependencies: - "@typescript-eslint/types": "npm:6.20.0" + "@typescript-eslint/types": "npm:6.21.0" eslint-visitor-keys: "npm:^3.4.1" - checksum: 852d938f2e5d57200cf62733b42e73a369f797b097d17e8fd3fffd0f7315c3b9e1863eed60bb8d57d6535a3b7f1980f645f96ec6d513950f182bfa8107b33fab + checksum: 7395f69739cfa1cb83c1fb2fad30afa2a814756367302fb4facd5893eff66abc807e8d8f63eba94ed3b0fe0c1c996ac9a1680bcbf0f83717acedc3f2bb724fbf languageName: node linkType: hard @@ -7347,21 +7347,21 @@ __metadata: linkType: hard "eslint-plugin-jsdoc@npm:^48.0.0": - version: 48.0.4 - resolution: "eslint-plugin-jsdoc@npm:48.0.4" + version: 48.0.6 + resolution: "eslint-plugin-jsdoc@npm:48.0.6" dependencies: - "@es-joy/jsdoccomment": "npm:~0.41.0" + "@es-joy/jsdoccomment": "npm:~0.42.0" are-docs-informative: "npm:^0.0.2" comment-parser: "npm:1.4.1" debug: "npm:^4.3.4" escape-string-regexp: "npm:^4.0.0" esquery: "npm:^1.5.0" is-builtin-module: "npm:^3.2.1" - semver: "npm:^7.5.4" + semver: "npm:^7.6.0" spdx-expression-parse: "npm:^4.0.0" peerDependencies: eslint: ^7.0.0 || ^8.0.0 || ^9.0.0 - checksum: c73063d26ca70d37ea00eea9750d1f889e5bfda64ca46dbfc6bf4842b892551c320368220cb46acc9d3d96a89fd5391486650284b82dc722f700e3b5df5c78db + checksum: 7762793fb2a738d248144346e85b8c7ec2f975be1a24d45984a5d24da03723b76c66ead1b8064d60b18be09a9a9835320036a39fef917a1b6c83b916729d70dd languageName: node linkType: hard @@ -14721,14 +14721,14 @@ __metadata: languageName: node linkType: hard -"semver@npm:^7.3.2, semver@npm:^7.3.4, semver@npm:^7.3.5, semver@npm:^7.5.3, semver@npm:^7.5.4": - version: 7.5.4 - resolution: "semver@npm:7.5.4" +"semver@npm:^7.3.2, semver@npm:^7.3.4, semver@npm:^7.3.5, semver@npm:^7.5.3, semver@npm:^7.5.4, semver@npm:^7.6.0": + version: 7.6.0 + resolution: "semver@npm:7.6.0" dependencies: lru-cache: "npm:^6.0.0" bin: semver: bin/semver.js - checksum: 5160b06975a38b11c1ab55950cb5b8a23db78df88275d3d8a42ccf1f29e55112ac995b3a26a522c36e3b5f76b0445f1eef70d696b8c7862a2b4303d7b0e7609e + checksum: fbfe717094ace0aa8d6332d7ef5ce727259815bd8d8815700853f4faf23aacbd7192522f0dc5af6df52ef4fa85a355ebd2f5d39f554bd028200d6cf481ab9b53 languageName: node linkType: hard From 819ede190e1edeab1c42f41d53895e2bf784406d Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 12 Feb 2024 11:39:31 +0100 Subject: [PATCH 105/211] Update dependency dotenv to v16.4.2 (#29157) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- yarn.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/yarn.lock b/yarn.lock index 351fd31ab4..d76af5d9ef 100644 --- a/yarn.lock +++ b/yarn.lock @@ -6844,9 +6844,9 @@ __metadata: linkType: hard "dotenv@npm:^16.0.3": - version: 16.4.1 - resolution: "dotenv@npm:16.4.1" - checksum: ef3d95f48f38146df0881a4b58447ae437d2da3f6d645074b84de4e64ef64ba75fc357c5ed66b3c2b813b5369fdeb6a4777d6ade2d50e54eed6aa06dddc98bc4 + version: 16.4.2 + resolution: "dotenv@npm:16.4.2" + checksum: 04373a742f565896de1ab3eadcd15c1543b6d1fc37bb7ab2faa2286a0b3fd432aa02c6fd330ede758432f36865f0fb128afa2e5991e0a789b9011e720ba4a876 languageName: node linkType: hard From b244e5cb81bc49c54194cd340408b0b27c0802db Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Tue, 13 Feb 2024 08:56:46 +0100 Subject: [PATCH 106/211] Update dependency sidekiq-unique-jobs to v7.1.33 (#29175) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- Gemfile.lock | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Gemfile.lock b/Gemfile.lock index 152436b47a..00ca4663a8 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -707,7 +707,7 @@ GEM rufus-scheduler (~> 3.2) sidekiq (>= 6, < 8) tilt (>= 1.4.0) - sidekiq-unique-jobs (7.1.31) + sidekiq-unique-jobs (7.1.33) brpoplpush-redis_script (> 0.1.1, <= 2.0.0) concurrent-ruby (~> 1.0, >= 1.0.5) redis (< 5.0) From e25d9dfb25f9e412a5dabe1e27675130a285b0d3 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Tue, 13 Feb 2024 09:02:55 +0100 Subject: [PATCH 107/211] Update dependency dotenv to v16.4.3 (#29174) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- yarn.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/yarn.lock b/yarn.lock index d76af5d9ef..6088034d9b 100644 --- a/yarn.lock +++ b/yarn.lock @@ -6844,9 +6844,9 @@ __metadata: linkType: hard "dotenv@npm:^16.0.3": - version: 16.4.2 - resolution: "dotenv@npm:16.4.2" - checksum: 04373a742f565896de1ab3eadcd15c1543b6d1fc37bb7ab2faa2286a0b3fd432aa02c6fd330ede758432f36865f0fb128afa2e5991e0a789b9011e720ba4a876 + version: 16.4.3 + resolution: "dotenv@npm:16.4.3" + checksum: c6a572b2dab5d71accb7064c90b38dfd4068c2487be859a0f053460fcaa685a7718e78db51d643b32e0736b318988c31f8c45cb4ab99cd620278f537177cb0ab languageName: node linkType: hard From 5de1ce23c3debb019f926b297e19a7c37e229871 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Tue, 13 Feb 2024 10:08:55 +0100 Subject: [PATCH 108/211] New Crowdin Translations (automated) (#29182) Co-authored-by: GitHub Actions --- app/javascript/mastodon/locales/bg.json | 2 +- app/javascript/mastodon/locales/es.json | 2 ++ app/javascript/mastodon/locales/ro.json | 30 ++++++++++++++++++++++++ app/javascript/mastodon/locales/tok.json | 13 ++++++++++ 4 files changed, 46 insertions(+), 1 deletion(-) diff --git a/app/javascript/mastodon/locales/bg.json b/app/javascript/mastodon/locales/bg.json index 95572a7932..5a6fa175e8 100644 --- a/app/javascript/mastodon/locales/bg.json +++ b/app/javascript/mastodon/locales/bg.json @@ -524,7 +524,7 @@ "poll_button.add_poll": "Анкетиране", "poll_button.remove_poll": "Премахване на анкета", "privacy.change": "Промяна на поверителността на публикация", - "privacy.direct.long": "Всеки споменат в публикацията", + "privacy.direct.long": "Споменатите в публикацията", "privacy.direct.short": "Определени хора", "privacy.private.long": "Само последователите ви", "privacy.private.short": "Последователи", diff --git a/app/javascript/mastodon/locales/es.json b/app/javascript/mastodon/locales/es.json index d5e8f4239e..3e4f36ba5a 100644 --- a/app/javascript/mastodon/locales/es.json +++ b/app/javascript/mastodon/locales/es.json @@ -530,6 +530,8 @@ "privacy.private.short": "Seguidores", "privacy.public.long": "Cualquiera dentro y fuera de Mastodon", "privacy.public.short": "Público", + "privacy.unlisted.additional": "Esto se comporta exactamente igual que el público, excepto que la publicación no aparecerá en la cronología en directo o en las etiquetas, la exploración o búsqueda de Mastodon, incluso si está optado por activar la cuenta de usuario.", + "privacy.unlisted.long": "Menos fanfares algorítmicos", "privacy.unlisted.short": "Público tranquilo", "privacy_policy.last_updated": "Actualizado por última vez {date}", "privacy_policy.title": "Política de Privacidad", diff --git a/app/javascript/mastodon/locales/ro.json b/app/javascript/mastodon/locales/ro.json index d236ba4969..547493af18 100644 --- a/app/javascript/mastodon/locales/ro.json +++ b/app/javascript/mastodon/locales/ro.json @@ -21,6 +21,8 @@ "account.blocked": "Blocat", "account.browse_more_on_origin_server": "Vezi mai multe pe profilul original", "account.cancel_follow_request": "Retrage cererea de urmărire", + "account.copy": "Copiază link-ul profilului", + "account.direct": "Menționează pe @{name} în privat", "account.disable_notifications": "Nu îmi mai trimite notificări când postează @{name}", "account.domain_blocked": "Domeniu blocat", "account.edit_profile": "Modifică profilul", @@ -30,6 +32,7 @@ "account.featured_tags.last_status_never": "Fără postări", "account.featured_tags.title": "Haștagurile recomandate de {name}", "account.follow": "Abonează-te", + "account.follow_back": "Urmăreşte înapoi", "account.followers": "Urmăritori", "account.followers.empty": "Acest utilizator nu are încă urmăritori.", "account.followers_counter": "{count, plural, one {Un abonat} few {{counter} abonați} other {{counter} de abonați}}", @@ -38,6 +41,7 @@ "account.follows.empty": "Momentan acest utilizator nu are niciun abonament.", "account.go_to_profile": "Mergi la profil", "account.hide_reblogs": "Ascunde distribuirile de la @{name}", + "account.in_memoriam": "În Memoriam.", "account.joined_short": "Înscris", "account.languages": "Schimbă limbile abonate", "account.link_verified_on": "Proprietatea acestui link a fost verificată pe {date}", @@ -46,7 +50,10 @@ "account.mention": "Menționează pe @{name}", "account.moved_to": "{name} a indicat că noul său cont este acum:", "account.mute": "Pune pe @{name} pe silențios", + "account.mute_notifications_short": "Amuțește notificările", + "account.mute_short": "Ignoră", "account.muted": "Pus pe silențios", + "account.no_bio": "Nicio descriere furnizată.", "account.open_original_page": "Deschide pagina originală", "account.posts": "Postări", "account.posts_with_replies": "Postări și răspunsuri", @@ -69,6 +76,7 @@ "admin.dashboard.retention.average": "În medie", "admin.dashboard.retention.cohort": "Înregistrări lunar", "admin.dashboard.retention.cohort_size": "Utilizatori noi", + "admin.impact_report.title": "Rezumatul impactului", "alert.rate_limited.message": "Vă rugăm să reîncercați după {retry_time, time, medium}.", "alert.rate_limited.title": "Debit limitat", "alert.unexpected.message": "A apărut o eroare neașteptată.", @@ -98,9 +106,11 @@ "column.blocks": "Utilizatori blocați", "column.bookmarks": "Marcaje", "column.community": "Cronologie locală", + "column.direct": "Mențiuni private", "column.directory": "Explorează profiluri", "column.domain_blocks": "Domenii blocate", "column.favourites": "Favorite", + "column.firehose": "Fluxuri live", "column.follow_requests": "Cereri de abonare", "column.home": "Acasă", "column.lists": "Liste", @@ -131,11 +141,19 @@ "compose_form.lock_disclaimer.lock": "privat", "compose_form.placeholder": "La ce te gândești?", "compose_form.poll.duration": "Durata sondajului", + "compose_form.poll.multiple": "Alegeri multiple", + "compose_form.poll.option_placeholder": "Opțiune {number}", + "compose_form.poll.single": "Alegeți unul", "compose_form.poll.switch_to_multiple": "Modifică sondajul pentru a permite mai multe opțiuni", "compose_form.poll.switch_to_single": "Modifică sondajul pentru a permite o singură opțiune", + "compose_form.poll.type": "Stil", + "compose_form.publish": "Postare", "compose_form.publish_form": "Publică", + "compose_form.reply": "Răspundeți", + "compose_form.save_changes": "Actualizare", "compose_form.spoiler.marked": "Elimină avertismentul privind conținutul", "compose_form.spoiler.unmarked": "Adaugă un avertisment privind conținutul", + "compose_form.spoiler_placeholder": "Atenționare de conținut (opțional)", "confirmation_modal.cancel": "Anulează", "confirmations.block.block_and_report": "Blochează și raportează", "confirmations.block.confirm": "Blochează", @@ -151,6 +169,7 @@ "confirmations.domain_block.confirm": "Blochează întregul domeniu", "confirmations.domain_block.message": "Ești absolut sigur că vrei să blochezi tot domeniul {domain}? În cele mai multe cazuri, raportarea sau blocarea anumitor lucruri este suficientă și de preferat. Nu vei mai vedea niciun conținut din acest domeniu în vreun flux public sau în vreo notificare. Abonații tăi din acest domeniu vor fi eliminați.", "confirmations.edit.confirm": "Modifică", + "confirmations.edit.message": "Editarea acum va suprascrie mesajul pe care îl compuneți în prezent. Sunteți sigur că vreți să continuați?", "confirmations.logout.confirm": "Deconectare", "confirmations.logout.message": "Ești sigur că vrei să te deconectezi?", "confirmations.mute.confirm": "Ignoră", @@ -165,6 +184,7 @@ "conversation.mark_as_read": "Marchează ca citit", "conversation.open": "Vizualizează conversația", "conversation.with": "Cu {names}", + "copy_icon_button.copied": "Copiat în clipboard", "copypaste.copied": "Copiat", "copypaste.copy_to_clipboard": "Copiază în clipboard", "directory.federated": "Din fediversul cunoscut", @@ -240,10 +260,17 @@ "filter_modal.select_filter.title": "Filtrează această postare", "filter_modal.title.status": "Filtrează o postare", "firehose.all": "Toate", + "firehose.local": "Acest Server", "firehose.remote": "Alte servere", "follow_request.authorize": "Acceptă", "follow_request.reject": "Respinge", "follow_requests.unlocked_explanation": "Chiar dacă contul tău nu este blocat, personalul {domain} a considerat că ai putea prefera să consulți manual cererile de abonare de la aceste conturi.", + "follow_suggestions.curated_suggestion": "Alegerile Editorilor", + "follow_suggestions.dismiss": "Nu mai afișa din nou", + "follow_suggestions.personalized_suggestion": "Sugestie personalizată", + "follow_suggestions.popular_suggestion": "Sugestie populară", + "follow_suggestions.view_all": "Vizualizați tot", + "follow_suggestions.who_to_follow": "Pe cine să urmăriți", "followed_tags": "Hastaguri urmărite", "footer.about": "Despre", "footer.directory": "Catalogul de profiluri", @@ -272,12 +299,15 @@ "home.hide_announcements": "Ascunde anunțurile", "home.pending_critical_update.body": "Te rugăm să-ți actualizezi serverul de Mastodon cat mai curând posibil!", "home.pending_critical_update.link": "Vezi noutăți", + "home.pending_critical_update.title": "Actualizare critică de securitate disponibilă!", "home.show_announcements": "Afișează anunțurile", + "interaction_modal.description.favourite": "Cu un cont pe Mastodon, poți adăuga această postare la favorite pentru a-l informa pe autorul ei că o apreciezi și pentru a o salva pentru mai târziu.", "interaction_modal.description.follow": "Cu un cont Mastodon, poți urmări pe {name} pentru a vedea postările sale în cronologia ta principală.", "interaction_modal.description.reblog": "Cu un cont pe Mastodon, poți distribui această postare pentru a le-o arăta și celor abonați ție.", "interaction_modal.description.reply": "Cu un cont pe Mastodon, poți răspunde acestei postări.", "interaction_modal.login.action": "Du-mă acasă", "interaction_modal.login.prompt": "Adresa serverului tău acasă, de ex. mastodon.social", + "interaction_modal.no_account_yet": "Nu ești încă pe Mastodon?", "interaction_modal.on_another_server": "Pe un alt server", "interaction_modal.on_this_server": "Pe acest server", "interaction_modal.title.follow": "Urmărește pe {name}", diff --git a/app/javascript/mastodon/locales/tok.json b/app/javascript/mastodon/locales/tok.json index ba45f84453..85f62f404a 100644 --- a/app/javascript/mastodon/locales/tok.json +++ b/app/javascript/mastodon/locales/tok.json @@ -6,6 +6,7 @@ "about.not_available": "lon kulupu ni la sina ken alasa ala e sona ni.", "about.rules": "lawa kulupu", "account.account_note_header": "sona awen", + "account.add_or_remove_from_list": "o ante e lipu jan", "account.badges.bot": "ilo nanpa li lawa e ni", "account.badges.group": "kulupu", "account.block": "o weka e @{name}", @@ -83,6 +84,7 @@ "column_header.pin": "o sewi", "column_header.show_settings": "o lukin e lawa", "column_header.unpin": "o sewi ala", + "column_subheading.settings": "ken ilo", "community.column_settings.local_only": "toki tan ni taso", "community.column_settings.media_only": "sitelen taso", "community.column_settings.remote_only": "toki tan ante taso", @@ -177,6 +179,8 @@ "follow_request.reject": "o ala", "follow_suggestions.view_all": "o lukin e ale", "follow_suggestions.who_to_follow": "sina o kute e ni", + "footer.about": "sona", + "footer.directory": "lipu jan", "footer.get_app": "o jo e ilo", "footer.privacy_policy": "lawa len", "footer.source_code": "o lukin e toki ilo", @@ -195,6 +199,7 @@ "interaction_modal.title.follow": "o kute e {name}", "interaction_modal.title.reblog": "o wawa e toki {name}", "keyboard_shortcuts.blocked": "o lukin e lipu sina pi jan weka", + "keyboard_shortcuts.boost": "o pana sin e toki", "keyboard_shortcuts.down": "o tawa anpa lon lipu", "keyboard_shortcuts.enter": "o lukin e toki", "keyboard_shortcuts.favourite": "o suli e toki", @@ -204,6 +209,7 @@ "keyboard_shortcuts.open_media": "o lukin e sitelen", "keyboard_shortcuts.pinned": "o lukin pi lipu sina pi toki sewi", "keyboard_shortcuts.toggle_sensitivity": "o ante e ken lukin", + "keyboard_shortcuts.toot": "o toki", "keyboard_shortcuts.up": "o tawa sewi lon lipu", "lightbox.close": "o pini", "lightbox.compress": "o lili e sitelen", @@ -227,6 +233,7 @@ "media_gallery.toggle_visible": "{number, plural, other {o len e sitelen}}", "mute_modal.duration": "tenpo", "mute_modal.indefinite": "tenpo ale", + "navigation_bar.about": "sona", "navigation_bar.blocks": "jan weka", "navigation_bar.compose": "o pali e toki sin", "navigation_bar.favourites": "toki suli", @@ -261,12 +268,14 @@ "report.close": "o pini", "report.mute": "o kute ala e ona", "report.mute_explanation": "sina kama ala lukin e ijo pana ona. ona li awen ken kute e sina li awen ken lukin e sina li sona ala e weka kute sina e weka lukin sina.", + "report.next": "awen", "report.reasons.dislike": "ni li ike tawa mi", "report.reasons.legal": "ni li ike tawa lawa", "report.reasons.other": "ni li ike tan ante", "report.reasons.spam": "ni li ike tan toki mute", "report.thanks.title": "sina wile ala lukin e ni anu seme?", "report.unfollow": "o pini kute e {name}", + "report_notification.categories.legal": "ike tawa nasin lawa", "search.placeholder": "o alasa", "search.quick_action.go_to_account": "o tawa lipu jan {x}", "search_popout.language_code": "nimi toki kepeken nasin ISO", @@ -275,6 +284,7 @@ "search_results.statuses": "toki", "search_results.title": "o alasa e {q}", "status.block": "o weka e @{name}", + "status.cancel_reblog_private": "o pini e pana", "status.delete": "o weka", "status.edit": "o ante", "status.edited": "ni li ante lon {date}", @@ -305,7 +315,10 @@ "status.unpin": "o sewi ala lon lipu sina", "subscribed_languages.save": "o awen e ante", "tabs_bar.home": "lipu open", + "timeline_hint.resources.followers": "jan kute", + "timeline_hint.resources.follows": "jan lukin", "timeline_hint.resources.statuses": "ijo pi tenpo suli", + "trends.trending_now": "jan mute li toki", "units.short.million": "{count}AAA", "upload_button.label": "o pana e sitelen anu kalama", "upload_error.limit": "ilo li ken ala e suli pi ijo ni.", From 476a043fc5339526536cbb1ba64d0ba2230e870c Mon Sep 17 00:00:00 2001 From: Nicolas Hoffmann Date: Tue, 13 Feb 2024 13:58:21 +0100 Subject: [PATCH 109/211] Fix modal container bounds (#29185) --- app/javascript/styles/mastodon/components.scss | 2 ++ 1 file changed, 2 insertions(+) diff --git a/app/javascript/styles/mastodon/components.scss b/app/javascript/styles/mastodon/components.scss index 427144ed8e..af9fc88e7b 100644 --- a/app/javascript/styles/mastodon/components.scss +++ b/app/javascript/styles/mastodon/components.scss @@ -5343,6 +5343,8 @@ a.status-card { inset-inline-start: 0; width: 100%; height: 100%; + max-width: 100vw; + max-height: 100vh; box-sizing: border-box; display: flex; flex-direction: column; From e8b66a0525f0468fe6588803ec2a15ff186d08ab Mon Sep 17 00:00:00 2001 From: Emelia Smith Date: Tue, 13 Feb 2024 18:14:49 +0100 Subject: [PATCH 110/211] Ignore legacy moderator and admin columns on User model (#29188) --- app/models/concerns/user/ldap_authenticable.rb | 10 +++++++++- app/models/concerns/user/pam_authenticable.rb | 1 - app/models/user.rb | 2 ++ 3 files changed, 11 insertions(+), 2 deletions(-) diff --git a/app/models/concerns/user/ldap_authenticable.rb b/app/models/concerns/user/ldap_authenticable.rb index d84ff084b2..180df9d310 100644 --- a/app/models/concerns/user/ldap_authenticable.rb +++ b/app/models/concerns/user/ldap_authenticable.rb @@ -25,7 +25,15 @@ module User::LdapAuthenticable resource = joins(:account).find_by(accounts: { username: safe_username }) if resource.blank? - resource = new(email: attributes[Devise.ldap_mail.to_sym].first, agreement: true, account_attributes: { username: safe_username }, admin: false, external: true, confirmed_at: Time.now.utc) + resource = new( + email: attributes[Devise.ldap_mail.to_sym].first, + agreement: true, + account_attributes: { + username: safe_username, + }, + external: true, + confirmed_at: Time.now.utc + ) resource.save! end diff --git a/app/models/concerns/user/pam_authenticable.rb b/app/models/concerns/user/pam_authenticable.rb index a682058cca..30dc7d8aef 100644 --- a/app/models/concerns/user/pam_authenticable.rb +++ b/app/models/concerns/user/pam_authenticable.rb @@ -32,7 +32,6 @@ module User::PamAuthenticable self.email = "#{account.username}@#{find_pam_suffix}" if email.nil? && find_pam_suffix self.confirmed_at = Time.now.utc - self.admin = false self.account = account self.external = true diff --git a/app/models/user.rb b/app/models/user.rb index 70c24336f3..95fdc431ac 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -51,6 +51,8 @@ class User < ApplicationRecord last_sign_in_ip skip_sign_in_token filtered_languages + admin + moderator ) include LanguagesHelper From 46142cdbddd6d3eb5e88386c74b5600abe520c38 Mon Sep 17 00:00:00 2001 From: Emelia Smith Date: Tue, 13 Feb 2024 19:11:47 +0100 Subject: [PATCH 111/211] Disable administrative doorkeeper routes (#29187) --- config/initializers/doorkeeper.rb | 9 +- .../requests/disabled_oauth_endpoints_spec.rb | 83 +++++++++++++++++++ 2 files changed, 90 insertions(+), 2 deletions(-) create mode 100644 spec/requests/disabled_oauth_endpoints_spec.rb diff --git a/config/initializers/doorkeeper.rb b/config/initializers/doorkeeper.rb index fe3871d2e7..f9d47a205c 100644 --- a/config/initializers/doorkeeper.rb +++ b/config/initializers/doorkeeper.rb @@ -21,9 +21,14 @@ Doorkeeper.configure do user unless user&.otp_required_for_login? end - # If you want to restrict access to the web interface for adding oauth authorized applications, you need to declare the block below. + # Doorkeeper provides some administrative interfaces for managing OAuth + # Applications, allowing creation, edit, and deletion of applications from the + # server. At present, these administrative routes are not integrated into + # Mastodon, and as such, we've disabled them by always return a 403 forbidden + # response for them. This does not affect the ability for users to manage + # their own OAuth Applications. admin_authenticator do - current_user&.admin? || redirect_to(new_user_session_url) + head 403 end # Authorization Code expiration time (default 10 minutes). diff --git a/spec/requests/disabled_oauth_endpoints_spec.rb b/spec/requests/disabled_oauth_endpoints_spec.rb new file mode 100644 index 0000000000..7c2c09f380 --- /dev/null +++ b/spec/requests/disabled_oauth_endpoints_spec.rb @@ -0,0 +1,83 @@ +# frozen_string_literal: true + +require 'rails_helper' + +describe 'Disabled OAuth routes' do + # These routes are disabled via the doorkeeper configuration for + # `admin_authenticator`, as these routes should only be accessible by server + # administrators. For now, these routes are not properly designed and + # integrated into Mastodon, so we're disabling them completely + describe 'GET /oauth/applications' do + it 'returns 403 forbidden' do + get oauth_applications_path + + expect(response).to have_http_status(403) + end + end + + describe 'POST /oauth/applications' do + it 'returns 403 forbidden' do + post oauth_applications_path + + expect(response).to have_http_status(403) + end + end + + describe 'GET /oauth/applications/new' do + it 'returns 403 forbidden' do + get new_oauth_application_path + + expect(response).to have_http_status(403) + end + end + + describe 'GET /oauth/applications/:id' do + let(:application) { Fabricate(:application, scopes: 'read') } + + it 'returns 403 forbidden' do + get oauth_application_path(application) + + expect(response).to have_http_status(403) + end + end + + describe 'PATCH /oauth/applications/:id' do + let(:application) { Fabricate(:application, scopes: 'read') } + + it 'returns 403 forbidden' do + patch oauth_application_path(application) + + expect(response).to have_http_status(403) + end + end + + describe 'PUT /oauth/applications/:id' do + let(:application) { Fabricate(:application, scopes: 'read') } + + it 'returns 403 forbidden' do + put oauth_application_path(application) + + expect(response).to have_http_status(403) + end + end + + describe 'DELETE /oauth/applications/:id' do + let(:application) { Fabricate(:application, scopes: 'read') } + + it 'returns 403 forbidden' do + delete oauth_application_path(application) + + expect(response).to have_http_status(403) + end + end + + describe 'GET /oauth/applications/:id/edit' do + let(:application) { Fabricate(:application, scopes: 'read') } + + it 'returns 403 forbidden' do + get edit_oauth_application_path(application) + + expect(response).to have_http_status(403) + end + end +end From 554e2a019e40755fbe6ae02fbf5cfc1862550e20 Mon Sep 17 00:00:00 2001 From: Claire Date: Wed, 14 Feb 2024 13:12:13 +0100 Subject: [PATCH 112/211] Add `sidekiq_unique_jobs:delete_all_locks` task and disable `sidekiq-unique-jobs` UI by default (#29199) --- config/routes.rb | 2 +- lib/tasks/sidekiq_unique_jobs.rake | 11 +++++++++++ 2 files changed, 12 insertions(+), 1 deletion(-) create mode 100644 lib/tasks/sidekiq_unique_jobs.rake diff --git a/config/routes.rb b/config/routes.rb index bb088821fd..51c10a14f6 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -1,6 +1,6 @@ # frozen_string_literal: true -require 'sidekiq_unique_jobs/web' +require 'sidekiq_unique_jobs/web' if ENV['ENABLE_SIDEKIQ_UNIQUE_JOBS_UI'] == true require 'sidekiq-scheduler/web' class RedirectWithVary < ActionDispatch::Routing::PathRedirect diff --git a/lib/tasks/sidekiq_unique_jobs.rake b/lib/tasks/sidekiq_unique_jobs.rake new file mode 100644 index 0000000000..bedc8fe4c6 --- /dev/null +++ b/lib/tasks/sidekiq_unique_jobs.rake @@ -0,0 +1,11 @@ +# frozen_string_literal: true + +namespace :sidekiq_unique_jobs do + task delete_all_locks: :environment do + digests = SidekiqUniqueJobs::Digests.new + digests.delete_by_pattern('*', count: digests.count) + + expiring_digests = SidekiqUniqueJobs::ExpiringDigests.new + expiring_digests.delete_by_pattern('*', count: expiring_digests.count) + end +end From 68eaa804c9bafdc5f798e114e9ba00161425dd71 Mon Sep 17 00:00:00 2001 From: Emelia Smith Date: Wed, 14 Feb 2024 15:15:34 +0100 Subject: [PATCH 113/211] Merge pull request from GHSA-7w3c-p9j8-mq3x * Ensure destruction of OAuth Applications notifies streaming Due to doorkeeper using a dependent: delete_all relationship, the destroy of an OAuth Application bypassed the existing AccessTokenExtension callbacks for announcing destructing of access tokens. * Ensure password resets revoke access to Streaming API * Improve performance of deleting OAuth tokens --------- Co-authored-by: Claire --- app/lib/application_extension.rb | 20 ++++++++++++++++++++ app/models/user.rb | 10 ++++++++++ spec/models/user_spec.rb | 7 +++++++ 3 files changed, 37 insertions(+) diff --git a/app/lib/application_extension.rb b/app/lib/application_extension.rb index fb442e2c2d..400c51a023 100644 --- a/app/lib/application_extension.rb +++ b/app/lib/application_extension.rb @@ -4,14 +4,34 @@ module ApplicationExtension extend ActiveSupport::Concern included do + include Redisable + has_many :created_users, class_name: 'User', foreign_key: 'created_by_application_id', inverse_of: :created_by_application validates :name, length: { maximum: 60 } validates :website, url: true, length: { maximum: 2_000 }, if: :website? validates :redirect_uri, length: { maximum: 2_000 } + + # The relationship used between Applications and AccessTokens is using + # dependent: delete_all, which means the ActiveRecord callback in + # AccessTokenExtension is not run, so instead we manually announce to + # streaming that these tokens are being deleted. + before_destroy :push_to_streaming_api, prepend: true end def confirmation_redirect_uri redirect_uri.lines.first.strip end + + def push_to_streaming_api + # TODO: #28793 Combine into a single topic + payload = Oj.dump(event: :kill) + access_tokens.in_batches do |tokens| + redis.pipelined do |pipeline| + tokens.ids.each do |id| + pipeline.publish("timeline:access_token:#{id}", payload) + end + end + end + end end diff --git a/app/models/user.rb b/app/models/user.rb index 95fdc431ac..f706c91eff 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -344,6 +344,16 @@ class User < ApplicationRecord Doorkeeper::AccessToken.by_resource_owner(self).in_batches do |batch| batch.update_all(revoked_at: Time.now.utc) Web::PushSubscription.where(access_token_id: batch).delete_all + + # Revoke each access token for the Streaming API, since `update_all`` + # doesn't trigger ActiveRecord Callbacks: + # TODO: #28793 Combine into a single topic + payload = Oj.dump(event: :kill) + redis.pipelined do |pipeline| + batch.ids.each do |id| + pipeline.publish("timeline:access_token:#{id}", payload) + end + end end end diff --git a/spec/models/user_spec.rb b/spec/models/user_spec.rb index 5ac41c0ff1..845335e873 100644 --- a/spec/models/user_spec.rb +++ b/spec/models/user_spec.rb @@ -420,7 +420,10 @@ RSpec.describe User do let!(:access_token) { Fabricate(:access_token, resource_owner_id: user.id) } let!(:web_push_subscription) { Fabricate(:web_push_subscription, access_token: access_token) } + let(:redis_pipeline_stub) { instance_double(Redis::Namespace, publish: nil) } + before do + allow(redis).to receive(:pipelined).and_yield(redis_pipeline_stub) user.reset_password! end @@ -437,6 +440,10 @@ RSpec.describe User do expect(Doorkeeper::AccessToken.active_for(user).count).to eq 0 end + it 'revokes streaming access for all access tokens' do + expect(redis_pipeline_stub).to have_received(:publish).with("timeline:access_token:#{access_token.id}", Oj.dump(event: :kill)).once + end + it 'removes push subscriptions' do expect(Web::PushSubscription.where(user: user).or(Web::PushSubscription.where(access_token: access_token)).count).to eq 0 expect { web_push_subscription.reload }.to raise_error(ActiveRecord::RecordNotFound) From b31af34c9716338e4a32a62cc812d1ca59e88d15 Mon Sep 17 00:00:00 2001 From: Claire Date: Wed, 14 Feb 2024 15:16:07 +0100 Subject: [PATCH 114/211] Merge pull request from GHSA-vm39-j3vx-pch3 * Prevent different identities from a same SSO provider from accessing a same account * Lock auth provider changes behind `ALLOW_UNSAFE_AUTH_PROVIDER_REATTACH=true` * Rename methods to avoid confusion between OAuth and OmniAuth --- .../auth/omniauth_callbacks_controller.rb | 2 +- app/models/concerns/user/omniauthable.rb | 52 ++++++++++++++----- app/models/identity.rb | 2 +- spec/models/identity_spec.rb | 6 +-- spec/requests/omniauth_callbacks_spec.rb | 2 +- 5 files changed, 44 insertions(+), 20 deletions(-) diff --git a/app/controllers/auth/omniauth_callbacks_controller.rb b/app/controllers/auth/omniauth_callbacks_controller.rb index 707b50ef9e..9b83de945b 100644 --- a/app/controllers/auth/omniauth_callbacks_controller.rb +++ b/app/controllers/auth/omniauth_callbacks_controller.rb @@ -7,7 +7,7 @@ class Auth::OmniauthCallbacksController < Devise::OmniauthCallbacksController def self.provides_callback_for(provider) define_method provider do @provider = provider - @user = User.find_for_oauth(request.env['omniauth.auth'], current_user) + @user = User.find_for_omniauth(request.env['omniauth.auth'], current_user) if @user.persisted? record_login_activity diff --git a/app/models/concerns/user/omniauthable.rb b/app/models/concerns/user/omniauthable.rb index 113bfda230..396a0598f8 100644 --- a/app/models/concerns/user/omniauthable.rb +++ b/app/models/concerns/user/omniauthable.rb @@ -19,17 +19,18 @@ module User::Omniauthable end class_methods do - def find_for_oauth(auth, signed_in_resource = nil) + def find_for_omniauth(auth, signed_in_resource = nil) # EOLE-SSO Patch auth.uid = (auth.uid[0][:uid] || auth.uid[0][:user]) if auth.uid.is_a? Hashie::Array - identity = Identity.find_for_oauth(auth) + identity = Identity.find_for_omniauth(auth) # If a signed_in_resource is provided it always overrides the existing user # to prevent the identity being locked with accidentally created accounts. # Note that this may leave zombie accounts (with no associated identity) which # can be cleaned up at a later date. user = signed_in_resource || identity.user - user ||= create_for_oauth(auth) + user ||= reattach_for_auth(auth) + user ||= create_for_auth(auth) if identity.user.nil? identity.user = user @@ -39,19 +40,35 @@ module User::Omniauthable user end - def create_for_oauth(auth) - # Check if the user exists with provided email. If no email was provided, - # we assign a temporary email and ask the user to verify it on - # the next step via Auth::SetupController.show + private - strategy = Devise.omniauth_configs[auth.provider.to_sym].strategy - assume_verified = strategy&.security&.assume_email_is_verified - email_is_verified = auth.info.verified || auth.info.verified_email || auth.info.email_verified || assume_verified - email = auth.info.verified_email || auth.info.email + def reattach_for_auth(auth) + # If allowed, check if a user exists with the provided email address, + # and return it if they does not have an associated identity with the + # current authentication provider. + + # This can be used to provide a choice of alternative auth providers + # or provide smooth gradual transition between multiple auth providers, + # but this is discouraged because any insecure provider will put *all* + # local users at risk, regardless of which provider they registered with. + + return unless ENV['ALLOW_UNSAFE_AUTH_PROVIDER_REATTACH'] == 'true' - user = User.find_by(email: email) if email_is_verified + email, email_is_verified = email_from_auth(auth) + return unless email_is_verified - return user unless user.nil? + user = User.find_by(email: email) + return if user.nil? || Identity.exists?(provider: auth.provider, user_id: user.id) + + user + end + + def create_for_auth(auth) + # Create a user for the given auth params. If no email was provided, + # we assign a temporary email and ask the user to verify it on + # the next step via Auth::SetupController.show + + email, email_is_verified = email_from_auth(auth) user = User.new(user_params_from_auth(email, auth)) @@ -66,7 +83,14 @@ module User::Omniauthable user end - private + def email_from_auth(auth) + strategy = Devise.omniauth_configs[auth.provider.to_sym].strategy + assume_verified = strategy&.security&.assume_email_is_verified + email_is_verified = auth.info.verified || auth.info.verified_email || auth.info.email_verified || assume_verified + email = auth.info.verified_email || auth.info.email + + [email, email_is_verified] + end def user_params_from_auth(email, auth) { diff --git a/app/models/identity.rb b/app/models/identity.rb index c95a68a6f6..77821b78fa 100644 --- a/app/models/identity.rb +++ b/app/models/identity.rb @@ -17,7 +17,7 @@ class Identity < ApplicationRecord validates :uid, presence: true, uniqueness: { scope: :provider } validates :provider, presence: true - def self.find_for_oauth(auth) + def self.find_for_omniauth(auth) find_or_create_by(uid: auth.uid, provider: auth.provider) end end diff --git a/spec/models/identity_spec.rb b/spec/models/identity_spec.rb index 7022454443..d5a2ffbc86 100644 --- a/spec/models/identity_spec.rb +++ b/spec/models/identity_spec.rb @@ -3,19 +3,19 @@ require 'rails_helper' RSpec.describe Identity do - describe '.find_for_oauth' do + describe '.find_for_omniauth' do let(:auth) { Fabricate(:identity, user: Fabricate(:user)) } it 'calls .find_or_create_by' do allow(described_class).to receive(:find_or_create_by) - described_class.find_for_oauth(auth) + described_class.find_for_omniauth(auth) expect(described_class).to have_received(:find_or_create_by).with(uid: auth.uid, provider: auth.provider) end it 'returns an instance of Identity' do - expect(described_class.find_for_oauth(auth)).to be_instance_of described_class + expect(described_class.find_for_omniauth(auth)).to be_instance_of described_class end end end diff --git a/spec/requests/omniauth_callbacks_spec.rb b/spec/requests/omniauth_callbacks_spec.rb index 0d37c41140..b478ca1ce6 100644 --- a/spec/requests/omniauth_callbacks_spec.rb +++ b/spec/requests/omniauth_callbacks_spec.rb @@ -96,7 +96,7 @@ describe 'OmniAuth callbacks' do context 'when a user cannot be built' do before do - allow(User).to receive(:find_for_oauth).and_return(User.new) + allow(User).to receive(:find_for_omniauth).and_return(User.new) end it 'redirects to the new user signup page' do From 8e8e0f104fc3a64c9f862eca588a63ddbb8b6865 Mon Sep 17 00:00:00 2001 From: Claire Date: Wed, 14 Feb 2024 15:20:02 +0100 Subject: [PATCH 115/211] Bump version to v4.3.0-alpha.2 (#29200) --- lib/mastodon/version.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/mastodon/version.rb b/lib/mastodon/version.rb index dd7c84207e..c2f26aee63 100644 --- a/lib/mastodon/version.rb +++ b/lib/mastodon/version.rb @@ -17,7 +17,7 @@ module Mastodon end def default_prerelease - 'alpha.1' + 'alpha.2' end def prerelease From bbbbf000849a3eb38f2a1fb58370f7e81ef71f11 Mon Sep 17 00:00:00 2001 From: Claire Date: Wed, 14 Feb 2024 15:57:49 +0100 Subject: [PATCH 116/211] Fix OmniAuth tests (#29201) --- spec/requests/omniauth_callbacks_spec.rb | 35 ++++++++++++++++++------ 1 file changed, 26 insertions(+), 9 deletions(-) diff --git a/spec/requests/omniauth_callbacks_spec.rb b/spec/requests/omniauth_callbacks_spec.rb index b478ca1ce6..1e488b3f43 100644 --- a/spec/requests/omniauth_callbacks_spec.rb +++ b/spec/requests/omniauth_callbacks_spec.rb @@ -39,16 +39,33 @@ describe 'OmniAuth callbacks' do Fabricate(:user, email: 'user@host.example') end - it 'matches the existing user, creates an identity, and redirects to root path' do - expect { subject } - .to not_change(User, :count) - .and change(Identity, :count) - .by(1) - .and change(LoginActivity, :count) - .by(1) + context 'when ALLOW_UNSAFE_AUTH_PROVIDER_REATTACH is set to true' do + around do |example| + ClimateControl.modify ALLOW_UNSAFE_AUTH_PROVIDER_REATTACH: 'true' do + example.run + end + end + + it 'matches the existing user, creates an identity, and redirects to root path' do + expect { subject } + .to not_change(User, :count) + .and change(Identity, :count) + .by(1) + .and change(LoginActivity, :count) + .by(1) + + expect(Identity.find_by(user: User.last).uid).to eq('123') + expect(response).to redirect_to(root_path) + end + end - expect(Identity.find_by(user: User.last).uid).to eq('123') - expect(response).to redirect_to(root_path) + context 'when ALLOW_UNSAFE_AUTH_PROVIDER_REATTACH is not set to true' do + it 'does not match the existing user or create an identity' do + expect { subject } + .to not_change(User, :count) + .and not_change(Identity, :count) + .and not_change(LoginActivity, :count) + end end end From 844aa59bdfe76d8db2253c1a25d2f9b6caead690 Mon Sep 17 00:00:00 2001 From: Matt Jankowski Date: Wed, 14 Feb 2024 11:44:27 -0500 Subject: [PATCH 117/211] Doc update about ruby version 3.0+ (#29202) --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 267f0ed295..6cf722b355 100644 --- a/README.md +++ b/README.md @@ -69,7 +69,7 @@ Mastodon acts as an OAuth2 provider, so 3rd party apps can use the REST and Stre - **PostgreSQL** 12+ - **Redis** 4+ -- **Ruby** 2.7+ +- **Ruby** 3.0+ - **Node.js** 16+ The repository includes deployment configurations for **Docker and docker-compose** as well as specific platforms like **Heroku**, **Scalingo**, and **Nanobox**. For Helm charts, reference the [mastodon/chart repository](https://github.com/mastodon/chart). The [**standalone** installation guide](https://docs.joinmastodon.org/admin/install/) is available in the documentation. From d4d0565b0fd86ca80d2dbf0c7d09a9af5ea4a293 Mon Sep 17 00:00:00 2001 From: Claire Date: Wed, 14 Feb 2024 22:49:45 +0100 Subject: [PATCH 118/211] Fix user creation failure handling in OAuth paths (#29207) --- app/controllers/auth/omniauth_callbacks_controller.rb | 3 +++ config/locales/devise.en.yml | 1 + spec/requests/omniauth_callbacks_spec.rb | 4 +++- 3 files changed, 7 insertions(+), 1 deletion(-) diff --git a/app/controllers/auth/omniauth_callbacks_controller.rb b/app/controllers/auth/omniauth_callbacks_controller.rb index 9b83de945b..9d496220a3 100644 --- a/app/controllers/auth/omniauth_callbacks_controller.rb +++ b/app/controllers/auth/omniauth_callbacks_controller.rb @@ -17,6 +17,9 @@ class Auth::OmniauthCallbacksController < Devise::OmniauthCallbacksController session["devise.#{provider}_data"] = request.env['omniauth.auth'] redirect_to new_user_registration_url end + rescue ActiveRecord::RecordInvalid + flash[:alert] = I18n.t('devise.failure.omniauth_user_creation_failure') if is_navigational_format? + redirect_to new_user_session_url end end diff --git a/config/locales/devise.en.yml b/config/locales/devise.en.yml index 4439397c8e..61bd33851b 100644 --- a/config/locales/devise.en.yml +++ b/config/locales/devise.en.yml @@ -12,6 +12,7 @@ en: last_attempt: You have one more attempt before your account is locked. locked: Your account is locked. not_found_in_database: Invalid %{authentication_keys} or password. + omniauth_user_creation_failure: Error creating an account for this identity. pending: Your account is still under review. timeout: Your session expired. Please login again to continue. unauthenticated: You need to login or sign up before continuing. diff --git a/spec/requests/omniauth_callbacks_spec.rb b/spec/requests/omniauth_callbacks_spec.rb index 1e488b3f43..095535e485 100644 --- a/spec/requests/omniauth_callbacks_spec.rb +++ b/spec/requests/omniauth_callbacks_spec.rb @@ -60,11 +60,13 @@ describe 'OmniAuth callbacks' do end context 'when ALLOW_UNSAFE_AUTH_PROVIDER_REATTACH is not set to true' do - it 'does not match the existing user or create an identity' do + it 'does not match the existing user or create an identity, and redirects to login page' do expect { subject } .to not_change(User, :count) .and not_change(Identity, :count) .and not_change(LoginActivity, :count) + + expect(response).to redirect_to(new_user_session_url) end end end From fc4f82346440573898c60fcd4af1f033ec724aae Mon Sep 17 00:00:00 2001 From: Matt Jankowski Date: Fri, 16 Feb 2024 02:41:25 -0500 Subject: [PATCH 119/211] Avoid local block var assignment in ap/process_status_update_service spec (#29210) --- .../services/activitypub/process_status_update_service_spec.rb | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/spec/services/activitypub/process_status_update_service_spec.rb b/spec/services/activitypub/process_status_update_service_spec.rb index 53cbaf4cc1..67f2f27276 100644 --- a/spec/services/activitypub/process_status_update_service_spec.rb +++ b/spec/services/activitypub/process_status_update_service_spec.rb @@ -218,7 +218,8 @@ RSpec.describe ActivityPub::ProcessStatusUpdateService, type: :service do end it 'does not update the text, spoiler_text or edited_at' do - expect { subject.call(status, json, json) }.to_not(change { s = status.reload; [s.text, s.spoiler_text, s.edited_at] }) + expect { subject.call(status, json, json) } + .to_not(change { status.reload.attributes.slice('text', 'spoiler_text', 'edited_at').values }) end end From 1df2ffc3eee80ab53de00d076658dd546515a9bd Mon Sep 17 00:00:00 2001 From: Matt Jankowski Date: Fri, 16 Feb 2024 02:42:03 -0500 Subject: [PATCH 120/211] Use `subject` in blacklist email validator spec (#29211) --- spec/validators/blacklisted_email_validator_spec.rb | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/spec/validators/blacklisted_email_validator_spec.rb b/spec/validators/blacklisted_email_validator_spec.rb index 6292f0737e..86760df2e7 100644 --- a/spec/validators/blacklisted_email_validator_spec.rb +++ b/spec/validators/blacklisted_email_validator_spec.rb @@ -4,7 +4,7 @@ require 'rails_helper' RSpec.describe BlacklistedEmailValidator do describe '#validate' do - subject { described_class.new.validate(user); errors } + subject { described_class.new.validate(user) } let(:user) { instance_double(User, email: 'info@mail.com', sign_up_ip: '1.2.3.4', errors: errors) } let(:errors) { instance_double(ActiveModel::Errors, add: nil) } @@ -18,7 +18,8 @@ RSpec.describe BlacklistedEmailValidator do let(:blocked_email) { true } it 'adds error' do - described_class.new.validate(user) + subject + expect(errors).to have_received(:add).with(:email, :blocked).once end end @@ -27,7 +28,8 @@ RSpec.describe BlacklistedEmailValidator do let(:blocked_email) { false } it 'does not add errors' do - described_class.new.validate(user) + subject + expect(errors).to_not have_received(:add) end @@ -39,7 +41,8 @@ RSpec.describe BlacklistedEmailValidator do end it 'adds error' do - described_class.new.validate(user) + subject + expect(errors).to have_received(:add).with(:email, :taken).once end end From ed4939296a2f0ecf5d072c4f04c2733170038fa4 Mon Sep 17 00:00:00 2001 From: Matt Jankowski Date: Fri, 16 Feb 2024 02:43:00 -0500 Subject: [PATCH 121/211] Reduce `RSpec/MultipleExpectations` in ap/activity/create spec (#29224) --- spec/lib/activitypub/activity/create_spec.rb | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/spec/lib/activitypub/activity/create_spec.rb b/spec/lib/activitypub/activity/create_spec.rb index e4966cffa3..dec17b916b 100644 --- a/spec/lib/activitypub/activity/create_spec.rb +++ b/spec/lib/activitypub/activity/create_spec.rb @@ -970,12 +970,15 @@ RSpec.describe ActivityPub::Activity::Create do it 'creates an encrypted message' do encrypted_message = target_device.encrypted_messages.reload.first - expect(encrypted_message).to_not be_nil - expect(encrypted_message.from_device_id).to eq '1234' - expect(encrypted_message.from_account).to eq sender - expect(encrypted_message.type).to eq 1 - expect(encrypted_message.body).to eq 'Foo' - expect(encrypted_message.digest).to eq 'Foo123' + expect(encrypted_message) + .to be_present + .and have_attributes( + from_device_id: eq('1234'), + from_account: eq(sender), + type: eq(1), + body: eq('Foo'), + digest: eq('Foo123') + ) end it 'creates a message franking' do From 1c93d625c6392374ebf014c190166ce98652f539 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Fri, 16 Feb 2024 08:51:13 +0100 Subject: [PATCH 122/211] New Crowdin Translations (automated) (#29195) Co-authored-by: GitHub Actions --- app/javascript/mastodon/locales/bg.json | 12 +- app/javascript/mastodon/locales/ie.json | 13 +++ app/javascript/mastodon/locales/kab.json | 61 ++++++---- app/javascript/mastodon/locales/sk.json | 1 + app/javascript/mastodon/locales/th.json | 4 +- app/javascript/mastodon/locales/tok.json | 10 ++ config/locales/de.yml | 4 +- config/locales/devise.be.yml | 1 + config/locales/devise.ca.yml | 1 + config/locales/devise.da.yml | 1 + config/locales/devise.de.yml | 1 + config/locales/devise.es-AR.yml | 1 + config/locales/devise.eu.yml | 1 + config/locales/devise.fi.yml | 1 + config/locales/devise.fo.yml | 1 + config/locales/devise.fy.yml | 1 + config/locales/devise.gl.yml | 1 + config/locales/devise.he.yml | 1 + config/locales/devise.hu.yml | 1 + config/locales/devise.ie.yml | 1 + config/locales/devise.is.yml | 1 + config/locales/devise.it.yml | 1 + config/locales/devise.kab.yml | 8 +- config/locales/devise.ko.yml | 1 + config/locales/devise.lad.yml | 1 + config/locales/devise.nl.yml | 1 + config/locales/devise.pl.yml | 1 + config/locales/devise.pt-PT.yml | 1 + config/locales/devise.sk.yml | 1 + config/locales/devise.sl.yml | 1 + config/locales/devise.sq.yml | 1 + config/locales/devise.sr-Latn.yml | 1 + config/locales/devise.sr.yml | 1 + config/locales/devise.tr.yml | 1 + config/locales/devise.uk.yml | 1 + config/locales/devise.zh-CN.yml | 1 + config/locales/devise.zh-HK.yml | 1 + config/locales/devise.zh-TW.yml | 1 + config/locales/doorkeeper.kab.yml | 10 +- config/locales/ie.yml | 6 + config/locales/kab.yml | 136 +++++++++++++++-------- config/locales/simple_form.kab.yml | 8 +- config/locales/sq.yml | 4 +- config/locales/th.yml | 2 +- 44 files changed, 211 insertions(+), 98 deletions(-) diff --git a/app/javascript/mastodon/locales/bg.json b/app/javascript/mastodon/locales/bg.json index 5a6fa175e8..3e7f6e51b2 100644 --- a/app/javascript/mastodon/locales/bg.json +++ b/app/javascript/mastodon/locales/bg.json @@ -201,7 +201,7 @@ "disabled_account_banner.text": "Вашият акаунт {disabledAccount} сега е изключен.", "dismissable_banner.community_timeline": "Ето най-скорошните публични публикации от хора, чиито акаунти са разположени в {domain}.", "dismissable_banner.dismiss": "Отхвърляне", - "dismissable_banner.explore_links": "Тези новини се разказват от хората в този и други сървъри на децентрализираната мрежа точно сега.", + "dismissable_banner.explore_links": "Това са най-споделяните новини в социалната мрежа днес. По-нови истории, споделени от повече хора се показват по-напред.", "dismissable_banner.explore_statuses": "Има публикации през социалната мрежа, които днес набират популярност. По-новите публикации с повече подсилвания и любими са класирани по-високо.", "dismissable_banner.explore_tags": "Тези хаштагове сега набират популярност сред хората в този и други сървъри на децентрализирата мрежа.", "dismissable_banner.public_timeline": "Ето най-новите обществени публикации от хора в социална мрежа, която хората в {domain} следват.", @@ -231,7 +231,7 @@ "empty_column.community": "Локалният инфопоток е празен. Публикувайте нещо, за да започнете!", "empty_column.direct": "Още нямате никакви частни споменавания. Тук ще се показват, изпращайки или получавайки едно.", "empty_column.domain_blocks": "Още няма блокирани домейни.", - "empty_column.explore_statuses": "Няма нищо налагащо се в момента. Проверете пак по-късно!", + "empty_column.explore_statuses": "Няма тенденции в момента. Проверете пак по-късно!", "empty_column.favourited_statuses": "Още нямате никакви любими публикации. Правейки любима, то тя ще се покаже тук.", "empty_column.favourites": "Още никого не е слагал публикацията в любими. Когато някой го направи, този човек ще се покаже тук.", "empty_column.follow_requests": "Още нямате заявки за последване. Получавайки такава, то тя ще се покаже тук.", @@ -407,7 +407,7 @@ "navigation_bar.direct": "Частни споменавания", "navigation_bar.discover": "Откриване", "navigation_bar.domain_blocks": "Блокирани домейни", - "navigation_bar.explore": "Изследване", + "navigation_bar.explore": "Разглеждане", "navigation_bar.favourites": "Любими", "navigation_bar.filters": "Заглушени думи", "navigation_bar.follow_requests": "Заявки за последване", @@ -474,10 +474,10 @@ "notifications_permission_banner.title": "Никога не пропускате нещо", "onboarding.action.back": "Върнете ме обратно", "onboarding.actions.back": "Върнете ме обратно", - "onboarding.actions.go_to_explore": "Вижте какво изгрява", + "onboarding.actions.go_to_explore": "Виж тенденции", "onboarding.actions.go_to_home": "Към началния ви инфоканал", "onboarding.compose.template": "Здравейте, #Mastodon!", - "onboarding.follows.empty": "За съжаление, в момента не могат да се показват резултати. Може да опитате да употребявате търсене или да прегледате страницата за изследване, за да намерите страница за последване, или да опитате пак по-късно.", + "onboarding.follows.empty": "За съжаление, в момента не могат да бъдат показани резултати. Може да опитате да търсите или да разгледате, за да намерите кого да последвате, или опитайте отново по-късно.", "onboarding.follows.lead": "Може да бъдете куратор на началния си инфоканал. Последвайки повече хора, по-деен и по-интересен ще става. Тези профили може да са добра начална точка, от която винаги по-късно да спрете да следвате!", "onboarding.follows.title": "Популярно в Mastodon", "onboarding.profile.discoverable": "Правене на моя профил откриваем", @@ -530,7 +530,7 @@ "privacy.private.short": "Последователи", "privacy.public.long": "Всеки във и извън Mastodon", "privacy.public.short": "Публично", - "privacy.unlisted.additional": "Това поведение е точно като публичното, с изключение на това, че публикацията няма да се появява в каналите на живо, хаштаговете, проучването или търсенето в Mastodon, дори ако сте се включили в целия акаунт.", + "privacy.unlisted.additional": "Това действие е точно като публичното, с изключение на това, че публикацията няма да се появява в каналите на живо, хаштаговете, разглеждането или търсенето в Mastodon, дори ако сте избрали да се публично видими на ниво акаунт.", "privacy.unlisted.long": "По-малко алгоритмични фанфари", "privacy.unlisted.short": "Тиха публика", "privacy_policy.last_updated": "Последно осъвременяване на {date}", diff --git a/app/javascript/mastodon/locales/ie.json b/app/javascript/mastodon/locales/ie.json index d39aa6cf61..0c21832ed6 100644 --- a/app/javascript/mastodon/locales/ie.json +++ b/app/javascript/mastodon/locales/ie.json @@ -158,6 +158,7 @@ "compose_form.save_changes": "Actualisar", "compose_form.spoiler.marked": "Remover avise pri li contenete", "compose_form.spoiler.unmarked": "Adjunter avise pri li contenete", + "compose_form.spoiler_placeholder": "Advertiment de contenete (optional)", "confirmation_modal.cancel": "Anullar", "confirmations.block.block_and_report": "Bloccar & Raportar", "confirmations.block.confirm": "Bloccar", @@ -276,6 +277,12 @@ "follow_request.authorize": "Autorisar", "follow_request.reject": "Rejecter", "follow_requests.unlocked_explanation": "Benque tu conto ne es cludet, li administratores de {domain} pensat que tu fórsan vell voler tractar seque-petitiones de tis-ci contos manualmen.", + "follow_suggestions.curated_suggestion": "Selection del Servitor", + "follow_suggestions.dismiss": "Ne monstrar plu", + "follow_suggestions.personalized_suggestion": "Personalisat suggestion", + "follow_suggestions.popular_suggestion": "Populari suggestion", + "follow_suggestions.view_all": "Vider omnicos", + "follow_suggestions.who_to_follow": "Persones a sequer", "followed_tags": "Sequet hashtags", "footer.about": "Information", "footer.directory": "Profilarium", @@ -517,11 +524,15 @@ "poll_button.add_poll": "Adjunter un balotation", "poll_button.remove_poll": "Remover balotation", "privacy.change": "Changear li privatie del posta", + "privacy.direct.long": "Omnes mentionat in li posta", "privacy.direct.short": "Specific persones", "privacy.private.long": "Solmen tui sequitores", "privacy.private.short": "Sequitores", "privacy.public.long": "Quicunc in e ex Mastodon", "privacy.public.short": "Public", + "privacy.unlisted.additional": "It acte just quam public, except que li posta ne va aparir in tendentie o hashtags, explorar, o sercha de Mastodon, mem si tu ha optet por les sur tui tot conto.", + "privacy.unlisted.long": "Minu fanfare algoritmic", + "privacy.unlisted.short": "Quiet public", "privacy_policy.last_updated": "Ultimmen actualisat ye {date}", "privacy_policy.title": "Politica pri Privatie", "recommended": "Recomandat", @@ -539,7 +550,9 @@ "relative_time.minutes": "{number}m", "relative_time.seconds": "{number}s", "relative_time.today": "hodie", + "reply_indicator.attachments": "{count, plural, one {# atachament} other {# atachamentes}}", "reply_indicator.cancel": "Anullar", + "reply_indicator.poll": "Balotar", "report.block": "Bloccar", "report.block_explanation": "Tu ne va vider su postas. Li usator ni va posser vider tui postas, ni sequer te, ni va posser saver pri li statu de esser bloccat.", "report.categories.legal": "Legal", diff --git a/app/javascript/mastodon/locales/kab.json b/app/javascript/mastodon/locales/kab.json index 7fb617518c..b69e93952b 100644 --- a/app/javascript/mastodon/locales/kab.json +++ b/app/javascript/mastodon/locales/kab.json @@ -11,11 +11,13 @@ "account.blocked": "Yettusewḥel", "account.browse_more_on_origin_server": "Snirem ugar deg umeɣnu aneẓli", "account.cancel_follow_request": "Withdraw follow request", + "account.copy": "Nɣel assaɣ ɣer umaɣnu", "account.disable_notifications": "Ḥbes ur iyi-d-ttazen ara ilɣa mi ara d-isuffeɣ @{name}", "account.domain_blocked": "Taɣult yeffren", "account.edit_profile": "Ẓreg amaɣnu", "account.enable_notifications": "Azen-iyi-d ilɣa mi ara d-isuffeɣ @{name}", "account.endorse": "Welleh fell-as deg umaɣnu-inek", + "account.featured_tags.last_status_never": "Ulac tisuffaɣ", "account.follow": "Ḍfer", "account.followers": "Imeḍfaren", "account.followers.empty": "Ar tura, ulac yiwen i yeṭṭafaṛen amseqdac-agi.", @@ -65,7 +67,7 @@ "bundle_modal_error.message": "Tella-d kra n tuccḍa mi d-yettali ugbur-agi.", "bundle_modal_error.retry": "Ɛreḍ tikelt-nniḍen", "closed_registrations_modal.find_another_server": "Aff-d aqeddac nniḍen", - "column.about": "Γef", + "column.about": "Ɣef", "column.blocks": "Imiḍanen yettusḥebsen", "column.bookmarks": "Ticraḍ", "column.community": "Tasuddemt tadigant", @@ -77,7 +79,7 @@ "column.lists": "Tibdarin", "column.mutes": "Imiḍanen yettwasgugmen", "column.notifications": "Tilɣa", - "column.pins": "Tijewwaqin yettwasenṭḍen", + "column.pins": "Tisuffaɣ yettwasenṭḍen", "column.public": "Tasuddemt tamatut", "column_back_button.label": "Tuɣalin", "column_header.hide_settings": "Ffer iɣewwaṛen", @@ -88,32 +90,36 @@ "column_header.unpin": "Kkes asenteḍ", "column_subheading.settings": "Iɣewwaṛen", "community.column_settings.local_only": "Adigan kan", - "community.column_settings.media_only": "Allal n teywalt kan", + "community.column_settings.media_only": "Imidyaten kan", "community.column_settings.remote_only": "Anmeggag kan", "compose.language.change": "Beddel tutlayt", "compose.language.search": "Nadi tutlayin …", "compose.published.open": "Ldi", "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 post won't be listed under any hashtag as it is unlisted. Only public posts can be searched by hashtag.", + "compose_form.encryption_warning": "", + "compose_form.hashtag_warning": "", "compose_form.lock_disclaimer": "Amiḍan-ik·im ur yelli ara {locked}. Menwala yezmer ad k·kem-yeḍfeṛ akken ad iẓer acu tbeṭṭuḍ akked yimeḍfaṛen-ik·im.", "compose_form.lock_disclaimer.lock": "yettwacekkel", "compose_form.placeholder": "D acu i itezzin deg wallaɣ?", "compose_form.poll.duration": "Tanzagt n tefrant", + "compose_form.poll.option_placeholder": "Taxtiṛt {number}", "compose_form.poll.single": "Fren yiwen", - "compose_form.publish_form": "Suffeɣ", + "compose_form.publish_form": "Tasuffeɣt tamaynut", + "compose_form.reply": "Err", + "compose_form.save_changes": "Leqqem", "compose_form.spoiler.marked": "Kkes aḍris yettwaffren deffir n walɣu", "compose_form.spoiler.unmarked": "Rnu aḍris yettwaffren deffir n walɣu", "confirmation_modal.cancel": "Sefsex", "confirmations.block.block_and_report": "Sewḥel & sewɛed", "confirmations.block.confirm": "Sewḥel", - "confirmations.block.message": "Tebγiḍ s tidet ad tesḥebseḍ {name}?", + "confirmations.block.message": "Tebɣiḍ s tidet ad tesḥebseḍ {name}?", "confirmations.delete.confirm": "Kkes", "confirmations.delete.message": "Tebɣiḍ s tidet ad tekkseḍ tasuffeɣt-agi?", "confirmations.delete_list.confirm": "Kkes", "confirmations.delete_list.message": "Tebɣiḍ s tidet ad tekkseḍ umuɣ-agi i lebda?", "confirmations.discard_edit_media.confirm": "Sefsex", "confirmations.domain_block.confirm": "Ffer taɣult meṛṛa", + "confirmations.edit.confirm": "Ẓreg", "confirmations.logout.confirm": "Ffeɣ", "confirmations.logout.message": "D tidet tebɣiḍ ad teffɣeḍ?", "confirmations.mute.confirm": "Sgugem", @@ -133,12 +139,13 @@ "directory.local": "Seg {domain} kan", "directory.new_arrivals": "Imaynuten id yewḍen", "directory.recently_active": "Yermed xas melmi kan", - "disabled_account_banner.account_settings": "Iγewwaṛen n umiḍan", + "disabled_account_banner.account_settings": "Iɣewwaṛen n umiḍan", "dismissable_banner.explore_links": "These news stories are being talked about by people on this and other servers of the decentralized network right now.", "dismissable_banner.explore_tags": "These hashtags are gaining traction among people on this and other servers of the decentralized network right now.", "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": "Sfeḍ", "emoji_button.custom": "Udmawan", "emoji_button.flags": "Innayen", "emoji_button.food": "Tegwella & Tissit", @@ -153,7 +160,7 @@ "emoji_button.symbols": "Izamulen", "emoji_button.travel": "Imeḍqan d Yinigen", "empty_column.account_suspended": "Amiḍan yettwaḥbas", - "empty_column.account_timeline": "Ulac tijewwaqin dagi!", + "empty_column.account_timeline": "Ulac tisuffaɣ da !", "empty_column.account_unavailable": "Ur nufi ara amaɣnu-ayi", "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.", @@ -174,7 +181,7 @@ "explore.suggested_follows": "Imdanen", "explore.title": "Snirem", "explore.trending_links": "Isallen", - "explore.trending_statuses": "Tisuffiɣin", + "explore.trending_statuses": "Tisuffaɣ", "explore.trending_tags": "Ihacṭagen", "filter_modal.added.settings_link": "asebter n yiɣewwaṛen", "filter_modal.select_filter.prompt_new": "Taggayt tamaynutt : {name}", @@ -183,8 +190,9 @@ "firehose.local": "Deg uqeddac-ayi", "follow_request.authorize": "Ssireg", "follow_request.reject": "Agi", - "footer.about": "Γef", - "footer.directory": "Akaram n imaγnuten", + "followed_tags": "Ihacṭagen yettwaḍfaren", + "footer.about": "Ɣef", + "footer.directory": "Akaram n imaɣnuten", "footer.get_app": "Awi-d asnas", "footer.invite": "Ɛreḍ-d kra n yimdanen", "footer.keyboard_shortcuts": "Inegzumen n unasiw", @@ -207,6 +215,7 @@ "home.column_settings.show_replies": "Ssken-d tiririyin", "home.hide_announcements": "Ffer ulɣuyen", "home.show_announcements": "Ssken-d ulɣuyen", + "interaction_modal.no_account_yet": "Ulac-ik·ikem deg Maṣṭudun?", "interaction_modal.on_this_server": "Deg uqeddac-ayi", "interaction_modal.title.follow": "Ḍfer {name}", "intervals.full.days": "{number, plural, one {# n wass} other {# n wussan}}", @@ -247,8 +256,8 @@ "lightbox.close": "Mdel", "lightbox.compress": "Ḥemmeẓ tamnaḍt n uskan n tugna", "lightbox.expand": "Simeɣer tamnaḍt n uskan n tugna", - "lightbox.next": "Γer zdat", - "lightbox.previous": "Γer deffir", + "lightbox.next": "Ɣer zdat", + "lightbox.previous": "Ɣer deffir", "link_preview.author": "S-ɣur {name}", "lists.account.add": "Rnu ɣer tebdart", "lists.account.remove": "Kkes seg tebdart", @@ -264,11 +273,12 @@ "lists.search": "Nadi gar yemdanen i teṭṭafaṛeḍ", "lists.subheading": "Tibdarin-ik·im", "load_pending": "{count, plural, one {# n uferdis amaynut} other {# n yiferdisen imaynuten}}", - "media_gallery.toggle_visible": "Ffer {number, plural, one {tugna} other {tugniwin}}", + "loading_indicator.label": "Yessalay-d …", + "media_gallery.toggle_visible": "{number, plural, one {Ffer tugna} other {Ffer tugniwin}}", "mute_modal.duration": "Tanzagt", "mute_modal.hide_notifications": "Tebɣiḍ ad teffreḍ talɣutin n umseqdac-a?", "mute_modal.indefinite": "Ur yettwasbadu ara", - "navigation_bar.about": "Γef", + "navigation_bar.about": "Ɣef", "navigation_bar.blocks": "Imseqdacen yettusḥebsen", "navigation_bar.bookmarks": "Ticraḍ", "navigation_bar.community_timeline": "Tasuddemt tadigant", @@ -284,7 +294,7 @@ "navigation_bar.logout": "Ffeɣ", "navigation_bar.mutes": "Iseqdacen yettwasusmen", "navigation_bar.personal": "Udmawan", - "navigation_bar.pins": "Tijewwiqin yettwasentḍen", + "navigation_bar.pins": "Tisuffaɣ yettwasenṭḍen", "navigation_bar.preferences": "Imenyafen", "navigation_bar.public_timeline": "Tasuddemt tazayezt tamatut", "navigation_bar.search": "Nadi", @@ -311,7 +321,7 @@ "notifications.column_settings.reblog": "Seǧhed:", "notifications.column_settings.show": "Ssken-d tilɣa deg ujgu", "notifications.column_settings.sound": "Rmed imesli", - "notifications.column_settings.status": "Tiẓenẓunin timaynutin:", + "notifications.column_settings.status": "Tisuffaɣ timaynutin :", "notifications.filter.all": "Akk", "notifications.filter.boosts": "Seǧhed", "notifications.filter.favourites": "Imenyafen", @@ -325,11 +335,15 @@ "notifications.permission_denied": "D awezɣi ad yili wermad n yilɣa n tnarit axateṛ turagt tettwagdel.", "notifications_permission_banner.enable": "Rmed talɣutin n tnarit", "notifications_permission_banner.title": "Ur zeggel acemma", + "onboarding.action.back": "Tuɣalin ɣer deffir", + "onboarding.actions.back": "Tuɣalin ɣer deffir", "onboarding.actions.go_to_explore": "See what's trending", "onboarding.actions.go_to_home": "Go to your home feed", "onboarding.compose.template": "Azul a #Mastodon!", "onboarding.follows.lead": "You curate your own home feed. The more people you follow, the more active and interesting it will be. These profiles may be a good starting point—you can always unfollow them later!", "onboarding.follows.title": "Popular on Mastodon", + "onboarding.profile.display_name": "Isem ara d-yettwaskanen", + "onboarding.share.title": "Bḍu amaɣnu-inek·inem", "onboarding.start.lead": "Your new Mastodon account is ready to go. Here's how you can make the most of it:", "onboarding.start.skip": "Want to skip right ahead?", "onboarding.steps.follow_people.body": "You curate your own feed. Lets fill it with interesting people.", @@ -365,7 +379,7 @@ "report.block": "Sewḥel", "report.categories.other": "Tiyyaḍ", "report.categories.spam": "Aspam", - "report.category.title_account": "ameγnu", + "report.category.title_account": "ameɣnu", "report.category.title_status": "tasuffeɣt", "report.close": "Immed", "report.forward": "Bren-it ɣeṛ {target}", @@ -383,6 +397,7 @@ "report_notification.open": "Ldi aneqqis", "search.placeholder": "Nadi", "search.search_or_paste": "Nadi neɣ senṭeḍ URL", + "search_popout.user": "amseqdac", "search_results.all": "Akk", "search_results.hashtags": "Ihacṭagen", "search_results.statuses": "Tisuffaɣ", @@ -405,7 +420,7 @@ "status.embed": "Seddu", "status.filtered": "Yettwasizdeg", "status.load_more": "Sali ugar", - "status.media_hidden": "Taɣwalt tettwaffer", + "status.media_hidden": "Amidya yettwaffer", "status.mention": "Bder-d @{name}", "status.more": "Ugar", "status.mute": "Sussem @{name}", @@ -425,7 +440,7 @@ "status.sensitive_warning": "Agbur amḥulfu", "status.share": "Bḍu", "status.show_less": "Ssken-d drus", - "status.show_less_all": "Semẓi akk tisuffγin", + "status.show_less_all": "Semẓi akk tisuffɣin", "status.show_more": "Ssken-d ugar", "status.show_more_all": "Ẓerr ugar lebda", "status.title.with_attachments": "{user} posted {attachmentCount, plural, one {an attachment} other {# attachments}}", @@ -444,7 +459,7 @@ "timeline_hint.remote_resource_not_displayed": "{resource} seg yiqeddacen-nniḍen ur d-ttwaskanent ara.", "timeline_hint.resources.followers": "Imeḍfaṛen", "timeline_hint.resources.follows": "T·Yeṭafaṛ", - "timeline_hint.resources.statuses": "Tijewwaqin tiqdimin", + "timeline_hint.resources.statuses": "Tisuffaɣ tiqdimin", "trends.counter_by_accounts": "{count, plural, one {{counter} person} other {{counter} people}} in the past {days, plural, one {day} other {# days}}", "trends.trending_now": "Ayen mucaɛen tura", "ui.beforeunload": "Arewway-ik·im ad iruḥ ma yella tefeɣ-d deg Maṣṭudun.", @@ -465,7 +480,7 @@ "upload_modal.choose_image": "Fren tugna", "upload_modal.description_placeholder": "Aberraɣ arurad ineggez nnig n uqjun amuṭṭis", "upload_modal.detect_text": "Sefru-d aḍris seg tugna", - "upload_modal.edit_media": "Ẓreg taɣwalt", + "upload_modal.edit_media": "Ẓreg amidya", "upload_modal.preparing_ocr": "Aheyyi n OCR…", "upload_modal.preview_label": "Taskant ({ratio})", "upload_progress.label": "Asali iteddu...", diff --git a/app/javascript/mastodon/locales/sk.json b/app/javascript/mastodon/locales/sk.json index ad7837cab2..da76e98687 100644 --- a/app/javascript/mastodon/locales/sk.json +++ b/app/javascript/mastodon/locales/sk.json @@ -523,6 +523,7 @@ "poll_button.add_poll": "Pridaj anketu", "poll_button.remove_poll": "Odstráň anketu", "privacy.change": "Uprav súkromie príspevku", + "privacy.direct.long": "Všetci spomenutí v príspevku", "privacy.direct.short": "Konkrétni ľudia", "privacy.private.long": "Iba tvoji nasledovatelia", "privacy.private.short": "Sledovatelia", diff --git a/app/javascript/mastodon/locales/th.json b/app/javascript/mastodon/locales/th.json index 72ecb11ed1..e0aa072a77 100644 --- a/app/javascript/mastodon/locales/th.json +++ b/app/javascript/mastodon/locales/th.json @@ -279,8 +279,8 @@ "follow_requests.unlocked_explanation": "แม้ว่าไม่มีการล็อคบัญชีของคุณ พนักงานของ {domain} คิดว่าคุณอาจต้องการตรวจทานคำขอติดตามจากบัญชีเหล่านี้ด้วยตนเอง", "follow_suggestions.curated_suggestion": "คัดสรรโดยบรรณาธิการ", "follow_suggestions.dismiss": "ไม่ต้องแสดงอีก", - "follow_suggestions.personalized_suggestion": "คำแนะนำเฉพาะบุคคล", - "follow_suggestions.popular_suggestion": "คำแนะนำยอดนิยม", + "follow_suggestions.personalized_suggestion": "ข้อเสนอแนะเฉพาะบุคคล", + "follow_suggestions.popular_suggestion": "ข้อเสนอแนะยอดนิยม", "follow_suggestions.view_all": "ดูทั้งหมด", "follow_suggestions.who_to_follow": "ติดตามใครดี", "followed_tags": "แฮชแท็กที่ติดตาม", diff --git a/app/javascript/mastodon/locales/tok.json b/app/javascript/mastodon/locales/tok.json index 85f62f404a..4d2cc3d1dc 100644 --- a/app/javascript/mastodon/locales/tok.json +++ b/app/javascript/mastodon/locales/tok.json @@ -2,6 +2,9 @@ "about.blocks": "ma lawa", "about.contact": "toki:", "about.domain_blocks.no_reason_available": "mi sona ala e tan", + "about.domain_blocks.preamble": "ilo Masoton li ken e ni: sina lukin e toki jan pi ma ilo mute. sina ken toki tawa ona lon kulupu ma. taso, ma ni li ken ala e ni tawa ma ni:", + "about.domain_blocks.silenced.explanation": "sina lukin ala e toki e jan tan ma ni. taso, sina wile la, sina ken ni.", + "about.domain_blocks.silenced.title": "ken lili lukin", "about.domain_blocks.suspended.title": "weka", "about.not_available": "lon kulupu ni la sina ken alasa ala e sona ni.", "about.rules": "lawa kulupu", @@ -32,6 +35,7 @@ "account.follows.empty": "jan ni li kute e jan ala", "account.go_to_profile": "o tawa lipu jan", "account.hide_reblogs": "o lukin ala e pana toki tan @{name}", + "account.in_memoriam": "jan ni li moli. pona o tawa ona.", "account.languages": "sina wile lukin e sitelen pi toki seme", "account.locked_info": "sina wile kute e jan ni la ona o toki e ken", "account.media": "sitelen", @@ -53,6 +57,7 @@ "account.unblock": "o weka ala e jan {name}", "account.unblock_domain": "o weka ala e ma {domain}", "account.unblock_short": "o pini weka", + "account.unendorse": "lipu jan la o suli ala e ni", "account.unfollow": "o pini kute", "account.unmute": "o len ala e @{name}", "account.unmute_notifications_short": "o kute e mu tan jan ni", @@ -65,6 +70,9 @@ "alert.unexpected.title": "pakala a!", "announcement.announcement": "toki suli", "audio.hide": "o len e kalama", + "boost_modal.combo": "sina ken luka e nena {combo} tawa ni: sina wile ala luka e nena lon tenpo kama", + "bundle_column_error.copy_stacktrace": "o awen e sona pakala lon ilo sina", + "bundle_column_error.error.body": "ilo li ken ala pana e lipu ni. ni li ken tan pakala ilo.", "bundle_column_error.error.title": "ike a!", "bundle_column_error.network.title": "pakala la ilo sina li toki ala tawa ilo ante", "bundle_column_error.retry": "o ni sin", @@ -75,7 +83,9 @@ "bundle_modal_error.message": "ilo li wile kama e ijo ni, taso pakala li lon.", "bundle_modal_error.retry": "o ni sin", "closed_registrations_modal.find_another_server": "o alasa e ma ante", + "column.about": "sona", "column.blocks": "kulupu pi jan weka", + "column.bookmarks": "awen toki", "column.home": "lipu open", "column.lists": "kulupu lipu", "column.mutes": "jan len", diff --git a/config/locales/de.yml b/config/locales/de.yml index b77f415190..57ce5268a8 100644 --- a/config/locales/de.yml +++ b/config/locales/de.yml @@ -979,7 +979,7 @@ de: next_steps: Du kannst dem Einspruch zustimmen, um die Moderationsentscheidung rückgängig zu machen, oder ihn ignorieren. subject: "%{username} hat Einspruch gegen eine Moderationsentscheidung auf %{instance} erhoben" new_critical_software_updates: - body: Kritische Updates wurden für Mastodon veröffentlicht – du solltest so schnell wie möglich aktualisieren! + body: ein neues Sicherheitsupdate wurde veröffentlicht. Du solltest Mastodon so schnell wie möglich aktualisieren! subject: Kritische Mastodon-Updates sind für %{instance} verfügbar! new_pending_account: body: Die Details von diesem neuem Konto sind unten. Du kannst die Anfrage akzeptieren oder ablehnen. @@ -1023,7 +1023,7 @@ de: salutation: "%{name}," settings: 'E-Mail-Einstellungen ändern: %{link}' unsubscribe: Abbestellen - view: 'Hier überprüfen:' + view: 'Siehe:' view_profile: Profil anzeigen view_status: Beitrag anschauen applications: diff --git a/config/locales/devise.be.yml b/config/locales/devise.be.yml index 18785d16ab..81f3120a88 100644 --- a/config/locales/devise.be.yml +++ b/config/locales/devise.be.yml @@ -12,6 +12,7 @@ be: last_attempt: У вас ёсць яшчэ адна спроба, перш чым ваш рахунак будзе заблакаваны locked: Ваш уліковы запіс заблакіраваны. not_found_in_database: Няправільны %{authentication_keys} або пароль. + omniauth_user_creation_failure: Памылка пры стварэнні ўліковага запісу для гэтай асобы. pending: Ваш уліковы запіс яшчэ разглядаецца. timeout: Ваш сеанс скончыўся. Каб працягнуць, увайдзіце яшчэ раз. unauthenticated: Вам патрэбна зайсьці альбо зарэгістравацца, каб працягнуць diff --git a/config/locales/devise.ca.yml b/config/locales/devise.ca.yml index 3720d3c5f7..9b4ccccff7 100644 --- a/config/locales/devise.ca.yml +++ b/config/locales/devise.ca.yml @@ -14,6 +14,7 @@ ca: last_attempt: Tens un intent més abans no es bloqui el teu compte. locked: El teu compte s'ha blocat. not_found_in_database: "%{authentication_keys} o contrasenya no són vàlids." + omniauth_user_creation_failure: S'ha produït un error en crear un compte per a aquesta identitat. pending: El teu compte encara està en revisió. timeout: La teva sessió ha expirat. Torna a iniciar-la per a continuar. unauthenticated: Necessites iniciar sessió o registrar-te abans de continuar. diff --git a/config/locales/devise.da.yml b/config/locales/devise.da.yml index daf802cdb7..c472242ba7 100644 --- a/config/locales/devise.da.yml +++ b/config/locales/devise.da.yml @@ -12,6 +12,7 @@ da: last_attempt: Du har ét forsøg mere, før din konto bliver låst. locked: Din konto er låst. not_found_in_database: Ugyldig %{authentication_keys} eller adgangskode. + omniauth_user_creation_failure: Fejl under oprettelse af konto for denne identitet. pending: Din konto er stadig under revision. timeout: Session udløbet. Log ind igen for at fortsætte. unauthenticated: Log ind eller tilmeld dig for at fortsætte. diff --git a/config/locales/devise.de.yml b/config/locales/devise.de.yml index cf05ddc16b..7982f8a743 100644 --- a/config/locales/devise.de.yml +++ b/config/locales/devise.de.yml @@ -12,6 +12,7 @@ de: last_attempt: Du hast nur noch einen Versuch, bevor dein Zugang gesperrt wird. locked: Dein Konto ist gesperrt. not_found_in_database: "%{authentication_keys} oder Passwort ungültig." + omniauth_user_creation_failure: Fehler beim Erstellen eines Kontos für diese Identität. pending: Dein Konto wird weiterhin überprüft. timeout: Deine Sitzung ist abgelaufen. Bitte melde dich erneut an, um fortzufahren. unauthenticated: Du musst dich anmelden oder registrieren, bevor du fortfahren kannst. diff --git a/config/locales/devise.es-AR.yml b/config/locales/devise.es-AR.yml index ca60ee5deb..6249294597 100644 --- a/config/locales/devise.es-AR.yml +++ b/config/locales/devise.es-AR.yml @@ -12,6 +12,7 @@ es-AR: last_attempt: Tenés un intento más antes de que se bloquee tu cuenta. locked: Se bloqueó tu cuenta. not_found_in_database: "%{authentication_keys} o contraseña no válidas." + omniauth_user_creation_failure: Error al crear una cuenta para esta identidad. pending: Tu cuenta todavía está bajo revisión. timeout: Venció tu sesión. Por favor, volvé a iniciar sesión para continuar. unauthenticated: Necesitás iniciar sesión o registrarte antes de continuar. diff --git a/config/locales/devise.eu.yml b/config/locales/devise.eu.yml index 624f9ee93d..3e675659fe 100644 --- a/config/locales/devise.eu.yml +++ b/config/locales/devise.eu.yml @@ -12,6 +12,7 @@ eu: last_attempt: Saiakera bat geratzen zaizu zure kontua giltzapetu aurretik. locked: Zure kontua giltzapetuta dago. not_found_in_database: Baliogabeko %{authentication_keys} edo pasahitza. + omniauth_user_creation_failure: Errorea identitate honen kontu bat sortzean. pending: Zure kontua oraindik berrikusteke dago. timeout: Zure saioa iraungitu da. Hasi saioa berriro jarraitzeko. unauthenticated: Saioa hasi edo izena eman behar duzu jarraitu aurretik. diff --git a/config/locales/devise.fi.yml b/config/locales/devise.fi.yml index 66616d16b1..003d48417b 100644 --- a/config/locales/devise.fi.yml +++ b/config/locales/devise.fi.yml @@ -12,6 +12,7 @@ fi: last_attempt: Sinulla on vielä yksi yritys ennen kuin tilisi lukitaan. locked: Tilisi on lukittu. not_found_in_database: Virheellinen %{authentication_keys} tai salasana. + omniauth_user_creation_failure: Virhe luotaessa tiliä tälle henkilöllisyydelle. pending: Tilisi on vielä tarkistamatta. timeout: Istuntosi on vanhentunut. Jatkaaksesi käyttöä, kirjaudu uudelleen. unauthenticated: Sinun on kirjauduttava tai rekisteröidyttävä ennen kuin voit jatkaa. diff --git a/config/locales/devise.fo.yml b/config/locales/devise.fo.yml index 1f7708bb44..30f83ba0da 100644 --- a/config/locales/devise.fo.yml +++ b/config/locales/devise.fo.yml @@ -12,6 +12,7 @@ fo: last_attempt: Tú kanst royna einaferð afturat áðrenn kontan verður stongd. locked: Kontan hjá tær er læst. not_found_in_database: Ogyldigur %{authentication_keys} ella loyniorð. + omniauth_user_creation_failure: Feilur í sambandi við, at ein konta fyri hendan samleikan bleiv stovnað. pending: Kontan hjá tær verður kannað enn. timeout: Tín innritan er útgingin. Innrita av nýggjum, fyri at hada fram. unauthenticated: Tú mást skriva teg inn aftur fyri at halda fram. diff --git a/config/locales/devise.fy.yml b/config/locales/devise.fy.yml index 05fd7b8071..c8a04a7405 100644 --- a/config/locales/devise.fy.yml +++ b/config/locales/devise.fy.yml @@ -12,6 +12,7 @@ fy: last_attempt: Jo hawwe noch ien besykjen oer eardat jo account blokkearre wurdt. locked: Jo account is blokkearre. not_found_in_database: "%{authentication_keys} of wachtwurd ûnjildich." + omniauth_user_creation_failure: Flater by it oanmeitsjen fan in account foar dizze identiteit. pending: Jo account moat noch hieltyd beoardiele wurde. timeout: Jo sesje is ferrûn. Meld jo opnij oan om troch te gean. unauthenticated: Jo moatte oanmelde of registrearje. diff --git a/config/locales/devise.gl.yml b/config/locales/devise.gl.yml index b9f4a0a005..00b1824808 100644 --- a/config/locales/devise.gl.yml +++ b/config/locales/devise.gl.yml @@ -12,6 +12,7 @@ gl: last_attempt: Tes un intento máis antes de que a túa conta fique bloqueada. locked: A túa conta está bloqueada. not_found_in_database: "%{authentication_keys} ou contrasinal non válidos." + omniauth_user_creation_failure: Erro ao crear unha conta para esta identidade. pending: A túa conta aínda está baixo revisión. timeout: A túa sesión caducou. Accede outra vez para continuar. unauthenticated: Precisas iniciar sesión ou rexistrarte antes de continuar. diff --git a/config/locales/devise.he.yml b/config/locales/devise.he.yml index f2ec3a6716..02e307ae1c 100644 --- a/config/locales/devise.he.yml +++ b/config/locales/devise.he.yml @@ -12,6 +12,7 @@ he: last_attempt: יש לך עוד ניסיון אחד לפני נעילת החשבון. locked: חשבון זה נעול. not_found_in_database: "%{authentication_keys} או סיסמה לא נכונים." + omniauth_user_creation_failure: שגיאה ביצירת חשבון לזהות הזו. pending: חשבונך נמצא עדיין בבדיקה. timeout: פג תוקף השהיה בחשבון. נא להכנס מחדש על מנת להמשיך. unauthenticated: יש להרשם או להכנס לחשבון על מנת להמשיך. diff --git a/config/locales/devise.hu.yml b/config/locales/devise.hu.yml index fea56ab24a..8c9fdf6a50 100644 --- a/config/locales/devise.hu.yml +++ b/config/locales/devise.hu.yml @@ -12,6 +12,7 @@ hu: last_attempt: Már csak egy próbálkozásod maradt, mielőtt a fiókodat zároljuk. locked: A fiókodat zároltuk. not_found_in_database: Helytelen %{authentication_keys} vagy jelszó. + omniauth_user_creation_failure: Hiba történt a fiók létrehozása során ehhez az identitáshoz. pending: A fiókod még engedélyezésre vár. timeout: A munkameneted lejárt. A folytatáshoz jelentkezz be újra. unauthenticated: A folytatás előtt be kell jelentkezned vagy regisztrálnod kell. diff --git a/config/locales/devise.ie.yml b/config/locales/devise.ie.yml index 332c9da456..9c82bd4529 100644 --- a/config/locales/devise.ie.yml +++ b/config/locales/devise.ie.yml @@ -12,6 +12,7 @@ ie: last_attempt: Hay solmen un prova ante que tui conto deveni serrat. locked: Tui conto es serrat. not_found_in_database: Ínvalid %{authentication_keys} o passa-parol. + omniauth_user_creation_failure: Errore in li creation de un conto por ti-ci identitá. pending: Tui conto es ancor sub revision. timeout: Tui session ha expirat. Ples reintrar denov por continuar. unauthenticated: Tu deve intrar o registrar te ante continuar. diff --git a/config/locales/devise.is.yml b/config/locales/devise.is.yml index 12015fa29d..a045bdd80c 100644 --- a/config/locales/devise.is.yml +++ b/config/locales/devise.is.yml @@ -12,6 +12,7 @@ is: last_attempt: Þú getur reynt einu sinni í viðbót áður en aðgangnum þínum verður læst. locked: Notandaaðgangurinn þinn er læstur. not_found_in_database: Ógilt %{authentication_keys} eða lykilorð. + omniauth_user_creation_failure: Villa við að útbúa aðgang fyrir þetta auðkenni. pending: Notandaaðgangurinn þinn er enn til yfirferðar. timeout: Setan þín er útrunnin. Skráðu þig aftur inn til að halda áfram. unauthenticated: Þú þarft að skrá þig inn eða nýskrá þig áður en lengra er haldið. diff --git a/config/locales/devise.it.yml b/config/locales/devise.it.yml index 19bd999aad..8aaea3c15b 100644 --- a/config/locales/devise.it.yml +++ b/config/locales/devise.it.yml @@ -12,6 +12,7 @@ it: last_attempt: Hai un altro tentativo, prima che il tuo profilo venga bloccato. locked: Il tuo profilo è bloccato. not_found_in_database: "%{authentication_keys} o password non valida." + omniauth_user_creation_failure: Errore nella creazione di un account per questa identità. pending: Il tuo profilo è ancora in revisione. timeout: La tua sessione è scaduta. Sei pregato di accedere nuovamente per continuare. unauthenticated: Devi accedere o registrarti, per continuare. diff --git a/config/locales/devise.kab.yml b/config/locales/devise.kab.yml index 2f60629fd7..f878a5b503 100644 --- a/config/locales/devise.kab.yml +++ b/config/locales/devise.kab.yml @@ -13,13 +13,13 @@ kab: locked: Amiḍan-ik yettwargel. not_found_in_database: Tella tuccḍa deg %{authentication_keys} neγ deg wawal uffir. pending: Amiḍan-inek mazal-it deg ɛiwed n tmuγli. - timeout: Tiγimit n tuqqna tezri. Ma ulac aγilif ɛiwed tuqqna akken ad tkemmleḍ. - unauthenticated: Ilaq ad teqqneḍ neγ ad tjerrḍeḍ akken ad tkemmelḍ. + timeout: Tiɣimit n tuqqna tezri. Ma ulac aɣilif ɛiwed tuqqna akken ad tkemmleḍ. + unauthenticated: Ilaq ad teqqneḍ neɣ ad tjerrḍeḍ akken ad tkemmelḍ. unconfirmed: Ilaq ad wekdeḍ tansa-inek imayl akken ad tkemmelḍ. mailer: confirmation_instructions: action: Senqed tansa-inek imayl - action_with_app: Wekked sakkin uγal γer %{app} + action_with_app: Sentem sakkin uɣal ɣer %{app} explanation: Aqla-k terniḍ amiḍan deg %{host} s tansa imayl-agi. Mazal-ak yiwen utekki akken ad t-tremdeḍ. Ma mačči d kečč i yessutren ay-agi, ttxil-k ssinef izen-a. explanation_when_pending: Tsutreḍ-d ajerred deg %{host} s tansa-agi imayl. Ad nγeṛ asuter-ik ticki tsentmeḍ tansa-ik imayl. Send asentem, ur tezmireḍ ara ad teqqneḍ γer umiḍan-ik. Ma yella nugi asuter-ik, isefka-ik ad ttwakksen seg uqeddac, ihi ulac tigawt-nniḍen ara k-d-yettuqeblen. Ma mačči d kečč i yellan deffir n usuter-agi, ttxil-k ssinef izen-agi. extra_html: Ttxil-k ẓer daγen ilugan n uqeddac akked twetlin n useqdec-nneγ. @@ -87,7 +87,7 @@ kab: unlocks: send_instructions: Deg kra n tesdatin, ad teṭṭfeḍ imayl deg-s iwellihen i yilaqen i userreḥ n umiḍan-ik·im. Ma yella ur tufiḍ ara izen-agi, ttxil-k·m ẓer deg ukaram spam. send_paranoid_instructions: Ma yella umiḍan-ik·im yella, ad teṭṭfeḍ imayl deg tesdatin i d-iteddun, deg-s iwellihen i yilaqen i userreḥ n umiḍan-ik·im. Ma yella ur tufiḍ ara izen-agi, ttxil-k·m ẓer deg ukaram spam. - unlocked: Iserreḥ umiḍan-ik·im akken iwata. ttxil qqen akken ad tkemleḍ. + unlocked: Iserreḥ umiḍan-ik·im akken iwata. Ttxil qqen akken ad tkemleḍ. errors: messages: already_confirmed: ittwasentem yakan, ttxil εreḍ ad teqneḍ diff --git a/config/locales/devise.ko.yml b/config/locales/devise.ko.yml index 0c848e4bac..198d44a4f7 100644 --- a/config/locales/devise.ko.yml +++ b/config/locales/devise.ko.yml @@ -12,6 +12,7 @@ ko: last_attempt: 계정이 잠기기까지 한 번의 시도가 남았습니다. locked: 계정이 잠겼습니다. not_found_in_database: 올바르지 않은 %{authentication_keys} 혹은 암호입니다. + omniauth_user_creation_failure: 이 신원으로 계정을 만드는데 실패했습니다. pending: 이 계정은 아직 검토 중입니다. timeout: 세션이 만료되었습니다. 다시 로그인 하세요. unauthenticated: 계속 하려면 로그인을 해야 합니다. diff --git a/config/locales/devise.lad.yml b/config/locales/devise.lad.yml index d2ce53760c..7d447140f4 100644 --- a/config/locales/devise.lad.yml +++ b/config/locales/devise.lad.yml @@ -12,6 +12,7 @@ lad: last_attempt: Aprova una vez mas antes de ke tu kuento sea blokado. locked: Tu kuento esta blokado. not_found_in_database: Inkorekto %{authentication_keys} o kod. + omniauth_user_creation_failure: Ay un error en kriyar un kuento para esta identita. pending: Tu kuento ainda esta basho revizyon. timeout: Tu sesyon tiene kadukado. Por favor konektate kon tu kuento de muevo para kontinuar. unauthenticated: Kale konektarte kon tu kuento o enregistrarte antes de kontinuar. diff --git a/config/locales/devise.nl.yml b/config/locales/devise.nl.yml index 0aaf376f7f..ab6ae84db4 100644 --- a/config/locales/devise.nl.yml +++ b/config/locales/devise.nl.yml @@ -12,6 +12,7 @@ nl: last_attempt: Je hebt nog één poging over voordat jouw account wordt opgeschort. locked: Jouw account is opgeschort. not_found_in_database: "%{authentication_keys} of wachtwoord ongeldig." + omniauth_user_creation_failure: Fout bij het aanmaken van een account voor deze identiteit. pending: Jouw account moet nog steeds worden beoordeeld. timeout: Jouw sessie is verlopen, log opnieuw in. unauthenticated: Je dient in te loggen of te registreren. diff --git a/config/locales/devise.pl.yml b/config/locales/devise.pl.yml index a6d48f11ef..f34fd04633 100644 --- a/config/locales/devise.pl.yml +++ b/config/locales/devise.pl.yml @@ -12,6 +12,7 @@ pl: last_attempt: Masz jeszcze jedną próbę; Twoje konto zostanie zablokowane jeśli się nie powiedzie. locked: Twoje konto zostało zablokowane. not_found_in_database: Nieprawidłowy %{authentication_keys} lub hasło. + omniauth_user_creation_failure: Błąd przy tworzeniu konta dla tej tożsamości. pending: Twoje konto oczekuje na przegląd. timeout: Twoja sesja wygasła. Zaloguj się ponownie, aby kontynuować.. unauthenticated: Zapisz się lub zaloguj, aby kontynuować. diff --git a/config/locales/devise.pt-PT.yml b/config/locales/devise.pt-PT.yml index c169ddeb97..c66181fc5b 100644 --- a/config/locales/devise.pt-PT.yml +++ b/config/locales/devise.pt-PT.yml @@ -12,6 +12,7 @@ pt-PT: last_attempt: Tem só mais uma tentativa antes da sua conta ser bloqueada. locked: A tua conta está bloqueada. not_found_in_database: "%{authentication_keys} ou palavra-passe inválida." + omniauth_user_creation_failure: Erro ao criar uma conta para esta identidade. pending: A sua conta está ainda a aguardar revisão. timeout: A tua sessão expirou. Por favor, entra de novo para continuares. unauthenticated: Precisas de entrar na tua conta ou de te registares antes de continuar. diff --git a/config/locales/devise.sk.yml b/config/locales/devise.sk.yml index 3eb4b5304c..bc01b73ccf 100644 --- a/config/locales/devise.sk.yml +++ b/config/locales/devise.sk.yml @@ -12,6 +12,7 @@ sk: last_attempt: Máš posledný pokus pred zamknutím tvojho účtu. locked: Tvoj účet je zamknutý. not_found_in_database: Nesprávny %{authentication_keys}, alebo heslo. + omniauth_user_creation_failure: Chyba pri vytváraní účtu pre túto identitu. pending: Tvoj účet je stále prehodnocovaný. timeout: Tvoja aktívna sezóna vypršala. Pre pokračovanie sa prosím prihlás znovu. unauthenticated: K pokračovaniu sa musíš zaregistrovať alebo prihlásiť. diff --git a/config/locales/devise.sl.yml b/config/locales/devise.sl.yml index 2d567e63f4..0eb9b6330a 100644 --- a/config/locales/devise.sl.yml +++ b/config/locales/devise.sl.yml @@ -12,6 +12,7 @@ sl: last_attempt: Pred zaklepom računa imate še en poskus. locked: Vaš račun je zaklenjen. not_found_in_database: Neveljavno %{authentication_keys} ali geslo. + omniauth_user_creation_failure: Napaka pri ustvarjanju računa za to identiteto. pending: Vaš račun je še vedno pod drobnogledom. timeout: Vaša seja je potekla. Če želite nadaljevati, se znova prijavite. unauthenticated: Pred nadaljevanjem se morate prijaviti ali vpisati. diff --git a/config/locales/devise.sq.yml b/config/locales/devise.sq.yml index 32136a0baa..76dd493245 100644 --- a/config/locales/devise.sq.yml +++ b/config/locales/devise.sq.yml @@ -12,6 +12,7 @@ sq: last_attempt: Mund të provoni edhe një herë, përpara se llogaria juaj të kyçet. locked: Llogaria juaj është e kyçur. not_found_in_database: "%{authentication_keys} ose fjalëkalim i pavlefshëm." + omniauth_user_creation_failure: Gabim në krijim llogarie për këtë identitet. pending: Llogaria juaj është ende nën shqyrtim. timeout: Sesioni juaj ka skaduar. Ju lutemi, që të vazhdohet, ribëni hyrjen. unauthenticated: Përpara se të vazhdohet më tej, lypset të bëni hyrjen ose të regjistroheni. diff --git a/config/locales/devise.sr-Latn.yml b/config/locales/devise.sr-Latn.yml index c48ed87dca..3947b2d84f 100644 --- a/config/locales/devise.sr-Latn.yml +++ b/config/locales/devise.sr-Latn.yml @@ -12,6 +12,7 @@ sr-Latn: last_attempt: Imate još jedan pokušaj pre nego što Vaš nalog bude zaključan. locked: Vaš nalog je zaključan. not_found_in_database: Neispravna %{authentication_keys} ili lozinka. + omniauth_user_creation_failure: Greška pri kreiranju naloga za ovaj identitet. pending: Vaš račun je još uvek u pregledu. timeout: Vreme trajanja Vaše sesije je isteklo. Za nastavak prijavite se ponovo. unauthenticated: Za nastavak se morate prijaviti ili registrovati. diff --git a/config/locales/devise.sr.yml b/config/locales/devise.sr.yml index 3e49cf97ee..a4c08dfaf0 100644 --- a/config/locales/devise.sr.yml +++ b/config/locales/devise.sr.yml @@ -12,6 +12,7 @@ sr: last_attempt: Имате још један покушај пре него што Ваш налог буде закључан. locked: Ваш налог је закључан. not_found_in_database: Неисправна %{authentication_keys} или лозинка. + omniauth_user_creation_failure: Грешка при креирању налога за овај идентитет. pending: Ваш налог се још увек прегледа. timeout: Ваша сесија је истекла. Пријавите се поново да бисте наставили. unauthenticated: Морате да се пријавите или региструјете пре него што наставите. diff --git a/config/locales/devise.tr.yml b/config/locales/devise.tr.yml index 66ca9b2816..e709d3fff1 100644 --- a/config/locales/devise.tr.yml +++ b/config/locales/devise.tr.yml @@ -12,6 +12,7 @@ tr: last_attempt: Hesabınız kilitlenmeden önce bir kez daha denemeniz gerekir. locked: Hesabınız kilitlendi. not_found_in_database: Geçersiz %{authentication_keys} ya da parola. + omniauth_user_creation_failure: Bu kimlik için hesap oluşturmada hata. pending: Hesabınız hala inceleniyor. timeout: Oturum süreniz sona erdi. Lütfen devam etmek için tekrar giriş yapınız. unauthenticated: Devam etmeden önce oturum açmanız veya kayıt olmanız gerek. diff --git a/config/locales/devise.uk.yml b/config/locales/devise.uk.yml index 3b3883fa9c..65e89a274f 100644 --- a/config/locales/devise.uk.yml +++ b/config/locales/devise.uk.yml @@ -12,6 +12,7 @@ uk: last_attempt: У вас залишилась ще одна спроба, після якої ваш обліковий запис буде заблоковано. locked: Ваш обліковий запис заблоковано. not_found_in_database: Неправильний %{authentication_keys} або пароль. + omniauth_user_creation_failure: Помилка створення облікового запису для цієї особи. pending: Ваш обліковий запис ще перебуває на розгляді. timeout: Час сеансу минув. Будь ласка, увійдіть знову, щоб продовжити. unauthenticated: Щоб продовжити, увійдіть або зареєструйтеся. diff --git a/config/locales/devise.zh-CN.yml b/config/locales/devise.zh-CN.yml index 9b4b3ae203..3eb722b961 100644 --- a/config/locales/devise.zh-CN.yml +++ b/config/locales/devise.zh-CN.yml @@ -12,6 +12,7 @@ zh-CN: last_attempt: 你只有最后一次尝试机会,若未通过,帐号将被锁定。 locked: 你的账户已被锁定。 not_found_in_database: "%{authentication_keys}或密码错误。" + omniauth_user_creation_failure: 为此身份创建账户时出错。 pending: 你的账号仍在审核中。 timeout: 你的会话已过期。请重新登录再继续操作。 unauthenticated: 继续操作前请注册或者登录。 diff --git a/config/locales/devise.zh-HK.yml b/config/locales/devise.zh-HK.yml index 7f728bf0ad..a2620a8e4a 100644 --- a/config/locales/devise.zh-HK.yml +++ b/config/locales/devise.zh-HK.yml @@ -12,6 +12,7 @@ zh-HK: last_attempt: 若你再一次嘗試失敗,我們將鎖定你的帳號,以策安全。 locked: 你的帳號已被鎖定。 not_found_in_database: 不正確的%{authentication_keys}或密碼。 + omniauth_user_creation_failure: 為此身份建立帳號時出錯。 pending: 你的帳號仍在審核中 timeout: 你的登入階段已經過期,請重新登入以繼續使用。 unauthenticated: 你必須先登入或登記,以繼續使用。 diff --git a/config/locales/devise.zh-TW.yml b/config/locales/devise.zh-TW.yml index 06438971a7..7ead831e4f 100644 --- a/config/locales/devise.zh-TW.yml +++ b/config/locales/devise.zh-TW.yml @@ -12,6 +12,7 @@ zh-TW: last_attempt: 帳號鎖定前,您還有最後一次嘗試機會。 locked: 已鎖定您的帳號。 not_found_in_database: 無效的 %{authentication_keys} 或密碼。 + omniauth_user_creation_failure: 以此身分新增帳號時發生錯誤。 pending: 您的帳號仍在審核中。 timeout: 登入階段逾時。請重新登入以繼續。 unauthenticated: 您必須先登入或註冊才能繼續使用。 diff --git a/config/locales/doorkeeper.kab.yml b/config/locales/doorkeeper.kab.yml index fe1a8d9c50..d7f8904a35 100644 --- a/config/locales/doorkeeper.kab.yml +++ b/config/locales/doorkeeper.kab.yml @@ -36,7 +36,7 @@ kab: application: Asnas callback_url: URL n tririt n wawal delete: Kkes - empty: Ulac γur-ek·em isnasen. + empty: Ulac ɣur-k·m isnasen. name: Isem new: Asnas amaynut show: Ẓer @@ -57,7 +57,7 @@ kab: new: title: Tlaq tsiregt show: - title: Nγel tangalt n wurag sakkin senteḍ-itt deg usnas. + title: Nɣel tangalt n wurag sakkin senteḍ-itt deg usnas. authorized_applications: buttons: revoke: Ḥwi @@ -113,13 +113,13 @@ kab: read:notifications: ẓer tilγa-ik read:reports: ẓer ineqqisen-ik·im read:search: anadi deg umkan-ik·im - read:statuses: ẓer meṛṛa tisuffaγ + read:statuses: ẓer meṛṛa tisuffaɣ write: beddel meṛṛa isefka n umiḍan-ik write:accounts: ẓreg amaγnu-ik write:blocks: seḥbes imiḍanen d tγula - write:bookmarks: ad yernu tisuffγin γer ticraḍ + write:bookmarks: ad yernu tisuffaɣ ɣer ticraḍ write:filters: rnu-d imsizedgen write:follows: ḍfeṛ imdanen write:lists: ad yesnulfu tibdarin - write:media: ad yessali ifayluyen n teγwalt + write:media: ad yessali ifuyla n umidya write:notifications: sfeḍ tilɣa-k·m diff --git a/config/locales/ie.yml b/config/locales/ie.yml index a8287da533..7ab7f953be 100644 --- a/config/locales/ie.yml +++ b/config/locales/ie.yml @@ -1793,6 +1793,12 @@ ie: extra: It es ja pret a descargar! subject: Tui archive es pret por descargar title: Descargar archive + failed_2fa: + details: 'Vi li detallies del prova de intrar:' + explanation: Alqui provat accesser tui conto ma usat un ínvalid duesim factor de autentication. + further_actions_html: Si it ne esset tu, noi recomanda que tu strax %{action} nam li conto posse esser compromisset. + subject: Falliment de autentication de duesim factor + title: Fallit autentication de duesim factor suspicious_sign_in: change_password: changear tui passa-parol details: 'Vi li detallies del apertion de session:' diff --git a/config/locales/kab.yml b/config/locales/kab.yml index 66aeafde60..bf574fc016 100644 --- a/config/locales/kab.yml +++ b/config/locales/kab.yml @@ -5,7 +5,7 @@ kab: contact_missing: Ur yettusbadu ara contact_unavailable: Wlac hosted_on: Maṣṭudun yersen deg %{domain} - title: Γef + title: Ɣef accounts: follow: Ḍfeṛ followers: @@ -15,9 +15,9 @@ kab: last_active: armud aneggaru nothing_here: Ulac kra da! posts: - one: Tajewwiqt - other: Tijewwiqin - posts_tab_heading: Tijewwiqin + one: Tasuffeɣt + other: Tisuffaɣ + posts_tab_heading: Tisuffaɣ admin: account_actions: action: Eg tigawt @@ -47,7 +47,7 @@ kab: disable_two_factor_authentication: Gdel 2FA disabled: Yensa display_name: Isem ara d-yettwaskanen - domain: Taγult + domain: Taɣult edit: Ẓreg email: Imayl email_status: Addad n imayl @@ -111,7 +111,7 @@ kab: targeted_reports: Yettwazen uneqqis sɣur wiyaḍ silence: Sgugem silenced: Yettwasgugem - statuses: Tisuffɣin + statuses: Tisuffaɣ subscribe: Jerred suspended: Yeḥbes title: Imiḍanen @@ -203,22 +203,22 @@ kab: announcements: destroyed_msg: Tamselɣut tettwakkes akken iwata! edit: - title: Ẓreg ulγu - empty: Ulac kra n ulγuyen. + title: Ẓreg ulɣu + empty: Ulac kra n yilɣa yettwafen. live: Srid new: - create: Rnu-d ulγu - title: Ulγu amaynut + create: Snlufu-d ulɣu + title: Ulɣu amaynut publish: Sufeɣ published_msg: Tamselɣut tettwasufeɣ-d akken iwata! scheduled_for: Yettusɣiwsen i %{time} scheduled_msg: Tamselɣut tettusɣiwes i usufeɣ! - title: Ulγuyen + title: Ilɣa custom_emojis: assign_category: Efk taggayt - by_domain: Taγult + by_domain: Taɣult copied_msg: Takna tadigant n imuji yettwarna-d mebla ugur - copy: Nγel + copy: Nɣel create_new_category: Rnu-d taggayt tamaynut created_msg: Imuji yettwarna-d mebla ugur! delete: Kkes @@ -229,7 +229,7 @@ kab: enable: Rmed enabled: Yermed enabled_msg: Imuji yermed mebla ugur - list: Umuγ + list: Tabdart new: title: Timerna n imuji udmawan amaynut overwrite: Semselsi @@ -256,7 +256,7 @@ kab: add_new: Rni iḥder amaynut n taɣult confirm_suspension: cancel: Sefsex - domain: Taγult + domain: Taɣult export: Sifeḍ import: Kter new: @@ -274,9 +274,9 @@ kab: email_domain_blocks: add_new: Rnu amaynut delete: Kkes - domain: Taγult + domain: Taɣult new: - create: Rnu taγult + create: Rnu taɣult title: Timerna n taɣult tamaynut n imayl ɣer tebdart taberkant title: Tabdart taberkant n imayl follow_recommendations: @@ -286,8 +286,8 @@ kab: instances: back_to_all: Akk back_to_limited: Ɣur-s talast - back_to_warning: Γur-wat - by_domain: Taγult + back_to_warning: Ɣur-wat + by_domain: Taɣult content_policies: policy: Tasertit delivery: @@ -306,7 +306,7 @@ kab: private_comment: Awennit uslig public_comment: Awennit azayez title: Tamatut - total_blocked_by_us: Ttwasḥebsen sγur-neγ + total_blocked_by_us: Ttwasḥebsen sɣur-neɣ total_followed_by_them: Ṭtafaṛen-t total_followed_by_us: Neṭṭafaṛ-it total_reported: Ineqqisen fell-asen @@ -354,12 +354,15 @@ kab: other: "%{count} n timawin" action_taken_by: Tigawt yettwaṭṭfen sɣur are_you_sure: Tetḥaq-eḍ? + cancel: Sefsex category: Taggayt comment: none: Ula yiwen confirm: Sentem + delete_and_resolve: Kkes tisuffaɣ mark_as_resolved: Creḍ-it yefra mark_as_unresolved: Creḍ-it ur yefra ara + no_one_assigned: Ula yiwen notes: create: Rnu tazmilt create_and_resolve: Fru s tamawt @@ -390,16 +393,16 @@ kab: title: Ilugan n uqeddac settings: about: - title: Γef + title: Ɣef appearance: title: Udem discovery: - profile_directory: Akaram n imaγnuten + profile_directory: Akaram n imaɣnuten trends: Ayen mucaɛen domain_blocks: all: I medden akk - disabled: Γef ula yiwen - users: Γef yimseqdacen idiganen i yeqqnen + disabled: Ɣef ula yiwen + users: Ɣef yimseqdacen idiganen i yeqqnen registrations: title: Ajerred registrations_mode: @@ -408,19 +411,26 @@ kab: open: Zemren akk ad jerden site_uploads: delete: Kkes afaylu yulin + software_updates: + documentation_link: Issin ugar statuses: application: Asnas - back_to_account: Tuγalin γer usebter n umiḍan + back_to_account: Tuɣalin ɣer usebter n umiḍan deleted: Yettwakkes favourites: Imenyafen language: Tutlayt media: - title: Taγwalt - title: Tisuffiγin n umiḍan - with_media: S taγwalt + title: Amidya + title: Tisuffaɣ n umiḍan + trending: Ayen mucaɛen + visibility: Abani + with_media: S umidya title: Tadbelt trends: allow: Sireg + statuses: + title: Tisuffaɣ mucaɛen + trending: Ayen mucaɛen warning_presets: add_new: Rnu amaynut delete: Kkes @@ -431,7 +441,11 @@ kab: new_report: body: "%{reporter} yettwazen ɣef %{target}" subject: Aneqqis amaynut i %{instance} (#%{id}) + new_trends: + new_trending_statuses: + title: Tisuffaɣ mucaɛen appearance: + advanced_web_interface: Agrudem n web leqqayen discovery: Asnirem localization: guide_link: https://crowdin.com/project/mastodon @@ -448,6 +462,8 @@ kab: your_token: Ajiṭun-ik·im n unekcum auth: apply_for_account: Suter amiḍan + confirmations: + welcome_title: Ansuf yessek·em, %{name}! delete_account: Kkes amiḍan description: prefix_invited_by_user: "@%{name} inced-ik·ikem ad ternuḍ ɣer uqeddac-a n Mastodon!" @@ -455,9 +471,11 @@ kab: forgot_password: Tettud awal-ik uffir? log_in_with: Qqen s login: Qqen - logout: Ffeγ - migrate_account: Gujj γer umiḍan nniḍen - or_log_in_with: Neγ eqqen s + logout: Ffeɣ + migrate_account: Gujj ɣer umiḍan nniḍen + or_log_in_with: Neɣ eqqen s + progress: + confirm: Sentem imayl providers: cas: CAS saml: SAML @@ -466,8 +484,11 @@ kab: reset_password: Wennez awal uffir rules: back: Tuɣalin - security: Taγellist + security: Taɣellist set_new_password: Egr-d awal uffir amaynut + sign_in: + preamble_html: Kcem ar %{domain} s inekcam-inek n tuqqna. Ma yella yezga-d umiḍan-ik deg uqeddac-nniḍen, ur tezmireḍ ara ad tkecmeḍ sya. + title: Akeččum ɣer %{domain} status: account_status: Addad n umiḍan use_security_key: Seqdec tasarut n teɣlist @@ -498,16 +519,21 @@ kab: warning: username_available: Isem-ik·im n useqdac ad yuɣal yella i tikkelt-nniḍen username_unavailable: Isem-ik·im n useqdac ad yeqqim ulac-it + disputes: + strikes: + status: 'Tasuffeɣt #%{id}' + title_actions: + none: Ɣur-wat errors: '500': - title: Asebter-ayi d arameγtu + title: Asebter-ayi d arameɣtu existing_username_validator: not_found_multiple: ur yezmir ara ad yaf %{usernames} exports: archive_takeout: date: Azemz download: Sider-d aḥraz-ik·im - size: Teγzi + size: Teɣzi bookmarks: Ticraḍ csv: CSV lists: Tibdarin @@ -516,8 +542,8 @@ kab: add_new: Rnu amaynut filters: contexts: - account: Imuγna - notifications: Tilγa + account: Imuɣna + notifications: Ilɣa thread: Idiwenniyen edit: title: Ẓreg amzizdig @@ -534,8 +560,10 @@ kab: remove: Kkes seg umsizdeg generic: all: Akk + cancel: Sefsex changes_saved_msg: Ttwaskelsen ibelliden-ik·im akken ilaq! - copy: Nγel + confirm: Sentem + copy: Nɣel delete: Kkes order_by: Sizwer s save_changes: Sekles ibeddilen @@ -575,7 +603,7 @@ kab: sign_in_token: tangalt n tɣellist n tansa imayl webauthn: tisura n tɣellist migrations: - acct: Ibeddel γer + acct: Ibeddel ɣer incoming_migrations: Tusiḍ-d seg umiḍan nniḍen proceed_with_move: Awid imeḍfaṛen-ik moderation: @@ -597,7 +625,7 @@ kab: reblog: subject: "%{name} yesselha addad-ik·im" notifications: - other_settings: Iγewwaṛen nniḍen n tilγa + other_settings: Iɣewwaṛen nniḍen n yilɣa number: human: decimal_units: @@ -611,11 +639,13 @@ kab: setup: Sbadu pagination: newer: Amaynut - next: Γer zdat + next: Ɣer zdat older: Aqbuṛ prev: Win iɛeddan preferences: other: Wiyaḍ + privacy: + privacy: Tabaḍnit privacy_policy: title: Tasertit tabaḍnit relationships: @@ -634,6 +664,7 @@ kab: browser: Iminig browsers: alipay: Alipay + blackberry: BlackBerry chrome: Chrome edge: Microsoft Edge electron: Electron @@ -648,37 +679,41 @@ kab: qq: Iminig QQ safari: Safari weibo: Weibo - current_session: Tiγimit tamirant + current_session: Tiɣimit tamirant + date: Azemz description: "%{browser} s %{platform}" ip: IP platforms: adobe_air: Adobe Air android: Android + blackberry: BlackBerry + chrome_os: ChromeOS firefox_os: Firefox OS ios: iOS + kai_os: KaiOS linux: Linux mac: macOS windows: Windows windows_mobile: Windows Mobile - windows_phone: Tiliγri Windows Phone + windows_phone: Tiliɣri Windows Phone revoke: Ḥwi title: Tiɣimiyin settings: account: Amiḍan - account_settings: Iγewwaṛen n umiḍan + account_settings: Iɣewwaṛen n umiḍan appearance: Udem authorized_apps: Isnasen yettussirgen - back: Uγal γer Maṣṭudun + back: Uɣal ɣer Maṣṭudun delete: Tukksa n umiḍan development: Taneflit - edit_profile: Ẓreg amaγnu + edit_profile: Ẓreg amaɣnu export: Taktert n yisefka import: Kter import_and_export: Taktert d usifeḍ migrate: Tunigin n umiḍan - notifications: Tilγa + notifications: Ilɣa preferences: Imenyafen - profile: Ameγnu + profile: Ameɣnu relationships: Imeḍfaṛen akked wid i teṭṭafaṛeḍ statuses_cleanup: Tukksa tawurmant n tsuffaɣ two_factor_authentication: Asesteb s snat n tarrayin @@ -745,22 +780,25 @@ kab: otp: Asnas n usesteb webauthn: Tisura n teɣlist user_mailer: + appeal_approved: + action: Iɣewwaṛen n umiḍan warning: categories: spam: Aspam title: disable: Amiḍan i igersen - none: Γur-wat + none: Ɣur-wat silence: Amiḍan yesɛa talast suspend: Amiḍan yettwaḥbas welcome: final_action: Bdu asuffeɣ full_handle: Tansa umiḍan-ik takemmalit - subject: Ansuf γer Maṣṭudun + subject: Ansuf ɣer Maṣṭudun title: Ansuf yessek·em, %{name}! users: signed_in_as: 'Teqqneḍ amzun d:' verification: + here_is_how: Ha-t-a amek verification: Asenqed webauthn_credentials: add: Rnu tasarut n teɣlist tamaynut diff --git a/config/locales/simple_form.kab.yml b/config/locales/simple_form.kab.yml index 1e1c52da24..546336660c 100644 --- a/config/locales/simple_form.kab.yml +++ b/config/locales/simple_form.kab.yml @@ -12,7 +12,7 @@ kab: defaults: autofollow: Imdanen ara ijerrden s usnebgi-inek, ad k-ḍefṛen s wudem awurman email: Ad n-teṭṭfeḍ imayl i usentem - irreversible: Tijewwaqin i tessazedgeḍ ad ttwakksent i lebda, ula ma tekkseḍ imsizdeg-nni ar zdat + irreversible: Tisuffaɣ i tessazedgeḍ ad ttwakksent i lebda, ula ma tekkseḍ imsizdeg-nni ar zdat locale: Tutlayt n ugrudem, imaylen d tilγa password: Seqdec ma drus 8 n yisekkilen setting_display_media_default: Ffer teywalt yettwacreḍ d tanafrit @@ -69,12 +69,12 @@ kab: setting_display_media_show_all: Ssken kullec setting_hide_network: Ffer azetta-k·m setting_theme: Asental n wesmel - setting_use_pending_items: Askar aleγwayan + setting_use_pending_items: Askar aleɣwayan sign_in_token_attempt: Tangalt n tɣellist title: Azwel type: Anaw n uktar username: Isem n useqdac - username_or_email: Isem n useqdac neγ imal + username_or_email: Isem n useqdac neɣ imal whole_word: Awal akk featured_tag: name: Ahacṭag @@ -84,7 +84,7 @@ kab: invite: comment: Awennit invite_request: - text: Acimi tebγiḍ ad ternuḍ iman-ik? + text: Acimi tebɣiḍ ad ternuḍ iman-ik? ip_block: comment: Awennit ip: IP diff --git a/config/locales/sq.yml b/config/locales/sq.yml index 3dd4731209..460fd82dc0 100644 --- a/config/locales/sq.yml +++ b/config/locales/sq.yml @@ -188,7 +188,7 @@ sq: create_user_role: Krijoni Rol demote_user: Zhgradoje Përdoruesin destroy_announcement: Fshije Lajmërimin - destroy_canonical_email_block: Fshi Bllokim El-esh + destroy_canonical_email_block: Fshi Bllokim Email-esh destroy_custom_emoji: Fshi Emotikon Vetjak destroy_domain_allow: Fshi Lejim Përkatësie destroy_domain_block: Fshi Bllokim Përkatësie @@ -283,7 +283,7 @@ sq: unsuspend_account_html: "%{name} hoqi pezullimin për llogarinë e %{target}" update_announcement_html: "%{name} përditësoi lajmërimin %{target}" update_custom_emoji_html: "%{name} përditësoi emoxhin %{target}" - update_domain_block_html: "%{name} përditësoi bllokimin e përkatësish për %{target}" + update_domain_block_html: "%{name} përditësoi bllokim përkatësish për %{target}" update_ip_block_html: "%{name} ndryshoi rregull për IP-në %{target}" update_status_html: "%{name} përditësoi gjendjen me %{target}" update_user_role_html: "%{name} ndryshoi rolin për %{target}" diff --git a/config/locales/th.yml b/config/locales/th.yml index 74fc1b26b7..b76f6992ad 100644 --- a/config/locales/th.yml +++ b/config/locales/th.yml @@ -452,7 +452,7 @@ th: title: นำเข้าการปิดกั้นโดเมน no_file: ไม่ได้เลือกไฟล์ follow_recommendations: - description_html: "คำแนะนำการติดตามช่วยให้ผู้ใช้ใหม่ค้นหาเนื้อหาที่น่าสนใจได้อย่างรวดเร็ว เมื่อผู้ใช้ไม่ได้โต้ตอบกับผู้อื่นมากพอที่จะสร้างคำแนะนำการติดตามส่วนบุคคล จะแนะนำบัญชีเหล่านี้แทน จะคำนวณคำแนะนำใหม่เป็นประจำทุกวันจากบัญชีต่าง ๆ ที่มีการมีส่วนร่วมล่าสุดสูงสุดและจำนวนผู้ติดตามในเซิร์ฟเวอร์สูงสุดสำหรับภาษาที่กำหนด" + description_html: "คำแนะนำการติดตามช่วยให้ผู้ใช้ใหม่ค้นหาเนื้อหาที่น่าสนใจได้อย่างรวดเร็ว เมื่อผู้ใช้ไม่ได้โต้ตอบกับผู้อื่นมากพอที่จะสร้างคำแนะนำการติดตามเฉพาะบุคคล จะแนะนำบัญชีเหล่านี้แทน จะคำนวณคำแนะนำใหม่เป็นประจำทุกวันจากบัญชีต่าง ๆ ที่มีการมีส่วนร่วมล่าสุดสูงสุดและจำนวนผู้ติดตามในเซิร์ฟเวอร์สูงสุดสำหรับภาษาที่กำหนด" language: สำหรับภาษา status: สถานะ suppress: ระงับคำแนะนำการติดตาม From 4b7f04e3eab274e574289a554f004c4a58e7ef9b Mon Sep 17 00:00:00 2001 From: Matt Jankowski Date: Fri, 16 Feb 2024 02:52:29 -0500 Subject: [PATCH 123/211] Reduce `RSpec/MultipleExpectations` in post_status_service spec (#29225) --- spec/services/post_status_service_spec.rb | 28 +++++++++++------------ 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/spec/services/post_status_service_spec.rb b/spec/services/post_status_service_spec.rb index d10a82607e..acbebc5056 100644 --- a/spec/services/post_status_service_spec.rb +++ b/spec/services/post_status_service_spec.rb @@ -32,27 +32,27 @@ RSpec.describe PostStatusService, type: :service do let!(:future) { Time.now.utc + 2.hours } let!(:previous_status) { Fabricate(:status, account: account) } - it 'schedules a status' do - status = subject.call(account, text: 'Hi future!', scheduled_at: future) - expect(status).to be_a ScheduledStatus - expect(status.scheduled_at).to eq future - expect(status.params['text']).to eq 'Hi future!' - end - - it 'does not immediately create a status' do + it 'schedules a status for future creation and does not create one immediately' do media = Fabricate(:media_attachment, account: account) status = subject.call(account, text: 'Hi future!', media_ids: [media.id], scheduled_at: future) - expect(status).to be_a ScheduledStatus - expect(status.scheduled_at).to eq future - expect(status.params['text']).to eq 'Hi future!' - expect(status.params['media_ids']).to eq [media.id] + expect(status) + .to be_a(ScheduledStatus) + .and have_attributes( + scheduled_at: eq(future), + params: include( + 'text' => eq('Hi future!'), + 'media_ids' => contain_exactly(media.id) + ) + ) expect(media.reload.status).to be_nil expect(Status.where(text: 'Hi future!')).to_not exist end - it 'does not change statuses count' do - expect { subject.call(account, text: 'Hi future!', scheduled_at: future, thread: previous_status) }.to_not(change { [account.statuses_count, previous_status.replies_count] }) + it 'does not change statuses_count of account or replies_count of thread previous status' do + expect { subject.call(account, text: 'Hi future!', scheduled_at: future, thread: previous_status) } + .to not_change { account.statuses_count } + .and(not_change { previous_status.replies_count }) end end From a9f9b0097bc18b87c7fe6636a74ea135bab61dc0 Mon Sep 17 00:00:00 2001 From: Matt Jankowski Date: Fri, 16 Feb 2024 02:52:57 -0500 Subject: [PATCH 124/211] Reduce `RSpec/MultipleExpectations` in captcha feature spec (#29226) --- spec/features/captcha_spec.rb | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/spec/features/captcha_spec.rb b/spec/features/captcha_spec.rb index 15c37eb463..06c823adf2 100644 --- a/spec/features/captcha_spec.rb +++ b/spec/features/captcha_spec.rb @@ -19,12 +19,10 @@ describe 'email confirmation flow when captcha is enabled' do # It presents the user with a captcha form expect(page).to have_title(I18n.t('auth.captcha_confirmation.title')) - # It does not confirm the user just yet - expect(user.reload.confirmed?).to be false - # It redirects to app and confirms user - click_on I18n.t('challenge.confirm') - expect(user.reload.confirmed?).to be true + expect { click_on I18n.t('challenge.confirm') } + .to change { user.reload.confirmed? }.from(false).to(true) + expect(page).to have_current_path(/\A#{client_app.confirmation_redirect_uri}/, url: true) # Browsers will generally reload the original page upon redirection @@ -32,8 +30,9 @@ describe 'email confirmation flow when captcha is enabled' do visit "/auth/confirmation?confirmation_token=#{user.confirmation_token}&redirect_to_app=true" # It presents a page with a link to the app callback - expect(page).to have_content(I18n.t('auth.confirmations.registration_complete', domain: 'cb6e6126.ngrok.io')) - expect(page).to have_link(I18n.t('auth.confirmations.clicking_this_link'), href: client_app.confirmation_redirect_uri) + expect(page) + .to have_content(I18n.t('auth.confirmations.registration_complete', domain: 'cb6e6126.ngrok.io')) + .and have_link(I18n.t('auth.confirmations.clicking_this_link'), href: client_app.confirmation_redirect_uri) end end From a8ee6fdd62a85cc8ad20007783000682110a8f0d Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Fri, 16 Feb 2024 09:12:10 +0100 Subject: [PATCH 125/211] Update dependency pg to v1.5.5 (#29230) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- Gemfile.lock | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Gemfile.lock b/Gemfile.lock index 00ca4663a8..0b53df82e0 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -505,7 +505,7 @@ GEM parslet (2.0.0) pastel (0.8.0) tty-color (~> 0.5) - pg (1.5.4) + pg (1.5.5) pghero (3.4.1) activerecord (>= 6) posix-spawn (0.3.15) From 9fee5e852669e26f970e278021302e1a203fc022 Mon Sep 17 00:00:00 2001 From: Claire Date: Fri, 16 Feb 2024 11:56:12 +0100 Subject: [PATCH 126/211] Merge pull request from GHSA-jhrq-qvrm-qr36 * Fix insufficient Content-Type checking of fetched ActivityStreams objects * Allow JSON-LD documents with multiple profiles --- app/helpers/jsonld_helper.rb | 14 +++++++++++++- app/services/fetch_resource_service.rb | 2 +- spec/helpers/json_ld_helper_spec.rb | 14 +++++++------- spec/lib/activitypub/activity/announce_spec.rb | 4 ++-- .../fetch_featured_collection_service_spec.rb | 18 +++++++++--------- ...ch_featured_tags_collection_service_spec.rb | 8 ++++---- .../fetch_remote_account_service_spec.rb | 10 +++++----- .../fetch_remote_actor_service_spec.rb | 10 +++++----- .../fetch_remote_key_service_spec.rb | 8 ++++---- .../activitypub/fetch_replies_service_spec.rb | 6 +++--- .../synchronize_followers_service_spec.rb | 6 +++--- .../activitypub/fetch_replies_worker_spec.rb | 2 +- 12 files changed, 57 insertions(+), 45 deletions(-) diff --git a/app/helpers/jsonld_helper.rb b/app/helpers/jsonld_helper.rb index cc05b7a403..b0f2077db0 100644 --- a/app/helpers/jsonld_helper.rb +++ b/app/helpers/jsonld_helper.rb @@ -174,7 +174,19 @@ module JsonLdHelper build_request(uri, on_behalf_of, options: request_options).perform do |response| raise Mastodon::UnexpectedResponseError, response unless response_successful?(response) || response_error_unsalvageable?(response) || !raise_on_temporary_error - body_to_json(response.body_with_limit) if response.code == 200 + body_to_json(response.body_with_limit) if response.code == 200 && valid_activitypub_content_type?(response) + end + end + + def valid_activitypub_content_type?(response) + return true if response.mime_type == 'application/activity+json' + + # When the mime type is `application/ld+json`, we need to check the profile, + # but `http.rb` does not parse it for us. + return false unless response.mime_type == 'application/ld+json' + + response.headers[HTTP::Headers::CONTENT_TYPE]&.split(';')&.map(&:strip)&.any? do |str| + str.start_with?('profile="') && str[9...-1].split.include?('https://www.w3.org/ns/activitystreams') end end diff --git a/app/services/fetch_resource_service.rb b/app/services/fetch_resource_service.rb index 71c6cca790..84c36f6a10 100644 --- a/app/services/fetch_resource_service.rb +++ b/app/services/fetch_resource_service.rb @@ -44,7 +44,7 @@ class FetchResourceService < BaseService @response_code = response.code return nil if response.code != 200 - if ['application/activity+json', 'application/ld+json'].include?(response.mime_type) + if valid_activitypub_content_type?(response) body = response.body_with_limit json = body_to_json(body) diff --git a/spec/helpers/json_ld_helper_spec.rb b/spec/helpers/json_ld_helper_spec.rb index 99857278a1..4855085027 100644 --- a/spec/helpers/json_ld_helper_spec.rb +++ b/spec/helpers/json_ld_helper_spec.rb @@ -56,15 +56,15 @@ describe JsonLdHelper do describe '#fetch_resource' do context 'when the second argument is false' do it 'returns resource even if the retrieved ID and the given URI does not match' do - stub_request(:get, 'https://bob.test/').to_return body: '{"id": "https://alice.test/"}' - stub_request(:get, 'https://alice.test/').to_return body: '{"id": "https://alice.test/"}' + stub_request(:get, 'https://bob.test/').to_return(body: '{"id": "https://alice.test/"}', headers: { 'Content-Type': 'application/activity+json' }) + stub_request(:get, 'https://alice.test/').to_return(body: '{"id": "https://alice.test/"}', headers: { 'Content-Type': 'application/activity+json' }) expect(fetch_resource('https://bob.test/', false)).to eq({ 'id' => 'https://alice.test/' }) end it 'returns nil if the object identified by the given URI and the object identified by the retrieved ID does not match' do - stub_request(:get, 'https://mallory.test/').to_return body: '{"id": "https://marvin.test/"}' - stub_request(:get, 'https://marvin.test/').to_return body: '{"id": "https://alice.test/"}' + stub_request(:get, 'https://mallory.test/').to_return(body: '{"id": "https://marvin.test/"}', headers: { 'Content-Type': 'application/activity+json' }) + stub_request(:get, 'https://marvin.test/').to_return(body: '{"id": "https://alice.test/"}', headers: { 'Content-Type': 'application/activity+json' }) expect(fetch_resource('https://mallory.test/', false)).to be_nil end @@ -72,7 +72,7 @@ describe JsonLdHelper do context 'when the second argument is true' do it 'returns nil if the retrieved ID and the given URI does not match' do - stub_request(:get, 'https://mallory.test/').to_return body: '{"id": "https://alice.test/"}' + stub_request(:get, 'https://mallory.test/').to_return(body: '{"id": "https://alice.test/"}', headers: { 'Content-Type': 'application/activity+json' }) expect(fetch_resource('https://mallory.test/', true)).to be_nil end end @@ -80,12 +80,12 @@ describe JsonLdHelper do describe '#fetch_resource_without_id_validation' do it 'returns nil if the status code is not 200' do - stub_request(:get, 'https://host.test/').to_return status: 400, body: '{}' + stub_request(:get, 'https://host.test/').to_return(status: 400, body: '{}', headers: { 'Content-Type': 'application/activity+json' }) expect(fetch_resource_without_id_validation('https://host.test/')).to be_nil end it 'returns hash' do - stub_request(:get, 'https://host.test/').to_return status: 200, body: '{}' + stub_request(:get, 'https://host.test/').to_return(status: 200, body: '{}', headers: { 'Content-Type': 'application/activity+json' }) expect(fetch_resource_without_id_validation('https://host.test/')).to eq({}) end end diff --git a/spec/lib/activitypub/activity/announce_spec.rb b/spec/lib/activitypub/activity/announce_spec.rb index 8ad892975d..b556bfd6c2 100644 --- a/spec/lib/activitypub/activity/announce_spec.rb +++ b/spec/lib/activitypub/activity/announce_spec.rb @@ -35,7 +35,7 @@ RSpec.describe ActivityPub::Activity::Announce do context 'when sender is followed by a local account' do before do Fabricate(:account).follow!(sender) - stub_request(:get, 'https://example.com/actor/hello-world').to_return(body: Oj.dump(unknown_object_json)) + stub_request(:get, 'https://example.com/actor/hello-world').to_return(body: Oj.dump(unknown_object_json), headers: { 'Content-Type': 'application/activity+json' }) subject.perform end @@ -120,7 +120,7 @@ RSpec.describe ActivityPub::Activity::Announce do let(:object_json) { 'https://example.com/actor/hello-world' } before do - stub_request(:get, 'https://example.com/actor/hello-world').to_return(body: Oj.dump(unknown_object_json)) + stub_request(:get, 'https://example.com/actor/hello-world').to_return(body: Oj.dump(unknown_object_json), headers: { 'Content-Type': 'application/activity+json' }) end context 'when the relay is enabled' do diff --git a/spec/services/activitypub/fetch_featured_collection_service_spec.rb b/spec/services/activitypub/fetch_featured_collection_service_spec.rb index b9e95b825f..dab204406b 100644 --- a/spec/services/activitypub/fetch_featured_collection_service_spec.rb +++ b/spec/services/activitypub/fetch_featured_collection_service_spec.rb @@ -72,11 +72,11 @@ RSpec.describe ActivityPub::FetchFeaturedCollectionService, type: :service do shared_examples 'sets pinned posts' do before do - stub_request(:get, 'https://example.com/account/pinned/known').to_return(status: 200, body: Oj.dump(status_json_pinned_known)) - stub_request(:get, 'https://example.com/account/pinned/unknown-inlined').to_return(status: 200, body: Oj.dump(status_json_pinned_unknown_inlined)) + stub_request(:get, 'https://example.com/account/pinned/known').to_return(status: 200, body: Oj.dump(status_json_pinned_known), headers: { 'Content-Type': 'application/activity+json' }) + stub_request(:get, 'https://example.com/account/pinned/unknown-inlined').to_return(status: 200, body: Oj.dump(status_json_pinned_unknown_inlined), headers: { 'Content-Type': 'application/activity+json' }) stub_request(:get, 'https://example.com/account/pinned/unknown-unreachable').to_return(status: 404) - stub_request(:get, 'https://example.com/account/pinned/unknown-reachable').to_return(status: 200, body: Oj.dump(status_json_pinned_unknown_reachable)) - stub_request(:get, 'https://example.com/account/collections/featured').to_return(status: 200, body: Oj.dump(featured_with_null)) + stub_request(:get, 'https://example.com/account/pinned/unknown-reachable').to_return(status: 200, body: Oj.dump(status_json_pinned_unknown_reachable), headers: { 'Content-Type': 'application/activity+json' }) + stub_request(:get, 'https://example.com/account/collections/featured').to_return(status: 200, body: Oj.dump(featured_with_null), headers: { 'Content-Type': 'application/activity+json' }) subject.call(actor, note: true, hashtag: false) end @@ -94,7 +94,7 @@ RSpec.describe ActivityPub::FetchFeaturedCollectionService, type: :service do describe '#call' do context 'when the endpoint is a Collection' do before do - stub_request(:get, actor.featured_collection_url).to_return(status: 200, body: Oj.dump(payload)) + stub_request(:get, actor.featured_collection_url).to_return(status: 200, body: Oj.dump(payload), headers: { 'Content-Type': 'application/activity+json' }) end it_behaves_like 'sets pinned posts' @@ -111,7 +111,7 @@ RSpec.describe ActivityPub::FetchFeaturedCollectionService, type: :service do end before do - stub_request(:get, actor.featured_collection_url).to_return(status: 200, body: Oj.dump(payload)) + stub_request(:get, actor.featured_collection_url).to_return(status: 200, body: Oj.dump(payload), headers: { 'Content-Type': 'application/activity+json' }) end it_behaves_like 'sets pinned posts' @@ -120,7 +120,7 @@ RSpec.describe ActivityPub::FetchFeaturedCollectionService, type: :service do let(:items) { 'https://example.com/account/pinned/unknown-reachable' } before do - stub_request(:get, 'https://example.com/account/pinned/unknown-reachable').to_return(status: 200, body: Oj.dump(status_json_pinned_unknown_reachable)) + stub_request(:get, 'https://example.com/account/pinned/unknown-reachable').to_return(status: 200, body: Oj.dump(status_json_pinned_unknown_reachable), headers: { 'Content-Type': 'application/activity+json' }) subject.call(actor, note: true, hashtag: false) end @@ -147,7 +147,7 @@ RSpec.describe ActivityPub::FetchFeaturedCollectionService, type: :service do end before do - stub_request(:get, actor.featured_collection_url).to_return(status: 200, body: Oj.dump(payload)) + stub_request(:get, actor.featured_collection_url).to_return(status: 200, body: Oj.dump(payload), headers: { 'Content-Type': 'application/activity+json' }) end it_behaves_like 'sets pinned posts' @@ -156,7 +156,7 @@ RSpec.describe ActivityPub::FetchFeaturedCollectionService, type: :service do let(:items) { 'https://example.com/account/pinned/unknown-reachable' } before do - stub_request(:get, 'https://example.com/account/pinned/unknown-reachable').to_return(status: 200, body: Oj.dump(status_json_pinned_unknown_reachable)) + stub_request(:get, 'https://example.com/account/pinned/unknown-reachable').to_return(status: 200, body: Oj.dump(status_json_pinned_unknown_reachable), headers: { 'Content-Type': 'application/activity+json' }) subject.call(actor, note: true, hashtag: false) end diff --git a/spec/services/activitypub/fetch_featured_tags_collection_service_spec.rb b/spec/services/activitypub/fetch_featured_tags_collection_service_spec.rb index 071e4d92d5..638278a10e 100644 --- a/spec/services/activitypub/fetch_featured_tags_collection_service_spec.rb +++ b/spec/services/activitypub/fetch_featured_tags_collection_service_spec.rb @@ -38,7 +38,7 @@ RSpec.describe ActivityPub::FetchFeaturedTagsCollectionService, type: :service d describe '#call' do context 'when the endpoint is a Collection' do before do - stub_request(:get, collection_url).to_return(status: 200, body: Oj.dump(payload)) + stub_request(:get, collection_url).to_return(status: 200, body: Oj.dump(payload), headers: { 'Content-Type': 'application/activity+json' }) end it_behaves_like 'sets featured tags' @@ -46,7 +46,7 @@ RSpec.describe ActivityPub::FetchFeaturedTagsCollectionService, type: :service d context 'when the account already has featured tags' do before do - stub_request(:get, collection_url).to_return(status: 200, body: Oj.dump(payload)) + stub_request(:get, collection_url).to_return(status: 200, body: Oj.dump(payload), headers: { 'Content-Type': 'application/activity+json' }) actor.featured_tags.create!(name: 'FoO') actor.featured_tags.create!(name: 'baz') @@ -67,7 +67,7 @@ RSpec.describe ActivityPub::FetchFeaturedTagsCollectionService, type: :service d end before do - stub_request(:get, collection_url).to_return(status: 200, body: Oj.dump(payload)) + stub_request(:get, collection_url).to_return(status: 200, body: Oj.dump(payload), headers: { 'Content-Type': 'application/activity+json' }) end it_behaves_like 'sets featured tags' @@ -88,7 +88,7 @@ RSpec.describe ActivityPub::FetchFeaturedTagsCollectionService, type: :service d end before do - stub_request(:get, collection_url).to_return(status: 200, body: Oj.dump(payload)) + stub_request(:get, collection_url).to_return(status: 200, body: Oj.dump(payload), headers: { 'Content-Type': 'application/activity+json' }) end it_behaves_like 'sets featured tags' diff --git a/spec/services/activitypub/fetch_remote_account_service_spec.rb b/spec/services/activitypub/fetch_remote_account_service_spec.rb index e7f6bb8dd8..799a70d091 100644 --- a/spec/services/activitypub/fetch_remote_account_service_spec.rb +++ b/spec/services/activitypub/fetch_remote_account_service_spec.rb @@ -38,7 +38,7 @@ RSpec.describe ActivityPub::FetchRemoteAccountService, type: :service do before do actor[:inbox] = nil - stub_request(:get, 'https://example.com/alice').to_return(body: Oj.dump(actor)) + stub_request(:get, 'https://example.com/alice').to_return(body: Oj.dump(actor), headers: { 'Content-Type': 'application/activity+json' }) stub_request(:get, 'https://example.com/.well-known/webfinger?resource=acct:alice@example.com').to_return(body: Oj.dump(webfinger), headers: { 'Content-Type': 'application/jrd+json' }) end @@ -54,7 +54,7 @@ RSpec.describe ActivityPub::FetchRemoteAccountService, type: :service do let!(:webfinger) { { subject: 'acct:alice@example.com', links: [{ rel: 'self', href: 'https://example.com/alice' }] } } before do - stub_request(:get, 'https://example.com/alice').to_return(body: Oj.dump(actor)) + stub_request(:get, 'https://example.com/alice').to_return(body: Oj.dump(actor), headers: { 'Content-Type': 'application/activity+json' }) stub_request(:get, 'https://example.com/.well-known/webfinger?resource=acct:alice@example.com').to_return(body: Oj.dump(webfinger), headers: { 'Content-Type': 'application/jrd+json' }) end @@ -75,7 +75,7 @@ RSpec.describe ActivityPub::FetchRemoteAccountService, type: :service do let!(:webfinger) { { subject: 'acct:alice@iscool.af', links: [{ rel: 'self', href: 'https://example.com/alice' }] } } before do - stub_request(:get, 'https://example.com/alice').to_return(body: Oj.dump(actor)) + stub_request(:get, 'https://example.com/alice').to_return(body: Oj.dump(actor), headers: { 'Content-Type': 'application/activity+json' }) stub_request(:get, 'https://example.com/.well-known/webfinger?resource=acct:alice@example.com').to_return(body: Oj.dump(webfinger), headers: { 'Content-Type': 'application/jrd+json' }) stub_request(:get, 'https://iscool.af/.well-known/webfinger?resource=acct:alice@iscool.af').to_return(body: Oj.dump(webfinger), headers: { 'Content-Type': 'application/jrd+json' }) end @@ -98,7 +98,7 @@ RSpec.describe ActivityPub::FetchRemoteAccountService, type: :service do let!(:webfinger) { { subject: 'acct:alice@example.com', links: [{ rel: 'self', href: 'https://example.com/bob' }] } } before do - stub_request(:get, 'https://example.com/alice').to_return(body: Oj.dump(actor)) + stub_request(:get, 'https://example.com/alice').to_return(body: Oj.dump(actor), headers: { 'Content-Type': 'application/activity+json' }) stub_request(:get, 'https://example.com/.well-known/webfinger?resource=acct:alice@example.com').to_return(body: Oj.dump(webfinger), headers: { 'Content-Type': 'application/jrd+json' }) end @@ -114,7 +114,7 @@ RSpec.describe ActivityPub::FetchRemoteAccountService, type: :service do let!(:webfinger) { { subject: 'acct:alice@iscool.af', links: [{ rel: 'self', href: 'https://example.com/bob' }] } } before do - stub_request(:get, 'https://example.com/alice').to_return(body: Oj.dump(actor)) + stub_request(:get, 'https://example.com/alice').to_return(body: Oj.dump(actor), headers: { 'Content-Type': 'application/activity+json' }) stub_request(:get, 'https://example.com/.well-known/webfinger?resource=acct:alice@example.com').to_return(body: Oj.dump(webfinger), headers: { 'Content-Type': 'application/jrd+json' }) stub_request(:get, 'https://iscool.af/.well-known/webfinger?resource=acct:alice@iscool.af').to_return(body: Oj.dump(webfinger), headers: { 'Content-Type': 'application/jrd+json' }) end diff --git a/spec/services/activitypub/fetch_remote_actor_service_spec.rb b/spec/services/activitypub/fetch_remote_actor_service_spec.rb index e622c7d4c3..4ce42ea560 100644 --- a/spec/services/activitypub/fetch_remote_actor_service_spec.rb +++ b/spec/services/activitypub/fetch_remote_actor_service_spec.rb @@ -38,7 +38,7 @@ RSpec.describe ActivityPub::FetchRemoteActorService, type: :service do before do actor[:inbox] = nil - stub_request(:get, 'https://example.com/alice').to_return(body: Oj.dump(actor)) + stub_request(:get, 'https://example.com/alice').to_return(body: Oj.dump(actor), headers: { 'Content-Type': 'application/activity+json' }) stub_request(:get, 'https://example.com/.well-known/webfinger?resource=acct:alice@example.com').to_return(body: Oj.dump(webfinger), headers: { 'Content-Type': 'application/jrd+json' }) end @@ -54,7 +54,7 @@ RSpec.describe ActivityPub::FetchRemoteActorService, type: :service do let!(:webfinger) { { subject: 'acct:alice@example.com', links: [{ rel: 'self', href: 'https://example.com/alice' }] } } before do - stub_request(:get, 'https://example.com/alice').to_return(body: Oj.dump(actor)) + stub_request(:get, 'https://example.com/alice').to_return(body: Oj.dump(actor), headers: { 'Content-Type': 'application/activity+json' }) stub_request(:get, 'https://example.com/.well-known/webfinger?resource=acct:alice@example.com').to_return(body: Oj.dump(webfinger), headers: { 'Content-Type': 'application/jrd+json' }) end @@ -75,7 +75,7 @@ RSpec.describe ActivityPub::FetchRemoteActorService, type: :service do let!(:webfinger) { { subject: 'acct:alice@iscool.af', links: [{ rel: 'self', href: 'https://example.com/alice' }] } } before do - stub_request(:get, 'https://example.com/alice').to_return(body: Oj.dump(actor)) + stub_request(:get, 'https://example.com/alice').to_return(body: Oj.dump(actor), headers: { 'Content-Type': 'application/activity+json' }) stub_request(:get, 'https://example.com/.well-known/webfinger?resource=acct:alice@example.com').to_return(body: Oj.dump(webfinger), headers: { 'Content-Type': 'application/jrd+json' }) stub_request(:get, 'https://iscool.af/.well-known/webfinger?resource=acct:alice@iscool.af').to_return(body: Oj.dump(webfinger), headers: { 'Content-Type': 'application/jrd+json' }) end @@ -98,7 +98,7 @@ RSpec.describe ActivityPub::FetchRemoteActorService, type: :service do let!(:webfinger) { { subject: 'acct:alice@example.com', links: [{ rel: 'self', href: 'https://example.com/bob' }] } } before do - stub_request(:get, 'https://example.com/alice').to_return(body: Oj.dump(actor)) + stub_request(:get, 'https://example.com/alice').to_return(body: Oj.dump(actor), headers: { 'Content-Type': 'application/activity+json' }) stub_request(:get, 'https://example.com/.well-known/webfinger?resource=acct:alice@example.com').to_return(body: Oj.dump(webfinger), headers: { 'Content-Type': 'application/jrd+json' }) end @@ -114,7 +114,7 @@ RSpec.describe ActivityPub::FetchRemoteActorService, type: :service do let!(:webfinger) { { subject: 'acct:alice@iscool.af', links: [{ rel: 'self', href: 'https://example.com/bob' }] } } before do - stub_request(:get, 'https://example.com/alice').to_return(body: Oj.dump(actor)) + stub_request(:get, 'https://example.com/alice').to_return(body: Oj.dump(actor), headers: { 'Content-Type': 'application/activity+json' }) stub_request(:get, 'https://example.com/.well-known/webfinger?resource=acct:alice@example.com').to_return(body: Oj.dump(webfinger), headers: { 'Content-Type': 'application/jrd+json' }) stub_request(:get, 'https://iscool.af/.well-known/webfinger?resource=acct:alice@iscool.af').to_return(body: Oj.dump(webfinger), headers: { 'Content-Type': 'application/jrd+json' }) end diff --git a/spec/services/activitypub/fetch_remote_key_service_spec.rb b/spec/services/activitypub/fetch_remote_key_service_spec.rb index 0b14da4f44..478778cc9f 100644 --- a/spec/services/activitypub/fetch_remote_key_service_spec.rb +++ b/spec/services/activitypub/fetch_remote_key_service_spec.rb @@ -50,7 +50,7 @@ RSpec.describe ActivityPub::FetchRemoteKeyService, type: :service do end before do - stub_request(:get, 'https://example.com/alice').to_return(body: Oj.dump(actor)) + stub_request(:get, 'https://example.com/alice').to_return(body: Oj.dump(actor), headers: { 'Content-Type': 'application/activity+json' }) stub_request(:get, 'https://example.com/.well-known/webfinger?resource=acct:alice@example.com').to_return(body: Oj.dump(webfinger), headers: { 'Content-Type': 'application/jrd+json' }) end @@ -59,7 +59,7 @@ RSpec.describe ActivityPub::FetchRemoteKeyService, type: :service do context 'when the key is a sub-object from the actor' do before do - stub_request(:get, public_key_id).to_return(body: Oj.dump(actor)) + stub_request(:get, public_key_id).to_return(body: Oj.dump(actor), headers: { 'Content-Type': 'application/activity+json' }) end it 'returns the expected account' do @@ -71,7 +71,7 @@ RSpec.describe ActivityPub::FetchRemoteKeyService, type: :service do let(:public_key_id) { 'https://example.com/alice-public-key.json' } before do - stub_request(:get, public_key_id).to_return(body: Oj.dump(key_json.merge({ '@context': ['https://www.w3.org/ns/activitystreams', 'https://w3id.org/security/v1'] }))) + stub_request(:get, public_key_id).to_return(body: Oj.dump(key_json.merge({ '@context': ['https://www.w3.org/ns/activitystreams', 'https://w3id.org/security/v1'] })), headers: { 'Content-Type': 'application/activity+json' }) end it 'returns the expected account' do @@ -84,7 +84,7 @@ RSpec.describe ActivityPub::FetchRemoteKeyService, type: :service do let(:actor_public_key) { 'https://example.com/alice-public-key.json' } before do - stub_request(:get, public_key_id).to_return(body: Oj.dump(key_json.merge({ '@context': ['https://www.w3.org/ns/activitystreams', 'https://w3id.org/security/v1'] }))) + stub_request(:get, public_key_id).to_return(body: Oj.dump(key_json.merge({ '@context': ['https://www.w3.org/ns/activitystreams', 'https://w3id.org/security/v1'] })), headers: { 'Content-Type': 'application/activity+json' }) end it 'returns the nil' do diff --git a/spec/services/activitypub/fetch_replies_service_spec.rb b/spec/services/activitypub/fetch_replies_service_spec.rb index a76b996c20..8e1f606e26 100644 --- a/spec/services/activitypub/fetch_replies_service_spec.rb +++ b/spec/services/activitypub/fetch_replies_service_spec.rb @@ -58,7 +58,7 @@ RSpec.describe ActivityPub::FetchRepliesService, type: :service do context 'when passing the URL to the collection' do before do - stub_request(:get, collection_uri).to_return(status: 200, body: Oj.dump(payload)) + stub_request(:get, collection_uri).to_return(status: 200, body: Oj.dump(payload), headers: { 'Content-Type': 'application/activity+json' }) end it 'spawns workers for up to 5 replies on the same server' do @@ -93,7 +93,7 @@ RSpec.describe ActivityPub::FetchRepliesService, type: :service do context 'when passing the URL to the collection' do before do - stub_request(:get, collection_uri).to_return(status: 200, body: Oj.dump(payload)) + stub_request(:get, collection_uri).to_return(status: 200, body: Oj.dump(payload), headers: { 'Content-Type': 'application/activity+json' }) end it 'spawns workers for up to 5 replies on the same server' do @@ -132,7 +132,7 @@ RSpec.describe ActivityPub::FetchRepliesService, type: :service do context 'when passing the URL to the collection' do before do - stub_request(:get, collection_uri).to_return(status: 200, body: Oj.dump(payload)) + stub_request(:get, collection_uri).to_return(status: 200, body: Oj.dump(payload), headers: { 'Content-Type': 'application/activity+json' }) end it 'spawns workers for up to 5 replies on the same server' do diff --git a/spec/services/activitypub/synchronize_followers_service_spec.rb b/spec/services/activitypub/synchronize_followers_service_spec.rb index c9a513e24b..f62376ab95 100644 --- a/spec/services/activitypub/synchronize_followers_service_spec.rb +++ b/spec/services/activitypub/synchronize_followers_service_spec.rb @@ -60,7 +60,7 @@ RSpec.describe ActivityPub::SynchronizeFollowersService, type: :service do describe '#call' do context 'when the endpoint is a Collection of actor URIs' do before do - stub_request(:get, collection_uri).to_return(status: 200, body: Oj.dump(payload)) + stub_request(:get, collection_uri).to_return(status: 200, body: Oj.dump(payload), headers: { 'Content-Type': 'application/activity+json' }) end it_behaves_like 'synchronizes followers' @@ -77,7 +77,7 @@ RSpec.describe ActivityPub::SynchronizeFollowersService, type: :service do end before do - stub_request(:get, collection_uri).to_return(status: 200, body: Oj.dump(payload)) + stub_request(:get, collection_uri).to_return(status: 200, body: Oj.dump(payload), headers: { 'Content-Type': 'application/activity+json' }) end it_behaves_like 'synchronizes followers' @@ -98,7 +98,7 @@ RSpec.describe ActivityPub::SynchronizeFollowersService, type: :service do end before do - stub_request(:get, collection_uri).to_return(status: 200, body: Oj.dump(payload)) + stub_request(:get, collection_uri).to_return(status: 200, body: Oj.dump(payload), headers: { 'Content-Type': 'application/activity+json' }) end it_behaves_like 'synchronizes followers' diff --git a/spec/workers/activitypub/fetch_replies_worker_spec.rb b/spec/workers/activitypub/fetch_replies_worker_spec.rb index ff4d049a26..2d080e286e 100644 --- a/spec/workers/activitypub/fetch_replies_worker_spec.rb +++ b/spec/workers/activitypub/fetch_replies_worker_spec.rb @@ -21,7 +21,7 @@ describe ActivityPub::FetchRepliesWorker do describe 'perform' do it 'performs a request if the collection URI is from the same host' do - stub_request(:get, 'https://example.com/statuses_replies/1').to_return(status: 200, body: json) + stub_request(:get, 'https://example.com/statuses_replies/1').to_return(status: 200, body: json, headers: { 'Content-Type': 'application/activity+json' }) subject.perform(status.id, 'https://example.com/statuses_replies/1') expect(a_request(:get, 'https://example.com/statuses_replies/1')).to have_been_made.once end From 5f21a1f5a3492a212a25235086e620799d47f1c9 Mon Sep 17 00:00:00 2001 From: Claire Date: Fri, 16 Feb 2024 12:06:47 +0100 Subject: [PATCH 127/211] Bump version to v4.3.0-alpha.3 (#29241) --- CHANGELOG.md | 95 +++++++++++++++++++++++++++++++++++++++++ docker-compose.yml | 6 +-- lib/mastodon/version.rb | 2 +- 3 files changed, 99 insertions(+), 4 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 6f775fcfa8..a53790afaf 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,101 @@ All notable changes to this project will be documented in this file. +## [4.2.7] - 2024-02-16 + +### Fixed + +- Fix OmniAuth tests and edge cases in error handling ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/29201), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/29207)) +- Fix new installs by upgrading to the latest release of the `nsa` gem, instead of a no longer existing commit ([mjankowski](https://github.com/mastodon/mastodon/pull/29065)) + +### Security + +- Fix insufficient checking of remote posts ([GHSA-jhrq-qvrm-qr36](https://github.com/mastodon/mastodon/security/advisories/GHSA-jhrq-qvrm-qr36)) + +## [4.2.6] - 2024-02-14 + +### Security + +- Update the `sidekiq-unique-jobs` dependency (see [GHSA-cmh9-rx85-xj38](https://github.com/mhenrixon/sidekiq-unique-jobs/security/advisories/GHSA-cmh9-rx85-xj38)) + In addition, we have disabled the web interface for `sidekiq-unique-jobs` out of caution. + If you need it, you can re-enable it by setting `ENABLE_SIDEKIQ_UNIQUE_JOBS_UI=true`. + If you only need to clear all locks, you can now use `bundle exec rake sidekiq_unique_jobs:delete_all_locks`. +- Update the `nokogiri` dependency (see [GHSA-xc9x-jj77-9p9j](https://github.com/sparklemotion/nokogiri/security/advisories/GHSA-xc9x-jj77-9p9j)) +- Disable administrative Doorkeeper routes ([ThisIsMissEm](https://github.com/mastodon/mastodon/pull/29187)) +- Fix ongoing streaming sessions not being invalidated when applications get deleted in some cases ([GHSA-7w3c-p9j8-mq3x](https://github.com/mastodon/mastodon/security/advisories/GHSA-7w3c-p9j8-mq3x)) + In some rare cases, the streaming server was not notified of access tokens revocation on application deletion. +- Change external authentication behavior to never reattach a new identity to an existing user by default ([GHSA-vm39-j3vx-pch3](https://github.com/mastodon/mastodon/security/advisories/GHSA-vm39-j3vx-pch3)) + Up until now, Mastodon has allowed new identities from external authentication providers to attach to an existing local user based on their verified e-mail address. + This allowed upgrading users from a database-stored password to an external authentication provider, or move from one authentication provider to another. + However, this behavior may be unexpected, and means that when multiple authentication providers are configured, the overall security would be that of the least secure authentication provider. + For these reasons, this behavior is now locked under the `ALLOW_UNSAFE_AUTH_PROVIDER_REATTACH` environment variable. + In addition, regardless of this environment variable, Mastodon will refuse to attach two identities from the same authentication provider to the same account. + +## [4.2.5] - 2024-02-01 + +### Security + +- Fix insufficient origin validation (CVE-2024-23832, [GHSA-3fjr-858r-92rw](https://github.com/mastodon/mastodon/security/advisories/GHSA-3fjr-858r-92rw)) + +## [4.2.4] - 2024-01-24 + +### Fixed + +- Fix error when processing remote files with unusually long names ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/28823)) +- Fix processing of compacted single-item JSON-LD collections ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/28816)) +- Retry 401 errors on replies fetching ([ShadowJonathan](https://github.com/mastodon/mastodon/pull/28788)) +- Fix `RecordNotUnique` errors in LinkCrawlWorker ([tribela](https://github.com/mastodon/mastodon/pull/28748)) +- Fix Mastodon not correctly processing HTTP Signatures with query strings ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/28443), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/28476)) +- Fix potential redirection loop of streaming endpoint ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/28665)) +- Fix streaming API redirection ignoring the port of `streaming_api_base_url` ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/28558)) +- Fix error when processing link preview with an array as `inLanguage` ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/28252)) +- Fix unsupported time zone or locale preventing sign-up ([Gargron](https://github.com/mastodon/mastodon/pull/28035)) +- Fix "Hide these posts from home" list setting not refreshing when switching lists ([brianholley](https://github.com/mastodon/mastodon/pull/27763)) +- Fix missing background behind dismissable banner in web UI ([Gargron](https://github.com/mastodon/mastodon/pull/27479)) +- Fix line wrapping of language selection button with long locale codes ([gunchleoc](https://github.com/mastodon/mastodon/pull/27100), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/27127)) +- Fix `Undo Announce` activity not being sent to non-follower authors ([MitarashiDango](https://github.com/mastodon/mastodon/pull/18482)) +- Fix N+1s because of association preloaders not actually getting called ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/28339)) +- Fix empty column explainer getting cropped under certain conditions ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/28337)) +- Fix `LinkCrawlWorker` error when encountering empty OEmbed response ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/28268)) +- Fix call to inefficient `delete_matched` cache method in domain blocks ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/28367)) + +### Security + +- Add rate-limit of TOTP authentication attempts at controller level ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/28801)) + +## [4.2.3] - 2023-12-05 + +### Fixed + +- Fix dependency on `json-canonicalization` version that has been made unavailable since last release + +## [4.2.2] - 2023-12-04 + +### Changed + +- Change dismissed banners to be stored server-side ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/27055)) +- Change GIF max matrix size error to explicitly mention GIF files ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/27927)) +- Change `Follow` activities delivery to bypass availability check ([ShadowJonathan](https://github.com/mastodon/mastodon/pull/27586)) +- Change single-column navigation notice to be displayed outside of the logo container ([renchap](https://github.com/mastodon/mastodon/pull/27462), [renchap](https://github.com/mastodon/mastodon/pull/27476)) +- Change Content-Security-Policy to be tighter on media paths ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/26889)) +- Change post language code to include country code when relevant ([gunchleoc](https://github.com/mastodon/mastodon/pull/27099), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/27207)) + +### Fixed + +- Fix upper border radius of onboarding columns ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/27890)) +- Fix incoming status creation date not being restricted to standard ISO8601 ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/27655), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/28081)) +- Fix some posts from threads received out-of-order sometimes not being inserted into timelines ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/27653)) +- Fix posts from force-sensitized accounts being able to trend ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/27620)) +- Fix error when trying to delete already-deleted file with OpenStack Swift ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/27569)) +- Fix batch attachment deletion when using OpenStack Swift ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/27554)) +- Fix processing LDSigned activities from actors with unknown public keys ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/27474)) +- Fix error and incorrect URLs in `/api/v1/accounts/:id/featured_tags` for remote accounts ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/27459)) +- Fix report processing notice not mentioning the report number when performing a custom action ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/27442)) +- Fix handling of `inLanguage` attribute in preview card processing ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/27423)) +- Fix own posts being removed from home timeline when unfollowing a used hashtag ([kmycode](https://github.com/mastodon/mastodon/pull/27391)) +- Fix some link anchors being recognized as hashtags ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/27271), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/27584)) +- Fix format-dependent redirects being cached regardless of requested format ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/27634)) + ## [4.2.1] - 2023-10-10 ### Added diff --git a/docker-compose.yml b/docker-compose.yml index 93451d9611..154754d45f 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -56,7 +56,7 @@ services: web: build: . - image: ghcr.io/mastodon/mastodon:v4.2.0 + image: ghcr.io/mastodon/mastodon:v4.2.7 restart: always env_file: .env.production command: bundle exec puma -C config/puma.rb @@ -77,7 +77,7 @@ services: streaming: build: . - image: ghcr.io/mastodon/mastodon:v4.2.0 + image: ghcr.io/mastodon/mastodon:v4.2.7 restart: always env_file: .env.production command: node ./streaming @@ -95,7 +95,7 @@ services: sidekiq: build: . - image: ghcr.io/mastodon/mastodon:v4.2.0 + image: ghcr.io/mastodon/mastodon:v4.2.7 restart: always env_file: .env.production command: bundle exec sidekiq diff --git a/lib/mastodon/version.rb b/lib/mastodon/version.rb index c2f26aee63..1135ba0a17 100644 --- a/lib/mastodon/version.rb +++ b/lib/mastodon/version.rb @@ -17,7 +17,7 @@ module Mastodon end def default_prerelease - 'alpha.2' + 'alpha.3' end def prerelease From e140d05a6a6d679153fe02ac38588aaa4656e464 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Fri, 16 Feb 2024 13:59:51 +0100 Subject: [PATCH 128/211] Update dependency doorkeeper to v5.6.9 (#29196) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- Gemfile.lock | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Gemfile.lock b/Gemfile.lock index 0b53df82e0..79d3b1e637 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -219,7 +219,7 @@ GEM docile (1.4.0) domain_name (0.5.20190701) unf (>= 0.0.5, < 1.0.0) - doorkeeper (5.6.8) + doorkeeper (5.6.9) railties (>= 5) dotenv (2.8.1) dotenv-rails (2.8.1) @@ -811,7 +811,7 @@ GEM xorcist (1.1.3) xpath (3.2.0) nokogiri (~> 1.8) - zeitwerk (2.6.12) + zeitwerk (2.6.13) PLATFORMS ruby From bba488c189084d8499173c3e65dcce8e40a5606a Mon Sep 17 00:00:00 2001 From: Matt Jankowski Date: Fri, 16 Feb 2024 08:00:09 -0500 Subject: [PATCH 129/211] Reduce `RSpec/MultipleExpectations` in media_attachment spec (#29228) --- spec/models/media_attachment_spec.rb | 51 ++++++++++++++-------------- 1 file changed, 26 insertions(+), 25 deletions(-) diff --git a/spec/models/media_attachment_spec.rb b/spec/models/media_attachment_spec.rb index 89916f9f50..1b9a13c38c 100644 --- a/spec/models/media_attachment_spec.rb +++ b/spec/models/media_attachment_spec.rb @@ -91,20 +91,15 @@ RSpec.describe MediaAttachment, :paperclip_processing do end it 'saves media attachment with correct file metadata' do - expect(media.persisted?).to be true - expect(media.file).to_not be_nil - - # completes processing - expect(media.processing_complete?).to be true - - # sets type - expect(media.type).to eq 'image' - - # sets content type - expect(media.file_content_type).to eq content_type - - # sets file extension - expect(media.file_file_name).to end_with extension + expect(media) + .to be_persisted + .and be_processing_complete + .and have_attributes( + file: be_present, + type: eq('image'), + file_content_type: eq(content_type), + file_file_name: end_with(extension) + ) # Rack::Mime (used by PublicFileServerMiddleware) recognizes file extension expect(Rack::Mime.mime_type(extension, nil)).to eq content_type @@ -112,17 +107,23 @@ RSpec.describe MediaAttachment, :paperclip_processing do it 'saves media attachment with correct size metadata' do # strips original file name - expect(media.file_file_name).to_not start_with '600x400' - - # sets meta for original - expect(media.file.meta['original']['width']).to eq 600 - expect(media.file.meta['original']['height']).to eq 400 - expect(media.file.meta['original']['aspect']).to eq 1.5 - - # sets meta for thumbnail - expect(media.file.meta['small']['width']).to eq 588 - expect(media.file.meta['small']['height']).to eq 392 - expect(media.file.meta['small']['aspect']).to eq 1.5 + expect(media.file_file_name) + .to_not start_with '600x400' + + # sets meta for original and thumbnail + expect(media.file.meta.deep_symbolize_keys) + .to include( + original: include( + width: eq(600), + height: eq(400), + aspect: eq(1.5) + ), + small: include( + width: eq(588), + height: eq(392), + aspect: eq(1.5) + ) + ) end end From 1690fb39e6e4a26cc5f708626920d3491d7dd95b Mon Sep 17 00:00:00 2001 From: Matt Jankowski Date: Fri, 16 Feb 2024 08:00:11 -0500 Subject: [PATCH 130/211] Reduce `RSpec/MultipleExpectations` in instance_actors_controller spec (#29229) --- .../instance_actors_controller_spec.rb | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/spec/controllers/instance_actors_controller_spec.rb b/spec/controllers/instance_actors_controller_spec.rb index 36b9049fbc..be1eefa7b2 100644 --- a/spec/controllers/instance_actors_controller_spec.rb +++ b/spec/controllers/instance_actors_controller_spec.rb @@ -13,17 +13,19 @@ RSpec.describe InstanceActorsController do end it 'returns http success with correct media type, headers, and session values' do - expect(response).to have_http_status(200) + expect(response) + .to have_http_status(200) + .and have_attributes( + media_type: eq('application/activity+json'), + cookies: be_empty + ) - expect(response.media_type).to eq 'application/activity+json' - - expect(response.cookies).to be_empty - expect(response.headers['Set-Cookies']).to be_nil + expect(response.headers) + .to include('Cache-Control' => include('public')) + .and not_include('Set-Cookies') expect(session).to be_empty - expect(response.headers['Cache-Control']).to include 'public' - expect(body_as_json) .to include(:id, :type, :preferredUsername, :inbox, :publicKey, :inbox, :outbox, :url) end From 117b507df59b2f302c278797a0ea312aee68d570 Mon Sep 17 00:00:00 2001 From: Matt Jankowski Date: Fri, 16 Feb 2024 08:01:04 -0500 Subject: [PATCH 131/211] Extract `subject` from `User#mark_email_as_confirmed!` spec (#29231) --- spec/models/user_spec.rb | 25 +++++++++++-------------- 1 file changed, 11 insertions(+), 14 deletions(-) diff --git a/spec/models/user_spec.rb b/spec/models/user_spec.rb index 845335e873..1baa3ccbf9 100644 --- a/spec/models/user_spec.rb +++ b/spec/models/user_spec.rb @@ -451,35 +451,32 @@ RSpec.describe User do end describe '#mark_email_as_confirmed!' do - subject(:user) { Fabricate(:user, confirmed_at: confirmed_at) } + subject { user.mark_email_as_confirmed! } - before do - ActionMailer::Base.deliveries.clear - user.mark_email_as_confirmed! - end + let!(:user) { Fabricate(:user, confirmed_at: confirmed_at) } + + before { ActionMailer::Base.deliveries.clear } after { ActionMailer::Base.deliveries.clear } context 'when user is new' do let(:confirmed_at) { nil } - it 'confirms user' do - expect(user.confirmed_at).to be_present - end + it 'confirms user and delivers welcome email', :sidekiq_inline do + subject - it 'delivers mails', :sidekiq_inline do - expect(ActionMailer::Base.deliveries.count).to eq 2 + expect(user.confirmed_at).to be_present + expect(ActionMailer::Base.deliveries.count).to eq 1 end end context 'when user is not new' do let(:confirmed_at) { Time.zone.now } - it 'confirms user' do - expect(user.confirmed_at).to be_present - end + it 'confirms user but does not deliver welcome email' do + subject - it 'does not deliver mail' do + expect(user.confirmed_at).to be_present expect(ActionMailer::Base.deliveries.count).to eq 0 end end From a316c0e38de9e0dd5853c1c7a1f8d8b7188fb253 Mon Sep 17 00:00:00 2001 From: Matt Jankowski Date: Fri, 16 Feb 2024 08:01:15 -0500 Subject: [PATCH 132/211] Reduce round trips in disputes/appeals spec (#29232) --- .../disputes/appeals_controller_spec.rb | 22 +++++++------------ 1 file changed, 8 insertions(+), 14 deletions(-) diff --git a/spec/controllers/disputes/appeals_controller_spec.rb b/spec/controllers/disputes/appeals_controller_spec.rb index da2f86ade5..d763068ebe 100644 --- a/spec/controllers/disputes/appeals_controller_spec.rb +++ b/spec/controllers/disputes/appeals_controller_spec.rb @@ -10,19 +10,17 @@ RSpec.describe Disputes::AppealsController do let!(:admin) { Fabricate(:user, role: UserRole.find_by(name: 'Admin')) } describe '#create' do + subject { post :create, params: params } + context 'with valid params' do let(:current_user) { Fabricate(:user) } let(:strike) { Fabricate(:account_warning, target_account: current_user.account) } + let(:params) { { strike_id: strike.id, appeal: { text: 'Foo' } } } - before do - post :create, params: { strike_id: strike.id, appeal: { text: 'Foo' } } - end + it 'notifies staff about new appeal and redirects back to strike page', :sidekiq_inline do + subject - it 'notifies staff about new appeal', :sidekiq_inline do expect(ActionMailer::Base.deliveries.first.to).to eq([admin.email]) - end - - it 'redirects back to the strike page' do expect(response).to redirect_to(disputes_strike_path(strike.id)) end end @@ -30,16 +28,12 @@ RSpec.describe Disputes::AppealsController do context 'with invalid params' do let(:current_user) { Fabricate(:user) } let(:strike) { Fabricate(:account_warning, target_account: current_user.account) } + let(:params) { { strike_id: strike.id, appeal: { text: '' } } } - before do - post :create, params: { strike_id: strike.id, appeal: { text: '' } } - end + it 'does not send email and renders strike show page', :sidekiq_inline do + subject - it 'does not send email', :sidekiq_inline do expect(ActionMailer::Base.deliveries.size).to eq(0) - end - - it 'renders the strike show page' do expect(response).to render_template('disputes/strikes/show') end end From 3454fcbd719f3f28b1466fd65c42c14d394212c0 Mon Sep 17 00:00:00 2001 From: Matt Jankowski Date: Fri, 16 Feb 2024 08:38:49 -0500 Subject: [PATCH 133/211] Reduce round trips in auth/sessions spec (#29233) --- .../auth/sessions_controller_spec.rb | 80 ++++++------------- 1 file changed, 25 insertions(+), 55 deletions(-) diff --git a/spec/controllers/auth/sessions_controller_spec.rb b/spec/controllers/auth/sessions_controller_spec.rb index b663f55afa..dcbaf1fcbb 100644 --- a/spec/controllers/auth/sessions_controller_spec.rb +++ b/spec/controllers/auth/sessions_controller_spec.rb @@ -57,11 +57,9 @@ RSpec.describe Auth::SessionsController do post :create, params: { user: { email: 'pam_user1', password: '123456' } } end - it 'redirects to home' do + it 'redirects to home and logs the user in' do expect(response).to redirect_to(root_path) - end - it 'logs the user in' do expect(controller.current_user).to be_instance_of(User) end end @@ -71,11 +69,9 @@ RSpec.describe Auth::SessionsController do post :create, params: { user: { email: 'pam_user1', password: 'WRONGPW' } } end - it 'shows a login error' do + it 'shows a login error and does not log the user in' do expect(flash[:alert]).to match I18n.t('devise.failure.invalid', authentication_keys: I18n.t('activerecord.attributes.user.email')) - end - it "doesn't log the user in" do expect(controller.current_user).to be_nil end end @@ -92,11 +88,9 @@ RSpec.describe Auth::SessionsController do post :create, params: { user: { email: user.email, password: '123456' } } end - it 'redirects to home' do + it 'redirects to home and logs the user in' do expect(response).to redirect_to(root_path) - end - it 'logs the user in' do expect(controller.current_user).to eq user end end @@ -110,16 +104,16 @@ RSpec.describe Auth::SessionsController do post :create, params: { user: { email: user.email, password: user.password } } end - it 'redirects to home' do + it 'redirects to home and logs the user in' do expect(response).to redirect_to(root_path) - end - it 'logs the user in' do expect(controller.current_user).to eq user end end context 'when using a valid password on a previously-used account with a new IP address' do + subject { post :create, params: { user: { email: user.email, password: user.password } } } + let(:previous_ip) { '1.2.3.4' } let(:current_ip) { '4.3.2.1' } @@ -127,18 +121,17 @@ RSpec.describe Auth::SessionsController do Fabricate(:login_activity, user: user, ip: previous_ip) allow(controller.request).to receive(:remote_ip).and_return(current_ip) user.update(current_sign_in_at: 1.month.ago) - post :create, params: { user: { email: user.email, password: user.password } } end - it 'redirects to home' do - expect(response).to redirect_to(root_path) - end + it 'logs the user in and sends suspicious email and redirects home', :sidekiq_inline do + subject - it 'logs the user in' do - expect(controller.current_user).to eq user - end + expect(response) + .to redirect_to(root_path) + + expect(controller.current_user) + .to eq user - it 'sends a suspicious sign-in mail', :sidekiq_inline do expect(UserMailer.deliveries.size).to eq(1) expect(UserMailer.deliveries.first.to.first).to eq(user.email) expect(UserMailer.deliveries.first.subject).to eq(I18n.t('user_mailer.suspicious_sign_in.subject')) @@ -150,11 +143,9 @@ RSpec.describe Auth::SessionsController do post :create, params: { user: { email: user.email.upcase, password: user.password } } end - it 'redirects to home' do + it 'redirects to home and logs the user in' do expect(response).to redirect_to(root_path) - end - it 'logs the user in' do expect(controller.current_user).to eq user end end @@ -164,11 +155,9 @@ RSpec.describe Auth::SessionsController do post :create, params: { user: { email: user.email, password: 'wrongpw' } } end - it 'shows a login error' do + it 'shows a login error and does not log the user in' do expect(flash[:alert]).to match I18n.t('devise.failure.invalid', authentication_keys: I18n.t('activerecord.attributes.user.email')) - end - it "doesn't log the user in" do expect(controller.current_user).to be_nil end end @@ -270,7 +259,7 @@ RSpec.describe Auth::SessionsController do travel_to '2023-12-20T10:00:00Z' end - it 'does not log the user in' do + it 'does not log the user in, sets a flash message, and sends a suspicious sign in email', :sidekiq_inline do Auth::SessionsController::MAX_2FA_ATTEMPTS_PER_HOUR.times do post :create, params: { user: { otp_attempt: '1234' } }, session: { attempt_user_id: user.id, attempt_user_updated_at: user.updated_at.to_s } expect(controller.current_user).to be_nil @@ -278,17 +267,10 @@ RSpec.describe Auth::SessionsController do post :create, params: { user: { otp_attempt: user.current_otp } }, session: { attempt_user_id: user.id, attempt_user_updated_at: user.updated_at.to_s } - expect(controller.current_user).to be_nil - expect(flash[:alert]).to match I18n.t('users.rate_limited') - end - - it 'sends a suspicious sign-in mail', :sidekiq_inline do - Auth::SessionsController::MAX_2FA_ATTEMPTS_PER_HOUR.times do - post :create, params: { user: { otp_attempt: '1234' } }, session: { attempt_user_id: user.id, attempt_user_updated_at: user.updated_at.to_s } - expect(controller.current_user).to be_nil - end - - post :create, params: { user: { otp_attempt: user.current_otp } }, session: { attempt_user_id: user.id, attempt_user_updated_at: user.updated_at.to_s } + expect(controller.current_user) + .to be_nil + expect(flash[:alert]) + .to match I18n.t('users.rate_limited') expect(UserMailer.deliveries.size).to eq(1) expect(UserMailer.deliveries.first.to.first).to eq(user.email) @@ -301,11 +283,9 @@ RSpec.describe Auth::SessionsController do post :create, params: { user: { otp_attempt: user.current_otp } }, session: { attempt_user_id: user.id, attempt_user_updated_at: user.updated_at.to_s } end - it 'redirects to home' do + it 'redirects to home and logs the user in' do expect(response).to redirect_to(root_path) - end - it 'logs the user in' do expect(controller.current_user).to eq user end end @@ -318,11 +298,9 @@ RSpec.describe Auth::SessionsController do post :create, params: { user: { otp_attempt: user.current_otp } }, session: { attempt_user_id: user.id, attempt_user_updated_at: user.updated_at.to_s } end - it 'shows a login error' do + it 'shows a login error and does not log the user in' do expect(flash[:alert]).to match I18n.t('users.invalid_otp_token') - end - it "doesn't log the user in" do expect(controller.current_user).to be_nil end end @@ -332,11 +310,9 @@ RSpec.describe Auth::SessionsController do post :create, params: { user: { otp_attempt: recovery_codes.first } }, session: { attempt_user_id: user.id, attempt_user_updated_at: user.updated_at.to_s } end - it 'redirects to home' do + it 'redirects to home and logs the user in' do expect(response).to redirect_to(root_path) - end - it 'logs the user in' do expect(controller.current_user).to eq user end end @@ -346,11 +322,9 @@ RSpec.describe Auth::SessionsController do post :create, params: { user: { otp_attempt: 'wrongotp' } }, session: { attempt_user_id: user.id, attempt_user_updated_at: user.updated_at.to_s } end - it 'shows a login error' do + it 'shows a login error and does not log the user in' do expect(flash[:alert]).to match I18n.t('users.invalid_otp_token') - end - it "doesn't log the user in" do expect(controller.current_user).to be_nil end end @@ -417,15 +391,11 @@ RSpec.describe Auth::SessionsController do post :create, params: { user: { credential: fake_credential } }, session: { attempt_user_id: user.id, attempt_user_updated_at: user.updated_at.to_s } end - it 'instructs the browser to redirect to home' do + it 'instructs the browser to redirect to home, logs the user in, and updates the sign count' do expect(body_as_json[:redirect_path]).to eq(root_path) - end - it 'logs the user in' do expect(controller.current_user).to eq user - end - it 'updates the sign count' do expect(webauthn_credential.reload.sign_count).to eq(sign_count) end end From 1946e171e6d150cecedf3949c3c4630d5bce1066 Mon Sep 17 00:00:00 2001 From: Matt Jankowski Date: Fri, 16 Feb 2024 08:46:28 -0500 Subject: [PATCH 134/211] Reduce round trips in admin/disputes/appeals spec (#29234) --- .../admin/disputes/appeals_controller_spec.rb | 31 +++++++++---------- 1 file changed, 14 insertions(+), 17 deletions(-) diff --git a/spec/controllers/admin/disputes/appeals_controller_spec.rb b/spec/controllers/admin/disputes/appeals_controller_spec.rb index f830c3b95c..d365233167 100644 --- a/spec/controllers/admin/disputes/appeals_controller_spec.rb +++ b/spec/controllers/admin/disputes/appeals_controller_spec.rb @@ -30,21 +30,19 @@ RSpec.describe Admin::Disputes::AppealsController do end describe 'POST #approve' do + subject { post :approve, params: { id: appeal.id } } + let(:current_user) { Fabricate(:user, role: UserRole.find_by(name: 'Admin')) } - before do - post :approve, params: { id: appeal.id } - end + it 'redirects back to the strike page and notifies target account about approved appeal', :sidekiq_inline do + subject - it 'unsuspends a suspended account' do - expect(target_account.reload.suspended?).to be false - end + expect(response) + .to redirect_to(disputes_strike_path(appeal.strike)) - it 'redirects back to the strike page' do - expect(response).to redirect_to(disputes_strike_path(appeal.strike)) - end + expect(target_account.reload) + .to_not be_suspended - it 'notifies target account about approved appeal', :sidekiq_inline do expect(UserMailer.deliveries.size).to eq(1) expect(UserMailer.deliveries.first.to.first).to eq(target_account.user.email) expect(UserMailer.deliveries.first.subject).to eq(I18n.t('user_mailer.appeal_approved.subject', date: I18n.l(appeal.created_at))) @@ -52,17 +50,16 @@ RSpec.describe Admin::Disputes::AppealsController do end describe 'POST #reject' do + subject { post :reject, params: { id: appeal.id } } + let(:current_user) { Fabricate(:user, role: UserRole.find_by(name: 'Admin')) } - before do - post :reject, params: { id: appeal.id } - end + it 'redirects back to the strike page and notifies target account about rejected appeal', :sidekiq_inline do + subject - it 'redirects back to the strike page' do - expect(response).to redirect_to(disputes_strike_path(appeal.strike)) - end + expect(response) + .to redirect_to(disputes_strike_path(appeal.strike)) - it 'notifies target account about rejected appeal', :sidekiq_inline do expect(UserMailer.deliveries.size).to eq(1) expect(UserMailer.deliveries.first.to.first).to eq(target_account.user.email) expect(UserMailer.deliveries.first.subject).to eq(I18n.t('user_mailer.appeal_rejected.subject', date: I18n.l(appeal.created_at))) From 1d9d14b8de67daab169d10293e1f09901734c445 Mon Sep 17 00:00:00 2001 From: Matt Jankowski Date: Fri, 16 Feb 2024 09:29:24 -0500 Subject: [PATCH 135/211] Use `abort` instead of `warn(); exit` in boot.rb env check (#29209) --- .rubocop.yml | 6 ------ config/boot.rb | 11 +++++++++-- 2 files changed, 9 insertions(+), 8 deletions(-) diff --git a/.rubocop.yml b/.rubocop.yml index a8310489ea..dce33eab30 100644 --- a/.rubocop.yml +++ b/.rubocop.yml @@ -96,12 +96,6 @@ Rails/FilePath: Rails/HttpStatus: EnforcedStyle: numeric -# Reason: Allowed in boot ENV checker -# https://docs.rubocop.org/rubocop-rails/cops_rails.html#railsexit -Rails/Exit: - Exclude: - - 'config/boot.rb' - # Reason: Conflicts with `Lint/UselessMethodDefinition` for inherited controller actions # https://docs.rubocop.org/rubocop-rails/cops_rails.html#railslexicallyscopedactionfilter Rails/LexicallyScopedActionFilter: diff --git a/config/boot.rb b/config/boot.rb index 717de85f20..70ffe22c04 100644 --- a/config/boot.rb +++ b/config/boot.rb @@ -1,8 +1,15 @@ # frozen_string_literal: true unless ENV.key?('RAILS_ENV') - warn 'ERROR: Missing RAILS_ENV environment variable, please set it to "production", "development", or "test".' - exit 1 + abort <<~ERROR + The RAILS_ENV environment variable is not set. + + Please set it correctly depending on context: + + - Use "production" for a live deployment of the application + - Use "development" for local feature work + - Use "test" when running the automated spec suite + ERROR end ENV['BUNDLE_GEMFILE'] ||= File.expand_path('../Gemfile', __dir__) From cfadb8707737ff679b1b08fa9dcab627a632f6ab Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Wolfgang=20Fourn=C3=A8s?= Date: Fri, 16 Feb 2024 15:54:23 +0100 Subject: [PATCH 136/211] Update enum syntax to use the new Rails 7.0 style (#29217) --- app/models/account.rb | 4 ++-- app/models/account_warning.rb | 4 ++-- app/models/bulk_import.rb | 4 ++-- app/models/custom_filter.rb | 2 +- app/models/domain_block.rb | 2 +- app/models/import.rb | 2 +- app/models/ip_block.rb | 2 +- app/models/list.rb | 2 +- app/models/login_activity.rb | 2 +- app/models/media_attachment.rb | 4 ++-- app/models/preview_card.rb | 4 ++-- app/models/relay.rb | 2 +- app/models/report.rb | 2 +- app/models/software_update.rb | 2 +- app/models/status.rb | 2 +- 15 files changed, 20 insertions(+), 20 deletions(-) diff --git a/app/models/account.rb b/app/models/account.rb index 05e1f943ca..442d4a431d 100644 --- a/app/models/account.rb +++ b/app/models/account.rb @@ -85,8 +85,8 @@ class Account < ApplicationRecord include DomainNormalizable include Paginable - enum protocol: { ostatus: 0, activitypub: 1 } - enum suspension_origin: { local: 0, remote: 1 }, _prefix: true + enum :protocol, { ostatus: 0, activitypub: 1 } + enum :suspension_origin, { local: 0, remote: 1 }, prefix: true validates :username, presence: true validates_with UniqueUsernameValidator, if: -> { will_save_change_to_username? } diff --git a/app/models/account_warning.rb b/app/models/account_warning.rb index 9286577f51..a54387a562 100644 --- a/app/models/account_warning.rb +++ b/app/models/account_warning.rb @@ -17,7 +17,7 @@ # class AccountWarning < ApplicationRecord - enum action: { + enum :action, { none: 0, disable: 1_000, mark_statuses_as_sensitive: 1_250, @@ -25,7 +25,7 @@ class AccountWarning < ApplicationRecord sensitive: 2_000, silence: 3_000, suspend: 4_000, - }, _suffix: :action + }, suffix: :action normalizes :text, with: ->(text) { text.to_s }, apply_to_nil: true diff --git a/app/models/bulk_import.rb b/app/models/bulk_import.rb index 406fb2aba2..4cd228705a 100644 --- a/app/models/bulk_import.rb +++ b/app/models/bulk_import.rb @@ -24,7 +24,7 @@ class BulkImport < ApplicationRecord belongs_to :account has_many :rows, class_name: 'BulkImportRow', inverse_of: :bulk_import, dependent: :delete_all - enum type: { + enum :type, { following: 0, blocking: 1, muting: 2, @@ -33,7 +33,7 @@ class BulkImport < ApplicationRecord lists: 5, } - enum state: { + enum :state, { unconfirmed: 0, scheduled: 1, in_progress: 2, diff --git a/app/models/custom_filter.rb b/app/models/custom_filter.rb index c8120c2395..5e2d152e34 100644 --- a/app/models/custom_filter.rb +++ b/app/models/custom_filter.rb @@ -31,7 +31,7 @@ class CustomFilter < ApplicationRecord include Expireable include Redisable - enum action: { warn: 0, hide: 1 }, _suffix: :action + enum :action, { warn: 0, hide: 1 }, suffix: :action belongs_to :account has_many :keywords, class_name: 'CustomFilterKeyword', inverse_of: :custom_filter, dependent: :destroy diff --git a/app/models/domain_block.rb b/app/models/domain_block.rb index a05db099a8..e310918e9b 100644 --- a/app/models/domain_block.rb +++ b/app/models/domain_block.rb @@ -21,7 +21,7 @@ class DomainBlock < ApplicationRecord include DomainNormalizable include DomainMaterializable - enum severity: { silence: 0, suspend: 1, noop: 2 } + enum :severity, { silence: 0, suspend: 1, noop: 2 } validates :domain, presence: true, uniqueness: true, domain: true diff --git a/app/models/import.rb b/app/models/import.rb index 7cd6cccf7c..4bdb392014 100644 --- a/app/models/import.rb +++ b/app/models/import.rb @@ -28,7 +28,7 @@ class Import < ApplicationRecord belongs_to :account - enum type: { following: 0, blocking: 1, muting: 2, domain_blocking: 3, bookmarks: 4 } + enum :type, { following: 0, blocking: 1, muting: 2, domain_blocking: 3, bookmarks: 4 } validates :type, presence: true diff --git a/app/models/ip_block.rb b/app/models/ip_block.rb index 99783050b8..9def5b0cde 100644 --- a/app/models/ip_block.rb +++ b/app/models/ip_block.rb @@ -19,7 +19,7 @@ class IpBlock < ApplicationRecord include Expireable include Paginable - enum severity: { + enum :severity, { sign_up_requires_approval: 5000, sign_up_block: 5500, no_access: 9999, diff --git a/app/models/list.rb b/app/models/list.rb index fcef49e6e9..b45bd057bc 100644 --- a/app/models/list.rb +++ b/app/models/list.rb @@ -18,7 +18,7 @@ class List < ApplicationRecord PER_ACCOUNT_LIMIT = 50 - enum replies_policy: { list: 0, followed: 1, none: 2 }, _prefix: :show + enum :replies_policy, { list: 0, followed: 1, none: 2 }, prefix: :show belongs_to :account, optional: true diff --git a/app/models/login_activity.rb b/app/models/login_activity.rb index 2b7b37f8e4..654dd623ad 100644 --- a/app/models/login_activity.rb +++ b/app/models/login_activity.rb @@ -16,7 +16,7 @@ # class LoginActivity < ApplicationRecord - enum authentication_method: { password: 'password', otp: 'otp', webauthn: 'webauthn', sign_in_token: 'sign_in_token', omniauth: 'omniauth' } + enum :authentication_method, { password: 'password', otp: 'otp', webauthn: 'webauthn', sign_in_token: 'sign_in_token', omniauth: 'omniauth' } belongs_to :user diff --git a/app/models/media_attachment.rb b/app/models/media_attachment.rb index 7ff6a15f5d..f53da04a97 100644 --- a/app/models/media_attachment.rb +++ b/app/models/media_attachment.rb @@ -34,8 +34,8 @@ class MediaAttachment < ApplicationRecord include Attachmentable - enum type: { image: 0, gifv: 1, video: 2, unknown: 3, audio: 4 } - enum processing: { queued: 0, in_progress: 1, complete: 2, failed: 3 }, _prefix: true + enum :type, { image: 0, gifv: 1, video: 2, unknown: 3, audio: 4 } + enum :processing, { queued: 0, in_progress: 1, complete: 2, failed: 3 }, prefix: true MAX_DESCRIPTION_LENGTH = 1_500 diff --git a/app/models/preview_card.rb b/app/models/preview_card.rb index 8375927430..9fe02bd168 100644 --- a/app/models/preview_card.rb +++ b/app/models/preview_card.rb @@ -47,8 +47,8 @@ class PreviewCard < ApplicationRecord self.inheritance_column = false - enum type: { link: 0, photo: 1, video: 2, rich: 3 } - enum link_type: { unknown: 0, article: 1 } + enum :type, { link: 0, photo: 1, video: 2, rich: 3 } + enum :link_type, { unknown: 0, article: 1 } has_many :preview_cards_statuses, dependent: :delete_all, inverse_of: :preview_card has_many :statuses, through: :preview_cards_statuses diff --git a/app/models/relay.rb b/app/models/relay.rb index 8d697b891f..f652b4864b 100644 --- a/app/models/relay.rb +++ b/app/models/relay.rb @@ -15,7 +15,7 @@ class Relay < ApplicationRecord validates :inbox_url, presence: true, uniqueness: true, url: true, if: :will_save_change_to_inbox_url? - enum state: { idle: 0, pending: 1, accepted: 2, rejected: 3 } + enum :state, { idle: 0, pending: 1, accepted: 2, rejected: 3 } scope :enabled, -> { accepted } diff --git a/app/models/report.rb b/app/models/report.rb index 1b132753b5..df7e3d2efc 100644 --- a/app/models/report.rb +++ b/app/models/report.rb @@ -55,7 +55,7 @@ class Report < ApplicationRecord # - app/javascript/mastodon/features/notifications/components/report.jsx # - app/javascript/mastodon/features/report/category.jsx # - app/javascript/mastodon/components/admin/ReportReasonSelector.jsx - enum category: { + enum :category, { other: 0, spam: 1_000, legal: 1_500, diff --git a/app/models/software_update.rb b/app/models/software_update.rb index cb3a6df2ae..51a73c2731 100644 --- a/app/models/software_update.rb +++ b/app/models/software_update.rb @@ -16,7 +16,7 @@ class SoftwareUpdate < ApplicationRecord self.inheritance_column = nil - enum type: { patch: 0, minor: 1, major: 2 }, _suffix: :type + enum :type, { patch: 0, minor: 1, major: 2 }, suffix: :type def gem_version Gem::Version.new(version) diff --git a/app/models/status.rb b/app/models/status.rb index e3d41cceda..0ec69c8dd1 100644 --- a/app/models/status.rb +++ b/app/models/status.rb @@ -50,7 +50,7 @@ class Status < ApplicationRecord update_index('statuses', :proper) update_index('public_statuses', :proper) - enum visibility: { public: 0, unlisted: 1, private: 2, direct: 3, limited: 4 }, _suffix: :visibility + enum :visibility, { public: 0, unlisted: 1, private: 2, direct: 3, limited: 4 }, suffix: :visibility belongs_to :application, class_name: 'Doorkeeper::Application', optional: true From 96ddf1d4820419a6b5367af022be5cf17526109e Mon Sep 17 00:00:00 2001 From: Claire Date: Fri, 16 Feb 2024 17:57:23 +0100 Subject: [PATCH 137/211] Fix flaky end-to-end OCR test (#29244) --- spec/system/ocr_spec.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spec/system/ocr_spec.rb b/spec/system/ocr_spec.rb index 3ab815c047..254efa7137 100644 --- a/spec/system/ocr_spec.rb +++ b/spec/system/ocr_spec.rb @@ -28,6 +28,6 @@ describe 'OCR', :paperclip_processing, :sidekiq_inline do click_on('Detect text from picture') - expect(page).to have_css('#upload-modal__description', text: 'Hello Mastodon') + expect(page).to have_css('#upload-modal__description', text: /Hello Mastodon\s*/, wait: 10) end end From 245064bb98ab11face7a04303fd62724820d9610 Mon Sep 17 00:00:00 2001 From: Matt Jankowski Date: Mon, 19 Feb 2024 06:09:43 -0500 Subject: [PATCH 138/211] Move "everyone" role and "instance actor" account magic number IDs to constants (#29260) --- app/models/account.rb | 5 +++-- app/models/concerns/account/finder_concern.rb | 4 ++-- app/models/user_role.rb | 10 ++++++---- db/migrate/20190715164535_add_instance_actor.rb | 6 ++++-- .../20220704024901_migrate_settings_to_user_roles.rb | 6 ++++-- db/seeds/02_instance_actor.rb | 2 +- lib/tasks/tests.rake | 2 +- spec/models/account_spec.rb | 4 ++-- spec/models/user_role_spec.rb | 6 +++--- 9 files changed, 26 insertions(+), 19 deletions(-) diff --git a/app/models/account.rb b/app/models/account.rb index 442d4a431d..d627fd6b64 100644 --- a/app/models/account.rb +++ b/app/models/account.rb @@ -64,6 +64,7 @@ class Account < ApplicationRecord ) BACKGROUND_REFRESH_INTERVAL = 1.week.freeze + INSTANCE_ACTOR_ID = -99 USERNAME_RE = /[a-z0-9_]+([a-z0-9_.-]+[a-z0-9_]+)?/i MENTION_RE = %r{(? { where.not(sensitized_at: nil) } scope :without_suspended, -> { where(suspended_at: nil) } scope :without_silenced, -> { where(silenced_at: nil) } - scope :without_instance_actor, -> { where.not(id: -99) } + scope :without_instance_actor, -> { where.not(id: INSTANCE_ACTOR_ID) } scope :recent, -> { reorder(id: :desc) } scope :bots, -> { where(actor_type: %w(Application Service)) } scope :groups, -> { where(actor_type: 'Group') } @@ -176,7 +177,7 @@ class Account < ApplicationRecord end def instance_actor? - id == -99 + id == INSTANCE_ACTOR_ID end alias bot bot? diff --git a/app/models/concerns/account/finder_concern.rb b/app/models/concerns/account/finder_concern.rb index 7faaddeb43..a7acff1cbb 100644 --- a/app/models/concerns/account/finder_concern.rb +++ b/app/models/concerns/account/finder_concern.rb @@ -13,11 +13,11 @@ module Account::FinderConcern end def representative - actor = Account.find(-99).tap(&:ensure_keys!) + actor = Account.find(Account::INSTANCE_ACTOR_ID).tap(&:ensure_keys!) actor.update!(username: 'mastodon.internal') if actor.username.include?(':') actor rescue ActiveRecord::RecordNotFound - Account.create!(id: -99, actor_type: 'Application', locked: true, username: 'mastodon.internal') + Account.create!(id: Account::INSTANCE_ACTOR_ID, actor_type: 'Application', locked: true, username: 'mastodon.internal') end def find_local(username) diff --git a/app/models/user_role.rb b/app/models/user_role.rb index 89354da542..ed64ca0538 100644 --- a/app/models/user_role.rb +++ b/app/models/user_role.rb @@ -38,6 +38,8 @@ class UserRole < ApplicationRecord delete_user_data: (1 << 19), }.freeze + EVERYONE_ROLE_ID = -99 + module Flags NONE = 0 ALL = FLAGS.values.reduce(&:|) @@ -94,7 +96,7 @@ class UserRole < ApplicationRecord before_validation :set_position - scope :assignable, -> { where.not(id: -99).order(position: :asc) } + scope :assignable, -> { where.not(id: EVERYONE_ROLE_ID).order(position: :asc) } has_many :users, inverse_of: :role, foreign_key: 'role_id', dependent: :nullify @@ -103,9 +105,9 @@ class UserRole < ApplicationRecord end def self.everyone - UserRole.find(-99) + UserRole.find(EVERYONE_ROLE_ID) rescue ActiveRecord::RecordNotFound - UserRole.create!(id: -99, permissions: Flags::DEFAULT) + UserRole.create!(id: EVERYONE_ROLE_ID, permissions: Flags::DEFAULT) end def self.that_can(*any_of_privileges) @@ -113,7 +115,7 @@ class UserRole < ApplicationRecord end def everyone? - id == -99 + id == EVERYONE_ROLE_ID end def nobody? diff --git a/db/migrate/20190715164535_add_instance_actor.rb b/db/migrate/20190715164535_add_instance_actor.rb index 3785dc2553..6871b37bdf 100644 --- a/db/migrate/20190715164535_add_instance_actor.rb +++ b/db/migrate/20190715164535_add_instance_actor.rb @@ -5,6 +5,8 @@ class AddInstanceActor < ActiveRecord::Migration[5.2] # Dummy class, to make migration possible across version changes validates :username, uniqueness: { scope: :domain, case_sensitive: false } + INSTANCE_ACTOR_ID = -99 + before_create :generate_keys def generate_keys @@ -15,10 +17,10 @@ class AddInstanceActor < ActiveRecord::Migration[5.2] end def up - Account.create!(id: -99, actor_type: 'Application', locked: true, username: Rails.configuration.x.local_domain) + Account.create!(id: Account::INSTANCE_ACTOR_ID, actor_type: 'Application', locked: true, username: Rails.configuration.x.local_domain) end def down - Account.find_by(id: -99, actor_type: 'Application').destroy! + Account.find_by(id: Account::INSTANCE_ACTOR_ID, actor_type: 'Application').destroy! end end diff --git a/db/post_migrate/20220704024901_migrate_settings_to_user_roles.rb b/db/post_migrate/20220704024901_migrate_settings_to_user_roles.rb index 00afee26d0..42dc37f08b 100644 --- a/db/post_migrate/20220704024901_migrate_settings_to_user_roles.rb +++ b/db/post_migrate/20220704024901_migrate_settings_to_user_roles.rb @@ -3,7 +3,9 @@ class MigrateSettingsToUserRoles < ActiveRecord::Migration[6.1] disable_ddl_transaction! - class UserRole < ApplicationRecord; end + class UserRole < ApplicationRecord + EVERYONE_ROLE_ID = -99 + end def up process_role_everyone @@ -17,7 +19,7 @@ class MigrateSettingsToUserRoles < ActiveRecord::Migration[6.1] private def process_role_everyone - everyone_role = UserRole.find_by(id: -99) + everyone_role = UserRole.find_by(id: UserRole::EVERYONE_ROLE_ID) return unless everyone_role everyone_role.permissions &= ~::UserRole::FLAGS[:invite_users] unless min_invite_role == 'user' diff --git a/db/seeds/02_instance_actor.rb b/db/seeds/02_instance_actor.rb index 55e83e8a08..2b6befec0d 100644 --- a/db/seeds/02_instance_actor.rb +++ b/db/seeds/02_instance_actor.rb @@ -1,3 +1,3 @@ # frozen_string_literal: true -Account.create_with(actor_type: 'Application', locked: true, username: 'mastodon.internal').find_or_create_by(id: -99) +Account.create_with(actor_type: 'Application', locked: true, username: 'mastodon.internal').find_or_create_by(id: Account::INSTANCE_ACTOR_ID) diff --git a/lib/tasks/tests.rake b/lib/tasks/tests.rake index 885be79f41..935f6d24a3 100644 --- a/lib/tasks/tests.rake +++ b/lib/tasks/tests.rake @@ -50,7 +50,7 @@ namespace :tests do exit(1) end - if Account.find(-99).private_key.blank? + if Account.find(Account::INSTANCE_ACTOR_ID).private_key.blank? puts 'Instance actor does not have a private key' exit(1) end diff --git a/spec/models/account_spec.rb b/spec/models/account_spec.rb index b1dca52dc5..f6376eb36e 100644 --- a/spec/models/account_spec.rb +++ b/spec/models/account_spec.rb @@ -746,13 +746,13 @@ RSpec.describe Account do end it 'is valid if we are creating an instance actor account with a period' do - account = Fabricate.build(:account, id: -99, actor_type: 'Application', locked: true, username: 'example.com') + account = Fabricate.build(:account, id: described_class::INSTANCE_ACTOR_ID, actor_type: 'Application', locked: true, username: 'example.com') expect(account.valid?).to be true end it 'is valid if we are creating a possibly-conflicting instance actor account' do _account = Fabricate(:account, username: 'examplecom') - instance_account = Fabricate.build(:account, id: -99, actor_type: 'Application', locked: true, username: 'example.com') + instance_account = Fabricate.build(:account, id: described_class::INSTANCE_ACTOR_ID, actor_type: 'Application', locked: true, username: 'example.com') expect(instance_account.valid?).to be true end diff --git a/spec/models/user_role_spec.rb b/spec/models/user_role_spec.rb index d5234ebe8d..9dd04a8172 100644 --- a/spec/models/user_role_spec.rb +++ b/spec/models/user_role_spec.rb @@ -164,12 +164,12 @@ RSpec.describe UserRole do end describe '#everyone?' do - it 'returns true when id is -99' do - subject.id = -99 + it 'returns true when id matches the everyone id' do + subject.id = described_class::EVERYONE_ROLE_ID expect(subject.everyone?).to be true end - it 'returns false when id is not -99' do + it 'returns false when id does not match the everyone id' do subject.id = 123 expect(subject.everyone?).to be false end From 63f4ea055aceff47ae47eabe6da103af05ffafd5 Mon Sep 17 00:00:00 2001 From: Eugen Rochko Date: Mon, 19 Feb 2024 12:09:58 +0100 Subject: [PATCH 139/211] Change follow suggestions design in web UI (#29272) --- .../components/inline_follow_suggestions.jsx | 25 ++++++++++++++++--- app/javascript/mastodon/locales/en.json | 7 +++++- .../styles/mastodon/components.scss | 9 +++++-- 3 files changed, 34 insertions(+), 7 deletions(-) diff --git a/app/javascript/mastodon/features/home_timeline/components/inline_follow_suggestions.jsx b/app/javascript/mastodon/features/home_timeline/components/inline_follow_suggestions.jsx index f76526e045..c39b43bade 100644 --- a/app/javascript/mastodon/features/home_timeline/components/inline_follow_suggestions.jsx +++ b/app/javascript/mastodon/features/home_timeline/components/inline_follow_suggestions.jsx @@ -21,6 +21,7 @@ import { DisplayName } from 'mastodon/components/display_name'; import { Icon } from 'mastodon/components/icon'; import { IconButton } from 'mastodon/components/icon_button'; import { VerifiedBadge } from 'mastodon/components/verified_badge'; +import { domain } from 'mastodon/initial_state'; const messages = defineMessages({ follow: { id: 'account.follow', defaultMessage: 'Follow' }, @@ -28,27 +29,43 @@ const messages = defineMessages({ previous: { id: 'lightbox.previous', defaultMessage: 'Previous' }, next: { id: 'lightbox.next', defaultMessage: 'Next' }, dismiss: { id: 'follow_suggestions.dismiss', defaultMessage: "Don't show again" }, + friendsOfFriendsHint: { id: 'follow_suggestions.hints.friends_of_friends', defaultMessage: 'This profile is popular among the people you follow.' }, + similarToRecentlyFollowedHint: { id: 'follow_suggestions.hints.similar_to_recently_followed', defaultMessage: 'This profile is similar to the profiles you have most recently followed.' }, + featuredHint: { id: 'follow_suggestions.hints.featured', defaultMessage: 'This profile has been hand-picked by the {domain} team.' }, + mostFollowedHint: { id: 'follow_suggestions.hints.most_followed', defaultMessage: 'This profile is one of the most followed on {domain}.'}, + mostInteractionsHint: { id: 'follow_suggestions.hints.most_interactions', defaultMessage: 'This profile has been recently getting a lot of attention on {domain}.' }, }); const Source = ({ id }) => { - let label; + const intl = useIntl(); + + let label, hint; switch (id) { case 'friends_of_friends': + hint = intl.formatMessage(messages.friendsOfFriendsHint); + label = ; + break; case 'similar_to_recently_followed': + hint = intl.formatMessage(messages.similarToRecentlyFollowedHint); label = ; break; case 'featured': - label = ; + hint = intl.formatMessage(messages.featuredHint, { domain }); + label = ; break; case 'most_followed': + hint = intl.formatMessage(messages.mostFollowedHint, { domain }); + label = ; + break; case 'most_interactions': + hint = intl.formatMessage(messages.mostInteractionsHint, { domain }); label = ; break; } return ( -
+
{label}
@@ -92,7 +109,7 @@ const Card = ({ id, sources }) => { {firstVerifiedField ? : }
- + + + + +
+
+ {suggestions.map(suggestion => ( + + ))} +
+ + {canScrollLeft && ( + + )} + + {canScrollRight && ( + + )} +
+ + ); +}; + +InlineFollowSuggestions.propTypes = { + hidden: PropTypes.bool, +}; diff --git a/app/javascript/flavours/glitch/features/home_timeline/index.jsx b/app/javascript/flavours/glitch/features/home_timeline/index.jsx index 093d8a7602..f383a6e48c 100644 --- a/app/javascript/flavours/glitch/features/home_timeline/index.jsx +++ b/app/javascript/flavours/glitch/features/home_timeline/index.jsx @@ -6,8 +6,6 @@ import { defineMessages, injectIntl, FormattedMessage } from 'react-intl'; import classNames from 'classnames'; import { Helmet } from 'react-helmet'; -import { createSelector } from '@reduxjs/toolkit'; -import { List as ImmutableList } from 'immutable'; import { connect } from 'react-redux'; @@ -17,7 +15,7 @@ import { fetchAnnouncements, toggleShowAnnouncements } from 'flavours/glitch/act import { IconWithBadge } from 'flavours/glitch/components/icon_with_badge'; import { NotSignedInIndicator } from 'flavours/glitch/components/not_signed_in_indicator'; import AnnouncementsContainer from 'flavours/glitch/features/getting_started/containers/announcements_container'; -import { me, criticalUpdatesPending } from 'flavours/glitch/initial_state'; +import { criticalUpdatesPending } from 'flavours/glitch/initial_state'; import { addColumn, removeColumn, moveColumn } from '../../actions/columns'; import { expandHomeTimeline } from '../../actions/timelines'; @@ -27,7 +25,6 @@ import StatusListContainer from '../ui/containers/status_list_container'; import { ColumnSettings } from './components/column_settings'; import { CriticalUpdateBanner } from './components/critical_update_banner'; -import { ExplorePrompt } from './components/explore_prompt'; const messages = defineMessages({ title: { id: 'column.home', defaultMessage: 'Home' }, @@ -35,51 +32,12 @@ const messages = defineMessages({ hide_announcements: { id: 'home.hide_announcements', defaultMessage: 'Hide announcements' }, }); -const getHomeFeedSpeed = createSelector([ - state => state.getIn(['timelines', 'home', 'items'], ImmutableList()), - state => state.getIn(['timelines', 'home', 'pendingItems'], ImmutableList()), - state => state.get('statuses'), -], (statusIds, pendingStatusIds, statusMap) => { - const recentStatusIds = pendingStatusIds.concat(statusIds); - const statuses = recentStatusIds.filter(id => id !== null).map(id => statusMap.get(id)).filter(status => status?.get('account') !== me).take(20); - - if (statuses.isEmpty()) { - return { - gap: 0, - newest: new Date(0), - }; - } - - const datetimes = statuses.map(status => status.get('created_at', 0)); - const oldest = new Date(datetimes.min()); - const newest = new Date(datetimes.max()); - const averageGap = (newest - oldest) / (1000 * (statuses.size + 1)); // Average gap between posts on first page in seconds - - return { - gap: averageGap, - newest, - }; -}); - -const homeTooSlow = createSelector([ - state => state.getIn(['timelines', 'home', 'isLoading']), - state => state.getIn(['timelines', 'home', 'isPartial']), - getHomeFeedSpeed, -], (isLoading, isPartial, speed) => - !isLoading && !isPartial // Only if the home feed has finished loading - && ( - (speed.gap > (30 * 60) // If the average gap between posts is more than 30 minutes - || (Date.now() - speed.newest) > (1000 * 3600)) // If the most recent post is from over an hour ago - ) -); - const mapStateToProps = state => ({ hasUnread: state.getIn(['timelines', 'home', 'unread']) > 0, isPartial: state.getIn(['timelines', 'home', 'isPartial']), hasAnnouncements: !state.getIn(['announcements', 'items']).isEmpty(), unreadAnnouncements: state.getIn(['announcements', 'items']).count(item => !item.get('read')), showAnnouncements: state.getIn(['announcements', 'show']), - tooSlow: homeTooSlow(state), regex: state.getIn(['settings', 'home', 'regex', 'body']), }); @@ -99,7 +57,6 @@ class HomeTimeline extends PureComponent { hasAnnouncements: PropTypes.bool, unreadAnnouncements: PropTypes.number, showAnnouncements: PropTypes.bool, - tooSlow: PropTypes.bool, regex: PropTypes.string, }; @@ -170,7 +127,7 @@ class HomeTimeline extends PureComponent { }; render () { - const { intl, hasUnread, columnId, multiColumn, tooSlow, hasAnnouncements, unreadAnnouncements, showAnnouncements } = this.props; + const { intl, hasUnread, columnId, multiColumn, hasAnnouncements, unreadAnnouncements, showAnnouncements } = this.props; const pinned = !!columnId; const { signedIn } = this.context.identity; const banners = []; @@ -194,10 +151,6 @@ class HomeTimeline extends PureComponent { banners.push(); } - if (tooSlow) { - banners.push(); - } - return ( createSelector([ getRegex, ], (columnSettings, statusIds, statuses, regex) => { return statusIds.filter(id => { - if (id === null) return true; + if (id === null || id === 'inline-follow-suggestions') return true; const statusForId = statuses.get(id); let showStatus = true; diff --git a/app/javascript/flavours/glitch/reducers/settings.js b/app/javascript/flavours/glitch/reducers/settings.js index a1b2434cdb..59b2e5dd40 100644 --- a/app/javascript/flavours/glitch/reducers/settings.js +++ b/app/javascript/flavours/glitch/reducers/settings.js @@ -114,7 +114,7 @@ const initialState = ImmutableMap({ dismissed_banners: ImmutableMap({ 'public_timeline': false, 'community_timeline': false, - 'home.explore_prompt': false, + 'home/follow-suggestions': false, 'explore/links': false, 'explore/statuses': false, 'explore/tags': false, diff --git a/app/javascript/flavours/glitch/reducers/suggestions.js b/app/javascript/flavours/glitch/reducers/suggestions.js index 03a7c80cf5..dc5dfc2455 100644 --- a/app/javascript/flavours/glitch/reducers/suggestions.js +++ b/app/javascript/flavours/glitch/reducers/suggestions.js @@ -28,12 +28,12 @@ export default function suggestionsReducer(state = initialState, action) { case SUGGESTIONS_FETCH_FAIL: return state.set('isLoading', false); case SUGGESTIONS_DISMISS: - return state.update('items', list => list.filterNot(x => x.account === action.id)); + return state.update('items', list => list.filterNot(x => x.get('account') === action.id)); case blockAccountSuccess.type: case muteAccountSuccess.type: - return state.update('items', list => list.filterNot(x => x.account === action.payload.relationship.id)); + return state.update('items', list => list.filterNot(x => x.get('account') === action.payload.relationship.id)); case blockDomainSuccess.type: - return state.update('items', list => list.filterNot(x => action.payload.accounts.includes(x.account))); + return state.update('items', list => list.filterNot(x => action.payload.accounts.includes(x.get('account')))); default: return state; } diff --git a/app/javascript/flavours/glitch/reducers/timelines.js b/app/javascript/flavours/glitch/reducers/timelines.js index 6ff83aa7f0..08c7a48336 100644 --- a/app/javascript/flavours/glitch/reducers/timelines.js +++ b/app/javascript/flavours/glitch/reducers/timelines.js @@ -17,6 +17,9 @@ import { TIMELINE_DISCONNECT, TIMELINE_LOAD_PENDING, TIMELINE_MARK_AS_PARTIAL, + TIMELINE_INSERT, + TIMELINE_GAP, + TIMELINE_SUGGESTIONS, } from '../actions/timelines'; import { compareId } from '../compare_id'; @@ -32,6 +35,8 @@ const initialTimeline = ImmutableMap({ items: ImmutableList(), }); +const isPlaceholder = value => value === TIMELINE_GAP || value === TIMELINE_SUGGESTIONS; + const expandNormalizedTimeline = (state, timeline, statuses, next, isPartial, isLoadingRecent, usePendingItems) => { // This method is pretty tricky because: // - existing items in the timeline might be out of order @@ -63,20 +68,20 @@ const expandNormalizedTimeline = (state, timeline, statuses, next, isPartial, is // First, find the furthest (if properly sorted, oldest) item in the timeline that is // newer than the oldest fetched one, as it's most likely that it delimits the gap. // Start the gap *after* that item. - const lastIndex = oldIds.findLastIndex(id => id !== null && compareId(id, newIds.last()) >= 0) + 1; + const lastIndex = oldIds.findLastIndex(id => !isPlaceholder(id) && compareId(id, newIds.last()) >= 0) + 1; // Then, try to find the furthest (if properly sorted, oldest) item in the timeline that // is newer than the most recent fetched one, as it delimits a section comprised of only // items older or within `newIds` (or that were deleted from the server, so should be removed // anyway). // Stop the gap *after* that item. - const firstIndex = oldIds.take(lastIndex).findLastIndex(id => id !== null && compareId(id, newIds.first()) > 0) + 1; + const firstIndex = oldIds.take(lastIndex).findLastIndex(id => !isPlaceholder(id) && compareId(id, newIds.first()) > 0) + 1; let insertedIds = ImmutableOrderedSet(newIds).withMutations(insertedIds => { // It is possible, though unlikely, that the slice we are replacing contains items older // than the elements we got from the API. Get them and add them back at the back of the // slice. - const olderIds = oldIds.slice(firstIndex, lastIndex).filter(id => id !== null && compareId(id, newIds.last()) < 0); + const olderIds = oldIds.slice(firstIndex, lastIndex).filter(id => !isPlaceholder(id) && compareId(id, newIds.last()) < 0); insertedIds.union(olderIds); // Make sure we aren't inserting duplicates @@ -84,8 +89,8 @@ const expandNormalizedTimeline = (state, timeline, statuses, next, isPartial, is }).toList(); // Finally, insert a gap marker if the data is marked as partial by the server - if (isPartial && (firstIndex === 0 || oldIds.get(firstIndex - 1) !== null)) { - insertedIds = insertedIds.unshift(null); + if (isPartial && (firstIndex === 0 || oldIds.get(firstIndex - 1) !== TIMELINE_GAP)) { + insertedIds = insertedIds.unshift(TIMELINE_GAP); } return oldIds.take(firstIndex).concat( @@ -184,7 +189,7 @@ const reconnectTimeline = (state, usePendingItems) => { } return state.withMutations(mMap => { - mMap.update(usePendingItems ? 'pendingItems' : 'items', items => items.first() ? items.unshift(null) : items); + mMap.update(usePendingItems ? 'pendingItems' : 'items', items => items.first() ? items.unshift(TIMELINE_GAP) : items); mMap.set('online', true); }); }; @@ -219,7 +224,7 @@ export default function timelines(state = initialState, action) { return state.update( action.timeline, initialTimeline, - map => map.set('online', false).update(action.usePendingItems ? 'pendingItems' : 'items', items => items.first() ? items.unshift(null) : items), + map => map.set('online', false).update(action.usePendingItems ? 'pendingItems' : 'items', items => items.first() ? items.unshift(TIMELINE_GAP) : items), ); case TIMELINE_MARK_AS_PARTIAL: return state.update( @@ -227,6 +232,18 @@ export default function timelines(state = initialState, action) { initialTimeline, map => map.set('isPartial', true).set('items', ImmutableList()).set('pendingItems', ImmutableList()).set('unread', 0), ); + case TIMELINE_INSERT: + return state.update( + action.timeline, + initialTimeline, + map => map.update('items', ImmutableList(), list => { + if (!list.includes(action.key)) { + return list.insert(action.index, action.key); + } + + return list; + }) + ); default: return state; } diff --git a/app/javascript/flavours/glitch/styles/components.scss b/app/javascript/flavours/glitch/styles/components.scss index ac3e4c99e6..e9e78c9f6c 100644 --- a/app/javascript/flavours/glitch/styles/components.scss +++ b/app/javascript/flavours/glitch/styles/components.scss @@ -10048,3 +10048,199 @@ noscript { padding: 0; } } + +.inline-follow-suggestions { + display: flex; + flex-direction: column; + gap: 12px; + padding: 16px 0; + border-bottom: 1px solid mix($ui-base-color, $ui-highlight-color, 75%); + background: mix($ui-base-color, $ui-highlight-color, 95%); + + &__header { + display: flex; + align-items: center; + justify-content: space-between; + padding: 0 16px; + + h3 { + font-size: 15px; + line-height: 22px; + font-weight: 500; + } + + &__actions { + display: flex; + align-items: center; + gap: 24px; + } + + .link-button { + font-size: 13px; + font-weight: 500; + } + } + + &__body { + position: relative; + + &__scroll-button { + position: absolute; + height: 100%; + background: transparent; + border: none; + cursor: pointer; + top: 0; + color: $primary-text-color; + + &.left { + left: 0; + } + + &.right { + right: 0; + } + + &__icon { + border-radius: 50%; + background: $ui-highlight-color; + display: flex; + align-items: center; + justify-content: center; + aspect-ratio: 1; + padding: 8px; + + .icon { + width: 24px; + height: 24px; + } + } + + &:hover, + &:focus, + &:active { + .inline-follow-suggestions__body__scroll-button__icon { + background: lighten($ui-highlight-color, 4%); + } + } + } + + &__scrollable { + display: flex; + flex-wrap: nowrap; + gap: 16px; + padding: 16px; + padding-bottom: 0; + scroll-snap-type: x mandatory; + scroll-padding: 16px; + scroll-behavior: smooth; + overflow-x: hidden; + + &__card { + background: darken($ui-base-color, 4%); + border: 1px solid lighten($ui-base-color, 8%); + border-radius: 4px; + display: flex; + flex-direction: column; + gap: 12px; + align-items: center; + padding: 12px; + scroll-snap-align: start; + flex: 0 0 auto; + width: 200px; + box-sizing: border-box; + position: relative; + + a { + text-decoration: none; + } + + & > .icon-button { + position: absolute; + inset-inline-end: 8px; + top: 8px; + } + + &__avatar { + height: 48px; + display: flex; + + a { + display: flex; + text-decoration: none; + } + } + + .account__avatar { + flex-shrink: 0; + align-self: flex-end; + border: 1px solid lighten($ui-base-color, 8%); + background-color: $ui-base-color; + } + + &__text-stack { + display: flex; + flex-direction: column; + gap: 4px; + align-items: center; + max-width: 100%; + + a { + max-width: 100%; + } + + &__source { + display: inline-flex; + align-items: center; + color: $dark-text-color; + gap: 4px; + overflow: hidden; + white-space: nowrap; + + > span { + overflow: hidden; + text-overflow: ellipsis; + } + + .icon { + width: 16px; + height: 16px; + } + } + } + + .display-name { + display: flex; + flex-direction: column; + gap: 4px; + align-items: center; + + & > * { + max-width: 100%; + } + + &__html { + font-size: 15px; + font-weight: 500; + color: $secondary-text-color; + } + + &__account { + font-size: 14px; + color: $darker-text-color; + } + } + + .verified-badge { + font-size: 14px; + max-width: 100%; + } + + .button { + display: block; + width: 100%; + } + } + } + } +} diff --git a/app/javascript/flavours/glitch/styles/mastodon-light/diff.scss b/app/javascript/flavours/glitch/styles/mastodon-light/diff.scss index 1025a1bbaa..6bf4a1e488 100644 --- a/app/javascript/flavours/glitch/styles/mastodon-light/diff.scss +++ b/app/javascript/flavours/glitch/styles/mastodon-light/diff.scss @@ -648,3 +648,16 @@ html { .poll__option input[type='text'] { background: darken($ui-base-color, 10%); } + +.inline-follow-suggestions { + background-color: rgba($ui-highlight-color, 0.1); + border-bottom-color: rgba($ui-highlight-color, 0.3); +} + +.inline-follow-suggestions__body__scrollable__card { + background: $white; +} + +.inline-follow-suggestions__body__scroll-button__icon { + color: $white; +} From 38946742007d94f561b338f1d57cada76cbd752f Mon Sep 17 00:00:00 2001 From: "y.takahashi" Date: Fri, 2 Feb 2024 15:33:53 +0900 Subject: [PATCH 203/211] [Glitch] Fix 'focus the compose textarea' shortcut is not working Port 3c315a68afdb3b6ea1bc66b66bc7dcd49a335a08 to glitch-soc Signed-off-by: Claire --- app/javascript/flavours/glitch/features/ui/index.jsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/javascript/flavours/glitch/features/ui/index.jsx b/app/javascript/flavours/glitch/features/ui/index.jsx index b10bd04219..8882966213 100644 --- a/app/javascript/flavours/glitch/features/ui/index.jsx +++ b/app/javascript/flavours/glitch/features/ui/index.jsx @@ -483,7 +483,7 @@ class UI extends PureComponent { handleHotkeyNew = e => { e.preventDefault(); - const element = this.node.querySelector('.compose-form__autosuggest-wrapper textarea'); + const element = this.node.querySelector('.autosuggest-textarea__textarea'); if (element) { element.focus(); From 3c36e1be689bdd04d16b94d60e25bde709af0509 Mon Sep 17 00:00:00 2001 From: Claire Date: Tue, 6 Feb 2024 10:35:36 +0100 Subject: [PATCH 204/211] [Glitch] Fix report reason selector in moderation interface not unselecting rules when changing category Port 9ce914cc897d2b1100cee8cb6d792a2283d877ec to glitch-soc Signed-off-by: Claire --- .../flavours/glitch/components/admin/ReportReasonSelector.jsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/javascript/flavours/glitch/components/admin/ReportReasonSelector.jsx b/app/javascript/flavours/glitch/components/admin/ReportReasonSelector.jsx index 542ca3e1b6..9ff1d30899 100644 --- a/app/javascript/flavours/glitch/components/admin/ReportReasonSelector.jsx +++ b/app/javascript/flavours/glitch/components/admin/ReportReasonSelector.jsx @@ -124,7 +124,7 @@ class ReportReasonSelector extends PureComponent { api().put(`/api/v1/admin/reports/${id}`, { category, - rule_ids, + rule_ids: category === 'violation' ? rule_ids : [], }).catch(err => { console.error(err); }); From 9f0ff2bedf6ebc982962d006160c9758813bb631 Mon Sep 17 00:00:00 2001 From: Claire Date: Thu, 8 Feb 2024 12:40:22 +0100 Subject: [PATCH 205/211] [Glitch] Clean up some unused CSS definitions Port 67ec192d7dbb350511059a858d573daf49ecaf4f to glitch-soc Signed-off-by: Claire --- .../flavours/glitch/styles/components.scss | 51 ------------------- 1 file changed, 51 deletions(-) diff --git a/app/javascript/flavours/glitch/styles/components.scss b/app/javascript/flavours/glitch/styles/components.scss index e9e78c9f6c..8d71099c45 100644 --- a/app/javascript/flavours/glitch/styles/components.scss +++ b/app/javascript/flavours/glitch/styles/components.scss @@ -5095,43 +5095,6 @@ a.status-card { animation: heartbeat 1.5s ease-in-out infinite both; } -@keyframes shake-bottom { - 0%, - 100% { - transform: rotate(0deg); - transform-origin: 50% 100%; - } - - 10% { - transform: rotate(2deg); - } - - 20%, - 40%, - 60% { - transform: rotate(-4deg); - } - - 30%, - 50%, - 70% { - transform: rotate(4deg); - } - - 80% { - transform: rotate(-2deg); - } - - 90% { - transform: rotate(2deg); - } -} - -.no-reduce-motion .shake-bottom { - transform-origin: 50% 100%; - animation: shake-bottom 0.8s cubic-bezier(0.455, 0.03, 0.515, 0.955) 2s 2 both; -} - .emoji-picker-dropdown__menu { position: relative; margin-top: 5px; @@ -5849,20 +5812,6 @@ a.status-card { } } -.search-results__hashtag { - display: block; - padding: 10px; - color: $secondary-text-color; - text-decoration: none; - - &:hover, - &:active, - &:focus { - color: lighten($secondary-text-color, 4%); - text-decoration: underline; - } -} - .search-results__info { padding: 20px; color: $darker-text-color; From e45f40d2036d446b892c6d8222581ff8d2bbba67 Mon Sep 17 00:00:00 2001 From: Nicolas Hoffmann Date: Tue, 13 Feb 2024 13:58:21 +0100 Subject: [PATCH 206/211] [Glitch] Fix modal container bounds Port 476a043fc5339526536cbb1ba64d0ba2230e870c to glitch-soc Signed-off-by: Claire --- app/javascript/flavours/glitch/styles/components.scss | 2 ++ 1 file changed, 2 insertions(+) diff --git a/app/javascript/flavours/glitch/styles/components.scss b/app/javascript/flavours/glitch/styles/components.scss index 8d71099c45..906bc087ca 100644 --- a/app/javascript/flavours/glitch/styles/components.scss +++ b/app/javascript/flavours/glitch/styles/components.scss @@ -5839,6 +5839,8 @@ a.status-card { inset-inline-start: 0; width: 100%; height: 100%; + max-width: 100vw; + max-height: 100vh; box-sizing: border-box; display: flex; flex-direction: column; From 26924a0c7d8772079ee87434ac145b7a16453665 Mon Sep 17 00:00:00 2001 From: Claire Date: Tue, 6 Feb 2024 18:10:17 +0100 Subject: [PATCH 207/211] [Glitch] Change `source` attribute of `Suggestion` entity in `/api/v2/suggestions` back to a string Port 7ee93b74317c0b51516146fbe32e72cd9bbb151c to glitch-soc Signed-off-by: Claire --- .../components/inline_follow_suggestions.jsx | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/app/javascript/flavours/glitch/features/home_timeline/components/inline_follow_suggestions.jsx b/app/javascript/flavours/glitch/features/home_timeline/components/inline_follow_suggestions.jsx index 673b2d14d6..d915f1e55f 100644 --- a/app/javascript/flavours/glitch/features/home_timeline/components/inline_follow_suggestions.jsx +++ b/app/javascript/flavours/glitch/features/home_timeline/components/inline_follow_suggestions.jsx @@ -59,7 +59,7 @@ Source.propTypes = { id: PropTypes.oneOf(['friends_of_friends', 'similar_to_recently_followed', 'featured', 'most_followed', 'most_interactions']), }; -const Card = ({ id, source }) => { +const Card = ({ id, sources }) => { const intl = useIntl(); const account = useSelector(state => state.getIn(['accounts', id])); const relationship = useSelector(state => state.getIn(['relationships', id])); @@ -89,7 +89,7 @@ const Card = ({ id, source }) => {
- {firstVerifiedField ? : } + {firstVerifiedField ? : }