From dd45df66303795d4156606db47e300909b533721 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Mon, 2 Sep 2019 20:18:22 +0900 Subject: [PATCH 001/134] Bump @babel/plugin-transform-runtime from 7.4.4 to 7.5.5 (#11725) Bumps [@babel/plugin-transform-runtime](https://github.com/babel/babel) from 7.4.4 to 7.5.5. - [Release notes](https://github.com/babel/babel/releases) - [Changelog](https://github.com/babel/babel/blob/master/CHANGELOG.md) - [Commits](https://github.com/babel/babel/compare/v7.4.4...v7.5.5) Signed-off-by: dependabot-preview[bot] --- package.json | 2 +- yarn.lock | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index f79fa4912..932aa059e 100644 --- a/package.json +++ b/package.json @@ -67,7 +67,7 @@ "@babel/plugin-transform-react-inline-elements": "^7.2.0", "@babel/plugin-transform-react-jsx-self": "^7.2.0", "@babel/plugin-transform-react-jsx-source": "^7.5.0", - "@babel/plugin-transform-runtime": "^7.4.4", + "@babel/plugin-transform-runtime": "^7.5.5", "@babel/preset-env": "^7.5.5", "@babel/preset-react": "^7.0.0", "@babel/runtime": "^7.5.4", diff --git a/yarn.lock b/yarn.lock index a02b5a081..51b9c055c 100644 --- a/yarn.lock +++ b/yarn.lock @@ -657,10 +657,10 @@ dependencies: "@babel/helper-plugin-utils" "^7.0.0" -"@babel/plugin-transform-runtime@^7.4.4": - version "7.4.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.4.4.tgz#a50f5d16e9c3a4ac18a1a9f9803c107c380bce08" - integrity sha512-aMVojEjPszvau3NRg+TIH14ynZLvPewH4xhlCW1w6A3rkxTS1m4uwzRclYR9oS+rl/dr+kT+pzbfHuAWP/lc7Q== +"@babel/plugin-transform-runtime@^7.5.5": + version "7.5.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.5.5.tgz#a6331afbfc59189d2135b2e09474457a8e3d28bc" + integrity sha512-6Xmeidsun5rkwnGfMOp6/z9nSzWpHFNVr2Jx7kwoq4mVatQfQx5S56drBgEHF+XQbKOdIaOiMIINvp/kAwMN+w== dependencies: "@babel/helper-module-imports" "^7.0.0" "@babel/helper-plugin-utils" "^7.0.0" From ac6935b629f5e9cd07cca468a6f3588a6e585e25 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Mon, 2 Sep 2019 20:19:16 +0900 Subject: [PATCH 002/134] Bump babel-eslint from 10.0.2 to 10.0.3 (#11723) Bumps [babel-eslint](https://github.com/babel/babel-eslint) from 10.0.2 to 10.0.3. - [Release notes](https://github.com/babel/babel-eslint/releases) - [Commits](https://github.com/babel/babel-eslint/compare/v10.0.2...v10.0.3) Signed-off-by: dependabot-preview[bot] --- package.json | 2 +- yarn.lock | 59 +++++++++++----------------------------------------- 2 files changed, 13 insertions(+), 48 deletions(-) diff --git a/package.json b/package.json index 932aa059e..135ba684a 100644 --- a/package.json +++ b/package.json @@ -169,7 +169,7 @@ "websocket.js": "^0.1.12" }, "devDependencies": { - "babel-eslint": "^10.0.2", + "babel-eslint": "^10.0.3", "babel-jest": "^24.8.0", "enzyme": "^3.10.0", "enzyme-adapter-react-16": "^1.14.0", diff --git a/yarn.lock b/yarn.lock index 51b9c055c..cd8618714 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2,14 +2,7 @@ # yarn lockfile v1 -"@babel/code-frame@^7.0.0": - version "7.0.0" - resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.0.0.tgz#06e2ab19bdb535385559aabb5ba59729482800f8" - integrity sha512-OfC2uemaknXr87bdLUkWog7nYuliM9Ij5HUcajsVcMCpQrcLmtxRbVFTIqmcSkSeYRBFBRxs2FiUqFJDLdiebA== - dependencies: - "@babel/highlight" "^7.0.0" - -"@babel/code-frame@^7.5.5": +"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.5.5": version "7.5.5" resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.5.5.tgz#bc0782f6d69f7b7d49531219699b988f669a8f9d" integrity sha512-27d4lZoomVyo51VegxI20xZPuSHusqbQag/ztrBC7wegWoQ1nLREPVSKSW8byhTlzTKyNE4ifaTA6lCp7JjpFw== @@ -291,12 +284,7 @@ esutils "^2.0.2" js-tokens "^4.0.0" -"@babel/parser@^7.0.0", "@babel/parser@^7.1.0", "@babel/parser@^7.2.2", "@babel/parser@^7.3.4", "@babel/parser@^7.4.4", "@babel/parser@^7.4.5": - version "7.4.5" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.4.5.tgz#04af8d5d5a2b044a2a1bffacc1e5e6673544e872" - integrity sha512-9mUqkL1FF5T7f0WDFfAoDdiMVPWsdD1gZYzSnaXsxUCUqzuch/8of9G3VUSNiZmMBoRxT3neyVsqeiL/ZPcjew== - -"@babel/parser@^7.5.5": +"@babel/parser@^7.0.0", "@babel/parser@^7.1.0", "@babel/parser@^7.2.2", "@babel/parser@^7.3.4", "@babel/parser@^7.4.4", "@babel/parser@^7.4.5", "@babel/parser@^7.5.5": version "7.5.5" resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.5.5.tgz#02f077ac8817d3df4a832ef59de67565e71cca4b" integrity sha512-E5BN68cqR7dhKan1SfqgPGhQ178bkVKpXTPEXnFJBrEt8/DKRZlybmy+IgYLTeN7tp1R5Ccmbm2rBk17sHYU3g== @@ -819,22 +807,7 @@ "@babel/parser" "^7.4.4" "@babel/types" "^7.4.4" -"@babel/traverse@^7.0.0", "@babel/traverse@^7.1.0", "@babel/traverse@^7.1.5", "@babel/traverse@^7.3.4", "@babel/traverse@^7.4.4", "@babel/traverse@^7.4.5": - version "7.4.5" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.4.5.tgz#4e92d1728fd2f1897dafdd321efbff92156c3216" - integrity sha512-Vc+qjynwkjRmIFGxy0KYoPj4FdVDxLej89kMHFsWScq999uX+pwcX4v9mWRjW0KcAYTPAuVQl2LKP1wEVLsp+A== - dependencies: - "@babel/code-frame" "^7.0.0" - "@babel/generator" "^7.4.4" - "@babel/helper-function-name" "^7.1.0" - "@babel/helper-split-export-declaration" "^7.4.4" - "@babel/parser" "^7.4.5" - "@babel/types" "^7.4.4" - debug "^4.1.0" - globals "^11.1.0" - lodash "^4.17.11" - -"@babel/traverse@^7.5.5": +"@babel/traverse@^7.0.0", "@babel/traverse@^7.1.0", "@babel/traverse@^7.1.5", "@babel/traverse@^7.3.4", "@babel/traverse@^7.4.4", "@babel/traverse@^7.4.5", "@babel/traverse@^7.5.5": version "7.5.5" resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.5.5.tgz#f664f8f368ed32988cd648da9f72d5ca70f165bb" integrity sha512-MqB0782whsfffYfSjH4TM+LMjrJnhCNEDMDIjeTpl+ASaUvxcjoiVCo/sM1GhS1pHOXYfWVCYneLjMckuUxDaQ== @@ -1733,17 +1706,17 @@ axobject-query@^2.0.2: dependencies: ast-types-flow "0.0.7" -babel-eslint@^10.0.2: - version "10.0.2" - resolved "https://registry.yarnpkg.com/babel-eslint/-/babel-eslint-10.0.2.tgz#182d5ac204579ff0881684b040560fdcc1558456" - integrity sha512-UdsurWPtgiPgpJ06ryUnuaSXC2s0WoSZnQmEpbAH65XZSdwowgN5MvyP7e88nW07FYXv72erVtpBkxyDVKhH1Q== +babel-eslint@^10.0.3: + version "10.0.3" + resolved "https://registry.yarnpkg.com/babel-eslint/-/babel-eslint-10.0.3.tgz#81a2c669be0f205e19462fed2482d33e4687a88a" + integrity sha512-z3U7eMY6r/3f3/JB9mTsLjyxrv0Yb1zb8PCWCLpguxfCzBIZUwy23R1t/XKewP+8mEN2Ck8Dtr4q20z6ce6SoA== dependencies: "@babel/code-frame" "^7.0.0" "@babel/parser" "^7.0.0" "@babel/traverse" "^7.0.0" "@babel/types" "^7.0.0" - eslint-scope "3.7.1" eslint-visitor-keys "^1.0.0" + resolve "^1.12.0" babel-jest@^24.8.0: version "24.8.0" @@ -3812,14 +3785,6 @@ eslint-plugin-react@~7.14.3: prop-types "^15.7.2" resolve "^1.10.1" -eslint-scope@3.7.1: - version "3.7.1" - resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-3.7.1.tgz#3d63c3edfda02e06e01a452ad88caacc7cdcb6e8" - integrity sha1-PWPD7f2gLgbgGkUq2IyqzHzctug= - dependencies: - esrecurse "^4.1.0" - estraverse "^4.1.1" - eslint-scope@^4.0.0: version "4.0.3" resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-4.0.3.tgz#ca03833310f6889a3264781aa82e63eb9cfe7848" @@ -9019,10 +8984,10 @@ resolve@1.1.7: resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.1.7.tgz#203114d82ad2c5ed9e8e0411b3932875e889e97b" integrity sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs= -resolve@^1.10.0, resolve@^1.10.1, resolve@^1.11.0, resolve@^1.3.2, resolve@^1.5.0, resolve@^1.8.1: - version "1.11.1" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.11.1.tgz#ea10d8110376982fef578df8fc30b9ac30a07a3e" - integrity sha512-vIpgF6wfuJOZI7KKKSP+HmiKggadPQAdsp5HiC1mvqnfp0gF1vdwgBWZIdrVft9pgqoMFQN+R7BSWZiBxx+BBw== +resolve@^1.10.0, resolve@^1.10.1, resolve@^1.11.0, resolve@^1.12.0, resolve@^1.3.2, resolve@^1.5.0, resolve@^1.8.1: + version "1.12.0" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.12.0.tgz#3fc644a35c84a48554609ff26ec52b66fa577df6" + integrity sha512-B/dOmuoAik5bKcD6s6nXDCjzUKnaDvdkRyAk6rsmsKLipWj4797iothd7jmmUhWTfinVMU+wc56rYKsit2Qy4w== dependencies: path-parse "^1.0.6" From 70ddef2654a931827ce5e4323e3042365f6078f2 Mon Sep 17 00:00:00 2001 From: Eugen Rochko Date: Mon, 2 Sep 2019 18:11:13 +0200 Subject: [PATCH 003/134] Change trending hashtags to not disappear instantly after midnight (#11712) --- app/controllers/admin/tags_controller.rb | 2 +- app/lib/feed_manager.rb | 2 +- app/models/tag.rb | 4 +- app/models/trending_tags.rb | 102 ++++++++++++------ .../scheduler/trending_tags_scheduler.rb | 11 ++ config/sidekiq.yml | 3 + .../20190901035623_add_max_score_to_tags.rb | 6 ++ .../20190901040524_remove_score_from_tags.rb | 12 +++ db/schema.rb | 6 +- spec/models/trending_tags_spec.rb | 68 ++++++++++++ 10 files changed, 179 insertions(+), 37 deletions(-) create mode 100644 app/workers/scheduler/trending_tags_scheduler.rb create mode 100644 db/migrate/20190901035623_add_max_score_to_tags.rb create mode 100644 db/post_migrate/20190901040524_remove_score_from_tags.rb create mode 100644 spec/models/trending_tags_spec.rb diff --git a/app/controllers/admin/tags_controller.rb b/app/controllers/admin/tags_controller.rb index 25d9b7d3d..8bd4e5f8b 100644 --- a/app/controllers/admin/tags_controller.rb +++ b/app/controllers/admin/tags_controller.rb @@ -57,7 +57,7 @@ module Admin scope = scope.unreviewed if filter_params[:review] == 'unreviewed' scope = scope.reviewed.order(reviewed_at: :desc) if filter_params[:review] == 'reviewed' scope = scope.pending_review.order(requested_review_at: :desc) if filter_params[:review] == 'pending_review' - scope.order(score: :desc) + scope.order(max_score: :desc) end def filter_params diff --git a/app/lib/feed_manager.rb b/app/lib/feed_manager.rb index ca3d890a8..871ec5c19 100644 --- a/app/lib/feed_manager.rb +++ b/app/lib/feed_manager.rb @@ -63,7 +63,7 @@ class FeedManager reblog_key = key(type, account_id, 'reblogs') # Remove any items past the MAX_ITEMS'th entry in our feed - redis.zremrangebyrank(timeline_key, '0', (-(FeedManager::MAX_ITEMS + 1)).to_s) + redis.zremrangebyrank(timeline_key, 0, -(FeedManager::MAX_ITEMS + 1)) # Get the score of the REBLOG_FALLOFF'th item in our feed, and stop # tracking anything after it for deduplication purposes. diff --git a/app/models/tag.rb b/app/models/tag.rb index 945e3a3c6..135e0a030 100644 --- a/app/models/tag.rb +++ b/app/models/tag.rb @@ -7,14 +7,14 @@ # name :string default(""), not null # created_at :datetime not null # updated_at :datetime not null -# score :integer # usable :boolean # trendable :boolean # listable :boolean # reviewed_at :datetime # requested_review_at :datetime # last_status_at :datetime -# last_trend_at :datetime +# max_score :float +# max_score_at :datetime # class Tag < ApplicationRecord diff --git a/app/models/trending_tags.rb b/app/models/trending_tags.rb index e4ce988c1..e1b92b175 100644 --- a/app/models/trending_tags.rb +++ b/app/models/trending_tags.rb @@ -7,6 +7,8 @@ class TrendingTags THRESHOLD = 5 LIMIT = 10 REVIEW_THRESHOLD = 3 + MAX_SCORE_COOLDOWN = 3.days.freeze + MAX_SCORE_HALFLIFE = 6.hours.freeze class << self include Redisable @@ -16,14 +18,75 @@ class TrendingTags increment_historical_use!(tag.id, at_time) increment_unique_use!(tag.id, account.id, at_time) - increment_vote!(tag, at_time) + increment_use!(tag.id, at_time) tag.update(last_status_at: Time.now.utc) if tag.last_status_at.nil? || tag.last_status_at < 12.hours.ago - tag.update(last_trend_at: Time.now.utc) if trending?(tag) && (tag.last_trend_at.nil? || tag.last_trend_at < 12.hours.ago) + end + + def update!(at_time = Time.now.utc) + tag_ids = redis.smembers("#{KEY}:used:#{at_time.beginning_of_day.to_i}") + redis.zrange(KEY, 0, -1) + tags = Tag.where(id: tag_ids.uniq) + + # First pass to calculate scores and update the set + + tags.each do |tag| + expected = redis.pfcount("activity:tags:#{tag.id}:#{(at_time - 1.day).beginning_of_day.to_i}:accounts").to_f + expected = 1.0 if expected.zero? + observed = redis.pfcount("activity:tags:#{tag.id}:#{at_time.beginning_of_day.to_i}:accounts").to_f + max_time = tag.max_score_at + max_score = tag.max_score + max_score = 0 if max_time.nil? || max_time < (at_time - MAX_SCORE_COOLDOWN) + + score = begin + if expected > observed || observed < THRESHOLD + 0 + else + ((observed - expected)**2) / expected + end + end + + if score > max_score + max_score = score + max_time = at_time + + # Not interested in triggering any callbacks for this + tag.update_columns(max_score: max_score, max_score_at: max_time) + end + + decaying_score = max_score * (0.5**((at_time.to_f - max_time.to_f) / MAX_SCORE_HALFLIFE.to_f)) + + if decaying_score.zero? + redis.zrem(KEY, tag.id) + else + redis.zadd(KEY, decaying_score, tag.id) + end + end + + users_for_review = User.staff.includes(:account).to_a.select(&:allows_trending_tag_emails?) + + # Second pass to notify about previously unreviewed trends + + tags.each do |tag| + current_rank = redis.zrevrank(KEY, tag.id) + needs_review_notification = tag.requires_review? && !tag.requested_review? + rank_passes_threshold = current_rank.present? && current_rank <= REVIEW_THRESHOLD + + next unless !tag.trendable? && rank_passes_threshold && needs_review_notification + + tag.touch(:requested_review_at) + + users_for_review.each do |user| + AdminMailer.new_trending_tag(user.account, tag).deliver_later! + end + end + + # Trim older items + + redis.zremrangebyrank(KEY, 0, -(LIMIT + 1)) end def get(limit, filtered: true) - tag_ids = redis.zrevrange("#{KEY}:#{Time.now.utc.beginning_of_day.to_i}", 0, LIMIT - 1).map(&:to_i) + tag_ids = redis.zrevrange(KEY, 0, LIMIT - 1).map(&:to_i) tags = Tag.where(id: tag_ids) tags = tags.where(trendable: true) if filtered @@ -33,8 +96,8 @@ class TrendingTags end def trending?(tag) - rank = redis.zrevrank("#{KEY}:#{Time.now.utc.beginning_of_day.to_i}", tag.id) - rank.present? && rank <= LIMIT + rank = redis.zrevrank(KEY, tag.id) + rank.present? && rank < LIMIT end private @@ -51,31 +114,10 @@ class TrendingTags redis.expire(key, EXPIRE_HISTORY_AFTER) end - def increment_vote!(tag, at_time) - key = "#{KEY}:#{at_time.beginning_of_day.to_i}" - expected = redis.pfcount("activity:tags:#{tag.id}:#{(at_time - 1.day).beginning_of_day.to_i}:accounts").to_f - expected = 1.0 if expected.zero? - observed = redis.pfcount("activity:tags:#{tag.id}:#{at_time.beginning_of_day.to_i}:accounts").to_f - - if expected > observed || observed < THRESHOLD - redis.zrem(key, tag.id) - else - score = ((observed - expected)**2) / expected - old_rank = redis.zrevrank(key, tag.id) - - redis.zadd(key, score, tag.id) - request_review!(tag) if (old_rank.nil? || old_rank > REVIEW_THRESHOLD) && redis.zrevrank(key, tag.id) <= REVIEW_THRESHOLD && !tag.trendable? && tag.requires_review? && !tag.requested_review? - end - - redis.expire(key, EXPIRE_TRENDS_AFTER) - end - - def request_review!(tag) - return unless Setting.trends - - tag.touch(:requested_review_at) - - User.staff.includes(:account).find_each { |u| AdminMailer.new_trending_tag(u.account, tag).deliver_later! if u.allows_trending_tag_emails? } + def increment_use!(tag_id, at_time) + key = "#{KEY}:used:#{at_time.beginning_of_day.to_i}" + redis.sadd(key, tag_id) + redis.expire(key, EXPIRE_HISTORY_AFTER) end end end diff --git a/app/workers/scheduler/trending_tags_scheduler.rb b/app/workers/scheduler/trending_tags_scheduler.rb new file mode 100644 index 000000000..77f0d5747 --- /dev/null +++ b/app/workers/scheduler/trending_tags_scheduler.rb @@ -0,0 +1,11 @@ +# frozen_string_literal: true + +class Scheduler::TrendingTagsScheduler + include Sidekiq::Worker + + sidekiq_options unique: :until_executed, retry: 0 + + def perform + TrendingTags.update! if Setting.trends + end +end diff --git a/config/sidekiq.yml b/config/sidekiq.yml index 6ebe450b0..5de25de23 100644 --- a/config/sidekiq.yml +++ b/config/sidekiq.yml @@ -9,6 +9,9 @@ scheduled_statuses_scheduler: every: '5m' class: Scheduler::ScheduledStatusesScheduler + trending_tags_scheduler: + every: '5m' + class: Scheduler::TrendingTagsScheduler media_cleanup_scheduler: cron: '<%= Random.rand(0..59) %> <%= Random.rand(3..5) %> * * *' class: Scheduler::MediaCleanupScheduler diff --git a/db/migrate/20190901035623_add_max_score_to_tags.rb b/db/migrate/20190901035623_add_max_score_to_tags.rb new file mode 100644 index 000000000..f936e9871 --- /dev/null +++ b/db/migrate/20190901035623_add_max_score_to_tags.rb @@ -0,0 +1,6 @@ +class AddMaxScoreToTags < ActiveRecord::Migration[5.2] + def change + add_column :tags, :max_score, :float + add_column :tags, :max_score_at, :datetime + end +end diff --git a/db/post_migrate/20190901040524_remove_score_from_tags.rb b/db/post_migrate/20190901040524_remove_score_from_tags.rb new file mode 100644 index 000000000..a1112700b --- /dev/null +++ b/db/post_migrate/20190901040524_remove_score_from_tags.rb @@ -0,0 +1,12 @@ +# frozen_string_literal: true + +class RemoveScoreFromTags < ActiveRecord::Migration[5.2] + disable_ddl_transaction! + + def change + safety_assured do + remove_column :tags, :score, :int + remove_column :tags, :last_trend_at, :datetime + end + end +end diff --git a/db/schema.rb b/db/schema.rb index 482bca367..5576f70bf 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -10,7 +10,7 @@ # # It's strongly recommended that you check this file into your version control system. -ActiveRecord::Schema.define(version: 2019_08_23_221802) do +ActiveRecord::Schema.define(version: 2019_09_01_040524) do # These are extensions that must be enabled in order to support this database enable_extension "plpgsql" @@ -664,14 +664,14 @@ ActiveRecord::Schema.define(version: 2019_08_23_221802) do t.string "name", default: "", null: false t.datetime "created_at", null: false t.datetime "updated_at", null: false - t.integer "score" t.boolean "usable" t.boolean "trendable" t.boolean "listable" t.datetime "reviewed_at" t.datetime "requested_review_at" t.datetime "last_status_at" - t.datetime "last_trend_at" + t.float "max_score" + t.datetime "max_score_at" t.index "lower((name)::text)", name: "index_tags_on_name_lower", unique: true end diff --git a/spec/models/trending_tags_spec.rb b/spec/models/trending_tags_spec.rb new file mode 100644 index 000000000..b6122c994 --- /dev/null +++ b/spec/models/trending_tags_spec.rb @@ -0,0 +1,68 @@ +require 'rails_helper' + +RSpec.describe TrendingTags do + describe '.record_use!' do + pending + end + + describe '.update!' do + let!(:at_time) { Time.now.utc } + let!(:tag1) { Fabricate(:tag, name: 'Catstodon') } + let!(:tag2) { Fabricate(:tag, name: 'DogsOfMastodon') } + let!(:tag3) { Fabricate(:tag, name: 'OCs') } + + before do + allow(Redis.current).to receive(:pfcount) do |key| + case key + when "activity:tags:#{tag1.id}:#{(at_time - 1.day).beginning_of_day.to_i}:accounts" + 2 + when "activity:tags:#{tag1.id}:#{at_time.beginning_of_day.to_i}:accounts" + 16 + when "activity:tags:#{tag2.id}:#{(at_time - 1.day).beginning_of_day.to_i}:accounts" + 0 + when "activity:tags:#{tag2.id}:#{at_time.beginning_of_day.to_i}:accounts" + 4 + when "activity:tags:#{tag3.id}:#{(at_time - 1.day).beginning_of_day.to_i}:accounts" + 13 + end + end + + Redis.current.zadd('trending_tags', 0.9, tag3.id) + Redis.current.sadd("trending_tags:used:#{at_time.beginning_of_day.to_i}", [tag1.id, tag2.id]) + + tag3.update(max_score: 0.9, max_score_at: (at_time - 1.day).beginning_of_day + 12.hours) + + described_class.update!(at_time) + end + + it 'calculates and re-calculates scores' do + expect(described_class.get(10, filtered: false)).to eq [tag1, tag3] + end + + it 'omits hashtags below threshold' do + expect(described_class.get(10, filtered: false)).to_not include(tag2) + end + + it 'decays scores' do + expect(Redis.current.zscore('trending_tags', tag3.id)).to be < 0.9 + end + end + + describe '.trending?' do + let(:tag) { Fabricate(:tag) } + + before do + 10.times { |i| Redis.current.zadd('trending_tags', i + 1, Fabricate(:tag).id) } + end + + it 'returns true if the hashtag is within limit' do + Redis.current.zadd('trending_tags', 11, tag.id) + expect(described_class.trending?(tag)).to be true + end + + it 'returns false if the hashtag is outside the limit' do + Redis.current.zadd('trending_tags', 0, tag.id) + expect(described_class.trending?(tag)).to be false + end + end +end From 6493f4ffaea9ae391a9cc24e2743531fd0c3a3e8 Mon Sep 17 00:00:00 2001 From: ThibG Date: Mon, 2 Sep 2019 18:11:34 +0200 Subject: [PATCH 004/134] Fix height of dashboard counters (#11736) --- app/javascript/styles/mastodon/dashboard.scss | 2 ++ 1 file changed, 2 insertions(+) diff --git a/app/javascript/styles/mastodon/dashboard.scss b/app/javascript/styles/mastodon/dashboard.scss index e4564f062..c0944d417 100644 --- a/app/javascript/styles/mastodon/dashboard.scss +++ b/app/javascript/styles/mastodon/dashboard.scss @@ -15,6 +15,8 @@ padding: 20px; background: lighten($ui-base-color, 4%); border-radius: 4px; + box-sizing: border-box; + height: 100%; } & > a { From 0ea53122f2a0db726afe96cfedd8e7fe3d930e0a Mon Sep 17 00:00:00 2001 From: ThibG Date: Mon, 2 Sep 2019 18:12:12 +0200 Subject: [PATCH 005/134] Fix Mastodon logo style on hover on public pages' footer (#11735) Fixes #11690 --- app/javascript/styles/mastodon/footer.scss | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/javascript/styles/mastodon/footer.scss b/app/javascript/styles/mastodon/footer.scss index f74c004e9..00d290883 100644 --- a/app/javascript/styles/mastodon/footer.scss +++ b/app/javascript/styles/mastodon/footer.scss @@ -128,7 +128,7 @@ &:hover, &:focus, &:active { - svg path { + svg { fill: lighten($ui-base-color, 38%); } } From 1f22b8197cb961371fa761e1fa214d4f4a2074d1 Mon Sep 17 00:00:00 2001 From: mayaeh Date: Tue, 3 Sep 2019 01:12:27 +0900 Subject: [PATCH 006/134] Integrate translation strings for the Profile Directory. (#11722) Run `yarn manage:translations en` --- .../ui/components/navigation_panel.js | 2 +- .../mastodon/locales/defaultMessages.json | 119 +++++++++++++++++- app/javascript/mastodon/locales/en.json | 13 +- app/views/directories/index.html.haml | 2 +- config/locales/en.yml | 1 + 5 files changed, 130 insertions(+), 7 deletions(-) diff --git a/app/javascript/mastodon/features/ui/components/navigation_panel.js b/app/javascript/mastodon/features/ui/components/navigation_panel.js index 6f07778f2..51e3ec037 100644 --- a/app/javascript/mastodon/features/ui/components/navigation_panel.js +++ b/app/javascript/mastodon/features/ui/components/navigation_panel.js @@ -18,7 +18,7 @@ const NavigationPanel = () => ( - {profile_directory && } + {profile_directory && } diff --git a/app/javascript/mastodon/locales/defaultMessages.json b/app/javascript/mastodon/locales/defaultMessages.json index 9118527db..db2d1c7bd 100644 --- a/app/javascript/mastodon/locales/defaultMessages.json +++ b/app/javascript/mastodon/locales/defaultMessages.json @@ -8,6 +8,14 @@ { "defaultMessage": "An unexpected error occurred.", "id": "alert.unexpected.message" + }, + { + "defaultMessage": "Rate limited", + "id": "alert.rate_limited.title" + }, + { + "defaultMessage": "Please retry after {retry_time, time, medium}.", + "id": "alert.rate_limited.message" } ], "path": "app/javascript/mastodon/actions/alerts.json" @@ -191,6 +199,10 @@ "defaultMessage": "Toggle visibility", "id": "media_gallery.toggle_visible" }, + { + "defaultMessage": "Not available", + "id": "status.uncached_media_warning" + }, { "defaultMessage": "Sensitive content", "id": "status.sensitive_warning" @@ -1130,6 +1142,19 @@ ], "path": "app/javascript/mastodon/features/compose/components/upload.json" }, + { + "descriptors": [ + { + "defaultMessage": "Are you sure you want to log out?", + "id": "confirmations.logout.message" + }, + { + "defaultMessage": "Log out", + "id": "confirmations.logout.confirm" + } + ], + "path": "app/javascript/mastodon/features/compose/containers/navigation_container.json" + }, { "descriptors": [ { @@ -1218,6 +1243,14 @@ { "defaultMessage": "Compose new toot", "id": "navigation_bar.compose" + }, + { + "defaultMessage": "Are you sure you want to log out?", + "id": "confirmations.logout.message" + }, + { + "defaultMessage": "Log out", + "id": "confirmations.logout.confirm" } ], "path": "app/javascript/mastodon/features/compose/index.json" @@ -1235,6 +1268,76 @@ ], "path": "app/javascript/mastodon/features/direct_timeline/index.json" }, + { + "descriptors": [ + { + "defaultMessage": "Follow", + "id": "account.follow" + }, + { + "defaultMessage": "Unfollow", + "id": "account.unfollow" + }, + { + "defaultMessage": "Awaiting approval", + "id": "account.requested" + }, + { + "defaultMessage": "Unblock @{name}", + "id": "account.unblock" + }, + { + "defaultMessage": "Unmute @{name}", + "id": "account.unmute" + }, + { + "defaultMessage": "Are you sure you want to unfollow {name}?", + "id": "confirmations.unfollow.message" + }, + { + "defaultMessage": "Toots", + "id": "account.posts" + }, + { + "defaultMessage": "Followers", + "id": "account.followers" + }, + { + "defaultMessage": "Never", + "id": "account.never_active" + }, + { + "defaultMessage": "Last active", + "id": "account.last_status" + } + ], + "path": "app/javascript/mastodon/features/directory/components/account_card.json" + }, + { + "descriptors": [ + { + "defaultMessage": "Browse profiles", + "id": "column.directory" + }, + { + "defaultMessage": "Recently active", + "id": "directory.recently_active" + }, + { + "defaultMessage": "New arrivals", + "id": "directory.new_arrivals" + }, + { + "defaultMessage": "From {domain} only", + "id": "directory.local" + }, + { + "defaultMessage": "From known fediverse", + "id": "directory.federated" + } + ], + "path": "app/javascript/mastodon/features/directory/index.json" + }, { "descriptors": [ { @@ -2312,6 +2415,14 @@ }, { "descriptors": [ + { + "defaultMessage": "Are you sure you want to log out?", + "id": "confirmations.logout.message" + }, + { + "defaultMessage": "Log out", + "id": "confirmations.logout.confirm" + }, { "defaultMessage": "Invite people", "id": "getting_started.invite" @@ -2427,6 +2538,10 @@ "defaultMessage": "Lists", "id": "navigation_bar.lists" }, + { + "defaultMessage": "Profile directory", + "id": "getting_started.directory" + }, { "defaultMessage": "Preferences", "id": "navigation_bar.preferences" @@ -2434,10 +2549,6 @@ { "defaultMessage": "Follows and followers", "id": "navigation_bar.follows_and_followers" - }, - { - "defaultMessage": "Profile directory", - "id": "navigation_bar.profile_directory" } ], "path": "app/javascript/mastodon/features/ui/components/navigation_panel.json" diff --git a/app/javascript/mastodon/locales/en.json b/app/javascript/mastodon/locales/en.json index 6c0c5cbb8..debc755c3 100644 --- a/app/javascript/mastodon/locales/en.json +++ b/app/javascript/mastodon/locales/en.json @@ -16,6 +16,7 @@ "account.follows.empty": "This user doesn't follow anyone yet.", "account.follows_you": "Follows you", "account.hide_reblogs": "Hide boosts from @{name}", + "account.last_status": "Last active", "account.link_verified_on": "Ownership of this link was checked on {date}", "account.locked_info": "This account privacy status is set to locked. The owner manually reviews who can follow them.", "account.media": "Media", @@ -24,6 +25,7 @@ "account.mute": "Mute @{name}", "account.mute_notifications": "Mute notifications from @{name}", "account.muted": "Muted", + "account.never_active": "Never", "account.posts": "Toots", "account.posts_with_replies": "Toots and replies", "account.report": "Report @{name}", @@ -36,6 +38,8 @@ "account.unfollow": "Unfollow", "account.unmute": "Unmute @{name}", "account.unmute_notifications": "Unmute notifications from @{name}", + "alert.rate_limited.message": "Please retry after {retry_time, time, medium}.", + "alert.rate_limited.title": "Rate limited", "alert.unexpected.message": "An unexpected error occurred.", "alert.unexpected.title": "Oops!", "autosuggest_hashtag.per_week": "{count} per week", @@ -49,6 +53,7 @@ "column.blocks": "Blocked users", "column.community": "Local timeline", "column.direct": "Direct messages", + "column.directory": "Browse profiles", "column.domain_blocks": "Hidden domains", "column.favourites": "Favourites", "column.follow_requests": "Follow requests", @@ -95,6 +100,8 @@ "confirmations.delete_list.message": "Are you sure you want to permanently delete this list?", "confirmations.domain_block.confirm": "Hide entire domain", "confirmations.domain_block.message": "Are you really, really sure you want to block the entire {domain}? In most cases a few targeted blocks or mutes are sufficient and preferable. You will not see content from that domain in any public timelines or your notifications. Your followers from that domain will be removed.", + "confirmations.logout.confirm": "Log out", + "confirmations.logout.message": "Are you sure you want to log out?", "confirmations.mute.confirm": "Mute", "confirmations.mute.message": "Are you sure you want to mute {name}?", "confirmations.redraft.confirm": "Delete & redraft", @@ -103,6 +110,10 @@ "confirmations.reply.message": "Replying now will overwrite the message you are currently composing. Are you sure you want to proceed?", "confirmations.unfollow.confirm": "Unfollow", "confirmations.unfollow.message": "Are you sure you want to unfollow {name}?", + "directory.federated": "From known fediverse", + "directory.local": "From {domain} only", + "directory.new_arrivals": "New arrivals", + "directory.recently_active": "Recently active", "embed.instructions": "Embed this status on your website by copying the code below.", "embed.preview": "Here is what it will look like:", "emoji_button.activity": "Activity", @@ -249,7 +260,6 @@ "navigation_bar.personal": "Personal", "navigation_bar.pins": "Pinned toots", "navigation_bar.preferences": "Preferences", - "navigation_bar.profile_directory": "Profile directory", "navigation_bar.public_timeline": "Federated timeline", "navigation_bar.security": "Security", "notification.favourite": "{name} favourited your status", @@ -356,6 +366,7 @@ "status.show_more": "Show more", "status.show_more_all": "Show more for all", "status.show_thread": "Show thread", + "status.uncached_media_warning": "Not available", "status.unmute_conversation": "Unmute conversation", "status.unpin": "Unpin from profile", "suggestions.dismiss": "Dismiss suggestion", diff --git a/app/views/directories/index.html.haml b/app/views/directories/index.html.haml index 30daa6bb1..6bf2ec81e 100644 --- a/app/views/directories/index.html.haml +++ b/app/views/directories/index.html.haml @@ -49,7 +49,7 @@ - if account.last_status_at.present? %time.time-ago{ datetime: account.last_status_at.iso8601, title: l(account.last_status_at) }= l account.last_status_at - else - = t('invites.expires_in_prompt') + = t('accounts.never_active') %small= t('accounts.last_active') diff --git a/config/locales/en.yml b/config/locales/en.yml index 892d13c72..9c9dbc94b 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -58,6 +58,7 @@ en: media: Media moved_html: "%{name} has moved to %{new_profile_link}:" network_hidden: This information is not available + never_active: Never nothing_here: There is nothing here! people_followed_by: People whom %{name} follows people_who_follow: People who follow %{name} From 5466b39c78e0c97a9db6377eefa4c3ce44dc1514 Mon Sep 17 00:00:00 2001 From: Hugo Gameiro Date: Mon, 2 Sep 2019 17:12:40 +0100 Subject: [PATCH 007/134] Add SMTP reply_to option (#11718) * Add SMTP_REPLY_TO in .env.production.sample * Set reply_to in SMTP options --- .env.production.sample | 1 + config/environments/production.rb | 5 ++++- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/.env.production.sample b/.env.production.sample index d66b05050..b322aee1d 100644 --- a/.env.production.sample +++ b/.env.production.sample @@ -69,6 +69,7 @@ SMTP_PORT=587 SMTP_LOGIN= SMTP_PASSWORD= SMTP_FROM_ADDRESS=notifications@example.com +#SMTP_REPLY_TO= #SMTP_DOMAIN= # defaults to LOCAL_DOMAIN #SMTP_DELIVERY_METHOD=smtp # delivery method can also be sendmail #SMTP_AUTH_METHOD=plain diff --git a/config/environments/production.rb b/config/environments/production.rb index d1b5a8df5..29d6194dd 100644 --- a/config/environments/production.rb +++ b/config/environments/production.rb @@ -83,7 +83,10 @@ Rails.application.configure do config.action_mailer.perform_caching = false # E-mails - config.action_mailer.default_options = { from: ENV.fetch('SMTP_FROM_ADDRESS', 'notifications@localhost') } + config.action_mailer.default_options = { + from: ENV.fetch('SMTP_FROM_ADDRESS', 'notifications@localhost'), + reply_to: ENV['SMTP_REPLY_TO'] + } config.action_mailer.smtp_settings = { :port => ENV['SMTP_PORT'], From 34adc8784a3f165a4bd5719a067093f703f499e9 Mon Sep 17 00:00:00 2001 From: Eugen Rochko Date: Tue, 3 Sep 2019 04:56:40 +0200 Subject: [PATCH 008/134] Fix uncached media in web UI not being clickable (#11745) --- app/javascript/mastodon/components/media_gallery.js | 4 ++-- app/javascript/styles/mastodon/components.scss | 6 ++++-- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/app/javascript/mastodon/components/media_gallery.js b/app/javascript/mastodon/components/media_gallery.js index 55e0e77d6..e8dd79af9 100644 --- a/app/javascript/mastodon/components/media_gallery.js +++ b/app/javascript/mastodon/components/media_gallery.js @@ -159,7 +159,7 @@ class Item extends React.PureComponent { if (attachment.get('type') === 'unknown') { return ( @@ -342,7 +342,7 @@ class MediaGallery extends React.PureComponent { return (
-
+
{spoilerButton}
diff --git a/app/javascript/styles/mastodon/components.scss b/app/javascript/styles/mastodon/components.scss index 0b569bb8f..fde5e4c95 100644 --- a/app/javascript/styles/mastodon/components.scss +++ b/app/javascript/styles/mastodon/components.scss @@ -3449,6 +3449,10 @@ a.status-card.compact:hover { height: auto; } + &--click-thru { + pointer-events: none; + } + &--hidden { display: none; } @@ -3479,8 +3483,6 @@ a.status-card.compact:hover { } &:disabled { - cursor: not-allowed; - .spoiler-button__overlay__label { background: rgba($base-overlay-background, 0.5); } From 3221f998dd1fcfc2111178637fbb1f712d9e8388 Mon Sep 17 00:00:00 2001 From: Eugen Rochko Date: Tue, 3 Sep 2019 04:56:54 +0200 Subject: [PATCH 009/134] Change OpenGraph description on sign-up page to reflect invite (#11744) --- app/helpers/instance_helper.rb | 12 ++++++++++++ app/views/auth/registrations/new.html.haml | 2 +- app/views/shared/_og.html.haml | 4 ++-- config/locales/en.yml | 4 ++++ 4 files changed, 19 insertions(+), 3 deletions(-) diff --git a/app/helpers/instance_helper.rb b/app/helpers/instance_helper.rb index dd0b25f3e..daacb535b 100644 --- a/app/helpers/instance_helper.rb +++ b/app/helpers/instance_helper.rb @@ -8,4 +8,16 @@ module InstanceHelper def site_hostname @site_hostname ||= Addressable::URI.parse("//#{Rails.configuration.x.local_domain}").display_uri.host end + + def description_for_sign_up + prefix = begin + if @invite.present? + I18n.t('auth.description.prefix_invited_by_user', name: @invite.user.account.username) + else + I18n.t('auth.description.prefix_sign_up') + end + end + + safe_join([prefix, I18n.t('auth.description.suffix')], ' ') + end end diff --git a/app/views/auth/registrations/new.html.haml b/app/views/auth/registrations/new.html.haml index 83384d737..e807c8d86 100644 --- a/app/views/auth/registrations/new.html.haml +++ b/app/views/auth/registrations/new.html.haml @@ -2,7 +2,7 @@ = t('auth.register') - content_for :header_tags do - = render partial: 'shared/og' + = render partial: 'shared/og', locals: { description: description_for_sign_up } = simple_form_for(resource, as: resource_name, url: registration_path(resource_name)) do |f| = render 'shared/error_messages', object: resource diff --git a/app/views/shared/_og.html.haml b/app/views/shared/_og.html.haml index 67238fc8b..576f47a67 100644 --- a/app/views/shared/_og.html.haml +++ b/app/views/shared/_og.html.haml @@ -1,5 +1,5 @@ -- thumbnail = @instance_presenter.thumbnail -- description = strip_tags(@instance_presenter.site_short_description.presence || @instance_presenter.site_description.presence || t('about.about_mastodon_html')) +- thumbnail = @instance_presenter.thumbnail +- description ||= strip_tags(@instance_presenter.site_short_description.presence || @instance_presenter.site_description.presence || t('about.about_mastodon_html')) %meta{ name: 'description', content: description }/ diff --git a/config/locales/en.yml b/config/locales/en.yml index 9c9dbc94b..ad29e0a74 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -569,6 +569,10 @@ en: checkbox_agreement_without_rules_html: I agree to the terms of service delete_account: Delete account delete_account_html: If you wish to delete your account, you can proceed here. You will be asked for confirmation. + description: + prefix_invited_by_user: "@%{name} invites you to join this server of Mastodon!" + prefix_sign_up: Sign up on Mastodon today! + suffix: With an account, you will be able to follow people, post updates and exchange messages with users from any Mastodon server and more! didnt_get_confirmation: Didn't receive confirmation instructions? forgot_password: Forgot your password? invalid_reset_password_token: Password reset token is invalid or expired. Please request a new one. From 16c1abdb2d493012f0f0fd5eb36324d2f0cd91d9 Mon Sep 17 00:00:00 2001 From: Eugen Rochko Date: Tue, 3 Sep 2019 04:57:07 +0200 Subject: [PATCH 010/134] Fix user preference to show trends not working on public pages (#11740) Fix #11738 --- app/views/application/_sidebar.html.haml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/views/application/_sidebar.html.haml b/app/views/application/_sidebar.html.haml index 90c8f9dd1..33e7c96fe 100644 --- a/app/views/application/_sidebar.html.haml +++ b/app/views/application/_sidebar.html.haml @@ -5,7 +5,7 @@ .hero-widget__text %p= @instance_presenter.site_short_description.html_safe.presence || @instance_presenter.site_description.html_safe.presence || t('about.generic_description', domain: site_hostname) -- if Setting.trends +- if Setting.trends && !(user_signed_in? && !current_user.setting_trends) - trends = TrendingTags.get(3) - unless trends.empty? From 92a6fa6c90fda809554ae2cac10036202723f5c9 Mon Sep 17 00:00:00 2001 From: Eugen Rochko Date: Tue, 3 Sep 2019 05:57:30 +0200 Subject: [PATCH 011/134] Fix error in user warning template (#11741) --- app/views/user_mailer/warning.html.haml | 4 ++-- app/views/user_mailer/warning.text.erb | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/app/views/user_mailer/warning.html.haml b/app/views/user_mailer/warning.html.haml index 1105f2062..89dc2a75d 100644 --- a/app/views/user_mailer/warning.html.haml +++ b/app/views/user_mailer/warning.html.haml @@ -42,11 +42,11 @@ - unless @warning.text.blank? = Formatter.instance.linkify(@warning.text) - - unless @statuses&.empty? + - if !@statuses.nil? && !@statuses.empty? %p %strong= t('user_mailer.warning.statuses') -- unless @statuses&.empty? +- if !@statuses.nil? && !@statuses.empty? - @statuses.each_with_index do |status, i| = render 'notification_mailer/status', status: status, i: i + 1, highlighted: true diff --git a/app/views/user_mailer/warning.text.erb b/app/views/user_mailer/warning.text.erb index 45ad3b64d..bb6610c79 100644 --- a/app/views/user_mailer/warning.text.erb +++ b/app/views/user_mailer/warning.text.erb @@ -7,7 +7,7 @@ <% end %> <%= @warning.text %> -<% unless @statuses&.empty? %> +<% if !@statuses.nil? && !@statuses.empty? %> <%= t('user_mailer.warning.statuses') %> <% @statuses.each do |status| %> From d19d86fe2b26fb00577d600234c32d726fb199a4 Mon Sep 17 00:00:00 2001 From: Eugen Rochko Date: Tue, 3 Sep 2019 06:35:44 +0200 Subject: [PATCH 012/134] Change hashtag component in web UI to show numbers for 2 last days (#11742) To deal with the midnight problem --- app/javascript/mastodon/components/hashtag.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/javascript/mastodon/components/hashtag.js b/app/javascript/mastodon/components/hashtag.js index f091d7893..2456eac9e 100644 --- a/app/javascript/mastodon/components/hashtag.js +++ b/app/javascript/mastodon/components/hashtag.js @@ -12,11 +12,11 @@ const Hashtag = ({ hashtag }) => ( #{hashtag.get('name')} - {shortNumberFormat(hashtag.getIn(['history', 0, 'accounts']))} }} /> + {shortNumberFormat(hashtag.getIn(['history', 0, 'accounts']) + hashtag.getIn(['history', 1, 'accounts']))} }} />
- {shortNumberFormat(hashtag.getIn(['history', 0, 'uses']))} + {shortNumberFormat(hashtag.getIn(['history', 0, 'uses']) + hashtag.getIn(['history', 1, 'uses']))}
From ec1dd865fb09de2505e24001bdb5f3ac82f34a43 Mon Sep 17 00:00:00 2001 From: Eugen Rochko Date: Tue, 3 Sep 2019 07:59:52 +0200 Subject: [PATCH 013/134] Fix error in admin UI for hashtag usage breakdown (#11743) --- app/views/admin/tags/show.html.haml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/views/admin/tags/show.html.haml b/app/views/admin/tags/show.html.haml index f9677874a..d54a43c1e 100644 --- a/app/views/admin/tags/show.html.haml +++ b/app/views/admin/tags/show.html.haml @@ -38,7 +38,7 @@ .table-wrapper %table.table %tbody - - total = @usage_by_domain.sum(&:statuses_count).to_f + - total = @usage_by_domain.sum(&:last).to_f - @usage_by_domain.each do |(domain, count)| %tr From 692c5b439ae8659e459da692cf9e6b8e6f29d2a1 Mon Sep 17 00:00:00 2001 From: ThibG Date: Tue, 3 Sep 2019 22:52:32 +0200 Subject: [PATCH 014/134] Fix ActivityPub context not being dynamically computed (#11746) * Fix contexts not being dynamically included Fixes #11649 * Refactor Note context in serializer * Refactor Actor serializer --- app/lib/activitypub/adapter.rb | 13 +++++++------ app/lib/activitypub/serializer.rb | 8 ++++++++ .../activitypub/actor_serializer.rb | 4 +++- .../activitypub/note_serializer.rb | 7 +++++-- .../initializers/active_model_serializers.rb | 19 ------------------- spec/lib/activitypub/activity/update_spec.rb | 2 +- 6 files changed, 24 insertions(+), 29 deletions(-) diff --git a/app/lib/activitypub/adapter.rb b/app/lib/activitypub/adapter.rb index 1c58be8c0..cb2ac72d4 100644 --- a/app/lib/activitypub/adapter.rb +++ b/app/lib/activitypub/adapter.rb @@ -32,22 +32,23 @@ class ActivityPub::Adapter < ActiveModelSerializers::Adapter::Base end def serializable_hash(options = nil) + named_contexts = {} + context_extensions = {} options = serialization_options(options) - serialized_hash = serializer.serializable_hash(options) + serialized_hash = serializer.serializable_hash(options.merge(named_contexts: named_contexts, context_extensions: context_extensions)) serialized_hash = serialized_hash.select { |k, _| options[:fields].include?(k) } if options[:fields] serialized_hash = self.class.transform_key_casing!(serialized_hash, instance_options) - { '@context' => serialized_context }.merge(serialized_hash) + { '@context' => serialized_context(named_contexts, context_extensions) }.merge(serialized_hash) end private - def serialized_context + def serialized_context(named_contexts_map, context_extensions_map) context_array = [] - serializer_options = serializer.send(:instance_options) || {} - named_contexts = [:activitystreams] + serializer._named_contexts.keys + serializer_options.fetch(:named_contexts, {}).keys - context_extensions = serializer._context_extensions.keys + serializer_options.fetch(:context_extensions, {}).keys + named_contexts = [:activitystreams] + named_contexts_map.keys + context_extensions = context_extensions_map.keys named_contexts.each do |key| context_array << NAMED_CONTEXT_MAP[key] diff --git a/app/lib/activitypub/serializer.rb b/app/lib/activitypub/serializer.rb index 07bd8c494..1fdc79310 100644 --- a/app/lib/activitypub/serializer.rb +++ b/app/lib/activitypub/serializer.rb @@ -27,4 +27,12 @@ class ActivityPub::Serializer < ActiveModel::Serializer _context_extensions[extension_name] = true end end + + def serializable_hash(adapter_options = nil, options = {}, adapter_instance = self.class.serialization_adapter_instance) + unless adapter_options&.fetch(:named_contexts, nil).nil? + adapter_options[:named_contexts].merge!(_named_contexts) + adapter_options[:context_extensions].merge!(_context_extensions) + end + super(adapter_options, options, adapter_instance) + end end diff --git a/app/serializers/activitypub/actor_serializer.rb b/app/serializers/activitypub/actor_serializer.rb index 222e17c99..17df85de3 100644 --- a/app/serializers/activitypub/actor_serializer.rb +++ b/app/serializers/activitypub/actor_serializer.rb @@ -6,7 +6,7 @@ class ActivityPub::ActorSerializer < ActivityPub::Serializer context :security context_extensions :manually_approves_followers, :featured, :also_known_as, - :moved_to, :property_value, :hashtag, :emoji, :identity_proof, + :moved_to, :property_value, :identity_proof, :discoverable attributes :id, :type, :following, :followers, @@ -138,6 +138,8 @@ class ActivityPub::ActorSerializer < ActivityPub::Serializer end class TagSerializer < ActivityPub::Serializer + context_extensions :hashtag + include RoutingHelper attributes :type, :href, :name diff --git a/app/serializers/activitypub/note_serializer.rb b/app/serializers/activitypub/note_serializer.rb index 7592e0b1a..364d3eda5 100644 --- a/app/serializers/activitypub/note_serializer.rb +++ b/app/serializers/activitypub/note_serializer.rb @@ -1,8 +1,7 @@ # frozen_string_literal: true class ActivityPub::NoteSerializer < ActivityPub::Serializer - context_extensions :atom_uri, :conversation, :sensitive, - :hashtag, :emoji, :focal_point, :blurhash + context_extensions :atom_uri, :conversation, :sensitive attributes :id, :type, :summary, :in_reply_to, :published, :url, @@ -151,6 +150,8 @@ class ActivityPub::NoteSerializer < ActivityPub::Serializer end class MediaAttachmentSerializer < ActivityPub::Serializer + context_extensions :blurhash, :focal_point + include RoutingHelper attributes :type, :media_type, :url, :name, :blurhash @@ -198,6 +199,8 @@ class ActivityPub::NoteSerializer < ActivityPub::Serializer end class TagSerializer < ActivityPub::Serializer + context_extensions :hashtag + include RoutingHelper attributes :type, :href, :name diff --git a/config/initializers/active_model_serializers.rb b/config/initializers/active_model_serializers.rb index 329a5fb2c..0e69e1d96 100644 --- a/config/initializers/active_model_serializers.rb +++ b/config/initializers/active_model_serializers.rb @@ -3,22 +3,3 @@ ActiveModelSerializers.config.tap do |config| end ActiveSupport::Notifications.unsubscribe(ActiveModelSerializers::Logging::RENDER_EVENT) - -class ActiveModel::Serializer::Reflection - # We monkey-patch this method so that when we include associations in a serializer, - # the nested serializers can send information about used contexts upwards back to - # the root. We do this via instance_options because the nesting can be dynamic. - def build_association(parent_serializer, parent_serializer_options, include_slice = {}) - serializer = options[:serializer] - - parent_serializer_options.merge!(named_contexts: serializer._named_contexts, context_extensions: serializer._context_extensions) if serializer.respond_to?(:_named_contexts) - - association_options = { - parent_serializer: parent_serializer, - parent_serializer_options: parent_serializer_options, - include_slice: include_slice, - } - - ActiveModel::Serializer::Association.new(self, association_options) - end -end diff --git a/spec/lib/activitypub/activity/update_spec.rb b/spec/lib/activitypub/activity/update_spec.rb index fbfc585cf..42da29860 100644 --- a/spec/lib/activitypub/activity/update_spec.rb +++ b/spec/lib/activitypub/activity/update_spec.rb @@ -19,7 +19,7 @@ RSpec.describe ActivityPub::Activity::Update do end let(:actor_json) do - ActiveModelSerializers::SerializableResource.new(modified_sender, serializer: ActivityPub::ActorSerializer, key_transform: :camel_lower).as_json + ActiveModelSerializers::SerializableResource.new(modified_sender, serializer: ActivityPub::ActorSerializer, adapter: ActivityPub::Adapter).as_json end let(:json) do From c1e238a77b1f92a031fcb644c2d37809b96e9027 Mon Sep 17 00:00:00 2001 From: ThibG Date: Tue, 3 Sep 2019 22:53:27 +0200 Subject: [PATCH 015/134] Fix admin interface showing superfluous reject media/reports on suspended blocks (#11749) * Fix admin interface showing superfluous reject media/reports on suspended domains * Fix reject media/reports checkboxes being visible when editing domain block of suspend severity --- app/javascript/packs/admin.js | 10 +++++++++- app/views/admin/instances/index.html.haml | 19 ++++++++++--------- 2 files changed, 19 insertions(+), 10 deletions(-) diff --git a/app/javascript/packs/admin.js b/app/javascript/packs/admin.js index f0c0ee0b7..42c747d2e 100644 --- a/app/javascript/packs/admin.js +++ b/app/javascript/packs/admin.js @@ -1,4 +1,5 @@ import { delegate } from 'rails-ujs'; +import ready from '../mastodon/ready'; const batchCheckboxClassName = '.batch-checkbox input[type="checkbox"]'; @@ -29,7 +30,7 @@ delegate(document, '.media-spoiler-hide-button', 'click', () => { }); }); -delegate(document, '#domain_block_severity', 'change', ({ target }) => { +const onDomainBlockSeverityChange = (target) => { const rejectMediaDiv = document.querySelector('.input.with_label.domain_block_reject_media'); const rejectReportsDiv = document.querySelector('.input.with_label.domain_block_reject_reports'); @@ -40,4 +41,11 @@ delegate(document, '#domain_block_severity', 'change', ({ target }) => { if (rejectReportsDiv) { rejectReportsDiv.style.display = (target.value === 'suspend') ? 'none' : 'block'; } +}; + +delegate(document, '#domain_block_severity', 'change', ({ target }) => onDomainBlockSeverityChange(target)); + +ready(() => { + const input = document.getElementById('domain_block_severity'); + if (input) onDomainBlockSeverityChange(input); }); diff --git a/app/views/admin/instances/index.html.haml b/app/views/admin/instances/index.html.haml index 982dc5035..1d85aa75e 100644 --- a/app/views/admin/instances/index.html.haml +++ b/app/views/admin/instances/index.html.haml @@ -44,15 +44,16 @@ - if !instance.domain_block.noop? = t("admin.domain_blocks.severity.#{instance.domain_block.severity}") - first_item = false - - if instance.domain_block.reject_media? - - unless first_item - • - = t('admin.domain_blocks.rejecting_media') - - first_item = false - - if instance.domain_block.reject_reports? - - unless first_item - • - = t('admin.domain_blocks.rejecting_reports') + - unless instance.domain_block.suspend? + - if instance.domain_block.reject_media? + - unless first_item + • + = t('admin.domain_blocks.rejecting_media') + - first_item = false + - if instance.domain_block.reject_reports? + - unless first_item + • + = t('admin.domain_blocks.rejecting_reports') - elsif whitelist_mode? = t('admin.accounts.whitelisted') - else From 43f56f12917f154fbb70cbc305daba9e2fd364ed Mon Sep 17 00:00:00 2001 From: Eugen Rochko Date: Wed, 4 Sep 2019 04:13:54 +0200 Subject: [PATCH 016/134] Change account deletion page to have better explanations (#11753) Fix deletion of unconfirmed account not freeing up the username Add prefill of logged-in user's email in the reconfirmation form --- .../auth/confirmations_controller.rb | 23 ++++++++++++++++++ app/javascript/styles/mastodon/forms.scss | 9 +++++++ app/services/suspend_account_service.rb | 1 + app/views/auth/setup/show.html.haml | 5 +--- app/views/auth/shared/_links.html.haml | 22 ++++++++++------- app/views/settings/deletes/show.html.haml | 24 +++++++++++++------ config/locales/en.yml | 16 +++++++++---- 7 files changed, 77 insertions(+), 23 deletions(-) diff --git a/app/controllers/auth/confirmations_controller.rb b/app/controllers/auth/confirmations_controller.rb index 0d7c6e7c2..3e419eb96 100644 --- a/app/controllers/auth/confirmations_controller.rb +++ b/app/controllers/auth/confirmations_controller.rb @@ -4,15 +4,38 @@ class Auth::ConfirmationsController < Devise::ConfirmationsController layout 'auth' before_action :set_body_classes + before_action :require_unconfirmed! skip_before_action :require_functional! + def new + super + + resource.email = current_user.unconfirmed_email || current_user.email if user_signed_in? + end + private + def require_unconfirmed! + redirect_to edit_user_registration_path if user_signed_in? && current_user.confirmed? && current_user.unconfirmed_email.blank? + end + def set_body_classes @body_classes = 'lighter' end + def after_resending_confirmation_instructions_path_for(_resource_name) + if user_signed_in? + if user.confirmed? && user.approved? + edit_user_registration_path + else + auth_setup_path + end + else + new_user_session_path + end + end + def after_confirmation_path_for(_resource_name, user) if user.created_by_application && truthy_param?(:redirect_to_app) user.created_by_application.redirect_uri diff --git a/app/javascript/styles/mastodon/forms.scss b/app/javascript/styles/mastodon/forms.scss index ac99124ea..16352340b 100644 --- a/app/javascript/styles/mastodon/forms.scss +++ b/app/javascript/styles/mastodon/forms.scss @@ -112,6 +112,15 @@ code { padding: 0.2em 0.4em; background: darken($ui-base-color, 12%); } + + li { + list-style: disc; + margin-left: 18px; + } + } + + ul.hint { + margin-bottom: 15px; } span.hint { diff --git a/app/services/suspend_account_service.rb b/app/services/suspend_account_service.rb index 902af376c..85da7e921 100644 --- a/app/services/suspend_account_service.rb +++ b/app/services/suspend_account_service.rb @@ -61,6 +61,7 @@ class SuspendAccountService < BaseService return if !@account.local? || @account.user.nil? if @options[:including_user] + @options[:destroy] = true if !@account.user_confirmed? || @account.user_pending? @account.user.destroy else @account.user.disable! diff --git a/app/views/auth/setup/show.html.haml b/app/views/auth/setup/show.html.haml index 8bb44ca7f..c14fed56f 100644 --- a/app/views/auth/setup/show.html.haml +++ b/app/views/auth/setup/show.html.haml @@ -17,7 +17,4 @@ .simple_form %p.hint= t('auth.setup.email_settings_hint_html', email: content_tag(:strong, @user.email)) -.form-footer - %ul.no-list - %li= link_to t('settings.account_settings'), edit_user_registration_path - %li= link_to t('auth.logout'), destroy_user_session_path, data: { method: :delete } +.form-footer= render 'auth/shared/links' diff --git a/app/views/auth/shared/_links.html.haml b/app/views/auth/shared/_links.html.haml index 3c68ccd22..e6c3f7cca 100644 --- a/app/views/auth/shared/_links.html.haml +++ b/app/views/auth/shared/_links.html.haml @@ -1,12 +1,18 @@ %ul.no-list - - if controller_name != 'sessions' - %li= link_to t('auth.login'), new_session_path(resource_name) + - if user_signed_in? + %li= link_to t('settings.account_settings'), edit_user_registration_path + - else + - if controller_name != 'sessions' + %li= link_to t('auth.login'), new_user_session_path - - if devise_mapping.registerable? && controller_name != 'registrations' - %li= link_to t('auth.register'), available_sign_up_path + - if controller_name != 'registrations' + %li= link_to t('auth.register'), available_sign_up_path - - if devise_mapping.recoverable? && controller_name != 'passwords' && controller_name != 'registrations' - %li= link_to t('auth.forgot_password'), new_password_path(resource_name) + - if controller_name != 'passwords' && controller_name != 'registrations' + %li= link_to t('auth.forgot_password'), new_user_password_path - - if devise_mapping.confirmable? && controller_name != 'confirmations' - %li= link_to t('auth.didnt_get_confirmation'), new_confirmation_path(resource_name) + - if controller_name != 'confirmations' + %li= link_to t('auth.didnt_get_confirmation'), new_user_confirmation_path + + - if user_signed_in? && controller_name != 'setup' + %li= link_to t('auth.logout'), destroy_user_session_path, data: { method: :delete } diff --git a/app/views/settings/deletes/show.html.haml b/app/views/settings/deletes/show.html.haml index b246f83a1..6e2ff31c5 100644 --- a/app/views/settings/deletes/show.html.haml +++ b/app/views/settings/deletes/show.html.haml @@ -2,15 +2,25 @@ = t('settings.delete') = simple_form_for @confirmation, url: settings_delete_path, method: :delete do |f| - .warning - %strong - = fa_icon('warning') - = t('deletes.warning_title') - = t('deletes.warning_html') + %p.hint= t('deletes.warning.before') - %p.hint= t('deletes.description_html') + %ul.hint + - if current_user.confirmed? && current_user.approved? + %li.warning-hint= t('deletes.warning.irreversible') + %li.warning-hint= t('deletes.warning.username_unavailable') + %li.warning-hint= t('deletes.warning.data_removal') + %li.warning-hint= t('deletes.warning.caches') + - else + %li.positive-hint= t('deletes.warning.email_change_html', path: edit_user_registration_path) + %li.positive-hint= t('deletes.warning.email_reconfirmation_html', path: new_user_confirmation_path) + %li.positive-hint= t('deletes.warning.email_contact_html', email: Setting.site_contact_email) + %li.positive-hint= t('deletes.warning.username_available') - = f.input :password, placeholder: t('simple_form.labels.defaults.current_password'), input_html: { 'aria-label' => t('simple_form.labels.defaults.current_password'), :autocomplete => 'off' }, hint: t('deletes.confirm_password') + %p.hint= t('deletes.warning.more_details_html', terms_path: terms_path) + + %hr.spacer/ + + = f.input :password, wrapper: :with_block_label, input_html: { :autocomplete => 'off' }, hint: t('deletes.confirm_password') .actions = f.button :button, t('deletes.proceed'), type: :submit, class: 'negative' diff --git a/config/locales/en.yml b/config/locales/en.yml index ad29e0a74..687f5f2a0 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -626,13 +626,21 @@ en: x_months: "%{count}mo" x_seconds: "%{count}s" deletes: - bad_password_msg: Nice try, hackers! Incorrect password + bad_password_msg: The password you entered was incorrect confirm_password: Enter your current password to verify your identity - description_html: This will permanently, irreversibly remove content from your account and deactivate it. Your username will remain reserved to prevent future impersonations. proceed: Delete account success_msg: Your account was successfully deleted - warning_html: Only deletion of content from this particular server is guaranteed. Content that has been widely shared is likely to leave traces. Offline servers and servers that have unsubscribed from your updates will not update their databases. - warning_title: Disseminated content availability + warning: + before: 'Before proceeding, please read these notes carefully:' + caches: Content that has been cached by other servers may persist + data_removal: Your posts and other data will be permanently removed + email_change_html: You can change your e-mail address without deleting your account + email_contact_html: If it still doesn't arrive, you can e-mail %{email} for help + email_reconfirmation_html: If you are not receiving the confirmation e-mail, you can request it again + irreversible: You will not be able to restore or reactivate your account + more_details_html: For more details, see the privacy policy. + username_available: Your username will become available again + username_unavailable: Your username will remain unavailable directories: directory: Profile directory explanation: Discover users based on their interests From 1a00bd9244ee8555d7401f4f0ee01ec381e96c1c Mon Sep 17 00:00:00 2001 From: Eugen Rochko Date: Wed, 4 Sep 2019 04:14:13 +0200 Subject: [PATCH 017/134] Fix wrong pluralization in hashtag component in web UI (#11754) --- app/javascript/mastodon/components/hashtag.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/javascript/mastodon/components/hashtag.js b/app/javascript/mastodon/components/hashtag.js index 2456eac9e..68b9be72d 100644 --- a/app/javascript/mastodon/components/hashtag.js +++ b/app/javascript/mastodon/components/hashtag.js @@ -12,7 +12,7 @@ const Hashtag = ({ hashtag }) => ( #{hashtag.get('name')} - {shortNumberFormat(hashtag.getIn(['history', 0, 'accounts']) + hashtag.getIn(['history', 1, 'accounts']))} }} /> + {shortNumberFormat(hashtag.getIn(['history', 0, 'accounts']) + hashtag.getIn(['history', 1, 'accounts']))} }} />
From a6a63358c3fd81b9104aa0a51133cd065eea4a84 Mon Sep 17 00:00:00 2001 From: Eugen Rochko Date: Wed, 4 Sep 2019 10:10:18 +0200 Subject: [PATCH 018/134] Fix wrong sum of usage in hashtag component in web UI (#11755) 1 + 1 = 11 --- app/javascript/mastodon/components/hashtag.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/javascript/mastodon/components/hashtag.js b/app/javascript/mastodon/components/hashtag.js index 68b9be72d..62d613262 100644 --- a/app/javascript/mastodon/components/hashtag.js +++ b/app/javascript/mastodon/components/hashtag.js @@ -12,11 +12,11 @@ const Hashtag = ({ hashtag }) => ( #{hashtag.get('name')} - {shortNumberFormat(hashtag.getIn(['history', 0, 'accounts']) + hashtag.getIn(['history', 1, 'accounts']))} }} /> + {shortNumberFormat(hashtag.getIn(['history', 0, 'accounts']) * 1 + hashtag.getIn(['history', 1, 'accounts']) * 1)} }} />
- {shortNumberFormat(hashtag.getIn(['history', 0, 'uses']) + hashtag.getIn(['history', 1, 'uses']))} + {shortNumberFormat(hashtag.getIn(['history', 0, 'uses']) * 1 + hashtag.getIn(['history', 1, 'uses']) * 1)}
From 15d6a10c02c6e98a937a84772a37644d7e865743 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Thu, 5 Sep 2019 01:42:35 +0900 Subject: [PATCH 019/134] Bump webmock from 3.6.2 to 3.7.1 (#11734) Bumps [webmock](https://github.com/bblimke/webmock) from 3.6.2 to 3.7.1. - [Release notes](https://github.com/bblimke/webmock/releases) - [Changelog](https://github.com/bblimke/webmock/blob/master/CHANGELOG.md) - [Commits](https://github.com/bblimke/webmock/compare/v3.6.2...v3.7.1) Signed-off-by: dependabot-preview[bot] --- Gemfile | 2 +- Gemfile.lock | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Gemfile b/Gemfile index e40dea54f..9dcd06ea3 100644 --- a/Gemfile +++ b/Gemfile @@ -118,7 +118,7 @@ group :test do gem 'rails-controller-testing', '~> 1.0' gem 'rspec-sidekiq', '~> 3.0' gem 'simplecov', '~> 0.17', require: false - gem 'webmock', '~> 3.6' + gem 'webmock', '~> 3.7' gem 'parallel_tests', '~> 2.29' end diff --git a/Gemfile.lock b/Gemfile.lock index be310c24a..872ae3bc4 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -644,7 +644,7 @@ GEM uniform_notifier (1.12.1) warden (1.2.8) rack (>= 2.0.6) - webmock (3.6.2) + webmock (3.7.1) addressable (>= 2.3.6) crack (>= 0.3.2) hashdiff (>= 0.4.0, < 2.0.0) @@ -784,7 +784,7 @@ DEPENDENCIES tty-prompt (~> 0.19) twitter-text (~> 1.14) tzinfo-data (~> 1.2019) - webmock (~> 3.6) + webmock (~> 3.7) webpacker (~> 4.0) webpush From e9dbb955a887f5e94b5b7320bb378d09e88870d6 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Thu, 5 Sep 2019 01:44:01 +0900 Subject: [PATCH 020/134] Bump faker from 2.1.2 to 2.2.1 (#11733) Bumps [faker](https://github.com/faker-ruby/faker) from 2.1.2 to 2.2.1. - [Release notes](https://github.com/faker-ruby/faker/releases) - [Changelog](https://github.com/faker-ruby/faker/blob/master/CHANGELOG.md) - [Commits](https://github.com/faker-ruby/faker/compare/v2.1.2...v2.2.1) Signed-off-by: dependabot-preview[bot] --- Gemfile | 2 +- Gemfile.lock | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Gemfile b/Gemfile index 9dcd06ea3..72a444876 100644 --- a/Gemfile +++ b/Gemfile @@ -113,7 +113,7 @@ end group :test do gem 'capybara', '~> 3.28' gem 'climate_control', '~> 0.2' - gem 'faker', '~> 2.1' + gem 'faker', '~> 2.2' gem 'microformats', '~> 4.1' gem 'rails-controller-testing', '~> 1.0' gem 'rspec-sidekiq', '~> 3.0' diff --git a/Gemfile.lock b/Gemfile.lock index 872ae3bc4..54ea059ea 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -231,7 +231,7 @@ GEM tzinfo excon (0.62.0) fabrication (2.20.2) - faker (2.1.2) + faker (2.2.1) i18n (>= 0.8) faraday (0.15.0) multipart-post (>= 1.2, < 3) @@ -698,7 +698,7 @@ DEPENDENCIES doorkeeper (~> 5.1) dotenv-rails (~> 2.7) fabrication (~> 2.20) - faker (~> 2.1) + faker (~> 2.2) fast_blank (~> 1.0) fastimage fog-core (<= 2.1.0) From beba6824e1a15b4c8323150fef11d30c0d2b9d0a Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Thu, 5 Sep 2019 01:45:20 +0900 Subject: [PATCH 021/134] Bump bootsnap from 1.4.4 to 1.4.5 (#11730) Bumps [bootsnap](https://github.com/Shopify/bootsnap) from 1.4.4 to 1.4.5. - [Release notes](https://github.com/Shopify/bootsnap/releases) - [Changelog](https://github.com/Shopify/bootsnap/blob/master/CHANGELOG.md) - [Commits](https://github.com/Shopify/bootsnap/compare/v1.4.4...v1.4.5) Signed-off-by: dependabot-preview[bot] --- Gemfile.lock | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Gemfile.lock b/Gemfile.lock index 54ea059ea..8fee0532d 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -122,7 +122,7 @@ GEM debug_inspector (>= 0.0.1) blurhash (0.1.3) ffi (~> 1.10.0) - bootsnap (1.4.4) + bootsnap (1.4.5) msgpack (~> 1.0) brakeman (4.6.1) browser (2.6.1) @@ -369,7 +369,7 @@ GEM mini_mime (1.0.2) mini_portile2 (2.4.0) minitest (5.11.3) - msgpack (1.2.10) + msgpack (1.3.1) multi_json (1.13.1) multipart-post (2.0.0) necromancer (0.5.0) From 1b3c2598fa8090835f2ddfb9d2b0917c7752fcce Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Thu, 5 Sep 2019 01:45:44 +0900 Subject: [PATCH 022/134] Bump rubocop-rails from 2.3.1 to 2.3.2 (#11728) Bumps [rubocop-rails](https://github.com/rubocop-hq/rubocop-rails) from 2.3.1 to 2.3.2. - [Release notes](https://github.com/rubocop-hq/rubocop-rails/releases) - [Changelog](https://github.com/rubocop-hq/rubocop-rails/blob/master/CHANGELOG.md) - [Commits](https://github.com/rubocop-hq/rubocop-rails/compare/v2.3.1...v2.3.2) Signed-off-by: dependabot-preview[bot] --- Gemfile.lock | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Gemfile.lock b/Gemfile.lock index 8fee0532d..475a27fb2 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -416,7 +416,7 @@ GEM parallel (1.17.0) parallel_tests (2.29.2) parallel - parser (2.6.3.0) + parser (2.6.4.0) ast (~> 2.4.0) parslet (1.8.2) pastel (0.7.2) @@ -554,7 +554,7 @@ GEM rainbow (>= 2.2.2, < 4.0) ruby-progressbar (~> 1.7) unicode-display_width (>= 1.4.0, < 1.7) - rubocop-rails (2.3.1) + rubocop-rails (2.3.2) rack (>= 1.1) rubocop (>= 0.72.0) ruby-progressbar (1.10.1) From 80f86f290f7d1aea4755fb521ef0cf30c02b82a2 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Thu, 5 Sep 2019 01:46:37 +0900 Subject: [PATCH 023/134] Bump aws-sdk-s3 from 1.46.0 to 1.48.0 (#11729) Bumps [aws-sdk-s3](https://github.com/aws/aws-sdk-ruby) from 1.46.0 to 1.48.0. - [Release notes](https://github.com/aws/aws-sdk-ruby/releases) - [Changelog](https://github.com/aws/aws-sdk-ruby/blob/master/gems/aws-sdk-s3/CHANGELOG.md) - [Commits](https://github.com/aws/aws-sdk-ruby/compare/v1.46.0...v1.48.0) Signed-off-by: dependabot-preview[bot] --- Gemfile | 2 +- Gemfile.lock | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/Gemfile b/Gemfile index 72a444876..932b8a1ad 100644 --- a/Gemfile +++ b/Gemfile @@ -15,7 +15,7 @@ gem 'makara', '~> 0.4' gem 'pghero', '~> 2.3' gem 'dotenv-rails', '~> 2.7' -gem 'aws-sdk-s3', '~> 1.46', require: false +gem 'aws-sdk-s3', '~> 1.48', require: false gem 'fog-core', '<= 2.1.0' gem 'fog-openstack', '~> 0.3', require: false gem 'paperclip', '~> 6.0' diff --git a/Gemfile.lock b/Gemfile.lock index 475a27fb2..63676bd1b 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -97,8 +97,8 @@ GEM av (0.9.0) cocaine (~> 0.5.3) aws-eventstream (1.0.3) - aws-partitions (1.193.0) - aws-sdk-core (3.61.1) + aws-partitions (1.207.0) + aws-sdk-core (3.65.1) aws-eventstream (~> 1.0, >= 1.0.2) aws-partitions (~> 1.0) aws-sigv4 (~> 1.1) @@ -106,7 +106,7 @@ GEM aws-sdk-kms (1.24.0) aws-sdk-core (~> 3, >= 3.61.1) aws-sigv4 (~> 1.1) - aws-sdk-s3 (1.46.0) + aws-sdk-s3 (1.48.0) aws-sdk-core (~> 3, >= 3.61.1) aws-sdk-kms (~> 1) aws-sigv4 (~> 1.1) @@ -670,7 +670,7 @@ DEPENDENCIES active_record_query_trace (~> 1.6) addressable (~> 2.6) annotate (~> 2.7) - aws-sdk-s3 (~> 1.46) + aws-sdk-s3 (~> 1.48) better_errors (~> 2.5) binding_of_caller (~> 0.7) blurhash (~> 0.1) From bdca8da8ebb133f9f2a01cd4881a2fc3f6852274 Mon Sep 17 00:00:00 2001 From: Yamagishi Kazutoshi Date: Thu, 5 Sep 2019 03:44:08 +0900 Subject: [PATCH 024/134] Add PERSISTENT_TIMEOUT option (#11756) Add environment variable to so `persistent_timeout` option of puma can be changed. --- config/puma.rb | 2 ++ 1 file changed, 2 insertions(+) diff --git a/config/puma.rb b/config/puma.rb index 6a96867d5..224be7903 100644 --- a/config/puma.rb +++ b/config/puma.rb @@ -1,3 +1,5 @@ +persistent_timeout ENV.fetch('PERSISTENT_TIMEOUT') { 20 }.to_i + threads_count = ENV.fetch('MAX_THREADS') { 5 }.to_i threads threads_count, threads_count From e974d4923fabd887416609bc6c8ca81ce81d0ff2 Mon Sep 17 00:00:00 2001 From: Mostafa Ahangarha Date: Thu, 5 Sep 2019 01:00:49 +0430 Subject: [PATCH 025/134] Exclude URLs from text analysis (#11759) By the added regex, URLs, including the one without http or even www like mysite.com will be removed from the toot's body so only the real text of the toot will be analyzed for RTL detection --- app/javascript/mastodon/rtl.js | 1 + 1 file changed, 1 insertion(+) diff --git a/app/javascript/mastodon/rtl.js b/app/javascript/mastodon/rtl.js index 00870a15d..89bed6de8 100644 --- a/app/javascript/mastodon/rtl.js +++ b/app/javascript/mastodon/rtl.js @@ -20,6 +20,7 @@ export function isRtl(text) { text = text.replace(/(?:^|[^\/\w])@([a-z0-9_]+(@[a-z0-9\.\-]+)?)/ig, ''); text = text.replace(/(?:^|[^\/\w])#([\S]+)/ig, ''); text = text.replace(/\s+/g, ''); + text = text.replace(/(\w\S+\.\w{2,}\S*)/g, ''); const matches = text.match(rtlChars); From c46dcf77c6f3a081637bc4bbbfb2b457acee763c Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Thu, 5 Sep 2019 12:04:45 +0900 Subject: [PATCH 026/134] Bump capistrano from 3.11.0 to 3.11.1 (#11731) * Bump capistrano from 3.11.0 to 3.11.1 Bumps [capistrano](https://github.com/capistrano/capistrano) from 3.11.0 to 3.11.1. - [Release notes](https://github.com/capistrano/capistrano/releases) - [Changelog](https://github.com/capistrano/capistrano/blob/master/CHANGELOG.md) - [Commits](https://github.com/capistrano/capistrano/compare/v3.11.0...v3.11.1) Signed-off-by: dependabot-preview[bot] * 3.11.1 --- Gemfile.lock | 12 ++++++------ config/deploy.rb | 2 +- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/Gemfile.lock b/Gemfile.lock index 63676bd1b..f601e7192 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -85,7 +85,7 @@ GEM tzinfo (~> 1.1) addressable (2.6.0) public_suffix (>= 2.0.2, < 4.0) - airbrussh (1.3.0) + airbrussh (1.3.3) sshkit (>= 1.6.1, != 1.7.0) annotate (2.7.5) activerecord (>= 3.2, < 7.0) @@ -134,7 +134,7 @@ GEM bundler (>= 1.2.0, < 3) thor (~> 0.18) byebug (11.0.0) - capistrano (3.11.0) + capistrano (3.11.1) airbrussh (>= 1.0.0) i18n rake (>= 10.0.0) @@ -374,9 +374,9 @@ GEM multipart-post (2.0.0) necromancer (0.5.0) net-ldap (0.16.1) - net-scp (1.2.1) - net-ssh (>= 2.6.5) - net-ssh (5.0.2) + net-scp (2.0.0) + net-ssh (>= 2.6.5, < 6.0.0) + net-ssh (5.2.0) nio4r (2.4.0) nokogiri (1.10.4) mini_portile2 (~> 2.4.0) @@ -600,7 +600,7 @@ GEM actionpack (>= 4.0) activesupport (>= 4.0) sprockets (>= 3.0.0) - sshkit (1.17.0) + sshkit (1.20.0) net-scp (>= 1.1.2) net-ssh (>= 2.8.0) stackprof (0.2.12) diff --git a/config/deploy.rb b/config/deploy.rb index f0db50788..c4133e794 100644 --- a/config/deploy.rb +++ b/config/deploy.rb @@ -1,6 +1,6 @@ # frozen_string_literal: true -lock '3.11.0' +lock '3.11.1' set :repo_url, ENV.fetch('REPO', 'https://github.com/tootsuite/mastodon.git') set :branch, ENV.fetch('BRANCH', 'master') From 529856a6087a88a14fe19ec0ede96573761bfe34 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Thu, 5 Sep 2019 12:31:47 +0900 Subject: [PATCH 027/134] Bump addressable from 2.6.0 to 2.7.0 (#11732) Bumps [addressable](https://github.com/sporkmonger/addressable) from 2.6.0 to 2.7.0. - [Release notes](https://github.com/sporkmonger/addressable/releases) - [Changelog](https://github.com/sporkmonger/addressable/blob/master/CHANGELOG.md) - [Commits](https://github.com/sporkmonger/addressable/compare/addressable-2.6.0...addressable-2.7.0) Signed-off-by: dependabot-preview[bot] --- Gemfile | 2 +- Gemfile.lock | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/Gemfile b/Gemfile index 932b8a1ad..1cbf23cf2 100644 --- a/Gemfile +++ b/Gemfile @@ -24,7 +24,7 @@ gem 'streamio-ffmpeg', '~> 3.0' gem 'blurhash', '~> 0.1' gem 'active_model_serializers', '~> 0.10' -gem 'addressable', '~> 2.6' +gem 'addressable', '~> 2.7' gem 'bootsnap', '~> 1.4', require: false gem 'browser' gem 'charlock_holmes', '~> 0.7.6' diff --git a/Gemfile.lock b/Gemfile.lock index f601e7192..8ecc8ebb7 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -83,8 +83,8 @@ GEM i18n (>= 0.7, < 2) minitest (~> 5.1) tzinfo (~> 1.1) - addressable (2.6.0) - public_suffix (>= 2.0.2, < 4.0) + addressable (2.7.0) + public_suffix (>= 2.0.2, < 5.0) airbrussh (1.3.3) sshkit (>= 1.6.1, != 1.7.0) annotate (2.7.5) @@ -442,7 +442,7 @@ GEM pry (~> 0.10) pry-rails (0.3.9) pry (>= 0.10.4) - public_suffix (3.1.1) + public_suffix (4.0.1) puma (4.1.0) nio4r (~> 2.0) pundit (2.1.0) @@ -668,7 +668,7 @@ PLATFORMS DEPENDENCIES active_model_serializers (~> 0.10) active_record_query_trace (~> 1.6) - addressable (~> 2.6) + addressable (~> 2.7) annotate (~> 2.7) aws-sdk-s3 (~> 1.48) better_errors (~> 2.5) From 1653b587778db0df201507115d19c0530096a5e3 Mon Sep 17 00:00:00 2001 From: ThibG Date: Thu, 5 Sep 2019 05:32:53 +0200 Subject: [PATCH 028/134] Attempt to concurrently connect to remote IP addresses (#11757) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Attempt to concurrently connect to remote IP addresses * Reduce code length to please CodeClimate 🤷 --- app/lib/request.rb | 52 +++++++++++++++++++++++++++++++--------------- 1 file changed, 35 insertions(+), 17 deletions(-) diff --git a/app/lib/request.rb b/app/lib/request.rb index 9d874fe2c..42ccc6513 100644 --- a/app/lib/request.rb +++ b/app/lib/request.rb @@ -191,6 +191,9 @@ class Request end end + socks = [] + addr_by_socket = {} + addresses.each do |address| begin check_private_address(address) @@ -200,30 +203,45 @@ class Request sock.setsockopt(::Socket::IPPROTO_TCP, ::Socket::TCP_NODELAY, 1) - begin - sock.connect_nonblock(sockaddr) - rescue IO::WaitWritable - if IO.select(nil, [sock], nil, Request::TIMEOUT[:connect]) - begin - sock.connect_nonblock(sockaddr) - rescue Errno::EISCONN - # Yippee! - rescue - sock.close - raise - end - else - sock.close - raise HTTP::TimeoutError, "Connect timed out after #{Request::TIMEOUT[:connect]} seconds" - end - end + sock.connect_nonblock(sockaddr) + # If that hasn't raised an exception, we somehow managed to connect + # immediately, close pending sockets and return immediately + socks.each(&:close) return sock + rescue IO::WaitWritable + socks << sock + addr_by_socket[sock] = sockaddr rescue => e outer_e = e end end + until socks.empty? + _, available_socks, = IO.select(nil, socks, nil, Request::TIMEOUT[:connect]) + + if available_socks.nil? + socks.each(&:close) + raise HTTP::TimeoutError, "Connect timed out after #{Request::TIMEOUT[:connect]} seconds" + end + + available_socks.each do |sock| + socks.delete(sock) + + begin + sock.connect_nonblock(addr_by_socket[sock]) + rescue Errno::EISCONN + rescue => e + sock.close + outer_e = e + next + end + + socks.each(&:close) + return sock + end + end + if outer_e raise outer_e else From 58755439ac758f173cf6c8afb49d62b450782d14 Mon Sep 17 00:00:00 2001 From: Eugen Rochko Date: Thu, 5 Sep 2019 06:13:50 +0200 Subject: [PATCH 029/134] Fix wrong variable regression from #11753 (#11763) --- app/controllers/auth/confirmations_controller.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/controllers/auth/confirmations_controller.rb b/app/controllers/auth/confirmations_controller.rb index 3e419eb96..898525269 100644 --- a/app/controllers/auth/confirmations_controller.rb +++ b/app/controllers/auth/confirmations_controller.rb @@ -26,7 +26,7 @@ class Auth::ConfirmationsController < Devise::ConfirmationsController def after_resending_confirmation_instructions_path_for(_resource_name) if user_signed_in? - if user.confirmed? && user.approved? + if current_user.confirmed? && current_user.approved? edit_user_registration_path else auth_setup_path From 7db2c2e2ba049845bdfdbf9931ffae6ae5ccddd3 Mon Sep 17 00:00:00 2001 From: Eugen Rochko Date: Thu, 5 Sep 2019 06:14:06 +0200 Subject: [PATCH 030/134] Fix line breaks in hashtag autosuggestions in web UI (#11764) --- app/javascript/styles/mastodon/components.scss | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/app/javascript/styles/mastodon/components.scss b/app/javascript/styles/mastodon/components.scss index fde5e4c95..ef48d2438 100644 --- a/app/javascript/styles/mastodon/components.scss +++ b/app/javascript/styles/mastodon/components.scss @@ -507,6 +507,7 @@ flex: 1 1 auto; overflow: hidden; text-overflow: ellipsis; + white-space: nowrap; } strong { @@ -515,8 +516,10 @@ &__uses { flex: 0 0 auto; - width: 80px; text-align: right; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; } } From e265b8887dbd883bc7ca04832dc67ffe46966889 Mon Sep 17 00:00:00 2001 From: mayaeh Date: Thu, 5 Sep 2019 13:14:30 +0900 Subject: [PATCH 031/134] Fix NotificationMailer failing when receiving mention with media from remote instance (#11765) --- app/views/notification_mailer/_status.html.haml | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/app/views/notification_mailer/_status.html.haml b/app/views/notification_mailer/_status.html.haml index 40f3aa88a..e992e5563 100644 --- a/app/views/notification_mailer/_status.html.haml +++ b/app/views/notification_mailer/_status.html.haml @@ -36,7 +36,10 @@ - if status.media_attachments.size > 0 %p - status.media_attachments.each do |a| - = link_to medium_url(a), medium_url(a) + - if status.local? + = link_to medium_url(a), medium_url(a) + - else + = link_to a.remote_url, a.remote_url %p.status-footer = link_to l(status.created_at), web_url("statuses/#{status.id}") From cf643d0060590948f8fb97ab9bd2045f3649b056 Mon Sep 17 00:00:00 2001 From: Yamagishi Kazutoshi Date: Thu, 5 Sep 2019 22:51:51 +0900 Subject: [PATCH 032/134] Add method and enctype to manifest (#11767) --- app/serializers/manifest_serializer.rb | 2 ++ 1 file changed, 2 insertions(+) diff --git a/app/serializers/manifest_serializer.rb b/app/serializers/manifest_serializer.rb index 28127437d..21ec0d4be 100644 --- a/app/serializers/manifest_serializer.rb +++ b/app/serializers/manifest_serializer.rb @@ -55,6 +55,8 @@ class ManifestSerializer < ActiveModel::Serializer { url_template: 'share?title={title}&text={text}&url={url}', action: 'share', + method: 'GET', + enctype: 'application/x-www-form-urlencoded', params: { title: 'title', text: 'text', From e445a8af64908b2bdb721bec74c113e8258a129b Mon Sep 17 00:00:00 2001 From: Eugen Rochko Date: Fri, 6 Sep 2019 13:55:51 +0200 Subject: [PATCH 033/134] Add timeline read markers API (#11762) Fix #4093 --- app/controllers/api/v1/markers_controller.rb | 44 +++++++++++++ app/javascript/mastodon/actions/markers.js | 30 +++++++++ app/javascript/mastodon/features/ui/index.js | 5 +- app/models/marker.rb | 23 +++++++ app/models/user.rb | 1 + app/serializers/rest/marker_serializer.rb | 13 ++++ config/routes.rb | 1 + db/migrate/20190904222339_create_markers.rb | 14 ++++ db/schema.rb | 14 +++- .../api/v1/markers_controller_spec.rb | 65 +++++++++++++++++++ spec/fabricators/marker_fabricator.rb | 6 ++ spec/models/marker_spec.rb | 5 ++ 12 files changed, 219 insertions(+), 2 deletions(-) create mode 100644 app/controllers/api/v1/markers_controller.rb create mode 100644 app/javascript/mastodon/actions/markers.js create mode 100644 app/models/marker.rb create mode 100644 app/serializers/rest/marker_serializer.rb create mode 100644 db/migrate/20190904222339_create_markers.rb create mode 100644 spec/controllers/api/v1/markers_controller_spec.rb create mode 100644 spec/fabricators/marker_fabricator.rb create mode 100644 spec/models/marker_spec.rb diff --git a/app/controllers/api/v1/markers_controller.rb b/app/controllers/api/v1/markers_controller.rb new file mode 100644 index 000000000..28c2ec791 --- /dev/null +++ b/app/controllers/api/v1/markers_controller.rb @@ -0,0 +1,44 @@ +# frozen_string_literal: true + +class Api::V1::MarkersController < Api::BaseController + before_action -> { doorkeeper_authorize! :read, :'read:statuses' }, only: [:index] + before_action -> { doorkeeper_authorize! :write, :'write:statuses' }, except: [:index] + + before_action :require_user! + + def index + @markers = current_user.markers.where(timeline: Array(params[:timeline])).each_with_object({}) { |marker, h| h[marker.timeline] = marker } + render json: serialize_map(@markers) + end + + def create + Marker.transaction do + @markers = {} + + resource_params.each_pair do |timeline, timeline_params| + @markers[timeline] = current_user.markers.find_or_initialize_by(timeline: timeline) + @markers[timeline].update!(timeline_params) + end + end + + render json: serialize_map(@markers) + rescue ActiveRecord::StaleObjectError + render json: { error: 'Conflict during update, please try again' }, status: 409 + end + + private + + def serialize_map(map) + serialized = {} + + map.each_pair do |key, value| + serialized[key] = ActiveModelSerializers::SerializableResource.new(value, serializer: REST::MarkerSerializer).as_json + end + + Oj.dump(serialized) + end + + def resource_params + params.slice(*Marker::TIMELINES).permit(*Marker::TIMELINES.map { |timeline| { timeline.to_sym => [:last_read_id] } }) + end +end diff --git a/app/javascript/mastodon/actions/markers.js b/app/javascript/mastodon/actions/markers.js new file mode 100644 index 000000000..c3a5fe86f --- /dev/null +++ b/app/javascript/mastodon/actions/markers.js @@ -0,0 +1,30 @@ +export const submitMarkers = () => (dispatch, getState) => { + const accessToken = getState().getIn(['meta', 'access_token'], ''); + const params = {}; + + const lastHomeId = getState().getIn(['timelines', 'home', 'items', 0]); + const lastNotificationId = getState().getIn(['notifications', 'items', 0, 'id']); + + if (lastHomeId) { + params.home = { + last_read_id: lastHomeId, + }; + } + + if (lastNotificationId) { + params.notifications = { + last_read_id: lastNotificationId, + }; + } + + if (Object.keys(params).length === 0) { + return; + } + + const client = new XMLHttpRequest(); + + client.open('POST', '/api/v1/markers', false); + client.setRequestHeader('Content-Type', 'application/json'); + client.setRequestHeader('Authorization', `Bearer ${accessToken}`); + client.send(JSON.stringify(params)); +}; diff --git a/app/javascript/mastodon/features/ui/index.js b/app/javascript/mastodon/features/ui/index.js index 49c5c8d0e..63c5622b6 100644 --- a/app/javascript/mastodon/features/ui/index.js +++ b/app/javascript/mastodon/features/ui/index.js @@ -16,6 +16,7 @@ import { expandNotifications } from '../../actions/notifications'; import { fetchFilters } from '../../actions/filters'; import { clearHeight } from '../../actions/height_cache'; import { focusApp, unfocusApp } from 'mastodon/actions/app'; +import { submitMarkers } from 'mastodon/actions/markers'; import { WrappedSwitch, WrappedRoute } from './util/react_router_helpers'; import UploadArea from './components/upload_area'; import ColumnsAreaContainer from './containers/columns_area_container'; @@ -241,7 +242,9 @@ class UI extends React.PureComponent { }; handleBeforeUnload = e => { - const { intl, isComposing, hasComposingText, hasMediaAttachments } = this.props; + const { intl, dispatch, isComposing, hasComposingText, hasMediaAttachments } = this.props; + + dispatch(submitMarkers()); if (isComposing && (hasComposingText || hasMediaAttachments)) { // Setting returnValue to any string causes confirmation dialog. diff --git a/app/models/marker.rb b/app/models/marker.rb new file mode 100644 index 000000000..a5bd2176a --- /dev/null +++ b/app/models/marker.rb @@ -0,0 +1,23 @@ +# frozen_string_literal: true + +# == Schema Information +# +# Table name: markers +# +# id :bigint(8) not null, primary key +# user_id :bigint(8) +# timeline :string default(""), not null +# last_read_id :bigint(8) default(0), not null +# lock_version :integer default(0), not null +# created_at :datetime not null +# updated_at :datetime not null +# + +class Marker < ApplicationRecord + TIMELINES = %w(home notifications).freeze + + belongs_to :user + + validates :timeline, :last_read_id, presence: true + validates :timeline, inclusion: { in: TIMELINES } +end diff --git a/app/models/user.rb b/app/models/user.rb index a4a20d975..95f1d8fc5 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -74,6 +74,7 @@ class User < ApplicationRecord has_many :applications, class_name: 'Doorkeeper::Application', as: :owner has_many :backups, inverse_of: :user has_many :invites, inverse_of: :user + has_many :markers, inverse_of: :user, dependent: :destroy has_one :invite_request, class_name: 'UserInviteRequest', inverse_of: :user, dependent: :destroy accepts_nested_attributes_for :invite_request, reject_if: ->(attributes) { attributes['text'].blank? } diff --git a/app/serializers/rest/marker_serializer.rb b/app/serializers/rest/marker_serializer.rb new file mode 100644 index 000000000..2eaf3d507 --- /dev/null +++ b/app/serializers/rest/marker_serializer.rb @@ -0,0 +1,13 @@ +# frozen_string_literal: true + +class REST::MarkerSerializer < ActiveModel::Serializer + attributes :last_read_id, :version, :updated_at + + def last_read_id + object.last_read_id.to_s + end + + def version + object.lock_version + end +end diff --git a/config/routes.rb b/config/routes.rb index c5326052e..74a162f32 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -314,6 +314,7 @@ Rails.application.routes.draw do resources :trends, only: [:index] resources :filters, only: [:index, :create, :show, :update, :destroy] resources :endorsements, only: [:index] + resources :markers, only: [:index, :create] namespace :apps do get :verify_credentials, to: 'credentials#show' diff --git a/db/migrate/20190904222339_create_markers.rb b/db/migrate/20190904222339_create_markers.rb new file mode 100644 index 000000000..71ca70ac3 --- /dev/null +++ b/db/migrate/20190904222339_create_markers.rb @@ -0,0 +1,14 @@ +class CreateMarkers < ActiveRecord::Migration[5.2] + def change + create_table :markers do |t| + t.references :user, foreign_key: { on_delete: :cascade, index: false } + t.string :timeline, default: '', null: false + t.bigint :last_read_id, default: 0, null: false + t.integer :lock_version, default: 0, null: false + + t.timestamps + end + + add_index :markers, [:user_id, :timeline], unique: true + end +end diff --git a/db/schema.rb b/db/schema.rb index 5576f70bf..834dddd7b 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -10,7 +10,7 @@ # # It's strongly recommended that you check this file into your version control system. -ActiveRecord::Schema.define(version: 2019_09_01_040524) do +ActiveRecord::Schema.define(version: 2019_09_04_222339) do # These are extensions that must be enabled in order to support this database enable_extension "plpgsql" @@ -366,6 +366,17 @@ ActiveRecord::Schema.define(version: 2019_09_01_040524) do t.index ["account_id"], name: "index_lists_on_account_id" end + create_table "markers", force: :cascade do |t| + t.bigint "user_id" + t.string "timeline", default: "", null: false + t.bigint "last_read_id", default: 0, null: false + t.integer "lock_version", default: 0, null: false + t.datetime "created_at", null: false + t.datetime "updated_at", null: false + t.index ["user_id", "timeline"], name: "index_markers_on_user_id_and_timeline", unique: true + t.index ["user_id"], name: "index_markers_on_user_id" + end + create_table "media_attachments", force: :cascade do |t| t.bigint "status_id" t.string "file_file_name" @@ -791,6 +802,7 @@ ActiveRecord::Schema.define(version: 2019_09_01_040524) do add_foreign_key "list_accounts", "follows", on_delete: :cascade add_foreign_key "list_accounts", "lists", on_delete: :cascade add_foreign_key "lists", "accounts", on_delete: :cascade + add_foreign_key "markers", "users", on_delete: :cascade add_foreign_key "media_attachments", "accounts", name: "fk_96dd81e81b", on_delete: :nullify add_foreign_key "media_attachments", "scheduled_statuses", on_delete: :nullify add_foreign_key "media_attachments", "statuses", on_delete: :nullify diff --git a/spec/controllers/api/v1/markers_controller_spec.rb b/spec/controllers/api/v1/markers_controller_spec.rb new file mode 100644 index 000000000..556a75b9b --- /dev/null +++ b/spec/controllers/api/v1/markers_controller_spec.rb @@ -0,0 +1,65 @@ +require 'rails_helper' + +RSpec.describe Api::V1::MarkersController, type: :controller do + render_views + + let!(:user) { Fabricate(:user, account: Fabricate(:account, username: 'alice')) } + let!(:token) { Fabricate(:accessible_access_token, resource_owner_id: user.id, scopes: 'read:statuses write:statuses') } + + before { allow(controller).to receive(:doorkeeper_token) { token } } + + describe 'GET #index' do + before do + Fabricate(:marker, timeline: 'home', last_read_id: 123, user: user) + Fabricate(:marker, timeline: 'notifications', last_read_id: 456, user: user) + + get :index, params: { timeline: %w(home notifications) } + end + + it 'returns http success' do + expect(response).to have_http_status(200) + end + + it 'returns markers' do + json = body_as_json + + expect(json.key?(:home)).to be true + expect(json[:home][:last_read_id]).to eq '123' + expect(json.key?(:notifications)).to be true + expect(json[:notifications][:last_read_id]).to eq '456' + end + end + + describe 'POST #create' do + context 'when no marker exists' do + before do + post :create, params: { home: { last_read_id: '69420' } } + end + + it 'returns http success' do + expect(response).to have_http_status(200) + end + + it 'creates a marker' do + expect(user.markers.first.timeline).to eq 'home' + expect(user.markers.first.last_read_id).to eq 69420 + end + end + + context 'when a marker exists' do + before do + post :create, params: { home: { last_read_id: '69420' } } + post :create, params: { home: { last_read_id: '70120' } } + end + + it 'returns http success' do + expect(response).to have_http_status(200) + end + + it 'updates a marker' do + expect(user.markers.first.timeline).to eq 'home' + expect(user.markers.first.last_read_id).to eq 70120 + end + end + end +end diff --git a/spec/fabricators/marker_fabricator.rb b/spec/fabricators/marker_fabricator.rb new file mode 100644 index 000000000..0c94150e0 --- /dev/null +++ b/spec/fabricators/marker_fabricator.rb @@ -0,0 +1,6 @@ +Fabricator(:marker) do + user + timeline 'home' + last_read_id 0 + lock_version 0 +end diff --git a/spec/models/marker_spec.rb b/spec/models/marker_spec.rb new file mode 100644 index 000000000..d716aa75c --- /dev/null +++ b/spec/models/marker_spec.rb @@ -0,0 +1,5 @@ +require 'rails_helper' + +RSpec.describe Marker, type: :model do + pending "add some examples to (or delete) #{__FILE__}" +end From d7268befa853ac4a99f9d066c38330d4fc0bfc31 Mon Sep 17 00:00:00 2001 From: Yamagishi Kazutoshi Date: Sat, 7 Sep 2019 09:47:51 +0900 Subject: [PATCH 034/134] Add healthcheck endpoint for web (#11770) --- Gemfile | 1 + Gemfile.lock | 3 +++ app/controllers/application_controller.rb | 2 +- config/initializers/health_check.rb | 6 ++++++ config/routes.rb | 2 ++ docker-compose.yml | 4 ++-- 6 files changed, 15 insertions(+), 3 deletions(-) create mode 100644 config/initializers/health_check.rb diff --git a/Gemfile b/Gemfile index 1cbf23cf2..d9740702f 100644 --- a/Gemfile +++ b/Gemfile @@ -50,6 +50,7 @@ gem 'fastimage' gem 'goldfinger', '~> 2.1' gem 'hiredis', '~> 0.6' gem 'redis-namespace', '~> 1.5' +gem 'health_check', '~> 3.0' gem 'htmlentities', '~> 4.3' gem 'http', '~> 3.3' gem 'http_accept_language', '~> 2.1' diff --git a/Gemfile.lock b/Gemfile.lock index 8ecc8ebb7..b0f6bf083 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -278,6 +278,8 @@ GEM concurrent-ruby (~> 1.0) hashdiff (1.0.0) hashie (3.6.0) + health_check (3.0.0) + railties (>= 5.0) heapy (0.1.4) highline (2.0.1) hiredis (0.6.3) @@ -706,6 +708,7 @@ DEPENDENCIES fuubar (~> 2.4) goldfinger (~> 2.1) hamlit-rails (~> 0.2) + health_check (~> 3.0) hiredis (~> 0.6) htmlentities (~> 4.3) http (~> 3.3) diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb index 5b343a276..bd3d13774 100644 --- a/app/controllers/application_controller.rb +++ b/app/controllers/application_controller.rb @@ -41,7 +41,7 @@ class ApplicationController < ActionController::Base private def https_enabled? - Rails.env.production? + Rails.env.production? && !request.path.start_with?('/health') end def authorized_fetch_mode? diff --git a/config/initializers/health_check.rb b/config/initializers/health_check.rb new file mode 100644 index 000000000..eece67b10 --- /dev/null +++ b/config/initializers/health_check.rb @@ -0,0 +1,6 @@ +HealthCheck.setup do |config| + config.uri = 'health' + + config.standard_checks = %w(database migrations cache) + config.full_checks = %w(database migrations cache) +end diff --git a/config/routes.rb b/config/routes.rb index 74a162f32..fe8425341 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -10,6 +10,8 @@ Rails.application.routes.draw do mount LetterOpenerWeb::Engine, at: 'letter_opener' if Rails.env.development? + health_check_routes + authenticate :user, lambda { |u| u.admin? } do mount Sidekiq::Web, at: 'sidekiq', as: :sidekiq mount PgHero::Engine, at: 'pghero', as: :pghero diff --git a/docker-compose.yml b/docker-compose.yml index 740684966..20649e424 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -43,7 +43,7 @@ services: - external_network - internal_network healthcheck: - test: ["CMD-SHELL", "wget -q --spider --header 'x-forwarded-proto: https' --proxy=off localhost:3000/api/v1/instance || exit 1"] + test: ["CMD-SHELL", "wget -q --spider --proxy=off localhost:3000/health || exit 1"] ports: - "127.0.0.1:3000:3000" depends_on: @@ -63,7 +63,7 @@ services: - external_network - internal_network healthcheck: - test: ["CMD-SHELL", "wget -q --spider --header 'x-forwarded-proto: https' --proxy=off localhost:4000/api/v1/streaming/health || exit 1"] + test: ["CMD-SHELL", "wget -q --spider --proxy=off localhost:4000/api/v1/streaming/health || exit 1"] ports: - "127.0.0.1:4000:4000" depends_on: From d7ed6970302316aa09e49049031bee6f07da5680 Mon Sep 17 00:00:00 2001 From: Yamagishi Kazutoshi Date: Sat, 7 Sep 2019 12:12:20 +0900 Subject: [PATCH 035/134] Use prebuilt node.js on Docker image (#11768) --- Dockerfile | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/Dockerfile b/Dockerfile index b5904ad95..3bfe06ad9 100644 --- a/Dockerfile +++ b/Dockerfile @@ -7,19 +7,17 @@ SHELL ["bash", "-c"] ENV NODE_VER="12.9.1" RUN echo "Etc/UTC" > /etc/localtime && \ apt update && \ - apt -y install wget make gcc g++ python && \ + apt -y install wget python && \ cd ~ && \ - wget https://nodejs.org/download/release/v$NODE_VER/node-v$NODE_VER.tar.gz && \ - tar xf node-v$NODE_VER.tar.gz && \ - cd node-v$NODE_VER && \ - ./configure --prefix=/opt/node && \ - make -j$(nproc) > /dev/null && \ - make install + wget https://nodejs.org/download/release/v$NODE_VER/node-v$NODE_VER-linux-x64.tar.gz && \ + tar xf node-v$NODE_VER-linux-x64.tar.gz && \ + rm node-v$NODE_VER-linux-x64.tar.gz && \ + mv node-v$NODE_VER-linux-x64 /opt/node # Install jemalloc ENV JE_VER="5.2.1" RUN apt update && \ - apt -y install autoconf && \ + apt -y install make autoconf gcc g++ && \ cd ~ && \ wget https://github.com/jemalloc/jemalloc/archive/$JE_VER.tar.gz && \ tar xf $JE_VER.tar.gz && \ From a75009a65e1335047dff5488b4e67bdc03677590 Mon Sep 17 00:00:00 2001 From: Eugen Rochko Date: Sun, 8 Sep 2019 19:17:57 +0200 Subject: [PATCH 036/134] Change half-life of trend decay (#11774) --- app/models/trending_tags.rb | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/app/models/trending_tags.rb b/app/models/trending_tags.rb index e1b92b175..8cdade42d 100644 --- a/app/models/trending_tags.rb +++ b/app/models/trending_tags.rb @@ -7,8 +7,8 @@ class TrendingTags THRESHOLD = 5 LIMIT = 10 REVIEW_THRESHOLD = 3 - MAX_SCORE_COOLDOWN = 3.days.freeze - MAX_SCORE_HALFLIFE = 6.hours.freeze + MAX_SCORE_COOLDOWN = 2.days.freeze + MAX_SCORE_HALFLIFE = 2.hours.freeze class << self include Redisable @@ -83,6 +83,7 @@ class TrendingTags # Trim older items redis.zremrangebyrank(KEY, 0, -(LIMIT + 1)) + redis.zremrangebyscore(KEY, '(0.3', '-inf') end def get(limit, filtered: true) From 9c9dcf580ab9b40c3fd420159a0a02ea4dd11925 Mon Sep 17 00:00:00 2001 From: Takeshi Umeda Date: Mon, 9 Sep 2019 17:50:33 +0900 Subject: [PATCH 037/134] Add featured tags API (#11778) * Add featured tags API * Remove show and update, change scope, fix code style --- .../featured_tags/suggestions_controller.rb | 20 ++++++++++ .../api/v1/featured_tags_controller.rb | 40 +++++++++++++++++++ .../rest/featured_tag_serializer.rb | 9 +++++ config/routes.rb | 6 +++ 4 files changed, 75 insertions(+) create mode 100644 app/controllers/api/v1/featured_tags/suggestions_controller.rb create mode 100644 app/controllers/api/v1/featured_tags_controller.rb create mode 100644 app/serializers/rest/featured_tag_serializer.rb diff --git a/app/controllers/api/v1/featured_tags/suggestions_controller.rb b/app/controllers/api/v1/featured_tags/suggestions_controller.rb new file mode 100644 index 000000000..fb27ef88b --- /dev/null +++ b/app/controllers/api/v1/featured_tags/suggestions_controller.rb @@ -0,0 +1,20 @@ +# frozen_string_literal: true + +class Api::V1::FeaturedTags::SuggestionsController < Api::BaseController + before_action -> { doorkeeper_authorize! :read, :'read:accounts' }, only: :index + + before_action :require_user! + before_action :set_most_used_tags, only: :index + + respond_to :json + + def index + render json: @most_used_tags, each_serializer: REST::TagSerializer + end + + private + + def set_most_used_tags + @most_used_tags = Tag.most_used(current_account).where.not(id: current_account.featured_tags).limit(10) + end +end diff --git a/app/controllers/api/v1/featured_tags_controller.rb b/app/controllers/api/v1/featured_tags_controller.rb new file mode 100644 index 000000000..e4e836c97 --- /dev/null +++ b/app/controllers/api/v1/featured_tags_controller.rb @@ -0,0 +1,40 @@ +# frozen_string_literal: true + +class Api::V1::FeaturedTagsController < Api::BaseController + before_action -> { doorkeeper_authorize! :read, :'read:accounts' }, only: :index + before_action -> { doorkeeper_authorize! :write, :'write:accounts' }, except: :index + + before_action :require_user! + before_action :set_featured_tags, only: :index + before_action :set_featured_tag, except: [:index, :create] + + def index + render json: @featured_tags, each_serializer: REST::FeaturedTagSerializer + end + + def create + @featured_tag = current_account.featured_tags.new(featured_tag_params) + @featured_tag.reset_data + @featured_tag.save! + render json: @featured_tag, serializer: REST::FeaturedTagSerializer + end + + def destroy + @featured_tag.destroy! + render_empty + end + + private + + def set_featured_tag + @featured_tag = current_account.featured_tags.find(params[:id]) + end + + def set_featured_tags + @featured_tags = current_account.featured_tags.order(statuses_count: :desc) + end + + def featured_tag_params + params.permit(:name) + end +end diff --git a/app/serializers/rest/featured_tag_serializer.rb b/app/serializers/rest/featured_tag_serializer.rb new file mode 100644 index 000000000..08121ff16 --- /dev/null +++ b/app/serializers/rest/featured_tag_serializer.rb @@ -0,0 +1,9 @@ +# frozen_string_literal: true + +class REST::FeaturedTagSerializer < ActiveModel::Serializer + attributes :id, :name, :statuses_count, :last_status_at + + def id + object.id.to_s + end +end diff --git a/config/routes.rb b/config/routes.rb index fe8425341..1ebf9e066 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -380,6 +380,12 @@ Rails.application.routes.draw do resource :accounts, only: [:show, :create, :destroy], controller: 'lists/accounts' end + namespace :featured_tags do + get :suggestions, to: 'suggestions#index' + end + + resources :featured_tags, only: [:index, :create, :destroy] + resources :polls, only: [:create, :show] do resources :votes, only: :create, controller: 'polls/votes' end From 9fa5c43d80bb067bf57543625f66c4bcdeb42e67 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Mon, 9 Sep 2019 19:40:30 +0900 Subject: [PATCH 038/134] Bump tesseract.js from 2.0.0-alpha.13 to 2.0.0-alpha.15 (#11779) Bumps [tesseract.js](https://github.com/naptha/tesseract.js) from 2.0.0-alpha.13 to 2.0.0-alpha.15. - [Release notes](https://github.com/naptha/tesseract.js/releases) - [Commits](https://github.com/naptha/tesseract.js/compare/v2.0.0-alpha.13...v2.0.0-alpha.15) Signed-off-by: dependabot-preview[bot] --- package.json | 2 +- yarn.lock | 18 +++++++++--------- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/package.json b/package.json index 135ba684a..9a9287913 100644 --- a/package.json +++ b/package.json @@ -156,7 +156,7 @@ "stringz": "^2.0.0", "substring-trie": "^1.0.2", "terser-webpack-plugin": "^1.4.1", - "tesseract.js": "^2.0.0-alpha.13", + "tesseract.js": "^2.0.0-alpha.15", "throng": "^4.0.0", "tiny-queue": "^0.2.1", "uuid": "^3.1.0", diff --git a/yarn.lock b/yarn.lock index cd8618714..112213565 100644 --- a/yarn.lock +++ b/yarn.lock @@ -9921,10 +9921,10 @@ terser@^4.1.2: source-map "~0.6.1" source-map-support "~0.5.12" -tesseract.js-core@^2.0.0-beta.10: - version "2.0.0-beta.10" - resolved "https://registry.yarnpkg.com/tesseract.js-core/-/tesseract.js-core-2.0.0-beta.10.tgz#b8f0dd2be4686650c4350f648900adccfaf58d6b" - integrity sha512-QmNgMA9m5ES5uMTqpOAPysrUA80vUx/6WKQlfkK3zhOeAgqv8DjwwcDv9tQv2TgRzOQ+LFKrJn94Y2rw5b2IGw== +tesseract.js-core@^2.0.0-beta.11: + version "2.0.0-beta.11" + resolved "https://registry.yarnpkg.com/tesseract.js-core/-/tesseract.js-core-2.0.0-beta.11.tgz#c35e3e689efad30138603977ad7eaaac44c7fd37" + integrity sha512-07haKH2JYYo0OfIJoioMS9dDiI5Hrl7+r1MqjeNAAT5WpKO0ATe4cpncC8s1kz0e3s1kaC5WOwL3YJcjbJE+hg== tesseract.js-utils@^1.0.0-beta.8: version "1.0.0-beta.8" @@ -9938,10 +9938,10 @@ tesseract.js-utils@^1.0.0-beta.8: is-url "^1.2.4" zlibjs "^0.3.1" -tesseract.js@^2.0.0-alpha.13: - version "2.0.0-alpha.13" - resolved "https://registry.yarnpkg.com/tesseract.js/-/tesseract.js-2.0.0-alpha.13.tgz#87bb3d71fe646c0993b073552241d203d9dfef3a" - integrity sha512-ZFEdak7jWtN5vIDwZcw8OdAqA7RvG0QRailZKQFS5rtnl/Yy5vC4WcqfJh9+o+cA3bdr2zV5SENoWDtEihlSVA== +tesseract.js@^2.0.0-alpha.15: + version "2.0.0-alpha.15" + resolved "https://registry.yarnpkg.com/tesseract.js/-/tesseract.js-2.0.0-alpha.15.tgz#9887f4d1c10e25bb098fde7a10580c865c362fad" + integrity sha512-qM1XUFVlTO+tx6oVRpd9QQ8PwQLxo3qhbfIHByUlUVIqWx6y/U9xlHIaG033/Tjfs2EQ0NAehPTOJ+eNElsXEg== dependencies: axios "^0.18.0" check-types "^7.4.0" @@ -9949,7 +9949,7 @@ tesseract.js@^2.0.0-alpha.13: node-fetch "^2.3.0" opencollective-postinstall "^2.0.2" resolve-url "^0.2.1" - tesseract.js-core "^2.0.0-beta.10" + tesseract.js-core "^2.0.0-beta.11" tesseract.js-utils "^1.0.0-beta.8" test-exclude@^5.0.0: From c12cdbe81c2833902bb10357423a99bbe4990837 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Mon, 9 Sep 2019 19:42:39 +0900 Subject: [PATCH 039/134] Bump @babel/preset-env from 7.5.5 to 7.6.0 (#11780) Bumps [@babel/preset-env](https://github.com/babel/babel) from 7.5.5 to 7.6.0. - [Release notes](https://github.com/babel/babel/releases) - [Changelog](https://github.com/babel/babel/blob/master/CHANGELOG.md) - [Commits](https://github.com/babel/babel/compare/v7.5.5...v7.6.0) Signed-off-by: dependabot-preview[bot] --- package.json | 2 +- yarn.lock | 68 ++++++++++++++++++++++++++-------------------------- 2 files changed, 35 insertions(+), 35 deletions(-) diff --git a/package.json b/package.json index 9a9287913..cf741905a 100644 --- a/package.json +++ b/package.json @@ -68,7 +68,7 @@ "@babel/plugin-transform-react-jsx-self": "^7.2.0", "@babel/plugin-transform-react-jsx-source": "^7.5.0", "@babel/plugin-transform-runtime": "^7.5.5", - "@babel/preset-env": "^7.5.5", + "@babel/preset-env": "^7.6.0", "@babel/preset-react": "^7.0.0", "@babel/runtime": "^7.5.4", "@clusterws/cws": "^0.15.0", diff --git a/yarn.lock b/yarn.lock index 112213565..f26c8a592 100644 --- a/yarn.lock +++ b/yarn.lock @@ -428,10 +428,10 @@ dependencies: "@babel/helper-plugin-utils" "^7.0.0" -"@babel/plugin-transform-block-scoping@^7.5.5": - version "7.5.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.5.5.tgz#a35f395e5402822f10d2119f6f8e045e3639a2ce" - integrity sha512-82A3CLRRdYubkG85lKwhZB0WZoHxLGsJdux/cOVaJCJpvYFl1LVzAIFyRsa7CvXqW8rBM4Zf3Bfn8PHt5DP0Sg== +"@babel/plugin-transform-block-scoping@^7.6.0": + version "7.6.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.6.0.tgz#c49e21228c4bbd4068a35667e6d951c75439b1dc" + integrity sha512-tIt4E23+kw6TgL/edACZwP1OUKrjOTyMrFMLoT5IOFrfMRabCgekjqFd5o6PaAMildBu46oFkekIdMuGkkPEpA== dependencies: "@babel/helper-plugin-utils" "^7.0.0" lodash "^4.17.13" @@ -457,10 +457,10 @@ dependencies: "@babel/helper-plugin-utils" "^7.0.0" -"@babel/plugin-transform-destructuring@^7.5.0": - version "7.5.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.5.0.tgz#f6c09fdfe3f94516ff074fe877db7bc9ef05855a" - integrity sha512-YbYgbd3TryYYLGyC7ZR+Tq8H/+bCmwoaxHfJHupom5ECstzbRLTch6gOQbhEY9Z4hiCNHEURgq06ykFv9JZ/QQ== +"@babel/plugin-transform-destructuring@^7.6.0": + version "7.6.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.6.0.tgz#44bbe08b57f4480094d57d9ffbcd96d309075ba6" + integrity sha512-2bGIS5P1v4+sWTCnKNDZDxbGvEqi0ijeqM/YqHtVGrvG2y0ySgnEEhXErvE9dA0bnIzY9bIzdFK0jFA46ASIIQ== dependencies: "@babel/helper-plugin-utils" "^7.0.0" @@ -526,10 +526,10 @@ "@babel/helper-plugin-utils" "^7.0.0" babel-plugin-dynamic-import-node "^2.3.0" -"@babel/plugin-transform-modules-commonjs@^7.5.0": - version "7.5.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.5.0.tgz#425127e6045231360858eeaa47a71d75eded7a74" - integrity sha512-xmHq0B+ytyrWJvQTc5OWAC4ii6Dhr0s22STOoydokG51JjWhyYo5mRPXoi+ZmtHQhZZwuXNN+GG5jy5UZZJxIQ== +"@babel/plugin-transform-modules-commonjs@^7.6.0": + version "7.6.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.6.0.tgz#39dfe957de4420445f1fcf88b68a2e4aa4515486" + integrity sha512-Ma93Ix95PNSEngqomy5LSBMAQvYKVe3dy+JlVJSHEXZR5ASL9lQBedMiCyVtmTLraIDVRE3ZjTZvmXXD2Ozw3g== dependencies: "@babel/helper-module-transforms" "^7.4.4" "@babel/helper-plugin-utils" "^7.0.0" @@ -553,12 +553,12 @@ "@babel/helper-module-transforms" "^7.1.0" "@babel/helper-plugin-utils" "^7.0.0" -"@babel/plugin-transform-named-capturing-groups-regex@^7.4.5": - version "7.4.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.4.5.tgz#9d269fd28a370258199b4294736813a60bbdd106" - integrity sha512-z7+2IsWafTBbjNsOxU/Iv5CvTJlr5w4+HGu1HovKYTtgJ362f7kBcQglkfmlspKKZ3bgrbSGvLfNx++ZJgCWsg== +"@babel/plugin-transform-named-capturing-groups-regex@^7.6.0": + version "7.6.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.6.0.tgz#1e6e663097813bb4f53d42df0750cf28ad3bb3f1" + integrity sha512-jem7uytlmrRl3iCAuQyw8BpB4c4LWvSpvIeXKpMb+7j84lkx4m4mYr5ErAcmN5KM7B6BqrAvRGjBIbbzqCczew== dependencies: - regexp-tree "^0.1.6" + regexp-tree "^0.1.13" "@babel/plugin-transform-new-target@^7.4.4": version "7.4.4" @@ -701,10 +701,10 @@ "@babel/helper-regex" "^7.4.4" regexpu-core "^4.5.4" -"@babel/preset-env@^7.5.5": - version "7.5.5" - resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.5.5.tgz#bc470b53acaa48df4b8db24a570d6da1fef53c9a" - integrity sha512-GMZQka/+INwsMz1A5UEql8tG015h5j/qjptpKY2gJ7giy8ohzU710YciJB5rcKsWGWHiW3RUnHib0E5/m3Tp3A== +"@babel/preset-env@^7.6.0": + version "7.6.0" + resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.6.0.tgz#aae4141c506100bb2bfaa4ac2a5c12b395619e50" + integrity sha512-1efzxFv/TcPsNXlRhMzRnkBFMeIqBBgzwmZwlFDw5Ubj0AGLeufxugirwZmkkX/ayi3owsSqoQ4fw8LkfK9SYg== dependencies: "@babel/helper-module-imports" "^7.0.0" "@babel/helper-plugin-utils" "^7.0.0" @@ -722,10 +722,10 @@ "@babel/plugin-transform-arrow-functions" "^7.2.0" "@babel/plugin-transform-async-to-generator" "^7.5.0" "@babel/plugin-transform-block-scoped-functions" "^7.2.0" - "@babel/plugin-transform-block-scoping" "^7.5.5" + "@babel/plugin-transform-block-scoping" "^7.6.0" "@babel/plugin-transform-classes" "^7.5.5" "@babel/plugin-transform-computed-properties" "^7.2.0" - "@babel/plugin-transform-destructuring" "^7.5.0" + "@babel/plugin-transform-destructuring" "^7.6.0" "@babel/plugin-transform-dotall-regex" "^7.4.4" "@babel/plugin-transform-duplicate-keys" "^7.5.0" "@babel/plugin-transform-exponentiation-operator" "^7.2.0" @@ -734,10 +734,10 @@ "@babel/plugin-transform-literals" "^7.2.0" "@babel/plugin-transform-member-expression-literals" "^7.2.0" "@babel/plugin-transform-modules-amd" "^7.5.0" - "@babel/plugin-transform-modules-commonjs" "^7.5.0" + "@babel/plugin-transform-modules-commonjs" "^7.6.0" "@babel/plugin-transform-modules-systemjs" "^7.5.0" "@babel/plugin-transform-modules-umd" "^7.2.0" - "@babel/plugin-transform-named-capturing-groups-regex" "^7.4.5" + "@babel/plugin-transform-named-capturing-groups-regex" "^7.6.0" "@babel/plugin-transform-new-target" "^7.4.4" "@babel/plugin-transform-object-super" "^7.5.5" "@babel/plugin-transform-parameters" "^7.4.4" @@ -750,7 +750,7 @@ "@babel/plugin-transform-template-literals" "^7.4.4" "@babel/plugin-transform-typeof-symbol" "^7.2.0" "@babel/plugin-transform-unicode-regex" "^7.4.4" - "@babel/types" "^7.5.5" + "@babel/types" "^7.6.0" browserslist "^4.6.0" core-js-compat "^3.1.1" invariant "^2.2.2" @@ -822,10 +822,10 @@ globals "^11.1.0" lodash "^4.17.13" -"@babel/types@^7.0.0", "@babel/types@^7.0.0-beta.49", "@babel/types@^7.2.0", "@babel/types@^7.2.2", "@babel/types@^7.3.0", "@babel/types@^7.3.4", "@babel/types@^7.4.4", "@babel/types@^7.5.5": - version "7.5.5" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.5.5.tgz#97b9f728e182785909aa4ab56264f090a028d18a" - integrity sha512-s63F9nJioLqOlW3UkyMd+BYhXt44YuaFm/VV0VwuteqjYwRrObkU7ra9pY4wAJR3oXi8hJrMcrcJdO/HH33vtw== +"@babel/types@^7.0.0", "@babel/types@^7.0.0-beta.49", "@babel/types@^7.2.0", "@babel/types@^7.2.2", "@babel/types@^7.3.0", "@babel/types@^7.3.4", "@babel/types@^7.4.4", "@babel/types@^7.5.5", "@babel/types@^7.6.0": + version "7.6.1" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.6.1.tgz#53abf3308add3ac2a2884d539151c57c4b3ac648" + integrity sha512-X7gdiuaCmA0uRjCmRtYJNAVCc/q+5xSgsfKJHqMN4iNLILX39677fJE1O40arPMh0TTtS9ItH67yre6c7k6t0g== dependencies: esutils "^2.0.2" lodash "^4.17.13" @@ -8795,10 +8795,10 @@ regex-not@^1.0.0, regex-not@^1.0.2: extend-shallow "^3.0.2" safe-regex "^1.1.0" -regexp-tree@^0.1.6: - version "0.1.10" - resolved "https://registry.yarnpkg.com/regexp-tree/-/regexp-tree-0.1.10.tgz#d837816a039c7af8a8d64d7a7c3cf6a1d93450bc" - integrity sha512-K1qVSbcedffwuIslMwpe6vGlj+ZXRnGkvjAtFHfDZZZuEdA/h0dxljAPu9vhUo6Rrx2U2AwJ+nSQ6hK+lrP5MQ== +regexp-tree@^0.1.13: + version "0.1.13" + resolved "https://registry.yarnpkg.com/regexp-tree/-/regexp-tree-0.1.13.tgz#5b19ab9377edc68bc3679256840bb29afc158d7f" + integrity sha512-hwdV/GQY5F8ReLZWO+W1SRoN5YfpOKY6852+tBFcma72DKBIcHjPRIlIvQN35bCOljuAfP2G2iB0FC/w236mUw== regexpp@^2.0.1: version "2.0.1" From 3b10307e2c2b09f851a248d0662ce8e9d3c7101c Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Mon, 9 Sep 2019 19:49:13 +0900 Subject: [PATCH 040/134] Bump devise from 4.7.0 to 4.7.1 (#11784) * Bump devise from 4.7.0 to 4.7.1 Bumps [devise](https://github.com/plataformatec/devise) from 4.7.0 to 4.7.1. - [Release notes](https://github.com/plataformatec/devise/releases) - [Changelog](https://github.com/plataformatec/devise/blob/master/CHANGELOG.md) - [Commits](https://github.com/plataformatec/devise/compare/v4.7.0...v4.7.1) Signed-off-by: dependabot-preview[bot] * bcrypt (3.1.12) --- Gemfile.lock | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Gemfile.lock b/Gemfile.lock index b0f6bf083..a14650024 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -188,7 +188,7 @@ GEM rack (>= 1) rake (> 10, < 13) thor (~> 0.19) - devise (4.7.0) + devise (4.7.1) bcrypt (~> 3.0) orm_adapter (~> 0.1) railties (>= 4.1.0) From 3feacd2b14aeb60999c9ee83422c6c8090ed3ac2 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Mon, 9 Sep 2019 19:49:54 +0900 Subject: [PATCH 041/134] Bump faker from 2.2.1 to 2.2.2 (#11787) Bumps [faker](https://github.com/faker-ruby/faker) from 2.2.1 to 2.2.2. - [Release notes](https://github.com/faker-ruby/faker/releases) - [Changelog](https://github.com/faker-ruby/faker/blob/master/CHANGELOG.md) - [Commits](https://github.com/faker-ruby/faker/compare/v2.2.1...v2.2.2) Signed-off-by: dependabot-preview[bot] --- Gemfile.lock | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Gemfile.lock b/Gemfile.lock index a14650024..7f46fda12 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -231,8 +231,8 @@ GEM tzinfo excon (0.62.0) fabrication (2.20.2) - faker (2.2.1) - i18n (>= 0.8) + faker (2.2.2) + i18n (~> 1.6.0) faraday (0.15.0) multipart-post (>= 1.2, < 3) fast_blank (1.0.0) From 261e52268c05d2da4459a23e2898555dd5db5771 Mon Sep 17 00:00:00 2001 From: Eugen Rochko Date: Mon, 9 Sep 2019 12:50:09 +0200 Subject: [PATCH 042/134] Add batch approve/reject for pending hashtags in admin UI (#11791) --- app/controllers/admin/tags_controller.rb | 41 +++++++++++++++++++--- app/javascript/styles/mastodon/tables.scss | 10 ++++++ app/models/form/tag_batch.rb | 33 +++++++++++++++++ app/views/admin/tags/_tag.html.haml | 30 +++++++++------- app/views/admin/tags/index.html.haml | 37 ++++++++++++++++++- config/locales/en.yml | 1 + config/routes.rb | 9 ++++- 7 files changed, 142 insertions(+), 19 deletions(-) create mode 100644 app/models/form/tag_batch.rb diff --git a/app/controllers/admin/tags_controller.rb b/app/controllers/admin/tags_controller.rb index 8bd4e5f8b..376ebe44d 100644 --- a/app/controllers/admin/tags_controller.rb +++ b/app/controllers/admin/tags_controller.rb @@ -3,12 +3,33 @@ module Admin class TagsController < BaseController before_action :set_tags, only: :index - before_action :set_tag, except: :index - before_action :set_usage_by_domain, except: :index - before_action :set_counters, except: :index + before_action :set_tag, except: [:index, :batch, :approve_all, :reject_all] + before_action :set_usage_by_domain, except: [:index, :batch, :approve_all, :reject_all] + before_action :set_counters, except: [:index, :batch, :approve_all, :reject_all] def index authorize :tag, :index? + + @form = Form::TagBatch.new + end + + def batch + @form = Form::TagBatch.new(form_tag_batch_params.merge(current_account: current_account, action: action_from_button)) + @form.save + rescue ActionController::ParameterMissing + flash[:alert] = I18n.t('admin.accounts.no_account_selected') + ensure + redirect_to admin_tags_path(filter_params) + end + + def approve_all + Form::TagBatch.new(current_account: current_account, tag_ids: Tag.pending_review.pluck(:id), action: 'approve').save + redirect_to admin_tags_path(filter_params) + end + + def reject_all + Form::TagBatch.new(current_account: current_account, tag_ids: Tag.pending_review.pluck(:id), action: 'reject').save + redirect_to admin_tags_path(filter_params) end def show @@ -61,7 +82,7 @@ module Admin end def filter_params - params.slice(:context, :review).permit(:context, :review) + params.slice(:context, :review, :page).permit(:context, :review, :page) end def tag_params @@ -75,5 +96,17 @@ module Admin date.to_time(:utc).beginning_of_day.to_i end end + + def form_tag_batch_params + params.require(:form_tag_batch).permit(:action, tag_ids: []) + end + + def action_from_button + if params[:approve] + 'approve' + elsif params[:reject] + 'reject' + end + end end end diff --git a/app/javascript/styles/mastodon/tables.scss b/app/javascript/styles/mastodon/tables.scss index fe6beba5d..2aef099e6 100644 --- a/app/javascript/styles/mastodon/tables.scss +++ b/app/javascript/styles/mastodon/tables.scss @@ -211,6 +211,16 @@ a.table-action-link { padding: 0; } } + + .directory__tag { + margin: 0; + width: 100%; + + a { + background: transparent; + border-radius: 0; + } + } } .status__content { diff --git a/app/models/form/tag_batch.rb b/app/models/form/tag_batch.rb new file mode 100644 index 000000000..fd517a1a6 --- /dev/null +++ b/app/models/form/tag_batch.rb @@ -0,0 +1,33 @@ +# frozen_string_literal: true + +class Form::TagBatch + include ActiveModel::Model + include Authorization + + attr_accessor :tag_ids, :action, :current_account + + def save + case action + when 'approve' + approve! + when 'reject' + reject! + end + end + + private + + def tags + Tag.where(id: tag_ids) + end + + def approve! + tags.each { |tag| authorize(tag, :update?) } + tags.update_all(trendable: true, reviewed_at: Time.now.utc) + end + + def reject! + tags.each { |tag| authorize(tag, :update?) } + tags.update_all(trendable: false, reviewed_at: Time.now.utc) + end +end diff --git a/app/views/admin/tags/_tag.html.haml b/app/views/admin/tags/_tag.html.haml index 91af8e492..670f3bc05 100644 --- a/app/views/admin/tags/_tag.html.haml +++ b/app/views/admin/tags/_tag.html.haml @@ -1,16 +1,20 @@ -.directory__tag - = link_to admin_tag_path(tag.id) do - %h4 - = fa_icon 'hashtag' - = tag.name +.batch-table__row + %label.batch-table__row__select.batch-table__row__select--aligned.batch-checkbox + = f.check_box :tag_ids, { multiple: true, include_hidden: false }, tag.id - %small - = t('admin.tags.in_directory', count: tag.accounts_count) - • - = t('admin.tags.unique_uses_today', count: tag.history.first[:accounts]) + .directory__tag + = link_to admin_tag_path(tag.id) do + %h4 + = fa_icon 'hashtag' + = tag.name - - if tag.trending? - = fa_icon 'fire fw' - = t('admin.tags.trending_right_now') + %small + = t('admin.tags.in_directory', count: tag.accounts_count) + • + = t('admin.tags.unique_uses_today', count: tag.history.first[:accounts]) - .trends__item__current= number_to_human tag.history.first[:uses], strip_insignificant_zeros: true + - if tag.trending? + = fa_icon 'fire fw' + = t('admin.tags.trending_right_now') + + .trends__item__current= number_to_human tag.history.first[:uses], strip_insignificant_zeros: true diff --git a/app/views/admin/tags/index.html.haml b/app/views/admin/tags/index.html.haml index d994955ef..324d13d3e 100644 --- a/app/views/admin/tags/index.html.haml +++ b/app/views/admin/tags/index.html.haml @@ -1,6 +1,9 @@ - content_for :page_title do = t('admin.tags.title') +- content_for :header_tags do + = javascript_pack_tag 'admin', integrity: true, async: true, crossorigin: 'anonymous' + .filters .filter-subset %strong= t('admin.tags.context') @@ -18,5 +21,37 @@ %hr.spacer/ -= render @tags += form_for(@form, url: batch_admin_tags_path) do |f| + = hidden_field_tag :page, params[:page] || 1 + = hidden_field_tag :context, params[:context] + = hidden_field_tag :review, params[:review] + + .batch-table + .batch-table__toolbar + %label.batch-table__toolbar__select.batch-checkbox-all + = check_box_tag :batch_checkbox_all, nil, false + .batch-table__toolbar__actions + - if params[:review] == 'pending_review' + = f.button safe_join([fa_icon('check'), t('admin.accounts.approve')]), name: :approve, class: 'table-action-link', type: :submit, data: { confirm: t('admin.reports.are_you_sure') } + + = f.button safe_join([fa_icon('times'), t('admin.accounts.reject')]), name: :reject, class: 'table-action-link', type: :submit, data: { confirm: t('admin.reports.are_you_sure') } + - else + %span.neutral-hint= t('generic.no_batch_actions_available') + + .batch-table__body + - if @tags.empty? + = nothing_here 'nothing-here--under-tabs' + - else + = render partial: 'tag', collection: @tags, locals: { f: f } + = paginate @tags + +- if params[:review] == 'pending_review' + %hr.spacer/ + + %div{ style: 'overflow: hidden' } + %div{ style: 'float: right' } + = link_to t('admin.accounts.reject_all'), reject_all_admin_tags_path, method: :post, data: { confirm: t('admin.accounts.are_you_sure') }, class: 'button button--destructive' + + %div + = link_to t('admin.accounts.approve_all'), approve_all_admin_tags_path, method: :post, data: { confirm: t('admin.accounts.are_you_sure') }, class: 'button' diff --git a/config/locales/en.yml b/config/locales/en.yml index 687f5f2a0..42d8e0eb8 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -727,6 +727,7 @@ en: all: All changes_saved_msg: Changes successfully saved! copy: Copy + no_batch_actions_available: No batch actions available on this page order_by: Order by save_changes: Save changes validation_errors: diff --git a/config/routes.rb b/config/routes.rb index 1ebf9e066..534e68814 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -251,7 +251,14 @@ Rails.application.routes.draw do end resources :account_moderation_notes, only: [:create, :destroy] - resources :tags, only: [:index, :show, :update] + + resources :tags, only: [:index, :show, :update] do + collection do + post :approve_all + post :reject_all + post :batch + end + end end get '/admin', to: redirect('/admin/dashboard', status: 302) From 3642021d58f8871bb16c49b128f936b8fa907665 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Mon, 9 Sep 2019 19:50:38 +0900 Subject: [PATCH 043/134] Bump oj from 3.9.0 to 3.9.1 (#11789) Bumps [oj](https://github.com/ohler55/oj) from 3.9.0 to 3.9.1. - [Release notes](https://github.com/ohler55/oj/releases) - [Changelog](https://github.com/ohler55/oj/blob/develop/CHANGELOG.md) - [Commits](https://github.com/ohler55/oj/compare/v3.9.0...v3.9.1) Signed-off-by: dependabot-preview[bot] --- Gemfile.lock | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Gemfile.lock b/Gemfile.lock index 7f46fda12..66625dbae 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -389,7 +389,7 @@ GEM concurrent-ruby (~> 1.0, >= 1.0.2) sidekiq (>= 3.5) statsd-ruby (~> 1.4, >= 1.4.0) - oj (3.9.0) + oj (3.9.1) omniauth (1.9.0) hashie (>= 3.4.6, < 3.7.0) rack (>= 1.6.2, < 3) From a9ea638a495179ee5615de622baead3df3f91084 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Mon, 9 Sep 2019 19:52:33 +0900 Subject: [PATCH 044/134] Bump json-ld-preloaded from 3.0.3 to 3.0.4 (#11790) Bumps [json-ld-preloaded](https://github.com/ruby-rdf/json-ld-preloaded) from 3.0.3 to 3.0.4. - [Release notes](https://github.com/ruby-rdf/json-ld-preloaded/releases) - [Commits](https://github.com/ruby-rdf/json-ld-preloaded/compare/3.0.3...3.0.4) Signed-off-by: dependabot-preview[bot] --- Gemfile.lock | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Gemfile.lock b/Gemfile.lock index 66625dbae..de4323326 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -316,7 +316,7 @@ GEM jmespath (1.4.0) json (2.2.0) json-canonicalization (0.1.0) - json-ld-preloaded (3.0.3) + json-ld-preloaded (3.0.4) json-ld (~> 3.0) multi_json (~> 1.12) rdf (~> 3.0) From 5dcacde6a269dfa8c87e528ef221dacfedef9d6a Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Mon, 9 Sep 2019 20:03:07 +0900 Subject: [PATCH 045/134] Bump mime-types from 3.2.2 to 3.3 (#11788) Bumps [mime-types](https://github.com/mime-types/ruby-mime-types) from 3.2.2 to 3.3. - [Release notes](https://github.com/mime-types/ruby-mime-types/releases) - [Changelog](https://github.com/mime-types/ruby-mime-types/blob/master/History.md) - [Commits](https://github.com/mime-types/ruby-mime-types/compare/v3.2.2...v3.3) Signed-off-by: dependabot-preview[bot] --- Gemfile | 2 +- Gemfile.lock | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/Gemfile b/Gemfile index d9740702f..fc7160c82 100644 --- a/Gemfile +++ b/Gemfile @@ -59,7 +59,7 @@ gem 'httplog', '~> 1.3' gem 'idn-ruby', require: 'idn' gem 'kaminari', '~> 1.1' gem 'link_header', '~> 0.0' -gem 'mime-types', '~> 3.2', require: 'mime/types/columnar' +gem 'mime-types', '~> 3.3', require: 'mime/types/columnar' gem 'nilsimsa', git: 'https://github.com/witgo/nilsimsa', ref: 'fd184883048b922b176939f851338d0a4971a532' gem 'nokogiri', '~> 1.10' gem 'nsa', '~> 0.2' diff --git a/Gemfile.lock b/Gemfile.lock index de4323326..c0394f247 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -364,9 +364,9 @@ GEM microformats (4.1.0) json (~> 2.1) nokogiri (~> 1.8, >= 1.8.3) - mime-types (3.2.2) + mime-types (3.3) mime-types-data (~> 3.2015) - mime-types-data (3.2018.0812) + mime-types-data (3.2019.0904) mimemagic (0.3.3) mini_mime (1.0.2) mini_portile2 (2.4.0) @@ -729,7 +729,7 @@ DEPENDENCIES mario-redis-lock (~> 1.2) memory_profiler microformats (~> 4.1) - mime-types (~> 3.2) + mime-types (~> 3.3) net-ldap (~> 0.10) nilsimsa! nokogiri (~> 1.10) From 4f3e183dc88feb7a312d19c24ee9116d0259cbb6 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Mon, 9 Sep 2019 20:07:02 +0900 Subject: [PATCH 046/134] Bump jest from 24.8.0 to 24.9.0 (#11781) Bumps [jest](https://github.com/facebook/jest) from 24.8.0 to 24.9.0. - [Release notes](https://github.com/facebook/jest/releases) - [Changelog](https://github.com/facebook/jest/blob/master/CHANGELOG.md) - [Commits](https://github.com/facebook/jest/compare/v24.8.0...v24.9.0) Signed-off-by: dependabot-preview[bot] --- package.json | 2 +- yarn.lock | 716 ++++++++++++++++++++++++++++++++------------------- 2 files changed, 455 insertions(+), 263 deletions(-) diff --git a/package.json b/package.json index cf741905a..b92fed544 100644 --- a/package.json +++ b/package.json @@ -178,7 +178,7 @@ "eslint-plugin-jsx-a11y": "~6.2.3", "eslint-plugin-promise": "~4.2.1", "eslint-plugin-react": "~7.14.3", - "jest": "^24.8.0", + "jest": "^24.9.0", "raf": "^3.4.1", "react-intl-translations-manager": "^5.0.3", "react-test-renderer": "^16.8.6", diff --git a/yarn.lock b/yarn.lock index f26c8a592..2a4cf6af0 100644 --- a/yarn.lock +++ b/yarn.lock @@ -900,48 +900,58 @@ chalk "^2.0.1" slash "^2.0.0" -"@jest/core@^24.8.0": - version "24.8.0" - resolved "https://registry.yarnpkg.com/@jest/core/-/core-24.8.0.tgz#fbbdcd42a41d0d39cddbc9f520c8bab0c33eed5b" - integrity sha512-R9rhAJwCBQzaRnrRgAdVfnglUuATXdwTRsYqs6NMdVcAl5euG8LtWDe+fVkN27YfKVBW61IojVsXKaOmSnqd/A== +"@jest/console@^24.9.0": + version "24.9.0" + resolved "https://registry.yarnpkg.com/@jest/console/-/console-24.9.0.tgz#79b1bc06fb74a8cfb01cbdedf945584b1b9707f0" + integrity sha512-Zuj6b8TnKXi3q4ymac8EQfc3ea/uhLeCGThFqXeC8H9/raaH8ARPUTdId+XyGd03Z4In0/VjD2OYFcBF09fNLQ== + dependencies: + "@jest/source-map" "^24.9.0" + chalk "^2.0.1" + slash "^2.0.0" + +"@jest/core@^24.9.0": + version "24.9.0" + resolved "https://registry.yarnpkg.com/@jest/core/-/core-24.9.0.tgz#2ceccd0b93181f9c4850e74f2a9ad43d351369c4" + integrity sha512-Fogg3s4wlAr1VX7q+rhV9RVnUv5tD7VuWfYy1+whMiWUrvl7U3QJSJyWcDio9Lq2prqYsZaeTv2Rz24pWGkJ2A== dependencies: "@jest/console" "^24.7.1" - "@jest/reporters" "^24.8.0" - "@jest/test-result" "^24.8.0" - "@jest/transform" "^24.8.0" - "@jest/types" "^24.8.0" + "@jest/reporters" "^24.9.0" + "@jest/test-result" "^24.9.0" + "@jest/transform" "^24.9.0" + "@jest/types" "^24.9.0" ansi-escapes "^3.0.0" chalk "^2.0.1" exit "^0.1.2" graceful-fs "^4.1.15" - jest-changed-files "^24.8.0" - jest-config "^24.8.0" - jest-haste-map "^24.8.0" - jest-message-util "^24.8.0" + jest-changed-files "^24.9.0" + jest-config "^24.9.0" + jest-haste-map "^24.9.0" + jest-message-util "^24.9.0" jest-regex-util "^24.3.0" - jest-resolve-dependencies "^24.8.0" - jest-runner "^24.8.0" - jest-runtime "^24.8.0" - jest-snapshot "^24.8.0" - jest-util "^24.8.0" - jest-validate "^24.8.0" - jest-watcher "^24.8.0" + jest-resolve "^24.9.0" + jest-resolve-dependencies "^24.9.0" + jest-runner "^24.9.0" + jest-runtime "^24.9.0" + jest-snapshot "^24.9.0" + jest-util "^24.9.0" + jest-validate "^24.9.0" + jest-watcher "^24.9.0" micromatch "^3.1.10" p-each-series "^1.0.0" - pirates "^4.0.1" realpath-native "^1.1.0" rimraf "^2.5.4" + slash "^2.0.0" strip-ansi "^5.0.0" -"@jest/environment@^24.8.0": - version "24.8.0" - resolved "https://registry.yarnpkg.com/@jest/environment/-/environment-24.8.0.tgz#0342261383c776bdd652168f68065ef144af0eac" - integrity sha512-vlGt2HLg7qM+vtBrSkjDxk9K0YtRBi7HfRFaDxoRtyi+DyVChzhF20duvpdAnKVBV6W5tym8jm0U9EfXbDk1tw== +"@jest/environment@^24.9.0": + version "24.9.0" + resolved "https://registry.yarnpkg.com/@jest/environment/-/environment-24.9.0.tgz#21e3afa2d65c0586cbd6cbefe208bafade44ab18" + integrity sha512-5A1QluTPhvdIPFYnO3sZC3smkNeXPVELz7ikPbhUj0bQjB07EoE9qtLrem14ZUYWdVayYbsjVwIiL4WBIMV4aQ== dependencies: - "@jest/fake-timers" "^24.8.0" - "@jest/transform" "^24.8.0" - "@jest/types" "^24.8.0" - jest-mock "^24.8.0" + "@jest/fake-timers" "^24.9.0" + "@jest/transform" "^24.9.0" + "@jest/types" "^24.9.0" + jest-mock "^24.9.0" "@jest/fake-timers@^24.8.0": version "24.8.0" @@ -952,15 +962,24 @@ jest-message-util "^24.8.0" jest-mock "^24.8.0" -"@jest/reporters@^24.8.0": - version "24.8.0" - resolved "https://registry.yarnpkg.com/@jest/reporters/-/reporters-24.8.0.tgz#075169cd029bddec54b8f2c0fc489fd0b9e05729" - integrity sha512-eZ9TyUYpyIIXfYCrw0UHUWUvE35vx5I92HGMgS93Pv7du+GHIzl+/vh8Qj9MCWFK/4TqyttVBPakWMOfZRIfxw== +"@jest/fake-timers@^24.9.0": + version "24.9.0" + resolved "https://registry.yarnpkg.com/@jest/fake-timers/-/fake-timers-24.9.0.tgz#ba3e6bf0eecd09a636049896434d306636540c93" + integrity sha512-eWQcNa2YSwzXWIMC5KufBh3oWRIijrQFROsIqt6v/NS9Io/gknw1jsAC9c+ih/RQX4A3O7SeWAhQeN0goKhT9A== dependencies: - "@jest/environment" "^24.8.0" - "@jest/test-result" "^24.8.0" - "@jest/transform" "^24.8.0" - "@jest/types" "^24.8.0" + "@jest/types" "^24.9.0" + jest-message-util "^24.9.0" + jest-mock "^24.9.0" + +"@jest/reporters@^24.9.0": + version "24.9.0" + resolved "https://registry.yarnpkg.com/@jest/reporters/-/reporters-24.9.0.tgz#86660eff8e2b9661d042a8e98a028b8d631a5b43" + integrity sha512-mu4X0yjaHrffOsWmVLzitKmmmWSQ3GGuefgNscUSWNiUNcEOSEQk9k3pERKEQVBb0Cnn88+UESIsZEMH3o88Gw== + dependencies: + "@jest/environment" "^24.9.0" + "@jest/test-result" "^24.9.0" + "@jest/transform" "^24.9.0" + "@jest/types" "^24.9.0" chalk "^2.0.1" exit "^0.1.2" glob "^7.1.2" @@ -968,13 +987,13 @@ istanbul-lib-instrument "^3.0.1" istanbul-lib-report "^2.0.4" istanbul-lib-source-maps "^3.0.1" - istanbul-reports "^2.1.1" - jest-haste-map "^24.8.0" - jest-resolve "^24.8.0" - jest-runtime "^24.8.0" - jest-util "^24.8.0" + istanbul-reports "^2.2.6" + jest-haste-map "^24.9.0" + jest-resolve "^24.9.0" + jest-runtime "^24.9.0" + jest-util "^24.9.0" jest-worker "^24.6.0" - node-notifier "^5.2.1" + node-notifier "^5.4.2" slash "^2.0.0" source-map "^0.6.0" string-length "^2.0.0" @@ -988,6 +1007,15 @@ graceful-fs "^4.1.15" source-map "^0.6.0" +"@jest/source-map@^24.9.0": + version "24.9.0" + resolved "https://registry.yarnpkg.com/@jest/source-map/-/source-map-24.9.0.tgz#0e263a94430be4b41da683ccc1e6bffe2a191714" + integrity sha512-/Xw7xGlsZb4MJzNDgB7PW5crou5JqWiBQaz6xyPd3ArOg2nfn/PunV8+olXbbEZzNl591o5rWKE9BRDaFAuIBg== + dependencies: + callsites "^3.0.0" + graceful-fs "^4.1.15" + source-map "^0.6.0" + "@jest/test-result@^24.8.0": version "24.8.0" resolved "https://registry.yarnpkg.com/@jest/test-result/-/test-result-24.8.0.tgz#7675d0aaf9d2484caa65e048d9b467d160f8e9d3" @@ -997,15 +1025,24 @@ "@jest/types" "^24.8.0" "@types/istanbul-lib-coverage" "^2.0.0" -"@jest/test-sequencer@^24.8.0": - version "24.8.0" - resolved "https://registry.yarnpkg.com/@jest/test-sequencer/-/test-sequencer-24.8.0.tgz#2f993bcf6ef5eb4e65e8233a95a3320248cf994b" - integrity sha512-OzL/2yHyPdCHXEzhoBuq37CE99nkme15eHkAzXRVqthreWZamEMA0WoetwstsQBCXABhczpK03JNbc4L01vvLg== +"@jest/test-result@^24.9.0": + version "24.9.0" + resolved "https://registry.yarnpkg.com/@jest/test-result/-/test-result-24.9.0.tgz#11796e8aa9dbf88ea025757b3152595ad06ba0ca" + integrity sha512-XEFrHbBonBJ8dGp2JmF8kP/nQI/ImPpygKHwQ/SY+es59Z3L5PI4Qb9TQQMAEeYsThG1xF0k6tmG0tIKATNiiA== dependencies: - "@jest/test-result" "^24.8.0" - jest-haste-map "^24.8.0" - jest-runner "^24.8.0" - jest-runtime "^24.8.0" + "@jest/console" "^24.9.0" + "@jest/types" "^24.9.0" + "@types/istanbul-lib-coverage" "^2.0.0" + +"@jest/test-sequencer@^24.9.0": + version "24.9.0" + resolved "https://registry.yarnpkg.com/@jest/test-sequencer/-/test-sequencer-24.9.0.tgz#f8f334f35b625a4f2f355f2fe7e6036dad2e6b31" + integrity sha512-6qqsU4o0kW1dvA95qfNog8v8gkRN9ph6Lz7r96IvZpHdNipP2cBcb07J1Z45mz/VIS01OHJ3pY8T5fUY38tg4A== + dependencies: + "@jest/test-result" "^24.9.0" + jest-haste-map "^24.9.0" + jest-runner "^24.9.0" + jest-runtime "^24.9.0" "@jest/transform@^24.8.0": version "24.8.0" @@ -1028,6 +1065,28 @@ source-map "^0.6.1" write-file-atomic "2.4.1" +"@jest/transform@^24.9.0": + version "24.9.0" + resolved "https://registry.yarnpkg.com/@jest/transform/-/transform-24.9.0.tgz#4ae2768b296553fadab09e9ec119543c90b16c56" + integrity sha512-TcQUmyNRxV94S0QpMOnZl0++6RMiqpbH/ZMccFB/amku6Uwvyb1cjYX7xkp5nGNkbX4QPH/FcB6q1HBTHynLmQ== + dependencies: + "@babel/core" "^7.1.0" + "@jest/types" "^24.9.0" + babel-plugin-istanbul "^5.1.0" + chalk "^2.0.1" + convert-source-map "^1.4.0" + fast-json-stable-stringify "^2.0.0" + graceful-fs "^4.1.15" + jest-haste-map "^24.9.0" + jest-regex-util "^24.9.0" + jest-util "^24.9.0" + micromatch "^3.1.10" + pirates "^4.0.1" + realpath-native "^1.1.0" + slash "^2.0.0" + source-map "^0.6.1" + write-file-atomic "2.4.1" + "@jest/types@^24.8.0": version "24.8.0" resolved "https://registry.yarnpkg.com/@jest/types/-/types-24.8.0.tgz#f31e25948c58f0abd8c845ae26fcea1491dea7ad" @@ -1037,6 +1096,15 @@ "@types/istanbul-reports" "^1.1.1" "@types/yargs" "^12.0.9" +"@jest/types@^24.9.0": + version "24.9.0" + resolved "https://registry.yarnpkg.com/@jest/types/-/types-24.9.0.tgz#63cb26cb7500d069e5a389441a7c6ab5e909fc59" + integrity sha512-XKK7ze1apu5JWQ5eZjHITP66AX+QsLlbaJRBGYr8pNzwcAE2JVkwnf0yqjHTsDRcjR0mujy/NmZMXw5kl+kGBw== + dependencies: + "@types/istanbul-lib-coverage" "^2.0.0" + "@types/istanbul-reports" "^1.1.1" + "@types/yargs" "^13.0.0" + "@types/babel__core@^7.1.0": version "7.1.0" resolved "https://registry.yarnpkg.com/@types/babel__core/-/babel__core-7.1.0.tgz#710f2487dda4dcfd010ca6abb2b4dc7394365c51" @@ -1131,11 +1199,23 @@ resolved "https://registry.yarnpkg.com/@types/stack-utils/-/stack-utils-1.0.1.tgz#0a851d3bd96498fa25c33ab7278ed3bd65f06c3e" integrity sha512-l42BggppR6zLmpfU6fq9HEa2oGPEI8yrSPL3GITjfRInppYFahObbIQOQK3UGxEnyQpltZLaPe75046NOZQikw== -"@types/yargs@^12.0.2", "@types/yargs@^12.0.9": +"@types/yargs-parser@*": + version "13.1.0" + resolved "https://registry.yarnpkg.com/@types/yargs-parser/-/yargs-parser-13.1.0.tgz#c563aa192f39350a1d18da36c5a8da382bbd8228" + integrity sha512-gCubfBUZ6KxzoibJ+SCUc/57Ms1jz5NjHe4+dI2krNmU5zCPAphyLJYyTOg06ueIyfj+SaCUqmzun7ImlxDcKg== + +"@types/yargs@^12.0.9": version "12.0.9" resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-12.0.9.tgz#693e76a52f61a2f1e7fb48c0eef167b95ea4ffd0" integrity sha512-sCZy4SxP9rN2w30Hlmg5dtdRwgYQfYRiLo9usw8X9cxlf+H4FqM1xX7+sNH7NNKVdbXMJWqva7iyy+fxh/V7fA== +"@types/yargs@^13.0.0": + version "13.0.2" + resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-13.0.2.tgz#a64674fc0149574ecd90ba746e932b5a5f7b3653" + integrity sha512-lwwgizwk/bIIU+3ELORkyuOgDjCh7zuWDFqRtPPhhVgq9N1F7CvLNKg1TX4f2duwtKQ0p044Au9r1PLIXHrIzQ== + dependencies: + "@types/yargs-parser" "*" + "@webassemblyjs/ast@1.8.5": version "1.8.5" resolved "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.8.5.tgz#51b1c5fe6576a34953bf4b253df9f0d490d9e359" @@ -1731,6 +1811,19 @@ babel-jest@^24.8.0: chalk "^2.4.2" slash "^2.0.0" +babel-jest@^24.9.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-24.9.0.tgz#3fc327cb8467b89d14d7bc70e315104a783ccd54" + integrity sha512-ntuddfyiN+EhMw58PTNL1ph4C9rECiQXjI4nMMBKBaNjXvqLdkXpPRcMSr4iyBrJg/+wz9brFUD6RhOAT6r4Iw== + dependencies: + "@jest/transform" "^24.9.0" + "@jest/types" "^24.9.0" + "@types/babel__core" "^7.1.0" + babel-plugin-istanbul "^5.1.0" + babel-preset-jest "^24.9.0" + chalk "^2.4.2" + slash "^2.0.0" + babel-loader@^8.0.6: version "8.0.6" resolved "https://registry.yarnpkg.com/babel-loader/-/babel-loader-8.0.6.tgz#e33bdb6f362b03f4bb141a0c21ab87c501b70dfb" @@ -1782,6 +1875,13 @@ babel-plugin-jest-hoist@^24.6.0: dependencies: "@types/babel__traverse" "^7.0.6" +babel-plugin-jest-hoist@^24.9.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-24.9.0.tgz#4f837091eb407e01447c8843cbec546d0002d756" + integrity sha512-2EMA2P8Vp7lG0RAzr4HXqtYwacfMErOuv1U3wrvxHX6rD1sV6xS3WXG3r8TRQ2r6w8OhvSdWt+z41hQNwNm3Xw== + dependencies: + "@types/babel__traverse" "^7.0.6" + babel-plugin-lodash@^3.3.4: version "3.3.4" resolved "https://registry.yarnpkg.com/babel-plugin-lodash/-/babel-plugin-lodash-3.3.4.tgz#4f6844358a1340baed182adbeffa8df9967bc196" @@ -1844,6 +1944,14 @@ babel-preset-jest@^24.6.0: "@babel/plugin-syntax-object-rest-spread" "^7.0.0" babel-plugin-jest-hoist "^24.6.0" +babel-preset-jest@^24.9.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/babel-preset-jest/-/babel-preset-jest-24.9.0.tgz#192b521e2217fb1d1f67cf73f70c336650ad3cdc" + integrity sha512-izTUuhE4TMfTRPF92fFwD2QfdXaZW08qvWTFCI51V8rW5x00UuPgc3ajRoWofXOuxjfcOM5zzSYsQS3H8KGCAg== + dependencies: + "@babel/plugin-syntax-object-rest-spread" "^7.0.0" + babel-plugin-jest-hoist "^24.9.0" + babel-runtime@^6.26.0: version "6.26.0" resolved "https://registry.yarnpkg.com/babel-runtime/-/babel-runtime-6.26.0.tgz#965c7058668e82b55d7bfe04ff2337bc8b5647fe" @@ -3267,10 +3375,10 @@ detect-passive-events@^1.0.2: resolved "https://registry.yarnpkg.com/detect-passive-events/-/detect-passive-events-1.0.4.tgz#6ed477e6e5bceb79079735dcd357789d37f9a91a" integrity sha1-btR35uW863kHlzXc01d4nTf5qRo= -diff-sequences@^24.3.0: - version "24.3.0" - resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-24.3.0.tgz#0f20e8a1df1abddaf4d9c226680952e64118b975" - integrity sha512-xLqpez+Zj9GKSnPWS0WZw1igGocZ+uua8+y+5dDNTT934N3QuY1sp2LkHzwiaYQGz60hMq0pjAshdeXm5VUOEw== +diff-sequences@^24.9.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-24.9.0.tgz#5715d6244e2aa65f48bba0bc972db0b0b11e95b5" + integrity sha512-Dj6Wk3tWyTE+Fo1rW8v0Xhwk80um6yFYKbuAxc9c3EZxIHFDYwbi34Uk42u1CdnIiVorvt4RmlSDjIPyzGC2ew== diffie-hellman@^5.0.0: version "5.0.3" @@ -4037,17 +4145,17 @@ expand-tilde@^2.0.0, expand-tilde@^2.0.2: dependencies: homedir-polyfill "^1.0.1" -expect@^24.8.0: - version "24.8.0" - resolved "https://registry.yarnpkg.com/expect/-/expect-24.8.0.tgz#471f8ec256b7b6129ca2524b2a62f030df38718d" - integrity sha512-/zYvP8iMDrzaaxHVa724eJBCKqSHmO0FA7EDkBiRHxg6OipmMn1fN+C8T9L9K8yr7UONkOifu6+LLH+z76CnaA== +expect@^24.9.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/expect/-/expect-24.9.0.tgz#b75165b4817074fa4a157794f46fe9f1ba15b6ca" + integrity sha512-wvVAx8XIol3Z5m9zvZXiyZOQ+sRJqNTIm6sGjdWlaZIeupQGO3WbYI+15D/AmEwZywL6wtJkbAbJtzkOfBuR0Q== dependencies: - "@jest/types" "^24.8.0" + "@jest/types" "^24.9.0" ansi-styles "^3.2.0" - jest-get-type "^24.8.0" - jest-matcher-utils "^24.8.0" - jest-message-util "^24.8.0" - jest-regex-util "^24.3.0" + jest-get-type "^24.9.0" + jest-matcher-utils "^24.9.0" + jest-message-util "^24.9.0" + jest-regex-util "^24.9.0" express@^4.16.3, express@^4.17.1: version "4.17.1" @@ -4708,10 +4816,10 @@ handle-thing@^2.0.0: resolved "https://registry.yarnpkg.com/handle-thing/-/handle-thing-2.0.0.tgz#0e039695ff50c93fc288557d696f3c1dc6776754" integrity sha512-d4sze1JNC454Wdo2fkuyzCr6aHcbL6PGGuFAz0Li/NcOm1tCHGnWDRmJP85dh9IhQErTc2svWFEX5xHIOo//kQ== -handlebars@^4.1.0: - version "4.1.2" - resolved "https://registry.yarnpkg.com/handlebars/-/handlebars-4.1.2.tgz#b6b37c1ced0306b221e094fc7aca3ec23b131b67" - integrity sha512-nvfrjqvt9xQ8Z/w0ijewdD/vvWDTOweBUm96NTr66Wfvo1mJenBLwcYmPs3TIBP5ruzYGD7Hx/DaM9RmhroGPw== +handlebars@^4.1.2: + version "4.2.0" + resolved "https://registry.yarnpkg.com/handlebars/-/handlebars-4.2.0.tgz#57ce8d2175b9bbb3d8b3cf3e4217b1aec8ddcb2e" + integrity sha512-Kb4xn5Qh1cxAKvQnzNWZ512DhABzyFNmsaJf3OAkWNa4NkaqWcNI8Tao8Tasi0/F4JD9oyG0YxuFyvyR57d+Gw== dependencies: neo-async "^2.6.0" optimist "^0.6.1" @@ -5668,73 +5776,73 @@ istanbul-lib-source-maps@^3.0.1: rimraf "^2.6.2" source-map "^0.6.1" -istanbul-reports@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-2.1.1.tgz#72ef16b4ecb9a4a7bd0e2001e00f95d1eec8afa9" - integrity sha512-FzNahnidyEPBCI0HcufJoSEoKykesRlFcSzQqjH9x0+LC8tnnE/p/90PBLu8iZTxr8yYZNyTtiAujUqyN+CIxw== +istanbul-reports@^2.2.6: + version "2.2.6" + resolved "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-2.2.6.tgz#7b4f2660d82b29303a8fe6091f8ca4bf058da1af" + integrity sha512-SKi4rnMyLBKe0Jy2uUdx28h8oG7ph2PPuQPvIAh31d+Ci+lSiEu4C+h3oBPuJ9+mPKhOyW0M8gY4U5NM1WLeXA== dependencies: - handlebars "^4.1.0" + handlebars "^4.1.2" -jest-changed-files@^24.8.0: - version "24.8.0" - resolved "https://registry.yarnpkg.com/jest-changed-files/-/jest-changed-files-24.8.0.tgz#7e7eb21cf687587a85e50f3d249d1327e15b157b" - integrity sha512-qgANC1Yrivsq+UrLXsvJefBKVoCsKB0Hv+mBb6NMjjZ90wwxCDmU3hsCXBya30cH+LnPYjwgcU65i6yJ5Nfuug== +jest-changed-files@^24.9.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/jest-changed-files/-/jest-changed-files-24.9.0.tgz#08d8c15eb79a7fa3fc98269bc14b451ee82f8039" + integrity sha512-6aTWpe2mHF0DhL28WjdkO8LyGjs3zItPET4bMSeXU6T3ub4FPMw+mcOcbdGXQOAfmLcxofD23/5Bl9Z4AkFwqg== dependencies: - "@jest/types" "^24.8.0" + "@jest/types" "^24.9.0" execa "^1.0.0" throat "^4.0.0" -jest-cli@^24.8.0: - version "24.8.0" - resolved "https://registry.yarnpkg.com/jest-cli/-/jest-cli-24.8.0.tgz#b075ac914492ed114fa338ade7362a301693e989" - integrity sha512-+p6J00jSMPQ116ZLlHJJvdf8wbjNbZdeSX9ptfHX06/MSNaXmKihQzx5vQcw0q2G6JsdVkUIdWbOWtSnaYs3yA== +jest-cli@^24.9.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/jest-cli/-/jest-cli-24.9.0.tgz#ad2de62d07472d419c6abc301fc432b98b10d2af" + integrity sha512-+VLRKyitT3BWoMeSUIHRxV/2g8y9gw91Jh5z2UmXZzkZKpbC08CSehVxgHUwTpy+HwGcns/tqafQDJW7imYvGg== dependencies: - "@jest/core" "^24.8.0" - "@jest/test-result" "^24.8.0" - "@jest/types" "^24.8.0" + "@jest/core" "^24.9.0" + "@jest/test-result" "^24.9.0" + "@jest/types" "^24.9.0" chalk "^2.0.1" exit "^0.1.2" import-local "^2.0.0" is-ci "^2.0.0" - jest-config "^24.8.0" - jest-util "^24.8.0" - jest-validate "^24.8.0" + jest-config "^24.9.0" + jest-util "^24.9.0" + jest-validate "^24.9.0" prompts "^2.0.1" realpath-native "^1.1.0" - yargs "^12.0.2" + yargs "^13.3.0" -jest-config@^24.8.0: - version "24.8.0" - resolved "https://registry.yarnpkg.com/jest-config/-/jest-config-24.8.0.tgz#77db3d265a6f726294687cbbccc36f8a76ee0f4f" - integrity sha512-Czl3Nn2uEzVGsOeaewGWoDPD8GStxCpAe0zOYs2x2l0fZAgPbCr3uwUkgNKV3LwE13VXythM946cd5rdGkkBZw== +jest-config@^24.9.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/jest-config/-/jest-config-24.9.0.tgz#fb1bbc60c73a46af03590719efa4825e6e4dd1b5" + integrity sha512-RATtQJtVYQrp7fvWg6f5y3pEFj9I+H8sWw4aKxnDZ96mob5i5SD6ZEGWgMLXQ4LE8UurrjbdlLWdUeo+28QpfQ== dependencies: "@babel/core" "^7.1.0" - "@jest/test-sequencer" "^24.8.0" - "@jest/types" "^24.8.0" - babel-jest "^24.8.0" + "@jest/test-sequencer" "^24.9.0" + "@jest/types" "^24.9.0" + babel-jest "^24.9.0" chalk "^2.0.1" glob "^7.1.1" - jest-environment-jsdom "^24.8.0" - jest-environment-node "^24.8.0" - jest-get-type "^24.8.0" - jest-jasmine2 "^24.8.0" + jest-environment-jsdom "^24.9.0" + jest-environment-node "^24.9.0" + jest-get-type "^24.9.0" + jest-jasmine2 "^24.9.0" jest-regex-util "^24.3.0" - jest-resolve "^24.8.0" - jest-util "^24.8.0" - jest-validate "^24.8.0" + jest-resolve "^24.9.0" + jest-util "^24.9.0" + jest-validate "^24.9.0" micromatch "^3.1.10" - pretty-format "^24.8.0" + pretty-format "^24.9.0" realpath-native "^1.1.0" -jest-diff@^24.8.0: - version "24.8.0" - resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-24.8.0.tgz#146435e7d1e3ffdf293d53ff97e193f1d1546172" - integrity sha512-wxetCEl49zUpJ/bvUmIFjd/o52J+yWcoc5ZyPq4/W1LUKGEhRYDIbP1KcF6t+PvqNrGAFk4/JhtxDq/Nnzs66g== +jest-diff@^24.9.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-24.9.0.tgz#931b7d0d5778a1baf7452cb816e325e3724055da" + integrity sha512-qMfrTs8AdJE2iqrTp0hzh7kTd2PQWrsFyj9tORoKmu32xjPjeE4NyjVRDz8ybYwqS2ik8N4hsIpiVTyFeo2lBQ== dependencies: chalk "^2.0.1" - diff-sequences "^24.3.0" - jest-get-type "^24.8.0" - pretty-format "^24.8.0" + diff-sequences "^24.9.0" + jest-get-type "^24.9.0" + pretty-format "^24.9.0" jest-docblock@^24.3.0: version "24.3.0" @@ -5743,44 +5851,44 @@ jest-docblock@^24.3.0: dependencies: detect-newline "^2.1.0" -jest-each@^24.8.0: - version "24.8.0" - resolved "https://registry.yarnpkg.com/jest-each/-/jest-each-24.8.0.tgz#a05fd2bf94ddc0b1da66c6d13ec2457f35e52775" - integrity sha512-NrwK9gaL5+XgrgoCsd9svsoWdVkK4gnvyhcpzd6m487tXHqIdYeykgq3MKI1u4I+5Zf0tofr70at9dWJDeb+BA== +jest-each@^24.9.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/jest-each/-/jest-each-24.9.0.tgz#eb2da602e2a610898dbc5f1f6df3ba86b55f8b05" + integrity sha512-ONi0R4BvW45cw8s2Lrx8YgbeXL1oCQ/wIDwmsM3CqM/nlblNCPmnC3IPQlMbRFZu3wKdQ2U8BqM6lh3LJ5Bsog== dependencies: - "@jest/types" "^24.8.0" + "@jest/types" "^24.9.0" chalk "^2.0.1" - jest-get-type "^24.8.0" - jest-util "^24.8.0" - pretty-format "^24.8.0" + jest-get-type "^24.9.0" + jest-util "^24.9.0" + pretty-format "^24.9.0" -jest-environment-jsdom@^24.8.0: - version "24.8.0" - resolved "https://registry.yarnpkg.com/jest-environment-jsdom/-/jest-environment-jsdom-24.8.0.tgz#300f6949a146cabe1c9357ad9e9ecf9f43f38857" - integrity sha512-qbvgLmR7PpwjoFjM/sbuqHJt/NCkviuq9vus9NBn/76hhSidO+Z6Bn9tU8friecegbJL8gzZQEMZBQlFWDCwAQ== +jest-environment-jsdom@^24.9.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/jest-environment-jsdom/-/jest-environment-jsdom-24.9.0.tgz#4b0806c7fc94f95edb369a69cc2778eec2b7375b" + integrity sha512-Zv9FV9NBRzLuALXjvRijO2351DRQeLYXtpD4xNvfoVFw21IOKNhZAEUKcbiEtjTkm2GsJ3boMVgkaR7rN8qetA== dependencies: - "@jest/environment" "^24.8.0" - "@jest/fake-timers" "^24.8.0" - "@jest/types" "^24.8.0" - jest-mock "^24.8.0" - jest-util "^24.8.0" + "@jest/environment" "^24.9.0" + "@jest/fake-timers" "^24.9.0" + "@jest/types" "^24.9.0" + jest-mock "^24.9.0" + jest-util "^24.9.0" jsdom "^11.5.1" -jest-environment-node@^24.8.0: - version "24.8.0" - resolved "https://registry.yarnpkg.com/jest-environment-node/-/jest-environment-node-24.8.0.tgz#d3f726ba8bc53087a60e7a84ca08883a4c892231" - integrity sha512-vIGUEScd1cdDgR6sqn2M08sJTRLQp6Dk/eIkCeO4PFHxZMOgy+uYLPMC4ix3PEfM5Au/x3uQ/5Tl0DpXXZsJ/Q== +jest-environment-node@^24.9.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/jest-environment-node/-/jest-environment-node-24.9.0.tgz#333d2d2796f9687f2aeebf0742b519f33c1cbfd3" + integrity sha512-6d4V2f4nxzIzwendo27Tr0aFm+IXWa0XEUnaH6nU0FMaozxovt+sfRvh4J47wL1OvF83I3SSTu0XK+i4Bqe7uA== dependencies: - "@jest/environment" "^24.8.0" - "@jest/fake-timers" "^24.8.0" - "@jest/types" "^24.8.0" - jest-mock "^24.8.0" - jest-util "^24.8.0" + "@jest/environment" "^24.9.0" + "@jest/fake-timers" "^24.9.0" + "@jest/types" "^24.9.0" + jest-mock "^24.9.0" + jest-util "^24.9.0" -jest-get-type@^24.8.0: - version "24.8.0" - resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-24.8.0.tgz#a7440de30b651f5a70ea3ed7ff073a32dfe646fc" - integrity sha512-RR4fo8jEmMD9zSz2nLbs2j0zvPpk/KCEz3a62jJWbd2ayNo0cb+KFRxPHVhE4ZmgGJEQp0fosmNz84IfqM8cMQ== +jest-get-type@^24.9.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-24.9.0.tgz#1684a0c8a50f2e4901b6644ae861f579eed2ef0e" + integrity sha512-lUseMzAley4LhIcpSP9Jf+fTrQ4a1yHQwLNeeVa2cEmbCGeoZAtYPOIv8JaxLD/sUpKxetKGP+gsHl8f8TSj8Q== jest-haste-map@^24.8.0: version "24.8.0" @@ -5801,44 +5909,64 @@ jest-haste-map@^24.8.0: optionalDependencies: fsevents "^1.2.7" -jest-jasmine2@^24.8.0: - version "24.8.0" - resolved "https://registry.yarnpkg.com/jest-jasmine2/-/jest-jasmine2-24.8.0.tgz#a9c7e14c83dd77d8b15e820549ce8987cc8cd898" - integrity sha512-cEky88npEE5LKd5jPpTdDCLvKkdyklnaRycBXL6GNmpxe41F0WN44+i7lpQKa/hcbXaQ+rc9RMaM4dsebrYong== +jest-haste-map@^24.9.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-24.9.0.tgz#b38a5d64274934e21fa417ae9a9fbeb77ceaac7d" + integrity sha512-kfVFmsuWui2Sj1Rp1AJ4D9HqJwE4uwTlS/vO+eRUaMmd54BFpli2XhMQnPC2k4cHFVbB2Q2C+jtI1AGLgEnCjQ== + dependencies: + "@jest/types" "^24.9.0" + anymatch "^2.0.0" + fb-watchman "^2.0.0" + graceful-fs "^4.1.15" + invariant "^2.2.4" + jest-serializer "^24.9.0" + jest-util "^24.9.0" + jest-worker "^24.9.0" + micromatch "^3.1.10" + sane "^4.0.3" + walker "^1.0.7" + optionalDependencies: + fsevents "^1.2.7" + +jest-jasmine2@^24.9.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/jest-jasmine2/-/jest-jasmine2-24.9.0.tgz#1f7b1bd3242c1774e62acabb3646d96afc3be6a0" + integrity sha512-Cq7vkAgaYKp+PsX+2/JbTarrk0DmNhsEtqBXNwUHkdlbrTBLtMJINADf2mf5FkowNsq8evbPc07/qFO0AdKTzw== dependencies: "@babel/traverse" "^7.1.0" - "@jest/environment" "^24.8.0" - "@jest/test-result" "^24.8.0" - "@jest/types" "^24.8.0" + "@jest/environment" "^24.9.0" + "@jest/test-result" "^24.9.0" + "@jest/types" "^24.9.0" chalk "^2.0.1" co "^4.6.0" - expect "^24.8.0" + expect "^24.9.0" is-generator-fn "^2.0.0" - jest-each "^24.8.0" - jest-matcher-utils "^24.8.0" - jest-message-util "^24.8.0" - jest-runtime "^24.8.0" - jest-snapshot "^24.8.0" - jest-util "^24.8.0" - pretty-format "^24.8.0" + jest-each "^24.9.0" + jest-matcher-utils "^24.9.0" + jest-message-util "^24.9.0" + jest-runtime "^24.9.0" + jest-snapshot "^24.9.0" + jest-util "^24.9.0" + pretty-format "^24.9.0" throat "^4.0.0" -jest-leak-detector@^24.8.0: - version "24.8.0" - resolved "https://registry.yarnpkg.com/jest-leak-detector/-/jest-leak-detector-24.8.0.tgz#c0086384e1f650c2d8348095df769f29b48e6980" - integrity sha512-cG0yRSK8A831LN8lIHxI3AblB40uhv0z+SsQdW3GoMMVcK+sJwrIIyax5tu3eHHNJ8Fu6IMDpnLda2jhn2pD/g== +jest-leak-detector@^24.9.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/jest-leak-detector/-/jest-leak-detector-24.9.0.tgz#b665dea7c77100c5c4f7dfcb153b65cf07dcf96a" + integrity sha512-tYkFIDsiKTGwb2FG1w8hX9V0aUb2ot8zY/2nFg087dUageonw1zrLMP4W6zsRO59dPkTSKie+D4rhMuP9nRmrA== dependencies: - pretty-format "^24.8.0" + jest-get-type "^24.9.0" + pretty-format "^24.9.0" -jest-matcher-utils@^24.8.0: - version "24.8.0" - resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-24.8.0.tgz#2bce42204c9af12bde46f83dc839efe8be832495" - integrity sha512-lex1yASY51FvUuHgm0GOVj7DCYEouWSlIYmCW7APSqB9v8mXmKSn5+sWVF0MhuASG0bnYY106/49JU1FZNl5hw== +jest-matcher-utils@^24.9.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-24.9.0.tgz#f5b3661d5e628dffe6dd65251dfdae0e87c3a073" + integrity sha512-OZz2IXsu6eaiMAwe67c1T+5tUAtQyQx27/EMEkbFAGiw52tB9em+uGbzpcgYVpA8wl0hlxKPZxrly4CXU/GjHA== dependencies: chalk "^2.0.1" - jest-diff "^24.8.0" - jest-get-type "^24.8.0" - pretty-format "^24.8.0" + jest-diff "^24.9.0" + jest-get-type "^24.9.0" + pretty-format "^24.9.0" jest-message-util@^24.8.0: version "24.8.0" @@ -5854,6 +5982,20 @@ jest-message-util@^24.8.0: slash "^2.0.0" stack-utils "^1.0.1" +jest-message-util@^24.9.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-24.9.0.tgz#527f54a1e380f5e202a8d1149b0ec872f43119e3" + integrity sha512-oCj8FiZ3U0hTP4aSui87P4L4jC37BtQwUMqk+zk/b11FR19BJDeZsZAvIHutWnmtw7r85UmR3CEWZ0HWU2mAlw== + dependencies: + "@babel/code-frame" "^7.0.0" + "@jest/test-result" "^24.9.0" + "@jest/types" "^24.9.0" + "@types/stack-utils" "^1.0.1" + chalk "^2.0.1" + micromatch "^3.1.10" + slash "^2.0.0" + stack-utils "^1.0.1" + jest-mock@^24.8.0: version "24.8.0" resolved "https://registry.yarnpkg.com/jest-mock/-/jest-mock-24.8.0.tgz#2f9d14d37699e863f1febf4e4d5a33b7fdbbde56" @@ -5861,6 +6003,13 @@ jest-mock@^24.8.0: dependencies: "@jest/types" "^24.8.0" +jest-mock@^24.9.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/jest-mock/-/jest-mock-24.9.0.tgz#c22835541ee379b908673ad51087a2185c13f1c6" + integrity sha512-3BEYN5WbSq9wd+SyLDES7AHnjH9A/ROBwmz7l2y+ol+NtSFO8DYiEBzoO1CeFc9a8DYy10EO4dDFVv/wN3zl1w== + dependencies: + "@jest/types" "^24.9.0" + jest-pnp-resolver@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/jest-pnp-resolver/-/jest-pnp-resolver-1.2.1.tgz#ecdae604c077a7fbc70defb6d517c3c1c898923a" @@ -5871,102 +6020,113 @@ jest-regex-util@^24.3.0: resolved "https://registry.yarnpkg.com/jest-regex-util/-/jest-regex-util-24.3.0.tgz#d5a65f60be1ae3e310d5214a0307581995227b36" integrity sha512-tXQR1NEOyGlfylyEjg1ImtScwMq8Oh3iJbGTjN7p0J23EuVX1MA8rwU69K4sLbCmwzgCUbVkm0FkSF9TdzOhtg== -jest-resolve-dependencies@^24.8.0: - version "24.8.0" - resolved "https://registry.yarnpkg.com/jest-resolve-dependencies/-/jest-resolve-dependencies-24.8.0.tgz#19eec3241f2045d3f990dba331d0d7526acff8e0" - integrity sha512-hyK1qfIf/krV+fSNyhyJeq3elVMhK9Eijlwy+j5jqmZ9QsxwKBiP6qukQxaHtK8k6zql/KYWwCTQ+fDGTIJauw== - dependencies: - "@jest/types" "^24.8.0" - jest-regex-util "^24.3.0" - jest-snapshot "^24.8.0" +jest-regex-util@^24.9.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/jest-regex-util/-/jest-regex-util-24.9.0.tgz#c13fb3380bde22bf6575432c493ea8fe37965636" + integrity sha512-05Cmb6CuxaA+Ys6fjr3PhvV3bGQmO+2p2La4hFbU+W5uOc479f7FdLXUWXw4pYMAhhSZIuKHwSXSu6CsSBAXQA== -jest-resolve@^24.8.0: - version "24.8.0" - resolved "https://registry.yarnpkg.com/jest-resolve/-/jest-resolve-24.8.0.tgz#84b8e5408c1f6a11539793e2b5feb1b6e722439f" - integrity sha512-+hjSzi1PoRvnuOICoYd5V/KpIQmkAsfjFO71458hQ2Whi/yf1GDeBOFj8Gxw4LrApHsVJvn5fmjcPdmoUHaVKw== +jest-resolve-dependencies@^24.9.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/jest-resolve-dependencies/-/jest-resolve-dependencies-24.9.0.tgz#ad055198959c4cfba8a4f066c673a3f0786507ab" + integrity sha512-Fm7b6AlWnYhT0BXy4hXpactHIqER7erNgIsIozDXWl5dVm+k8XdGVe1oTg1JyaFnOxarMEbax3wyRJqGP2Pq+g== dependencies: - "@jest/types" "^24.8.0" + "@jest/types" "^24.9.0" + jest-regex-util "^24.3.0" + jest-snapshot "^24.9.0" + +jest-resolve@^24.9.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/jest-resolve/-/jest-resolve-24.9.0.tgz#dff04c7687af34c4dd7e524892d9cf77e5d17321" + integrity sha512-TaLeLVL1l08YFZAt3zaPtjiVvyy4oSA6CRe+0AFPPVX3Q/VI0giIWWoAvoS5L96vj9Dqxj4fB5p2qrHCmTU/MQ== + dependencies: + "@jest/types" "^24.9.0" browser-resolve "^1.11.3" chalk "^2.0.1" jest-pnp-resolver "^1.2.1" realpath-native "^1.1.0" -jest-runner@^24.8.0: - version "24.8.0" - resolved "https://registry.yarnpkg.com/jest-runner/-/jest-runner-24.8.0.tgz#4f9ae07b767db27b740d7deffad0cf67ccb4c5bb" - integrity sha512-utFqC5BaA3JmznbissSs95X1ZF+d+4WuOWwpM9+Ak356YtMhHE/GXUondZdcyAAOTBEsRGAgH/0TwLzfI9h7ow== +jest-runner@^24.9.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/jest-runner/-/jest-runner-24.9.0.tgz#574fafdbd54455c2b34b4bdf4365a23857fcdf42" + integrity sha512-KksJQyI3/0mhcfspnxxEOBueGrd5E4vV7ADQLT9ESaCzz02WnbdbKWIf5Mkaucoaj7obQckYPVX6JJhgUcoWWg== dependencies: "@jest/console" "^24.7.1" - "@jest/environment" "^24.8.0" - "@jest/test-result" "^24.8.0" - "@jest/types" "^24.8.0" + "@jest/environment" "^24.9.0" + "@jest/test-result" "^24.9.0" + "@jest/types" "^24.9.0" chalk "^2.4.2" exit "^0.1.2" graceful-fs "^4.1.15" - jest-config "^24.8.0" + jest-config "^24.9.0" jest-docblock "^24.3.0" - jest-haste-map "^24.8.0" - jest-jasmine2 "^24.8.0" - jest-leak-detector "^24.8.0" - jest-message-util "^24.8.0" - jest-resolve "^24.8.0" - jest-runtime "^24.8.0" - jest-util "^24.8.0" + jest-haste-map "^24.9.0" + jest-jasmine2 "^24.9.0" + jest-leak-detector "^24.9.0" + jest-message-util "^24.9.0" + jest-resolve "^24.9.0" + jest-runtime "^24.9.0" + jest-util "^24.9.0" jest-worker "^24.6.0" source-map-support "^0.5.6" throat "^4.0.0" -jest-runtime@^24.8.0: - version "24.8.0" - resolved "https://registry.yarnpkg.com/jest-runtime/-/jest-runtime-24.8.0.tgz#05f94d5b05c21f6dc54e427cd2e4980923350620" - integrity sha512-Mq0aIXhvO/3bX44ccT+czU1/57IgOMyy80oM0XR/nyD5zgBcesF84BPabZi39pJVA6UXw+fY2Q1N+4BiVUBWOA== +jest-runtime@^24.9.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/jest-runtime/-/jest-runtime-24.9.0.tgz#9f14583af6a4f7314a6a9d9f0226e1a781c8e4ac" + integrity sha512-8oNqgnmF3v2J6PVRM2Jfuj8oX3syKmaynlDMMKQ4iyzbQzIG6th5ub/lM2bCMTmoTKM3ykcUYI2Pw9xwNtjMnw== dependencies: "@jest/console" "^24.7.1" - "@jest/environment" "^24.8.0" + "@jest/environment" "^24.9.0" "@jest/source-map" "^24.3.0" - "@jest/transform" "^24.8.0" - "@jest/types" "^24.8.0" - "@types/yargs" "^12.0.2" + "@jest/transform" "^24.9.0" + "@jest/types" "^24.9.0" + "@types/yargs" "^13.0.0" chalk "^2.0.1" exit "^0.1.2" glob "^7.1.3" graceful-fs "^4.1.15" - jest-config "^24.8.0" - jest-haste-map "^24.8.0" - jest-message-util "^24.8.0" - jest-mock "^24.8.0" + jest-config "^24.9.0" + jest-haste-map "^24.9.0" + jest-message-util "^24.9.0" + jest-mock "^24.9.0" jest-regex-util "^24.3.0" - jest-resolve "^24.8.0" - jest-snapshot "^24.8.0" - jest-util "^24.8.0" - jest-validate "^24.8.0" + jest-resolve "^24.9.0" + jest-snapshot "^24.9.0" + jest-util "^24.9.0" + jest-validate "^24.9.0" realpath-native "^1.1.0" slash "^2.0.0" strip-bom "^3.0.0" - yargs "^12.0.2" + yargs "^13.3.0" jest-serializer@^24.4.0: version "24.4.0" resolved "https://registry.yarnpkg.com/jest-serializer/-/jest-serializer-24.4.0.tgz#f70c5918c8ea9235ccb1276d232e459080588db3" integrity sha512-k//0DtglVstc1fv+GY/VHDIjrtNjdYvYjMlbLUed4kxrE92sIUewOi5Hj3vrpB8CXfkJntRPDRjCrCvUhBdL8Q== -jest-snapshot@^24.8.0: - version "24.8.0" - resolved "https://registry.yarnpkg.com/jest-snapshot/-/jest-snapshot-24.8.0.tgz#3bec6a59da2ff7bc7d097a853fb67f9d415cb7c6" - integrity sha512-5ehtWoc8oU9/cAPe6fez6QofVJLBKyqkY2+TlKTOf0VllBB/mqUNdARdcjlZrs9F1Cv+/HKoCS/BknT0+tmfPg== +jest-serializer@^24.9.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/jest-serializer/-/jest-serializer-24.9.0.tgz#e6d7d7ef96d31e8b9079a714754c5d5c58288e73" + integrity sha512-DxYipDr8OvfrKH3Kel6NdED3OXxjvxXZ1uIY2I9OFbGg+vUkkg7AGvi65qbhbWNPvDckXmzMPbK3u3HaDO49bQ== + +jest-snapshot@^24.9.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/jest-snapshot/-/jest-snapshot-24.9.0.tgz#ec8e9ca4f2ec0c5c87ae8f925cf97497b0e951ba" + integrity sha512-uI/rszGSs73xCM0l+up7O7a40o90cnrk429LOiK3aeTvfC0HHmldbd81/B7Ix81KSFe1lwkbl7GnBGG4UfuDew== dependencies: "@babel/types" "^7.0.0" - "@jest/types" "^24.8.0" + "@jest/types" "^24.9.0" chalk "^2.0.1" - expect "^24.8.0" - jest-diff "^24.8.0" - jest-matcher-utils "^24.8.0" - jest-message-util "^24.8.0" - jest-resolve "^24.8.0" + expect "^24.9.0" + jest-diff "^24.9.0" + jest-get-type "^24.9.0" + jest-matcher-utils "^24.9.0" + jest-message-util "^24.9.0" + jest-resolve "^24.9.0" mkdirp "^0.5.1" natural-compare "^1.4.0" - pretty-format "^24.8.0" - semver "^5.5.0" + pretty-format "^24.9.0" + semver "^6.2.0" jest-util@^24.8.0: version "24.8.0" @@ -5986,29 +6146,47 @@ jest-util@^24.8.0: slash "^2.0.0" source-map "^0.6.0" -jest-validate@^24.8.0: - version "24.8.0" - resolved "https://registry.yarnpkg.com/jest-validate/-/jest-validate-24.8.0.tgz#624c41533e6dfe356ffadc6e2423a35c2d3b4849" - integrity sha512-+/N7VOEMW1Vzsrk3UWBDYTExTPwf68tavEPKDnJzrC6UlHtUDU/fuEdXqFoHzv9XnQ+zW6X3qMZhJ3YexfeLDA== +jest-util@^24.9.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-24.9.0.tgz#7396814e48536d2e85a37de3e4c431d7cb140162" + integrity sha512-x+cZU8VRmOJxbA1K5oDBdxQmdq0OIdADarLxk0Mq+3XS4jgvhG/oKGWcIDCtPG0HgjxOYvF+ilPJQsAyXfbNOg== dependencies: - "@jest/types" "^24.8.0" - camelcase "^5.0.0" + "@jest/console" "^24.9.0" + "@jest/fake-timers" "^24.9.0" + "@jest/source-map" "^24.9.0" + "@jest/test-result" "^24.9.0" + "@jest/types" "^24.9.0" + callsites "^3.0.0" chalk "^2.0.1" - jest-get-type "^24.8.0" - leven "^2.1.0" - pretty-format "^24.8.0" + graceful-fs "^4.1.15" + is-ci "^2.0.0" + mkdirp "^0.5.1" + slash "^2.0.0" + source-map "^0.6.0" -jest-watcher@^24.8.0: - version "24.8.0" - resolved "https://registry.yarnpkg.com/jest-watcher/-/jest-watcher-24.8.0.tgz#58d49915ceddd2de85e238f6213cef1c93715de4" - integrity sha512-SBjwHt5NedQoVu54M5GEx7cl7IGEFFznvd/HNT8ier7cCAx/Qgu9ZMlaTQkvK22G1YOpcWBLQPFSImmxdn3DAw== +jest-validate@^24.9.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/jest-validate/-/jest-validate-24.9.0.tgz#0775c55360d173cd854e40180756d4ff52def8ab" + integrity sha512-HPIt6C5ACwiqSiwi+OfSSHbK8sG7akG8eATl+IPKaeIjtPOeBUd/g3J7DghugzxrGjI93qS/+RPKe1H6PqvhRQ== dependencies: - "@jest/test-result" "^24.8.0" - "@jest/types" "^24.8.0" - "@types/yargs" "^12.0.9" + "@jest/types" "^24.9.0" + camelcase "^5.3.1" + chalk "^2.0.1" + jest-get-type "^24.9.0" + leven "^3.1.0" + pretty-format "^24.9.0" + +jest-watcher@^24.9.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/jest-watcher/-/jest-watcher-24.9.0.tgz#4b56e5d1ceff005f5b88e528dc9afc8dd4ed2b3b" + integrity sha512-+/fLOfKPXXYJDYlks62/4R4GoT+GU1tYZed99JSCOsmzkkF7727RqKrjNAxtfO4YpGv11wybgRvCjR73lK2GZw== + dependencies: + "@jest/test-result" "^24.9.0" + "@jest/types" "^24.9.0" + "@types/yargs" "^13.0.0" ansi-escapes "^3.0.0" chalk "^2.0.1" - jest-util "^24.8.0" + jest-util "^24.9.0" string-length "^2.0.0" jest-worker@^24.6.0: @@ -6019,13 +6197,21 @@ jest-worker@^24.6.0: merge-stream "^1.0.1" supports-color "^6.1.0" -jest@^24.8.0: - version "24.8.0" - resolved "https://registry.yarnpkg.com/jest/-/jest-24.8.0.tgz#d5dff1984d0d1002196e9b7f12f75af1b2809081" - integrity sha512-o0HM90RKFRNWmAWvlyV8i5jGZ97pFwkeVoGvPW1EtLTgJc2+jcuqcbbqcSZLE/3f2S5pt0y2ZBETuhpWNl1Reg== +jest-worker@^24.9.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-24.9.0.tgz#5dbfdb5b2d322e98567898238a9697bcce67b3e5" + integrity sha512-51PE4haMSXcHohnSMdM42anbvZANYTqMrr52tVKPqqsPJMzoP6FYYDVqahX/HrAoKEKz3uUPzSvKs9A3qR4iVw== + dependencies: + merge-stream "^2.0.0" + supports-color "^6.1.0" + +jest@^24.9.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/jest/-/jest-24.9.0.tgz#987d290c05a08b52c56188c1002e368edb007171" + integrity sha512-YvkBL1Zm7d2B1+h5fHEOdyjCG+sGMz4f8D86/0HiqJ6MB4MnDc8FgP5vdWsGnemOQro7lnYo8UakZ3+5A0jxGw== dependencies: import-local "^2.0.0" - jest-cli "^24.8.0" + jest-cli "^24.9.0" js-base64@^2.1.9: version "2.5.0" @@ -6261,10 +6447,10 @@ left-pad@^1.3.0: resolved "https://registry.yarnpkg.com/left-pad/-/left-pad-1.3.0.tgz#5b8a3a7765dfe001261dde915589e782f8c94d1e" integrity sha512-XI5MPzVNApjAyhQzphX8BkmKsKUxD4LdyK24iZeQGinBN9yTQT3bFlCBy/aVx2HrNcqQGsdot8ghrjyrvMCoEA== -leven@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/leven/-/leven-2.1.0.tgz#c2e7a9f772094dee9d34202ae8acce4687875580" - integrity sha1-wuep93IJTe6dNCAq6KzORoeHVYA= +leven@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/leven/-/leven-3.1.0.tgz#77891de834064cccba82ae7842bb6b14a13ed7f2" + integrity sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A== levn@^0.3.0, levn@~0.3.0: version "0.3.0" @@ -6551,6 +6737,11 @@ merge-stream@^1.0.1: dependencies: readable-stream "^2.0.1" +merge-stream@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60" + integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w== + merge@^1.2.0: version "1.2.1" resolved "https://registry.yarnpkg.com/merge/-/merge-1.2.1.tgz#38bebf80c3220a8a487b6fcfb3941bb11720c145" @@ -6907,12 +7098,13 @@ node-modules-regexp@^1.0.0: resolved "https://registry.yarnpkg.com/node-modules-regexp/-/node-modules-regexp-1.0.0.tgz#8d9dbe28964a4ac5712e9131642107c71e90ec40" integrity sha1-jZ2+KJZKSsVxLpExZCEHxx6Q7EA= -node-notifier@^5.2.1: - version "5.3.0" - resolved "https://registry.yarnpkg.com/node-notifier/-/node-notifier-5.3.0.tgz#c77a4a7b84038733d5fb351aafd8a268bfe19a01" - integrity sha512-AhENzCSGZnZJgBARsUjnQ7DnZbzyP+HxlVXuD0xqAnvL8q+OqtSX7lGg9e8nHzwXkMMXNdVeqq4E2M3EUAqX6Q== +node-notifier@^5.4.2: + version "5.4.3" + resolved "https://registry.yarnpkg.com/node-notifier/-/node-notifier-5.4.3.tgz#cb72daf94c93904098e28b9c590fd866e464bd50" + integrity sha512-M4UBGcs4jeOK9CjTsYwkvH6/MzuUmGCyTW+kCY7uO+1ZVr0+FHGdPdIf5CCLqAaxnRrWidyoQlNkMIIVwbKB8Q== dependencies: growly "^1.3.0" + is-wsl "^1.1.0" semver "^5.5.0" shellwords "^0.1.1" which "^1.3.0" @@ -8090,12 +8282,12 @@ prepend-http@^1.0.0: resolved "https://registry.yarnpkg.com/prepend-http/-/prepend-http-1.0.4.tgz#d4f4562b0ce3696e41ac52d0e002e57a635dc6dc" integrity sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw= -pretty-format@^24.8.0: - version "24.8.0" - resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-24.8.0.tgz#8dae7044f58db7cb8be245383b565a963e3c27f2" - integrity sha512-P952T7dkrDEplsR+TuY7q3VXDae5Sr7zmQb12JU/NDQa/3CH7/QW0yvqLcGN6jL+zQFKaoJcPc+yJxMTGmosqw== +pretty-format@^24.9.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-24.9.0.tgz#12fac31b37019a4eea3c11aa9a959eb7628aa7c9" + integrity sha512-00ZMZUiHaJrNfk33guavqgvfJS30sLYf0f8+Srklv0AMPodGGHcoHgksZ3OThYnIvOd+8yMCn0YiEOogjlgsnA== dependencies: - "@jest/types" "^24.8.0" + "@jest/types" "^24.9.0" ansi-regex "^4.0.0" ansi-styles "^3.2.0" react-is "^16.8.4" @@ -9226,7 +9418,7 @@ semver@4.3.2: resolved "https://registry.yarnpkg.com/semver/-/semver-4.3.2.tgz#c7a07158a80bedd052355b770d82d6640f803be7" integrity sha1-x6BxWKgL7dBSNVt3DYLWZA+AO+c= -semver@^6.0.0, semver@^6.1.0, semver@^6.1.2, semver@^6.3.0: +semver@^6.0.0, semver@^6.1.0, semver@^6.1.2, semver@^6.2.0, semver@^6.3.0: version "6.3.0" resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== @@ -10769,7 +10961,7 @@ yargs-parser@^13.1.0, yargs-parser@^13.1.1: camelcase "^5.0.0" decamelize "^1.2.0" -yargs@12.0.5, yargs@^12.0.2: +yargs@12.0.5: version "12.0.5" resolved "https://registry.yarnpkg.com/yargs/-/yargs-12.0.5.tgz#05f5997b609647b64f66b81e3b4b10a368e7ad13" integrity sha512-Lhz8TLaYnxq/2ObqHDql8dX8CJi97oHxrjUcYtzKbbykPtVW9WB+poxI+NM2UIzsMgNCZTIf0AQwsjK5yMAqZw== From 9aa2a5320eb1ee6f45581eec0e91362f80ec2aba Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Mon, 9 Sep 2019 20:08:45 +0900 Subject: [PATCH 047/134] Bump sanitize from 5.0.0 to 5.1.0 (#11786) Bumps [sanitize](https://github.com/rgrove/sanitize) from 5.0.0 to 5.1.0. - [Release notes](https://github.com/rgrove/sanitize/releases) - [Changelog](https://github.com/rgrove/sanitize/blob/master/HISTORY.md) - [Commits](https://github.com/rgrove/sanitize/compare/v5.0.0...v5.1.0) Signed-off-by: dependabot-preview[bot] --- Gemfile | 2 +- Gemfile.lock | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/Gemfile b/Gemfile index fc7160c82..73edb2a6a 100644 --- a/Gemfile +++ b/Gemfile @@ -77,7 +77,7 @@ gem 'rails-settings-cached', '~> 0.6' gem 'redis', '~> 4.1', require: ['redis', 'redis/connection/hiredis'] gem 'mario-redis-lock', '~> 1.2', require: 'redis_lock' gem 'rqrcode', '~> 0.10' -gem 'sanitize', '~> 5.0' +gem 'sanitize', '~> 5.1' gem 'sidekiq', '~> 5.2' gem 'sidekiq-scheduler', '~> 3.0' gem 'sidekiq-unique-jobs', '~> 6.0' diff --git a/Gemfile.lock b/Gemfile.lock index c0394f247..f74fb729c 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -382,7 +382,7 @@ GEM nio4r (2.4.0) nokogiri (1.10.4) mini_portile2 (~> 2.4.0) - nokogumbo (2.0.0) + nokogumbo (2.0.1) nokogiri (~> 1.8, >= 1.8.4) nsa (0.2.7) activesupport (>= 4.2, < 6) @@ -565,7 +565,7 @@ GEM rufus-scheduler (3.5.2) fugit (~> 1.1, >= 1.1.5) safe_yaml (1.0.5) - sanitize (5.0.0) + sanitize (5.1.0) crass (~> 1.0.2) nokogiri (>= 1.8.0) nokogumbo (~> 2.0) @@ -769,7 +769,7 @@ DEPENDENCIES rspec-sidekiq (~> 3.0) rubocop (~> 0.74) rubocop-rails (~> 2.3) - sanitize (~> 5.0) + sanitize (~> 5.1) sidekiq (~> 5.2) sidekiq-bulk (~> 0.2.0) sidekiq-scheduler (~> 3.0) From 7b1b968b73212d2ea4f7820b9b5b70d172d9d8e6 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Mon, 9 Sep 2019 20:10:17 +0900 Subject: [PATCH 048/134] Bump fastimage from 2.1.5 to 2.1.7 (#11785) Bumps [fastimage](https://github.com/sdsykes/fastimage) from 2.1.5 to 2.1.7. - [Release notes](https://github.com/sdsykes/fastimage/releases) - [Commits](https://github.com/sdsykes/fastimage/compare/v2.1.5...v2.1.7) Signed-off-by: dependabot-preview[bot] --- Gemfile.lock | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Gemfile.lock b/Gemfile.lock index f74fb729c..b8cdbd151 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -236,7 +236,7 @@ GEM faraday (0.15.0) multipart-post (>= 1.2, < 3) fast_blank (1.0.0) - fastimage (2.1.5) + fastimage (2.1.7) ffi (1.10.0) fog-core (2.1.0) builder From ec2a439a22bc74d21a99beedde4c0ae25f682d05 Mon Sep 17 00:00:00 2001 From: ThibG Date: Mon, 9 Sep 2019 14:15:52 +0200 Subject: [PATCH 049/134] Add account bio to account admin view (#11473) * Add account bio to account admin view * Change styling to make bio fields / content more readable --- app/javascript/styles/mastodon/admin.scss | 44 +++++++++++++++++++++++ app/lib/formatter.rb | 3 +- app/views/admin/accounts/show.html.haml | 28 +++++++++++++++ 3 files changed, 73 insertions(+), 2 deletions(-) diff --git a/app/javascript/styles/mastodon/admin.scss b/app/javascript/styles/mastodon/admin.scss index f625bc139..5d4fe4ef8 100644 --- a/app/javascript/styles/mastodon/admin.scss +++ b/app/javascript/styles/mastodon/admin.scss @@ -716,3 +716,47 @@ a.name-tag, text-overflow: ellipsis; vertical-align: middle; } + +.admin-account-bio { + display: flex; + flex-wrap: wrap; + margin: 0 -5px; + margin-top: 20px; + + > div { + box-sizing: border-box; + padding: 0 5px; + margin-bottom: 10px; + flex: 1 0 50%; + } + + .account__header__fields, + .account__header__content { + background: lighten($ui-base-color, 8%); + border-radius: 4px; + height: 100%; + } + + .account__header__fields { + margin: 0; + border: 0; + + a { + color: lighten($ui-highlight-color, 8%); + } + + dl:first-child .verified { + border-radius: 0 4px 0 0; + } + + .verified a { + color: $valid-value-color; + } + } + + .account__header__content { + box-sizing: border-box; + padding: 20px; + color: $primary-text-color; + } +} diff --git a/app/lib/formatter.rb b/app/lib/formatter.rb index b5f42305f..990b9f63e 100644 --- a/app/lib/formatter.rb +++ b/app/lib/formatter.rb @@ -84,8 +84,7 @@ class Formatter end def format_field(account, str, **options) - return reformat(str).html_safe unless account.local? # rubocop:disable Rails/OutputSafety - html = encode_and_link_urls(str, me: true) + html = account.local? ? encode_and_link_urls(str, me: true) : reformat(str) html = encode_custom_emojis(html, account.emojis, options[:autoplay]) if options[:custom_emojify] html.html_safe # rubocop:disable Rails/OutputSafety end diff --git a/app/views/admin/accounts/show.html.haml b/app/views/admin/accounts/show.html.haml index 59babd3b0..40a936e86 100644 --- a/app/views/admin/accounts/show.html.haml +++ b/app/views/admin/accounts/show.html.haml @@ -3,6 +3,34 @@ = render 'application/card', account: @account +- account = @account +- proofs = account.identity_proofs.active +- fields = account.fields +- unless fields.empty? && proofs.empty? && account.note.blank? + .admin-account-bio + - unless fields.empty? && proofs.empty? + %div + .account__header__fields + - proofs.each do |proof| + %dl + %dt= proof.provider.capitalize + %dd.verified + = link_to fa_icon('check'), proof.badge.proof_url, class: 'verified__mark', title: t('accounts.link_verified_on', date: l(proof.updated_at)) + = link_to proof.provider_username, proof.badge.profile_url + + - fields.each do |field| + %dl + %dt.emojify{ title: field.name }= Formatter.instance.format_field(account, field.name, custom_emojify: true) + %dd{ title: field.value, class: custom_field_classes(field) } + - if field.verified? + %span.verified__mark{ title: t('accounts.link_verified_on', date: l(field.verified_at)) } + = fa_icon 'check' + = Formatter.instance.format_field(account, field.value, custom_emojify: true) + + - if account.note.present? + %div + .account__header__content.emojify= Formatter.instance.simplified_format(account, custom_emojify: true) + .dashboard__counters{ style: 'margin-top: 10px' } %div = link_to admin_account_statuses_path(@account.id) do From 14d4a783cda4dd58e61bace172c3bebbe01d2ece Mon Sep 17 00:00:00 2001 From: Eugen Rochko Date: Mon, 9 Sep 2019 20:42:43 +0200 Subject: [PATCH 050/134] Fix display of instance actor in reports UI (#11798) --- app/views/admin/reports/index.html.haml | 4 +++- app/views/admin/reports/show.html.haml | 4 +++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/app/views/admin/reports/index.html.haml b/app/views/admin/reports/index.html.haml index d73faccb0..bfbd32108 100644 --- a/app/views/admin/reports/index.html.haml +++ b/app/views/admin/reports/index.html.haml @@ -28,7 +28,9 @@ - reports.each do |report| .report-card__summary__item .report-card__summary__item__reported-by - - if report.account.local? + - if report.account.instance_actor? + = site_hostname + - elsif report.account.local? = admin_account_link_to report.account - else = report.account.domain diff --git a/app/views/admin/reports/show.html.haml b/app/views/admin/reports/show.html.haml index 863dada9e..bbe83c979 100644 --- a/app/views/admin/reports/show.html.haml +++ b/app/views/admin/reports/show.html.haml @@ -29,7 +29,9 @@ %td= table_link_to 'file', pluralize(@report.target_account.targeted_moderation_notes.count, t('admin.reports.account.note')), admin_reports_path(target_account_id: @report.target_account.id) %tr %th= t('admin.reports.reported_by') - - if @report.account.local? + - if @report.account.instance_actor? + %td{ colspan: 3 }= site_hostname + - elsif @report.account.local? %td= admin_account_link_to @report.account %td= table_link_to 'flag', pluralize(@report.account.targeted_reports.count, t('admin.reports.account.report')), admin_reports_path(target_account_id: @report.account.id) %td= table_link_to 'file', pluralize(@report.account.targeted_moderation_notes.count, t('admin.reports.account.note')), admin_reports_path(target_account_id: @report.account.id) From 1110ea1a9162d5488e1ed5dbccd0803618e713f8 Mon Sep 17 00:00:00 2001 From: Eugen Rochko Date: Mon, 9 Sep 2019 22:44:17 +0200 Subject: [PATCH 051/134] Add batch actions and categories to admin UI for custom emojis (#11793) --- .../admin/custom_emojis_controller.rb | 102 ++++++----------- app/javascript/styles/mastodon/tables.scss | 41 +++++++ app/models/custom_emoji.rb | 6 + app/models/custom_emoji_category.rb | 2 + app/models/custom_emoji_filter.rb | 8 +- app/models/form/custom_emoji_batch.rb | 106 ++++++++++++++++++ .../custom_emojis/_custom_emoji.html.haml | 55 ++++----- app/views/admin/custom_emojis/index.html.haml | 66 ++++++++--- config/locales/en.yml | 3 + config/routes.rb | 8 +- .../admin/custom_emojis_controller_spec.rb | 60 ---------- 11 files changed, 281 insertions(+), 176 deletions(-) create mode 100644 app/models/form/custom_emoji_batch.rb diff --git a/app/controllers/admin/custom_emojis_controller.rb b/app/controllers/admin/custom_emojis_controller.rb index f77699166..2af90f051 100644 --- a/app/controllers/admin/custom_emojis_controller.rb +++ b/app/controllers/admin/custom_emojis_controller.rb @@ -2,19 +2,20 @@ module Admin class CustomEmojisController < BaseController - before_action :set_custom_emoji, except: [:index, :new, :create] - before_action :set_filter_params - include ObfuscateFilename + obfuscate_filename [:custom_emoji, :image] def index authorize :custom_emoji, :index? + @custom_emojis = filtered_custom_emojis.eager_load(:local_counterpart).page(params[:page]) + @form = Form::CustomEmojiBatch.new end def new authorize :custom_emoji, :create? + @custom_emoji = CustomEmoji.new end @@ -31,69 +32,17 @@ module Admin end end - def update - authorize @custom_emoji, :update? - - if @custom_emoji.update(resource_params) - log_action :update, @custom_emoji - flash[:notice] = I18n.t('admin.custom_emojis.updated_msg') - else - flash[:alert] = I18n.t('admin.custom_emojis.update_failed_msg') - end - redirect_to admin_custom_emojis_path(page: params[:page], **@filter_params) - end - - def destroy - authorize @custom_emoji, :destroy? - @custom_emoji.destroy! - log_action :destroy, @custom_emoji - flash[:notice] = I18n.t('admin.custom_emojis.destroyed_msg') - redirect_to admin_custom_emojis_path(page: params[:page], **@filter_params) - end - - def copy - authorize @custom_emoji, :copy? - - emoji = CustomEmoji.find_or_initialize_by(domain: nil, - shortcode: @custom_emoji.shortcode) - emoji.image = @custom_emoji.image - - if emoji.save - log_action :create, emoji - flash[:notice] = I18n.t('admin.custom_emojis.copied_msg') - else - flash[:alert] = I18n.t('admin.custom_emojis.copy_failed_msg') - end - - redirect_to admin_custom_emojis_path(page: params[:page], **@filter_params) - end - - def enable - authorize @custom_emoji, :enable? - @custom_emoji.update!(disabled: false) - log_action :enable, @custom_emoji - flash[:notice] = I18n.t('admin.custom_emojis.enabled_msg') - redirect_to admin_custom_emojis_path(page: params[:page], **@filter_params) - end - - def disable - authorize @custom_emoji, :disable? - @custom_emoji.update!(disabled: true) - log_action :disable, @custom_emoji - flash[:notice] = I18n.t('admin.custom_emojis.disabled_msg') - redirect_to admin_custom_emojis_path(page: params[:page], **@filter_params) + def batch + @form = Form::CustomEmojiBatch.new(form_custom_emoji_batch_params.merge(current_account: current_account, action: action_from_button)) + @form.save + rescue ActionController::ParameterMissing + flash[:alert] = I18n.t('admin.accounts.no_account_selected') + ensure + redirect_to admin_custom_emojis_path(filter_params) end private - def set_custom_emoji - @custom_emoji = CustomEmoji.find(params[:id]) - end - - def set_filter_params - @filter_params = filter_params.to_hash.symbolize_keys - end - def resource_params params.require(:custom_emoji).permit(:shortcode, :image, :visible_in_picker) end @@ -103,12 +52,29 @@ module Admin end def filter_params - params.permit( - :local, - :remote, - :by_domain, - :shortcode - ) + params.slice(:local, :remote, :by_domain, :shortcode, :page).permit(:local, :remote, :by_domain, :shortcode, :page) + end + + def action_from_button + if params[:update] + 'update' + elsif params[:list] + 'list' + elsif params[:unlist] + 'unlist' + elsif params[:enable] + 'enable' + elsif params[:disable] + 'disable' + elsif params[:copy] + 'copy' + elsif params[:delete] + 'delete' + end + end + + def form_custom_emoji_batch_params + params.require(:form_custom_emoji_batch).permit(:action, :category_id, :category_name, custom_emoji_ids: []) end end end diff --git a/app/javascript/styles/mastodon/tables.scss b/app/javascript/styles/mastodon/tables.scss index 2aef099e6..d6403986f 100644 --- a/app/javascript/styles/mastodon/tables.scss +++ b/app/javascript/styles/mastodon/tables.scss @@ -180,6 +180,18 @@ a.table-action-link { } } + &__form { + padding: 16px; + border: 1px solid darken($ui-base-color, 8%); + border-top: 0; + background: $ui-base-color; + + .fields-row { + padding-top: 0; + margin-bottom: 0; + } + } + &__row { border: 1px solid darken($ui-base-color, 8%); border-top: 0; @@ -210,6 +222,35 @@ a.table-action-link { &--unpadded { padding: 0; } + + &--with-image { + display: flex; + align-items: center; + } + + &__image { + flex: 0 0 auto; + display: flex; + justify-content: center; + align-items: center; + margin-right: 10px; + + .emojione { + width: 32px; + height: 32px; + } + } + + &__text { + flex: 1 1 auto; + } + + &__extra { + flex: 0 0 auto; + text-align: right; + color: $darker-text-color; + font-weight: 500; + } } .directory__tag { diff --git a/app/models/custom_emoji.rb b/app/models/custom_emoji.rb index b21ad9042..0a4201a14 100644 --- a/app/models/custom_emoji.rb +++ b/app/models/custom_emoji.rb @@ -59,6 +59,12 @@ class CustomEmoji < ApplicationRecord :emoji end + def copy! + copy = self.class.find_or_initialize_by(domain: nil, shortcode: shortcode) + copy.image = image + copy.save! + end + class << self def from_text(text, domain) return [] if text.blank? diff --git a/app/models/custom_emoji_category.rb b/app/models/custom_emoji_category.rb index 7d8c0ee2d..3c87f2b2e 100644 --- a/app/models/custom_emoji_category.rb +++ b/app/models/custom_emoji_category.rb @@ -12,4 +12,6 @@ class CustomEmojiCategory < ApplicationRecord has_many :emojis, class_name: 'CustomEmoji', foreign_key: 'category_id', inverse_of: :category + + validates :name, presence: true, uniqueness: true end diff --git a/app/models/custom_emoji_filter.rb b/app/models/custom_emoji_filter.rb index 7649055d2..15b8da1d1 100644 --- a/app/models/custom_emoji_filter.rb +++ b/app/models/custom_emoji_filter.rb @@ -11,6 +11,8 @@ class CustomEmojiFilter scope = CustomEmoji.alphabetic params.each do |key, value| + next if key.to_s == 'page' + scope.merge!(scope_for(key, value)) if value.present? end @@ -22,13 +24,13 @@ class CustomEmojiFilter def scope_for(key, value) case key.to_s when 'local' - CustomEmoji.local + CustomEmoji.local.left_joins(:category).reorder(Arel.sql('custom_emoji_categories.name ASC NULLS FIRST, custom_emojis.shortcode ASC')) when 'remote' CustomEmoji.remote when 'by_domain' - CustomEmoji.where(domain: value.downcase) + CustomEmoji.where(domain: value.strip.downcase) when 'shortcode' - CustomEmoji.search(value) + CustomEmoji.search(value.strip) else raise "Unknown filter: #{key}" end diff --git a/app/models/form/custom_emoji_batch.rb b/app/models/form/custom_emoji_batch.rb new file mode 100644 index 000000000..076e8c9e3 --- /dev/null +++ b/app/models/form/custom_emoji_batch.rb @@ -0,0 +1,106 @@ +# frozen_string_literal: true + +class Form::CustomEmojiBatch + include ActiveModel::Model + include Authorization + include AccountableConcern + + attr_accessor :custom_emoji_ids, :action, :current_account, + :category_id, :category_name, :visible_in_picker + + def save + case action + when 'update' + update! + when 'list' + list! + when 'unlist' + unlist! + when 'enable' + enable! + when 'disable' + disable! + when 'copy' + copy! + when 'delete' + delete! + end + end + + private + + def custom_emojis + CustomEmoji.where(id: custom_emoji_ids) + end + + def update! + custom_emojis.each { |custom_emoji| authorize(custom_emoji, :update?) } + + category = begin + if category_id.present? + CustomEmojiCategory.find(category_id) + elsif category_name.present? + CustomEmojiCategory.create!(name: category_name) + end + end + + custom_emojis.each do |custom_emoji| + custom_emoji.update(category_id: category&.id) + log_action :update, custom_emoji + end + end + + def list! + custom_emojis.each { |custom_emoji| authorize(custom_emoji, :update?) } + + custom_emojis.each do |custom_emoji| + custom_emoji.update(visible_in_picker: true) + log_action :update, custom_emoji + end + end + + def unlist! + custom_emojis.each { |custom_emoji| authorize(custom_emoji, :update?) } + + custom_emojis.each do |custom_emoji| + custom_emoji.update(visible_in_picker: false) + log_action :update, custom_emoji + end + end + + def enable! + custom_emojis.each { |custom_emoji| authorize(custom_emoji, :enable?) } + + custom_emojis.each do |custom_emoji| + custom_emoji.update(disabled: false) + log_action :enable, custom_emoji + end + end + + def disable! + custom_emojis.each { |custom_emoji| authorize(custom_emoji, :disable?) } + + custom_emojis.each do |custom_emoji| + custom_emoji.update(disabled: true) + log_action :disable, custom_emoji + end + end + + def copy! + custom_emojis.each { |custom_emoji| authorize(custom_emoji, :copy?) } + + custom_emojis.each do |custom_emoji| + copied_custom_emoji = custom_emoji.copy! + log_action :create, copied_custom_emoji + end + end + + def delete! + custom_emojis.each { |custom_emoji| authorize(custom_emoji, :destroy?) } + + custom_emojis.each do |custom_emoji| + custom_emoji.destroy + log_action :destroy, custom_emoji + end + end +end diff --git a/app/views/admin/custom_emojis/_custom_emoji.html.haml b/app/views/admin/custom_emojis/_custom_emoji.html.haml index fbaa9a174..9e06a3b42 100644 --- a/app/views/admin/custom_emojis/_custom_emoji.html.haml +++ b/app/views/admin/custom_emojis/_custom_emoji.html.haml @@ -1,28 +1,31 @@ -%tr - %td - = custom_emoji_tag(custom_emoji) - %td - %samp= ":#{custom_emoji.shortcode}:" - %td - - if custom_emoji.local? - = t('admin.accounts.location.local') - - else - = link_to custom_emoji.domain, admin_custom_emojis_path(by_domain: custom_emoji.domain) - %td - - if custom_emoji.local? - - if custom_emoji.visible_in_picker - = table_link_to 'eye', t('admin.custom_emojis.listed'), admin_custom_emoji_path(custom_emoji, custom_emoji: { visible_in_picker: false }, page: params[:page], **@filter_params), method: :patch +.batch-table__row + %label.batch-table__row__select.batch-table__row__select--aligned.batch-checkbox + = f.check_box :custom_emoji_ids, { multiple: true, include_hidden: false }, custom_emoji.id + .batch-table__row__content.batch-table__row__content--with-image + .batch-table__row__content__image + = custom_emoji_tag(custom_emoji) + + .batch-table__row__content__text + %samp= ":#{custom_emoji.shortcode}:" + + - if custom_emoji.local? + %span.account-role.bot= custom_emoji.category&.name || t('admin.custom_emojis.uncategorized') + + .batch-table__row__content__extra + - if custom_emoji.local? + = t('admin.accounts.location.local') - else - = table_link_to 'eye-slash', t('admin.custom_emojis.unlisted'), admin_custom_emoji_path(custom_emoji, custom_emoji: { visible_in_picker: true }, page: params[:page], **@filter_params), method: :patch - - else - - if custom_emoji.local_counterpart.present? - = link_to safe_join([custom_emoji_tag(custom_emoji.local_counterpart), t('admin.custom_emojis.overwrite')]), copy_admin_custom_emoji_path(custom_emoji, page: params[:page], **@filter_params), method: :post, class: 'table-action-link' + = custom_emoji.domain + + %br/ + + - if custom_emoji.disabled? + = t('admin.custom_emojis.disabled') - else - = table_link_to 'copy', t('admin.custom_emojis.copy'), copy_admin_custom_emoji_path(custom_emoji, page: params[:page], **@filter_params), method: :post - %td - - if custom_emoji.disabled? - = table_link_to 'power-off', t('admin.custom_emojis.enable'), enable_admin_custom_emoji_path(custom_emoji, page: params[:page], **@filter_params), method: :post, data: { confirm: t('admin.accounts.are_you_sure') } - - else - = table_link_to 'power-off', t('admin.custom_emojis.disable'), disable_admin_custom_emoji_path(custom_emoji, page: params[:page], **@filter_params), method: :post, data: { confirm: t('admin.accounts.are_you_sure') } - %td - = table_link_to 'times', t('admin.custom_emojis.delete'), admin_custom_emoji_path(custom_emoji, page: params[:page], **@filter_params), method: :delete, data: { confirm: t('admin.accounts.are_you_sure') } + = t('admin.custom_emojis.enabled') + - if custom_emoji.local? + • + - if custom_emoji.visible_in_picker? + = t('admin.custom_emojis.listed') + - else + = t('admin.custom_emojis.unlisted') diff --git a/app/views/admin/custom_emojis/index.html.haml b/app/views/admin/custom_emojis/index.html.haml index 3a119276c..7320ce1bb 100644 --- a/app/views/admin/custom_emojis/index.html.haml +++ b/app/views/admin/custom_emojis/index.html.haml @@ -1,6 +1,9 @@ - content_for :page_title do = t('admin.custom_emojis.title') +- content_for :header_tags do + = javascript_pack_tag 'admin', integrity: true, async: true, crossorigin: 'anonymous' + .filters .filter-subset %strong= t('admin.accounts.location.title') @@ -20,8 +23,7 @@ = form_tag admin_custom_emojis_url, method: 'GET', class: 'simple_form' do .fields-group - Admin::FilterHelper::CUSTOM_EMOJI_FILTERS.each do |key| - - if params[key].present? - = hidden_field_tag key, params[key] + = hidden_field_tag key, params[key] if params[key].present? - %i(shortcode by_domain).each do |key| .input.string.optional @@ -31,18 +33,54 @@ %button= t('admin.accounts.search') = link_to t('admin.accounts.reset'), admin_custom_emojis_path, class: 'button negative' -.table-wrapper - %table.table - %thead - %tr - %th= t('admin.custom_emojis.emoji') - %th= t('admin.custom_emojis.shortcode') - %th= t('admin.accounts.domain') - %th - %th - %th - %tbody - = render @custom_emojis += form_for(@form, url: batch_admin_custom_emojis_path) do |f| + = hidden_field_tag :page, params[:page] || 1 + + - Admin::FilterHelper::CUSTOM_EMOJI_FILTERS.each do |key| + = hidden_field_tag key, params[key] if params[key].present? + + .batch-table + .batch-table__toolbar + %label.batch-table__toolbar__select.batch-checkbox-all + = check_box_tag :batch_checkbox_all, nil, false + .batch-table__toolbar__actions + - if params[:local] == '1' + = f.button safe_join([fa_icon('save'), t('generic.save_changes')]), name: :update, class: 'table-action-link', type: :submit, data: { confirm: t('admin.reports.are_you_sure') } + + = f.button safe_join([fa_icon('eye'), t('admin.custom_emojis.list')]), name: :list, class: 'table-action-link', type: :submit, data: { confirm: t('admin.reports.are_you_sure') } + + = f.button safe_join([fa_icon('eye-slash'), t('admin.custom_emojis.unlist')]), name: :unlist, class: 'table-action-link', type: :submit, data: { confirm: t('admin.reports.are_you_sure') } + + = f.button safe_join([fa_icon('power-off'), t('admin.custom_emojis.enable')]), name: :enable, class: 'table-action-link', type: :submit, data: { confirm: t('admin.reports.are_you_sure') } + + = f.button safe_join([fa_icon('power-off'), t('admin.custom_emojis.disable')]), name: :disable, class: 'table-action-link', type: :submit, data: { confirm: t('admin.reports.are_you_sure') } + + = f.button safe_join([fa_icon('times'), t('admin.custom_emojis.delete')]), name: :delete, class: 'table-action-link', type: :submit, data: { confirm: t('admin.reports.are_you_sure') } + + - unless params[:local] == '1' + = f.button safe_join([fa_icon('copy'), t('admin.custom_emojis.copy')]), name: :copy, class: 'table-action-link', type: :submit, data: { confirm: t('admin.reports.are_you_sure') } + + - if params[:local] == '1' + .batch-table__form.simple_form + .fields-row + .fields-group.fields-row__column.fields-row__column-6 + .input.select.optional + .label_input + = f.select :category_id, options_from_collection_for_select(CustomEmojiCategory.all, 'id', 'name'), prompt: t('admin.custom_emojis.assign_category'), class: 'select optional', 'aria-label': t('admin.custom_emojis.assign_category') + + .fields-group.fields-row__column.fields-row__column-6 + .input.string.optional + .label_input + = f.text_field :category_name, class: 'string optional', placeholder: t('admin.custom_emojis.create_new_category'), 'aria-label': t('admin.custom_emojis.create_new_category') + + .batch-table__body + - if @custom_emojis.empty? + = nothing_here 'nothing-here--under-tabs' + - else + = render partial: 'custom_emoji', collection: @custom_emojis, locals: { f: f } = paginate @custom_emojis + +%hr.spacer/ + = link_to t('admin.custom_emojis.upload'), new_admin_custom_emoji_path, class: 'button' diff --git a/config/locales/en.yml b/config/locales/en.yml index 42d8e0eb8..52cb4a269 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -225,10 +225,12 @@ en: deleted_status: "(deleted status)" title: Audit log custom_emojis: + assign_category: Assign category by_domain: Domain copied_msg: Successfully created local copy of the emoji copy: Copy copy_failed_msg: Could not make a local copy of that emoji + create_new_category: Create new category created_msg: Emoji successfully created! delete: Delete destroyed_msg: Emojo successfully destroyed! @@ -245,6 +247,7 @@ en: shortcode: Shortcode shortcode_hint: At least 2 characters, only alphanumeric characters and underscores title: Custom emojis + uncategorized: Uncategorized unlisted: Unlisted update_failed_msg: Could not update that emoji updated_msg: Emoji successfully updated! diff --git a/config/routes.rb b/config/routes.rb index 534e68814..d22a9e56a 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -242,11 +242,9 @@ Rails.application.routes.draw do resource :two_factor_authentication, only: [:destroy] end - resources :custom_emojis, only: [:index, :new, :create, :update, :destroy] do - member do - post :copy - post :enable - post :disable + resources :custom_emojis, only: [:index, :new, :create] do + collection do + post :batch end end diff --git a/spec/controllers/admin/custom_emojis_controller_spec.rb b/spec/controllers/admin/custom_emojis_controller_spec.rb index b7e2894e9..a8d96948c 100644 --- a/spec/controllers/admin/custom_emojis_controller_spec.rb +++ b/spec/controllers/admin/custom_emojis_controller_spec.rb @@ -52,64 +52,4 @@ describe Admin::CustomEmojisController do end end end - - describe 'PUT #update' do - let(:custom_emoji) { Fabricate(:custom_emoji, shortcode: 'test') } - let(:image) { fixture_file_upload(Rails.root.join('spec', 'fixtures', 'files', 'emojo.png'), 'image/png') } - - before do - put :update, params: { id: custom_emoji.id, custom_emoji: params } - end - - context 'when parameter is valid' do - let(:params) { { shortcode: 'updated', image: image } } - - it 'succeeds in updating custom emoji' do - expect(flash[:notice]).to eq I18n.t('admin.custom_emojis.updated_msg') - expect(custom_emoji.reload).to have_attributes(shortcode: 'updated') - end - end - - context 'when parameter is invalid' do - let(:params) { { shortcode: 'u', image: image } } - - it 'fails to update custom emoji' do - expect(flash[:alert]).to eq I18n.t('admin.custom_emojis.update_failed_msg') - expect(custom_emoji.reload).to have_attributes(shortcode: 'test') - end - end - end - - describe 'POST #copy' do - subject { post :copy, params: { id: custom_emoji.id } } - - let(:custom_emoji) { Fabricate(:custom_emoji, shortcode: 'test') } - - it 'copies custom emoji' do - expect { subject }.to change { CustomEmoji.where(shortcode: 'test').count }.by(1) - expect(flash[:notice]).to eq I18n.t('admin.custom_emojis.copied_msg') - end - end - - describe 'POST #enable' do - let(:custom_emoji) { Fabricate(:custom_emoji, shortcode: 'test', disabled: true) } - - before { post :enable, params: { id: custom_emoji.id } } - - it 'enables custom emoji' do - expect(response).to redirect_to admin_custom_emojis_path - expect(custom_emoji.reload).to have_attributes(disabled: false) - end - end - - describe 'POST #disable' do - let(:custom_emoji) { Fabricate(:custom_emoji, shortcode: 'test', disabled: false) } - - before { post :disable, params: { id: custom_emoji.id } } - - it 'enables custom emoji' do - expect(response).to redirect_to admin_custom_emojis_path - expect(custom_emoji.reload).to have_attributes(disabled: true) - end - end end From 0005635f96f69ae282c2b2e53e438aa7e4f2d581 Mon Sep 17 00:00:00 2001 From: Eugen Rochko Date: Tue, 10 Sep 2019 12:43:06 +0200 Subject: [PATCH 052/134] New Crowdin translations (#11626) * New translations en.yml (Chinese Simplified) [ci skip] * New translations en.yml (Greek) [ci skip] * New translations en.yml (Greek) [ci skip] * New translations en.yml (Greek) [ci skip] * New translations en.yml (Greek) [ci skip] * New translations en.yml (Greek) [ci skip] * New translations en.json (Greek) [ci skip] * New translations simple_form.en.yml (Greek) [ci skip] * New translations en.json (Greek) [ci skip] * New translations en.json (Esperanto) [ci skip] * New translations en.yml (Esperanto) [ci skip] * New translations simple_form.en.yml (Esperanto) [ci skip] * New translations en.yml (Esperanto) [ci skip] * New translations simple_form.en.yml (Esperanto) [ci skip] * New translations en.json (Thai) [ci skip] * New translations en.json (Thai) [ci skip] * New translations simple_form.en.yml (Thai) [ci skip] * New translations en.yml (Slovak) [ci skip] * New translations en.json (Persian) [ci skip] * New translations en.json (Persian) [ci skip] * New translations en.yml (Persian) [ci skip] * New translations en.json (Persian) [ci skip] * New translations en.yml (Persian) [ci skip] * New translations en.yml (Persian) [ci skip] * New translations en.yml (Persian) [ci skip] * New translations en.json (Turkish) [ci skip] * New translations en.json (Turkish) [ci skip] * New translations en.json (Turkish) [ci skip] * New translations en.json (Turkish) [ci skip] * New translations en.json (Turkish) [ci skip] * New translations en.yml (Turkish) [ci skip] * New translations doorkeeper.en.yml (Turkish) [ci skip] * New translations activerecord.en.yml (Turkish) [ci skip] * New translations doorkeeper.en.yml (Turkish) [ci skip] * New translations devise.en.yml (Turkish) [ci skip] * New translations simple_form.en.yml (Turkish) [ci skip] * New translations devise.en.yml (Turkish) [ci skip] * New translations simple_form.en.yml (Turkish) [ci skip] * New translations simple_form.en.yml (Turkish) [ci skip] * New translations simple_form.en.yml (Turkish) [ci skip] * New translations en.yml (Turkish) [ci skip] * New translations en.yml (Turkish) [ci skip] * New translations en.yml (Turkish) [ci skip] * New translations en.yml (Turkish) [ci skip] * New translations en.yml (Turkish) [ci skip] * New translations en.yml (Turkish) [ci skip] * New translations en.yml (Turkish) [ci skip] * New translations doorkeeper.en.yml (Turkish) [ci skip] * New translations devise.en.yml (Turkish) [ci skip] * New translations en.yml (Turkish) [ci skip] * New translations en.json (Czech) [ci skip] * New translations en.json (Estonian) [ci skip] * New translations en.json (Dutch) [ci skip] * New translations en.json (Italian) [ci skip] * New translations en.json (Indonesian) [ci skip] * New translations en.json (Ido) [ci skip] * New translations en.json (Hungarian) [ci skip] * New translations en.json (Hebrew) [ci skip] * New translations en.json (Greek) [ci skip] * New translations en.json (German) [ci skip] * New translations en.json (Georgian) [ci skip] * New translations en.json (Galician) [ci skip] * New translations en.json (French) [ci skip] * New translations en.json (Finnish) [ci skip] * New translations en.json (Esperanto) [ci skip] * New translations en.json (Danish) [ci skip] * New translations en.json (Croatian) [ci skip] * New translations en.json (Corsican) [ci skip] * New translations en.json (Chinese Traditional, Hong Kong) [ci skip] * New translations en.json (Chinese Traditional) [ci skip] * New translations en.json (Chinese Simplified) [ci skip] * New translations en.json (Catalan) [ci skip] * New translations en.json (Bulgarian) [ci skip] * New translations en.json (Bengali) [ci skip] * New translations en.json (Basque) [ci skip] * New translations en.json (Asturian) [ci skip] * New translations en.json (Armenian) [ci skip] * New translations en.json (Arabic) [ci skip] * New translations en.json (Albanian) [ci skip] * New translations en.json (Kazakh) [ci skip] * New translations en.json (Japanese) [ci skip] * New translations en.json (Spanish) [ci skip] * New translations en.json (Occitan) [ci skip] * New translations en.json (Persian) [ci skip] * New translations en.json (Polish) [ci skip] * New translations en.json (Portuguese) [ci skip] * New translations en.json (Portuguese, Brazilian) [ci skip] * New translations en.json (Romanian) [ci skip] * New translations en.json (Russian) [ci skip] * New translations en.json (Serbian (Cyrillic)) [ci skip] * New translations en.json (Serbian (Latin)) [ci skip] * New translations en.json (Slovak) [ci skip] * New translations en.json (Slovenian) [ci skip] * New translations en.json (Swedish) [ci skip] * New translations en.json (Malay) [ci skip] * New translations en.json (Tamil) [ci skip] * New translations en.json (Telugu) [ci skip] * New translations en.json (Thai) [ci skip] * New translations en.json (Turkish) [ci skip] * New translations en.json (Ukrainian) [ci skip] * New translations en.json (Welsh) [ci skip] * New translations en.json (Norwegian) [ci skip] * New translations en.json (Lithuanian) [ci skip] * New translations en.json (Latvian) [ci skip] * New translations en.json (Korean) [ci skip] * New translations en.json (Czech) [ci skip] * New translations en.yml (Czech) [ci skip] * New translations en.json (Japanese) [ci skip] * New translations en.yml (Japanese) [ci skip] * New translations simple_form.en.yml (Japanese) [ci skip] * New translations en.json (Japanese) [ci skip] * New translations en.json (Slovak) [ci skip] * New translations en.yml (Slovak) [ci skip] * New translations activerecord.en.yml (Bulgarian) [ci skip] * New translations en.json (Korean) [ci skip] * New translations en.json (Esperanto) [ci skip] * New translations en.json (Korean) [ci skip] * New translations en.yml (Esperanto) [ci skip] * New translations en.yml (Korean) [ci skip] * New translations simple_form.en.yml (Esperanto) [ci skip] * New translations simple_form.en.yml (Korean) [ci skip] * New translations en.json (Danish) [ci skip] * New translations en.json (Danish) [ci skip] * New translations en.json (Slovak) [ci skip] * New translations en.yml (Danish) [ci skip] * New translations en.yml (Danish) [ci skip] * New translations en.json (Danish) [ci skip] * New translations en.yml (Danish) [ci skip] * New translations en.json (Greek) [ci skip] * New translations en.json (Greek) [ci skip] * New translations en.yml (Greek) [ci skip] * New translations en.json (Basque) [ci skip] * New translations en.yml (Basque) [ci skip] * New translations en.yml (Estonian) [ci skip] * New translations en.yml (Czech) [ci skip] * New translations en.yml (Russian) [ci skip] * New translations en.yml (Korean) [ci skip] * New translations en.yml (Lithuanian) [ci skip] * New translations en.yml (Norwegian) [ci skip] * New translations en.yml (Occitan) [ci skip] * New translations en.yml (Persian) [ci skip] * New translations en.yml (Polish) [ci skip] * New translations en.yml (Portuguese) [ci skip] * New translations en.yml (Portuguese, Brazilian) [ci skip] * New translations en.yml (Romanian) [ci skip] * New translations en.yml (Serbian (Cyrillic)) [ci skip] * New translations en.yml (Japanese) [ci skip] * New translations en.yml (Serbian (Latin)) [ci skip] * New translations en.yml (Slovak) [ci skip] * New translations en.yml (Slovenian) [ci skip] * New translations en.yml (Spanish) [ci skip] * New translations en.yml (Swedish) [ci skip] * New translations en.yml (Ukrainian) [ci skip] * New translations en.yml (Welsh) [ci skip] * New translations en.yml (Kazakh) [ci skip] * New translations en.yml (Italian) [ci skip] * New translations en.yml (Albanian) [ci skip] * New translations en.yml (Arabic) [ci skip] * New translations en.yml (Basque) [ci skip] * New translations en.yml (Catalan) [ci skip] * New translations en.yml (Chinese Simplified) [ci skip] * New translations en.yml (Chinese Traditional) [ci skip] * New translations en.yml (Chinese Traditional, Hong Kong) [ci skip] * New translations en.yml (Corsican) [ci skip] * New translations en.yml (Danish) [ci skip] * New translations en.yml (Dutch) [ci skip] * New translations en.yml (Esperanto) [ci skip] * New translations en.yml (Finnish) [ci skip] * New translations en.yml (French) [ci skip] * New translations en.yml (Galician) [ci skip] * New translations en.yml (Georgian) [ci skip] * New translations en.yml (German) [ci skip] * New translations en.yml (Greek) [ci skip] * New translations en.yml (Hungarian) [ci skip] * New translations en.yml (Danish) [ci skip] * New translations en.yml (Danish) [ci skip] * New translations en.yml (Danish) [ci skip] * New translations en.json (Arabic) [ci skip] * New translations en.yml (Arabic) [ci skip] * New translations en.yml (Arabic) [ci skip] * New translations en.json (Arabic) [ci skip] * New translations en.yml (Arabic) [ci skip] * New translations en.json (Arabic) [ci skip] * New translations en.yml (Corsican) [ci skip] * New translations en.json (Corsican) [ci skip] * New translations en.yml (Corsican) [ci skip] * New translations en.yml (French) [ci skip] * New translations en.yml (Czech) [ci skip] * New translations en.yml (Czech) [ci skip] * New translations en.yml (Czech) [ci skip] * New translations en.json (German) [ci skip] * New translations en.yml (German) [ci skip] * New translations en.yml (German) [ci skip] * New translations simple_form.en.yml (German) [ci skip] * New translations en.json (German) [ci skip] * New translations en.json (German) [ci skip] * New translations en.json (Slovak) [ci skip] * New translations en.yml (German) [ci skip] * New translations en.yml (Slovak) [ci skip] * New translations simple_form.en.yml (German) [ci skip] * New translations activerecord.en.yml (German) [ci skip] * New translations devise.en.yml (German) [ci skip] * New translations en.yml (Slovak) [ci skip] * New translations simple_form.en.yml (French) [ci skip] * New translations en.yml (French) [ci skip] * New translations en.yml (French) [ci skip] * New translations en.json (Ukrainian) [ci skip] * New translations en.json (Ukrainian) [ci skip] * New translations en.yml (Ukrainian) [ci skip] * New translations en.json (Ukrainian) [ci skip] * New translations en.yml (Ukrainian) [ci skip] * New translations simple_form.en.yml (Ukrainian) [ci skip] * New translations en.yml (Ukrainian) [ci skip] * New translations en.yml (Slovak) [ci skip] * New translations en.json (Slovak) [ci skip] * New translations en.json (French) [ci skip] * New translations en.yml (Greek) [ci skip] * New translations en.yml (Greek) [ci skip] * New translations en.json (Ukrainian) [ci skip] * New translations en.json (Ukrainian) [ci skip] * New translations en.yml (Ukrainian) [ci skip] * New translations en.yml (Ukrainian) [ci skip] * New translations en.yml (Ukrainian) [ci skip] * New translations en.yml (Ukrainian) [ci skip] * New translations en.yml (Ukrainian) [ci skip] * New translations en.yml (Ukrainian) [ci skip] * New translations en.json (Ukrainian) [ci skip] * New translations simple_form.en.yml (Ukrainian) [ci skip] * New translations en.yml (Ukrainian) [ci skip] * New translations en.yml (Ukrainian) [ci skip] * New translations simple_form.en.yml (Ukrainian) [ci skip] * New translations simple_form.en.yml (Ukrainian) [ci skip] * New translations en.yml (Ukrainian) [ci skip] * New translations simple_form.en.yml (Ukrainian) [ci skip] * New translations en.yml (Ukrainian) [ci skip] * New translations en.yml (Ukrainian) [ci skip] * New translations en.yml (Ukrainian) [ci skip] * New translations en.yml (Ukrainian) [ci skip] * New translations en.yml (Czech) [ci skip] * New translations en.json (Turkish) [ci skip] * New translations en.yml (Turkish) [ci skip] * New translations en.yml (Turkish) [ci skip] * New translations en.yml (Turkish) [ci skip] * New translations en.yml (Corsican) [ci skip] * New translations en.yml (Corsican) [ci skip] * New translations en.json (Galician) [ci skip] * New translations en.yml (Galician) [ci skip] * New translations simple_form.en.yml (Galician) [ci skip] * i18n-tasks normalize * yarn manage:translations --- app/javascript/mastodon/locales/ar.json | 57 +-- app/javascript/mastodon/locales/ast.json | 17 +- app/javascript/mastodon/locales/bg.json | 15 +- app/javascript/mastodon/locales/bn.json | 15 +- app/javascript/mastodon/locales/ca.json | 37 +- app/javascript/mastodon/locales/co.json | 21 +- app/javascript/mastodon/locales/cs.json | 37 +- app/javascript/mastodon/locales/cy.json | 15 +- app/javascript/mastodon/locales/da.json | 213 ++++++----- app/javascript/mastodon/locales/de.json | 19 +- .../mastodon/locales/defaultMessages.json | 13 + app/javascript/mastodon/locales/el.json | 45 ++- app/javascript/mastodon/locales/eo.json | 29 +- app/javascript/mastodon/locales/es.json | 17 +- app/javascript/mastodon/locales/et.json | 17 +- app/javascript/mastodon/locales/eu.json | 33 +- app/javascript/mastodon/locales/fa.json | 47 ++- app/javascript/mastodon/locales/fi.json | 15 +- app/javascript/mastodon/locales/fr.json | 57 +-- app/javascript/mastodon/locales/gl.json | 37 +- app/javascript/mastodon/locales/he.json | 15 +- app/javascript/mastodon/locales/hi.json | 15 +- app/javascript/mastodon/locales/hr.json | 15 +- app/javascript/mastodon/locales/hu.json | 17 +- app/javascript/mastodon/locales/hy.json | 15 +- app/javascript/mastodon/locales/id.json | 15 +- app/javascript/mastodon/locales/io.json | 15 +- app/javascript/mastodon/locales/it.json | 31 +- app/javascript/mastodon/locales/ja.json | 19 +- app/javascript/mastodon/locales/ka.json | 15 +- app/javascript/mastodon/locales/kk.json | 15 +- app/javascript/mastodon/locales/ko.json | 19 +- app/javascript/mastodon/locales/lt.json | 17 +- app/javascript/mastodon/locales/lv.json | 15 +- app/javascript/mastodon/locales/ms.json | 17 +- app/javascript/mastodon/locales/nl.json | 35 +- app/javascript/mastodon/locales/no.json | 15 +- app/javascript/mastodon/locales/oc.json | 17 +- app/javascript/mastodon/locales/pl.json | 17 +- app/javascript/mastodon/locales/pt-BR.json | 15 +- app/javascript/mastodon/locales/pt.json | 15 +- app/javascript/mastodon/locales/ro.json | 15 +- app/javascript/mastodon/locales/ru.json | 17 +- app/javascript/mastodon/locales/sk.json | 29 +- app/javascript/mastodon/locales/sl.json | 17 +- app/javascript/mastodon/locales/sq.json | 15 +- app/javascript/mastodon/locales/sr-Latn.json | 15 +- app/javascript/mastodon/locales/sr.json | 15 +- app/javascript/mastodon/locales/sv.json | 17 +- app/javascript/mastodon/locales/ta.json | 15 +- app/javascript/mastodon/locales/te.json | 15 +- app/javascript/mastodon/locales/th.json | 33 +- app/javascript/mastodon/locales/tr.json | 119 +++--- app/javascript/mastodon/locales/uk.json | 39 +- app/javascript/mastodon/locales/zh-CN.json | 39 +- app/javascript/mastodon/locales/zh-HK.json | 15 +- app/javascript/mastodon/locales/zh-TW.json | 15 +- config/locales/activerecord.bg.yml | 6 + config/locales/activerecord.da.yml | 4 + config/locales/activerecord.tr.yml | 4 + config/locales/ar.yml | 44 ++- config/locales/ast.yml | 7 +- config/locales/bg.yml | 3 + config/locales/bn.yml | 3 + config/locales/ca.yml | 83 +++- config/locales/co.yml | 37 +- config/locales/cs.yml | 105 ++++- config/locales/cy.yml | 16 +- config/locales/da.yml | 125 +++++- config/locales/de.yml | 37 +- config/locales/devise.da.yml | 5 +- config/locales/devise.fr.yml | 2 +- config/locales/devise.tr.yml | 60 +++ config/locales/doorkeeper.ar.yml | 5 + config/locales/doorkeeper.da.yml | 7 + config/locales/doorkeeper.fr.yml | 6 + config/locales/doorkeeper.tr.yml | 89 +++++ config/locales/el.yml | 75 +++- config/locales/eo.yml | 44 ++- config/locales/es.yml | 12 +- config/locales/et.yml | 12 +- config/locales/eu.yml | 22 +- config/locales/fa.yml | 74 +++- config/locales/fi.yml | 6 +- config/locales/fr.yml | 95 ++++- config/locales/gl.yml | 79 +++- config/locales/he.yml | 3 + config/locales/hr.yml | 3 + config/locales/hu.yml | 12 +- config/locales/hy.yml | 3 + config/locales/id.yml | 3 + config/locales/io.yml | 3 + config/locales/it.yml | 68 +++- config/locales/ja.yml | 47 ++- config/locales/ka.yml | 6 +- config/locales/kk.yml | 12 +- config/locales/ko.yml | 15 +- config/locales/lt.yml | 9 +- config/locales/lv.yml | 3 + config/locales/ms.yml | 3 + config/locales/nl.yml | 66 +++- config/locales/no.yml | 6 +- config/locales/oc.yml | 12 +- config/locales/pl.yml | 18 +- config/locales/pt-BR.yml | 12 +- config/locales/pt.yml | 14 +- config/locales/ro.yml | 9 +- config/locales/ru.yml | 24 +- config/locales/simple_form.ar.yml | 4 + config/locales/simple_form.ca.yml | 11 +- config/locales/simple_form.co.yml | 5 +- config/locales/simple_form.cs.yml | 15 +- config/locales/simple_form.cy.yml | 1 - config/locales/simple_form.da.yml | 9 + config/locales/simple_form.de.yml | 5 +- config/locales/simple_form.el.yml | 5 +- config/locales/simple_form.eo.yml | 6 +- config/locales/simple_form.es.yml | 1 - config/locales/simple_form.et.yml | 1 - config/locales/simple_form.eu.yml | 1 - config/locales/simple_form.fa.yml | 1 - config/locales/simple_form.fr.yml | 19 +- config/locales/simple_form.gl.yml | 9 +- config/locales/simple_form.hu.yml | 1 - config/locales/simple_form.it.yml | 7 +- config/locales/simple_form.ja.yml | 7 +- config/locales/simple_form.ko.yml | 5 +- config/locales/simple_form.nl.yml | 4 +- config/locales/simple_form.oc.yml | 1 - config/locales/simple_form.pl.yml | 1 - config/locales/simple_form.pt-BR.yml | 1 - config/locales/simple_form.pt.yml | 1 - config/locales/simple_form.ro.yml | 1 - config/locales/simple_form.ru.yml | 1 - config/locales/simple_form.sk.yml | 4 +- config/locales/simple_form.sl.yml | 1 - config/locales/simple_form.sq.yml | 1 - config/locales/simple_form.sr.yml | 1 - config/locales/simple_form.th.yml | 4 +- config/locales/simple_form.tr.yml | 76 ++++ config/locales/simple_form.uk.yml | 8 +- config/locales/simple_form.zh-CN.yml | 1 - config/locales/simple_form.zh-TW.yml | 1 - config/locales/sk.yml | 49 ++- config/locales/sl.yml | 14 +- config/locales/sq.yml | 9 +- config/locales/sr-Latn.yml | 6 +- config/locales/sr.yml | 11 +- config/locales/sv.yml | 6 +- config/locales/ta.yml | 3 + config/locales/te.yml | 3 + config/locales/th.yml | 5 +- config/locales/tr.yml | 362 +++++++++++++++++- config/locales/uk.yml | 55 ++- config/locales/zh-CN.yml | 23 +- config/locales/zh-HK.yml | 6 +- config/locales/zh-TW.yml | 6 +- 157 files changed, 2889 insertions(+), 862 deletions(-) diff --git a/app/javascript/mastodon/locales/ar.json b/app/javascript/mastodon/locales/ar.json index e7a21523a..6424cd1a7 100644 --- a/app/javascript/mastodon/locales/ar.json +++ b/app/javascript/mastodon/locales/ar.json @@ -4,11 +4,11 @@ "account.block": "حظر @{name}", "account.block_domain": "إخفاء كل شيئ قادم من اسم النطاق {domain}", "account.blocked": "محظور", - "account.cancel_follow_request": "Cancel follow request", + "account.cancel_follow_request": "إلغاء طلب المتابَعة", "account.direct": "رسالة خاصة إلى @{name}", "account.domain_blocked": "النطاق مخفي", "account.edit_profile": "تعديل الملف الشخصي", - "account.endorse": "خاصّية على الملف الشخصي", + "account.endorse": "أوصِ به على صفحتك", "account.follow": "تابِع", "account.followers": "متابعون", "account.followers.empty": "لا أحد يتبع هذا الحساب بعد.", @@ -16,29 +16,33 @@ "account.follows.empty": "هذا الحساب لا يتبع أحدًا بعد.", "account.follows_you": "يتابعك", "account.hide_reblogs": "إخفاء ترقيات @{name}", + "account.last_status": "آخر نشاط", "account.link_verified_on": "تم التحقق مِن مِلْكية هذا الرابط بتاريخ {date}", "account.locked_info": "تم تأمين خصوصية هذا الحساب عبر قفل. صاحب الحساب يُراجِع يدويا طلبات المتابَعة و الاشتراك بحسابه.", "account.media": "وسائط", - "account.mention": "أُذكُر/ي @{name}", + "account.mention": "أذكُر @{name}", "account.moved_to": "{name} انتقل إلى:", - "account.mute": "كتم @{name}", + "account.mute": "أكتم @{name}", "account.mute_notifications": "كتم الإخطارات من @{name}", "account.muted": "مكتوم", - "account.posts": "التبويقات", + "account.never_active": "أبدا", + "account.posts": "تبويقات", "account.posts_with_replies": "التبويقات و الردود", - "account.report": "أبلغ/ي عن @{name}", + "account.report": "ابلِغ عن @{name}", "account.requested": "في انتظار الموافقة. اضْغَطْ/ي لإلغاء طلب المتابعة", "account.share": "مشاركة حساب @{name}", - "account.show_reblogs": "عرض ترقيات @{name}", + "account.show_reblogs": "اعرض ترقيات @{name}", "account.unblock": "إلغاء الحظر عن @{name}", "account.unblock_domain": "فك الخْفى عن {domain}", - "account.unendorse": "إزالة ترويجه مِن الملف الشخصي", + "account.unendorse": "أزل ترويجه مِن الملف الشخصي", "account.unfollow": "إلغاء المتابعة", "account.unmute": "إلغاء الكتم عن @{name}", "account.unmute_notifications": "إلغاء كتم إخطارات @{name}", + "alert.rate_limited.message": "Please retry after {retry_time, time, medium}.", + "alert.rate_limited.title": "Rate limited", "alert.unexpected.message": "لقد طرأ هناك خطأ غير متوقّع.", "alert.unexpected.title": "المعذرة!", - "autosuggest_hashtag.per_week": "{count} per week", + "autosuggest_hashtag.per_week": "{count} في الأسبوع", "boost_modal.combo": "يمكنك/ي ضغط {combo} لتخطّي هذه في المرّة القادمة", "bundle_column_error.body": "لقد وقع هناك خطأ أثناء عملية تحميل هذا العنصر.", "bundle_column_error.retry": "إعادة المحاولة", @@ -49,6 +53,7 @@ "column.blocks": "الحسابات المحجوبة", "column.community": "الخيط العام المحلي", "column.direct": "الرسائل المباشرة", + "column.directory": "Browse profiles", "column.domain_blocks": "النطاقات المخفية", "column.favourites": "المفضلة", "column.follow_requests": "طلبات المتابعة", @@ -95,6 +100,8 @@ "confirmations.delete_list.message": "هل تود حقا حذف هذه القائمة ؟", "confirmations.domain_block.confirm": "إخفاء اسم النطاق كاملا", "confirmations.domain_block.message": "متأكد من أنك تود حظر اسم النطاق {domain} بالكامل ؟ في غالب الأحيان يُستَحسَن كتم أو حظر بعض الحسابات بدلا من حظر نطاق بالكامل.\nلن تتمكن مِن رؤية محتوى هذا النطاق لا على خيوطك العمومية و لا في إشعاراتك. سوف يتم كذلك إزالة كافة متابعيك المنتمين إلى هذا النطاق.", + "confirmations.logout.confirm": "خروج", + "confirmations.logout.message": "متأكد من أنك تريد الخروج؟", "confirmations.mute.confirm": "أكتم", "confirmations.mute.message": "هل أنت متأكد أنك تريد كتم {name} ؟", "confirmations.redraft.confirm": "إزالة و إعادة الصياغة", @@ -103,6 +110,10 @@ "confirmations.reply.message": "الرد في الحين سوف يُعيد كتابة الرسالة التي أنت بصدد كتابتها. متأكد من أنك تريد المواصلة؟", "confirmations.unfollow.confirm": "إلغاء المتابعة", "confirmations.unfollow.message": "متأكد من أنك تريد إلغاء متابعة {name} ؟", + "directory.federated": "From known fediverse", + "directory.local": "From {domain} only", + "directory.new_arrivals": "New arrivals", + "directory.recently_active": "Recently active", "embed.instructions": "يمكنكم إدماج هذا المنشور على موقعكم الإلكتروني عن طريق نسخ الشفرة أدناه.", "embed.preview": "هكذا ما سوف يبدو عليه:", "emoji_button.activity": "الأنشطة", @@ -118,7 +129,7 @@ "emoji_button.search": "ابحث...", "emoji_button.search_results": "نتائج البحث", "emoji_button.symbols": "رموز", - "emoji_button.travel": "أماكن و أسفار", + "emoji_button.travel": "الأماكن والسفر", "empty_column.account_timeline": "ليس هناك تبويقات!", "empty_column.account_unavailable": "الملف الشخصي غير متوفر", "empty_column.blocks": "لم تقم بحظر أي مستخدِم بعد.", @@ -155,10 +166,10 @@ "hashtag.column_settings.tag_mode.any": "أي كان مِن هذه", "hashtag.column_settings.tag_mode.none": "لا شيء مِن هذه", "hashtag.column_settings.tag_toggle": "إدراج الوسوم الإضافية لهذا العمود", - "home.column_settings.basic": "أساسية", + "home.column_settings.basic": "الأساسية", "home.column_settings.show_reblogs": "عرض الترقيات", - "home.column_settings.show_replies": "عرض الردود", - "home.column_settings.update_live": "تحديث في الوقت الحالي", + "home.column_settings.show_replies": "اعرض الردود", + "home.column_settings.update_live": "Update in real-time", "intervals.full.days": "{number, plural, one {# يوم} other {# أيام}}", "intervals.full.hours": "{number, plural, one {# ساعة} other {# ساعات}}", "intervals.full.minutes": "{number, plural, one {# دقيقة} other {# دقائق}}", @@ -218,7 +229,7 @@ "lists.account.add": "أضف إلى القائمة", "lists.account.remove": "احذف من القائمة", "lists.delete": "احذف القائمة", - "lists.edit": "تعديل القائمة", + "lists.edit": "عدّل القائمة", "lists.edit.submit": "تعديل العنوان", "lists.new.create": "إنشاء قائمة", "lists.new.title_placeholder": "عنوان القائمة الجديدة", @@ -227,7 +238,7 @@ "load_pending": "{count, plural, one {# new item} other {# new items}}", "loading_indicator.label": "تحميل...", "media_gallery.toggle_visible": "عرض / إخفاء", - "missing_indicator.label": "تعذر العثور عليه", + "missing_indicator.label": "غير موجود", "missing_indicator.sublabel": "تعذر العثور على هذا المورد", "mute_modal.hide_notifications": "هل تود إخفاء الإخطارات القادمة من هذا المستخدم ؟", "navigation_bar.apps": "تطبيقات الأجهزة المحمولة", @@ -250,7 +261,6 @@ "navigation_bar.personal": "شخصي", "navigation_bar.pins": "التبويقات المثبتة", "navigation_bar.preferences": "التفضيلات", - "navigation_bar.profile_directory": "دليل المستخدِمين", "navigation_bar.public_timeline": "الخيط العام الموحد", "navigation_bar.security": "الأمان", "notification.and_n_others": "and {count, plural, one {# other} other {# others}}", @@ -263,9 +273,9 @@ "notifications.clear_confirmation": "أمتأكد من أنك تود مسح جل الإخطارات الخاصة بك و المتلقاة إلى حد الآن ؟", "notifications.column_settings.alert": "إشعارات سطح المكتب", "notifications.column_settings.favourite": "المُفَضَّلة:", - "notifications.column_settings.filter_bar.advanced": "عرض كافة الفئات", + "notifications.column_settings.filter_bar.advanced": "اعرض كافة الفئات", "notifications.column_settings.filter_bar.category": "شريط الفلترة السريعة", - "notifications.column_settings.filter_bar.show": "عرض", + "notifications.column_settings.filter_bar.show": "اعرض", "notifications.column_settings.follow": "متابعُون جُدُد:", "notifications.column_settings.mention": "الإشارات:", "notifications.column_settings.poll": "نتائج استطلاع الرأي:", @@ -358,6 +368,7 @@ "status.show_more": "أظهر المزيد", "status.show_more_all": "توسيع الكل", "status.show_thread": "الكشف عن المحادثة", + "status.uncached_media_warning": "Not available", "status.unmute_conversation": "فك الكتم عن المحادثة", "status.unpin": "فك التدبيس من الملف الشخصي", "suggestions.dismiss": "إلغاء الاقتراح", @@ -373,20 +384,20 @@ "time_remaining.moments": "لحظات متبقية", "time_remaining.seconds": "{number, plural, one {# second} other {# seconds}} left", "trends.count_by_accounts": "{count} {rawCount, plural, one {person} آخرون {people}} يتحدثون", - "trends.refresh": "Refresh", + "trends.trending_now": "المتداولة الآن", "ui.beforeunload": "سوف تفقد مسودتك إن تركت ماستدون.", "upload_area.title": "اسحب ثم أفلت للرفع", "upload_button.label": "إضافة وسائط ({formats})", "upload_error.limit": "لقد تم بلوغ الحد الأقصى المسموح به لإرسال الملفات.", "upload_error.poll": "لا يمكن إدراج ملفات في استطلاعات الرأي.", "upload_form.description": "وصف للمعاقين بصريا", - "upload_form.edit": "Edit", + "upload_form.edit": "تعديل", "upload_form.undo": "حذف", - "upload_modal.analyzing_picture": "Analyzing picture…", - "upload_modal.apply": "Apply", + "upload_modal.analyzing_picture": "جارٍ فحص الصورة…", + "upload_modal.apply": "طبّق", "upload_modal.description_placeholder": "A quick brown fox jumps over the lazy dog", "upload_modal.detect_text": "Detect text from picture", - "upload_modal.edit_media": "Edit media", + "upload_modal.edit_media": "تعديل الوسائط", "upload_modal.hint": "Click or drag the circle on the preview to choose the focal point which will always be in view on all thumbnails.", "upload_modal.preview_label": "Preview ({ratio})", "upload_progress.label": "يرفع...", diff --git a/app/javascript/mastodon/locales/ast.json b/app/javascript/mastodon/locales/ast.json index c9b5d6061..ef17d6d64 100644 --- a/app/javascript/mastodon/locales/ast.json +++ b/app/javascript/mastodon/locales/ast.json @@ -16,6 +16,7 @@ "account.follows.empty": "Esti usuariu entá nun sigue a naide.", "account.follows_you": "Síguete", "account.hide_reblogs": "Hide boosts from @{name}", + "account.last_status": "Last active", "account.link_verified_on": "Ownership of this link was checked on {date}", "account.locked_info": "This account privacy status is set to locked. The owner manually reviews who can follow them.", "account.media": "Media", @@ -24,10 +25,11 @@ "account.mute": "Silenciar a @{name}", "account.mute_notifications": "Mute notifications from @{name}", "account.muted": "Muted", + "account.never_active": "Never", "account.posts": "Toots", "account.posts_with_replies": "Toots y rempuestes", "account.report": "Report @{name}", - "account.requested": "Awaiting approval. Click to cancel follow request", + "account.requested": "Awaiting approval", "account.share": "Share @{name}'s profile", "account.show_reblogs": "Show boosts from @{name}", "account.unblock": "Desbloquiar a @{name}", @@ -36,6 +38,8 @@ "account.unfollow": "Unfollow", "account.unmute": "Unmute @{name}", "account.unmute_notifications": "Unmute notifications from @{name}", + "alert.rate_limited.message": "Please retry after {retry_time, time, medium}.", + "alert.rate_limited.title": "Rate limited", "alert.unexpected.message": "Asocedió un fallu inesperáu.", "alert.unexpected.title": "¡Ups!", "autosuggest_hashtag.per_week": "{count} per week", @@ -49,6 +53,7 @@ "column.blocks": "Usuarios bloquiaos", "column.community": "Llinia temporal llocal", "column.direct": "Mensaxes direutos", + "column.directory": "Browse profiles", "column.domain_blocks": "Dominios anubríos", "column.favourites": "Favoritos", "column.follow_requests": "Solicitúes de siguimientu", @@ -95,6 +100,8 @@ "confirmations.delete_list.message": "¿De xuru que quies desaniciar dafechu esta llista?", "confirmations.domain_block.confirm": "Anubrir tol dominiu", "confirmations.domain_block.message": "Are you really, really sure you want to block the entire {domain}? In most cases a few targeted blocks or mutes are sufficient and preferable. You will not see content from that domain in any public timelines or your notifications. Your followers from that domain will be removed.", + "confirmations.logout.confirm": "Log out", + "confirmations.logout.message": "Are you sure you want to log out?", "confirmations.mute.confirm": "Mute", "confirmations.mute.message": "¿De xuru que quies silenciar a {name}?", "confirmations.redraft.confirm": "Desaniciar y reeditar", @@ -103,6 +110,10 @@ "confirmations.reply.message": "Replying now will overwrite the message you are currently composing. Are you sure you want to proceed?", "confirmations.unfollow.confirm": "Unfollow", "confirmations.unfollow.message": "¿De xuru que quies dexar de siguir a {name}?", + "directory.federated": "From known fediverse", + "directory.local": "From {domain} only", + "directory.new_arrivals": "New arrivals", + "directory.recently_active": "Recently active", "embed.instructions": "Empotra esti estáu nun sitiu web copiando'l códigu d'embaxo.", "embed.preview": "Asina ye como va vese:", "emoji_button.activity": "Actividaes", @@ -250,7 +261,6 @@ "navigation_bar.personal": "Personal", "navigation_bar.pins": "Toots fixaos", "navigation_bar.preferences": "Preferencies", - "navigation_bar.profile_directory": "Profile directory", "navigation_bar.public_timeline": "Llinia temporal federada", "navigation_bar.security": "Seguranza", "notification.and_n_others": "and {count, plural, one {# other} other {# others}}", @@ -358,6 +368,7 @@ "status.show_more": "Amosar más", "status.show_more_all": "Show more for all", "status.show_thread": "Show thread", + "status.uncached_media_warning": "Not available", "status.unmute_conversation": "Unmute conversation", "status.unpin": "Desfixar del perfil", "suggestions.dismiss": "Dismiss suggestion", @@ -373,7 +384,7 @@ "time_remaining.moments": "Moments remaining", "time_remaining.seconds": "{number, plural, one {# second} other {# seconds}} left", "trends.count_by_accounts": "{count} {rawCount, plural, one {person} other {people}} talking", - "trends.refresh": "Refresh", + "trends.trending_now": "Trending now", "ui.beforeunload": "El borrador va perdese si coles de Mastodon.", "upload_area.title": "Drag & drop to upload", "upload_button.label": "Add media", diff --git a/app/javascript/mastodon/locales/bg.json b/app/javascript/mastodon/locales/bg.json index 3cb5900f4..b0954f199 100644 --- a/app/javascript/mastodon/locales/bg.json +++ b/app/javascript/mastodon/locales/bg.json @@ -16,6 +16,7 @@ "account.follows.empty": "This user doesn't follow anyone yet.", "account.follows_you": "Твой последовател", "account.hide_reblogs": "Hide boosts from @{name}", + "account.last_status": "Last active", "account.link_verified_on": "Ownership of this link was checked on {date}", "account.locked_info": "This account privacy status is set to locked. The owner manually reviews who can follow them.", "account.media": "Media", @@ -24,6 +25,7 @@ "account.mute": "Mute @{name}", "account.mute_notifications": "Mute notifications from @{name}", "account.muted": "Muted", + "account.never_active": "Never", "account.posts": "Публикации", "account.posts_with_replies": "Toots with replies", "account.report": "Report @{name}", @@ -36,6 +38,8 @@ "account.unfollow": "Не следвай", "account.unmute": "Unmute @{name}", "account.unmute_notifications": "Unmute notifications from @{name}", + "alert.rate_limited.message": "Please retry after {retry_time, time, medium}.", + "alert.rate_limited.title": "Rate limited", "alert.unexpected.message": "An unexpected error occurred.", "alert.unexpected.title": "Oops!", "autosuggest_hashtag.per_week": "{count} per week", @@ -49,6 +53,7 @@ "column.blocks": "Blocked users", "column.community": "Local timeline", "column.direct": "Direct messages", + "column.directory": "Browse profiles", "column.domain_blocks": "Hidden domains", "column.favourites": "Favourites", "column.follow_requests": "Follow requests", @@ -95,6 +100,8 @@ "confirmations.delete_list.message": "Are you sure you want to permanently delete this list?", "confirmations.domain_block.confirm": "Hide entire domain", "confirmations.domain_block.message": "Are you really, really sure you want to block the entire {domain}? In most cases a few targeted blocks or mutes are sufficient and preferable.", + "confirmations.logout.confirm": "Log out", + "confirmations.logout.message": "Are you sure you want to log out?", "confirmations.mute.confirm": "Mute", "confirmations.mute.message": "Are you sure you want to mute {name}?", "confirmations.redraft.confirm": "Delete & redraft", @@ -103,6 +110,10 @@ "confirmations.reply.message": "Replying now will overwrite the message you are currently composing. Are you sure you want to proceed?", "confirmations.unfollow.confirm": "Unfollow", "confirmations.unfollow.message": "Are you sure you want to unfollow {name}?", + "directory.federated": "From known fediverse", + "directory.local": "From {domain} only", + "directory.new_arrivals": "New arrivals", + "directory.recently_active": "Recently active", "embed.instructions": "Embed this status on your website by copying the code below.", "embed.preview": "Here is what it will look like:", "emoji_button.activity": "Activity", @@ -250,7 +261,6 @@ "navigation_bar.personal": "Personal", "navigation_bar.pins": "Pinned toots", "navigation_bar.preferences": "Предпочитания", - "navigation_bar.profile_directory": "Profile directory", "navigation_bar.public_timeline": "Публичен канал", "navigation_bar.security": "Security", "notification.and_n_others": "and {count, plural, one {# other} other {# others}}", @@ -358,6 +368,7 @@ "status.show_more": "Show more", "status.show_more_all": "Show more for all", "status.show_thread": "Show thread", + "status.uncached_media_warning": "Not available", "status.unmute_conversation": "Unmute conversation", "status.unpin": "Unpin from profile", "suggestions.dismiss": "Dismiss suggestion", @@ -373,7 +384,7 @@ "time_remaining.moments": "Moments remaining", "time_remaining.seconds": "{number, plural, one {# second} other {# seconds}} left", "trends.count_by_accounts": "{count} {rawCount, plural, one {person} other {people}} talking", - "trends.refresh": "Refresh", + "trends.trending_now": "Trending now", "ui.beforeunload": "Your draft will be lost if you leave Mastodon.", "upload_area.title": "Drag & drop to upload", "upload_button.label": "Добави медия", diff --git a/app/javascript/mastodon/locales/bn.json b/app/javascript/mastodon/locales/bn.json index ee79b0edd..241b43573 100644 --- a/app/javascript/mastodon/locales/bn.json +++ b/app/javascript/mastodon/locales/bn.json @@ -16,6 +16,7 @@ "account.follows.empty": "এই ব্যবহারকারী কাওকে এখনো অনুসরণ করেন না।", "account.follows_you": "আপনাকে অনুসরণ করে", "account.hide_reblogs": "@{name}র সমর্থনগুলি সরিয়ে ফেলুন", + "account.last_status": "Last active", "account.link_verified_on": "এই লিংকের মালিকানা চেক করা হয়েছে {date} তারিকে", "account.locked_info": "এই নিবন্ধনের গোপনীয়তার ক্ষেত্র তালা দেওয়া আছে। নিবন্ধনকারী অনুসরণ করার অনুমতি যাদেরকে দেবেন, শুধু তারাই অনুসরণ করতে পারবেন।", "account.media": "ছবি বা ভিডিও", @@ -24,6 +25,7 @@ "account.mute": "@{name} সব কার্যক্রম আপনার সময়রেখা থেকে সরিয়ে ফেলতে", "account.mute_notifications": "@{name}র প্রজ্ঞাপন আপনার কাছ থেকে সরিয়ে ফেলুন", "account.muted": "সরানো আছে", + "account.never_active": "Never", "account.posts": "টুট", "account.posts_with_replies": "টুট এবং মতামত", "account.report": "@{name} কে রিপোর্ট করতে", @@ -36,6 +38,8 @@ "account.unfollow": "অনুসরণ না করতে", "account.unmute": "@{name}র কার্যকলাপ আবার দেখুন", "account.unmute_notifications": "@{name}র প্রজ্ঞাপন দেওয়ার অনুমতি দিন", + "alert.rate_limited.message": "Please retry after {retry_time, time, medium}.", + "alert.rate_limited.title": "Rate limited", "alert.unexpected.message": "অপ্রত্যাশিত একটি সমস্যা হয়েছে।", "alert.unexpected.title": "ওহো!", "autosuggest_hashtag.per_week": "{count} per week", @@ -49,6 +53,7 @@ "column.blocks": "যাদের বন্ধ করে রাখা হয়েছে", "column.community": "স্থানীয় সময়সারি", "column.direct": "সরাসরি লেখা", + "column.directory": "Browse profiles", "column.domain_blocks": "সরিয়ে ফেলা ওয়েবসাইট", "column.favourites": "পছন্দের গুলো", "column.follow_requests": "অনুসরণের অনুমতি চেয়েছে যারা", @@ -95,6 +100,8 @@ "confirmations.delete_list.message": "আপনি কি নিশ্চিত যে আপনি এই তালিকাটি স্থায়িভাবে মুছে ফেলতে চান ?", "confirmations.domain_block.confirm": "এই ওয়েবসাইট থেকে সব সরান", "confirmations.domain_block.message": "আপনি কি সত্যি সত্যি নিশ্চিত যে {domain} ওয়েবসাইট থেকে সব সরাতে চান ? সাধারণত কিছু লক্ষ্যবস্তু বন্ধ এবং সরানোযা যথেষ্ট। নিশ্চিত করলে ওই ওয়েবসাইট থেকে কোনোকিছু কোনখানে দেখবেন না। যারা আপনাকে অনুসরণ করে ওই ওয়েবসাইট থেকে তাদেরকেও মুছে ফেলা হবে।", + "confirmations.logout.confirm": "Log out", + "confirmations.logout.message": "Are you sure you want to log out?", "confirmations.mute.confirm": "সরিয়ে ফেলুন", "confirmations.mute.message": "আপনি কি নিশ্চিত {name} সরিয়ে ফেলতে চান ?", "confirmations.redraft.confirm": "মুছে ফেলুন এবং আবার সম্পাদন করুন", @@ -103,6 +110,10 @@ "confirmations.reply.message": "এখন মতামত লিখতে গেলে আপনার এখন যেটা লিখছেন সেটা মুছে যাবে। আপনি নি নিশ্চিত এটা করতে চান ?", "confirmations.unfollow.confirm": "অনুসরণ করা বাতিল করতে", "confirmations.unfollow.message": "আপনি কি নিশ্চিত {name} কে আর অনুসরণ করতে চান না ?", + "directory.federated": "From known fediverse", + "directory.local": "From {domain} only", + "directory.new_arrivals": "New arrivals", + "directory.recently_active": "Recently active", "embed.instructions": "এই লেখাটি আপনার ওয়েবসাইটে যুক্ত করতে নিচের কোডটি বেবহার করুন।", "embed.preview": "সেটা দেখতে এরকম হবে:", "emoji_button.activity": "কার্যকলাপ", @@ -250,7 +261,6 @@ "navigation_bar.personal": "নিজস্ব", "navigation_bar.pins": "পিন দেওয়া টুট", "navigation_bar.preferences": "পছন্দসমূহ", - "navigation_bar.profile_directory": "নিজস্ব পাতার তালিকা", "navigation_bar.public_timeline": "যুক্তবিশ্বের সময়রেখা", "navigation_bar.security": "নিরাপত্তা", "notification.and_n_others": "and {count, plural, one {# other} other {# others}}", @@ -358,6 +368,7 @@ "status.show_more": "আরো দেখাতে", "status.show_more_all": "সবগুলোতে আরো দেখতে", "status.show_thread": "আলোচনা দেখতে", + "status.uncached_media_warning": "Not available", "status.unmute_conversation": "আলোচনার প্রজ্ঞাপন চালু করতে", "status.unpin": "নিজের পাতা থেকে পিন করে রাখাটির পিন খুলতে", "suggestions.dismiss": "সাহায্যের পরামর্শগুলো সরাতে", @@ -373,7 +384,7 @@ "time_remaining.moments": "সময় বাকি আছে", "time_remaining.seconds": "{number, plural, one {# second} other {# seconds}} বাকি আছে", "trends.count_by_accounts": "{count} {rawCount, plural, one {person} other {people}} কথা বলছে", - "trends.refresh": "Refresh", + "trends.trending_now": "Trending now", "ui.beforeunload": "যে পর্যন্ত এটা লেখা হয়েছে, মাস্টাডন থেকে চলে গেলে এটা মুছে যাবে।", "upload_area.title": "টেনে এখানে ছেড়ে দিলে এখানে যুক্ত করা যাবে", "upload_button.label": "ছবি বা ভিডিও যুক্ত করতে (এসব ধরণের: JPEG, PNG, GIF, WebM, MP4, MOV)", diff --git a/app/javascript/mastodon/locales/ca.json b/app/javascript/mastodon/locales/ca.json index 4554ff04e..4554500f5 100644 --- a/app/javascript/mastodon/locales/ca.json +++ b/app/javascript/mastodon/locales/ca.json @@ -4,7 +4,7 @@ "account.block": "Bloqueja @{name}", "account.block_domain": "Amaga-ho tot de {domain}", "account.blocked": "Bloquejat", - "account.cancel_follow_request": "Cancel follow request", + "account.cancel_follow_request": "Anul·la la sol·licitud de seguiment", "account.direct": "Missatge directe @{name}", "account.domain_blocked": "Domini ocult", "account.edit_profile": "Editar el perfil", @@ -16,6 +16,7 @@ "account.follows.empty": "Aquest usuari encara no segueix a ningú.", "account.follows_you": "Et segueix", "account.hide_reblogs": "Amaga els impulsos de @{name}", + "account.last_status": "Last active", "account.link_verified_on": "La propietat d'aquest enllaç es va verificar el dia {date}", "account.locked_info": "Aquest estat de privadesa del compte està definit com a bloquejat. El propietari revisa manualment qui pot seguir-lo.", "account.media": "Mèdia", @@ -24,6 +25,7 @@ "account.mute": "Silencia @{name}", "account.mute_notifications": "Notificacions desactivades de @{name}", "account.muted": "Silenciat", + "account.never_active": "Never", "account.posts": "Toots", "account.posts_with_replies": "Toots i respostes", "account.report": "Informe @{name}", @@ -36,9 +38,11 @@ "account.unfollow": "Deixa de seguir", "account.unmute": "Treure silenci de @{name}", "account.unmute_notifications": "Activar notificacions de @{name}", + "alert.rate_limited.message": "Please retry after {retry_time, time, medium}.", + "alert.rate_limited.title": "Rate limited", "alert.unexpected.message": "S'ha produït un error inesperat.", "alert.unexpected.title": "Vaja!", - "autosuggest_hashtag.per_week": "{count} per week", + "autosuggest_hashtag.per_week": "{count} per setmana", "boost_modal.combo": "Pots premer {combo} per saltar-te això el proper cop", "bundle_column_error.body": "S'ha produït un error en carregar aquest component.", "bundle_column_error.retry": "Torna-ho a provar", @@ -49,6 +53,7 @@ "column.blocks": "Usuaris bloquejats", "column.community": "Línia de temps local", "column.direct": "Missatges directes", + "column.directory": "Browse profiles", "column.domain_blocks": "Dominis ocults", "column.favourites": "Favorits", "column.follow_requests": "Peticions per seguir-te", @@ -95,6 +100,8 @@ "confirmations.delete_list.message": "Estàs segur que vols suprimir permanentment aquesta llista?", "confirmations.domain_block.confirm": "Amaga tot el domini", "confirmations.domain_block.message": "Estàs segur, realment segur que vols bloquejar totalment {domain}? En la majoria dels casos bloquejar o silenciar uns pocs objectius és suficient i preferible. No veuràs contingut d’aquest domini en cap de les línies públiques ni en les notificacions. Els teus seguidors d’aquest domini seran eliminats.", + "confirmations.logout.confirm": "Log out", + "confirmations.logout.message": "Are you sure you want to log out?", "confirmations.mute.confirm": "Silencia", "confirmations.mute.message": "Estàs segur que vols silenciar {name}?", "confirmations.redraft.confirm": "Esborrar i refer", @@ -103,6 +110,10 @@ "confirmations.reply.message": "Responen ara es sobreescriurà el missatge que estàs editant. Estàs segur que vols continuar?", "confirmations.unfollow.confirm": "Deixa de seguir", "confirmations.unfollow.message": "Estàs segur que vols deixar de seguir {name}?", + "directory.federated": "From known fediverse", + "directory.local": "From {domain} only", + "directory.new_arrivals": "New arrivals", + "directory.recently_active": "Recently active", "embed.instructions": "Incrusta aquest toot al lloc web copiant el codi a continuació.", "embed.preview": "Aquí tenim quin aspecte tindrá:", "emoji_button.activity": "Activitat", @@ -158,7 +169,7 @@ "home.column_settings.basic": "Bàsic", "home.column_settings.show_reblogs": "Mostrar impulsos", "home.column_settings.show_replies": "Mostrar respostes", - "home.column_settings.update_live": "Actualització en temps real", + "home.column_settings.update_live": "Update in real-time", "intervals.full.days": "{number, plural, one {# dia} other {# dies}}", "intervals.full.hours": "{number, plural, one {# hora} other {# hores}}", "intervals.full.minutes": "{number, plural, one {# minut} other {# minuts}}", @@ -250,7 +261,6 @@ "navigation_bar.personal": "Personal", "navigation_bar.pins": "Toots fixats", "navigation_bar.preferences": "Preferències", - "navigation_bar.profile_directory": "Directori de perfils", "navigation_bar.public_timeline": "Línia de temps federada", "navigation_bar.security": "Seguretat", "notification.and_n_others": "and {count, plural, one {# other} other {# others}}", @@ -358,6 +368,7 @@ "status.show_more": "Mostra més", "status.show_more_all": "Mostra més per a tot", "status.show_thread": "Mostra el fil", + "status.uncached_media_warning": "Not available", "status.unmute_conversation": "Activar conversació", "status.unpin": "Deslliga del perfil", "suggestions.dismiss": "Descartar suggeriment", @@ -373,22 +384,22 @@ "time_remaining.moments": "Moments restants", "time_remaining.seconds": "{number, plural, one {# segon} other {# segons}} restants", "trends.count_by_accounts": "{count} {rawCount, plural, one {persona} other {gent}} talking", - "trends.refresh": "Refresh", + "trends.trending_now": "Trending now", "ui.beforeunload": "El teu esborrany es perdrà si surts de Mastodon.", "upload_area.title": "Arrossega i deixa anar per a carregar", "upload_button.label": "Afegir multimèdia (JPEG, PNG, GIF, WebM, MP4, MOV)", "upload_error.limit": "S'ha superat el límit de càrrega d'arxius.", "upload_error.poll": "No es permet l'enviament de fitxers en les enquestes.", "upload_form.description": "Descriure els problemes visuals", - "upload_form.edit": "Edit", + "upload_form.edit": "Edita", "upload_form.undo": "Esborra", - "upload_modal.analyzing_picture": "Analyzing picture…", - "upload_modal.apply": "Apply", - "upload_modal.description_placeholder": "A quick brown fox jumps over the lazy dog", - "upload_modal.detect_text": "Detect text from picture", - "upload_modal.edit_media": "Edit media", - "upload_modal.hint": "Click or drag the circle on the preview to choose the focal point which will always be in view on all thumbnails.", - "upload_modal.preview_label": "Preview ({ratio})", + "upload_modal.analyzing_picture": "Analitzant imatge…", + "upload_modal.apply": "Aplica", + "upload_modal.description_placeholder": "Uns salts ràpids de guineu marró sobre el gos gandul", + "upload_modal.detect_text": "Detecta el text de l'imatge", + "upload_modal.edit_media": "Editar multimèdia", + "upload_modal.hint": "Fes clic o arrossega el cercle en la previsualització per escollir el punt focal que sempre serà visible de totes les miniatures.", + "upload_modal.preview_label": "Previsualitza ({ratio})", "upload_progress.label": "Pujant...", "video.close": "Tancar el vídeo", "video.exit_fullscreen": "Sortir de pantalla completa", diff --git a/app/javascript/mastodon/locales/co.json b/app/javascript/mastodon/locales/co.json index 428c993a6..b54857e36 100644 --- a/app/javascript/mastodon/locales/co.json +++ b/app/javascript/mastodon/locales/co.json @@ -16,6 +16,7 @@ "account.follows.empty": "St'utilizatore ùn seguita nisunu.", "account.follows_you": "Vi seguita", "account.hide_reblogs": "Piattà spartere da @{name}", + "account.last_status": "Ultima attività", "account.link_verified_on": "A prupietà di stu ligame hè stata verificata u {date}", "account.locked_info": "U statutu di vita privata di u contu hè chjosu. U pruprietariu esamina manualmente e dumande d'abbunamentu.", "account.media": "Media", @@ -24,6 +25,7 @@ "account.mute": "Piattà @{name}", "account.mute_notifications": "Piattà nutificazione da @{name}", "account.muted": "Piattatu", + "account.never_active": "Mai", "account.posts": "Statuti", "account.posts_with_replies": "Statuti è risposte", "account.report": "Palisà @{name}", @@ -36,6 +38,8 @@ "account.unfollow": "Ùn siguità più", "account.unmute": "Ùn piattà più @{name}", "account.unmute_notifications": "Ùn piattà più nutificazione da @{name}", + "alert.rate_limited.message": "Pruvate ancu dop'à {retry_time, time, medium}.", + "alert.rate_limited.title": "Ghjettu limitatu", "alert.unexpected.message": "Un prublemu inaspettatu hè accadutu.", "alert.unexpected.title": "Uups!", "autosuggest_hashtag.per_week": "{count} per settimana", @@ -49,6 +53,7 @@ "column.blocks": "Utilizatori bluccati", "column.community": "Linea pubblica lucale", "column.direct": "Missaghji diretti", + "column.directory": "Percorre i prufili", "column.domain_blocks": "Duminii piattati", "column.favourites": "Favuriti", "column.follow_requests": "Dumande d'abbunamentu", @@ -95,6 +100,8 @@ "confirmations.delete_list.message": "Site sicuru·a che vulete supprime sta lista?", "confirmations.domain_block.confirm": "Piattà tuttu u duminiu", "confirmations.domain_block.message": "Site sicuru·a che vulete piattà tuttu à {domain}? Saria forse abbastanza di bluccà ò piattà alcuni conti da quallà. Ùn viderete più nunda da quallà indè e linee pubbliche o e nutificazione. I vostri abbunati da stu duminiu saranu tolti.", + "confirmations.logout.confirm": "Scunnettassi", + "confirmations.logout.message": "Site sicuru·a che vulete scunnettà vi?", "confirmations.mute.confirm": "Piattà", "confirmations.mute.message": "Site sicuru·a che vulete piattà @{name}?", "confirmations.redraft.confirm": "Sguassà è riscrive", @@ -103,6 +110,10 @@ "confirmations.reply.message": "Risponde avà sguasserà u missaghju chì scrivite. Site sicuru·a chì vulete cuntinuà?", "confirmations.unfollow.confirm": "Disabbunassi", "confirmations.unfollow.message": "Site sicuru·a ch'ùn vulete più siguità @{name}?", + "directory.federated": "Da u fediverse cunisciutu", + "directory.local": "Solu da {domain}", + "directory.new_arrivals": "Ultimi arrivi", + "directory.recently_active": "Attività ricente", "embed.instructions": "Integrà stu statutu à u vostru situ cù u codice quì sottu.", "embed.preview": "Assumiglierà à qualcosa cusì:", "emoji_button.activity": "Attività", @@ -158,7 +169,7 @@ "home.column_settings.basic": "Bàsichi", "home.column_settings.show_reblogs": "Vede e spartere", "home.column_settings.show_replies": "Vede e risposte", - "home.column_settings.update_live": "Mette à ghjornu in tempu reale", + "home.column_settings.update_live": "Update in real-time", "intervals.full.days": "{number, plural, one {# ghjornu} other {# ghjorni}}", "intervals.full.hours": "{number, plural, one {# ora} other {# ore}}", "intervals.full.minutes": "{number, plural, one {# minuta} other {# minute}}", @@ -250,10 +261,9 @@ "navigation_bar.personal": "Persunale", "navigation_bar.pins": "Statuti puntarulati", "navigation_bar.preferences": "Preferenze", - "navigation_bar.profile_directory": "Annuariu di i prufili", "navigation_bar.public_timeline": "Linea pubblica glubale", "navigation_bar.security": "Sicurità", - "notification.and_n_others": "è {count, plural, one {# altru} other {# altri}}", + "notification.and_n_others": "and {count, plural, one {# other} other {# others}}", "notification.favourite": "{name} hà aghjuntu u vostru statutu à i so favuriti", "notification.follow": "{name} v'hà seguitatu", "notification.mention": "{name} v'hà mintuvatu", @@ -358,6 +368,7 @@ "status.show_more": "Slibrà", "status.show_more_all": "Slibrà tuttu", "status.show_thread": "Vede u filu", + "status.uncached_media_warning": "Micca dispunibule", "status.unmute_conversation": "Ùn piattà più a cunversazione", "status.unpin": "Spuntarulà da u prufile", "suggestions.dismiss": "Righjittà a pruposta", @@ -373,7 +384,7 @@ "time_remaining.moments": "Ci fermanu qualchi mumentu", "time_remaining.seconds": "{number, plural, one {# siconda ferma} other {# siconde fermanu}}", "trends.count_by_accounts": "{count} {rawCount, plural, one {person} other {people}} parlanu", - "trends.refresh": "Attualizà", + "trends.trending_now": "Tindenze d'avà", "ui.beforeunload": "A bruttacopia sarà persa s'ellu hè chjosu Mastodon.", "upload_area.title": "Drag & drop per caricà un fugliale", "upload_button.label": "Aghjunghje un media (JPEG, PNG, GIF, WebM, MP4, MOV)", @@ -384,7 +395,7 @@ "upload_form.undo": "Sguassà", "upload_modal.analyzing_picture": "Analisi di u ritrattu…", "upload_modal.apply": "Affettà", - "upload_modal.description_placeholder": "A quick brown fox jumps over the lazy dog", + "upload_modal.description_placeholder": "Chì tempi brevi ziu, quandu solfeghji", "upload_modal.detect_text": "Ditettà testu da u ritrattu", "upload_modal.edit_media": "Cambià media", "upload_modal.hint": "Cliccate o sguillate u chjerchju nant'à a vista per sceglie u puntu fucale chì sarà sempre in vista indè tutte e miniature.", diff --git a/app/javascript/mastodon/locales/cs.json b/app/javascript/mastodon/locales/cs.json index 46a57b3b8..b3d1e8157 100644 --- a/app/javascript/mastodon/locales/cs.json +++ b/app/javascript/mastodon/locales/cs.json @@ -4,7 +4,7 @@ "account.block": "Zablokovat uživatele @{name}", "account.block_domain": "Skrýt vše z {domain}", "account.blocked": "Blokován/a", - "account.cancel_follow_request": "Cancel follow request", + "account.cancel_follow_request": "Zrušit požadavek o sledování", "account.direct": "Poslat přímou zprávu uživateli @{name}", "account.domain_blocked": "Doména skryta", "account.edit_profile": "Upravit profil", @@ -16,6 +16,7 @@ "account.follows.empty": "Tento uživatel ještě nikoho nesleduje.", "account.follows_you": "Sleduje vás", "account.hide_reblogs": "Skrýt boosty od uživatele @{name}", + "account.last_status": "Naposledy aktivní", "account.link_verified_on": "Vlastnictví tohoto odkazu bylo zkontrolováno {date}", "account.locked_info": "Stav soukromí tohoto účtu je nastaven na zamčeno. Jeho vlastník ručně posuzuje, kdo ho může sledovat.", "account.media": "Média", @@ -24,6 +25,7 @@ "account.mute": "Skrýt uživatele @{name}", "account.mute_notifications": "Skrýt oznámení od uživatele @{name}", "account.muted": "Skryt/a", + "account.never_active": "Nikdy", "account.posts": "Tooty", "account.posts_with_replies": "Tooty a odpovědi", "account.report": "Nahlásit uživatele @{name}", @@ -36,9 +38,11 @@ "account.unfollow": "Přestat sledovat", "account.unmute": "Odkrýt uživatele @{name}", "account.unmute_notifications": "Odkrýt oznámení od uživatele @{name}", + "alert.rate_limited.message": "Prosím zkuste to znovu za {retry_time, time, medium}.", + "alert.rate_limited.title": "Rychlost omezena", "alert.unexpected.message": "Objevila se neočekávaná chyba.", "alert.unexpected.title": "Jejda!", - "autosuggest_hashtag.per_week": "{count} per week", + "autosuggest_hashtag.per_week": "{count} za týden", "boost_modal.combo": "Příště můžete pro přeskočení kliknout na {combo}", "bundle_column_error.body": "Při načítání tohoto komponentu se něco pokazilo.", "bundle_column_error.retry": "Zkuste to znovu", @@ -49,6 +53,7 @@ "column.blocks": "Blokovaní uživatelé", "column.community": "Místní časová osa", "column.direct": "Přímé zprávy", + "column.directory": "Prozkoumat profily", "column.domain_blocks": "Skryté domény", "column.favourites": "Oblíbené", "column.follow_requests": "Požadavky o sledování", @@ -95,6 +100,8 @@ "confirmations.delete_list.message": "Jste si jistý/á, že chcete tento seznam navždy smazat?", "confirmations.domain_block.confirm": "Skrýt celou doménu", "confirmations.domain_block.message": "Jste si opravdu, opravdu jistý/á, že chcete blokovat celou doménu {domain}? Ve většině případů stačí zablokovat nebo skrýt pár konkrétních uživatelů, což se doporučuje. Z této domény neuvidíte obsah v žádné veřejné časové ose ani v oznámeních. Vaši sledující z této domény budou odstraněni.", + "confirmations.logout.confirm": "Odhlásit", + "confirmations.logout.message": "Jste si jistý/á, že se chcete odhlásit?", "confirmations.mute.confirm": "Skrýt", "confirmations.mute.message": "Jste si jistý/á, že chcete skrýt uživatele {name}?", "confirmations.redraft.confirm": "Smazat a přepsat", @@ -103,6 +110,10 @@ "confirmations.reply.message": "Odpovězením nyní přepíšete zprávu, kterou aktuálně píšete. Jste si jistý/á, že chcete pokračovat?", "confirmations.unfollow.confirm": "Přestat sledovat", "confirmations.unfollow.message": "jste si jistý/á, že chcete přestat sledovat uživatele {name}?", + "directory.federated": "Ze známého fedivesmíru", + "directory.local": "Pouze z {domain}", + "directory.new_arrivals": "Nově příchozí", + "directory.recently_active": "Nedávno aktivní", "embed.instructions": "Pro přidání tootu na vaši webovou stránku zkopírujte níže uvedený kód.", "embed.preview": "Takhle to bude vypadat:", "emoji_button.activity": "Aktivita", @@ -158,7 +169,7 @@ "home.column_settings.basic": "Základní", "home.column_settings.show_reblogs": "Zobrazit boosty", "home.column_settings.show_replies": "Zobrazit odpovědi", - "home.column_settings.update_live": "Aktualizovat v reálném čase", + "home.column_settings.update_live": "Update in real-time", "intervals.full.days": "{number, plural, one {# den} few {# dny} many {# dne} other {# dní}}", "intervals.full.hours": "{number, plural, one {# hodina} few {# hodiny} many {# hodiny} other {# hodin}}", "intervals.full.minutes": "{number, plural, one {# minuta} few {# minuty} many {# minuty} other {# minut}}", @@ -250,7 +261,6 @@ "navigation_bar.personal": "Osobní", "navigation_bar.pins": "Připnuté tooty", "navigation_bar.preferences": "Předvolby", - "navigation_bar.profile_directory": "Adresář profilů", "navigation_bar.public_timeline": "Federovaná časová osa", "navigation_bar.security": "Zabezpečení", "notification.and_n_others": "and {count, plural, one {# other} other {# others}}", @@ -358,6 +368,7 @@ "status.show_more": "Zobrazit více", "status.show_more_all": "Zobrazit více pro všechny", "status.show_thread": "Zobrazit vlákno", + "status.uncached_media_warning": "Nedostupné", "status.unmute_conversation": "Odkrýt konverzaci", "status.unpin": "Odepnout z profilu", "suggestions.dismiss": "Odmítnout návrh", @@ -373,22 +384,22 @@ "time_remaining.moments": "Zbývá několik sekund", "time_remaining.seconds": "{number, plural, one {Zbývá # sekunda} few {Zbývají # sekundy} many {Zbývá # sekundy} other {Zbývá # sekund}}", "trends.count_by_accounts": "{count} {rawCount, plural, one {člověk} few {lidé} many {lidí} other {lidí}} hovoří", - "trends.refresh": "Refresh", + "trends.trending_now": "Aktuální trendy", "ui.beforeunload": "Váš koncept se ztratí, pokud Mastodon opustíte.", "upload_area.title": "Přetažením nahrajete", "upload_button.label": "Přidat média (JPEG, PNG, GIF, WebM, MP4, MOV)", "upload_error.limit": "Byl překročen limit nahraných souborů.", "upload_error.poll": "Nahrávání souborů není povoleno u anket.", "upload_form.description": "Popis pro zrakově postižené", - "upload_form.edit": "Edit", + "upload_form.edit": "Upravit", "upload_form.undo": "Smazat", - "upload_modal.analyzing_picture": "Analyzing picture…", - "upload_modal.apply": "Apply", - "upload_modal.description_placeholder": "A quick brown fox jumps over the lazy dog", - "upload_modal.detect_text": "Detect text from picture", - "upload_modal.edit_media": "Edit media", - "upload_modal.hint": "Click or drag the circle on the preview to choose the focal point which will always be in view on all thumbnails.", - "upload_modal.preview_label": "Preview ({ratio})", + "upload_modal.analyzing_picture": "Analyzuji obrázek…", + "upload_modal.apply": "Použít", + "upload_modal.description_placeholder": "Příliš žluťoučký kůň úpěl ďábelské ódy", + "upload_modal.detect_text": "Detekovat text z obrázku", + "upload_modal.edit_media": "Upravit média", + "upload_modal.hint": "Kliknutím na nebo přetáhnutím kruhu na náhledu vyberte bod soustředění, který bude vždy zobrazen na všech náhledech.", + "upload_modal.preview_label": "Náhled ({ratio})", "upload_progress.label": "Nahrávám…", "video.close": "Zavřít video", "video.exit_fullscreen": "Ukončit celou obrazovku", diff --git a/app/javascript/mastodon/locales/cy.json b/app/javascript/mastodon/locales/cy.json index 0bd6f19d2..bc65d601e 100644 --- a/app/javascript/mastodon/locales/cy.json +++ b/app/javascript/mastodon/locales/cy.json @@ -16,6 +16,7 @@ "account.follows.empty": "Nid yw'r defnyddiwr hwn yn dilyn unrhyw un eto.", "account.follows_you": "Yn eich dilyn chi", "account.hide_reblogs": "Cuddio bwstiau o @{name}", + "account.last_status": "Last active", "account.link_verified_on": "Gwiriwyd perchnogaeth y ddolen yma ar {date}", "account.locked_info": "Mae'r statws preifatrwydd cyfrif hwn wedi'i osod i gloi. Mae'r perchennog yn adolygu'r sawl sy'n gallu eu dilyn.", "account.media": "Cyfryngau", @@ -24,6 +25,7 @@ "account.mute": "Tawelu @{name}", "account.mute_notifications": "Cuddio hysbysiadau o @{name}", "account.muted": "Distewyd", + "account.never_active": "Never", "account.posts": "Tŵtiau", "account.posts_with_replies": "Tŵtiau ac atebion", "account.report": "Adrodd @{name}", @@ -36,6 +38,8 @@ "account.unfollow": "Dad-ddilyn", "account.unmute": "Dad-dawelu @{name}", "account.unmute_notifications": "Dad-dawelu hysbysiadau o @{name}", + "alert.rate_limited.message": "Please retry after {retry_time, time, medium}.", + "alert.rate_limited.title": "Rate limited", "alert.unexpected.message": "Digwyddodd gwall annisgwyl.", "alert.unexpected.title": "Wps!", "autosuggest_hashtag.per_week": "{count} per week", @@ -49,6 +53,7 @@ "column.blocks": "Defnyddwyr a flociwyd", "column.community": "Ffrwd lleol", "column.direct": "Negeseuon preifat", + "column.directory": "Browse profiles", "column.domain_blocks": "Parthau cuddiedig", "column.favourites": "Ffefrynnau", "column.follow_requests": "Ceisiadau dilyn", @@ -95,6 +100,8 @@ "confirmations.delete_list.message": "Ydych chi'n sicr eich bod eisiau dileu y rhestr hwn am byth?", "confirmations.domain_block.confirm": "Cuddio parth cyfan", "confirmations.domain_block.message": "A ydych yn hollol, hollol sicr eich bod am flocio y {domain} cyfan? Yn y nifer helaeth o achosion mae blocio neu tawelu ambell gyfrif yn ddigonol ac yn well. Ni fyddwch yn gweld cynnwys o'r parth hwnnw mewn unrhyw ffrydiau cyhoeddus na chwaith yn eich hysbysiadau. Bydd hyn yn cael gwared o'ch dilynwyr o'r parth hwnnw.", + "confirmations.logout.confirm": "Log out", + "confirmations.logout.message": "Are you sure you want to log out?", "confirmations.mute.confirm": "Tawelu", "confirmations.mute.message": "Ydych chi'n sicr eich bod am ddistewi {name}?", "confirmations.redraft.confirm": "Dileu & ailddrafftio", @@ -103,6 +110,10 @@ "confirmations.reply.message": "Bydd ateb nawr yn cymryd lle y neges yr ydych yn cyfansoddi ar hyn o bryd. Ydych chi'n sicr yr ydych am barhau?", "confirmations.unfollow.confirm": "Dad-ddilynwch", "confirmations.unfollow.message": "Ydych chi'n sicr eich bod am ddad-ddilyn {name}?", + "directory.federated": "From known fediverse", + "directory.local": "From {domain} only", + "directory.new_arrivals": "New arrivals", + "directory.recently_active": "Recently active", "embed.instructions": "Mewnblannwch y tŵt hwn ar eich gwefan drwy gopïo'r côd isod.", "embed.preview": "Dyma sut olwg fydd arno:", "emoji_button.activity": "Gweithgarwch", @@ -250,7 +261,6 @@ "navigation_bar.personal": "Personol", "navigation_bar.pins": "Tŵtiau wedi eu pinio", "navigation_bar.preferences": "Dewisiadau", - "navigation_bar.profile_directory": "Cyfeiriadur Proffil", "navigation_bar.public_timeline": "Ffrwd y ffederasiwn", "navigation_bar.security": "Diogelwch", "notification.and_n_others": "and {count, plural, one {# other} other {# others}}", @@ -358,6 +368,7 @@ "status.show_more": "Dangos mwy", "status.show_more_all": "Dangos mwy i bawb", "status.show_thread": "Dangos edefyn", + "status.uncached_media_warning": "Not available", "status.unmute_conversation": "Dad-dawelu sgwrs", "status.unpin": "Dadbinio o'r proffil", "suggestions.dismiss": "Diswyddo", @@ -373,7 +384,7 @@ "time_remaining.moments": "Munudau ar ôl", "time_remaining.seconds": "{number, plural, one {# eiliad} other {# o eiliadau}} ar ôl", "trends.count_by_accounts": "{count} {rawCount, plural, one {person} other {people}} yn siarad", - "trends.refresh": "Refresh", + "trends.trending_now": "Trending now", "ui.beforeunload": "Mi fyddwch yn colli eich drafft os gadewch Mastodon.", "upload_area.title": "Llusgwch & gollwing i uwchlwytho", "upload_button.label": "Ychwanegwch gyfryngau (JPEG, PNG, GIF, WebM, MP4, MOV)", diff --git a/app/javascript/mastodon/locales/da.json b/app/javascript/mastodon/locales/da.json index b021f9aa1..dff8c3c05 100644 --- a/app/javascript/mastodon/locales/da.json +++ b/app/javascript/mastodon/locales/da.json @@ -4,7 +4,7 @@ "account.block": "Bloker @{name}", "account.block_domain": "Skjul alt fra {domain}", "account.blocked": "Blokeret", - "account.cancel_follow_request": "Cancel follow request", + "account.cancel_follow_request": "Annullér følgeranmodning", "account.direct": "Send en direkte besked til @{name}", "account.domain_blocked": "Domænet er blevet skjult", "account.edit_profile": "Rediger profil", @@ -16,14 +16,16 @@ "account.follows.empty": "Denne bruger følger endnu ikke nogen.", "account.follows_you": "Følger dig", "account.hide_reblogs": "Skjul fremhævelserne fra @{name}", + "account.last_status": "Sidst aktiv", "account.link_verified_on": "Ejerskabet af dette link blev tjekket den %{date}", - "account.locked_info": "This account privacy status is set to locked. The owner manually reviews who can follow them.", + "account.locked_info": "Denne kontos privatlivsstatus er sat til låst. Ejeren bedømmer manuelt, hvem der kan følge dem.", "account.media": "Medie", "account.mention": "Nævn @{name}", "account.moved_to": "{name} er flyttet til:", "account.mute": "Dæmp @{name}", "account.mute_notifications": "Dæmp notifikationer fra @{name}", "account.muted": "Dæmpet", + "account.never_active": "Aldrig", "account.posts": "Trut", "account.posts_with_replies": "Trut og svar", "account.report": "Rapporter @{name}", @@ -36,9 +38,11 @@ "account.unfollow": "Følg ikke længere", "account.unmute": "Fjern dæmpningen af @{name}", "account.unmute_notifications": "Fjern dæmpningen af notifikationer fra @{name}", + "alert.rate_limited.message": "Prøv venligst igen efter {retry_time, time, medium}.", + "alert.rate_limited.title": "Rate limited", "alert.unexpected.message": "Der opstod en uventet fejl.", "alert.unexpected.title": "Ups!", - "autosuggest_hashtag.per_week": "{count} per week", + "autosuggest_hashtag.per_week": "{count} per uge", "boost_modal.combo": "Du kan trykke {combo} for at springe dette over næste gang", "bundle_column_error.body": "Noget gik galt under indlæsningen af dette komponent.", "bundle_column_error.retry": "Prøv igen", @@ -49,6 +53,7 @@ "column.blocks": "Blokerede brugere", "column.community": "Lokal tidslinje", "column.direct": "Direkte beskeder", + "column.directory": "Gennemse profiler", "column.domain_blocks": "Skjulte domæner", "column.favourites": "Favoritter", "column.follow_requests": "Anmodning om at følge", @@ -73,20 +78,20 @@ "compose_form.lock_disclaimer": "Din konto er ikke {locked}. Alle kan følge dig for at se dine følger-kun indlæg.", "compose_form.lock_disclaimer.lock": "låst", "compose_form.placeholder": "Hvad har du på hjertet?", - "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.add_option": "Tilføj valgmulighed", + "compose_form.poll.duration": "Afstemningens varighed", + "compose_form.poll.option_placeholder": "Valgmulighed {number}", + "compose_form.poll.remove_option": "Fjern denne valgmulighed", "compose_form.publish": "Trut", "compose_form.publish_loud": "{publish}!", - "compose_form.sensitive.hide": "Mark media as sensitive", + "compose_form.sensitive.hide": "Markér medie som følsomt", "compose_form.sensitive.marked": "Medie er markeret som værende følsomt", "compose_form.sensitive.unmarked": "Mediet er ikke markeret som værende følsomt", "compose_form.spoiler.marked": "Teksten er skjult bag en advarsel", "compose_form.spoiler.unmarked": "Teksten er ikke skjult", "compose_form.spoiler_placeholder": "Skriv din advarsel her", "confirmation_modal.cancel": "Annuller", - "confirmations.block.block_and_report": "Block & Report", + "confirmations.block.block_and_report": "Blokér og anmeld", "confirmations.block.confirm": "Bloker", "confirmations.block.message": "Er du sikker på, du vil blokere {name}?", "confirmations.delete.confirm": "Slet", @@ -95,6 +100,8 @@ "confirmations.delete_list.message": "Er du sikker på, du vil slette denne liste?", "confirmations.domain_block.confirm": "Skjul helt domæne", "confirmations.domain_block.message": "Er du helt sikker på du vil blokere hele {domain} domænet? I de fleste tilfælde vil få specifikke blokeringer eller dæmpninger være nok og at fortrække. Du vil ikke se indhold fra det domæne hverken på offentlige tidslinjer eller i dine notifikationer. Dine følgere fra det domæne vil blive fjernet.", + "confirmations.logout.confirm": "Log ud", + "confirmations.logout.message": "Er du sikker på du vil logge ud?", "confirmations.mute.confirm": "Dæmp", "confirmations.mute.message": "Er du sikker på, du vil dæmpe {name}?", "confirmations.redraft.confirm": "Slet & omskriv", @@ -103,6 +110,10 @@ "confirmations.reply.message": "Hvis du svarer nu vil du overskrive den besked du er ved at skrive. Er du sikker på, du vil fortsætte?", "confirmations.unfollow.confirm": "Følg ikke længere", "confirmations.unfollow.message": "Er du sikker på, du ikke længere vil følge {name}?", + "directory.federated": "Fra kendt fedivers", + "directory.local": "Kun fra {domain}", + "directory.new_arrivals": "Nye ankomster", + "directory.recently_active": "Senest aktiv", "embed.instructions": "Indlejre denne status på din side ved at kopiere nedenstående kode.", "embed.preview": "Det kommer til at se således ud:", "emoji_button.activity": "Aktivitet", @@ -113,14 +124,14 @@ "emoji_button.nature": "Natur", "emoji_button.not_found": "Ingen emojos!! (╯°□°)╯︵ ┻━┻", "emoji_button.objects": "Objekter", - "emoji_button.people": "Mennesker", + "emoji_button.people": "Personer", "emoji_button.recent": "Oftest brugt", "emoji_button.search": "Søg...", "emoji_button.search_results": "Søgeresultater", "emoji_button.symbols": "Symboler", "emoji_button.travel": "Rejser & steder", "empty_column.account_timeline": "Ingen bidrag her!", - "empty_column.account_unavailable": "Profile unavailable", + "empty_column.account_unavailable": "Profil utilgængelig", "empty_column.blocks": "Du har ikke blokeret nogen endnu.", "empty_column.community": "Den lokale tidslinje er tom. Skriv noget offentligt for at starte lavinen!", "empty_column.direct": "Du har endnu ingen direkte beskeder. Når du sender eller modtager en, vil den vises her.", @@ -139,7 +150,7 @@ "follow_request.authorize": "Godkend", "follow_request.reject": "Afvis", "getting_started.developers": "Udviklere", - "getting_started.directory": "Profile directory", + "getting_started.directory": "Profilliste", "getting_started.documentation": "Dokumentation", "getting_started.heading": "Kom igang", "getting_started.invite": "Inviter folk", @@ -149,36 +160,36 @@ "hashtag.column_header.tag_mode.all": "og {additional}", "hashtag.column_header.tag_mode.any": "eller {additional}", "hashtag.column_header.tag_mode.none": "uden {additional}", - "hashtag.column_settings.select.no_options_message": "No suggestions found", - "hashtag.column_settings.select.placeholder": "Enter hashtags…", - "hashtag.column_settings.tag_mode.all": "All of these", - "hashtag.column_settings.tag_mode.any": "Any of these", - "hashtag.column_settings.tag_mode.none": "None of these", + "hashtag.column_settings.select.no_options_message": "Ingen forslag fundet", + "hashtag.column_settings.select.placeholder": "Indtast hashtags…", + "hashtag.column_settings.tag_mode.all": "Alle disse", + "hashtag.column_settings.tag_mode.any": "Nogle af disse", + "hashtag.column_settings.tag_mode.none": "Ingen af disse", "hashtag.column_settings.tag_toggle": "Include additional tags in this column", "home.column_settings.basic": "Grundlæggende", "home.column_settings.show_reblogs": "Vis fremhævelser", "home.column_settings.show_replies": "Vis svar", "home.column_settings.update_live": "Update in real-time", - "intervals.full.days": "{number, plural, one {# day} other {# days}}", - "intervals.full.hours": "{number, plural, one {# hour} other {# hours}}", - "intervals.full.minutes": "{number, plural, one {# minute} other {# minutes}}", + "intervals.full.days": "{number, plural, one {# dag} other {# dage}}", + "intervals.full.hours": "{number, plural, one {# time} other {# timer}}", + "intervals.full.minutes": "{number, plural, one {# minut} other {# minutter}}", "introduction.federation.action": "Næste", - "introduction.federation.federated.headline": "Federated", + "introduction.federation.federated.headline": "Fælles", "introduction.federation.federated.text": "Offentlige bidrag fra andre servere af fediversen vil komme til syne i den federated timeline.", - "introduction.federation.home.headline": "Home", - "introduction.federation.home.text": "Posts from people you follow will appear in your home feed. You can follow anyone on any server!", - "introduction.federation.local.headline": "Local", - "introduction.federation.local.text": "Public posts from people on the same server as you will appear in the local timeline.", + "introduction.federation.home.headline": "Hjem", + "introduction.federation.home.text": "Statusser fra personer du følger vil blive vist i dit hjemmefeed. Du kan følge alle på enhver server!", + "introduction.federation.local.headline": "Lokal", + "introduction.federation.local.text": "Offentlige statusser fra personer på samme server som dig vil blive vist i det lokale feed.", "introduction.interactions.action": "Slut tutorial!", "introduction.interactions.favourite.headline": "Favorisere", - "introduction.interactions.favourite.text": "You can save a toot for later, and let the author know that you liked it, by favouriting it.", + "introduction.interactions.favourite.text": "Du kan gemme en status til senere (og vise forfatteren at du kunne lide den) ved at favorisere den.", "introduction.interactions.reblog.headline": "Boost", - "introduction.interactions.reblog.text": "You can share other people's toots with your followers by boosting them.", + "introduction.interactions.reblog.text": "Du kan delete andres statusser med dine følgere ved at booste dem.", "introduction.interactions.reply.headline": "Svar", "introduction.interactions.reply.text": "Du kan svare andres og din egen bidrag, hvilke vil kæde dem sammen i en konversation.", "introduction.welcome.action": "Læd os gå!", "introduction.welcome.headline": "Første skridt", - "introduction.welcome.text": "Welcome to the fediverse! In a few moments, you'll be able to broadcast messages and talk to your friends across a wide variety of servers. But this server, {domain}, is special—it hosts your profile, so remember its name.", + "introduction.welcome.text": "Velkommen til fediverset! Om få øjeblikke vil du kunne dele statusser og tale med dine venner på en bred vifte af servere. Men denne server, {domain}, er speciel. Det er på denne server at din profil har hjemme så husk dens navn.", "keyboard_shortcuts.back": "for at navigere dig tilbage", "keyboard_shortcuts.blocked": "for at åbne listen over blokerede brugere", "keyboard_shortcuts.boost": "for at fremhæve", @@ -207,24 +218,24 @@ "keyboard_shortcuts.search": "for at fokusere søgningen", "keyboard_shortcuts.start": "for at åbne \"kom igen\" kolonnen", "keyboard_shortcuts.toggle_hidden": "for at vise/skjule tekst bag CW", - "keyboard_shortcuts.toggle_sensitivity": "to show/hide media", + "keyboard_shortcuts.toggle_sensitivity": "for at vise/skjule medier", "keyboard_shortcuts.toot": "for at påbegynde et helt nyt trut", "keyboard_shortcuts.unfocus": "for at fjerne fokus fra skriveområde/søgning", "keyboard_shortcuts.up": "for at bevæge dig op ad listen", "lightbox.close": "Luk", "lightbox.next": "Næste", "lightbox.previous": "Forrige", - "lightbox.view_context": "View context", + "lightbox.view_context": "Vis kontekst", "lists.account.add": "Tilføj til liste", "lists.account.remove": "Fjern fra liste", "lists.delete": "Slet liste", "lists.edit": "Rediger liste", - "lists.edit.submit": "Change title", + "lists.edit.submit": "Skift titel", "lists.new.create": "Tilføj liste", "lists.new.title_placeholder": "Ny liste titel", "lists.search": "Søg iblandt folk du følger", "lists.subheading": "Dine lister", - "load_pending": "{count, plural, one {# new item} other {# new items}}", + "load_pending": "{count, plural, one {# nyt punkt} other {# nye punkter}}", "loading_indicator.label": "Indlæser...", "media_gallery.toggle_visible": "Ændre synlighed", "missing_indicator.label": "Ikke fundet", @@ -241,7 +252,7 @@ "navigation_bar.favourites": "Favoritter", "navigation_bar.filters": "Dæmpede ord", "navigation_bar.follow_requests": "Følgeanmodninger", - "navigation_bar.follows_and_followers": "Follows and followers", + "navigation_bar.follows_and_followers": "Følger og følgere", "navigation_bar.info": "Om denne instans", "navigation_bar.keyboard_shortcuts": "Hurtigtast", "navigation_bar.lists": "Lister", @@ -250,50 +261,49 @@ "navigation_bar.personal": "Personligt", "navigation_bar.pins": "Fastgjorte trut", "navigation_bar.preferences": "Præferencer", - "navigation_bar.profile_directory": "Profile directory", "navigation_bar.public_timeline": "Fælles tidslinje", "navigation_bar.security": "Sikkerhed", "notification.and_n_others": "and {count, plural, one {# other} other {# others}}", "notification.favourite": "{name} favoriserede din status", "notification.follow": "{name} fulgte dig", "notification.mention": "{name} nævnte dig", - "notification.poll": "A poll you have voted in has ended", - "notification.reblog": "{name} fremhævede din status", + "notification.poll": "En afstemning, du stemte i, er slut", + "notification.reblog": "{name} boostede din status", "notifications.clear": "Ryd notifikationer", "notifications.clear_confirmation": "Er du sikker på, du vil rydde alle dine notifikationer permanent?", - "notifications.column_settings.alert": "Skrivebords notifikationer", + "notifications.column_settings.alert": "Skrivebordsnotifikationer", "notifications.column_settings.favourite": "Favoritter:", - "notifications.column_settings.filter_bar.advanced": "Display all categories", - "notifications.column_settings.filter_bar.category": "Quick filter bar", - "notifications.column_settings.filter_bar.show": "Show", + "notifications.column_settings.filter_bar.advanced": "Vis alle kategorier", + "notifications.column_settings.filter_bar.category": "Hurtigfilter", + "notifications.column_settings.filter_bar.show": "Vis", "notifications.column_settings.follow": "Nye følgere:", - "notifications.column_settings.mention": "Omtale:", - "notifications.column_settings.poll": "Poll results:", - "notifications.column_settings.push": "Push notifikationer", - "notifications.column_settings.reblog": "Fremhævelser:", + "notifications.column_settings.mention": "Statusser der nævner dig:", + "notifications.column_settings.poll": "Afstemningsresultat:", + "notifications.column_settings.push": "Pushnotifikationer", + "notifications.column_settings.reblog": "Boosts:", "notifications.column_settings.show": "Vis i kolonne", "notifications.column_settings.sound": "Afspil lyd", "notifications.filter.all": "Alle", "notifications.filter.boosts": "Boosts", "notifications.filter.favourites": "Favoritter", "notifications.filter.follows": "Følger", - "notifications.filter.mentions": "Mentions", - "notifications.filter.polls": "Poll results", + "notifications.filter.mentions": "Statusser der nævner dig", + "notifications.filter.polls": "Afstemningsresultat", "notifications.group": "{count} notifikationer", - "poll.closed": "Closed", - "poll.refresh": "Refresh", - "poll.total_votes": "{count, plural, one {# vote} other {# votes}}", - "poll.vote": "Vote", - "poll_button.add_poll": "Add a poll", - "poll_button.remove_poll": "Remove poll", - "privacy.change": "Ændre status privatliv", - "privacy.direct.long": "Post til kun de nævnte brugere", + "poll.closed": "Lukket", + "poll.refresh": "Opdatér", + "poll.total_votes": "{count, plural, one {# stemme} other {# stemmer}}", + "poll.vote": "Stem", + "poll_button.add_poll": "Tilføj en afstemning", + "poll_button.remove_poll": "Fjern afstemning", + "privacy.change": "Skift status visningsindstillinger", + "privacy.direct.long": "Udgiv kun til nævnte brugere", "privacy.direct.short": "Direkte", - "privacy.private.long": "Post kun til følgere", + "privacy.private.long": "Udgiv kun til følgere", "privacy.private.short": "Kun for følgere", - "privacy.public.long": "Post til offentlige tidslinjer", + "privacy.public.long": "Udgiv på offentlige tidslinjer", "privacy.public.short": "Offentligt", - "privacy.unlisted.long": "Post ikke til offentlige tidslinjer", + "privacy.unlisted.long": "Udgiv ikke på offentlige tidslinjer", "privacy.unlisted.short": "Ikke listet", "regeneration_indicator.label": "Indlæser…", "regeneration_indicator.sublabel": "Din startside er ved at blive forberedt!", @@ -305,32 +315,32 @@ "reply_indicator.cancel": "Annuller", "report.forward": "Videresend til {target}", "report.forward_hint": "Kontoen er fra en anden server. Vil du også sende en anonym kopi af anmeldelsen dertil?", - "report.hint": "Anmeldelsen vil blive sendt til moderatorene af din instans. Du kan give en forklaring for hvorfor du anmelder denne konto nedenfor:", + "report.hint": "Anmeldelsen vil blive sendt til moderatorene af din instans. Du kan give en forklaring på hvorfor du anmelder denne konto nedenfor:", "report.placeholder": "Yderligere kommentarer", "report.submit": "Indsend", "report.target": "Anmelder {target}", "search.placeholder": "Søg", "search_popout.search_format": "Avanceret søgeformat", - "search_popout.tips.full_text": "Simpel tekst returnerer statusser du har skrevet, favoriseret, fremhævet, eller er blevet nævnt i, lige så vel som matchende brugernavne, visningsnavne, og hashtags.", - "search_popout.tips.hashtag": "emnetag", + "search_popout.tips.full_text": "Simpel tekst returnerer statusser du har skrevet, favoriseret, boostet, eller er blevet nævnt i såvel som matchende brugernavne, profilnavne, og hashtags.", + "search_popout.tips.hashtag": "hashtag", "search_popout.tips.status": "status", - "search_popout.tips.text": "Simpelt tekst returnerer passende visningsnavne, brugernavne og hashtags", + "search_popout.tips.text": "Simpel tekst returnerer matchende profilnavne, brugernavne og hashtags", "search_popout.tips.user": "bruger", - "search_results.accounts": "Folk", - "search_results.hashtags": "Emnetags", + "search_results.accounts": "Personer", + "search_results.hashtags": "Hashtags", "search_results.statuses": "Trut", - "search_results.statuses_fts_disabled": "Searching toots by their content is not enabled on this Mastodon server.", - "search_results.total": "{count, number} {count, plural, et {result} andre {results}}", - "status.admin_account": "Open moderation interface for @{name}", - "status.admin_status": "Open this status in the moderation interface", + "search_results.statuses_fts_disabled": "Denne Mastodonserver har ikke aktiveret for søgning af statusser via deres indhold.", + "search_results.total": "{count, number} {count, plural, one {resultat} other {resultater}}", + "status.admin_account": "Åben modereringsvisning for @{name}", + "status.admin_status": "Åben denne status i modereringsvisningen", "status.block": "Bloker @{name}", - "status.cancel_reblog_private": "Fremhæv ikke længere", - "status.cannot_reblog": "Denne post kan ikke fremhæves", - "status.copy": "Copy link to status", + "status.cancel_reblog_private": "Fjern boost", + "status.cannot_reblog": "Denne post kan ikke boostes", + "status.copy": "Kopiér link til status", "status.delete": "Slet", "status.detailed_status": "Detaljeret visning af samtale", "status.direct": "Send direkte besked til @{name}", - "status.embed": "Indlejre", + "status.embed": "Integrér", "status.favourite": "Favorit", "status.filtered": "Filtreret", "status.load_more": "Indlæs mere", @@ -343,13 +353,13 @@ "status.pin": "Fastgør til profil", "status.pinned": "Fastgjort trut", "status.read_more": "Læs mere", - "status.reblog": "Fremhæv", - "status.reblog_private": "Fremhæv til oprindeligt publikum", - "status.reblogged_by": "{name} fremhævede", - "status.reblogs.empty": "Der er endnu ingen der har fremhævet dette trut. Når der er nogen der gør, vil det blive vist her.", + "status.reblog": "Boost", + "status.reblog_private": "Boost til det oprindelige publikum", + "status.reblogged_by": "{name} boostede", + "status.reblogs.empty": "Der er endnu ingen der har boostet dette trut. Når der er nogen der gør, vil det blive vist her.", "status.redraft": "Slet og omskriv", - "status.reply": "Svar", - "status.replyAll": "Svar samtale", + "status.reply": "Besvar", + "status.replyAll": "Besvar samtale", "status.report": "Anmeld @{name}", "status.sensitive_warning": "Følsomt indhold", "status.share": "Del", @@ -357,41 +367,42 @@ "status.show_less_all": "Vis mindre for alle", "status.show_more": "Vis mere", "status.show_more_all": "Vis mere for alle", - "status.show_thread": "Show thread", - "status.unmute_conversation": "Fjern dæmpningen fra samtale", - "status.unpin": "Fjern som fastgjort fra profil", - "suggestions.dismiss": "Dismiss suggestion", - "suggestions.header": "You might be interested in…", + "status.show_thread": "Vis tråd", + "status.uncached_media_warning": "Ikke tilgængelig", + "status.unmute_conversation": "Genaktivér samtale", + "status.unpin": "Frigør fra profil", + "suggestions.dismiss": "Afvis foreslag", + "suggestions.header": "Du er måske interesseret i…", "tabs_bar.federated_timeline": "Fælles", "tabs_bar.home": "Hjem", "tabs_bar.local_timeline": "Lokal", "tabs_bar.notifications": "Notifikationer", "tabs_bar.search": "Søg", - "time_remaining.days": "{number, plural, one {# day} other {# days}} left", - "time_remaining.hours": "{number, plural, one {# hour} other {# hours}} left", - "time_remaining.minutes": "{number, plural, one {# minute} other {# minutes}} left", - "time_remaining.moments": "Moments remaining", - "time_remaining.seconds": "{number, plural, one {# second} other {# seconds}} left", - "trends.count_by_accounts": "{count} {rawCount, plural, one {person} other {people}} snakker", - "trends.refresh": "Refresh", + "time_remaining.days": "{number, plural, one {# dag} other {# dage}} tilbage", + "time_remaining.hours": "{number, plural, one {# time} other {# timer}} tilbage", + "time_remaining.minutes": "{number, plural, one {# minut} other {# minutter}} tilbage", + "time_remaining.moments": "Få øjeblikke tilbage", + "time_remaining.seconds": "{number, plural, one {# sekund} other {# sekunder}} tilbage", + "trends.count_by_accounts": "{count} {rawCount, plural, one {person} other {personer}} snakker", + "trends.trending_now": "Hot lige nu", "ui.beforeunload": "Din kladde vil gå tabt hvis du forlader Mastodon.", "upload_area.title": "Træk og slip for at uploade", "upload_button.label": "Tilføj medie (JPEG, PNG, GIF, WebM, MP4, MOV)", - "upload_error.limit": "File upload limit exceeded.", - "upload_error.poll": "File upload not allowed with polls.", - "upload_form.description": "Beskriv for de svagtseende", - "upload_form.edit": "Edit", + "upload_error.limit": "Uploadgrænse overskredet.", + "upload_error.poll": "Filupload ikke tilladt sammen med afstemninger.", + "upload_form.description": "Beskriv for svagtseende", + "upload_form.edit": "Redigér", "upload_form.undo": "Slet", - "upload_modal.analyzing_picture": "Analyzing picture…", - "upload_modal.apply": "Apply", - "upload_modal.description_placeholder": "A quick brown fox jumps over the lazy dog", - "upload_modal.detect_text": "Detect text from picture", - "upload_modal.edit_media": "Edit media", - "upload_modal.hint": "Click or drag the circle on the preview to choose the focal point which will always be in view on all thumbnails.", - "upload_modal.preview_label": "Preview ({ratio})", + "upload_modal.analyzing_picture": "Analyserer billede…", + "upload_modal.apply": "Anvend", + "upload_modal.description_placeholder": "En hurtig brun ræv hopper over den dovne hund", + "upload_modal.detect_text": "Find tekst i billede på automatisk vis", + "upload_modal.edit_media": "Redigér medie", + "upload_modal.hint": "Klik eller træk cirklen på billedet for at vælge et fokuspunkt.", + "upload_modal.preview_label": "Forhåndsvisning ({ratio})", "upload_progress.label": "Uploader...", "video.close": "Luk video", - "video.exit_fullscreen": "Gå ud af fuldskærm", + "video.exit_fullscreen": "Forlad fuldskærm", "video.expand": "Udvid video", "video.fullscreen": "Fuldskærm", "video.hide": "Skjul video", diff --git a/app/javascript/mastodon/locales/de.json b/app/javascript/mastodon/locales/de.json index 28b41baf7..a9b777c03 100644 --- a/app/javascript/mastodon/locales/de.json +++ b/app/javascript/mastodon/locales/de.json @@ -16,6 +16,7 @@ "account.follows.empty": "Dieses Profil folgt noch niemandem.", "account.follows_you": "Folgt dir", "account.hide_reblogs": "Geteilte Beiträge von @{name} verbergen", + "account.last_status": "Zuletzt aktiv", "account.link_verified_on": "Besitz dieses Links wurde geprüft am {date}", "account.locked_info": "Der Privatsphärenstatus dieses Accounts wurde auf gesperrt gesetzt. Die Person bestimmt manuell wer ihm/ihr folgen darf.", "account.media": "Medien", @@ -24,6 +25,7 @@ "account.mute": "@{name} stummschalten", "account.mute_notifications": "Benachrichtigungen von @{name} verbergen", "account.muted": "Stummgeschaltet", + "account.never_active": "Nie", "account.posts": "Beiträge", "account.posts_with_replies": "Beiträge und Antworten", "account.report": "@{name} melden", @@ -36,6 +38,8 @@ "account.unfollow": "Entfolgen", "account.unmute": "@{name} nicht mehr stummschalten", "account.unmute_notifications": "Benachrichtigungen von @{name} einschalten", + "alert.rate_limited.message": "Bitte versuche es nach {retry_time, time, medium}.", + "alert.rate_limited.title": "Anfragelimit überschritten", "alert.unexpected.message": "Ein unerwarteter Fehler ist aufgetreten.", "alert.unexpected.title": "Hoppla!", "autosuggest_hashtag.per_week": "{count} pro Woche", @@ -49,6 +53,7 @@ "column.blocks": "Blockierte Profile", "column.community": "Lokale Zeitleiste", "column.direct": "Direktnachrichten", + "column.directory": "Profile durchsuchen", "column.domain_blocks": "Versteckte Domains", "column.favourites": "Favoriten", "column.follow_requests": "Folgeanfragen", @@ -95,6 +100,8 @@ "confirmations.delete_list.message": "Bist du dir sicher, dass du diese Liste permanent löschen möchtest?", "confirmations.domain_block.confirm": "Die ganze Domain verbergen", "confirmations.domain_block.message": "Bist du dir wirklich sicher, dass du die ganze Domain {domain} blockieren willst? In den meisten Fällen reichen ein paar gezielte Blockierungen oder Stummschaltungen aus. Nach der Blockierung wirst du nichts mehr von dieser Domain in öffentlichen Zeitleisten oder Benachrichtigungen sehen. Deine Folger_innen von dieser Domain werden auch entfernt.", + "confirmations.logout.confirm": "Abmelden", + "confirmations.logout.message": "Bist du sicher, dass du dich abmelden möchtest?", "confirmations.mute.confirm": "Stummschalten", "confirmations.mute.message": "Bist du dir sicher, dass du {name} stummschalten möchtest?", "confirmations.redraft.confirm": "Löschen und neu erstellen", @@ -103,6 +110,10 @@ "confirmations.reply.message": "Wenn du jetzt antwortest wird es die gesamte Nachricht verwerfen, die du gerade schreibst. Möchtest du wirklich fortfahren?", "confirmations.unfollow.confirm": "Entfolgen", "confirmations.unfollow.message": "Bist du dir sicher, dass du {name} entfolgen möchtest?", + "directory.federated": "Aus dem Fediverse", + "directory.local": "Nur von {domain}", + "directory.new_arrivals": "Neue Benutzer", + "directory.recently_active": "Kürzlich aktiv", "embed.instructions": "Du kannst diesen Beitrag auf deiner Webseite einbetten, indem du den folgenden Code einfügst.", "embed.preview": "So wird es aussehen:", "emoji_button.activity": "Aktivitäten", @@ -158,7 +169,7 @@ "home.column_settings.basic": "Einfach", "home.column_settings.show_reblogs": "Geteilte Beiträge anzeigen", "home.column_settings.show_replies": "Antworten anzeigen", - "home.column_settings.update_live": "In Echtzeit aktualisieren", + "home.column_settings.update_live": "Update in real-time", "intervals.full.days": "{number, plural, one {# Tag} other {# Tage}}", "intervals.full.hours": "{number, plural, one {# Stunde} other {# Stunden}}", "intervals.full.minutes": "{number, plural, one {# Minute} other {# Minuten}}", @@ -250,10 +261,9 @@ "navigation_bar.personal": "Persönlich", "navigation_bar.pins": "Angeheftete Beiträge", "navigation_bar.preferences": "Einstellungen", - "navigation_bar.profile_directory": "Profilverzeichnis", "navigation_bar.public_timeline": "Föderierte Zeitleiste", "navigation_bar.security": "Sicherheit", - "notification.and_n_others": "und {count, plural, one {# andere Person} other {# andere Personen}}", + "notification.and_n_others": "and {count, plural, one {# other} other {# others}}", "notification.favourite": "{name} hat deinen Beitrag favorisiert", "notification.follow": "{name} folgt dir", "notification.mention": "{name} hat dich erwähnt", @@ -358,6 +368,7 @@ "status.show_more": "Mehr anzeigen", "status.show_more_all": "Alle Inhaltswarnungen aufklappen", "status.show_thread": "Zeige Konversation", + "status.uncached_media_warning": "Nicht verfügbar", "status.unmute_conversation": "Stummschaltung von Konversation aufheben", "status.unpin": "Vom Profil lösen", "suggestions.dismiss": "Empfehlung ausblenden", @@ -373,7 +384,7 @@ "time_remaining.moments": "Schließt in Kürze", "time_remaining.seconds": "{number, plural, one {# Sekunde} other {# Sekunden}} verbleibend", "trends.count_by_accounts": "{count} {rawCount, plural, eine {Person} other {Personen}} reden darüber", - "trends.refresh": "Aktualisieren", + "trends.trending_now": "In den Trends", "ui.beforeunload": "Dein Entwurf geht verloren, wenn du Mastodon verlässt.", "upload_area.title": "Zum Hochladen hereinziehen", "upload_button.label": "Mediendatei hinzufügen ({formats})", diff --git a/app/javascript/mastodon/locales/defaultMessages.json b/app/javascript/mastodon/locales/defaultMessages.json index db2d1c7bd..b3c25ebe6 100644 --- a/app/javascript/mastodon/locales/defaultMessages.json +++ b/app/javascript/mastodon/locales/defaultMessages.json @@ -1155,6 +1155,19 @@ ], "path": "app/javascript/mastodon/features/compose/containers/navigation_container.json" }, + { + "descriptors": [ + { + "defaultMessage": "Are you sure you want to log out?", + "id": "confirmations.logout.message" + }, + { + "defaultMessage": "Log out", + "id": "confirmations.logout.confirm" + } + ], + "path": "app/javascript/mastodon/features/compose/containers/navigation_container.json" + }, { "descriptors": [ { diff --git a/app/javascript/mastodon/locales/el.json b/app/javascript/mastodon/locales/el.json index 68c59817f..4c8a58778 100644 --- a/app/javascript/mastodon/locales/el.json +++ b/app/javascript/mastodon/locales/el.json @@ -4,7 +4,7 @@ "account.block": "Αποκλισμός @{name}", "account.block_domain": "Απόκρυψε τα πάντα από το {domain}", "account.blocked": "Αποκλεισμένος/η", - "account.cancel_follow_request": "Cancel follow request", + "account.cancel_follow_request": "Ακύρωση αιτήματος παρακολούθησης", "account.direct": "Προσωπικό μήνυμα προς @{name}", "account.domain_blocked": "Κρυμμένος τομέας", "account.edit_profile": "Επεξεργασία προφίλ", @@ -16,6 +16,7 @@ "account.follows.empty": "Αυτός ο χρήστης δεν ακολουθεί κανέναν ακόμα.", "account.follows_you": "Σε ακολουθεί", "account.hide_reblogs": "Απόκρυψη προωθήσεων από @{name}", + "account.last_status": "Τελευταία δραστηριότητα", "account.link_verified_on": "Η ιδιοκτησία αυτού του συνδέσμου ελέχθηκε την {date}", "account.locked_info": "Η κατάσταση απορρήτου αυτού του λογαριασμού είναι κλειδωμένη. Ο ιδιοκτήτης επιβεβαιώνει χειροκίνητα ποιος μπορεί να τον ακολουθήσει.", "account.media": "Πολυμέσα", @@ -24,6 +25,7 @@ "account.mute": "Σώπασε @{name}", "account.mute_notifications": "Σώπασε τις ειδοποιήσεις από @{name}", "account.muted": "Αποσιωπημένος/η", + "account.never_active": "Ποτέ", "account.posts": "Τουτ", "account.posts_with_replies": "Τουτ και απαντήσεις", "account.report": "Κατάγγειλε @{name}", @@ -36,9 +38,11 @@ "account.unfollow": "Διακοπή παρακολούθησης", "account.unmute": "Διακοπή αποσιώπησης @{name}", "account.unmute_notifications": "Διακοπή αποσιώπησης ειδοποιήσεων του/της @{name}", + "alert.rate_limited.message": "Παρακαλούμε δοκίμασε ξανά αφού περάσει η {retry_time, time, medium}.", + "alert.rate_limited.title": "Περιορισμός συχνότητας", "alert.unexpected.message": "Προέκυψε απροσδόκητο σφάλμα.", "alert.unexpected.title": "Εεπ!", - "autosuggest_hashtag.per_week": "{count} per week", + "autosuggest_hashtag.per_week": "{count} ανα εβδομάδα", "boost_modal.combo": "Μπορείς να πατήσεις {combo} για να το προσπεράσεις αυτό την επόμενη φορά", "bundle_column_error.body": "Κάτι πήγε στραβά ενώ φορτωνόταν αυτό το στοιχείο.", "bundle_column_error.retry": "Δοκίμασε ξανά", @@ -49,6 +53,7 @@ "column.blocks": "Αποκλεισμένοι χρήστες", "column.community": "Τοπική ροή", "column.direct": "Προσωπικά μηνύματα", + "column.directory": "Δες προφίλ", "column.domain_blocks": "Κρυμμένοι τομείς", "column.favourites": "Αγαπημένα", "column.follow_requests": "Αιτήματα ακολούθησης", @@ -95,6 +100,8 @@ "confirmations.delete_list.message": "Σίγουρα θες να διαγράψεις οριστικά αυτή τη λίστα;", "confirmations.domain_block.confirm": "Απόκρυψη ολόκληρου του τομέα", "confirmations.domain_block.message": "Σίγουρα θες να μπλοκάρεις ολόκληρο το {domain}; Συνήθως μερικά εστιασμένα μπλοκ ή αποσιωπήσεις επαρκούν και προτιμούνται. Δεν θα βλέπεις περιεχόμενο από αυτό τον κόμβο σε καμία δημόσια ροή, ούτε στις ειδοποιήσεις σου. Όσους ακόλουθους έχεις αυτό αυτό τον κόμβο θα αφαιρεθούν.", + "confirmations.logout.confirm": "Αποσύνδεση", + "confirmations.logout.message": "Σίγουρα θέλεις να αποσυνδεθείς;", "confirmations.mute.confirm": "Αποσιώπηση", "confirmations.mute.message": "Σίγουρα θες να αποσιωπήσεις {name};", "confirmations.redraft.confirm": "Διαγραφή & ξαναγράψιμο", @@ -103,6 +110,10 @@ "confirmations.reply.message": "Απαντώντας τώρα θα αντικαταστήσεις το κείμενο που ήδη γράφεις. Σίγουρα θέλεις να συνεχίσεις;", "confirmations.unfollow.confirm": "Διακοπή παρακολούθησης", "confirmations.unfollow.message": "Σίγουρα θες να πάψεις να ακολουθείς τον/την {name};", + "directory.federated": "Από το γνωστό fediverse", + "directory.local": "Μόνο από {domain}", + "directory.new_arrivals": "Νέες αφίξεις", + "directory.recently_active": "Πρόσφατα ενεργοί", "embed.instructions": "Ενσωματώστε αυτή την κατάσταση στην ιστοσελίδα σας αντιγράφοντας τον παρακάτω κώδικα.", "embed.preview": "Ορίστε πως θα φαίνεται:", "emoji_button.activity": "Δραστηριότητα", @@ -155,10 +166,10 @@ "hashtag.column_settings.tag_mode.any": "Οποιοδήποτε από αυτά", "hashtag.column_settings.tag_mode.none": "Κανένα από αυτά", "hashtag.column_settings.tag_toggle": "Προσθήκη επιπλέον ταμπελών για την κολώνα", - "home.column_settings.basic": "Βασικά", + "home.column_settings.basic": "Βασικές ρυθμίσεις", "home.column_settings.show_reblogs": "Εμφάνιση προωθήσεων", "home.column_settings.show_replies": "Εμφάνιση απαντήσεων", - "home.column_settings.update_live": "Ζωντανή ενημέρωση", + "home.column_settings.update_live": "Update in real-time", "intervals.full.days": "{number, plural, one {# μέρα} other {# μέρες}}", "intervals.full.hours": "{number, plural, one {# ώρα} other {# ώρες}}", "intervals.full.minutes": "{number, plural, one {# λεπτό} other {# λεπτά}}", @@ -241,7 +252,7 @@ "navigation_bar.favourites": "Αγαπημένα", "navigation_bar.filters": "Αποσιωπημένες λέξεις", "navigation_bar.follow_requests": "Αιτήματα ακολούθησης", - "navigation_bar.follows_and_followers": "Ακολουθεί και ακολουθείται", + "navigation_bar.follows_and_followers": "Ακολουθείς και σε ακολουθούν", "navigation_bar.info": "Πληροφορίες κόμβου", "navigation_bar.keyboard_shortcuts": "Συντομεύσεις", "navigation_bar.lists": "Λίστες", @@ -250,14 +261,13 @@ "navigation_bar.personal": "Προσωπικά", "navigation_bar.pins": "Καρφιτσωμένα τουτ", "navigation_bar.preferences": "Προτιμήσεις", - "navigation_bar.profile_directory": "Κατάλογος λογαριασμών", "navigation_bar.public_timeline": "Ομοσπονδιακή ροή", "navigation_bar.security": "Ασφάλεια", "notification.and_n_others": "and {count, plural, one {# other} other {# others}}", "notification.favourite": "Ο/Η {name} σημείωσε ως αγαπημένη την κατάστασή σου", "notification.follow": "Ο/Η {name} σε ακολούθησε", "notification.mention": "Ο/Η {name} σε ανέφερε", - "notification.poll": "Έλαβε τέλος μια από τις ψηφοφορίες που συμμετείχες", + "notification.poll": "Τελείωσε μια από τις ψηφοφορίες που συμμετείχες", "notification.reblog": "Ο/Η {name} προώθησε την κατάστασή σου", "notifications.clear": "Καθαρισμός ειδοποιήσεων", "notifications.clear_confirmation": "Σίγουρα θέλεις να καθαρίσεις όλες τις ειδοποιήσεις σου;", @@ -358,13 +368,14 @@ "status.show_more": "Δείξε περισσότερα", "status.show_more_all": "Δείξε περισσότερα για όλα", "status.show_thread": "Εμφάνιση νήματος", + "status.uncached_media_warning": "Μη διαθέσιμα", "status.unmute_conversation": "Διέκοψε την αποσιώπηση της συζήτησης", "status.unpin": "Ξεκαρφίτσωσε από το προφίλ", "suggestions.dismiss": "Απόρριψη πρότασης", "suggestions.header": "Ίσως να ενδιαφέρεσαι για…", "tabs_bar.federated_timeline": "Ομοσπονδιακή", "tabs_bar.home": "Αρχική", - "tabs_bar.local_timeline": "Τοπικά", + "tabs_bar.local_timeline": "Τοπική", "tabs_bar.notifications": "Ειδοποιήσεις", "tabs_bar.search": "Αναζήτηση", "time_remaining.days": "απομένουν {number, plural, one {# ημέρα} other {# ημέρες}}", @@ -373,22 +384,22 @@ "time_remaining.moments": "Απομένουν στιγμές", "time_remaining.seconds": "απομένουν {number, plural, one {# δευτερόλεπτο} other {# δευτερόλεπτα}}", "trends.count_by_accounts": "{count} {rawCount, plural, one {person} other {people}} μιλάνε", - "trends.refresh": "Refresh", + "trends.trending_now": "Δημοφιλή τώρα", "ui.beforeunload": "Το προσχέδιό σου θα χαθεί αν φύγεις από το Mastodon.", "upload_area.title": "Drag & drop για να ανεβάσεις", "upload_button.label": "Πρόσθεσε πολυμέσα (JPEG, PNG, GIF, WebM, MP4, MOV)", "upload_error.limit": "Υπέρβαση ορίου μεγέθους ανεβασμένων αρχείων.", "upload_error.poll": "Στις δημοσκοπήσεις δεν επιτρέπεται η μεταφόρτωση αρχείου.", "upload_form.description": "Περιέγραψε για όσους & όσες έχουν προβλήματα όρασης", - "upload_form.edit": "Edit", + "upload_form.edit": "Ενημέρωση", "upload_form.undo": "Διαγραφή", - "upload_modal.analyzing_picture": "Analyzing picture…", - "upload_modal.apply": "Apply", - "upload_modal.description_placeholder": "A quick brown fox jumps over the lazy dog", - "upload_modal.detect_text": "Detect text from picture", - "upload_modal.edit_media": "Edit media", - "upload_modal.hint": "Click or drag the circle on the preview to choose the focal point which will always be in view on all thumbnails.", - "upload_modal.preview_label": "Preview ({ratio})", + "upload_modal.analyzing_picture": "Ανάλυση εικόνας…", + "upload_modal.apply": "Εφαρμογή", + "upload_modal.description_placeholder": "Λύκος μαύρος και ισχνός του πατέρα του καημός", + "upload_modal.detect_text": "Αναγνώριση κειμένου από την εικόνα", + "upload_modal.edit_media": "Επεξεργασία Πολυμέσων", + "upload_modal.hint": "Κάνε κλικ ή σείρε τον κύκλο στην προεπισκόπηση για να επιλέξεις το σημείο εστίασης που θα είναι πάντα εμφανές σε όλες τις μικρογραφίες.", + "upload_modal.preview_label": "Προεπισκόπηση ({ratio})", "upload_progress.label": "Ανεβαίνει...", "video.close": "Κλείσε το βίντεο", "video.exit_fullscreen": "Έξοδος από πλήρη οθόνη", diff --git a/app/javascript/mastodon/locales/eo.json b/app/javascript/mastodon/locales/eo.json index 763c31bb8..a04a70cce 100644 --- a/app/javascript/mastodon/locales/eo.json +++ b/app/javascript/mastodon/locales/eo.json @@ -4,7 +4,7 @@ "account.block": "Bloki @{name}", "account.block_domain": "Kaŝi ĉion de {domain}", "account.blocked": "Blokita", - "account.cancel_follow_request": "Cancel follow request", + "account.cancel_follow_request": "Nuligi peto de sekvado", "account.direct": "Rekte mesaĝi @{name}", "account.domain_blocked": "Domajno kaŝita", "account.edit_profile": "Redakti profilon", @@ -16,6 +16,7 @@ "account.follows.empty": "Tiu uzanto ankoraŭ ne sekvas iun.", "account.follows_you": "Sekvas vin", "account.hide_reblogs": "Kaŝi diskonigojn de @{name}", + "account.last_status": "Lasta aktiva", "account.link_verified_on": "La posedanto de tiu ligilo estis kontrolita je {date}", "account.locked_info": "La privateco de tiu konto estas elektita kiel fermita. La posedanto povas mane akcepti tiun, kiu povas sekvi rin.", "account.media": "Aŭdovidaĵoj", @@ -24,6 +25,7 @@ "account.mute": "Silentigi @{name}", "account.mute_notifications": "Silentigi sciigojn el @{name}", "account.muted": "Silentigita", + "account.never_active": "Neniam", "account.posts": "Mesaĝoj", "account.posts_with_replies": "Kun respondoj", "account.report": "Signali @{name}", @@ -36,9 +38,11 @@ "account.unfollow": "Ne plu sekvi", "account.unmute": "Malsilentigi @{name}", "account.unmute_notifications": "Malsilentigi sciigojn de @{name}", + "alert.rate_limited.message": "Bonvolu reprovi poste {retry_time, time, medium}.", + "alert.rate_limited.title": "Rate limited", "alert.unexpected.message": "Neatendita eraro okazis.", "alert.unexpected.title": "Ups!", - "autosuggest_hashtag.per_week": "{count} per week", + "autosuggest_hashtag.per_week": "{count} semajne", "boost_modal.combo": "Vi povas premi {combo} por preterpasi sekvafoje", "bundle_column_error.body": "Io misfunkciis en la ŝargado de ĉi tiu elemento.", "bundle_column_error.retry": "Bonvolu reprovi", @@ -49,6 +53,7 @@ "column.blocks": "Blokitaj uzantoj", "column.community": "Loka tempolinio", "column.direct": "Rektaj mesaĝoj", + "column.directory": "Browse profiles", "column.domain_blocks": "Kaŝitaj domajnoj", "column.favourites": "Stelumoj", "column.follow_requests": "Petoj de sekvado", @@ -95,6 +100,8 @@ "confirmations.delete_list.message": "Ĉu vi certas, ke vi volas porĉiame forigi ĉi tiun liston?", "confirmations.domain_block.confirm": "Kaŝi la tutan domajnon", "confirmations.domain_block.message": "Ĉu vi vere, vere certas, ke vi volas tute bloki {domain}? Plej ofte, trafa blokado kaj silentigado sufiĉas kaj preferindas. Vi ne vidos enhavon de tiu domajno en publika tempolinio aŭ en viaj sciigoj. Viaj sekvantoj de tiu domajno estos forigitaj.", + "confirmations.logout.confirm": "Elsaluti", + "confirmations.logout.message": "Ĉu vi certas ke vi volas elsaluti?", "confirmations.mute.confirm": "Silentigi", "confirmations.mute.message": "Ĉu vi certas, ke vi volas silentigi {name}?", "confirmations.redraft.confirm": "Forigi kaj reskribi", @@ -103,6 +110,10 @@ "confirmations.reply.message": "Respondi nun anstataŭigos la mesaĝon, kiun vi nun skribas. Ĉu vi certas, ke vi volas daŭrigi?", "confirmations.unfollow.confirm": "Ne plu sekvi", "confirmations.unfollow.message": "Ĉu vi certas, ke vi volas ĉesi sekvi {name}?", + "directory.federated": "El konata fediverso", + "directory.local": "Nur de {domain}", + "directory.new_arrivals": "Novaj veniĝoj", + "directory.recently_active": "Recently active", "embed.instructions": "Enkorpigu ĉi tiun mesaĝon en vian retejon per kopio de la suba kodo.", "embed.preview": "Ĝi aperos tiel:", "emoji_button.activity": "Agadoj", @@ -158,7 +169,7 @@ "home.column_settings.basic": "Bazaj agordoj", "home.column_settings.show_reblogs": "Montri diskonigojn", "home.column_settings.show_replies": "Montri respondojn", - "home.column_settings.update_live": "Ĝisdatigo en realtempa", + "home.column_settings.update_live": "Update in real-time", "intervals.full.days": "{number, plural, one {# tago} other {# tagoj}}", "intervals.full.hours": "{number, plural, one {# horo} other {# horoj}}", "intervals.full.minutes": "{number, plural, one {# minuto} other {# minutoj}}", @@ -250,7 +261,6 @@ "navigation_bar.personal": "Persone", "navigation_bar.pins": "Alpinglitaj mesaĝoj", "navigation_bar.preferences": "Preferoj", - "navigation_bar.profile_directory": "Profilujo", "navigation_bar.public_timeline": "Fratara tempolinio", "navigation_bar.security": "Sekureco", "notification.and_n_others": "and {count, plural, one {# other} other {# others}}", @@ -358,6 +368,7 @@ "status.show_more": "Grandigi", "status.show_more_all": "Grandigi ĉiujn", "status.show_thread": "Montri la fadenon", + "status.uncached_media_warning": "Nedisponebla", "status.unmute_conversation": "Malsilentigi la konversacion", "status.unpin": "Depingli de profilo", "suggestions.dismiss": "Forigi la proponon", @@ -373,22 +384,22 @@ "time_remaining.moments": "Momenteto restas", "time_remaining.seconds": "{number, plural, one {# sekundo} other {# sekundoj}} restas", "trends.count_by_accounts": "{count} {rawCount, plural, one {persono} other {personoj}} parolas", - "trends.refresh": "Refresh", + "trends.trending_now": "Nunaj furoraĵoj", "ui.beforeunload": "Via malneto perdiĝos se vi eliras de Mastodon.", "upload_area.title": "Altreni kaj lasi por alŝuti", "upload_button.label": "Aldoni aŭdovidaĵon (JPEG, PNG, GIF, WebM, MP4, MOV)", "upload_error.limit": "Limo de dosiera alŝutado transpasita.", "upload_error.poll": "Alŝuto de dosiero ne permesita kun balotenketo.", "upload_form.description": "Priskribi por misvidantaj homoj", - "upload_form.edit": "Edit", + "upload_form.edit": "Redakti", "upload_form.undo": "Forigi", "upload_modal.analyzing_picture": "Analyzing picture…", - "upload_modal.apply": "Apply", + "upload_modal.apply": "Apliki", "upload_modal.description_placeholder": "A quick brown fox jumps over the lazy dog", "upload_modal.detect_text": "Detect text from picture", - "upload_modal.edit_media": "Edit media", + "upload_modal.edit_media": "Redakti aŭdvidaĵo", "upload_modal.hint": "Click or drag the circle on the preview to choose the focal point which will always be in view on all thumbnails.", - "upload_modal.preview_label": "Preview ({ratio})", + "upload_modal.preview_label": "Antaŭvido ({ratio})", "upload_progress.label": "Alŝutado…", "video.close": "Fermi videon", "video.exit_fullscreen": "Eksigi plenekrana", diff --git a/app/javascript/mastodon/locales/es.json b/app/javascript/mastodon/locales/es.json index 415faf509..3b36571b1 100644 --- a/app/javascript/mastodon/locales/es.json +++ b/app/javascript/mastodon/locales/es.json @@ -16,6 +16,7 @@ "account.follows.empty": "Este usuario todavía no sigue a nadie.", "account.follows_you": "Te sigue", "account.hide_reblogs": "Ocultar retoots de @{name}", + "account.last_status": "Last active", "account.link_verified_on": "El proprietario de este link fue comprobado el {date}", "account.locked_info": "El estado de privacidad de esta cuenta està configurado como bloqueado. El proprietario debe revisar manualmente quien puede seguirle.", "account.media": "Multimedia", @@ -24,6 +25,7 @@ "account.mute": "Silenciar a @{name}", "account.mute_notifications": "Silenciar notificaciones de @{name}", "account.muted": "Silenciado", + "account.never_active": "Never", "account.posts": "Toots", "account.posts_with_replies": "Toots con respuestas", "account.report": "Reportar a @{name}", @@ -36,6 +38,8 @@ "account.unfollow": "Dejar de seguir", "account.unmute": "Dejar de silenciar a @{name}", "account.unmute_notifications": "Dejar de silenciar las notificaciones de @{name}", + "alert.rate_limited.message": "Please retry after {retry_time, time, medium}.", + "alert.rate_limited.title": "Rate limited", "alert.unexpected.message": "Hubo un error inesperado.", "alert.unexpected.title": "¡Ups!", "autosuggest_hashtag.per_week": "{count} per week", @@ -49,6 +53,7 @@ "column.blocks": "Usuarios bloqueados", "column.community": "Línea de tiempo local", "column.direct": "Mensajes directos", + "column.directory": "Browse profiles", "column.domain_blocks": "Dominios ocultados", "column.favourites": "Favoritos", "column.follow_requests": "Solicitudes de seguimiento", @@ -95,6 +100,8 @@ "confirmations.delete_list.message": "¿Seguro que quieres borrar esta lista permanentemente?", "confirmations.domain_block.confirm": "Ocultar dominio entero", "confirmations.domain_block.message": "¿Seguro de que quieres bloquear al dominio {domain} entero? En general unos cuantos bloqueos y silenciados concretos es suficiente y preferible.", + "confirmations.logout.confirm": "Log out", + "confirmations.logout.message": "Are you sure you want to log out?", "confirmations.mute.confirm": "Silenciar", "confirmations.mute.message": "¿Estás seguro de que quieres silenciar a {name}?", "confirmations.redraft.confirm": "Borrar y volver a borrador", @@ -103,6 +110,10 @@ "confirmations.reply.message": "Responder sobrescribirá el mensaje que estás escribiendo. ¿Estás seguro de que deseas continuar?", "confirmations.unfollow.confirm": "Dejar de seguir", "confirmations.unfollow.message": "¿Estás seguro de que quieres dejar de seguir a {name}?", + "directory.federated": "From known fediverse", + "directory.local": "From {domain} only", + "directory.new_arrivals": "New arrivals", + "directory.recently_active": "Recently active", "embed.instructions": "Añade este toot a tu sitio web con el siguiente código.", "embed.preview": "Así es como se verá:", "emoji_button.activity": "Actividad", @@ -158,7 +169,7 @@ "home.column_settings.basic": "Básico", "home.column_settings.show_reblogs": "Mostrar retoots", "home.column_settings.show_replies": "Mostrar respuestas", - "home.column_settings.update_live": "Actualizar en tiempo real", + "home.column_settings.update_live": "Update in real-time", "intervals.full.days": "{number, plural, one {# día} other {# días}}", "intervals.full.hours": "{number, plural, one {# hora} other {# horas}}", "intervals.full.minutes": "{number, plural, one {# minuto} other {# minutos}}", @@ -250,7 +261,6 @@ "navigation_bar.personal": "Personal", "navigation_bar.pins": "Toots fijados", "navigation_bar.preferences": "Preferencias", - "navigation_bar.profile_directory": "Directorio de perfiles", "navigation_bar.public_timeline": "Historia federada", "navigation_bar.security": "Seguridad", "notification.and_n_others": "and {count, plural, one {# other} other {# others}}", @@ -358,6 +368,7 @@ "status.show_more": "Mostrar más", "status.show_more_all": "Mostrar más para todo", "status.show_thread": "Ver hilo", + "status.uncached_media_warning": "Not available", "status.unmute_conversation": "Dejar de silenciar conversación", "status.unpin": "Dejar de fijar", "suggestions.dismiss": "Descartar sugerencia", @@ -373,7 +384,7 @@ "time_remaining.moments": "Momentos restantes", "time_remaining.seconds": "{number, plural, one {# segundo restante} other {# segundos restantes}}", "trends.count_by_accounts": "{count} {rawCount, plural, one {persona} other {personas}} hablando", - "trends.refresh": "Refresh", + "trends.trending_now": "Trending now", "ui.beforeunload": "Tu borrador se perderá si sales de Mastodon.", "upload_area.title": "Arrastra y suelta para subir", "upload_button.label": "Subir multimedia (JPEG, PNG, GIF, WebM, MP4, MOV)", diff --git a/app/javascript/mastodon/locales/et.json b/app/javascript/mastodon/locales/et.json index 0d708eac2..63253a177 100644 --- a/app/javascript/mastodon/locales/et.json +++ b/app/javascript/mastodon/locales/et.json @@ -16,6 +16,7 @@ "account.follows.empty": "See kasutaja ei jälgi veel kedagi.", "account.follows_you": "Jälgib sind", "account.hide_reblogs": "Peida upitused kasutajalt @{name}", + "account.last_status": "Last active", "account.link_verified_on": "Selle lingi autorsust kontrolliti {date}", "account.locked_info": "Selle konto privaatsus on lukustatud. Omanik vaatab manuaalselt üle, kes teda jägida saab.", "account.media": "Meedia", @@ -24,6 +25,7 @@ "account.mute": "Vaigista @{name}", "account.mute_notifications": "Vaigista teated kasutajalt @{name}", "account.muted": "Vaigistatud", + "account.never_active": "Never", "account.posts": "Tuututused", "account.posts_with_replies": "Tuututused ja vastused", "account.report": "Raporteeri @{name}", @@ -36,6 +38,8 @@ "account.unfollow": "Ära jälgi", "account.unmute": "Ära vaigista @{name}", "account.unmute_notifications": "Ära vaigista teateid kasutajalt @{name}", + "alert.rate_limited.message": "Please retry after {retry_time, time, medium}.", + "alert.rate_limited.title": "Rate limited", "alert.unexpected.message": "Tekkis ootamatu viga.", "alert.unexpected.title": "Oih!", "autosuggest_hashtag.per_week": "{count} per week", @@ -49,6 +53,7 @@ "column.blocks": "Blokeeritud kasutajad", "column.community": "Kohalik ajajoon", "column.direct": "Otsesõnumid", + "column.directory": "Browse profiles", "column.domain_blocks": "Peidetud domeenid", "column.favourites": "Lemmikud", "column.follow_requests": "Jälgimistaotlused", @@ -95,6 +100,8 @@ "confirmations.delete_list.message": "Oled kindel, et soovid selle nimekirja püsivalt kustutada?", "confirmations.domain_block.confirm": "Peida terve domeen", "confirmations.domain_block.message": "Oled ikka päris kindel, et soovid blokeerida terve {domain}? Enamikul juhtudel piisab mõnest sihitud blokist või vaigistusest, mis on eelistatav. Sa ei näe selle domeeni sisu üheski avalikus ajajoones või teadetes. Sinu jälgijad sellest domeenist eemaldatakse.", + "confirmations.logout.confirm": "Log out", + "confirmations.logout.message": "Are you sure you want to log out?", "confirmations.mute.confirm": "Vaigista", "confirmations.mute.message": "Oled kindel, et soovid {name} vaigistada?", "confirmations.redraft.confirm": "Kustuta & taasalusta", @@ -103,6 +110,10 @@ "confirmations.reply.message": "Kohene vastamine kirjutab üle sõnumi, mida hetkel koostad. Oled kindel, et soovid jätkata?", "confirmations.unfollow.confirm": "Ära jälgi", "confirmations.unfollow.message": "Oled kindel, et ei soovi jälgida {name}?", + "directory.federated": "From known fediverse", + "directory.local": "From {domain} only", + "directory.new_arrivals": "New arrivals", + "directory.recently_active": "Recently active", "embed.instructions": "Manusta see staatus oma veebilehele, kopeerides alloleva koodi.", "embed.preview": "Nii näeb see välja:", "emoji_button.activity": "Tegevus", @@ -158,7 +169,7 @@ "home.column_settings.basic": "Peamine", "home.column_settings.show_reblogs": "Näita upitusi", "home.column_settings.show_replies": "Näita vastuseid", - "home.column_settings.update_live": "Uuenda reaalajas", + "home.column_settings.update_live": "Update in real-time", "intervals.full.days": "{number, plural, one {# päev} other {# päevad}}", "intervals.full.hours": "{number, plural, one {# tund} other {# tundi}}", "intervals.full.minutes": "{number, plural, one {# minut} other {# minutit}}", @@ -250,7 +261,6 @@ "navigation_bar.personal": "Isiklik", "navigation_bar.pins": "Kinnitatud tuutid", "navigation_bar.preferences": "Eelistused", - "navigation_bar.profile_directory": "Profiilikataloog", "navigation_bar.public_timeline": "Föderatiivne ajajoon", "navigation_bar.security": "Turvalisus", "notification.and_n_others": "and {count, plural, one {# other} other {# others}}", @@ -358,6 +368,7 @@ "status.show_more": "Näita veel", "status.show_more_all": "Näita enam kõigile", "status.show_thread": "Kuva lõim", + "status.uncached_media_warning": "Not available", "status.unmute_conversation": "Ära vaigista vestlust", "status.unpin": "Kinnita profiililt lahti", "suggestions.dismiss": "Eira soovitust", @@ -373,7 +384,7 @@ "time_remaining.moments": "Hetked jäänud", "time_remaining.seconds": "{number, plural, one {# sekund} other {# sekundit}} left", "trends.count_by_accounts": "{count} {rawCount, plural, one {inimene} other {inimesed}} talking", - "trends.refresh": "Refresh", + "trends.trending_now": "Trending now", "ui.beforeunload": "Sinu mustand läheb kaotsi, kui lahkud Mastodonist.", "upload_area.title": "Lohista & aseta üleslaadimiseks", "upload_button.label": "Lisa meedia (JPEG, PNG, GIF, WebM, MP4, MOV)", diff --git a/app/javascript/mastodon/locales/eu.json b/app/javascript/mastodon/locales/eu.json index da16bf669..e88bcfff1 100644 --- a/app/javascript/mastodon/locales/eu.json +++ b/app/javascript/mastodon/locales/eu.json @@ -4,7 +4,7 @@ "account.block": "Blokeatu @{name}", "account.block_domain": "Ezkutatu {domain} domeinuko guztia", "account.blocked": "Blokeatuta", - "account.cancel_follow_request": "Cancel follow request", + "account.cancel_follow_request": "Ezeztatu jarraitzeko eskaria", "account.direct": "Mezu zuzena @{name}(r)i", "account.domain_blocked": "Ezkutatutako domeinua", "account.edit_profile": "Aldatu profila", @@ -16,6 +16,7 @@ "account.follows.empty": "Erabiltzaile honek ez du inor jarraitzen oraindik.", "account.follows_you": "Jarraitzen dizu", "account.hide_reblogs": "Ezkutatu @{name}(r)en bultzadak", + "account.last_status": "Azkenekoz aktiboa", "account.link_verified_on": "Esteka honen jabetzaren egiaztaketa data: {date}", "account.locked_info": "Kontu honen pribatutasun egoera blokeatuta gisa ezarri da. Jabeak eskuz erabakitzen du nork jarraitu diezaioken.", "account.media": "Multimedia", @@ -24,6 +25,7 @@ "account.mute": "Mututu @{name}", "account.mute_notifications": "Mututu @{name}(r)en jakinarazpenak", "account.muted": "Mutututa", + "account.never_active": "Inoiz ez", "account.posts": "Toot", "account.posts_with_replies": "Toot eta erantzunak", "account.report": "Salatu @{name}", @@ -36,9 +38,11 @@ "account.unfollow": "Utzi jarraitzeari", "account.unmute": "Desmututu @{name}", "account.unmute_notifications": "Desmututu @{name}(r)en jakinarazpenak", + "alert.rate_limited.message": "Please retry after {retry_time, time, medium}.", + "alert.rate_limited.title": "Rate limited", "alert.unexpected.message": "Ustekabeko errore bat gertatu da.", "alert.unexpected.title": "Ene!", - "autosuggest_hashtag.per_week": "{count} per week", + "autosuggest_hashtag.per_week": "{count} asteko", "boost_modal.combo": "{combo} sakatu dezakezu hurrengoan hau saltatzeko", "bundle_column_error.body": "Zerbait okerra gertatu da osagai hau kargatzean.", "bundle_column_error.retry": "Saiatu berriro", @@ -49,6 +53,7 @@ "column.blocks": "Blokeatutako erabiltzaileak", "column.community": "Denbora-lerro lokala", "column.direct": "Mezu zuzenak", + "column.directory": "Arakatu profilak", "column.domain_blocks": "Ezkutatutako domeinuak", "column.favourites": "Gogokoak", "column.follow_requests": "Jarraitzeko eskariak", @@ -95,6 +100,8 @@ "confirmations.delete_list.message": "Ziur behin betiko ezabatu nahi duzula zerrenda hau?", "confirmations.domain_block.confirm": "Ezkutatu domeinu osoa", "confirmations.domain_block.message": "Ziur, erabat ziur, {domain} domeinu osoa blokeatu nahi duzula? Gehienetan gutxi batzuk blokeatu edo mututzearekin nahikoa da. Ez duzu domeinu horretako edukirik ikusiko denbora lerroetan edo jakinarazpenetan. Domeinu horretako zure jarraitzaileak kenduko dira ere.", + "confirmations.logout.confirm": "Amaitu saioa", + "confirmations.logout.message": "Ziur saioa amaitu nahi duzula?", "confirmations.mute.confirm": "Mututu", "confirmations.mute.message": "Ziur {name} mututu nahi duzula?", "confirmations.redraft.confirm": "Ezabatu eta berridatzi", @@ -103,6 +110,10 @@ "confirmations.reply.message": "Orain erantzuteak idazten ari zaren mezua gainidatziko du. Ziur jarraitu nahi duzula?", "confirmations.unfollow.confirm": "Utzi jarraitzeari", "confirmations.unfollow.message": "Ziur {name} jarraitzeari utzi nahi diozula?", + "directory.federated": "Fedibertso ezagunekoak", + "directory.local": "{domain} domeinukoak soilik", + "directory.new_arrivals": "Iritsi berriak", + "directory.recently_active": "Duela gutxi aktibo", "embed.instructions": "Txertatu mezu hau zure webgunean beheko kodea kopatuz.", "embed.preview": "Hau da izango duen itxura:", "emoji_button.activity": "Jarduera", @@ -158,7 +169,7 @@ "home.column_settings.basic": "Oinarrizkoa", "home.column_settings.show_reblogs": "Erakutsi bultzadak", "home.column_settings.show_replies": "Erakutsi erantzunak", - "home.column_settings.update_live": "Eguneratu denbora errealean", + "home.column_settings.update_live": "Update in real-time", "intervals.full.days": "{number, plural, one {egun #} other {# egun}}", "intervals.full.hours": "{number, plural, one {ordu #} other {# ordu}}", "intervals.full.minutes": "{number, plural, one {minutu #} other {# minutu}}", @@ -250,7 +261,6 @@ "navigation_bar.personal": "Pertsonala", "navigation_bar.pins": "Finkatutako toot-ak", "navigation_bar.preferences": "Hobespenak", - "navigation_bar.profile_directory": "Profilen direktorioa", "navigation_bar.public_timeline": "Federatutako denbora-lerroa", "navigation_bar.security": "Segurtasuna", "notification.and_n_others": "and {count, plural, one {# other} other {# others}}", @@ -358,6 +368,7 @@ "status.show_more": "Erakutsi gehiago", "status.show_more_all": "Erakutsi denetarik gehiago", "status.show_thread": "Erakutsi haria", + "status.uncached_media_warning": "Ez eskuragarri", "status.unmute_conversation": "Desmututu elkarrizketa", "status.unpin": "Desfinkatu profiletik", "suggestions.dismiss": "Errefusatu proposamena", @@ -373,22 +384,22 @@ "time_remaining.moments": "Amaitzekotan", "time_remaining.seconds": "{number, plural, one {segundo #} other {# segundo}} amaitzeko", "trends.count_by_accounts": "{count} {rawCount, plural, one {person} other {people}} hitz egiten", - "trends.refresh": "Refresh", + "trends.trending_now": "Joera orain", "ui.beforeunload": "Zure zirriborroa galduko da Mastodon uzten baduzu.", "upload_area.title": "Arrastatu eta jaregin igotzeko", "upload_button.label": "Gehitu multimedia (JPEG, PNG, GIF, WebM, MP4, MOV)", "upload_error.limit": "Fitxategi igoera muga gaindituta.", "upload_error.poll": "Ez da inkestetan fitxategiak igotzea onartzen.", "upload_form.description": "Deskribatu ikusmen arazoak dituztenentzat", - "upload_form.edit": "Edit", + "upload_form.edit": "Editatu", "upload_form.undo": "Ezabatu", - "upload_modal.analyzing_picture": "Analyzing picture…", - "upload_modal.apply": "Apply", + "upload_modal.analyzing_picture": "Irudia aztertzen…", + "upload_modal.apply": "Aplikatu", "upload_modal.description_placeholder": "A quick brown fox jumps over the lazy dog", - "upload_modal.detect_text": "Detect text from picture", - "upload_modal.edit_media": "Edit media", + "upload_modal.detect_text": "Antzeman irudiko testua", + "upload_modal.edit_media": "Editatu multimedia", "upload_modal.hint": "Click or drag the circle on the preview to choose the focal point which will always be in view on all thumbnails.", - "upload_modal.preview_label": "Preview ({ratio})", + "upload_modal.preview_label": "Aurreikusi({ratio})", "upload_progress.label": "Igotzen...", "video.close": "Itxi bideoa", "video.exit_fullscreen": "Irten pantaila osotik", diff --git a/app/javascript/mastodon/locales/fa.json b/app/javascript/mastodon/locales/fa.json index 9804cd4c8..632698c46 100644 --- a/app/javascript/mastodon/locales/fa.json +++ b/app/javascript/mastodon/locales/fa.json @@ -4,7 +4,7 @@ "account.block": "مسدودسازی @{name}", "account.block_domain": "پنهان‌سازی همه چیز از سرور {domain}", "account.blocked": "مسدودشده", - "account.cancel_follow_request": "Cancel follow request", + "account.cancel_follow_request": "لغو درخواست پیگیری", "account.direct": "پیغام خصوصی به @{name}", "account.domain_blocked": "دامین پنهان‌شده", "account.edit_profile": "ویرایش نمایه", @@ -16,7 +16,8 @@ "account.follows.empty": "این کاربر هنوز هیچ کسی را پی نمی‌گیرد.", "account.follows_you": "پیگیر شماست", "account.hide_reblogs": "پنهان کردن بازبوق‌های @{name}", - "account.link_verified_on": "مالکیت این نشانی در تایخ {date} بررسی شد", + "account.last_status": "Last active", + "account.link_verified_on": "مالکیت این نشانی در تاریخ {date} بررسی شد", "account.locked_info": "این حساب خصوصی است. صاحب این حساب تصمیم می‌گیرد که چه کسی می‌تواند پیگیرش باشد.", "account.media": "عکس و ویدیو", "account.mention": "نام‌بردن از @{name}", @@ -24,6 +25,7 @@ "account.mute": "بی‌صدا کردن @{name}", "account.mute_notifications": "بی‌صداکردن اعلان‌ها از طرف @{name}", "account.muted": "بی‌صداشده", + "account.never_active": "Never", "account.posts": "نوشته‌ها", "account.posts_with_replies": "نوشته‌ها و پاسخ‌ها", "account.report": "گزارش @{name}", @@ -36,9 +38,11 @@ "account.unfollow": "پایان پیگیری", "account.unmute": "باصدا کردن @{name}", "account.unmute_notifications": "باصداکردن اعلان‌ها از طرف @{name}", + "alert.rate_limited.message": "Please retry after {retry_time, time, medium}.", + "alert.rate_limited.title": "Rate limited", "alert.unexpected.message": "خطای پیش‌بینی‌نشده‌ای رخ داد.", "alert.unexpected.title": "ای وای!", - "autosuggest_hashtag.per_week": "{count} per week", + "autosuggest_hashtag.per_week": "{count} در هفته", "boost_modal.combo": "دکمهٔ {combo} را بزنید تا دیگر این را نبینید", "bundle_column_error.body": "هنگام بازکردن این بخش خطایی رخ داد.", "bundle_column_error.retry": "تلاش دوباره", @@ -49,6 +53,7 @@ "column.blocks": "کاربران مسدودشده", "column.community": "نوشته‌های محلی", "column.direct": "پیغام‌های خصوصی", + "column.directory": "Browse profiles", "column.domain_blocks": "دامین‌های پنهان‌شده", "column.favourites": "پسندیده‌ها", "column.follow_requests": "درخواست‌های پیگیری", @@ -95,6 +100,8 @@ "confirmations.delete_list.message": "آیا واقعاً می‌خواهید این فهرست را برای همیشه پاک کنید؟", "confirmations.domain_block.confirm": "پنهان‌سازی کل دامین", "confirmations.domain_block.message": "آیا جدی جدی می‌خواهید کل دامین {domain} را مسدود کنید؟ بیشتر وقت‌ها مسدودکردن یا بی‌صداکردن چند حساب کاربری خاص کافی است و توصیه می‌شود. پس از این کار شما هیچ نوشته‌ای را از این دامین در فهرست نوشته‌های عمومی یا اعلان‌هایتان نخواهید دید. پیگیران شما از این دامین هم حذف خواهد شد.", + "confirmations.logout.confirm": "Log out", + "confirmations.logout.message": "Are you sure you want to log out?", "confirmations.mute.confirm": "بی‌صدا کن", "confirmations.mute.message": "آیا واقعاً می‌خواهید {name} را بی‌صدا کنید؟", "confirmations.redraft.confirm": "پاک‌کردن و بازنویسی", @@ -103,6 +110,10 @@ "confirmations.reply.message": "اگر الان پاسخ دهید، چیزی که در حال نوشتنش بودید پاک خواهد شد. آیا همین را می‌خواهید؟", "confirmations.unfollow.confirm": "لغو پیگیری", "confirmations.unfollow.message": "آیا واقعاً می‌خواهید به پیگیری از {name} پایان دهید؟", + "directory.federated": "From known fediverse", + "directory.local": "From {domain} only", + "directory.new_arrivals": "New arrivals", + "directory.recently_active": "Recently active", "embed.instructions": "برای جاگذاری این نوشته در سایت خودتان، کد زیر را کپی کنید.", "embed.preview": "نوشتهٔ جاگذاری‌شده این گونه به نظر خواهد رسید:", "emoji_button.activity": "فعالیت", @@ -128,7 +139,7 @@ "empty_column.favourited_statuses": "شما هنوز هیچ بوقی را نپسندیده‌اید. وقتی بوقی را بپسندید، این‌جا نمایش خواهد یافت.", "empty_column.favourites": "هنوز هیچ کسی این بوق را نپسندیده است. وقتی کسی آن را بپسندد، نامش این‌جا نمایش خواهد یافت.", "empty_column.follow_requests": "شما هنوز هیچ درخواست پیگیری‌ای ندارید. وقتی چنین درخواستی بگیرید، این‌جا نمایش خواهد یافت.", - "empty_column.hashtag": "هنوز هیچ چیزی با این هشتگ نیست.", + "empty_column.hashtag": "هنوز هیچ چیزی با این برچسب (هشتگ) نیست.", "empty_column.home": "شما هنوز پیگیر کسی نیستید. {public} را ببینید یا چیزی را جستجو کنید تا کاربران دیگر را ببینید.", "empty_column.home.public_timeline": "فهرست نوشته‌های همه‌جا", "empty_column.list": "در این فهرست هنوز چیزی نیست. وقتی اعضای این فهرست چیزی بنویسند، این‌جا ظاهر خواهد شد.", @@ -158,7 +169,7 @@ "home.column_settings.basic": "اصلی", "home.column_settings.show_reblogs": "نمایش بازبوق‌ها", "home.column_settings.show_replies": "نمایش پاسخ‌ها", - "home.column_settings.update_live": "به‌روزرسانی لحظه‌ای", + "home.column_settings.update_live": "Update in real-time", "intervals.full.days": "{number, plural, one {# روز} other {# روز}}", "intervals.full.hours": "{number, plural, one {# ساعت} other {# ساعت}}", "intervals.full.minutes": "{number, plural, one {# دقیقه} other {# دقیقه}}", @@ -250,7 +261,6 @@ "navigation_bar.personal": "شخصی", "navigation_bar.pins": "نوشته‌های ثابت", "navigation_bar.preferences": "ترجیحات", - "navigation_bar.profile_directory": "فهرست گزیدهٔ کاربران", "navigation_bar.public_timeline": "نوشته‌های همه‌جا", "navigation_bar.security": "امنیت", "notification.and_n_others": "and {count, plural, one {# other} other {# others}}", @@ -312,12 +322,12 @@ "search.placeholder": "جستجو", "search_popout.search_format": "راهنمای جستجوی پیشرفته", "search_popout.tips.full_text": "جستجوی متنی ساده می‌تواند بوق‌هایی که شما نوشته‌اید، پسندیده‌اید، بازبوقیده‌اید، یا در آن‌ها از شما نام برده شده است را پیدا کند. همچنین نام‌های کاربری، نام نمایش‌یافته، و هشتگ‌ها را هم شامل می‌شود.", - "search_popout.tips.hashtag": "هشتگ", + "search_popout.tips.hashtag": "برچسب", "search_popout.tips.status": "نوشته", - "search_popout.tips.text": "جستجوی متنی ساده برای نام‌ها، نام‌های کاربری، و هشتگ‌ها", + "search_popout.tips.text": "جستجوی متنی ساده برای نام‌ها، نام‌های کاربری، و برچسب‌ها", "search_popout.tips.user": "کاربر", "search_results.accounts": "افراد", - "search_results.hashtags": "هشتگ‌ها", + "search_results.hashtags": "برچسب‌ها", "search_results.statuses": "بوق‌ها", "search_results.statuses_fts_disabled": "جستجوی محتوای بوق‌ها در این سرور ماستدون ممکن نیست.", "search_results.total": "{count, number} {count, plural, one {نتیجه} other {نتیجه}}", @@ -358,6 +368,7 @@ "status.show_more": "نمایش", "status.show_more_all": "نمایش بیشتر همه", "status.show_thread": "نمایش گفتگو", + "status.uncached_media_warning": "Not available", "status.unmute_conversation": "باصداکردن گفتگو", "status.unpin": "برداشتن نوشتهٔ ثابت نمایه", "suggestions.dismiss": "پیشنهاد را نادیده بگیر", @@ -373,22 +384,22 @@ "time_remaining.moments": "زمان باقی‌مانده", "time_remaining.seconds": "{number, plural, one {# ثانیه} other {# ثانیه}} باقی مانده", "trends.count_by_accounts": "{count} {rawCount, plural, one {نفر نوشته است} other {نفر نوشته‌اند}}", - "trends.refresh": "Refresh", + "trends.trending_now": "پرطرفدار", "ui.beforeunload": "اگر از ماستدون خارج شوید پیش‌نویس شما پاک خواهد شد.", "upload_area.title": "برای بارگذاری به این‌جا بکشید", "upload_button.label": "افزودن عکس و ویدیو (JPEG, PNG, GIF, WebM, MP4, MOV)", "upload_error.limit": "از حد مجاز باگذاری فراتر رفتید.", "upload_error.poll": "باگذاری پرونده در نظرسنجی‌ها ممکن نیست.", "upload_form.description": "نوشتهٔ توضیحی برای کم‌بینایان و نابینایان", - "upload_form.edit": "Edit", + "upload_form.edit": "ویرایش", "upload_form.undo": "حذف", - "upload_modal.analyzing_picture": "Analyzing picture…", - "upload_modal.apply": "Apply", - "upload_modal.description_placeholder": "A quick brown fox jumps over the lazy dog", - "upload_modal.detect_text": "Detect text from picture", - "upload_modal.edit_media": "Edit media", - "upload_modal.hint": "Click or drag the circle on the preview to choose the focal point which will always be in view on all thumbnails.", - "upload_modal.preview_label": "Preview ({ratio})", + "upload_modal.analyzing_picture": "در حال پردازش تصویر…", + "upload_modal.apply": "اجرا", + "upload_modal.description_placeholder": "مردی با بیل مادرزنش را کشت", + "upload_modal.detect_text": "پیدا کردن نوشته از درون تصویر", + "upload_modal.edit_media": "ویرایش تصویر", + "upload_modal.hint": "حتی اگر تصویر بریده یا کوچک شود، نقطهٔ کانونی آن همیشه دیده خواهد شد. نقطهٔ کانونی را با کلیک یا جابه‌جا کردن آن تنظیم کنید.", + "upload_modal.preview_label": "پیش‌نمایش ({ratio})", "upload_progress.label": "بارگذاری...", "video.close": "بستن ویدیو", "video.exit_fullscreen": "خروج از حالت تمام صفحه", diff --git a/app/javascript/mastodon/locales/fi.json b/app/javascript/mastodon/locales/fi.json index baed4f0a5..8f8e9fc58 100644 --- a/app/javascript/mastodon/locales/fi.json +++ b/app/javascript/mastodon/locales/fi.json @@ -16,6 +16,7 @@ "account.follows.empty": "Tämä käyttäjä ei vielä seuraa ketään.", "account.follows_you": "Seuraa sinua", "account.hide_reblogs": "Piilota buustaukset käyttäjältä @{name}", + "account.last_status": "Last active", "account.link_verified_on": "Tämän linkin omistaja tarkistettiin {date}", "account.locked_info": "Tämän tili on yksityinen. Käyttäjä vahvistaa itse kuka voi seurata häntä.", "account.media": "Media", @@ -24,6 +25,7 @@ "account.mute": "Mykistä @{name}", "account.mute_notifications": "Mykistä ilmoitukset käyttäjältä @{name}", "account.muted": "Mykistetty", + "account.never_active": "Never", "account.posts": "Tuuttaukset", "account.posts_with_replies": "Tuuttaukset ja vastaukset", "account.report": "Raportoi @{name}", @@ -36,6 +38,8 @@ "account.unfollow": "Lakkaa seuraamasta", "account.unmute": "Poista käyttäjän @{name} mykistys", "account.unmute_notifications": "Poista mykistys käyttäjän @{name} ilmoituksilta", + "alert.rate_limited.message": "Please retry after {retry_time, time, medium}.", + "alert.rate_limited.title": "Rate limited", "alert.unexpected.message": "Tapahtui odottamaton virhe.", "alert.unexpected.title": "Hups!", "autosuggest_hashtag.per_week": "{count} per week", @@ -49,6 +53,7 @@ "column.blocks": "Estetyt käyttäjät", "column.community": "Paikallinen aikajana", "column.direct": "Viestit", + "column.directory": "Browse profiles", "column.domain_blocks": "Piilotetut verkkotunnukset", "column.favourites": "Suosikit", "column.follow_requests": "Seuraamispyynnöt", @@ -95,6 +100,8 @@ "confirmations.delete_list.message": "Haluatko varmasti poistaa tämän listan kokonaan?", "confirmations.domain_block.confirm": "Piilota koko verkko-osoite", "confirmations.domain_block.message": "Haluatko aivan varmasti estää koko verkko-osoitteen {domain}? Useimmiten jokunen kohdistettu esto ja mykistys riittää, ja se on suositeltavampi tapa toimia.", + "confirmations.logout.confirm": "Log out", + "confirmations.logout.message": "Are you sure you want to log out?", "confirmations.mute.confirm": "Mykistä", "confirmations.mute.message": "Haluatko varmasti mykistää käyttäjän {name}?", "confirmations.redraft.confirm": "Poista & palauta muokattavaksi", @@ -103,6 +110,10 @@ "confirmations.reply.message": "Jos vastaat nyt, vastaus korvaa tällä hetkellä työstämäsi viestin. Oletko varma, että haluat jatkaa?", "confirmations.unfollow.confirm": "Lakkaa seuraamasta", "confirmations.unfollow.message": "Haluatko varmasti lakata seuraamasta käyttäjää {name}?", + "directory.federated": "From known fediverse", + "directory.local": "From {domain} only", + "directory.new_arrivals": "New arrivals", + "directory.recently_active": "Recently active", "embed.instructions": "Upota statuspäivitys sivullesi kopioimalla alla oleva koodi.", "embed.preview": "Se tulee näyttämään tältä:", "emoji_button.activity": "Aktiviteetit", @@ -250,7 +261,6 @@ "navigation_bar.personal": "Personal", "navigation_bar.pins": "Kiinnitetyt tuuttaukset", "navigation_bar.preferences": "Asetukset", - "navigation_bar.profile_directory": "Profile directory", "navigation_bar.public_timeline": "Yleinen aikajana", "navigation_bar.security": "Tunnukset", "notification.and_n_others": "and {count, plural, one {# other} other {# others}}", @@ -358,6 +368,7 @@ "status.show_more": "Näytä lisää", "status.show_more_all": "Näytä lisää kaikista", "status.show_thread": "Show thread", + "status.uncached_media_warning": "Not available", "status.unmute_conversation": "Poista keskustelun mykistys", "status.unpin": "Irrota profiilista", "suggestions.dismiss": "Dismiss suggestion", @@ -373,7 +384,7 @@ "time_remaining.moments": "Moments remaining", "time_remaining.seconds": "{number, plural, one {# second} other {# seconds}} left", "trends.count_by_accounts": "{count} {rawCount, plural, one {person} other {people}} talking", - "trends.refresh": "Refresh", + "trends.trending_now": "Trending now", "ui.beforeunload": "Luonnos häviää, jos poistut Mastodonista.", "upload_area.title": "Lataa raahaamalla ja pudottamalla tähän", "upload_button.label": "Lisää mediaa", diff --git a/app/javascript/mastodon/locales/fr.json b/app/javascript/mastodon/locales/fr.json index 12025baff..72158c413 100644 --- a/app/javascript/mastodon/locales/fr.json +++ b/app/javascript/mastodon/locales/fr.json @@ -4,11 +4,11 @@ "account.block": "Bloquer @{name}", "account.block_domain": "Tout masquer venant de {domain}", "account.blocked": "Bloqué", - "account.cancel_follow_request": "Cancel follow request", + "account.cancel_follow_request": "Annuler la demande de suivi", "account.direct": "Envoyer un message direct à @{name}", "account.domain_blocked": "Domaine caché", "account.edit_profile": "Modifier le profil", - "account.endorse": "Figure sur le profil", + "account.endorse": "Mettre en avant sur le profil", "account.follow": "Suivre", "account.followers": "Abonné⋅e⋅s", "account.followers.empty": "Personne ne suit cet utilisateur·rice pour l’instant.", @@ -16,6 +16,7 @@ "account.follows.empty": "Cet·te utilisateur·rice ne suit personne pour l’instant.", "account.follows_you": "Vous suit", "account.hide_reblogs": "Masquer les partages de @{name}", + "account.last_status": "Dernière activité", "account.link_verified_on": "La propriété de ce lien a été vérifiée le {date}", "account.locked_info": "Ce compte est verrouillé. Son propriétaire approuve manuellement qui peut le ou la suivre.", "account.media": "Média", @@ -24,6 +25,7 @@ "account.mute": "Masquer @{name}", "account.mute_notifications": "Ignorer les notifications de @{name}", "account.muted": "Silencé", + "account.never_active": "Jamais", "account.posts": "Pouets", "account.posts_with_replies": "Pouets et réponses", "account.report": "Signaler @{name}", @@ -32,14 +34,16 @@ "account.show_reblogs": "Afficher les partages de @{name}", "account.unblock": "Débloquer @{name}", "account.unblock_domain": "Ne plus masquer {domain}", - "account.unendorse": "Ne figure pas sur le profil", + "account.unendorse": "Ne pas mettre en avant sur le profil", "account.unfollow": "Ne plus suivre", "account.unmute": "Ne plus masquer @{name}", "account.unmute_notifications": "Réactiver les notifications de @{name}", + "alert.rate_limited.message": "Veuillez réessayer après {retry_time, time, medium}.", + "alert.rate_limited.title": "Taux limité", "alert.unexpected.message": "Une erreur inattendue s’est produite.", "alert.unexpected.title": "Oups !", - "autosuggest_hashtag.per_week": "{count} per week", - "boost_modal.combo": "Vous pouvez appuyer sur {combo} pour pouvoir passer ceci, la prochaine fois", + "autosuggest_hashtag.per_week": "{count} par semaine", + "boost_modal.combo": "Vous pouvez appuyer sur {combo} pour passer ceci, la prochaine fois", "bundle_column_error.body": "Une erreur s’est produite lors du chargement de ce composant.", "bundle_column_error.retry": "Réessayer", "bundle_column_error.title": "Erreur réseau", @@ -48,7 +52,8 @@ "bundle_modal_error.retry": "Réessayer", "column.blocks": "Comptes bloqués", "column.community": "Fil public local", - "column.direct": "Messages directs", + "column.direct": "Messages privés", + "column.directory": "Parcourir les profils", "column.domain_blocks": "Domaines cachés", "column.favourites": "Favoris", "column.follow_requests": "Demandes de suivi", @@ -95,6 +100,8 @@ "confirmations.delete_list.message": "Êtes-vous sûr·e de vouloir supprimer définitivement cette liste ?", "confirmations.domain_block.confirm": "Masquer le domaine entier", "confirmations.domain_block.message": "Êtes-vous vraiment, vraiment sûr⋅e de vouloir bloquer {domain} en entier ? Dans la plupart des cas, quelques blocages ou masquages ciblés sont suffisants et préférables. Vous ne verrez plus de contenu provenant de ce domaine, ni dans fils publics, ni dans vos notifications. Vos abonné·e·s utilisant ce domaine seront retiré·e·s.", + "confirmations.logout.confirm": "Déconnexion", + "confirmations.logout.message": "Êtes-vous sûr de vouloir vous déconnecter ?", "confirmations.mute.confirm": "Masquer", "confirmations.mute.message": "Confirmez-vous le masquage de {name} ?", "confirmations.redraft.confirm": "Effacer et ré-écrire", @@ -103,6 +110,10 @@ "confirmations.reply.message": "Répondre maintenant écrasera le message que vous êtes en train de composer. Voulez-vous vraiment continuer ?", "confirmations.unfollow.confirm": "Ne plus suivre", "confirmations.unfollow.message": "Voulez-vous arrêter de suivre {name} ?", + "directory.federated": "De la fédiverse connue", + "directory.local": "De {domain} seulement", + "directory.new_arrivals": "Nouveaux arrivants", + "directory.recently_active": "Récemment actif", "embed.instructions": "Intégrez ce statut à votre site en copiant le code ci-dessous.", "embed.preview": "Il apparaîtra comme cela :", "emoji_button.activity": "Activités", @@ -158,7 +169,7 @@ "home.column_settings.basic": "Basique", "home.column_settings.show_reblogs": "Afficher les partages", "home.column_settings.show_replies": "Afficher les réponses", - "home.column_settings.update_live": "Mettre à jour en temps réel", + "home.column_settings.update_live": "Update in real-time", "intervals.full.days": "{number, plural, one {# jour} other {# jours}}", "intervals.full.hours": "{number, plural, one {# heure} other {# heures}}", "intervals.full.minutes": "{number, plural, one {# minute} other {# minutes}}", @@ -171,7 +182,7 @@ "introduction.federation.local.text": "Les messages publics de personnes se trouvant sur le même serveur que vous apparaîtront sur le fil public local.", "introduction.interactions.action": "Finir le tutoriel !", "introduction.interactions.favourite.headline": "Favoris", - "introduction.interactions.favourite.text": "Vous pouvez garder un pouet pour plus tard, et faire savoir à son auteur·ice que vous l'avez aimé, en le favorisant.", + "introduction.interactions.favourite.text": "Vous pouvez garder un pouet pour plus tard et faire savoir à son auteur·ice que vous l’avez aimé, en le favorisant.", "introduction.interactions.reblog.headline": "Repartager", "introduction.interactions.reblog.text": "Vous pouvez partager les pouets d'autres personnes avec vos abonné·e·s en les repartageant.", "introduction.interactions.reply.headline": "Répondre", @@ -242,7 +253,7 @@ "navigation_bar.filters": "Mots silenciés", "navigation_bar.follow_requests": "Demandes de suivi", "navigation_bar.follows_and_followers": "Abonnements et abonné⋅e·s", - "navigation_bar.info": "Plus d’informations", + "navigation_bar.info": "À propos de ce serveur", "navigation_bar.keyboard_shortcuts": "Raccourcis clavier", "navigation_bar.lists": "Listes", "navigation_bar.logout": "Déconnexion", @@ -250,7 +261,6 @@ "navigation_bar.personal": "Personnel", "navigation_bar.pins": "Pouets épinglés", "navigation_bar.preferences": "Préférences", - "navigation_bar.profile_directory": "Annuaire des profils", "navigation_bar.public_timeline": "Fil public global", "navigation_bar.security": "Sécurité", "notification.and_n_others": "and {count, plural, one {# other} other {# others}}", @@ -321,8 +331,8 @@ "search_results.statuses": "Pouets", "search_results.statuses_fts_disabled": "La recherche de pouets par leur contenu n'est pas activée sur ce serveur Mastodon.", "search_results.total": "{count, number} {count, plural, one {résultat} other {résultats}}", - "status.admin_account": "Ouvrir l'interface de modération pour @{name}", - "status.admin_status": "Ouvrir ce statut dans l'interface de modération", + "status.admin_account": "Ouvrir l’interface de modération pour @{name}", + "status.admin_status": "Ouvrir ce statut dans l’interface de modération", "status.block": "Bloquer @{name}", "status.cancel_reblog_private": "Dé-booster", "status.cannot_reblog": "Cette publication ne peut être boostée", @@ -358,6 +368,7 @@ "status.show_more": "Déplier", "status.show_more_all": "Tout déplier", "status.show_thread": "Lire le fil", + "status.uncached_media_warning": "Indisponible", "status.unmute_conversation": "Ne plus masquer la conversation", "status.unpin": "Retirer du profil", "suggestions.dismiss": "Rejeter la suggestion", @@ -373,22 +384,22 @@ "time_remaining.moments": "Encore quelques instants", "time_remaining.seconds": "{number, plural, one {# second} other {# seconds}} restantes", "trends.count_by_accounts": "{count} {rawCount, plural, one {personne} other {personnes}} discutent", - "trends.refresh": "Refresh", + "trends.trending_now": "Tendance en ce moment", "ui.beforeunload": "Votre brouillon sera perdu si vous quittez Mastodon.", "upload_area.title": "Glissez et déposez pour envoyer", - "upload_button.label": "Joindre un média (JPEG, PNG, GIF, WebM, MP4, MOV)", + "upload_button.label": "Joindre un média ({formats})", "upload_error.limit": "Taille maximale d'envoi de fichier dépassée.", - "upload_error.poll": "L'envoi de fichiers n'est pas autorisé avec les sondages.", + "upload_error.poll": "L’envoi de fichiers n’est pas autorisé avec les sondages.", "upload_form.description": "Décrire pour les malvoyant·e·s", - "upload_form.edit": "Edit", + "upload_form.edit": "Modifier", "upload_form.undo": "Supprimer", - "upload_modal.analyzing_picture": "Analyzing picture…", - "upload_modal.apply": "Apply", - "upload_modal.description_placeholder": "A quick brown fox jumps over the lazy dog", - "upload_modal.detect_text": "Detect text from picture", - "upload_modal.edit_media": "Edit media", - "upload_modal.hint": "Click or drag the circle on the preview to choose the focal point which will always be in view on all thumbnails.", - "upload_modal.preview_label": "Preview ({ratio})", + "upload_modal.analyzing_picture": "Analyse de l’image en cours…", + "upload_modal.apply": "Appliquer", + "upload_modal.description_placeholder": "Buvez de ce whisky que le patron juge fameux", + "upload_modal.detect_text": "Détecter le texte de l’image", + "upload_modal.edit_media": "Modifier le média", + "upload_modal.hint": "Cliquez ou faites glisser le cercle sur l’aperçu pour choisir le point focal qui sera toujours visible sur toutes les miniatures.", + "upload_modal.preview_label": "Aperçu ({ratio})", "upload_progress.label": "Envoi en cours…", "video.close": "Fermer la vidéo", "video.exit_fullscreen": "Quitter le plein écran", diff --git a/app/javascript/mastodon/locales/gl.json b/app/javascript/mastodon/locales/gl.json index fcbc16017..1bf37c898 100644 --- a/app/javascript/mastodon/locales/gl.json +++ b/app/javascript/mastodon/locales/gl.json @@ -4,7 +4,7 @@ "account.block": "Bloquear @{name}", "account.block_domain": "Ocultar calquer contido de {domain}", "account.blocked": "Bloqueada", - "account.cancel_follow_request": "Cancel follow request", + "account.cancel_follow_request": "Cancelar petición de seguemento", "account.direct": "Mensaxe directa @{name}", "account.domain_blocked": "Dominio agochado", "account.edit_profile": "Editar perfil", @@ -16,6 +16,7 @@ "account.follows.empty": "Esta usuaria aínda non segue a ninguén.", "account.follows_you": "Séguete", "account.hide_reblogs": "Ocultar repeticións de @{name}", + "account.last_status": "Último activo", "account.link_verified_on": "A propiedade de esta ligazón foi comprobada en {date}", "account.locked_info": "O estado da intimidade de esta conta estableceuse en pechado. A persoa dona da conta revisa quen pode seguila.", "account.media": "Medios", @@ -24,6 +25,7 @@ "account.mute": "Acalar @{name}", "account.mute_notifications": "Acalar as notificacións de @{name}", "account.muted": "Acalada", + "account.never_active": "Nunca", "account.posts": "Toots", "account.posts_with_replies": "Toots e respostas", "account.report": "Informar sobre @{name}", @@ -36,9 +38,11 @@ "account.unfollow": "Non seguir", "account.unmute": "Non acalar @{name}", "account.unmute_notifications": "Desbloquear as notificacións de @{name}", + "alert.rate_limited.message": "Por favor inténteo tras {retry_time, time, medium}.", + "alert.rate_limited.title": "Taxa limitada", "alert.unexpected.message": "Aconteceu un fallo non agardado.", "alert.unexpected.title": "Vaia!", - "autosuggest_hashtag.per_week": "{count} per week", + "autosuggest_hashtag.per_week": "{count} por semana", "boost_modal.combo": "Pulse {combo} para saltar esto a próxima vez", "bundle_column_error.body": "Houbo un fallo mentras se cargaba este compoñente.", "bundle_column_error.retry": "Inténteo de novo", @@ -49,6 +53,7 @@ "column.blocks": "Usuarias bloqueadas", "column.community": "Liña temporal local", "column.direct": "Mensaxes directas", + "column.directory": "Ver perfiles", "column.domain_blocks": "Dominios agochados", "column.favourites": "Favoritas", "column.follow_requests": "Peticións de seguimento", @@ -95,6 +100,8 @@ "confirmations.delete_list.message": "Estás seguro de que queres eliminar permanentemente esta lista?", "confirmations.domain_block.confirm": "Agochar un dominio completo", "confirmations.domain_block.message": "Realmente está segura de que quere bloquear por completo o dominio {domain}? Normalmente é suficiente, e preferible, bloquear de xeito selectivo varios elementos. Non verá contidos de ese dominio en ningunha liña temporal ou nas notificacións. As súas seguidoras en ese dominio serán eliminadas.", + "confirmations.logout.confirm": "Desconectar", + "confirmations.logout.message": "Seguro que desexa desconectar?", "confirmations.mute.confirm": "Acalar", "confirmations.mute.message": "Está segura de que quere acalar a {name}?", "confirmations.redraft.confirm": "Eliminar e reescribir", @@ -103,6 +110,10 @@ "confirmations.reply.message": "Respostando agora sobreescribirá a mensaxe que está a compoñer. Segura de querer proceder?", "confirmations.unfollow.confirm": "Deixar de seguir", "confirmations.unfollow.message": "Quere deixar de seguir a {name}?", + "directory.federated": "Desde o fediverso coñecido", + "directory.local": "Só desde {domain}", + "directory.new_arrivals": "Novas achegas", + "directory.recently_active": "Activo recentemente", "embed.instructions": "Copie o código inferior para incrustar no seu sitio web este estado.", "embed.preview": "Así será mostrado:", "emoji_button.activity": "Actividade", @@ -158,7 +169,7 @@ "home.column_settings.basic": "Básico", "home.column_settings.show_reblogs": "Mostrar repeticións", "home.column_settings.show_replies": "Mostrar respostas", - "home.column_settings.update_live": "Actualizar en tempo real", + "home.column_settings.update_live": "Update in real-time", "intervals.full.days": "{number, plural,one {# día} other {# días}}", "intervals.full.hours": "{number, plural, one {# hora} other {# horas}}", "intervals.full.minutes": "{number, plural, one {# minuto} other {# minutos}}", @@ -250,7 +261,6 @@ "navigation_bar.personal": "Persoal", "navigation_bar.pins": "Mensaxes fixadas", "navigation_bar.preferences": "Preferencias", - "navigation_bar.profile_directory": "Directorio de perfil", "navigation_bar.public_timeline": "Liña temporal federada", "navigation_bar.security": "Seguridade", "notification.and_n_others": "and {count, plural, one {# other} other {# others}}", @@ -358,6 +368,7 @@ "status.show_more": "Mostrar máis", "status.show_more_all": "Mostrar máis para todas", "status.show_thread": "Mostrar fío", + "status.uncached_media_warning": "Non dispoñible", "status.unmute_conversation": "Non acalar a conversa", "status.unpin": "Despegar do perfil", "suggestions.dismiss": "Rexeitar suxestión", @@ -373,22 +384,22 @@ "time_remaining.moments": "Está rematando", "time_remaining.seconds": "{number, plural, one {# segundo} other {# segundos}} restantes", "trends.count_by_accounts": "{count} {rawCount, plural, one {person} outras {people}} conversando", - "trends.refresh": "Refresh", + "trends.trending_now": "Tendencias actuais", "ui.beforeunload": "O borrador perderase se sae de Mastodon.", "upload_area.title": "Arrastre e solte para subir", "upload_button.label": "Engadir medios ({formats})", "upload_error.limit": "Excedeu o límite de subida de ficheiros.", "upload_error.poll": "Non se poden subir ficheiros nas sondaxes.", "upload_form.description": "Describa para deficientes visuais", - "upload_form.edit": "Edit", + "upload_form.edit": "Editar", "upload_form.undo": "Eliminar", - "upload_modal.analyzing_picture": "Analyzing picture…", - "upload_modal.apply": "Apply", - "upload_modal.description_placeholder": "A quick brown fox jumps over the lazy dog", - "upload_modal.detect_text": "Detect text from picture", - "upload_modal.edit_media": "Edit media", - "upload_modal.hint": "Click or drag the circle on the preview to choose the focal point which will always be in view on all thumbnails.", - "upload_modal.preview_label": "Preview ({ratio})", + "upload_modal.analyzing_picture": "Analizando imaxe…", + "upload_modal.apply": "Aplicar", + "upload_modal.description_placeholder": "Un raposo moi feitiño salta sobre o can preguiceiro", + "upload_modal.detect_text": "Detectar texto na imaxe", + "upload_modal.edit_media": "Editar medios", + "upload_modal.hint": "Prema ou arrastre o círculo na vista previa para escolle o punto focal que se verá na vista de todas as miniaturas.", + "upload_modal.preview_label": "Vista previa ({ratio})", "upload_progress.label": "Subindo...", "video.close": "Pechar video", "video.exit_fullscreen": "Saír da pantalla completa", diff --git a/app/javascript/mastodon/locales/he.json b/app/javascript/mastodon/locales/he.json index e17d451ca..fd7e40c53 100644 --- a/app/javascript/mastodon/locales/he.json +++ b/app/javascript/mastodon/locales/he.json @@ -16,6 +16,7 @@ "account.follows.empty": "This user doesn't follow anyone yet.", "account.follows_you": "במעקב אחריך", "account.hide_reblogs": "להסתיר הידהודים מאת @{name}", + "account.last_status": "Last active", "account.link_verified_on": "Ownership of this link was checked on {date}", "account.locked_info": "This account privacy status is set to locked. The owner manually reviews who can follow them.", "account.media": "מדיה", @@ -24,6 +25,7 @@ "account.mute": "להשתיק את @{name}", "account.mute_notifications": "להסתיר התראות מאת @{name}", "account.muted": "Muted", + "account.never_active": "Never", "account.posts": "הודעות", "account.posts_with_replies": "Toots with replies", "account.report": "לדווח על @{name}", @@ -36,6 +38,8 @@ "account.unfollow": "הפסקת מעקב", "account.unmute": "הפסקת השתקת @{name}", "account.unmute_notifications": "להפסיק הסתרת הודעות מעם @{name}", + "alert.rate_limited.message": "Please retry after {retry_time, time, medium}.", + "alert.rate_limited.title": "Rate limited", "alert.unexpected.message": "אירעה שגיאה בלתי צפויה.", "alert.unexpected.title": "אופס!", "autosuggest_hashtag.per_week": "{count} per week", @@ -49,6 +53,7 @@ "column.blocks": "חסימות", "column.community": "ציר זמן מקומי", "column.direct": "Direct messages", + "column.directory": "Browse profiles", "column.domain_blocks": "Hidden domains", "column.favourites": "חיבובים", "column.follow_requests": "בקשות מעקב", @@ -95,6 +100,8 @@ "confirmations.delete_list.message": "Are you sure you want to permanently delete this list?", "confirmations.domain_block.confirm": "הסתר קהילה שלמה", "confirmations.domain_block.message": "באמת באמת לחסום את כל קהילת {domain}? ברב המקרים השתקות נבחרות של מספר משתמשים מסויימים צריכה להספיק.", + "confirmations.logout.confirm": "Log out", + "confirmations.logout.message": "Are you sure you want to log out?", "confirmations.mute.confirm": "להשתיק", "confirmations.mute.message": "להשתיק את {name}?", "confirmations.redraft.confirm": "Delete & redraft", @@ -103,6 +110,10 @@ "confirmations.reply.message": "Replying now will overwrite the message you are currently composing. Are you sure you want to proceed?", "confirmations.unfollow.confirm": "להפסיק מעקב", "confirmations.unfollow.message": "להפסיק מעקב אחרי {name}?", + "directory.federated": "From known fediverse", + "directory.local": "From {domain} only", + "directory.new_arrivals": "New arrivals", + "directory.recently_active": "Recently active", "embed.instructions": "ניתן להטמיע את ההודעה באתרך ע\"י העתקת הקוד שלהלן.", "embed.preview": "דוגמא כיצד זה יראה:", "emoji_button.activity": "פעילות", @@ -250,7 +261,6 @@ "navigation_bar.personal": "Personal", "navigation_bar.pins": "חיצרוצים מקובעים", "navigation_bar.preferences": "העדפות", - "navigation_bar.profile_directory": "Profile directory", "navigation_bar.public_timeline": "ציר זמן בין-קהילתי", "navigation_bar.security": "Security", "notification.and_n_others": "and {count, plural, one {# other} other {# others}}", @@ -358,6 +368,7 @@ "status.show_more": "הראה יותר", "status.show_more_all": "Show more for all", "status.show_thread": "Show thread", + "status.uncached_media_warning": "Not available", "status.unmute_conversation": "הסרת השתקת שיחה", "status.unpin": "לשחרר מקיבוע באודות", "suggestions.dismiss": "Dismiss suggestion", @@ -373,7 +384,7 @@ "time_remaining.moments": "Moments remaining", "time_remaining.seconds": "{number, plural, one {# second} other {# seconds}} left", "trends.count_by_accounts": "{count} {rawCount, plural, one {person} other {people}} talking", - "trends.refresh": "Refresh", + "trends.trending_now": "Trending now", "ui.beforeunload": "הטיוטא תאבד אם תעזבו את מסטודון.", "upload_area.title": "ניתן להעלות על ידי Drag & drop", "upload_button.label": "הוספת מדיה", diff --git a/app/javascript/mastodon/locales/hi.json b/app/javascript/mastodon/locales/hi.json index 980b4e457..55b383d59 100644 --- a/app/javascript/mastodon/locales/hi.json +++ b/app/javascript/mastodon/locales/hi.json @@ -16,6 +16,7 @@ "account.follows.empty": "This user doesn't follow anyone yet.", "account.follows_you": "Follows you", "account.hide_reblogs": "Hide boosts from @{name}", + "account.last_status": "Last active", "account.link_verified_on": "Ownership of this link was checked on {date}", "account.locked_info": "This account privacy status is set to locked. The owner manually reviews who can follow them.", "account.media": "Media", @@ -24,6 +25,7 @@ "account.mute": "Mute @{name}", "account.mute_notifications": "Mute notifications from @{name}", "account.muted": "Muted", + "account.never_active": "Never", "account.posts": "Toots", "account.posts_with_replies": "Toots and replies", "account.report": "Report @{name}", @@ -36,6 +38,8 @@ "account.unfollow": "Unfollow", "account.unmute": "Unmute @{name}", "account.unmute_notifications": "Unmute notifications from @{name}", + "alert.rate_limited.message": "Please retry after {retry_time, time, medium}.", + "alert.rate_limited.title": "Rate limited", "alert.unexpected.message": "An unexpected error occurred.", "alert.unexpected.title": "Oops!", "autosuggest_hashtag.per_week": "{count} per week", @@ -49,6 +53,7 @@ "column.blocks": "Blocked users", "column.community": "Local timeline", "column.direct": "Direct messages", + "column.directory": "Browse profiles", "column.domain_blocks": "Hidden domains", "column.favourites": "Favourites", "column.follow_requests": "Follow requests", @@ -95,6 +100,8 @@ "confirmations.delete_list.message": "Are you sure you want to permanently delete this list?", "confirmations.domain_block.confirm": "Hide entire domain", "confirmations.domain_block.message": "Are you really, really sure you want to block the entire {domain}? In most cases a few targeted blocks or mutes are sufficient and preferable. You will not see content from that domain in any public timelines or your notifications. Your followers from that domain will be removed.", + "confirmations.logout.confirm": "Log out", + "confirmations.logout.message": "Are you sure you want to log out?", "confirmations.mute.confirm": "Mute", "confirmations.mute.message": "Are you sure you want to mute {name}?", "confirmations.redraft.confirm": "Delete & redraft", @@ -103,6 +110,10 @@ "confirmations.reply.message": "Replying now will overwrite the message you are currently composing. Are you sure you want to proceed?", "confirmations.unfollow.confirm": "Unfollow", "confirmations.unfollow.message": "Are you sure you want to unfollow {name}?", + "directory.federated": "From known fediverse", + "directory.local": "From {domain} only", + "directory.new_arrivals": "New arrivals", + "directory.recently_active": "Recently active", "embed.instructions": "Embed this status on your website by copying the code below.", "embed.preview": "Here is what it will look like:", "emoji_button.activity": "Activity", @@ -250,7 +261,6 @@ "navigation_bar.personal": "Personal", "navigation_bar.pins": "Pinned toots", "navigation_bar.preferences": "Preferences", - "navigation_bar.profile_directory": "Profile directory", "navigation_bar.public_timeline": "Federated timeline", "navigation_bar.security": "Security", "notification.and_n_others": "and {count, plural, one {# other} other {# others}}", @@ -358,6 +368,7 @@ "status.show_more": "Show more", "status.show_more_all": "Show more for all", "status.show_thread": "Show thread", + "status.uncached_media_warning": "Not available", "status.unmute_conversation": "Unmute conversation", "status.unpin": "Unpin from profile", "suggestions.dismiss": "Dismiss suggestion", @@ -373,7 +384,7 @@ "time_remaining.moments": "Moments remaining", "time_remaining.seconds": "{number, plural, one {# second} other {# seconds}} left", "trends.count_by_accounts": "{count} {rawCount, plural, one {person} other {people}} talking", - "trends.refresh": "Refresh", + "trends.trending_now": "Trending now", "ui.beforeunload": "Your draft will be lost if you leave Mastodon.", "upload_area.title": "Drag & drop to upload", "upload_button.label": "Add media (JPEG, PNG, GIF, WebM, MP4, MOV)", diff --git a/app/javascript/mastodon/locales/hr.json b/app/javascript/mastodon/locales/hr.json index d718915c8..8d7cb436c 100644 --- a/app/javascript/mastodon/locales/hr.json +++ b/app/javascript/mastodon/locales/hr.json @@ -16,6 +16,7 @@ "account.follows.empty": "This user doesn't follow anyone yet.", "account.follows_you": "te slijedi", "account.hide_reblogs": "Hide boosts from @{name}", + "account.last_status": "Last active", "account.link_verified_on": "Ownership of this link was checked on {date}", "account.locked_info": "This account privacy status is set to locked. The owner manually reviews who can follow them.", "account.media": "Media", @@ -24,6 +25,7 @@ "account.mute": "Utišaj @{name}", "account.mute_notifications": "Mute notifications from @{name}", "account.muted": "Muted", + "account.never_active": "Never", "account.posts": "Postovi", "account.posts_with_replies": "Toots with replies", "account.report": "Prijavi @{name}", @@ -36,6 +38,8 @@ "account.unfollow": "Prestani slijediti", "account.unmute": "Poništi utišavanje @{name}", "account.unmute_notifications": "Unmute notifications from @{name}", + "alert.rate_limited.message": "Please retry after {retry_time, time, medium}.", + "alert.rate_limited.title": "Rate limited", "alert.unexpected.message": "An unexpected error occurred.", "alert.unexpected.title": "Oops!", "autosuggest_hashtag.per_week": "{count} per week", @@ -49,6 +53,7 @@ "column.blocks": "Blokirani korisnici", "column.community": "Lokalni timeline", "column.direct": "Direct messages", + "column.directory": "Browse profiles", "column.domain_blocks": "Hidden domains", "column.favourites": "Favoriti", "column.follow_requests": "Zahtjevi za slijeđenje", @@ -95,6 +100,8 @@ "confirmations.delete_list.message": "Are you sure you want to permanently delete this list?", "confirmations.domain_block.confirm": "Sakrij cijelu domenu", "confirmations.domain_block.message": "Jesi li zaista, zaista siguran da želiš potpuno blokirati {domain}? In most cases a few targeted blocks or mutes are sufficient and preferable.", + "confirmations.logout.confirm": "Log out", + "confirmations.logout.message": "Are you sure you want to log out?", "confirmations.mute.confirm": "Utišaj", "confirmations.mute.message": "Jesi li siguran da želiš utišati {name}?", "confirmations.redraft.confirm": "Delete & redraft", @@ -103,6 +110,10 @@ "confirmations.reply.message": "Replying now will overwrite the message you are currently composing. Are you sure you want to proceed?", "confirmations.unfollow.confirm": "Unfollow", "confirmations.unfollow.message": "Are you sure you want to unfollow {name}?", + "directory.federated": "From known fediverse", + "directory.local": "From {domain} only", + "directory.new_arrivals": "New arrivals", + "directory.recently_active": "Recently active", "embed.instructions": "Embed this status on your website by copying the code below.", "embed.preview": "Here is what it will look like:", "emoji_button.activity": "Aktivnost", @@ -250,7 +261,6 @@ "navigation_bar.personal": "Personal", "navigation_bar.pins": "Pinned toots", "navigation_bar.preferences": "Postavke", - "navigation_bar.profile_directory": "Profile directory", "navigation_bar.public_timeline": "Federalni timeline", "navigation_bar.security": "Security", "notification.and_n_others": "and {count, plural, one {# other} other {# others}}", @@ -358,6 +368,7 @@ "status.show_more": "Pokaži više", "status.show_more_all": "Show more for all", "status.show_thread": "Show thread", + "status.uncached_media_warning": "Not available", "status.unmute_conversation": "Poništi utišavanje razgovora", "status.unpin": "Unpin from profile", "suggestions.dismiss": "Dismiss suggestion", @@ -373,7 +384,7 @@ "time_remaining.moments": "Moments remaining", "time_remaining.seconds": "{number, plural, one {# second} other {# seconds}} left", "trends.count_by_accounts": "{count} {rawCount, plural, one {person} other {people}} talking", - "trends.refresh": "Refresh", + "trends.trending_now": "Trending now", "ui.beforeunload": "Your draft will be lost if you leave Mastodon.", "upload_area.title": "Povuci i spusti kako bi uploadao", "upload_button.label": "Dodaj media", diff --git a/app/javascript/mastodon/locales/hu.json b/app/javascript/mastodon/locales/hu.json index f06e748a8..513f2a22a 100644 --- a/app/javascript/mastodon/locales/hu.json +++ b/app/javascript/mastodon/locales/hu.json @@ -16,6 +16,7 @@ "account.follows.empty": "Ez a felhasználó még senkit sem követ.", "account.follows_you": "Követ téged", "account.hide_reblogs": "@{name} megtolásainak némítása", + "account.last_status": "Last active", "account.link_verified_on": "A linket ellenőriztük: {date}", "account.locked_info": "Ez a fiók zárt. A tulaj engedélyezi, ki követheti őt.", "account.media": "Média", @@ -24,6 +25,7 @@ "account.mute": "@{name} némítása", "account.mute_notifications": "@{name} értesítéseinek némítása", "account.muted": "Némítva", + "account.never_active": "Never", "account.posts": "Tülkölés", "account.posts_with_replies": "Tülkölés válaszokkal", "account.report": "@{name} jelentése", @@ -36,6 +38,8 @@ "account.unfollow": "Követés vége", "account.unmute": "@{name} némítás feloldása", "account.unmute_notifications": "@{name} némított értesítéseinek feloldása", + "alert.rate_limited.message": "Please retry after {retry_time, time, medium}.", + "alert.rate_limited.title": "Rate limited", "alert.unexpected.message": "Váratlan hiba történt.", "alert.unexpected.title": "Hoppá!", "autosuggest_hashtag.per_week": "{count} per week", @@ -49,6 +53,7 @@ "column.blocks": "Letiltott felhasználók", "column.community": "Helyi idővonal", "column.direct": "Közvetlen üzenetek", + "column.directory": "Browse profiles", "column.domain_blocks": "Rejtett domainek", "column.favourites": "Kedvencek", "column.follow_requests": "Követési kérelmek", @@ -95,6 +100,8 @@ "confirmations.delete_list.message": "Biztos, hogy véglegesen törölni szeretnéd ezt a listát?", "confirmations.domain_block.confirm": "Teljes domain elrejtése", "confirmations.domain_block.message": "Egészen biztos, hogy le szeretnéd tiltani a teljes {domain}-t? A legtöbb esetben néhány célzott tiltás vagy némítás elegendő és kívánatosabb megoldás. Semmilyen tartalmat nem fogsz látni ebből a domainből se idővonalakon, se értesítésekben. Az ebben a domainben lévő követőidet is eltávolítjuk.", + "confirmations.logout.confirm": "Log out", + "confirmations.logout.message": "Are you sure you want to log out?", "confirmations.mute.confirm": "Némítás", "confirmations.mute.message": "Biztos, hogy némítani szeretnéd {name}?", "confirmations.redraft.confirm": "Törlés és újraírás", @@ -103,6 +110,10 @@ "confirmations.reply.message": "Ha most válaszolsz, ez felülírja a most szerkesztés alatt álló üzenetet. Mégis ezt szeretnéd?", "confirmations.unfollow.confirm": "Követés visszavonása", "confirmations.unfollow.message": "Biztos, hogy vissza szeretnéd vonni {name} követését?", + "directory.federated": "From known fediverse", + "directory.local": "From {domain} only", + "directory.new_arrivals": "New arrivals", + "directory.recently_active": "Recently active", "embed.instructions": "Ágyazd be ezt a tülköt a weboldaladba az alábbi kód kimásolásával.", "embed.preview": "Így fog kinézni:", "emoji_button.activity": "Aktivitás", @@ -158,7 +169,7 @@ "home.column_settings.basic": "Alapértelmezések", "home.column_settings.show_reblogs": "Megtolások mutatása", "home.column_settings.show_replies": "Válaszok mutatása", - "home.column_settings.update_live": "Frissítés valós időben", + "home.column_settings.update_live": "Update in real-time", "intervals.full.days": "{number, plural, one {# nap} other {# nap}}", "intervals.full.hours": "{number, plural, one {# óra} other {# óra}}", "intervals.full.minutes": "{number, plural, one {# perc} other {# perc}}", @@ -250,7 +261,6 @@ "navigation_bar.personal": "Személyes", "navigation_bar.pins": "Kitűzött tülkök", "navigation_bar.preferences": "Beállítások", - "navigation_bar.profile_directory": "Profilok", "navigation_bar.public_timeline": "Föderációs idővonal", "navigation_bar.security": "Biztonság", "notification.and_n_others": "and {count, plural, one {# other} other {# others}}", @@ -358,6 +368,7 @@ "status.show_more": "Többet", "status.show_more_all": "Többet mindenhol", "status.show_thread": "Szál mutatása", + "status.uncached_media_warning": "Not available", "status.unmute_conversation": "Beszélgetés némításának kikapcsolása", "status.unpin": "Kitűzés eltávolítása a profilodról", "suggestions.dismiss": "Javaslat elvetése", @@ -373,7 +384,7 @@ "time_remaining.moments": "Pillanatok vannak hátra", "time_remaining.seconds": "{number, plural, one {# másodperc} other {# másodperc}} van hátra", "trends.count_by_accounts": "{count} {rawCount, plural, one {résztvevő} other {résztvevő}} beszélget", - "trends.refresh": "Refresh", + "trends.trending_now": "Trending now", "ui.beforeunload": "A piszkozatod el fog veszni, ha elhagyod a Mastodon-t.", "upload_area.title": "Húzd ide a feltöltéshez", "upload_button.label": "Média hozzáadása (JPEG, PNG, GIF, WebM, MP4, MOV)", diff --git a/app/javascript/mastodon/locales/hy.json b/app/javascript/mastodon/locales/hy.json index 47e9ee68b..1c3f1eec0 100644 --- a/app/javascript/mastodon/locales/hy.json +++ b/app/javascript/mastodon/locales/hy.json @@ -16,6 +16,7 @@ "account.follows.empty": "This user doesn't follow anyone yet.", "account.follows_you": "Հետեւում է քեզ", "account.hide_reblogs": "Թաքցնել @{name}֊ի տարածածները", + "account.last_status": "Last active", "account.link_verified_on": "Ownership of this link was checked on {date}", "account.locked_info": "This account privacy status is set to locked. The owner manually reviews who can follow them.", "account.media": "Մեդիա", @@ -24,6 +25,7 @@ "account.mute": "Լռեցնել @{name}֊ին", "account.mute_notifications": "Անջատել ծանուցումները @{name}֊ից", "account.muted": "Muted", + "account.never_active": "Never", "account.posts": "Գրառումներ", "account.posts_with_replies": "Toots with replies", "account.report": "Բողոքել @{name}֊ից", @@ -36,6 +38,8 @@ "account.unfollow": "Չհետեւել", "account.unmute": "Ապալռեցնել @{name}֊ին", "account.unmute_notifications": "Միացնել ծանուցումները @{name}֊ից", + "alert.rate_limited.message": "Please retry after {retry_time, time, medium}.", + "alert.rate_limited.title": "Rate limited", "alert.unexpected.message": "An unexpected error occurred.", "alert.unexpected.title": "Վա՜յ", "autosuggest_hashtag.per_week": "{count} per week", @@ -49,6 +53,7 @@ "column.blocks": "Արգելափակված օգտատերեր", "column.community": "Տեղական հոսք", "column.direct": "Direct messages", + "column.directory": "Browse profiles", "column.domain_blocks": "Hidden domains", "column.favourites": "Հավանածներ", "column.follow_requests": "Հետեւելու հայցեր", @@ -95,6 +100,8 @@ "confirmations.delete_list.message": "Վստա՞հ ես, որ ուզում ես մշտապես ջնջել այս ցանկը։", "confirmations.domain_block.confirm": "Թաքցնել ամբողջ տիրույթը", "confirmations.domain_block.message": "Հաստատ֊հաստա՞տ վստահ ես, որ ուզում ես արգելափակել ամբողջ {domain} տիրույթը։ Սովորաբար մի երկու թիրախավորված արգելափակում կամ լռեցում բավական է ու նախընտրելի։", + "confirmations.logout.confirm": "Log out", + "confirmations.logout.message": "Are you sure you want to log out?", "confirmations.mute.confirm": "Լռեցնել", "confirmations.mute.message": "Վստա՞հ ես, որ ուզում ես {name}֊ին լռեցնել։", "confirmations.redraft.confirm": "Delete & redraft", @@ -103,6 +110,10 @@ "confirmations.reply.message": "Replying now will overwrite the message you are currently composing. Are you sure you want to proceed?", "confirmations.unfollow.confirm": "Ապահետեւել", "confirmations.unfollow.message": "Վստա՞հ ես, որ ուզում ես այլեւս չհետեւել {name}֊ին։", + "directory.federated": "From known fediverse", + "directory.local": "From {domain} only", + "directory.new_arrivals": "New arrivals", + "directory.recently_active": "Recently active", "embed.instructions": "Այս թութը քո կայքում ներդնելու համար կարող ես պատճենել ներքոհիշյալ կոդը։", "embed.preview": "Ահա, թե ինչ տեսք կունենա այն՝", "emoji_button.activity": "Զբաղմունքներ", @@ -250,7 +261,6 @@ "navigation_bar.personal": "Անձնական", "navigation_bar.pins": "Ամրացված թթեր", "navigation_bar.preferences": "Նախապատվություններ", - "navigation_bar.profile_directory": "Profile directory", "navigation_bar.public_timeline": "Դաշնային հոսք", "navigation_bar.security": "Անվտանգություն", "notification.and_n_others": "and {count, plural, one {# other} other {# others}}", @@ -358,6 +368,7 @@ "status.show_more": "Ավելին", "status.show_more_all": "Show more for all", "status.show_thread": "Show thread", + "status.uncached_media_warning": "Not available", "status.unmute_conversation": "Ապալռեցնել խոսակցությունը", "status.unpin": "Հանել անձնական էջից", "suggestions.dismiss": "Dismiss suggestion", @@ -373,7 +384,7 @@ "time_remaining.moments": "Moments remaining", "time_remaining.seconds": "{number, plural, one {# second} other {# seconds}} left", "trends.count_by_accounts": "{count} {rawCount, plural, one {person} other {people}} talking", - "trends.refresh": "Refresh", + "trends.trending_now": "Trending now", "ui.beforeunload": "Քո սեւագիրը կկորի, եթե լքես Մաստոդոնը։", "upload_area.title": "Քաշիր ու նետիր՝ վերբեռնելու համար", "upload_button.label": "Ավելացնել մեդիա", diff --git a/app/javascript/mastodon/locales/id.json b/app/javascript/mastodon/locales/id.json index 0757e8ff3..5e1f318be 100644 --- a/app/javascript/mastodon/locales/id.json +++ b/app/javascript/mastodon/locales/id.json @@ -16,6 +16,7 @@ "account.follows.empty": "Pengguna ini belum mengikuti siapapun.", "account.follows_you": "Mengikuti anda", "account.hide_reblogs": "Sembunyikan boosts dari @{name}", + "account.last_status": "Last active", "account.link_verified_on": "Kepemilikan tautan ini telah dicek pada {date}", "account.locked_info": "Status privasi akun ini disetel untuk dikunci. Pemilik secara manual meninjau siapa yang dapat mengikuti mereka.", "account.media": "Media", @@ -24,6 +25,7 @@ "account.mute": "Bisukan @{name}", "account.mute_notifications": "Sembunyikan notifikasi dari @{name}", "account.muted": "Dibisukan", + "account.never_active": "Never", "account.posts": "Toot", "account.posts_with_replies": "Postingan dengan balasan", "account.report": "Laporkan @{name}", @@ -36,6 +38,8 @@ "account.unfollow": "Berhenti mengikuti", "account.unmute": "Berhenti membisukan @{name}", "account.unmute_notifications": "Munculkan notifikasi dari @{name}", + "alert.rate_limited.message": "Please retry after {retry_time, time, medium}.", + "alert.rate_limited.title": "Rate limited", "alert.unexpected.message": "Terjadi kesalahan yang tidak terduga.", "alert.unexpected.title": "Oops!", "autosuggest_hashtag.per_week": "{count} per week", @@ -49,6 +53,7 @@ "column.blocks": "Pengguna diblokir", "column.community": "Linimasa Lokal", "column.direct": "Pesan langsung", + "column.directory": "Browse profiles", "column.domain_blocks": "Topik tersembunyi", "column.favourites": "Favorit", "column.follow_requests": "Permintaan mengikuti", @@ -95,6 +100,8 @@ "confirmations.delete_list.message": "Apakah anda yakin untuk menghapus daftar ini secara permanen?", "confirmations.domain_block.confirm": "Sembunyikan keseluruhan domain", "confirmations.domain_block.message": "Apakah anda benar benar yakin untuk memblokir keseluruhan {domain}? Dalam kasus tertentu beberapa pemblokiran atau penyembunyian lebih baik.", + "confirmations.logout.confirm": "Log out", + "confirmations.logout.message": "Are you sure you want to log out?", "confirmations.mute.confirm": "Bisukan", "confirmations.mute.message": "Apa anda yakin ingin membisukan {name}?", "confirmations.redraft.confirm": "Hapus dan konsep ulang", @@ -103,6 +110,10 @@ "confirmations.reply.message": "Membalas sekarang akan menimpa pesan yang sedang Anda buat. Anda yakin ingin melanjutkan?", "confirmations.unfollow.confirm": "Berhenti mengikuti", "confirmations.unfollow.message": "Apakah anda ingin berhenti mengikuti {name}?", + "directory.federated": "From known fediverse", + "directory.local": "From {domain} only", + "directory.new_arrivals": "New arrivals", + "directory.recently_active": "Recently active", "embed.instructions": "Sematkan status ini di website anda dengan menyalin kode di bawah ini.", "embed.preview": "Seperti ini nantinya:", "emoji_button.activity": "Aktivitas", @@ -250,7 +261,6 @@ "navigation_bar.personal": "Personal", "navigation_bar.pins": "Pinned toots", "navigation_bar.preferences": "Pengaturan", - "navigation_bar.profile_directory": "Profile directory", "navigation_bar.public_timeline": "Linimasa gabungan", "navigation_bar.security": "Security", "notification.and_n_others": "and {count, plural, one {# other} other {# others}}", @@ -358,6 +368,7 @@ "status.show_more": "Tampilkan semua", "status.show_more_all": "Show more for all", "status.show_thread": "Show thread", + "status.uncached_media_warning": "Not available", "status.unmute_conversation": "Unmute conversation", "status.unpin": "Unpin from profile", "suggestions.dismiss": "Dismiss suggestion", @@ -373,7 +384,7 @@ "time_remaining.moments": "Moments remaining", "time_remaining.seconds": "{number, plural, one {# second} other {# seconds}} left", "trends.count_by_accounts": "{count} {rawCount, plural, one {person} other {people}} talking", - "trends.refresh": "Refresh", + "trends.trending_now": "Trending now", "ui.beforeunload": "Naskah anda akan hilang jika anda keluar dari Mastodon.", "upload_area.title": "Seret & lepaskan untuk mengunggah", "upload_button.label": "Tambahkan media", diff --git a/app/javascript/mastodon/locales/io.json b/app/javascript/mastodon/locales/io.json index ff096f5cf..afbd970ec 100644 --- a/app/javascript/mastodon/locales/io.json +++ b/app/javascript/mastodon/locales/io.json @@ -16,6 +16,7 @@ "account.follows.empty": "This user doesn't follow anyone yet.", "account.follows_you": "Sequas tu", "account.hide_reblogs": "Hide boosts from @{name}", + "account.last_status": "Last active", "account.link_verified_on": "Ownership of this link was checked on {date}", "account.locked_info": "This account privacy status is set to locked. The owner manually reviews who can follow them.", "account.media": "Media", @@ -24,6 +25,7 @@ "account.mute": "Celar @{name}", "account.mute_notifications": "Mute notifications from @{name}", "account.muted": "Muted", + "account.never_active": "Never", "account.posts": "Mesaji", "account.posts_with_replies": "Toots with replies", "account.report": "Denuncar @{name}", @@ -36,6 +38,8 @@ "account.unfollow": "Ne plus sequar", "account.unmute": "Ne plus celar @{name}", "account.unmute_notifications": "Unmute notifications from @{name}", + "alert.rate_limited.message": "Please retry after {retry_time, time, medium}.", + "alert.rate_limited.title": "Rate limited", "alert.unexpected.message": "An unexpected error occurred.", "alert.unexpected.title": "Oops!", "autosuggest_hashtag.per_week": "{count} per week", @@ -49,6 +53,7 @@ "column.blocks": "Blokusita uzeri", "column.community": "Lokala tempolineo", "column.direct": "Direct messages", + "column.directory": "Browse profiles", "column.domain_blocks": "Hidden domains", "column.favourites": "Favorati", "column.follow_requests": "Demandi di sequado", @@ -95,6 +100,8 @@ "confirmations.delete_list.message": "Are you sure you want to permanently delete this list?", "confirmations.domain_block.confirm": "Hide entire domain", "confirmations.domain_block.message": "Are you really, really sure you want to block the entire {domain}? In most cases a few targeted blocks or mutes are sufficient and preferable.", + "confirmations.logout.confirm": "Log out", + "confirmations.logout.message": "Are you sure you want to log out?", "confirmations.mute.confirm": "Mute", "confirmations.mute.message": "Are you sure you want to mute {name}?", "confirmations.redraft.confirm": "Delete & redraft", @@ -103,6 +110,10 @@ "confirmations.reply.message": "Replying now will overwrite the message you are currently composing. Are you sure you want to proceed?", "confirmations.unfollow.confirm": "Unfollow", "confirmations.unfollow.message": "Are you sure you want to unfollow {name}?", + "directory.federated": "From known fediverse", + "directory.local": "From {domain} only", + "directory.new_arrivals": "New arrivals", + "directory.recently_active": "Recently active", "embed.instructions": "Embed this status on your website by copying the code below.", "embed.preview": "Here is what it will look like:", "emoji_button.activity": "Activity", @@ -250,7 +261,6 @@ "navigation_bar.personal": "Personal", "navigation_bar.pins": "Pinned toots", "navigation_bar.preferences": "Preferi", - "navigation_bar.profile_directory": "Profile directory", "navigation_bar.public_timeline": "Federata tempolineo", "navigation_bar.security": "Security", "notification.and_n_others": "and {count, plural, one {# other} other {# others}}", @@ -358,6 +368,7 @@ "status.show_more": "Montrar plue", "status.show_more_all": "Show more for all", "status.show_thread": "Show thread", + "status.uncached_media_warning": "Not available", "status.unmute_conversation": "Unmute conversation", "status.unpin": "Unpin from profile", "suggestions.dismiss": "Dismiss suggestion", @@ -373,7 +384,7 @@ "time_remaining.moments": "Moments remaining", "time_remaining.seconds": "{number, plural, one {# second} other {# seconds}} left", "trends.count_by_accounts": "{count} {rawCount, plural, one {person} other {people}} talking", - "trends.refresh": "Refresh", + "trends.trending_now": "Trending now", "ui.beforeunload": "Your draft will be lost if you leave Mastodon.", "upload_area.title": "Tranar faligar por kargar", "upload_button.label": "Adjuntar kontenajo", diff --git a/app/javascript/mastodon/locales/it.json b/app/javascript/mastodon/locales/it.json index 0e791e13d..caabf6ef3 100644 --- a/app/javascript/mastodon/locales/it.json +++ b/app/javascript/mastodon/locales/it.json @@ -4,7 +4,7 @@ "account.block": "Blocca @{name}", "account.block_domain": "Nascondi tutto da {domain}", "account.blocked": "Bloccato", - "account.cancel_follow_request": "Cancel follow request", + "account.cancel_follow_request": "Annulla richiesta di seguito", "account.direct": "Invia messaggio privato a @{name}", "account.domain_blocked": "Dominio nascosto", "account.edit_profile": "Modifica profilo", @@ -16,6 +16,7 @@ "account.follows.empty": "Questo utente non segue ancora nessuno.", "account.follows_you": "Ti segue", "account.hide_reblogs": "Nascondi condivisioni da @{name}", + "account.last_status": "Last active", "account.link_verified_on": "La proprietà di questo link è stata controllata il {date}", "account.locked_info": "Il livello di privacy di questo account è impostato a \"bloccato\". Il proprietario esamina manualmente le richieste di seguirlo.", "account.media": "Media", @@ -24,6 +25,7 @@ "account.mute": "Silenzia @{name}", "account.mute_notifications": "Silenzia notifiche da @{name}", "account.muted": "Silenziato", + "account.never_active": "Never", "account.posts": "Toot", "account.posts_with_replies": "Toot e risposte", "account.report": "Segnala @{name}", @@ -36,6 +38,8 @@ "account.unfollow": "Non seguire", "account.unmute": "Non silenziare @{name}", "account.unmute_notifications": "Non silenziare più le notifiche da @{name}", + "alert.rate_limited.message": "Please retry after {retry_time, time, medium}.", + "alert.rate_limited.title": "Rate limited", "alert.unexpected.message": "Si è verificato un errore inatteso.", "alert.unexpected.title": "Oops!", "autosuggest_hashtag.per_week": "{count} per settimana", @@ -49,6 +53,7 @@ "column.blocks": "Utenti bloccati", "column.community": "Timeline locale", "column.direct": "Messaggi diretti", + "column.directory": "Browse profiles", "column.domain_blocks": "Domini nascosti", "column.favourites": "Apprezzati", "column.follow_requests": "Richieste di amicizia", @@ -95,6 +100,8 @@ "confirmations.delete_list.message": "Sei sicuro di voler cancellare definitivamente questa lista?", "confirmations.domain_block.confirm": "Nascondi intero dominio", "confirmations.domain_block.message": "Sei davvero sicuro che vuoi bloccare l'intero {domain}? Nella maggior parte dei casi, pochi blocchi o silenziamenti mirati sono sufficienti e preferibili. Non vedrai nessun contenuto di quel dominio né nelle timeline pubbliche né nelle notifiche. I tuoi seguaci di quel dominio saranno eliminati.", + "confirmations.logout.confirm": "Log out", + "confirmations.logout.message": "Are you sure you want to log out?", "confirmations.mute.confirm": "Silenzia", "confirmations.mute.message": "Sei sicuro di voler silenziare {name}?", "confirmations.redraft.confirm": "Cancella e riscrivi", @@ -103,6 +110,10 @@ "confirmations.reply.message": "Se rispondi ora, il messaggio che stai componendo sarà sovrascritto. Sei sicuro di voler continuare?", "confirmations.unfollow.confirm": "Smetti di seguire", "confirmations.unfollow.message": "Sei sicuro che non vuoi più seguire {name}?", + "directory.federated": "From known fediverse", + "directory.local": "From {domain} only", + "directory.new_arrivals": "New arrivals", + "directory.recently_active": "Recently active", "embed.instructions": "Inserisci questo status nel tuo sito copiando il codice qui sotto.", "embed.preview": "Ecco come apparirà:", "emoji_button.activity": "Attività", @@ -158,7 +169,7 @@ "home.column_settings.basic": "Semplice", "home.column_settings.show_reblogs": "Mostra post condivisi", "home.column_settings.show_replies": "Mostra risposte", - "home.column_settings.update_live": "Aggiornama in tempo reale", + "home.column_settings.update_live": "Update in real-time", "intervals.full.days": "{number, plural, one {# giorno} other {# giorni}}", "intervals.full.hours": "{number, plural, one {# ora} other {# ore}}", "intervals.full.minutes": "{number, plural, one {# minuto} other {# minuti}}", @@ -250,7 +261,6 @@ "navigation_bar.personal": "Personale", "navigation_bar.pins": "Toot fissati in cima", "navigation_bar.preferences": "Impostazioni", - "navigation_bar.profile_directory": "Directory dei profili", "navigation_bar.public_timeline": "Timeline federata", "navigation_bar.security": "Sicurezza", "notification.and_n_others": "and {count, plural, one {# other} other {# others}}", @@ -358,6 +368,7 @@ "status.show_more": "Mostra di più", "status.show_more_all": "Mostra di più per tutti", "status.show_thread": "Mostra thread", + "status.uncached_media_warning": "Not available", "status.unmute_conversation": "Annulla silenzia conversazione", "status.unpin": "Non fissare in cima al profilo", "suggestions.dismiss": "Elimina suggerimento", @@ -373,22 +384,22 @@ "time_remaining.moments": "Restano pochi istanti", "time_remaining.seconds": "{number, plural, one {# secondo} other {# secondi}} left", "trends.count_by_accounts": "{count} {rawCount, plural, one {persona ne sta} other {persone ne stanno}} parlando", - "trends.refresh": "Aggiorna", + "trends.trending_now": "Di tendenza ora", "ui.beforeunload": "La bozza andrà persa se esci da Mastodon.", "upload_area.title": "Trascina per caricare", "upload_button.label": "Aggiungi file multimediale", "upload_error.limit": "Limite al caricamento di file superato.", "upload_error.poll": "Caricamento file non consentito nei sondaggi.", "upload_form.description": "Descrizione per utenti con disabilità visive", - "upload_form.edit": "Edit", + "upload_form.edit": "Modifica", "upload_form.undo": "Cancella", - "upload_modal.analyzing_picture": "Analyzing picture…", + "upload_modal.analyzing_picture": "Analisi immagine…", "upload_modal.apply": "Apply", - "upload_modal.description_placeholder": "A quick brown fox jumps over the lazy dog", - "upload_modal.detect_text": "Detect text from picture", - "upload_modal.edit_media": "Edit media", + "upload_modal.description_placeholder": "Ma la volpe col suo balzo ha raggiunto il quieto Fido", + "upload_modal.detect_text": "Rileva testo dall'immagine", + "upload_modal.edit_media": "Modifica media", "upload_modal.hint": "Clicca o trascina il cerchio sull'anteprima per scegliere il punto focale che sarà sempre visualizzato su tutte le miniature.", - "upload_modal.preview_label": "Preview ({ratio})", + "upload_modal.preview_label": "Anteprima ({ratio})", "upload_progress.label": "Sto caricando...", "video.close": "Chiudi video", "video.exit_fullscreen": "Esci da modalità a schermo intero", diff --git a/app/javascript/mastodon/locales/ja.json b/app/javascript/mastodon/locales/ja.json index 352a00c1e..1960dafba 100644 --- a/app/javascript/mastodon/locales/ja.json +++ b/app/javascript/mastodon/locales/ja.json @@ -16,6 +16,7 @@ "account.follows.empty": "まだ誰もフォローしていません。", "account.follows_you": "フォローされています", "account.hide_reblogs": "@{name}さんからのブーストを非表示", + "account.last_status": "最後の活動", "account.link_verified_on": "このリンクの所有権は{date}に確認されました", "account.locked_info": "このアカウントは承認制アカウントです。相手が承認するまでフォローは完了しません。", "account.media": "メディア", @@ -24,6 +25,7 @@ "account.mute": "@{name}さんをミュート", "account.mute_notifications": "@{name}さんからの通知を受け取らない", "account.muted": "ミュート済み", + "account.never_active": "活動なし", "account.posts": "投稿", "account.posts_with_replies": "投稿と返信", "account.report": "@{name}さんを通報", @@ -36,6 +38,8 @@ "account.unfollow": "フォロー解除", "account.unmute": "@{name}さんのミュートを解除", "account.unmute_notifications": "@{name}さんからの通知を受け取るようにする", + "alert.rate_limited.message": "{retry_time, time, medium} 後に再試行してください。", + "alert.rate_limited.title": "制限に達しました", "alert.unexpected.message": "不明なエラーが発生しました。", "alert.unexpected.title": "エラー!", "autosuggest_hashtag.per_week": "{count} 回 / 週", @@ -49,6 +53,7 @@ "column.blocks": "ブロックしたユーザー", "column.community": "ローカルタイムライン", "column.direct": "ダイレクトメッセージ", + "column.directory": "Browse profiles", "column.domain_blocks": "非表示にしたドメイン", "column.favourites": "お気に入り", "column.follow_requests": "フォローリクエスト", @@ -95,6 +100,8 @@ "confirmations.delete_list.message": "本当にこのリストを完全に削除しますか?", "confirmations.domain_block.confirm": "ドメイン全体を非表示", "confirmations.domain_block.message": "本当に{domain}全体を非表示にしますか? 多くの場合は個別にブロックやミュートするだけで充分であり、また好ましいです。公開タイムラインにそのドメインのコンテンツが表示されなくなり、通知も届かなくなります。そのドメインのフォロワーはアンフォローされます。", + "confirmations.logout.confirm": "ログアウト", + "confirmations.logout.message": "本当にログアウトしますか?", "confirmations.mute.confirm": "ミュート", "confirmations.mute.message": "本当に{name}さんをミュートしますか?", "confirmations.redraft.confirm": "削除して下書きに戻す", @@ -103,6 +110,10 @@ "confirmations.reply.message": "今返信すると現在作成中のメッセージが上書きされます。本当に実行しますか?", "confirmations.unfollow.confirm": "フォロー解除", "confirmations.unfollow.message": "本当に{name}さんのフォローを解除しますか?", + "directory.federated": "既知の連合全体", + "directory.local": "{domain} のみ", + "directory.new_arrivals": "新着順", + "directory.recently_active": "最近の活動順", "embed.instructions": "下記のコードをコピーしてウェブサイトに埋め込みます。", "embed.preview": "表示例:", "emoji_button.activity": "活動", @@ -158,7 +169,7 @@ "home.column_settings.basic": "基本設定", "home.column_settings.show_reblogs": "ブースト表示", "home.column_settings.show_replies": "返信表示", - "home.column_settings.update_live": "リアルタイムで更新", + "home.column_settings.update_live": "Update in real-time", "intervals.full.days": "{number}日", "intervals.full.hours": "{number}時間", "intervals.full.minutes": "{number}分", @@ -250,7 +261,6 @@ "navigation_bar.personal": "個人用", "navigation_bar.pins": "固定したトゥート", "navigation_bar.preferences": "ユーザー設定", - "navigation_bar.profile_directory": "ディレクトリ", "navigation_bar.public_timeline": "連合タイムライン", "navigation_bar.security": "セキュリティ", "notification.and_n_others": "and {count, plural, one {# other} other {# others}}", @@ -358,6 +368,7 @@ "status.show_more": "もっと見る", "status.show_more_all": "全て見る", "status.show_thread": "スレッドを表示", + "status.uncached_media_warning": "利用できません", "status.unmute_conversation": "会話のミュートを解除", "status.unpin": "プロフィールへの固定を解除", "suggestions.dismiss": "隠す", @@ -373,7 +384,7 @@ "time_remaining.moments": "まもなく終了", "time_remaining.seconds": "残り{number}秒", "trends.count_by_accounts": "{count}人がトゥート", - "trends.refresh": "更新", + "trends.trending_now": "トレンドタグ", "ui.beforeunload": "Mastodonから離れると送信前の投稿は失われます。", "upload_area.title": "ドラッグ&ドロップでアップロード", "upload_button.label": "メディアを追加 ({formats})", @@ -384,7 +395,7 @@ "upload_form.undo": "削除", "upload_modal.analyzing_picture": "画像を解析中…", "upload_modal.apply": "適用", - "upload_modal.description_placeholder": "A quick brown fox jumps over the lazy dog", + "upload_modal.description_placeholder": "素早い茶色の狐はのろまな犬を飛び越える", "upload_modal.detect_text": "画像からテキストを検出", "upload_modal.edit_media": "メディアを編集", "upload_modal.hint": "画像をクリックするか円をドラッグすると全てのサムネイルで注目する場所を選ぶことができます", diff --git a/app/javascript/mastodon/locales/ka.json b/app/javascript/mastodon/locales/ka.json index fecfb519c..d3018c0bf 100644 --- a/app/javascript/mastodon/locales/ka.json +++ b/app/javascript/mastodon/locales/ka.json @@ -16,6 +16,7 @@ "account.follows.empty": "This user doesn't follow anyone yet.", "account.follows_you": "მოგყვებათ", "account.hide_reblogs": "დაიმალოს ბუსტები @{name}-სგან", + "account.last_status": "Last active", "account.link_verified_on": "Ownership of this link was checked on {date}", "account.locked_info": "This account privacy status is set to locked. The owner manually reviews who can follow them.", "account.media": "მედია", @@ -24,6 +25,7 @@ "account.mute": "გააჩუმე @{name}", "account.mute_notifications": "გააჩუმე შეტყობინებები @{name}-სგან", "account.muted": "გაჩუმებული", + "account.never_active": "Never", "account.posts": "ტუტები", "account.posts_with_replies": "ტუტები და პასუხები", "account.report": "დაარეპორტე @{name}", @@ -36,6 +38,8 @@ "account.unfollow": "ნუღარ მიჰყვები", "account.unmute": "ნუღარ აჩუმებ @{name}-ს", "account.unmute_notifications": "ნუღარ აჩუმებ შეტყობინებებს @{name}-სგან", + "alert.rate_limited.message": "Please retry after {retry_time, time, medium}.", + "alert.rate_limited.title": "Rate limited", "alert.unexpected.message": "წარმოიშვა მოულოდნელი შეცდომა.", "alert.unexpected.title": "უპს!", "autosuggest_hashtag.per_week": "{count} per week", @@ -49,6 +53,7 @@ "column.blocks": "დაბლოკილი მომხმარებლები", "column.community": "ლოკალური თაიმლაინი", "column.direct": "პირდაპირი წერილები", + "column.directory": "Browse profiles", "column.domain_blocks": "დამალული დომენები", "column.favourites": "ფავორიტები", "column.follow_requests": "დადევნების მოთხოვნები", @@ -95,6 +100,8 @@ "confirmations.delete_list.message": "დარწმუნებული ხართ, გსურთ სამუდამოდ გააუქმოთ ეს სია?", "confirmations.domain_block.confirm": "მთელი დომენის დამალვა", "confirmations.domain_block.message": "ნაღდად, ნაღდად, დარწმუნებული ხართ, გსურთ დაბლოკოთ მთელი {domain}? უმეტეს შემთხვევაში რამდენიმე გამიზნული ბლოკი ან გაჩუმება საკმარისი და უკეთესია. კონტენტს ამ დომენიდან ვერ იხილავთ ვერც ერთ ღია თაიმლაინზე ან თქვენს შეტყობინებებში. ამ დომენიდან არსებული მიმდევრები ამოიშლება.", + "confirmations.logout.confirm": "Log out", + "confirmations.logout.message": "Are you sure you want to log out?", "confirmations.mute.confirm": "გაჩუმება", "confirmations.mute.message": "დარწმუნებული ხართ, გსურთ გააჩუმოთ {name}?", "confirmations.redraft.confirm": "გაუქმება და გადანაწილება", @@ -103,6 +110,10 @@ "confirmations.reply.message": "Replying now will overwrite the message you are currently composing. Are you sure you want to proceed?", "confirmations.unfollow.confirm": "ნუღარ მიჰყვები", "confirmations.unfollow.message": "დარწმუნებული ხართ, აღარ გსურთ მიჰყვებოდეთ {name}-ს?", + "directory.federated": "From known fediverse", + "directory.local": "From {domain} only", + "directory.new_arrivals": "New arrivals", + "directory.recently_active": "Recently active", "embed.instructions": "ეს სტატუსი ჩასვით თქვენს ვებ-საიტზე შემდეგი კოდის კოპირებით.", "embed.preview": "ესაა თუ როგორც გამოჩნდება:", "emoji_button.activity": "აქტივობა", @@ -250,7 +261,6 @@ "navigation_bar.personal": "პირადი", "navigation_bar.pins": "აპინული ტუტები", "navigation_bar.preferences": "პრეფერენსიები", - "navigation_bar.profile_directory": "Profile directory", "navigation_bar.public_timeline": "ფედერალური თაიმლაინი", "navigation_bar.security": "უსაფრთხოება", "notification.and_n_others": "and {count, plural, one {# other} other {# others}}", @@ -358,6 +368,7 @@ "status.show_more": "აჩვენე მეტი", "status.show_more_all": "აჩვენე მეტი ყველაზე", "status.show_thread": "Show thread", + "status.uncached_media_warning": "Not available", "status.unmute_conversation": "საუბარზე გაჩუმების მოშორება", "status.unpin": "პროფილიდან პინის მოშორება", "suggestions.dismiss": "Dismiss suggestion", @@ -373,7 +384,7 @@ "time_remaining.moments": "Moments remaining", "time_remaining.seconds": "{number, plural, one {# second} other {# seconds}} left", "trends.count_by_accounts": "{count} {rawCount, plural, one {person} other {people}} საუბრობს", - "trends.refresh": "Refresh", + "trends.trending_now": "Trending now", "ui.beforeunload": "თქვენი დრაფტი გაუქმდება თუ დატოვებთ მასტოდონს.", "upload_area.title": "გადმოწიეთ და ჩააგდეთ ასატვირთათ", "upload_button.label": "მედიის დამატება", diff --git a/app/javascript/mastodon/locales/kk.json b/app/javascript/mastodon/locales/kk.json index 8710ae90b..5d671d907 100644 --- a/app/javascript/mastodon/locales/kk.json +++ b/app/javascript/mastodon/locales/kk.json @@ -16,6 +16,7 @@ "account.follows.empty": "Ешкімге жазылмапты.", "account.follows_you": "Сізге жазылыпты", "account.hide_reblogs": "@{name} атты қолданушының әрекеттерін жасыру", + "account.last_status": "Last active", "account.link_verified_on": "Сілтеме меншігі расталған күн {date}", "account.locked_info": "Бұл қолданушы өзі туралы мәліметтерді жасырған. Тек жазылғандар ғана көре алады.", "account.media": "Медиа", @@ -24,6 +25,7 @@ "account.mute": "Үнсіз қылу @{name}", "account.mute_notifications": "@{name} туралы ескертпелерді жасыру", "account.muted": "Үнсіз", + "account.never_active": "Never", "account.posts": "Жазбалар", "account.posts_with_replies": "Жазбалар мен жауаптар", "account.report": "Шағымдану @{name}", @@ -36,6 +38,8 @@ "account.unfollow": "Оқымау", "account.unmute": "@{name} ескертпелерін қосу", "account.unmute_notifications": "@{name} ескертпелерін көрсету", + "alert.rate_limited.message": "Please retry after {retry_time, time, medium}.", + "alert.rate_limited.title": "Rate limited", "alert.unexpected.message": "Бір нәрсе дұрыс болмады.", "alert.unexpected.title": "Өй!", "autosuggest_hashtag.per_week": "{count} per week", @@ -49,6 +53,7 @@ "column.blocks": "Бұғатталғандар", "column.community": "Жергілікті желі", "column.direct": "Жеке хаттар", + "column.directory": "Browse profiles", "column.domain_blocks": "Жасырылған домендер", "column.favourites": "Таңдаулылар", "column.follow_requests": "Жазылу сұранымдары", @@ -95,6 +100,8 @@ "confirmations.delete_list.message": "Бұл тізімді жоясыз ба шынымен?", "confirmations.domain_block.confirm": "Бұл доменді бұғатта", "confirmations.domain_block.message": "Бұл домендегі {domain} жазбаларды шынымен бұғаттайсыз ба? Кейде үнсіз қылып тастау да жеткілікті.", + "confirmations.logout.confirm": "Log out", + "confirmations.logout.message": "Are you sure you want to log out?", "confirmations.mute.confirm": "Үнсіз қылу", "confirmations.mute.message": "{name} атты қолданушы үнсіз болсын ба?", "confirmations.redraft.confirm": "Өшіруді құптау", @@ -103,6 +110,10 @@ "confirmations.reply.message": "Жауабыңыз жазып жатқан жазбаңыздың үстіне кетеді. Жалғастырамыз ба?", "confirmations.unfollow.confirm": "Оқымау", "confirmations.unfollow.message": "\"{name} атты қолданушыға енді жазылғыңыз келмей ме?", + "directory.federated": "From known fediverse", + "directory.local": "From {domain} only", + "directory.new_arrivals": "New arrivals", + "directory.recently_active": "Recently active", "embed.instructions": "Төмендегі кодты көшіріп алу арқылы жазбаны басқа сайттарға да орналастыра аласыз.", "embed.preview": "Былай көрінетін болады:", "emoji_button.activity": "Белсенділік", @@ -250,7 +261,6 @@ "navigation_bar.personal": "Жеке", "navigation_bar.pins": "Жабыстырылғандар", "navigation_bar.preferences": "Басымдықтар", - "navigation_bar.profile_directory": "Profile directory", "navigation_bar.public_timeline": "Жаһандық желі", "navigation_bar.security": "Қауіпсіздік", "notification.and_n_others": "and {count, plural, one {# other} other {# others}}", @@ -358,6 +368,7 @@ "status.show_more": "Толығырақ", "status.show_more_all": "Бәрін толығымен", "status.show_thread": "Желіні көрсет", + "status.uncached_media_warning": "Not available", "status.unmute_conversation": "Пікірталасты үнсіз қылмау", "status.unpin": "Профильден алып тастау", "suggestions.dismiss": "Өткізіп жіберу", @@ -373,7 +384,7 @@ "time_remaining.moments": "Қалған уақыт", "time_remaining.seconds": "{number, plural, one {# секунд} other {# секунд}}", "trends.count_by_accounts": "{count} {rawCount, plural, one {person} other {people}} жазған екен", - "trends.refresh": "Refresh", + "trends.trending_now": "Trending now", "ui.beforeunload": "Mastodon желісінен шықсаңыз, нобайыңыз сақталмайды.", "upload_area.title": "Жүктеу үшін сүйреп әкеліңіз", "upload_button.label": "Медиа қосу (JPEG, PNG, GIF, WebM, MP4, MOV)", diff --git a/app/javascript/mastodon/locales/ko.json b/app/javascript/mastodon/locales/ko.json index ac6a3ca91..50f7ca543 100644 --- a/app/javascript/mastodon/locales/ko.json +++ b/app/javascript/mastodon/locales/ko.json @@ -16,6 +16,7 @@ "account.follows.empty": "이 유저는 아직 아무도 팔로우 하고 있지 않습니다.", "account.follows_you": "날 팔로우합니다", "account.hide_reblogs": "@{name}의 부스트를 숨기기", + "account.last_status": "마지막 활동", "account.link_verified_on": "{date}에 이 링크의 소유권이 확인 됨", "account.locked_info": "이 계정의 프라이버시 설정은 잠금으로 설정되어 있습니다. 계정 소유자가 수동으로 팔로어를 승인합니다.", "account.media": "미디어", @@ -24,6 +25,7 @@ "account.mute": "@{name} 뮤트", "account.mute_notifications": "@{name}의 알림을 뮤트", "account.muted": "뮤트 됨", + "account.never_active": "없음", "account.posts": "툿", "account.posts_with_replies": "툿과 답장", "account.report": "@{name} 신고", @@ -36,6 +38,8 @@ "account.unfollow": "팔로우 해제", "account.unmute": "뮤트 해제", "account.unmute_notifications": "@{name}의 알림 뮤트 해제", + "alert.rate_limited.message": "{retry_time, time, medium}에 다시 시도해 주세요.", + "alert.rate_limited.title": "빈도 제한", "alert.unexpected.message": "예측하지 못한 에러가 발생했습니다.", "alert.unexpected.title": "앗!", "autosuggest_hashtag.per_week": "주간 {count}회", @@ -49,6 +53,7 @@ "column.blocks": "차단 중인 사용자", "column.community": "로컬 타임라인", "column.direct": "다이렉트 메시지", + "column.directory": "프로필 둘러보기", "column.domain_blocks": "숨겨진 도메인", "column.favourites": "즐겨찾기", "column.follow_requests": "팔로우 요청", @@ -95,6 +100,8 @@ "confirmations.delete_list.message": "정말로 이 리스트를 삭제하시겠습니까?", "confirmations.domain_block.confirm": "도메인 전체를 숨김", "confirmations.domain_block.message": "정말로 {domain} 전체를 숨기시겠습니까? 대부분의 경우 개별 차단이나 뮤트로 충분합니다. 모든 공개 타임라인과 알림에서 해당 도메인에서 작성된 컨텐츠를 보지 못합니다. 해당 도메인 팔로워와의 관계가 사라집니다.", + "confirmations.logout.confirm": "로그아웃", + "confirmations.logout.message": "정말로 로그아웃 하시겠습니까?", "confirmations.mute.confirm": "뮤트", "confirmations.mute.message": "정말로 {name}를 뮤트하시겠습니까?", "confirmations.redraft.confirm": "삭제하고 다시 쓰기", @@ -103,6 +110,10 @@ "confirmations.reply.message": "답글을 달기 위해 현재 작성 중인 메시지가 덮어 씌워집니다. 진행하시겠습니까?", "confirmations.unfollow.confirm": "언팔로우", "confirmations.unfollow.message": "정말로 {name}를 언팔로우하시겠습니까?", + "directory.federated": "알려진 연합우주로부터", + "directory.local": "{domain}에서만", + "directory.new_arrivals": "새로운 사람들", + "directory.recently_active": "최근 활동", "embed.instructions": "아래의 코드를 복사하여 대화를 원하는 곳으로 공유하세요.", "embed.preview": "다음과 같이 표시됩니다:", "emoji_button.activity": "활동", @@ -158,7 +169,7 @@ "home.column_settings.basic": "기본 설정", "home.column_settings.show_reblogs": "부스트 표시", "home.column_settings.show_replies": "답글 표시", - "home.column_settings.update_live": "실시간 업데이트", + "home.column_settings.update_live": "Update in real-time", "intervals.full.days": "{number} 일", "intervals.full.hours": "{number} 시간", "intervals.full.minutes": "{number} 분", @@ -250,10 +261,9 @@ "navigation_bar.personal": "개인용", "navigation_bar.pins": "고정된 툿", "navigation_bar.preferences": "사용자 설정", - "navigation_bar.profile_directory": "프로필 디렉토리", "navigation_bar.public_timeline": "연합 타임라인", "navigation_bar.security": "보안", - "notification.and_n_others": "그리고 {count}개의 기타 항목", + "notification.and_n_others": "and {count, plural, one {# other} other {# others}}", "notification.favourite": "{name}님이 즐겨찾기 했습니다", "notification.follow": "{name}님이 나를 팔로우 했습니다", "notification.mention": "{name}님이 답글을 보냈습니다", @@ -358,6 +368,7 @@ "status.show_more": "더 보기", "status.show_more_all": "모두 펼치기", "status.show_thread": "글타래 보기", + "status.uncached_media_warning": "사용할 수 없음", "status.unmute_conversation": "이 대화의 뮤트 해제하기", "status.unpin": "고정 해제", "suggestions.dismiss": "추천 지우기", @@ -373,7 +384,7 @@ "time_remaining.moments": "남은 시간", "time_remaining.seconds": "{number} 초 남음", "trends.count_by_accounts": "{count} 명의 사람들이 말하고 있습니다", - "trends.refresh": "새로고침", + "trends.trending_now": "지금 유행중", "ui.beforeunload": "지금 나가면 저장되지 않은 항목을 잃게 됩니다.", "upload_area.title": "드래그 & 드롭으로 업로드", "upload_button.label": "미디어 추가 (JPEG, PNG, GIF, WebM, MP4, MOV)", diff --git a/app/javascript/mastodon/locales/lt.json b/app/javascript/mastodon/locales/lt.json index b844e2898..7d0776dff 100644 --- a/app/javascript/mastodon/locales/lt.json +++ b/app/javascript/mastodon/locales/lt.json @@ -16,6 +16,7 @@ "account.follows.empty": "This user doesn't follow anyone yet.", "account.follows_you": "Follows you", "account.hide_reblogs": "Hide boosts from @{name}", + "account.last_status": "Last active", "account.link_verified_on": "Ownership of this link was checked on {date}", "account.locked_info": "This account privacy status is set to locked. The owner manually reviews who can follow them.", "account.media": "Media", @@ -24,10 +25,11 @@ "account.mute": "Mute @{name}", "account.mute_notifications": "Mute notifications from @{name}", "account.muted": "Muted", + "account.never_active": "Never", "account.posts": "Toots", "account.posts_with_replies": "Toots and replies", "account.report": "Report @{name}", - "account.requested": "Awaiting approval. Click to cancel follow request", + "account.requested": "Awaiting approval", "account.share": "Share @{name}'s profile", "account.show_reblogs": "Show boosts from @{name}", "account.unblock": "Unblock @{name}", @@ -36,6 +38,8 @@ "account.unfollow": "Unfollow", "account.unmute": "Unmute @{name}", "account.unmute_notifications": "Unmute notifications from @{name}", + "alert.rate_limited.message": "Please retry after {retry_time, time, medium}.", + "alert.rate_limited.title": "Rate limited", "alert.unexpected.message": "An unexpected error occurred.", "alert.unexpected.title": "Oops!", "autosuggest_hashtag.per_week": "{count} per week", @@ -49,6 +53,7 @@ "column.blocks": "Blocked users", "column.community": "Local timeline", "column.direct": "Direct messages", + "column.directory": "Browse profiles", "column.domain_blocks": "Hidden domains", "column.favourites": "Favourites", "column.follow_requests": "Follow requests", @@ -95,6 +100,8 @@ "confirmations.delete_list.message": "Are you sure you want to permanently delete this list?", "confirmations.domain_block.confirm": "Hide entire domain", "confirmations.domain_block.message": "Are you really, really sure you want to block the entire {domain}? In most cases a few targeted blocks or mutes are sufficient and preferable. You will not see content from that domain in any public timelines or your notifications. Your followers from that domain will be removed.", + "confirmations.logout.confirm": "Log out", + "confirmations.logout.message": "Are you sure you want to log out?", "confirmations.mute.confirm": "Mute", "confirmations.mute.message": "Are you sure you want to mute {name}?", "confirmations.redraft.confirm": "Delete & redraft", @@ -103,6 +110,10 @@ "confirmations.reply.message": "Replying now will overwrite the message you are currently composing. Are you sure you want to proceed?", "confirmations.unfollow.confirm": "Unfollow", "confirmations.unfollow.message": "Are you sure you want to unfollow {name}?", + "directory.federated": "From known fediverse", + "directory.local": "From {domain} only", + "directory.new_arrivals": "New arrivals", + "directory.recently_active": "Recently active", "embed.instructions": "Embed this status on your website by copying the code below.", "embed.preview": "Here is what it will look like:", "emoji_button.activity": "Activity", @@ -250,7 +261,6 @@ "navigation_bar.personal": "Personal", "navigation_bar.pins": "Pinned toots", "navigation_bar.preferences": "Preferences", - "navigation_bar.profile_directory": "Profile directory", "navigation_bar.public_timeline": "Federated timeline", "navigation_bar.security": "Security", "notification.and_n_others": "and {count, plural, one {# other} other {# others}}", @@ -358,6 +368,7 @@ "status.show_more": "Show more", "status.show_more_all": "Show more for all", "status.show_thread": "Show thread", + "status.uncached_media_warning": "Not available", "status.unmute_conversation": "Unmute conversation", "status.unpin": "Unpin from profile", "suggestions.dismiss": "Dismiss suggestion", @@ -373,7 +384,7 @@ "time_remaining.moments": "Moments remaining", "time_remaining.seconds": "{number, plural, one {# second} other {# seconds}} left", "trends.count_by_accounts": "{count} {rawCount, plural, one {person} other {people}} talking", - "trends.refresh": "Refresh", + "trends.trending_now": "Trending now", "ui.beforeunload": "Your draft will be lost if you leave Mastodon.", "upload_area.title": "Drag & drop to upload", "upload_button.label": "Add media ({formats})", diff --git a/app/javascript/mastodon/locales/lv.json b/app/javascript/mastodon/locales/lv.json index b4e45a854..d9b125695 100644 --- a/app/javascript/mastodon/locales/lv.json +++ b/app/javascript/mastodon/locales/lv.json @@ -16,6 +16,7 @@ "account.follows.empty": "Šis lietotājs pagaidām nevienam neseko.", "account.follows_you": "Seko tev", "account.hide_reblogs": "Paslēpt paceltos ierakstus no lietotāja @{name}", + "account.last_status": "Last active", "account.link_verified_on": "Šīs saites piederība ir pārbaudīta {date}", "account.locked_info": "Šī konta privātuma status ir iestatīts slēgts. Īpašnieks izskatīs un izvēlēsies kas viņam drīkst sekot.", "account.media": "Mēdiji", @@ -24,6 +25,7 @@ "account.mute": "Apklusināt @{name}", "account.mute_notifications": "Nerādīt paziņojumus no @{name}", "account.muted": "Apklusināts", + "account.never_active": "Never", "account.posts": "Ieraksti", "account.posts_with_replies": "Ieraksti un atbildes", "account.report": "Ziņot par lietotāju @{name}", @@ -36,6 +38,8 @@ "account.unfollow": "Nesekot", "account.unmute": "Noņemt apklusinājumu no lietotāja @{name}", "account.unmute_notifications": "Rādīt paziņojumus no lietotāja @{name}", + "alert.rate_limited.message": "Please retry after {retry_time, time, medium}.", + "alert.rate_limited.title": "Rate limited", "alert.unexpected.message": "Negaidīta kļūda.", "alert.unexpected.title": "Ups!", "autosuggest_hashtag.per_week": "{count} per week", @@ -49,6 +53,7 @@ "column.blocks": "Bloķētie lietotāji", "column.community": "Lokālā laika līnija", "column.direct": "Privātās ziņas", + "column.directory": "Browse profiles", "column.domain_blocks": "Paslēptie domēni", "column.favourites": "Favorīti", "column.follow_requests": "Sekotāju pieprasījumi", @@ -95,6 +100,8 @@ "confirmations.delete_list.message": "Vai tiešam vēlies neatgriezeniski dzēst šo sarakstu?", "confirmations.domain_block.confirm": "Paslēpt visu domēnu", "confirmations.domain_block.message": "Vai tu tiešām, tiešam vēlies bloķēt visu domēnu {domain}? Lielākajā daļā gadījumu pietiek ja nobloķē vai apklusini kādu. Tu neredzēsi saturu vai paziņojumus no šī domēna nevienā laika līnijā. Tavi sekotāji no šī domēna tiks noņemti.", + "confirmations.logout.confirm": "Log out", + "confirmations.logout.message": "Are you sure you want to log out?", "confirmations.mute.confirm": "Apklusināt", "confirmations.mute.message": "Vai Tu tiešām velies apklusināt {name}?", "confirmations.redraft.confirm": "Dzēst un pārrakstīt", @@ -103,6 +110,10 @@ "confirmations.reply.message": "Atbildot tagad tava ziņa ko šobrīd raksti tiks pārrakstīta. Vai tiešām vēlies turpināt?", "confirmations.unfollow.confirm": "Nesekot", "confirmations.unfollow.message": "Vai tiešam vairs nevēlies sekot lietotājam {name}?", + "directory.federated": "From known fediverse", + "directory.local": "From {domain} only", + "directory.new_arrivals": "New arrivals", + "directory.recently_active": "Recently active", "embed.instructions": "Iegul šo ziņojumu savā mājaslapā kopējot kodu zemāk.", "embed.preview": "Tas izskatīsies šādi:", "emoji_button.activity": "Aktivitāte", @@ -250,7 +261,6 @@ "navigation_bar.personal": "Personal", "navigation_bar.pins": "Pinned toots", "navigation_bar.preferences": "Preferences", - "navigation_bar.profile_directory": "Profile directory", "navigation_bar.public_timeline": "Federated timeline", "navigation_bar.security": "Security", "notification.and_n_others": "and {count, plural, one {# other} other {# others}}", @@ -358,6 +368,7 @@ "status.show_more": "Show more", "status.show_more_all": "Show more for all", "status.show_thread": "Show thread", + "status.uncached_media_warning": "Not available", "status.unmute_conversation": "Unmute conversation", "status.unpin": "Unpin from profile", "suggestions.dismiss": "Dismiss suggestion", @@ -373,7 +384,7 @@ "time_remaining.moments": "Moments remaining", "time_remaining.seconds": "{number, plural, one {# second} other {# seconds}} left", "trends.count_by_accounts": "{count} {rawCount, plural, one {person} other {people}} talking", - "trends.refresh": "Refresh", + "trends.trending_now": "Trending now", "ui.beforeunload": "Your draft will be lost if you leave Mastodon.", "upload_area.title": "Drag & drop to upload", "upload_button.label": "Add media ({formats})", diff --git a/app/javascript/mastodon/locales/ms.json b/app/javascript/mastodon/locales/ms.json index 556204753..b83d26a0a 100644 --- a/app/javascript/mastodon/locales/ms.json +++ b/app/javascript/mastodon/locales/ms.json @@ -16,6 +16,7 @@ "account.follows.empty": "This user doesn't follow anyone yet.", "account.follows_you": "Follows you", "account.hide_reblogs": "Hide boosts from @{name}", + "account.last_status": "Last active", "account.link_verified_on": "Ownership of this link was checked on {date}", "account.locked_info": "This account privacy status is set to locked. The owner manually reviews who can follow them.", "account.media": "Media", @@ -24,10 +25,11 @@ "account.mute": "Mute @{name}", "account.mute_notifications": "Mute notifications from @{name}", "account.muted": "Muted", + "account.never_active": "Never", "account.posts": "Toots", "account.posts_with_replies": "Toots and replies", "account.report": "Report @{name}", - "account.requested": "Awaiting approval. Click to cancel follow request", + "account.requested": "Awaiting approval", "account.share": "Share @{name}'s profile", "account.show_reblogs": "Show boosts from @{name}", "account.unblock": "Unblock @{name}", @@ -36,6 +38,8 @@ "account.unfollow": "Unfollow", "account.unmute": "Unmute @{name}", "account.unmute_notifications": "Unmute notifications from @{name}", + "alert.rate_limited.message": "Please retry after {retry_time, time, medium}.", + "alert.rate_limited.title": "Rate limited", "alert.unexpected.message": "An unexpected error occurred.", "alert.unexpected.title": "Oops!", "autosuggest_hashtag.per_week": "{count} per week", @@ -49,6 +53,7 @@ "column.blocks": "Blocked users", "column.community": "Local timeline", "column.direct": "Direct messages", + "column.directory": "Browse profiles", "column.domain_blocks": "Hidden domains", "column.favourites": "Favourites", "column.follow_requests": "Follow requests", @@ -95,6 +100,8 @@ "confirmations.delete_list.message": "Are you sure you want to permanently delete this list?", "confirmations.domain_block.confirm": "Hide entire domain", "confirmations.domain_block.message": "Are you really, really sure you want to block the entire {domain}? In most cases a few targeted blocks or mutes are sufficient and preferable. You will not see content from that domain in any public timelines or your notifications. Your followers from that domain will be removed.", + "confirmations.logout.confirm": "Log out", + "confirmations.logout.message": "Are you sure you want to log out?", "confirmations.mute.confirm": "Mute", "confirmations.mute.message": "Are you sure you want to mute {name}?", "confirmations.redraft.confirm": "Delete & redraft", @@ -103,6 +110,10 @@ "confirmations.reply.message": "Replying now will overwrite the message you are currently composing. Are you sure you want to proceed?", "confirmations.unfollow.confirm": "Unfollow", "confirmations.unfollow.message": "Are you sure you want to unfollow {name}?", + "directory.federated": "From known fediverse", + "directory.local": "From {domain} only", + "directory.new_arrivals": "New arrivals", + "directory.recently_active": "Recently active", "embed.instructions": "Embed this status on your website by copying the code below.", "embed.preview": "Here is what it will look like:", "emoji_button.activity": "Activity", @@ -250,7 +261,6 @@ "navigation_bar.personal": "Personal", "navigation_bar.pins": "Pinned toots", "navigation_bar.preferences": "Preferences", - "navigation_bar.profile_directory": "Profile directory", "navigation_bar.public_timeline": "Federated timeline", "navigation_bar.security": "Security", "notification.and_n_others": "and {count, plural, one {# other} other {# others}}", @@ -358,6 +368,7 @@ "status.show_more": "Show more", "status.show_more_all": "Show more for all", "status.show_thread": "Show thread", + "status.uncached_media_warning": "Not available", "status.unmute_conversation": "Unmute conversation", "status.unpin": "Unpin from profile", "suggestions.dismiss": "Dismiss suggestion", @@ -373,7 +384,7 @@ "time_remaining.moments": "Moments remaining", "time_remaining.seconds": "{number, plural, one {# second} other {# seconds}} left", "trends.count_by_accounts": "{count} {rawCount, plural, one {person} other {people}} talking", - "trends.refresh": "Refresh", + "trends.trending_now": "Trending now", "ui.beforeunload": "Your draft will be lost if you leave Mastodon.", "upload_area.title": "Drag & drop to upload", "upload_button.label": "Add media ({formats})", diff --git a/app/javascript/mastodon/locales/nl.json b/app/javascript/mastodon/locales/nl.json index 6cfcf6bd6..439dccbb3 100644 --- a/app/javascript/mastodon/locales/nl.json +++ b/app/javascript/mastodon/locales/nl.json @@ -4,7 +4,7 @@ "account.block": "Blokkeer @{name}", "account.block_domain": "Verberg alles van {domain}", "account.blocked": "Geblokkeerd", - "account.cancel_follow_request": "Cancel follow request", + "account.cancel_follow_request": "Volgverzoek annuleren", "account.direct": "Direct Message @{name}", "account.domain_blocked": "Domein verborgen", "account.edit_profile": "Profiel bewerken", @@ -16,6 +16,7 @@ "account.follows.empty": "Deze gebruiker volgt nog niemand.", "account.follows_you": "Volgt jou", "account.hide_reblogs": "Verberg boosts van @{name}", + "account.last_status": "Last active", "account.link_verified_on": "Eigendom van deze link is gecontroleerd op {date}", "account.locked_info": "De privacystatus van dit account is op besloten gezet. De eigenaar bepaalt handmatig wie hen kan volgen.", "account.media": "Media", @@ -24,6 +25,7 @@ "account.mute": "Negeer @{name}", "account.mute_notifications": "Negeer meldingen van @{name}", "account.muted": "Genegeerd", + "account.never_active": "Never", "account.posts": "Toots", "account.posts_with_replies": "Toots en reacties", "account.report": "Rapporteer @{name}", @@ -36,6 +38,8 @@ "account.unfollow": "Ontvolgen", "account.unmute": "@{name} niet langer negeren", "account.unmute_notifications": "@{name} meldingen niet langer negeren", + "alert.rate_limited.message": "Please retry after {retry_time, time, medium}.", + "alert.rate_limited.title": "Rate limited", "alert.unexpected.message": "Er deed zich een onverwachte fout voor", "alert.unexpected.title": "Oeps!", "autosuggest_hashtag.per_week": "{count} per week", @@ -49,6 +53,7 @@ "column.blocks": "Geblokkeerde gebruikers", "column.community": "Lokale tijdlijn", "column.direct": "Directe berichten", + "column.directory": "Browse profiles", "column.domain_blocks": "Genegeerde servers", "column.favourites": "Favorieten", "column.follow_requests": "Volgverzoeken", @@ -95,6 +100,8 @@ "confirmations.delete_list.message": "Weet je zeker dat je deze lijst definitief wilt verwijderen?", "confirmations.domain_block.confirm": "Verberg alles van deze server", "confirmations.domain_block.message": "Weet je het echt heel erg zeker dat je alles van {domain} wilt negeren? In de meeste gevallen is het blokkeren of negeren van een paar specifieke personen voldoende en beter. Je zult geen toots van deze server op openbare tijdlijnen zien of in jouw meldingen. Jouw volgers van deze server worden verwijderd.", + "confirmations.logout.confirm": "Log out", + "confirmations.logout.message": "Are you sure you want to log out?", "confirmations.mute.confirm": "Negeren", "confirmations.mute.message": "Weet je het zeker dat je {name} wilt negeren?", "confirmations.redraft.confirm": "Verwijderen en herschrijven", @@ -103,6 +110,10 @@ "confirmations.reply.message": "Door nu te reageren overschrijf je de toot die je op dit moment aan het schrijven bent. Weet je zeker dat je verder wil gaan?", "confirmations.unfollow.confirm": "Ontvolgen", "confirmations.unfollow.message": "Weet je het zeker dat je {name} wilt ontvolgen?", + "directory.federated": "From known fediverse", + "directory.local": "From {domain} only", + "directory.new_arrivals": "New arrivals", + "directory.recently_active": "Recently active", "embed.instructions": "Embed deze toot op jouw website, door de onderstaande code te kopiëren.", "embed.preview": "Zo komt het eruit te zien:", "emoji_button.activity": "Activiteiten", @@ -224,7 +235,7 @@ "lists.new.title_placeholder": "Naam nieuwe lijst", "lists.search": "Zoek naar mensen die je volgt", "lists.subheading": "Jouw lijsten", - "load_pending": "{count, plural, one {# new item} other {# new items}}", + "load_pending": "{count, plural, one {# nieuw item} other {# nieuwe items}}", "loading_indicator.label": "Laden…", "media_gallery.toggle_visible": "Media wel/niet tonen", "missing_indicator.label": "Niet gevonden", @@ -250,7 +261,6 @@ "navigation_bar.personal": "Persoonlijk", "navigation_bar.pins": "Vastgezette toots", "navigation_bar.preferences": "Instellingen", - "navigation_bar.profile_directory": "Gebruikersgids", "navigation_bar.public_timeline": "Globale tijdlijn", "navigation_bar.security": "Beveiliging", "notification.and_n_others": "and {count, plural, one {# other} other {# others}}", @@ -319,7 +329,7 @@ "search_results.accounts": "Gebruikers", "search_results.hashtags": "Hashtags", "search_results.statuses": "Toots", - "search_results.statuses_fts_disabled": "Searching toots by their content is not enabled on this Mastodon server.", + "search_results.statuses_fts_disabled": "Het zoeken in toots is op deze Mastodonserver niet ingeschakeld.", "search_results.total": "{count, number} {count, plural, one {resultaat} other {resultaten}}", "status.admin_account": "Moderatie-omgeving van @{name} openen", "status.admin_status": "Deze toot in de moderatie-omgeving openen", @@ -358,6 +368,7 @@ "status.show_more": "Meer tonen", "status.show_more_all": "Alles meer tonen", "status.show_thread": "Gesprek tonen", + "status.uncached_media_warning": "Not available", "status.unmute_conversation": "Gesprek niet langer negeren", "status.unpin": "Van profielpagina losmaken", "suggestions.dismiss": "Voorstel verwerpen", @@ -373,22 +384,22 @@ "time_remaining.moments": "Nog enkele ogenblikken resterend", "time_remaining.seconds": "{number, plural, one {# seconde} other {# seconden}} te gaan", "trends.count_by_accounts": "{count} {rawCount, plural, one {persoon praat} other {mensen praten}} hierover", - "trends.refresh": "Refresh", + "trends.trending_now": "Trends", "ui.beforeunload": "Je concept zal verloren gaan als je Mastodon verlaat.", "upload_area.title": "Hiernaar toe slepen om te uploaden", "upload_button.label": "Media toevoegen ({formats})", "upload_error.limit": "Uploadlimiet van bestand overschreden.", "upload_error.poll": "Het uploaden van bestanden is in polls niet toegestaan.", "upload_form.description": "Omschrijf dit voor mensen met een visuele beperking", - "upload_form.edit": "Edit", + "upload_form.edit": "Bewerken", "upload_form.undo": "Verwijderen", - "upload_modal.analyzing_picture": "Analyzing picture…", - "upload_modal.apply": "Apply", + "upload_modal.analyzing_picture": "Afbeelding analyseren…", + "upload_modal.apply": "Toepassen", "upload_modal.description_placeholder": "A quick brown fox jumps over the lazy dog", - "upload_modal.detect_text": "Detect text from picture", - "upload_modal.edit_media": "Edit media", - "upload_modal.hint": "Click or drag the circle on the preview to choose the focal point which will always be in view on all thumbnails.", - "upload_modal.preview_label": "Preview ({ratio})", + "upload_modal.detect_text": "Tekst in een afbeelding detecteren", + "upload_modal.edit_media": "Media bewerken", + "upload_modal.hint": "Klik of sleep de cirkel in de voorvertoning naar een centraal punt dat op elke thumbnail zichtbaar moet blijven.", + "upload_modal.preview_label": "Voorvertoning ({ratio})", "upload_progress.label": "Uploaden...", "video.close": "Video sluiten", "video.exit_fullscreen": "Volledig scherm sluiten", diff --git a/app/javascript/mastodon/locales/no.json b/app/javascript/mastodon/locales/no.json index b310efd69..77ddad7e0 100644 --- a/app/javascript/mastodon/locales/no.json +++ b/app/javascript/mastodon/locales/no.json @@ -16,6 +16,7 @@ "account.follows.empty": "This user doesn't follow anyone yet.", "account.follows_you": "Følger deg", "account.hide_reblogs": "Skjul fremhevinger fra @{name}", + "account.last_status": "Last active", "account.link_verified_on": "Ownership of this link was checked on {date}", "account.locked_info": "This account privacy status is set to locked. The owner manually reviews who can follow them.", "account.media": "Media", @@ -24,6 +25,7 @@ "account.mute": "Demp @{name}", "account.mute_notifications": "Ignorer varsler fra @{name}", "account.muted": "Muted", + "account.never_active": "Never", "account.posts": "Innlegg", "account.posts_with_replies": "Toots with replies", "account.report": "Rapportér @{name}", @@ -36,6 +38,8 @@ "account.unfollow": "Avfølg", "account.unmute": "Avdemp @{name}", "account.unmute_notifications": "Vis varsler fra @{name}", + "alert.rate_limited.message": "Please retry after {retry_time, time, medium}.", + "alert.rate_limited.title": "Rate limited", "alert.unexpected.message": "An unexpected error occurred.", "alert.unexpected.title": "Oops!", "autosuggest_hashtag.per_week": "{count} per week", @@ -49,6 +53,7 @@ "column.blocks": "Blokkerte brukere", "column.community": "Lokal tidslinje", "column.direct": "Direct messages", + "column.directory": "Browse profiles", "column.domain_blocks": "Hidden domains", "column.favourites": "Likt", "column.follow_requests": "Følgeforespørsler", @@ -95,6 +100,8 @@ "confirmations.delete_list.message": "Er du sikker på at du vil slette denne listen permanent?", "confirmations.domain_block.confirm": "Skjul alt fra domenet", "confirmations.domain_block.message": "Er du sikker på at du vil skjule hele domenet {domain}? I de fleste tilfeller er det bedre med målrettet blokkering eller demping.", + "confirmations.logout.confirm": "Log out", + "confirmations.logout.message": "Are you sure you want to log out?", "confirmations.mute.confirm": "Demp", "confirmations.mute.message": "Er du sikker på at du vil dempe {name}?", "confirmations.redraft.confirm": "Delete & redraft", @@ -103,6 +110,10 @@ "confirmations.reply.message": "Replying now will overwrite the message you are currently composing. Are you sure you want to proceed?", "confirmations.unfollow.confirm": "Slutt å følge", "confirmations.unfollow.message": "Er du sikker på at du vil slutte å følge {name}?", + "directory.federated": "From known fediverse", + "directory.local": "From {domain} only", + "directory.new_arrivals": "New arrivals", + "directory.recently_active": "Recently active", "embed.instructions": "Kopier koden under for å bygge inn denne statusen på hjemmesiden din.", "embed.preview": "Slik kommer det til å se ut:", "emoji_button.activity": "Aktivitet", @@ -250,7 +261,6 @@ "navigation_bar.personal": "Personal", "navigation_bar.pins": "Festa tuter", "navigation_bar.preferences": "Preferanser", - "navigation_bar.profile_directory": "Profile directory", "navigation_bar.public_timeline": "Felles tidslinje", "navigation_bar.security": "Security", "notification.and_n_others": "and {count, plural, one {# other} other {# others}}", @@ -358,6 +368,7 @@ "status.show_more": "Vis mer", "status.show_more_all": "Show more for all", "status.show_thread": "Show thread", + "status.uncached_media_warning": "Not available", "status.unmute_conversation": "Ikke demp samtale", "status.unpin": "Angre festing på profilen", "suggestions.dismiss": "Dismiss suggestion", @@ -373,7 +384,7 @@ "time_remaining.moments": "Moments remaining", "time_remaining.seconds": "{number, plural, one {# second} other {# seconds}} left", "trends.count_by_accounts": "{count} {rawCount, plural, one {person} other {people}} talking", - "trends.refresh": "Refresh", + "trends.trending_now": "Trending now", "ui.beforeunload": "Din kladd vil bli forkastet om du forlater Mastodon.", "upload_area.title": "Dra og slipp for å laste opp", "upload_button.label": "Legg til media", diff --git a/app/javascript/mastodon/locales/oc.json b/app/javascript/mastodon/locales/oc.json index 76b578021..10501796d 100644 --- a/app/javascript/mastodon/locales/oc.json +++ b/app/javascript/mastodon/locales/oc.json @@ -16,6 +16,7 @@ "account.follows.empty": "Aqueste utilizaire sèc pas degun pel moment.", "account.follows_you": "Vos sèc", "account.hide_reblogs": "Rescondre los partatges de @{name}", + "account.last_status": "Last active", "account.link_verified_on": "La proprietat d’aqueste ligam foguèt verificada lo {date}", "account.locked_info": "L’estatut de privacitat del compte es configurat sus clavat. Lo proprietari causís qual pòt sègre son compte.", "account.media": "Mèdias", @@ -24,6 +25,7 @@ "account.mute": "Rescondre @{name}", "account.mute_notifications": "Rescondre las notificacions de @{name}", "account.muted": "Mes en silenci", + "account.never_active": "Never", "account.posts": "Tuts", "account.posts_with_replies": "Tuts e responsas", "account.report": "Senhalar @{name}", @@ -36,6 +38,8 @@ "account.unfollow": "Quitar de sègre", "account.unmute": "Quitar de rescondre @{name}", "account.unmute_notifications": "Mostrar las notificacions de @{name}", + "alert.rate_limited.message": "Please retry after {retry_time, time, medium}.", + "alert.rate_limited.title": "Rate limited", "alert.unexpected.message": "Una error s’es producha.", "alert.unexpected.title": "Ops !", "autosuggest_hashtag.per_week": "{count} per week", @@ -49,6 +53,7 @@ "column.blocks": "Personas blocadas", "column.community": "Flux public local", "column.direct": "Messatges dirèctes", + "column.directory": "Browse profiles", "column.domain_blocks": "Domenis resconduts", "column.favourites": "Favorits", "column.follow_requests": "Demandas d’abonament", @@ -95,6 +100,8 @@ "confirmations.delete_list.message": "Volètz vertadièrament suprimir aquesta lista per totjorn ?", "confirmations.domain_block.confirm": "Amagar tot lo domeni", "confirmations.domain_block.message": "Volètz vertadièrament blocar complètament {domain} ? De còps cal pas que blocar o rescondre unas personas solament.\nVeiretz pas cap de contengut d’aquel domeni dins cap de flux public o dins vòstras notificacions. Vòstres seguidors d’aquel domeni seràn levats.", + "confirmations.logout.confirm": "Log out", + "confirmations.logout.message": "Are you sure you want to log out?", "confirmations.mute.confirm": "Rescondre", "confirmations.mute.message": "Volètz vertadièrament rescondre {name} ?", "confirmations.redraft.confirm": "Escafar & tornar formular", @@ -103,6 +110,10 @@ "confirmations.reply.message": "Respondre remplaçarà lo messatge que sètz a escriure. Volètz vertadièrament contunhar ?", "confirmations.unfollow.confirm": "Quitar de sègre", "confirmations.unfollow.message": "Volètz vertadièrament quitar de sègre {name} ?", + "directory.federated": "From known fediverse", + "directory.local": "From {domain} only", + "directory.new_arrivals": "New arrivals", + "directory.recently_active": "Recently active", "embed.instructions": "Embarcar aqueste estatut per lo far veire sus un site Internet en copiar lo còdi çai-jos.", "embed.preview": "Semblarà aquò :", "emoji_button.activity": "Activitats", @@ -158,7 +169,7 @@ "home.column_settings.basic": "Basic", "home.column_settings.show_reblogs": "Mostrar los partatges", "home.column_settings.show_replies": "Mostrar las responsas", - "home.column_settings.update_live": "Actualizacion en dirècte", + "home.column_settings.update_live": "Update in real-time", "intervals.full.days": "{number, plural, one {# jorn} other {# jorns}}", "intervals.full.hours": "{number, plural, one {# ora} other {# oras}}", "intervals.full.minutes": "{number, plural, one {# minuta} other {# minutas}}", @@ -250,7 +261,6 @@ "navigation_bar.personal": "Personal", "navigation_bar.pins": "Tuts penjats", "navigation_bar.preferences": "Preferéncias", - "navigation_bar.profile_directory": "Annuari de perfils", "navigation_bar.public_timeline": "Flux public global", "navigation_bar.security": "Seguretat", "notification.and_n_others": "and {count, plural, one {# other} other {# others}}", @@ -358,6 +368,7 @@ "status.show_more": "Desplegar", "status.show_more_all": "Los desplegar totes", "status.show_thread": "Mostrar lo fil", + "status.uncached_media_warning": "Not available", "status.unmute_conversation": "Tornar mostrar la conversacion", "status.unpin": "Tirar del perfil", "suggestions.dismiss": "Regetar la suggestion", @@ -373,7 +384,7 @@ "time_remaining.moments": "Moments restants", "time_remaining.seconds": "demòra{number, plural, one { # segonda} other {n # segondas}}", "trends.count_by_accounts": "{count} {rawCount, plural, one {person} ne charra other {people}} ne charran", - "trends.refresh": "Refresh", + "trends.trending_now": "Trending now", "ui.beforeunload": "Vòstre brolhon serà perdut se quitatz Mastodon.", "upload_area.title": "Lisatz e depausatz per mandar", "upload_button.label": "Ajustar un mèdia (JPEG, PNG, GIF, WebM, MP4, MOV)", diff --git a/app/javascript/mastodon/locales/pl.json b/app/javascript/mastodon/locales/pl.json index 651ca351f..e6c82c4f3 100644 --- a/app/javascript/mastodon/locales/pl.json +++ b/app/javascript/mastodon/locales/pl.json @@ -16,6 +16,7 @@ "account.follows.empty": "Ten użytkownik nie śledzi jeszcze nikogo.", "account.follows_you": "Śledzi Cię", "account.hide_reblogs": "Ukryj podbicia od @{name}", + "account.last_status": "Last active", "account.link_verified_on": "Własność tego odnośnika została potwierdzona {date}", "account.locked_info": "To konto jest prywatne. Właściciel ręcznie wybiera kto może go śledzić.", "account.media": "Zawartość multimedialna", @@ -24,6 +25,7 @@ "account.mute": "Wycisz @{name}", "account.mute_notifications": "Wycisz powiadomienia o @{name}", "account.muted": "Wyciszony", + "account.never_active": "Never", "account.posts": "Wpisy", "account.posts_with_replies": "Wpisy i odpowiedzi", "account.report": "Zgłoś @{name}", @@ -36,6 +38,8 @@ "account.unfollow": "Przestań śledzić", "account.unmute": "Cofnij wyciszenie @{name}", "account.unmute_notifications": "Cofnij wyciszenie powiadomień od @{name}", + "alert.rate_limited.message": "Please retry after {retry_time, time, medium}.", + "alert.rate_limited.title": "Rate limited", "alert.unexpected.message": "Wystąpił nieoczekiwany błąd.", "alert.unexpected.title": "O nie!", "autosuggest_hashtag.per_week": "{count} per week", @@ -49,6 +53,7 @@ "column.blocks": "Zablokowani użytkownicy", "column.community": "Lokalna oś czasu", "column.direct": "Wiadomości bezpośrednie", + "column.directory": "Browse profiles", "column.domain_blocks": "Ukryte domeny", "column.favourites": "Ulubione", "column.follow_requests": "Prośby o śledzenie", @@ -95,6 +100,8 @@ "confirmations.delete_list.message": "Czy na pewno chcesz bezpowrotnie usunąć tą listę?", "confirmations.domain_block.confirm": "Ukryj wszysyko z domeny", "confirmations.domain_block.message": "Czy na pewno chcesz zablokować całą domenę {domain}? Zwykle lepszym rozwiązaniem jest blokada lub wyciszenie kilku użytkowników.", + "confirmations.logout.confirm": "Log out", + "confirmations.logout.message": "Are you sure you want to log out?", "confirmations.mute.confirm": "Wycisz", "confirmations.mute.message": "Czy na pewno chcesz wyciszyć {name}?", "confirmations.redraft.confirm": "Usuń i przeredaguj", @@ -103,6 +110,10 @@ "confirmations.reply.message": "W ten sposób utracisz wpis który obecnie tworzysz. Czy na pewno chcesz to zrobić?", "confirmations.unfollow.confirm": "Przestań śledzić", "confirmations.unfollow.message": "Czy na pewno zamierzasz przestać śledzić {name}?", + "directory.federated": "From known fediverse", + "directory.local": "From {domain} only", + "directory.new_arrivals": "New arrivals", + "directory.recently_active": "Recently active", "embed.instructions": "Osadź ten wpis na swojej stronie wklejając poniższy kod.", "embed.preview": "Tak będzie to wyglądać:", "emoji_button.activity": "Aktywność", @@ -250,7 +261,6 @@ "navigation_bar.personal": "Osobiste", "navigation_bar.pins": "Przypięte wpisy", "navigation_bar.preferences": "Preferencje", - "navigation_bar.profile_directory": "Katalog profilów", "navigation_bar.public_timeline": "Globalna oś czasu", "navigation_bar.security": "Bezpieczeństwo", "notification.and_n_others": "and {count, plural, one {# other} other {# others}}", @@ -358,6 +368,7 @@ "status.show_more": "Rozwiń", "status.show_more_all": "Rozwiń wszystkie", "status.show_thread": "Pokaż wątek", + "status.uncached_media_warning": "Not available", "status.unmute_conversation": "Cofnij wyciszenie konwersacji", "status.unpin": "Odepnij z profilu", "suggestions.dismiss": "Odrzuć sugestię", @@ -373,7 +384,7 @@ "time_remaining.moments": "Pozostała chwila", "time_remaining.seconds": "{number, plural, one {Pozostała # sekunda} few {Pozostały # sekundy} many {Pozostało # sekund} other {Pozostało # sekund}}", "trends.count_by_accounts": "{count} {rawCount, plural, one {osoba rozmawia} few {osoby rozmawiają} other {osób rozmawia}} o tym", - "trends.refresh": "Refresh", + "trends.trending_now": "Trending now", "ui.beforeunload": "Utracisz tworzony wpis, jeżeli opuścisz Mastodona.", "upload_area.title": "Przeciągnij i upuść aby wysłać", "upload_button.label": "Dodaj zawartość multimedialną (JPEG, PNG, GIF, WebM, MP4, MOV)", @@ -383,7 +394,7 @@ "upload_form.edit": "Edit", "upload_form.undo": "Usuń", "upload_modal.analyzing_picture": "Analyzing picture…", - "upload_modal.apply": "Apply", + "upload_modal.apply": "Zastosuj", "upload_modal.description_placeholder": "A quick brown fox jumps over the lazy dog", "upload_modal.detect_text": "Detect text from picture", "upload_modal.edit_media": "Edit media", diff --git a/app/javascript/mastodon/locales/pt-BR.json b/app/javascript/mastodon/locales/pt-BR.json index 523378276..e11141f6c 100644 --- a/app/javascript/mastodon/locales/pt-BR.json +++ b/app/javascript/mastodon/locales/pt-BR.json @@ -16,6 +16,7 @@ "account.follows.empty": "Esse usuário não segue ninguém no momento.", "account.follows_you": "Segue você", "account.hide_reblogs": "Esconder compartilhamentos de @{name}", + "account.last_status": "Last active", "account.link_verified_on": "A posse desse link foi verificada em {date}", "account.locked_info": "Essa conta está trancada. Se você a seguir sua solicitação será revisada manualmente.", "account.media": "Mídia", @@ -24,6 +25,7 @@ "account.mute": "Silenciar @{name}", "account.mute_notifications": "Silenciar notificações de @{name}", "account.muted": "Silenciado", + "account.never_active": "Never", "account.posts": "Toots", "account.posts_with_replies": "Toots e respostas", "account.report": "Denunciar @{name}", @@ -36,6 +38,8 @@ "account.unfollow": "Deixar de seguir", "account.unmute": "Não silenciar @{name}", "account.unmute_notifications": "Retirar silêncio das notificações vindas de @{name}", + "alert.rate_limited.message": "Please retry after {retry_time, time, medium}.", + "alert.rate_limited.title": "Rate limited", "alert.unexpected.message": "Um erro inesperado ocorreu.", "alert.unexpected.title": "Eita!", "autosuggest_hashtag.per_week": "{count} per week", @@ -49,6 +53,7 @@ "column.blocks": "Usuários bloqueados", "column.community": "Local", "column.direct": "Mensagens diretas", + "column.directory": "Browse profiles", "column.domain_blocks": "Domínios escondidos", "column.favourites": "Favoritos", "column.follow_requests": "Seguidores pendentes", @@ -95,6 +100,8 @@ "confirmations.delete_list.message": "Você tem certeza que quer deletar permanentemente a lista?", "confirmations.domain_block.confirm": "Esconder o domínio inteiro", "confirmations.domain_block.message": "Você quer mesmo bloquear {domain} inteiro? Na maioria dos casos, silenciar ou bloquear alguns usuários é o suficiente e o recomendado. Você não vai ver conteúdo desse domínio em nenhuma das timelines públicas ou nas suas notificações. Seus seguidores desse domínio serão removidos.", + "confirmations.logout.confirm": "Log out", + "confirmations.logout.message": "Are you sure you want to log out?", "confirmations.mute.confirm": "Silenciar", "confirmations.mute.message": "Você tem certeza de que quer silenciar {name}?", "confirmations.redraft.confirm": "Apagar & usar como rascunho", @@ -103,6 +110,10 @@ "confirmations.reply.message": "Responder agora vai sobrescrever a mensagem que você está compondo. Você tem certeza que quer continuar?", "confirmations.unfollow.confirm": "Deixar de seguir", "confirmations.unfollow.message": "Você tem certeza de que quer deixar de seguir {name}?", + "directory.federated": "From known fediverse", + "directory.local": "From {domain} only", + "directory.new_arrivals": "New arrivals", + "directory.recently_active": "Recently active", "embed.instructions": "Incorpore esta postagem em seu site copiando o código abaixo.", "embed.preview": "Aqui está uma previsão de como ficará:", "emoji_button.activity": "Atividades", @@ -250,7 +261,6 @@ "navigation_bar.personal": "Pessoal", "navigation_bar.pins": "Postagens fixadas", "navigation_bar.preferences": "Preferências", - "navigation_bar.profile_directory": "Diretório de perfis", "navigation_bar.public_timeline": "Global", "navigation_bar.security": "Segurança", "notification.and_n_others": "and {count, plural, one {# other} other {# others}}", @@ -358,6 +368,7 @@ "status.show_more": "Mostrar mais", "status.show_more_all": "Mostrar mais para todas as mensagens", "status.show_thread": "Mostrar sequência", + "status.uncached_media_warning": "Not available", "status.unmute_conversation": "Desativar silêncio desta conversa", "status.unpin": "Desafixar do perfil", "suggestions.dismiss": "Ignorar a sugestão", @@ -373,7 +384,7 @@ "time_remaining.moments": "Momentos restantes", "time_remaining.seconds": "{number, plural, one {# segundo restante} other {# segundos restantes}}", "trends.count_by_accounts": "{count} {rawCount, plural, one {pessoa} other {pessoas}} falando sobre", - "trends.refresh": "Refresh", + "trends.trending_now": "Trending now", "ui.beforeunload": "Seu rascunho será perdido se você sair do Mastodon.", "upload_area.title": "Arraste e solte para enviar", "upload_button.label": "Adicionar mídia (JPEG, PNG, GIF, WebM, MP4, MOV)", diff --git a/app/javascript/mastodon/locales/pt.json b/app/javascript/mastodon/locales/pt.json index 7ce628422..63a078c4e 100644 --- a/app/javascript/mastodon/locales/pt.json +++ b/app/javascript/mastodon/locales/pt.json @@ -16,6 +16,7 @@ "account.follows.empty": "Este utilizador ainda não segue alguém.", "account.follows_you": "É teu seguidor", "account.hide_reblogs": "Esconder partilhas de @{name}", + "account.last_status": "Last active", "account.link_verified_on": "A posse deste link foi verificada em {date}", "account.locked_info": "O estatuto de privacidade desta conta é fechado. O dono revê manualmente que a pode seguir.", "account.media": "Média", @@ -24,6 +25,7 @@ "account.mute": "Silenciar @{name}", "account.mute_notifications": "Silenciar notificações de @{name}", "account.muted": "Silenciada", + "account.never_active": "Never", "account.posts": "Publicações", "account.posts_with_replies": "Publicações e respostas", "account.report": "Denunciar @{name}", @@ -36,6 +38,8 @@ "account.unfollow": "Deixar de seguir", "account.unmute": "Não silenciar @{name}", "account.unmute_notifications": "Deixar de silenciar @{name}", + "alert.rate_limited.message": "Please retry after {retry_time, time, medium}.", + "alert.rate_limited.title": "Rate limited", "alert.unexpected.message": "Ocorreu um erro inesperado.", "alert.unexpected.title": "Bolas!", "autosuggest_hashtag.per_week": "{count} per week", @@ -49,6 +53,7 @@ "column.blocks": "Utilizadores Bloqueados", "column.community": "Cronologia local", "column.direct": "Mensagens directas", + "column.directory": "Browse profiles", "column.domain_blocks": "Domínios escondidos", "column.favourites": "Favoritos", "column.follow_requests": "Seguidores pendentes", @@ -95,6 +100,8 @@ "confirmations.delete_list.message": "Tens a certeza de que desejas eliminar permanentemente esta lista?", "confirmations.domain_block.confirm": "Esconder tudo deste domínio", "confirmations.domain_block.message": "De certeza que queres bloquear completamente o domínio {domain}? Na maioria dos casos, silenciar ou bloquear alguns utilizadores é suficiente e é o recomendado. Não irás ver conteúdo daquele domínio em cronologia alguma nem nas tuas notificações. Os teus seguidores daquele domínio serão removidos.", + "confirmations.logout.confirm": "Log out", + "confirmations.logout.message": "Are you sure you want to log out?", "confirmations.mute.confirm": "Silenciar", "confirmations.mute.message": "De certeza que queres silenciar {name}?", "confirmations.redraft.confirm": "Apagar & redigir", @@ -103,6 +110,10 @@ "confirmations.reply.message": "Responder agora irá reescrever a mensagem que estás a compor actualmente. Tens a certeza que queres continuar?", "confirmations.unfollow.confirm": "Deixar de seguir", "confirmations.unfollow.message": "De certeza que queres deixar de seguir {name}?", + "directory.federated": "From known fediverse", + "directory.local": "From {domain} only", + "directory.new_arrivals": "New arrivals", + "directory.recently_active": "Recently active", "embed.instructions": "Publica esta publicação no teu site copiando o código abaixo.", "embed.preview": "Podes ver aqui como irá ficar:", "emoji_button.activity": "Actividade", @@ -250,7 +261,6 @@ "navigation_bar.personal": "Pessoal", "navigation_bar.pins": "Toots afixados", "navigation_bar.preferences": "Preferências", - "navigation_bar.profile_directory": "Directório de perfis", "navigation_bar.public_timeline": "Cronologia federada", "navigation_bar.security": "Segurança", "notification.and_n_others": "and {count, plural, one {# other} other {# others}}", @@ -358,6 +368,7 @@ "status.show_more": "Mostrar mais", "status.show_more_all": "Mostrar mais para todas", "status.show_thread": "Mostrar conversa", + "status.uncached_media_warning": "Not available", "status.unmute_conversation": "Deixar de silenciar esta conversa", "status.unpin": "Não fixar no perfil", "suggestions.dismiss": "Dispensar a sugestão", @@ -373,7 +384,7 @@ "time_remaining.moments": "Momentos restantes", "time_remaining.seconds": "{número, plural, um {# second} outro {# seconds}} faltam", "trends.count_by_accounts": "{count} {rawCount, plural, uma {person} outra {people}} a falar", - "trends.refresh": "Refresh", + "trends.trending_now": "Trending now", "ui.beforeunload": "O teu rascunho será perdido se abandonares o Mastodon.", "upload_area.title": "Arraste e solte para enviar", "upload_button.label": "Adicionar media", diff --git a/app/javascript/mastodon/locales/ro.json b/app/javascript/mastodon/locales/ro.json index 141ccd5ab..27e4addda 100644 --- a/app/javascript/mastodon/locales/ro.json +++ b/app/javascript/mastodon/locales/ro.json @@ -16,6 +16,7 @@ "account.follows.empty": "Acest utilizator nu urmărește pe nimeni incă.", "account.follows_you": "Te urmărește", "account.hide_reblogs": "Ascunde redistribuirile de la @{name}", + "account.last_status": "Last active", "account.link_verified_on": "Deținerea acestui link a fost verificată la {date}", "account.locked_info": "Acest profil este privat. Această persoană gestioneaz manual cine o urmărește.", "account.media": "Media", @@ -24,6 +25,7 @@ "account.mute": "Oprește @{name}", "account.mute_notifications": "Oprește notificările de la @{name}", "account.muted": "Oprit", + "account.never_active": "Never", "account.posts": "Postări", "account.posts_with_replies": "Postări și replici", "account.report": "Raportează @{name}", @@ -36,6 +38,8 @@ "account.unfollow": "Nu mai urmări", "account.unmute": "Activează notificările de la @{name}", "account.unmute_notifications": "Activează notificările de la @{name}", + "alert.rate_limited.message": "Please retry after {retry_time, time, medium}.", + "alert.rate_limited.title": "Rate limited", "alert.unexpected.message": "A apărut o eroare neașteptată.", "alert.unexpected.title": "Hopa!", "autosuggest_hashtag.per_week": "{count} per week", @@ -49,6 +53,7 @@ "column.blocks": "Utilizatori blocați", "column.community": "Fluxul Local", "column.direct": "Mesaje directe", + "column.directory": "Browse profiles", "column.domain_blocks": "Domenii ascunse", "column.favourites": "Favorite", "column.follow_requests": "Cereri de urmărire", @@ -95,6 +100,8 @@ "confirmations.delete_list.message": "Ești sigur că vrei să ștergi permanent această listă?", "confirmations.domain_block.confirm": "Ascunde tot domeniul", "confirmations.domain_block.message": "Ești absolut sigur că vrei să blochezi complet {domain}? În cele mai multe cazuri raportarea sau oprirea anumitor lucruri este suficientă și de preferat. Nu vei mai vedea nici un conținut de la acest domeniu in nici un flux public sau în notificările tale. Urmăritorii tăi de la acele domenii vor fi eliminați.", + "confirmations.logout.confirm": "Log out", + "confirmations.logout.message": "Are you sure you want to log out?", "confirmations.mute.confirm": "Oprește", "confirmations.mute.message": "Ești sigur că vrei să oprești {name}?", "confirmations.redraft.confirm": "Șterge și salvează ca ciornă", @@ -103,6 +110,10 @@ "confirmations.reply.message": "Răspunzând la asta acum, mesajul pe care îl compui în prezent se va șterge. Ești sigur că vrei să continui?", "confirmations.unfollow.confirm": "Nu mai urmări", "confirmations.unfollow.message": "Ești sigur că nu mai vrei să îl urmărești pe {name}?", + "directory.federated": "From known fediverse", + "directory.local": "From {domain} only", + "directory.new_arrivals": "New arrivals", + "directory.recently_active": "Recently active", "embed.instructions": "Inserează această postare pe site-ul tău adăugând codul de mai jos.", "embed.preview": "Cam așa va arăta:", "emoji_button.activity": "Activitate", @@ -250,7 +261,6 @@ "navigation_bar.personal": "Personal", "navigation_bar.pins": "Postări fixate", "navigation_bar.preferences": "Preferințe", - "navigation_bar.profile_directory": "Profile directory", "navigation_bar.public_timeline": "Flux global", "navigation_bar.security": "Securitate", "notification.and_n_others": "and {count, plural, one {# other} other {# others}}", @@ -358,6 +368,7 @@ "status.show_more": "Arată mai mult", "status.show_more_all": "Arată mai mult pentru toți", "status.show_thread": "Arată topicul", + "status.uncached_media_warning": "Not available", "status.unmute_conversation": "Repornește conversația", "status.unpin": "Eliberează din profil", "suggestions.dismiss": "Omite sugestia", @@ -373,7 +384,7 @@ "time_remaining.moments": "Moments remaining", "time_remaining.seconds": "{number, plural, one {# second} other {# seconds}} left", "trends.count_by_accounts": "{count} {rawCount, plural, one {person} other {people}} vorbesc", - "trends.refresh": "Refresh", + "trends.trending_now": "Trending now", "ui.beforeunload": "Postarea se va pierde dacă părăsești pagina.", "upload_area.title": "Trage și eliberează pentru a încărca", "upload_button.label": "Adaugă media (JPEG, PNG, GIF, WebM, MP4, MOV)", diff --git a/app/javascript/mastodon/locales/ru.json b/app/javascript/mastodon/locales/ru.json index afc064a6b..efbaa25a0 100644 --- a/app/javascript/mastodon/locales/ru.json +++ b/app/javascript/mastodon/locales/ru.json @@ -16,6 +16,7 @@ "account.follows.empty": "Этот пользователь ни на кого не подписан.", "account.follows_you": "Подписан(а) на вас", "account.hide_reblogs": "Скрыть реблоги от @{name}", + "account.last_status": "Last active", "account.link_verified_on": "Владение этой ссылкой было проверено {date}", "account.locked_info": "Это закрытый аккаунт. Его владелец вручную одобряет подписчиков.", "account.media": "Медиа", @@ -24,6 +25,7 @@ "account.mute": "Скрыть @{name}", "account.mute_notifications": "Скрыть уведомления от @{name}", "account.muted": "Скрыт", + "account.never_active": "Never", "account.posts": "Посты", "account.posts_with_replies": "Посты с ответами", "account.report": "Пожаловаться", @@ -36,6 +38,8 @@ "account.unfollow": "Отписаться", "account.unmute": "Снять глушение", "account.unmute_notifications": "Показывать уведомления от @{name}", + "alert.rate_limited.message": "Please retry after {retry_time, time, medium}.", + "alert.rate_limited.title": "Rate limited", "alert.unexpected.message": "Что-то пошло не так.", "alert.unexpected.title": "Ой!", "autosuggest_hashtag.per_week": "{count} / неделю", @@ -49,6 +53,7 @@ "column.blocks": "Список блокировки", "column.community": "Локальная лента", "column.direct": "Личные сообщения", + "column.directory": "Browse profiles", "column.domain_blocks": "Скрытые домены", "column.favourites": "Понравившееся", "column.follow_requests": "Запросы на подписку", @@ -95,6 +100,8 @@ "confirmations.delete_list.message": "Вы действительно хотите навсегда удалить этот список?", "confirmations.domain_block.confirm": "Блокировать весь домен", "confirmations.domain_block.message": "Вы на самом деле уверены, что хотите блокировать весь {domain}? В большинстве случаев нескольких отдельных блокировок или глушений достаточно.", + "confirmations.logout.confirm": "Log out", + "confirmations.logout.message": "Are you sure you want to log out?", "confirmations.mute.confirm": "Заглушить", "confirmations.mute.message": "Вы уверены, что хотите заглушить {name}?", "confirmations.redraft.confirm": "Удалить и исправить", @@ -103,6 +110,10 @@ "confirmations.reply.message": "При ответе текст набираемого сообщения будет перезаписан. Продолжить?", "confirmations.unfollow.confirm": "Отписаться", "confirmations.unfollow.message": "Вы уверены, что хотите отписаться от {name}?", + "directory.federated": "From known fediverse", + "directory.local": "From {domain} only", + "directory.new_arrivals": "New arrivals", + "directory.recently_active": "Recently active", "embed.instructions": "Встройте этот статус на Вашем сайте, скопировав код внизу.", "embed.preview": "Так это будет выглядеть:", "emoji_button.activity": "Занятия", @@ -158,7 +169,7 @@ "home.column_settings.basic": "Основные", "home.column_settings.show_reblogs": "Показывать продвижения", "home.column_settings.show_replies": "Показывать ответы", - "home.column_settings.update_live": "Обновлять в реальном времени", + "home.column_settings.update_live": "Update in real-time", "intervals.full.days": "{number, plural, one {# день} few {# дня} other {# дней}}", "intervals.full.hours": "{number, plural, one {# час} few {# часа} other {# часов}}", "intervals.full.minutes": "{number, plural, one {# минута} few {# минуты} other {# минут}}", @@ -250,7 +261,6 @@ "navigation_bar.personal": "Личное", "navigation_bar.pins": "Закреплённые посты", "navigation_bar.preferences": "Опции", - "navigation_bar.profile_directory": "Каталог профилей", "navigation_bar.public_timeline": "Глобальная лента", "navigation_bar.security": "Безопасность", "notification.and_n_others": "and {count, plural, one {# other} other {# others}}", @@ -358,6 +368,7 @@ "status.show_more": "Развернуть", "status.show_more_all": "Развернуть для всех", "status.show_thread": "Показать обсуждение", + "status.uncached_media_warning": "Not available", "status.unmute_conversation": "Снять глушение с обсуждения", "status.unpin": "Открепить от профиля", "suggestions.dismiss": "Удалить предложение", @@ -373,7 +384,7 @@ "time_remaining.moments": "остались считанные мгновения", "time_remaining.seconds": "{number, plural, one {осталась # секунду} few {осталось # секунды} many {осталось # секунд} other {осталось # секунд}}", "trends.count_by_accounts": "Популярно у {count} {rawCount, plural, one {человека} few {человек} many {человек} other {человек}}", - "trends.refresh": "Обновить", + "trends.trending_now": "Trending now", "ui.beforeunload": "Ваш черновик будет утерян, если вы покинете Mastodon.", "upload_area.title": "Перетащите сюда, чтобы загрузить", "upload_button.label": "Добавить медиаконтент", diff --git a/app/javascript/mastodon/locales/sk.json b/app/javascript/mastodon/locales/sk.json index 4a7625aae..312f63301 100644 --- a/app/javascript/mastodon/locales/sk.json +++ b/app/javascript/mastodon/locales/sk.json @@ -16,14 +16,16 @@ "account.follows.empty": "Tento užívateľ ešte nikoho nenásleduje.", "account.follows_you": "Následuje ťa", "account.hide_reblogs": "Skry vyzdvihnutia od @{name}", + "account.last_status": "Naposledy aktívny", "account.link_verified_on": "Vlastníctvo tohto odkazu bolo skontrolované {date}", "account.locked_info": "Stav súkromia pre tento účet je nastavený na zamknutý. Jeho vlastník sám prehodnocuje, kto ho môže sledovať.", "account.media": "Médiá", "account.mention": "Spomeň @{name}", "account.moved_to": "{name} sa presunul/a na:", - "account.mute": "Ignorovať @{name}", + "account.mute": "Nevšímaj si @{name}", "account.mute_notifications": "Stĺm oboznámenia od @{name}", "account.muted": "Utíšený/á", + "account.never_active": "Nikdy", "account.posts": "Príspevkov", "account.posts_with_replies": "Príspevky aj s odpoveďami", "account.report": "Nahlás @{name}", @@ -36,6 +38,8 @@ "account.unfollow": "Prestaň následovať", "account.unmute": "Prestaň ignorovať @{name}", "account.unmute_notifications": "Zruš stĺmenie oboznámení od @{name}", + "alert.rate_limited.message": "Prosím, skús to znova za {retry_time, time, medium}.", + "alert.rate_limited.title": "Tempo obmedzené", "alert.unexpected.message": "Vyskytla sa nečakaná chyba.", "alert.unexpected.title": "Ups!", "autosuggest_hashtag.per_week": "{count} týždenne", @@ -49,6 +53,7 @@ "column.blocks": "Blokovaní užívatelia", "column.community": "Miestna časová os", "column.direct": "Súkromné správy", + "column.directory": "Prehľadávaj profily", "column.domain_blocks": "Skryté domény", "column.favourites": "Obľúbené", "column.follow_requests": "Žiadosti o sledovanie", @@ -95,6 +100,8 @@ "confirmations.delete_list.message": "Si si istý/á, že chceš natrvalo vymazať tento zoznam?", "confirmations.domain_block.confirm": "Skry celú doménu", "confirmations.domain_block.message": "Si si naozaj istý/á, že chceš blokovať celú doménu {domain}? Vo väčšine prípadov stačí blokovať alebo ignorovať pár konkrétnych užívateľov, čo sa doporučuje. Neuvidíš obsah z tejto domény v žiadnej verejnej časovej osi, ani v oznámeniach. Tvoji následovníci pochádzajúci z tejto domény budú odstránení.", + "confirmations.logout.confirm": "Odhlás sa", + "confirmations.logout.message": "Si si istý/á, že sa chceš odhlásiť?", "confirmations.mute.confirm": "Ignoruj", "confirmations.mute.message": "Naozaj chceš ignorovať {name}?", "confirmations.redraft.confirm": "Vyčisti a prepíš", @@ -103,6 +110,10 @@ "confirmations.reply.message": "Odpovedaním akurát teraz prepíšeš správu, ktorú máš práve rozpísanú. Si si istý/á, že chceš pokračovať?", "confirmations.unfollow.confirm": "Nesleduj", "confirmations.unfollow.message": "Naozaj chceš prestať sledovať {name}?", + "directory.federated": "Zo známého fedivesmíru", + "directory.local": "Iba z {domain}", + "directory.new_arrivals": "Nové príchody", + "directory.recently_active": "Nedávno aktívne", "embed.instructions": "Umiestni kód uvedený nižšie pre pridanie tohto statusu na tvoju web stránku.", "embed.preview": "Tu je ako to bude vyzerať:", "emoji_button.activity": "Aktivita", @@ -158,7 +169,7 @@ "home.column_settings.basic": "Základné", "home.column_settings.show_reblogs": "Zobraziť povýšené", "home.column_settings.show_replies": "Ukázať odpovede", - "home.column_settings.update_live": "Aktualizuj v reálnom čase", + "home.column_settings.update_live": "Update in real-time", "intervals.full.days": "{number, plural, one {# deň} few {# dní} many {# dní} other {# dní}}", "intervals.full.hours": "{number, plural, one {# hodina} few {# hodín} many {# hodín} other {# hodín}}", "intervals.full.minutes": "{number, plural, one {# minúta} few {# minút} many {# minút} other {# minút}}", @@ -250,10 +261,9 @@ "navigation_bar.personal": "Osobné", "navigation_bar.pins": "Pripnuté príspevky", "navigation_bar.preferences": "Voľby", - "navigation_bar.profile_directory": "Katalóg profilov", "navigation_bar.public_timeline": "Federovaná časová os", "navigation_bar.security": "Zabezbečenie", - "notification.and_n_others": "a {count, plural,one {# ostatní} other {# ostatných}}", + "notification.and_n_others": "and {count, plural, one {# other} other {# others}}", "notification.favourite": "{name} si obľúbil/a tvoj príspevok", "notification.follow": "{name} ťa začal/a následovať", "notification.mention": "{name} ťa spomenul/a", @@ -358,6 +368,7 @@ "status.show_more": "Ukáž viac", "status.show_more_all": "Všetkým ukáž viac", "status.show_thread": "Ukáž diskusné vlákno", + "status.uncached_media_warning": "Nedostupný/é", "status.unmute_conversation": "Prestaň ignorovať konverzáciu", "status.unpin": "Odopni z profilu", "suggestions.dismiss": "Zavrhni návrh", @@ -373,7 +384,7 @@ "time_remaining.moments": "Ostáva už iba chviľka", "time_remaining.seconds": "Ostáva {number, plural, one {# sekunda} few {# sekúnd} many {# sekúnd} other {# sekúnd}}", "trends.count_by_accounts": "{count} {rawCount, plural, one {človek vraví} other {ľudia vravia}}", - "trends.refresh": "Obnov", + "trends.trending_now": "Teraz populárne", "ui.beforeunload": "Čo máš rozpísané sa stratí, ak opustíš Mastodon.", "upload_area.title": "Pretiahni a pusť pre nahratie", "upload_button.label": "Pridaj médiálny súbor (JPEG, PNG, GIF, WebM, MP4, MOV)", @@ -382,13 +393,13 @@ "upload_form.description": "Opis pre slabo vidiacich", "upload_form.edit": "Uprav", "upload_form.undo": "Vymaž", - "upload_modal.analyzing_picture": "Analyzing picture…", + "upload_modal.analyzing_picture": "Analyzujem obrázok…", "upload_modal.apply": "Použi", - "upload_modal.description_placeholder": "A quick brown fox jumps over the lazy dog", - "upload_modal.detect_text": "Detect text from picture", + "upload_modal.description_placeholder": "Rýchla hnedá líška skáče ponad lenivého psa", + "upload_modal.detect_text": "Rozpoznaj text z obrázka", "upload_modal.edit_media": "Uprav médiá", "upload_modal.hint": "Click or drag the circle on the preview to choose the focal point which will always be in view on all thumbnails.", - "upload_modal.preview_label": "Preview ({ratio})", + "upload_modal.preview_label": "Náhľad ({ratio})", "upload_progress.label": "Nahráva sa...", "video.close": "Zavri video", "video.exit_fullscreen": "Vypni zobrazenie na celú obrazovku", diff --git a/app/javascript/mastodon/locales/sl.json b/app/javascript/mastodon/locales/sl.json index 8a5a0d4bb..fa5d22fd1 100644 --- a/app/javascript/mastodon/locales/sl.json +++ b/app/javascript/mastodon/locales/sl.json @@ -16,6 +16,7 @@ "account.follows.empty": "Ta uporabnik še ne sledi nikomur.", "account.follows_you": "Sledi tebi", "account.hide_reblogs": "Skrij spodbude od @{name}", + "account.last_status": "Last active", "account.link_verified_on": "Lastništvo te povezave je bilo preverjeno {date}", "account.locked_info": "Stanje zasebnosti računa je nastavljeno na zaklenjeno. Lastnik ročno pregleda, kdo ga lahko spremlja.", "account.media": "Mediji", @@ -24,6 +25,7 @@ "account.mute": "Utišaj @{name}", "account.mute_notifications": "Utišaj obvestila od @{name}", "account.muted": "Utišan", + "account.never_active": "Never", "account.posts": "Tuti", "account.posts_with_replies": "Tuti in odgovori", "account.report": "Prijavi @{name}", @@ -36,6 +38,8 @@ "account.unfollow": "Prenehaj slediti", "account.unmute": "Odtišaj @{name}", "account.unmute_notifications": "Vklopi obvestila od @{name}", + "alert.rate_limited.message": "Please retry after {retry_time, time, medium}.", + "alert.rate_limited.title": "Rate limited", "alert.unexpected.message": "Zgodila se je nepričakovana napaka.", "alert.unexpected.title": "Uups!", "autosuggest_hashtag.per_week": "{count} per week", @@ -49,6 +53,7 @@ "column.blocks": "Blokirani uporabniki", "column.community": "Lokalna časovnica", "column.direct": "Neposredna sporočila", + "column.directory": "Browse profiles", "column.domain_blocks": "Skrite domene", "column.favourites": "Priljubljene", "column.follow_requests": "Sledi prošnjam", @@ -95,6 +100,8 @@ "confirmations.delete_list.message": "Ali ste prepričani, da želite trajno izbrisati ta seznam?", "confirmations.domain_block.confirm": "Skrij celotno domeno", "confirmations.domain_block.message": "Ali ste res, res prepričani, da želite blokirati celotno {domain}? V večini primerov je nekaj ciljnih blokiranj ali utišanj dovolj in boljše. Vsebino iz te domene ne boste videli v javnih časovnicah ali obvestilih. Vaši sledilci iz te domene bodo odstranjeni.", + "confirmations.logout.confirm": "Log out", + "confirmations.logout.message": "Are you sure you want to log out?", "confirmations.mute.confirm": "Utišanje", "confirmations.mute.message": "Ali ste prepričani, da želite utišati {name}?", "confirmations.redraft.confirm": "Izbriši in preoblikuj", @@ -103,6 +110,10 @@ "confirmations.reply.message": "Odgovarjanje bo prepisalo sporočilo, ki ga trenutno sestavljate. Ali ste prepričani, da želite nadaljevati?", "confirmations.unfollow.confirm": "Prenehaj slediti", "confirmations.unfollow.message": "Ali ste prepričani, da ne želite več slediti {name}?", + "directory.federated": "From known fediverse", + "directory.local": "From {domain} only", + "directory.new_arrivals": "New arrivals", + "directory.recently_active": "Recently active", "embed.instructions": "Vstavi ta status na svojo spletno stran tako, da kopirate spodnjo kodo.", "embed.preview": "Tako bo izgledalo:", "emoji_button.activity": "Dejavnost", @@ -158,7 +169,7 @@ "home.column_settings.basic": "Osnovno", "home.column_settings.show_reblogs": "Pokaži spodbude", "home.column_settings.show_replies": "Pokaži odgovore", - "home.column_settings.update_live": "Posodabljaj v realnem času", + "home.column_settings.update_live": "Update in real-time", "intervals.full.days": "{number, plural, one {# dan} two {# dni} few {# dni} other {# dni}}", "intervals.full.hours": "{number, plural, one {# ura} two {# uri} few {# ure} other {# ur}}", "intervals.full.minutes": "{number, plural, one {# minuta} two {# minuti} few {# minute} other {# minut}}", @@ -250,7 +261,6 @@ "navigation_bar.personal": "Osebno", "navigation_bar.pins": "Pripeti tuti", "navigation_bar.preferences": "Nastavitve", - "navigation_bar.profile_directory": "Imenik profilov", "navigation_bar.public_timeline": "Združena časovnica", "navigation_bar.security": "Varnost", "notification.and_n_others": "and {count, plural, one {# other} other {# others}}", @@ -358,6 +368,7 @@ "status.show_more": "Prikaži več", "status.show_more_all": "Prikaži več za vse", "status.show_thread": "Prikaži objavo", + "status.uncached_media_warning": "Not available", "status.unmute_conversation": "Odtišaj pogovor", "status.unpin": "Odpni iz profila", "suggestions.dismiss": "Zavrni predlog", @@ -373,7 +384,7 @@ "time_remaining.moments": "Preostali trenutki", "time_remaining.seconds": "{number, plural, one {# sekunda} other {# sekund}} je ostalo", "trends.count_by_accounts": "{count} {rawCount, plural, one {oseba} other {ljudi}} govori", - "trends.refresh": "Refresh", + "trends.trending_now": "Trending now", "ui.beforeunload": "Vaš osnutek bo izgubljen, če zapustite Mastodona.", "upload_area.title": "Za pošiljanje povlecite in spustite", "upload_button.label": "Dodaj medije ({formats})", diff --git a/app/javascript/mastodon/locales/sq.json b/app/javascript/mastodon/locales/sq.json index 9877ca93f..12f66cafd 100644 --- a/app/javascript/mastodon/locales/sq.json +++ b/app/javascript/mastodon/locales/sq.json @@ -16,6 +16,7 @@ "account.follows.empty": "Ky përdorues ende s’ndjek njeri.", "account.follows_you": "Ju ndjek", "account.hide_reblogs": "Fshih përforcime nga @{name}", + "account.last_status": "Last active", "account.link_verified_on": "Pronësia e kësaj lidhjeje qe kontrolluar më {date}", "account.locked_info": "Gjendja e privatësisë së kësaj llogarie është caktuar si e kyçur. I zoti merr dorazi në shqyrtim cilët mund ta ndjekin.", "account.media": "Media", @@ -24,6 +25,7 @@ "account.mute": "Heshtoni @{name}", "account.mute_notifications": "Heshtoji njoftimet prej @{name}", "account.muted": "Heshtuar", + "account.never_active": "Never", "account.posts": "Mesazhe", "account.posts_with_replies": "Mesazhe dhe përgjigje", "account.report": "Raportojeni @{name}", @@ -36,6 +38,8 @@ "account.unfollow": "Resht së ndjekuri", "account.unmute": "Ktheji zërin @{name}", "account.unmute_notifications": "Hiqua ndalimin e shfaqjes njoftimeve nga @{name}", + "alert.rate_limited.message": "Please retry after {retry_time, time, medium}.", + "alert.rate_limited.title": "Rate limited", "alert.unexpected.message": "Ndodhi një gabim të papritur.", "alert.unexpected.title": "Hëm!", "autosuggest_hashtag.per_week": "{count} per week", @@ -49,6 +53,7 @@ "column.blocks": "Përdorues të bllokuar", "column.community": "Rrjedhë kohore vendore", "column.direct": "Mesazhe të drejtpërdrejta", + "column.directory": "Browse profiles", "column.domain_blocks": "Përkatësi të fshehura", "column.favourites": "Të parapëlqyer", "column.follow_requests": "Kërkesa për ndjekje", @@ -95,6 +100,8 @@ "confirmations.delete_list.message": "Jeni i sigurt që doni të fshihet përgjithmonë kjo listë?", "confirmations.domain_block.confirm": "Fshih krejt përkatësinë", "confirmations.domain_block.message": "Jeni i sigurt, shumë i sigurt se doni të bllokohet krejt {domain}? Në shumicën e rasteve, ndoca bllokime ose heshtime me synim të caktuar janë të mjaftueshme dhe të parapëlqyera. S’keni për të parë lëndë nga kjo përkatësi në ndonjë rrjedhë kohore publike, apo te njoftimet tuaja. Ndjekësit tuaj prej asaj përkatësie do të hiqen.", + "confirmations.logout.confirm": "Log out", + "confirmations.logout.message": "Are you sure you want to log out?", "confirmations.mute.confirm": "Heshtoje", "confirmations.mute.message": "Jeni i sigurt se doni të heshtohet {name}?", "confirmations.redraft.confirm": "Fshijeni & rihartojeni", @@ -103,6 +110,10 @@ "confirmations.reply.message": "Përgjigja tani do të shkaktojë mbishkrimin e mesazhit që po hartoni. Jeni i sigurt se doni të vazhdohet më tej?", "confirmations.unfollow.confirm": "Resht së ndjekuri", "confirmations.unfollow.message": "Jeni i sigurt se doni të mos ndiqet më {name}?", + "directory.federated": "From known fediverse", + "directory.local": "From {domain} only", + "directory.new_arrivals": "New arrivals", + "directory.recently_active": "Recently active", "embed.instructions": "Trupëzojeni këtë gjendje në sajtin tuaj duke kopjuar kodin më poshtë.", "embed.preview": "Ja si do të duket:", "emoji_button.activity": "Veprimtari", @@ -250,7 +261,6 @@ "navigation_bar.personal": "Personale", "navigation_bar.pins": "Mesazhe të fiksuar", "navigation_bar.preferences": "Parapëlqime", - "navigation_bar.profile_directory": "Profile directory", "navigation_bar.public_timeline": "Rrjedhë kohore të federuarish", "navigation_bar.security": "Siguri", "notification.and_n_others": "and {count, plural, one {# other} other {# others}}", @@ -358,6 +368,7 @@ "status.show_more": "Shfaq më tepër", "status.show_more_all": "Shfaq më tepër për të tërë", "status.show_thread": "Shfaq rrjedhën", + "status.uncached_media_warning": "Not available", "status.unmute_conversation": "Ktheji zërin bisedës", "status.unpin": "Shfiksoje nga profili", "suggestions.dismiss": "Mos e merr parasysh sugjerimin", @@ -373,7 +384,7 @@ "time_remaining.moments": "Moments remaining", "time_remaining.seconds": "{number, plural, one {# second} other {# seconds}} left", "trends.count_by_accounts": "{count} {rawCount, plural, një {person} {people} të tjerë} po flasin", - "trends.refresh": "Refresh", + "trends.trending_now": "Trending now", "ui.beforeunload": "Skica juaj do të humbë nëse dilni nga Mastodon-i.", "upload_area.title": "Merreni & vëreni që të ngarkohet", "upload_button.label": "Shtoni media (JPEG, PNG, GIF, WebM, MP4, MOV)", diff --git a/app/javascript/mastodon/locales/sr-Latn.json b/app/javascript/mastodon/locales/sr-Latn.json index e60e2c7e8..72ea3490f 100644 --- a/app/javascript/mastodon/locales/sr-Latn.json +++ b/app/javascript/mastodon/locales/sr-Latn.json @@ -16,6 +16,7 @@ "account.follows.empty": "This user doesn't follow anyone yet.", "account.follows_you": "Prati Vas", "account.hide_reblogs": "Sakrij podrške koje daje korisnika @{name}", + "account.last_status": "Last active", "account.link_verified_on": "Ownership of this link was checked on {date}", "account.locked_info": "This account privacy status is set to locked. The owner manually reviews who can follow them.", "account.media": "Mediji", @@ -24,6 +25,7 @@ "account.mute": "Ućutkaj korisnika @{name}", "account.mute_notifications": "Isključi obaveštenja od korisnika @{name}", "account.muted": "Muted", + "account.never_active": "Never", "account.posts": "Statusa", "account.posts_with_replies": "Toots with replies", "account.report": "Prijavi @{name}", @@ -36,6 +38,8 @@ "account.unfollow": "Otprati", "account.unmute": "Ukloni ućutkavanje korisniku @{name}", "account.unmute_notifications": "Uključi nazad obaveštenja od korisnika @{name}", + "alert.rate_limited.message": "Please retry after {retry_time, time, medium}.", + "alert.rate_limited.title": "Rate limited", "alert.unexpected.message": "An unexpected error occurred.", "alert.unexpected.title": "Oops!", "autosuggest_hashtag.per_week": "{count} per week", @@ -49,6 +53,7 @@ "column.blocks": "Blokirani korisnici", "column.community": "Lokalna lajna", "column.direct": "Direct messages", + "column.directory": "Browse profiles", "column.domain_blocks": "Hidden domains", "column.favourites": "Omiljeni", "column.follow_requests": "Zahtevi za praćenje", @@ -95,6 +100,8 @@ "confirmations.delete_list.message": "Da li ste sigurni da želite da bespovratno obrišete ovu listu?", "confirmations.domain_block.confirm": "Sakrij ceo domen", "confirmations.domain_block.message": "Da li ste stvarno, stvarno sigurno da želite da blokirate ceo domen {domain}? U većini slučajeva, par dobrih blokiranja ili ućutkavanja su dovoljna i preporučljiva.", + "confirmations.logout.confirm": "Log out", + "confirmations.logout.message": "Are you sure you want to log out?", "confirmations.mute.confirm": "Ućutkaj", "confirmations.mute.message": "Da li stvarno želite da ućutkate korisnika {name}?", "confirmations.redraft.confirm": "Delete & redraft", @@ -103,6 +110,10 @@ "confirmations.reply.message": "Replying now will overwrite the message you are currently composing. Are you sure you want to proceed?", "confirmations.unfollow.confirm": "Otprati", "confirmations.unfollow.message": "Da li ste sigurni da želite da otpratite korisnika {name}?", + "directory.federated": "From known fediverse", + "directory.local": "From {domain} only", + "directory.new_arrivals": "New arrivals", + "directory.recently_active": "Recently active", "embed.instructions": "Ugradi ovaj status na Vaš veb sajt kopiranjem koda ispod.", "embed.preview": "Ovako će da izgleda:", "emoji_button.activity": "Aktivnost", @@ -250,7 +261,6 @@ "navigation_bar.personal": "Personal", "navigation_bar.pins": "Prikačeni tutovi", "navigation_bar.preferences": "Podešavanja", - "navigation_bar.profile_directory": "Profile directory", "navigation_bar.public_timeline": "Federisana lajna", "navigation_bar.security": "Security", "notification.and_n_others": "and {count, plural, one {# other} other {# others}}", @@ -358,6 +368,7 @@ "status.show_more": "Prikaži više", "status.show_more_all": "Show more for all", "status.show_thread": "Show thread", + "status.uncached_media_warning": "Not available", "status.unmute_conversation": "Uključi prepisku", "status.unpin": "Otkači sa profila", "suggestions.dismiss": "Dismiss suggestion", @@ -373,7 +384,7 @@ "time_remaining.moments": "Moments remaining", "time_remaining.seconds": "{number, plural, one {# second} other {# seconds}} left", "trends.count_by_accounts": "{count} {rawCount, plural, one {person} other {people}} talking", - "trends.refresh": "Refresh", + "trends.trending_now": "Trending now", "ui.beforeunload": "Ako napustite Mastodont, izgubićete napisani nacrt.", "upload_area.title": "Prevucite ovde da otpremite", "upload_button.label": "Dodaj multimediju", diff --git a/app/javascript/mastodon/locales/sr.json b/app/javascript/mastodon/locales/sr.json index 82833630c..c77927ec1 100644 --- a/app/javascript/mastodon/locales/sr.json +++ b/app/javascript/mastodon/locales/sr.json @@ -16,6 +16,7 @@ "account.follows.empty": "Корисник тренутно не прати никога.", "account.follows_you": "Прати Вас", "account.hide_reblogs": "Сакриј подршке које даје корисника @{name}", + "account.last_status": "Last active", "account.link_verified_on": "Ownership of this link was checked on {date}", "account.locked_info": "This account privacy status is set to locked. The owner manually reviews who can follow them.", "account.media": "Медији", @@ -24,6 +25,7 @@ "account.mute": "Ућуткај корисника @{name}", "account.mute_notifications": "Искључи обавештења од корисника @{name}", "account.muted": "Ућуткан", + "account.never_active": "Never", "account.posts": "Трубе", "account.posts_with_replies": "Трубе и одговори", "account.report": "Пријави @{name}", @@ -36,6 +38,8 @@ "account.unfollow": "Отпрати", "account.unmute": "Уклони ућуткавање кориснику @{name}", "account.unmute_notifications": "Укључи назад обавештења од корисника @{name}", + "alert.rate_limited.message": "Please retry after {retry_time, time, medium}.", + "alert.rate_limited.title": "Rate limited", "alert.unexpected.message": "Појавила се неочекивана грешка.", "alert.unexpected.title": "Упс!", "autosuggest_hashtag.per_week": "{count} per week", @@ -49,6 +53,7 @@ "column.blocks": "Блокирани корисници", "column.community": "Локална временска линија", "column.direct": "Директне поруке", + "column.directory": "Browse profiles", "column.domain_blocks": "Скривени домени", "column.favourites": "Омиљене", "column.follow_requests": "Захтеви за праћење", @@ -95,6 +100,8 @@ "confirmations.delete_list.message": "Да ли сте сигурни да желите да бесповратно обришете ову листу?", "confirmations.domain_block.confirm": "Сакриј цео домен", "confirmations.domain_block.message": "Да ли сте заиста сигурни да желите да блокирате цео домен {domain}? У већини случајева, неколико добро промишљених блокирања или ућуткавања су довољна и препоручљива.", + "confirmations.logout.confirm": "Log out", + "confirmations.logout.message": "Are you sure you want to log out?", "confirmations.mute.confirm": "Ућуткај", "confirmations.mute.message": "Да ли стварно желите да ућуткате корисника {name}?", "confirmations.redraft.confirm": "Избриши и преправи", @@ -103,6 +110,10 @@ "confirmations.reply.message": "Replying now will overwrite the message you are currently composing. Are you sure you want to proceed?", "confirmations.unfollow.confirm": "Отпрати", "confirmations.unfollow.message": "Да ли сте сигурни да желите да отпратите корисника {name}?", + "directory.federated": "From known fediverse", + "directory.local": "From {domain} only", + "directory.new_arrivals": "New arrivals", + "directory.recently_active": "Recently active", "embed.instructions": "Угради овај статус на Ваш веб сајт копирањем кода испод.", "embed.preview": "Овако ће да изгледа:", "emoji_button.activity": "Активност", @@ -250,7 +261,6 @@ "navigation_bar.personal": "Personal", "navigation_bar.pins": "Прикачене трубе", "navigation_bar.preferences": "Подешавања", - "navigation_bar.profile_directory": "Profile directory", "navigation_bar.public_timeline": "Здружена временска линија", "navigation_bar.security": "Безбедност", "notification.and_n_others": "and {count, plural, one {# other} other {# others}}", @@ -358,6 +368,7 @@ "status.show_more": "Прикажи више", "status.show_more_all": "Прикажи више за све", "status.show_thread": "Show thread", + "status.uncached_media_warning": "Not available", "status.unmute_conversation": "Укључи преписку", "status.unpin": "Откачи са профила", "suggestions.dismiss": "Dismiss suggestion", @@ -373,7 +384,7 @@ "time_remaining.moments": "Moments remaining", "time_remaining.seconds": "{number, plural, one {# second} other {# seconds}} left", "trends.count_by_accounts": "{count} {rawCount, plural, one {човек} other {људи}} прича", - "trends.refresh": "Refresh", + "trends.trending_now": "Trending now", "ui.beforeunload": "Ако напустите Мастодонт, изгубићете написани нацрт.", "upload_area.title": "Превуците овде да отпремите", "upload_button.label": "Додај мултимедију (JPEG, PNG, GIF, WebM, MP4, MOV)", diff --git a/app/javascript/mastodon/locales/sv.json b/app/javascript/mastodon/locales/sv.json index db28900ba..6783da15d 100644 --- a/app/javascript/mastodon/locales/sv.json +++ b/app/javascript/mastodon/locales/sv.json @@ -16,6 +16,7 @@ "account.follows.empty": "Den här användaren följer inte någon ännu.", "account.follows_you": "Följer dig", "account.hide_reblogs": "Dölj knuffar från @{name}", + "account.last_status": "Last active", "account.link_verified_on": "Ägarskapet för det här kontot kontrollerades den {date}", "account.locked_info": "This account privacy status is set to locked. The owner manually reviews who can follow them.", "account.media": "Media", @@ -24,6 +25,7 @@ "account.mute": "Tysta @{name}", "account.mute_notifications": "Stäng av notifieringar från @{name}", "account.muted": "Tystad", + "account.never_active": "Never", "account.posts": "Inlägg", "account.posts_with_replies": "Toots och svar", "account.report": "Rapportera @{name}", @@ -36,6 +38,8 @@ "account.unfollow": "Sluta följa", "account.unmute": "Sluta tysta @{name}", "account.unmute_notifications": "Återaktivera notifikationer från @{name}", + "alert.rate_limited.message": "Please retry after {retry_time, time, medium}.", + "alert.rate_limited.title": "Rate limited", "alert.unexpected.message": "Ett oväntat fel uppstod.", "alert.unexpected.title": "Hoppsan!", "autosuggest_hashtag.per_week": "{count} per week", @@ -49,6 +53,7 @@ "column.blocks": "Blockerade användare", "column.community": "Lokal tidslinje", "column.direct": "Direktmeddelanden", + "column.directory": "Browse profiles", "column.domain_blocks": "Dolda domäner", "column.favourites": "Favoriter", "column.follow_requests": "Följförfrågningar", @@ -95,6 +100,8 @@ "confirmations.delete_list.message": "Är du säker på att du vill radera denna lista permanent?", "confirmations.domain_block.confirm": "Dölj hela domänen", "confirmations.domain_block.message": "Är du verkligen säker på att du vill blockera hela {domain}? I de flesta fall är några riktade blockeringar eller nedtystade konton tillräckligt och att föredra. Du kommer sluta se innehåll från {domain}-domänen i den allmänna tidslinjen och i dina egna notifieringar. Du kommer även sluta följa alla eventuella följare du har från {domain}.", + "confirmations.logout.confirm": "Log out", + "confirmations.logout.message": "Are you sure you want to log out?", "confirmations.mute.confirm": "Tysta", "confirmations.mute.message": "Är du säker du vill tysta ner {name}?", "confirmations.redraft.confirm": "Radera och gör om", @@ -103,6 +110,10 @@ "confirmations.reply.message": "Om du svarar nu kommer det att ersätta meddelandet du håller på att skriva. Är du säker på att du vill fortsätta?", "confirmations.unfollow.confirm": "Sluta följa", "confirmations.unfollow.message": "Är du säker på att du vill sluta följa {name}?", + "directory.federated": "From known fediverse", + "directory.local": "From {domain} only", + "directory.new_arrivals": "New arrivals", + "directory.recently_active": "Recently active", "embed.instructions": "Bädda in den här statusen på din webbplats genom att kopiera koden nedan.", "embed.preview": "Så här kommer det att se ut:", "emoji_button.activity": "Aktivitet", @@ -158,7 +169,7 @@ "home.column_settings.basic": "Grundläggande", "home.column_settings.show_reblogs": "Visa knuffar", "home.column_settings.show_replies": "Visa svar", - "home.column_settings.update_live": "Uppdatera i realtid", + "home.column_settings.update_live": "Update in real-time", "intervals.full.days": "{number, plural, one {# dag} other {# dagar}}", "intervals.full.hours": "{hours, plural, one {# timme} other {# timmar}}", "intervals.full.minutes": "{minutes, plural, one {1 minut} other {# minuter}}", @@ -250,7 +261,6 @@ "navigation_bar.personal": "Personal", "navigation_bar.pins": "Nålade inlägg (toots)", "navigation_bar.preferences": "Inställningar", - "navigation_bar.profile_directory": "Profile directory", "navigation_bar.public_timeline": "Förenad tidslinje", "navigation_bar.security": "Säkerhet", "notification.and_n_others": "and {count, plural, one {# other} other {# others}}", @@ -358,6 +368,7 @@ "status.show_more": "Visa mer", "status.show_more_all": "Visa mer för alla", "status.show_thread": "Visa tråd", + "status.uncached_media_warning": "Not available", "status.unmute_conversation": "Öppna konversation", "status.unpin": "Ångra fäst i profil", "suggestions.dismiss": "Dismiss suggestion", @@ -373,7 +384,7 @@ "time_remaining.moments": "Moments remaining", "time_remaining.seconds": "{hours, plural, one {# sekund} other {# sekunder}} kvar", "trends.count_by_accounts": "{count} {rawCount, plural, en {person} andra {people}} pratar", - "trends.refresh": "Refresh", + "trends.trending_now": "Trending now", "ui.beforeunload": "Ditt utkast kommer att förloras om du lämnar Mastodon.", "upload_area.title": "Dra & släpp för att ladda upp", "upload_button.label": "Lägg till media", diff --git a/app/javascript/mastodon/locales/ta.json b/app/javascript/mastodon/locales/ta.json index 7fa7db98b..3266102b1 100644 --- a/app/javascript/mastodon/locales/ta.json +++ b/app/javascript/mastodon/locales/ta.json @@ -16,6 +16,7 @@ "account.follows.empty": "இந்த பயனர் இதுவரை யாரையும் பின்தொடரவில்லை.", "account.follows_you": "நீ பின் தொடர்கிறாய்", "account.hide_reblogs": "இருந்து ஊக்கியாக மறை @{name}", + "account.last_status": "Last active", "account.link_verified_on": "இந்த இணைப்பை உரிமையாளர் சரிபார்க்கப்பட்டது {date}", "account.locked_info": "இந்தக் கணக்கு தனியுரிமை நிலை பூட்டப்பட்டுள்ளது. அவர்களைப் பின்தொடர்பவர் யார் என்பதை உரிமையாளர் கைமுறையாக மதிப்பாய்வு செய்கிறார்.", "account.media": "Media", @@ -24,6 +25,7 @@ "account.mute": "ஊமையான @{name}", "account.mute_notifications": "அறிவிப்புகளை முடக்கு @{name}", "account.muted": "முடக்கியது", + "account.never_active": "Never", "account.posts": "Toots", "account.posts_with_replies": "Toots மற்றும் பதில்கள்", "account.report": "Report @{name}", @@ -36,6 +38,8 @@ "account.unfollow": "பின்தொடராட்", "account.unmute": "தடுப்புநீக்கு @{name}", "account.unmute_notifications": "அறிவிப்புகளை அகற்றவும் @{name}", + "alert.rate_limited.message": "Please retry after {retry_time, time, medium}.", + "alert.rate_limited.title": "Rate limited", "alert.unexpected.message": "எதிர் பாராத பிழை ஏற்பட்டு விட்டது.", "alert.unexpected.title": "அச்சச்சோ!", "autosuggest_hashtag.per_week": "{count} per week", @@ -49,6 +53,7 @@ "column.blocks": "தடுக்கப்பட்ட பயனர்கள்", "column.community": "உள்ளூர் காலக்கெடு", "column.direct": "நேரடி செய்திகள்", + "column.directory": "Browse profiles", "column.domain_blocks": "மறைந்த களங்கள்", "column.favourites": "விருப்பத்துக்குகந்த", "column.follow_requests": "கோரிக்கைகளை பின்பற்றவும்", @@ -95,6 +100,8 @@ "confirmations.delete_list.message": "இந்த பட்டியலில் நிரந்தரமாக நீக்க விரும்புகிறீர்களா?", "confirmations.domain_block.confirm": "முழு டொமைனை மறை", "confirmations.domain_block.message": "நீங்கள் உண்மையில், நிச்சயமாக நீங்கள் முழு தடுக்க வேண்டும் நிச்சயமாக {domain}? பெரும்பாலான சந்தர்ப்பங்களில் ஒரு சில இலக்குகள் அல்லது மியூட்கள் போதுமானவை மற்றும் சிறந்தவை. எந்த பொது நேரத்திலும் அல்லது உங்கள் அறிவிப்புகளிலும் அந்தக் களத்திலிருந்து உள்ளடக்கத்தை நீங்கள் பார்க்க மாட்டீர்கள். அந்த களத்தில் இருந்து உங்கள் ஆதரவாளர்கள் அகற்றப்படுவார்கள்.", + "confirmations.logout.confirm": "Log out", + "confirmations.logout.message": "Are you sure you want to log out?", "confirmations.mute.confirm": "ஊமையான", "confirmations.mute.message": "நிச்சயமாக நீங்கள் முடக்க விரும்புகிறீர்களா {name}?", "confirmations.redraft.confirm": "நீக்கு & redraft", @@ -103,6 +110,10 @@ "confirmations.reply.message": "இப்போது பதில், தற்போது நீங்கள் உருவாக்கும் செய்தி மேலெழுதப்படும். நீங்கள் தொடர விரும்புகிறீர்களா?", "confirmations.unfollow.confirm": "பின்தொடராட்", "confirmations.unfollow.message": "நிச்சயமாக நீங்கள் பின்தொடர விரும்புகிறீர்களா {name}?", + "directory.federated": "From known fediverse", + "directory.local": "From {domain} only", + "directory.new_arrivals": "New arrivals", + "directory.recently_active": "Recently active", "embed.instructions": "கீழே உள்ள குறியீட்டை நகலெடுப்பதன் மூலம் உங்கள் இணையதளத்தில் இந்த நிலையை உட்பொதிக்கவும்.", "embed.preview": "இது போன்ற தோற்றத்தை இங்கு காணலாம்:", "emoji_button.activity": "நடவடிக்கை", @@ -250,7 +261,6 @@ "navigation_bar.personal": "Personal", "navigation_bar.pins": "பொருத்தப்பட்டன toots", "navigation_bar.preferences": "விருப்பங்கள்", - "navigation_bar.profile_directory": "Profile directory", "navigation_bar.public_timeline": "கூட்டாட்சி காலக்கெடு", "navigation_bar.security": "பத்திரம்", "notification.and_n_others": "and {count, plural, one {# other} other {# others}}", @@ -358,6 +368,7 @@ "status.show_more": "மேலும் காட்ட", "status.show_more_all": "அனைவருக்கும் மேலும் காட்டு", "status.show_thread": "நூல் காட்டு", + "status.uncached_media_warning": "Not available", "status.unmute_conversation": "ஊமையாக உரையாடல் இல்லை", "status.unpin": "சுயவிவரத்திலிருந்து நீக்கவும்", "suggestions.dismiss": "பரிந்துரை விலக்க", @@ -373,7 +384,7 @@ "time_remaining.moments": "தருணங்கள் மீதமுள்ளன", "time_remaining.seconds": "{number, plural, one {# second} மற்ற {# seconds}} left", "trends.count_by_accounts": "{count} {rawCount, plural, one {person} மற்ற {people}} உரையாடு", - "trends.refresh": "Refresh", + "trends.trending_now": "Trending now", "ui.beforeunload": "நீங்கள் வெளியே சென்றால் உங்கள் வரைவு இழக்கப்படும் மஸ்தோடோன்.", "upload_area.title": "பதிவேற்ற & இழுக்கவும்", "upload_button.label": "மீடியாவைச் சேர்க்கவும் (JPEG, PNG, GIF, WebM, MP4, MOV)", diff --git a/app/javascript/mastodon/locales/te.json b/app/javascript/mastodon/locales/te.json index 0f7a617bb..ee7293aa7 100644 --- a/app/javascript/mastodon/locales/te.json +++ b/app/javascript/mastodon/locales/te.json @@ -16,6 +16,7 @@ "account.follows.empty": "ఈ వినియోగదారి ఇంకా ఎవరినీ అనుసరించడంలేదు.", "account.follows_you": "మిమ్మల్ని అనుసరిస్తున్నారు", "account.hide_reblogs": "@{name} నుంచి బూస్ట్ లను దాచిపెట్టు", + "account.last_status": "Last active", "account.link_verified_on": "ఈ లంకె యొక్క యాజమాన్యం {date}న పరీక్షించబడింది", "account.locked_info": "ఈ ఖాతా యొక్క గోప్యత స్థితి లాక్ చేయబడి వుంది. ఈ ఖాతాను ఎవరు అనుసరించవచ్చో యజమానే నిర్ణయం తీసుకుంటారు.", "account.media": "మీడియా", @@ -24,6 +25,7 @@ "account.mute": "@{name}ను మ్యూట్ చెయ్యి", "account.mute_notifications": "@{name}నుంచి ప్రకటనలను మ్యూట్ చెయ్యి", "account.muted": "మ్యూట్ అయినవి", + "account.never_active": "Never", "account.posts": "టూట్లు", "account.posts_with_replies": "టూట్లు మరియు ప్రత్యుత్తరములు", "account.report": "@{name}పై ఫిర్యాదుచేయు", @@ -36,6 +38,8 @@ "account.unfollow": "అనుసరించవద్దు", "account.unmute": "@{name}పై మ్యూట్ ని తొలగించు", "account.unmute_notifications": "@{name} నుంచి ప్రకటనలపై మ్యూట్ ని తొలగించు", + "alert.rate_limited.message": "Please retry after {retry_time, time, medium}.", + "alert.rate_limited.title": "Rate limited", "alert.unexpected.message": "అనుకోని తప్పు జరిగినది.", "alert.unexpected.title": "అయ్యో!", "autosuggest_hashtag.per_week": "{count} per week", @@ -49,6 +53,7 @@ "column.blocks": "బ్లాక్ చేయబడిన వినియోగదారులు", "column.community": "స్థానిక కాలక్రమం", "column.direct": "ప్రత్యక్ష సందేశాలు", + "column.directory": "Browse profiles", "column.domain_blocks": "దాచిన డొమైన్లు", "column.favourites": "ఇష్టపడినవి", "column.follow_requests": "అనుసరించడానికి అభ్యర్ధనలు", @@ -95,6 +100,8 @@ "confirmations.delete_list.message": "మీరు ఖచ్చితంగా ఈ జాబితాను శాశ్వతంగా తొలగించాలనుకుంటున్నారా?", "confirmations.domain_block.confirm": "మొత్తం డొమైన్ను దాచు", "confirmations.domain_block.message": "మీరు నిజంగా నిజంగా మొత్తం {domain} ని బ్లాక్ చేయాలనుకుంటున్నారా? చాలా సందర్భాలలో కొన్ని లక్ష్యంగా ఉన్న బ్లాక్స్ లేదా మ్యూట్స్ సరిపోతాయి మరియు ఉత్తమమైనవి. మీరు ఆ డొమైన్ నుండి కంటెంట్ను ఏ ప్రజా కాలక్రమాలలో లేదా మీ నోటిఫికేషన్లలో చూడలేరు. ఆ డొమైన్ నుండి మీ అనుచరులు తీసివేయబడతారు.", + "confirmations.logout.confirm": "Log out", + "confirmations.logout.message": "Are you sure you want to log out?", "confirmations.mute.confirm": "మ్యూట్ చేయి", "confirmations.mute.message": "{name}ను మీరు ఖచ్చితంగా మ్యూట్ చేయాలనుకుంటున్నారా?", "confirmations.redraft.confirm": "తొలగించు & తిరగరాయు", @@ -103,6 +110,10 @@ "confirmations.reply.message": "ఇప్పుడే ప్రత్యుత్తరం ఇస్తే మీరు ప్రస్తుతం వ్రాస్తున్న సందేశం తిరగరాయబడుతుంది. మీరు ఖచ్చితంగా కొనసాగించాలనుకుంటున్నారా?", "confirmations.unfollow.confirm": "అనుసరించవద్దు", "confirmations.unfollow.message": "{name}ను మీరు ఖచ్చితంగా అనుసరించవద్దనుకుంటున్నారా?", + "directory.federated": "From known fediverse", + "directory.local": "From {domain} only", + "directory.new_arrivals": "New arrivals", + "directory.recently_active": "Recently active", "embed.instructions": "దిగువ కోడ్ను కాపీ చేయడం ద్వారా మీ వెబ్సైట్లో ఈ స్టేటస్ ని పొందుపరచండి.", "embed.preview": "అది ఈ క్రింది విధంగా కనిపిస్తుంది:", "emoji_button.activity": "కార్యకలాపాలు", @@ -250,7 +261,6 @@ "navigation_bar.personal": "వ్యక్తిగతం", "navigation_bar.pins": "అతికించిన టూట్లు", "navigation_bar.preferences": "ప్రాధాన్యతలు", - "navigation_bar.profile_directory": "Profile directory", "navigation_bar.public_timeline": "సమాఖ్య కాలక్రమం", "navigation_bar.security": "భద్రత", "notification.and_n_others": "and {count, plural, one {# other} other {# others}}", @@ -358,6 +368,7 @@ "status.show_more": "ఇంకా చూపించు", "status.show_more_all": "అన్నిటికీ ఇంకా చూపించు", "status.show_thread": "గొలుసును చూపించు", + "status.uncached_media_warning": "Not available", "status.unmute_conversation": "సంభాషణను అన్మ్యూట్ చేయి", "status.unpin": "ప్రొఫైల్ నుండి పీకివేయు", "suggestions.dismiss": "సూచనను రద్దు చేయి", @@ -373,7 +384,7 @@ "time_remaining.moments": "కొన్ని క్షణాలు మాత్రమే మిగిలి ఉన్నాయి", "time_remaining.seconds": "{number, plural, one {# second} other {# seconds}} left", "trends.count_by_accounts": "{count} {rawCount, plural, one {person} other {people}} మాట్లాడుతున్నారు", - "trends.refresh": "Refresh", + "trends.trending_now": "Trending now", "ui.beforeunload": "మీరు మాస్టొడొన్ను వదిలివేస్తే మీ డ్రాఫ్ట్లు పోతాయి.", "upload_area.title": "అప్లోడ్ చేయడానికి డ్రాగ్ & డ్రాప్ చేయండి", "upload_button.label": "మీడియాను జోడించండి (JPEG, PNG, GIF, WebM, MP4, MOV)", diff --git a/app/javascript/mastodon/locales/th.json b/app/javascript/mastodon/locales/th.json index 5bf79ded8..3ff56f947 100644 --- a/app/javascript/mastodon/locales/th.json +++ b/app/javascript/mastodon/locales/th.json @@ -4,7 +4,7 @@ "account.block": "ปิดกั้น @{name}", "account.block_domain": "ซ่อนทุกอย่างจาก {domain}", "account.blocked": "ปิดกั้นอยู่", - "account.cancel_follow_request": "Cancel follow request", + "account.cancel_follow_request": "ยกเลิกคำขอติดตาม", "account.direct": "ส่งข้อความโดยตรงถึง @{name}", "account.domain_blocked": "ซ่อนโดเมนอยู่", "account.edit_profile": "แก้ไขโปรไฟล์", @@ -16,6 +16,7 @@ "account.follows.empty": "ผู้ใช้นี้ยังไม่ได้ติดตามใคร", "account.follows_you": "ติดตามคุณ", "account.hide_reblogs": "ซ่อนการดันจาก @{name}", + "account.last_status": "Last active", "account.link_verified_on": "ตรวจสอบความเป็นเจ้าของของลิงก์นี้เมื่อ {date}", "account.locked_info": "มีการตั้งสถานะความเป็นส่วนตัวของบัญชีนี้เป็นล็อคอยู่ เจ้าของตรวจทานผู้ที่สามารถติดตามเขาด้วยตนเอง", "account.media": "สื่อ", @@ -24,6 +25,7 @@ "account.mute": "ปิดเสียง @{name}", "account.mute_notifications": "ปิดเสียงการแจ้งเตือนจาก @{name}", "account.muted": "ปิดเสียงอยู่", + "account.never_active": "Never", "account.posts": "โพสต์", "account.posts_with_replies": "โพสต์และการตอบกลับ", "account.report": "รายงาน @{name}", @@ -36,9 +38,11 @@ "account.unfollow": "เลิกติดตาม", "account.unmute": "เลิกปิดเสียง @{name}", "account.unmute_notifications": "เลิกปิดเสียงการแจ้งเตือนจาก @{name}", + "alert.rate_limited.message": "Please retry after {retry_time, time, medium}.", + "alert.rate_limited.title": "Rate limited", "alert.unexpected.message": "เกิดข้อผิดพลาดที่ไม่คาดคิด", "alert.unexpected.title": "อุปส์!", - "autosuggest_hashtag.per_week": "{count} per week", + "autosuggest_hashtag.per_week": "{count} ต่อสัปดาห์", "boost_modal.combo": "คุณสามารถกด {combo} เพื่อข้ามสิ่งนี้ในครั้งถัดไป", "bundle_column_error.body": "มีบางอย่างผิดพลาดขณะโหลดส่วนประกอบนี้", "bundle_column_error.retry": "ลองอีกครั้ง", @@ -49,6 +53,7 @@ "column.blocks": "ผู้ใช้ที่ปิดกั้นอยู่", "column.community": "เส้นเวลาในเว็บ", "column.direct": "ข้อความโดยตรง", + "column.directory": "Browse profiles", "column.domain_blocks": "โดเมนที่ซ่อนอยู่", "column.favourites": "รายการโปรด", "column.follow_requests": "คำขอติดตาม", @@ -95,6 +100,8 @@ "confirmations.delete_list.message": "คุณแน่ใจหรือไม่ว่าต้องการลบรายการนี้อย่างถาวร?", "confirmations.domain_block.confirm": "ซ่อนทั้งโดเมน", "confirmations.domain_block.message": "Are you really, really sure you want to block the entire {domain}? In most cases a few targeted blocks or mutes are sufficient and preferable.", + "confirmations.logout.confirm": "Log out", + "confirmations.logout.message": "Are you sure you want to log out?", "confirmations.mute.confirm": "ปิดเสียง", "confirmations.mute.message": "คุณแน่ใจหรือไม่ว่าต้องการปิดเสียง {name}?", "confirmations.redraft.confirm": "ลบแล้วร่างใหม่", @@ -103,6 +110,10 @@ "confirmations.reply.message": "การตอบกลับตอนนี้จะเขียนทับข้อความที่คุณกำลังเขียน คุณแน่ใจหรือไม่ว่าต้องการดำเนินการต่อ?", "confirmations.unfollow.confirm": "เลิกติดตาม", "confirmations.unfollow.message": "คุณแน่ใจหรือไม่ว่าต้องการเลิกติดตาม {name}?", + "directory.federated": "From known fediverse", + "directory.local": "From {domain} only", + "directory.new_arrivals": "New arrivals", + "directory.recently_active": "Recently active", "embed.instructions": "ฝังสถานะนี้ในเว็บไซต์ของคุณโดยคัดลอกโค้ดด้านล่าง", "embed.preview": "นี่คือลักษณะที่จะปรากฏ:", "emoji_button.activity": "กิจกรรม", @@ -158,7 +169,7 @@ "home.column_settings.basic": "พื้นฐาน", "home.column_settings.show_reblogs": "แสดงการดัน", "home.column_settings.show_replies": "แสดงการตอบกลับ", - "home.column_settings.update_live": "อัปเดตตามเวลาจริง", + "home.column_settings.update_live": "Update in real-time", "intervals.full.days": "{number, plural, other {# วัน}}", "intervals.full.hours": "{number, plural, other {# ชั่วโมง}}", "intervals.full.minutes": "{number, plural, other {# นาที}}", @@ -250,7 +261,6 @@ "navigation_bar.personal": "ส่วนบุคคล", "navigation_bar.pins": "โพสต์ที่ปักหมุด", "navigation_bar.preferences": "การกำหนดลักษณะ", - "navigation_bar.profile_directory": "ไดเรกทอรีโปรไฟล์", "navigation_bar.public_timeline": "เส้นเวลาที่ติดต่อกับภายนอก", "navigation_bar.security": "ความปลอดภัย", "notification.and_n_others": "and {count, plural, one {# other} other {# others}}", @@ -358,6 +368,7 @@ "status.show_more": "แสดงเพิ่มเติม", "status.show_more_all": "แสดงเพิ่มเติมทั้งหมด", "status.show_thread": "แสดงกระทู้", + "status.uncached_media_warning": "Not available", "status.unmute_conversation": "เลิกปิดเสียงการสนทนา", "status.unpin": "ถอนหมุดจากโปรไฟล์", "suggestions.dismiss": "ยกเลิกข้อเสนอแนะ", @@ -372,23 +383,23 @@ "time_remaining.minutes": "เหลืออีก {number, plural, other {# นาที}}", "time_remaining.moments": "ช่วงเวลาที่เหลือ", "time_remaining.seconds": "เหลืออีก {number, plural, other {# วินาที}}", - "trends.count_by_accounts": "{count} {rawCount, plural, one {person} other {people}} talking", - "trends.refresh": "Refresh", + "trends.count_by_accounts": "{count} {rawCount, plural, other {คน}}กำลังคุย", + "trends.trending_now": "แนวโน้มตอนนี้", "ui.beforeunload": "แบบร่างของคุณจะหายไปหากคุณออกจาก Mastodon", "upload_area.title": "ลากแล้วปล่อยเพื่ออัปโหลด", "upload_button.label": "เพิ่มสื่อ (JPEG, PNG, GIF, WebM, MP4, MOV)", "upload_error.limit": "เกินขีดจำกัดการอัปโหลดไฟล์", "upload_error.poll": "ไม่อนุญาตให้อัปโหลดไฟล์กับการลงคะแนน", "upload_form.description": "อธิบายสำหรับผู้บกพร่องทางการมองเห็น", - "upload_form.edit": "Edit", + "upload_form.edit": "แก้ไข", "upload_form.undo": "ลบ", - "upload_modal.analyzing_picture": "Analyzing picture…", - "upload_modal.apply": "Apply", + "upload_modal.analyzing_picture": "กำลังวิเคราะห์รูปภาพ…", + "upload_modal.apply": "นำไปใช้", "upload_modal.description_placeholder": "A quick brown fox jumps over the lazy dog", "upload_modal.detect_text": "Detect text from picture", - "upload_modal.edit_media": "Edit media", + "upload_modal.edit_media": "แก้ไขสื่อ", "upload_modal.hint": "Click or drag the circle on the preview to choose the focal point which will always be in view on all thumbnails.", - "upload_modal.preview_label": "Preview ({ratio})", + "upload_modal.preview_label": "ตัวอย่าง ({ratio})", "upload_progress.label": "กำลังอัปโหลด...", "video.close": "ปิดวิดีโอ", "video.exit_fullscreen": "ออกจากเต็มหน้าจอ", diff --git a/app/javascript/mastodon/locales/tr.json b/app/javascript/mastodon/locales/tr.json index 3638b0582..ec9bd0f8f 100644 --- a/app/javascript/mastodon/locales/tr.json +++ b/app/javascript/mastodon/locales/tr.json @@ -1,45 +1,49 @@ { - "account.add_or_remove_from_list": "Listelere ekle veya kaldır", + "account.add_or_remove_from_list": "Listeye ekle veya kaldır", "account.badges.bot": "Bot", - "account.block": "Engelle @{name}", + "account.block": "@{name} adlı kişiyi engelle", "account.block_domain": "{domain} alanından her şeyi gizle", "account.blocked": "Engellenmiş", - "account.cancel_follow_request": "Cancel follow request", + "account.cancel_follow_request": "Takip isteğini iptal et", "account.direct": "Mesaj gönder : @{name}", "account.domain_blocked": "Alan adı gizlendi", "account.edit_profile": "Profili düzenle", "account.endorse": "Profildeki özellik", "account.follow": "Takip et", - "account.followers": "Takipçiler", + "account.followers": "Takipçi", "account.followers.empty": "Henüz kimse bu kullanıcıyı takip etmiyor.", "account.follows": "Takip ettikleri", "account.follows.empty": "Bu kullanıcı henüz kimseyi takip etmiyor.", "account.follows_you": "Seni takip ediyor", - "account.hide_reblogs": "@{name} kişisinden boost'ları gizle", + "account.hide_reblogs": "@{name} kişisinin yinelemelerini gizle", + "account.last_status": "Son aktivite", "account.link_verified_on": "Bu bağlantının mülkiyeti {date} tarihinde kontrol edildi", - "account.locked_info": "Bu hesabın gizlilik durumu kilitli olarak ayarlanmış. Sahibi, onu kimin takip edebileceğini elle inceler.", + "account.locked_info": "Bu hesabın gizlilik durumu kilitli olarak ayarlanmış. Sahibi, onu kimin takip edebileceğini elle inceliyor.", "account.media": "Medya", "account.mention": "@{name} kullanıcısından bahset", "account.moved_to": "{name} şuraya taşındı:", - "account.mute": "@{name} kullanıcısını sessize al", - "account.mute_notifications": "@{name} kullanıcısının bildirimlerini kapat", - "account.muted": "Sesi kısık", - "account.posts": "Gönderiler", + "account.mute": "@{name} adlı kişiyi sessize al", + "account.mute_notifications": "@{name} adlı kişinin bildirimlerini kapat", + "account.muted": "Susturuldu", + "account.never_active": "Asla", + "account.posts": "Gönderi", "account.posts_with_replies": "Gönderiler ve yanıtlar", - "account.report": "@{name} kullanıcısını bildir", - "account.requested": "Onay bekliyor. Takip isteğini iptal etmek için tıklayın", + "account.report": "@{name} adlı kişiyi bildir", + "account.requested": "Onay Bekleniyor. Takip isteğini iptal etmek için tıklayın", "account.share": "@{name} kullanıcısının profilini paylaş", - "account.show_reblogs": "@{name} kullanıcısından boostları göster", - "account.unblock": "Engeli kaldır @{name}", + "account.show_reblogs": "@{name} kullanıcısının yinelemelerini göster", + "account.unblock": "@{name} adlı kişinin engelini kaldır", "account.unblock_domain": "{domain} göster", "account.unendorse": "Profilde özellik yok", - "account.unfollow": "Takipten vazgeç", - "account.unmute": "Sesi aç : @{name}", - "account.unmute_notifications": "@{name} kullanıcısından bildirimleri aç", + "account.unfollow": "Takipi bırak", + "account.unmute": "@{name} adlı kişinin sesini aç", + "account.unmute_notifications": "@{name} adlı kişinin bildirimlerini aç", + "alert.rate_limited.message": "Lütfen sonra tekrar deneyin {retry_time, time, medium}.", + "alert.rate_limited.title": "Oran sınırlıdır", "alert.unexpected.message": "Beklenmedik bir hata oluştu.", "alert.unexpected.title": "Hay aksi!", - "autosuggest_hashtag.per_week": "{count} per week", - "boost_modal.combo": "Bir dahaki sefere {combo} tuşuna basabilirsiniz", + "autosuggest_hashtag.per_week": "Haftada {count}", + "boost_modal.combo": "Bir daha ki sefere {combo} tuşuna basabilirsiniz", "bundle_column_error.body": "Bu bileşen yüklenirken bir şeyler ters gitti.", "bundle_column_error.retry": "Tekrar deneyin", "bundle_column_error.title": "Ağ hatası", @@ -49,6 +53,7 @@ "column.blocks": "Engellenen kullanıcılar", "column.community": "Yerel zaman tüneli", "column.direct": "Doğrudan mesajlar", + "column.directory": "Profillere göz at", "column.domain_blocks": "Gizli alan adları", "column.favourites": "Favoriler", "column.follow_requests": "Takip istekleri", @@ -79,7 +84,7 @@ "compose_form.poll.remove_option": "Bu seçimi kaldır", "compose_form.publish": "Gönder", "compose_form.publish_loud": "{publish}!", - "compose_form.sensitive.hide": "Mark media as sensitive", + "compose_form.sensitive.hide": "Medyayı hassas olarak işaretle", "compose_form.sensitive.marked": "Medya hassas olarak işaretlendi", "compose_form.sensitive.unmarked": "Medya hassas olarak işaretlenmemiş", "compose_form.spoiler.marked": "Metin uyarının arkasına gizlenir", @@ -95,6 +100,8 @@ "confirmations.delete_list.message": "Bu listeyi kalıcı olarak silmek istediğinize emin misiniz?", "confirmations.domain_block.confirm": "Alan adının tamamını gizle", "confirmations.domain_block.message": "tüm {domain} alan adını engellemek istediğinizden emin misiniz? Genellikle birkaç hedefli engel ve susturma işi görür ve tercih edilir.", + "confirmations.logout.confirm": "Çıkış Yap", + "confirmations.logout.message": "Çıkış yapmak istediğinize emin misiniz?", "confirmations.mute.confirm": "Sessize al", "confirmations.mute.message": "{name} kullanıcısını sessize almak istiyor musunuz?", "confirmations.redraft.confirm": "Sil ve yeniden tasarla", @@ -103,6 +110,10 @@ "confirmations.reply.message": "Şimdi yanıtlarken o an oluşturduğunuz mesajın üzerine yazılır. Devam etmek istediğinize emin misiniz?", "confirmations.unfollow.confirm": "Takibi kaldır", "confirmations.unfollow.message": "{name}'yi takipten çıkarmak istediğinizden emin misiniz?", + "directory.federated": "From known fediverse", + "directory.local": "Yalnızca {domain} adresinden", + "directory.new_arrivals": "Yeni gelenler", + "directory.recently_active": "Son zamanlarda aktif", "embed.instructions": "Aşağıdaki kodu kopyalayarak bu durumu sitenize gömün.", "embed.preview": "İşte nasıl görüneceği:", "emoji_button.activity": "Aktivite", @@ -120,7 +131,7 @@ "emoji_button.symbols": "Semboller", "emoji_button.travel": "Seyahat ve Yerler", "empty_column.account_timeline": "Burada hiç gönderi yok!", - "empty_column.account_unavailable": "Profile unavailable", + "empty_column.account_unavailable": "Profil kullanılamıyor", "empty_column.blocks": "Henüz bir kullanıcıyı engellemediniz.", "empty_column.community": "Yerel zaman çizelgesi boş. Daha fazla eğlence için herkese açık bir gönderi paylaşın!", "empty_column.direct": "Henüz doğrudan mesajınız yok. Bir tane gönderdiğinizde veya aldığınızda burada görünecektir.", @@ -159,20 +170,20 @@ "home.column_settings.show_reblogs": "Boost edilenleri göster", "home.column_settings.show_replies": "Cevapları göster", "home.column_settings.update_live": "Update in real-time", - "intervals.full.days": "{number, plural, one {# day} other {# days}}", - "intervals.full.hours": "{number, plural, one {# hour} other {# hours}}", - "intervals.full.minutes": "{number, plural, one {# minute} other {# minutes}}", + "intervals.full.days": "{number, plural, one {# gün} other {# gün}}", + "intervals.full.hours": "{number, plural, one {# saat} other {# saat}}", + "intervals.full.minutes": "{number, plural, one {# dakika} other {# dakika}}", "introduction.federation.action": "İleri", "introduction.federation.federated.headline": "Birleşik", "introduction.federation.federated.text": "Diğer dosya sunucularından gelen genel gönderiler, birleşik zaman çizelgesinde görünecektir.", "introduction.federation.home.headline": "Ana sayfa", - "introduction.federation.home.text": "Posts from people you follow will appear in your home feed. You can follow anyone on any server!", + "introduction.federation.home.text": "Takip ettiğiniz kişilerin yayınları ana sayfada gösterilecek. Herhangi bir sunucudaki herkesi takip edebilirsiniz!", "introduction.federation.local.headline": "Yerel", "introduction.federation.local.text": "Aynı sunucudaki kişilerin gönderileri yerel zaman tünelinde gözükecektir.", "introduction.interactions.action": "Öğreticiyi bitirin!", "introduction.interactions.favourite.headline": "Favori", "introduction.interactions.favourite.text": "Bir gönderiyi favorilerinize alarak sonrası için saklayabilirsiniz ve yazara gönderiyi beğendiğinizi söyleyebilirsiniz.", - "introduction.interactions.reblog.headline": "Boost", + "introduction.interactions.reblog.headline": "Yinele", "introduction.interactions.reblog.text": "Başkalarının gönderilerini boostlayarak kendi takipçilerinizle paylaşabillirsiniz.", "introduction.interactions.reply.headline": "Yanıt", "introduction.interactions.reply.text": "Başkalarının gönderilerini ve kendi gönderilerinizi yanıtlayabilirsiniz. Bir konuşmada zincirli bir şekilde olacaklardır.", @@ -207,14 +218,14 @@ "keyboard_shortcuts.search": "aramaya odaklanmak için", "keyboard_shortcuts.start": "\"başlayın\" sütununu açmak için", "keyboard_shortcuts.toggle_hidden": "CW'den önceki yazıyı göstermek/gizlemek için", - "keyboard_shortcuts.toggle_sensitivity": "to show/hide media", + "keyboard_shortcuts.toggle_sensitivity": "medyayı göstermek/gizlemek için", "keyboard_shortcuts.toot": "yeni bir gönderiye başlamak için", "keyboard_shortcuts.unfocus": "aramada bir gönderiye odaklanmamak için", "keyboard_shortcuts.up": "listede yukarıya çıkmak için", "lightbox.close": "Kapat", "lightbox.next": "Sonraki", "lightbox.previous": "Önceli", - "lightbox.view_context": "View context", + "lightbox.view_context": "İçeriği göster", "lists.account.add": "Listeye ekle", "lists.account.remove": "Listeden kaldır", "lists.delete": "Listeyi sil", @@ -224,7 +235,7 @@ "lists.new.title_placeholder": "Yeni liste başlığı", "lists.search": "Takip ettiğiniz kişiler arasından arayın", "lists.subheading": "Listeleriniz", - "load_pending": "{count, plural, one {# new item} other {# new items}}", + "load_pending": "{count, plural, one {# yeni öğe} other {# yeni öğe}}", "loading_indicator.label": "Yükleniyor...", "media_gallery.toggle_visible": "Görünürlüğü değiştir", "missing_indicator.label": "Bulunamadı", @@ -241,7 +252,7 @@ "navigation_bar.favourites": "Favoriler", "navigation_bar.filters": "Susturulmuş kelimeler", "navigation_bar.follow_requests": "Takip istekleri", - "navigation_bar.follows_and_followers": "Follows and followers", + "navigation_bar.follows_and_followers": "Takip edilenler ve takipçiler", "navigation_bar.info": "Genişletilmiş bilgi", "navigation_bar.keyboard_shortcuts": "Klavye kısayolları", "navigation_bar.lists": "Listeler", @@ -250,13 +261,12 @@ "navigation_bar.personal": "Kişisel", "navigation_bar.pins": "Sabitlenmiş gönderiler", "navigation_bar.preferences": "Tercihler", - "navigation_bar.profile_directory": "Profile directory", "navigation_bar.public_timeline": "Federe zaman tüneli", "navigation_bar.security": "Güvenlik", "notification.and_n_others": "and {count, plural, one {# other} other {# others}}", "notification.favourite": "{name} senin durumunu favorilere ekledi", "notification.follow": "{name} seni takip ediyor", - "notification.mention": "{name} mentioned you", + "notification.mention": "{name} senden bahsetti", "notification.poll": "Oy verdiğiniz bir anket bitti", "notification.reblog": "{name} senin durumunu boost etti", "notifications.clear": "Bildirimleri temizle", @@ -282,7 +292,7 @@ "notifications.group": "{count} bildirim", "poll.closed": "Kapandı", "poll.refresh": "Yenile", - "poll.total_votes": "{count, plural, one {# vote} other {# votes}}", + "poll.total_votes": "{count, plural, one {# oy} other {# oy}}", "poll.vote": "Oy ver", "poll_button.add_poll": "Bir anket ekleyin", "poll_button.remove_poll": "Anket kaldır", @@ -311,15 +321,15 @@ "report.target": "Raporlama", "search.placeholder": "Ara", "search_popout.search_format": "Gelişmiş arama formatı", - "search_popout.tips.full_text": "Simple text returns statuses you have written, favourited, boosted, or have been mentioned in, as well as matching usernames, display names, and hashtags.", - "search_popout.tips.hashtag": "hashtag", + "search_popout.tips.full_text": "Basit metin yazdığınız, tercih ettiğiniz, yinelediğiniz veya bunlardan bahsettiğiniz durumların yanı sıra kullanıcı adlarını, görünen adları ve hashtag'leri eşleştiren durumları döndürür.", + "search_popout.tips.hashtag": "etiketler", "search_popout.tips.status": "durum", - "search_popout.tips.text": "Simple text returns matching display names, usernames and hashtags", + "search_popout.tips.text": "Basit metin, eşleşen görünen adları, kullanıcı adlarını ve hashtag'leri döndürür", "search_popout.tips.user": "kullanıcı", "search_results.accounts": "İnsanlar", "search_results.hashtags": "Hashtagler", "search_results.statuses": "Gönderiler", - "search_results.statuses_fts_disabled": "Searching toots by their content is not enabled on this Mastodon server.", + "search_results.statuses_fts_disabled": "Bu Mastodon sunucusunda gönderi içeriğine göre arama etkin değil.", "search_results.total": "{count, number} {count, plural, one {sonuç} other {sonuçlar}}", "status.admin_account": "@{name} için denetim arayüzünü açın", "status.admin_status": "Denetim arayüzünde bu durumu açın", @@ -358,7 +368,8 @@ "status.show_more": "Daha fazla göster", "status.show_more_all": "Hepsi için daha fazla göster", "status.show_thread": "Başlığı göster", - "status.unmute_conversation": "Unmute conversation", + "status.uncached_media_warning": "Mevcut değil", + "status.unmute_conversation": "Sohbeti aç", "status.unpin": "Profilden sabitlemeyi kaldır", "suggestions.dismiss": "Öneriyi görmezden gel", "suggestions.header": "Şuna ilgi duyuyor olabilirsiniz…", @@ -367,28 +378,28 @@ "tabs_bar.local_timeline": "Yerel", "tabs_bar.notifications": "Bildirimler", "tabs_bar.search": "Ara", - "time_remaining.days": "{number, plural, one {# day} other {# days}} left", - "time_remaining.hours": "{number, plural, one {# hour} other {# hours}} left", - "time_remaining.minutes": "{number, plural, one {# minute} other {# minutes}} left", - "time_remaining.moments": "Moments remaining", - "time_remaining.seconds": "{number, plural, one {# second} other {# seconds}} left", - "trends.count_by_accounts": "{count} {rawCount, plural, one {person} other {people}} talking", - "trends.refresh": "Refresh", + "time_remaining.days": "{number, plural, one {# gün} other {# gün}} kaldı", + "time_remaining.hours": "{number, plural, one {# saat} other {# saat}} kaldı", + "time_remaining.minutes": "{number, plural, one {# dakika} other {# dakika}} kaldı", + "time_remaining.moments": "Sadece birkaç dakika kaldı", + "time_remaining.seconds": "{number, plural, one {# saniye} other {# saniye}} kaldı", + "trends.count_by_accounts": "{count} {rawCount, plural, one {kişi} other {kişi}} konuşuyor", + "trends.trending_now": "Şu an popüler", "ui.beforeunload": "Mastodon'dan ayrılırsanız taslağınız kaybolacak.", "upload_area.title": "Karşıya yükleme için sürükle bırak yapınız", "upload_button.label": "Görsel ekle", "upload_error.limit": "Dosya yükleme sınırı aşıldı.", "upload_error.poll": "Anketlerde dosya yüklemesine izin verilmez.", - "upload_form.description": "Describe for the visually impaired", - "upload_form.edit": "Edit", + "upload_form.description": "Görme engelliler için açıklama", + "upload_form.edit": "Düzenle", "upload_form.undo": "Geri al", - "upload_modal.analyzing_picture": "Analyzing picture…", - "upload_modal.apply": "Apply", - "upload_modal.description_placeholder": "A quick brown fox jumps over the lazy dog", - "upload_modal.detect_text": "Detect text from picture", - "upload_modal.edit_media": "Edit media", - "upload_modal.hint": "Click or drag the circle on the preview to choose the focal point which will always be in view on all thumbnails.", - "upload_modal.preview_label": "Preview ({ratio})", + "upload_modal.analyzing_picture": "Resmi analiz ediyor…", + "upload_modal.apply": "Uygula", + "upload_modal.description_placeholder": "Pijamalı hasta yağız şoföre çabucak güvendi", + "upload_modal.detect_text": "Resimdeki metni algıla", + "upload_modal.edit_media": "Medyayı düzenle", + "upload_modal.hint": "Her zaman tüm küçük resimlerde görüntülenecek odak noktasını seçmek için ön izlemedeki daireyi tıklayın veya sürükleyin.", + "upload_modal.preview_label": "Ön izleme ({ratio})", "upload_progress.label": "Yükleniyor...", "video.close": "Videoyu kapat", "video.exit_fullscreen": "Tam ekrandan çık", diff --git a/app/javascript/mastodon/locales/uk.json b/app/javascript/mastodon/locales/uk.json index 69bf016f9..605ebdc08 100644 --- a/app/javascript/mastodon/locales/uk.json +++ b/app/javascript/mastodon/locales/uk.json @@ -4,7 +4,7 @@ "account.block": "Заблокувати @{name}", "account.block_domain": "Заглушити {domain}", "account.blocked": "Заблоковані", - "account.cancel_follow_request": "Cancel follow request", + "account.cancel_follow_request": "Скасувати запит на підписку", "account.direct": "Пряме повідомлення @{name}", "account.domain_blocked": "Домен приховано", "account.edit_profile": "Редагувати профіль", @@ -16,6 +16,7 @@ "account.follows.empty": "Цей користувач ще ні на кого не підписався.", "account.follows_you": "Підписаний(-а) на Вас", "account.hide_reblogs": "Сховати передмухи від @{name}", + "account.last_status": "Крайня активність", "account.link_verified_on": "Права власності на це посилання були перевірені {date}", "account.locked_info": "Статус конфіденційності цього облікового запису встановлено у заблокований. Власник вручну переглядає, хто може за ним стежити.", "account.media": "Медіа", @@ -24,6 +25,7 @@ "account.mute": "Заглушити @{name}", "account.mute_notifications": "Не показувати сповіщення від @{name}", "account.muted": "Заглушений", + "account.never_active": "Ніколи", "account.posts": "Дмухи", "account.posts_with_replies": "Дмухи й відповіді", "account.report": "Поскаржитися на @{name}", @@ -36,9 +38,11 @@ "account.unfollow": "Відписатися", "account.unmute": "Зняти глушення з @{name}", "account.unmute_notifications": "Показувати сповіщення від @{name}", + "alert.rate_limited.message": "Спробуйте ще раз через {retry_time, time, medium}.", + "alert.rate_limited.title": "Швидкість обмежена", "alert.unexpected.message": "Трапилась неочікувана помилка.", "alert.unexpected.title": "Ой!", - "autosuggest_hashtag.per_week": "{count} per week", + "autosuggest_hashtag.per_week": "{count} в тиждень", "boost_modal.combo": "Ви можете натиснути {combo}, щоб пропустити це наступного разу", "bundle_column_error.body": "Щось пішло не так під час завантаження компоненту.", "bundle_column_error.retry": "Спробуйте ще раз", @@ -49,6 +53,7 @@ "column.blocks": "Заблоковані користувачі", "column.community": "Локальна стрічка", "column.direct": "Прямі повідомлення", + "column.directory": "Переглянути профілі", "column.domain_blocks": "Приховані домени", "column.favourites": "Вподобане", "column.follow_requests": "Запити на підписку", @@ -95,6 +100,8 @@ "confirmations.delete_list.message": "Ви впевнені, що хочете видалити цей список назавжди?", "confirmations.domain_block.confirm": "Сховати весь домен", "confirmations.domain_block.message": "Ви точно, точно впевнені, що хочете заблокувати весь домен {domain}? У більшості випадків для нормальної роботи краще заблокувати/заглушити лише деяких користувачів. Ви не зможете бачити контент з цього домену у будь-яких стрічках або ваших сповіщеннях. Ваші підписники з цього домену будуть відписані від вас.", + "confirmations.logout.confirm": "Вийти", + "confirmations.logout.message": "Ви впевнені, що хочете вийти?", "confirmations.mute.confirm": "Заглушити", "confirmations.mute.message": "Ви впевнені, що хочете заглушити {name}?", "confirmations.redraft.confirm": "Видалити та перестворити", @@ -103,6 +110,10 @@ "confirmations.reply.message": "Поточна відповідь перезапише повідомлення, яке ви зараз пишете. Ви впевнені, що хочете продовжити?", "confirmations.unfollow.confirm": "Відписатися", "confirmations.unfollow.message": "Ви впевнені, що хочете відписатися від {name}?", + "directory.federated": "З відомого федесвіту", + "directory.local": "Тільки з домену {domain}", + "directory.new_arrivals": "Нові надходження", + "directory.recently_active": "Активні нещодавно", "embed.instructions": "Вбудуйте цей статус до вашого вебсайту, скопіювавши код нижче.", "embed.preview": "Ось як він виглядатиме:", "emoji_button.activity": "Заняття", @@ -158,7 +169,7 @@ "home.column_settings.basic": "Основні", "home.column_settings.show_reblogs": "Показувати передмухи", "home.column_settings.show_replies": "Показувати відповіді", - "home.column_settings.update_live": "Оновлювати в реальному часі", + "home.column_settings.update_live": "Update in real-time", "intervals.full.days": "{number, plural, one {# день} few {# дні} other {# днів}}", "intervals.full.hours": "{number, plural, one {# година} few {# години} other {# годин}}", "intervals.full.minutes": "{number, plural, one {# хвилина} few {# хвилини} other {# хвилин}}", @@ -250,7 +261,6 @@ "navigation_bar.personal": "Особисте", "navigation_bar.pins": "Закріплені дмухи", "navigation_bar.preferences": "Налаштування", - "navigation_bar.profile_directory": "Каталог профілів", "navigation_bar.public_timeline": "Глобальна стрічка", "navigation_bar.security": "Безпека", "notification.and_n_others": "and {count, plural, one {# other} other {# others}}", @@ -358,6 +368,7 @@ "status.show_more": "Розгорнути", "status.show_more_all": "Show more for all", "status.show_thread": "Показати ланцюжок", + "status.uncached_media_warning": "Недоступно", "status.unmute_conversation": "Зняти глушення з діалогу", "status.unpin": "Відкріпити від профілю", "suggestions.dismiss": "Відхилити пропозицію", @@ -372,23 +383,23 @@ "time_remaining.minutes": "{number, plural, one {# хвилина} few {# хвилини} other {# хвилин}}", "time_remaining.moments": "Moments remaining", "time_remaining.seconds": "{number, plural, one {# секунда} few {# секунди} other {# секунд}}", - "trends.count_by_accounts": "{count} {rawCount, plural, one {людина} few {людини} many {людей} other {людей}} talking", - "trends.refresh": "Refresh", + "trends.count_by_accounts": "{count} {rawCount, plural, one {людина} few {людини} many {людей} other {людей}} обговорюють це", + "trends.trending_now": "Актуальні", "ui.beforeunload": "Вашу чернетку буде втрачено, якщо ви покинете Mastodon.", "upload_area.title": "Перетягніть сюди, щоб завантажити", "upload_button.label": "Додати медіаконтент ({formats})", "upload_error.limit": "Ліміт завантаження файлів перевищено.", "upload_error.poll": "Не можна завантажувати файли до опитувань.", "upload_form.description": "Опишіть для людей з вадами зору", - "upload_form.edit": "Edit", + "upload_form.edit": "Змінити", "upload_form.undo": "Видалити", - "upload_modal.analyzing_picture": "Analyzing picture…", - "upload_modal.apply": "Apply", - "upload_modal.description_placeholder": "A quick brown fox jumps over the lazy dog", - "upload_modal.detect_text": "Detect text from picture", - "upload_modal.edit_media": "Edit media", - "upload_modal.hint": "Click or drag the circle on the preview to choose the focal point which will always be in view on all thumbnails.", - "upload_modal.preview_label": "Preview ({ratio})", + "upload_modal.analyzing_picture": "Аналізуємо малюнок…", + "upload_modal.apply": "Застосувати", + "upload_modal.description_placeholder": "Щурячий бугай із їжаком-харцизом в'ючись підписали ґешефт у єнах", + "upload_modal.detect_text": "Виявити текст на малюнку", + "upload_modal.edit_media": "Редагувати медіа", + "upload_modal.hint": "Клацніть або перетягніть коло на превью, щоб обрати точку, яку буде завжди видно на мініатюрах.", + "upload_modal.preview_label": "Переглянути ({ratio})", "upload_progress.label": "Завантаження...", "video.close": "Закрити відео", "video.exit_fullscreen": "Вийти з повноекранного режиму", diff --git a/app/javascript/mastodon/locales/zh-CN.json b/app/javascript/mastodon/locales/zh-CN.json index 16848831c..8ab7046c1 100644 --- a/app/javascript/mastodon/locales/zh-CN.json +++ b/app/javascript/mastodon/locales/zh-CN.json @@ -4,7 +4,7 @@ "account.block": "屏蔽 @{name}", "account.block_domain": "隐藏来自 {domain} 的内容", "account.blocked": "已屏蔽", - "account.cancel_follow_request": "Cancel follow request", + "account.cancel_follow_request": "取消关注请求", "account.direct": "发送私信给 @{name}", "account.domain_blocked": "网站已屏蔽", "account.edit_profile": "修改个人资料", @@ -16,6 +16,7 @@ "account.follows.empty": "此用户目前尚未关注任何人。", "account.follows_you": "关注了你", "account.hide_reblogs": "隐藏来自 @{name} 的转嘟", + "account.last_status": "Last active", "account.link_verified_on": "此链接的所有权已在 {date} 检查", "account.locked_info": "此账户已锁嘟。账户的主人会手动审核关注者。", "account.media": "媒体", @@ -24,6 +25,7 @@ "account.mute": "隐藏 @{name}", "account.mute_notifications": "隐藏来自 @{name} 的通知", "account.muted": "已隐藏", + "account.never_active": "Never", "account.posts": "嘟文", "account.posts_with_replies": "嘟文和回复", "account.report": "举报 @{name}", @@ -36,9 +38,11 @@ "account.unfollow": "取消关注", "account.unmute": "不再隐藏 @{name}", "account.unmute_notifications": "不再隐藏来自 @{name} 的通知", + "alert.rate_limited.message": "Please retry after {retry_time, time, medium}.", + "alert.rate_limited.title": "Rate limited", "alert.unexpected.message": "发生了意外错误。", "alert.unexpected.title": "哎呀!", - "autosuggest_hashtag.per_week": "{count} per week", + "autosuggest_hashtag.per_week": "每星期 {count} 条", "boost_modal.combo": "下次按住 {combo} 即可跳过此提示", "bundle_column_error.body": "载入这个组件时发生了错误。", "bundle_column_error.retry": "重试", @@ -49,6 +53,7 @@ "column.blocks": "已屏蔽的用户", "column.community": "本站时间轴", "column.direct": "私信", + "column.directory": "Browse profiles", "column.domain_blocks": "已屏蔽的网站", "column.favourites": "收藏", "column.follow_requests": "关注请求", @@ -95,6 +100,8 @@ "confirmations.delete_list.message": "你确定要永久删除这个列表吗?", "confirmations.domain_block.confirm": "隐藏整个网站的内容", "confirmations.domain_block.message": "你真的确定要隐藏所有来自 {domain} 的内容吗?多数情况下,屏蔽或隐藏几个特定的用户就已经足够了。来自该网站的内容将不再出现在你的任何公共时间轴或通知列表里。来自该网站的关注者将会被移除。", + "confirmations.logout.confirm": "Log out", + "confirmations.logout.message": "Are you sure you want to log out?", "confirmations.mute.confirm": "隐藏", "confirmations.mute.message": "你确定要隐藏 {name} 吗?", "confirmations.redraft.confirm": "删除并重新编辑", @@ -103,6 +110,10 @@ "confirmations.reply.message": "回复此消息将会覆盖当前正在编辑的信息。确定继续吗?", "confirmations.unfollow.confirm": "取消关注", "confirmations.unfollow.message": "你确定要取消关注 {name} 吗?", + "directory.federated": "From known fediverse", + "directory.local": "From {domain} only", + "directory.new_arrivals": "New arrivals", + "directory.recently_active": "Recently active", "embed.instructions": "要在你的网站上嵌入这条嘟文,请复制以下代码。", "embed.preview": "它会像这样显示出来:", "emoji_button.activity": "活动", @@ -158,7 +169,7 @@ "home.column_settings.basic": "基本设置", "home.column_settings.show_reblogs": "显示转嘟", "home.column_settings.show_replies": "显示回复", - "home.column_settings.update_live": "实时更新", + "home.column_settings.update_live": "Update in real-time", "intervals.full.days": "{number} 天", "intervals.full.hours": "{number} 小时", "intervals.full.minutes": "{number} 分钟", @@ -224,7 +235,7 @@ "lists.new.title_placeholder": "新列表的标题", "lists.search": "搜索你关注的人", "lists.subheading": "你的列表", - "load_pending": "{count, plural, one {# new item} other {# new items}}", + "load_pending": "{count} 项", "loading_indicator.label": "加载中……", "media_gallery.toggle_visible": "切换显示/隐藏", "missing_indicator.label": "找不到内容", @@ -250,7 +261,6 @@ "navigation_bar.personal": "个人", "navigation_bar.pins": "置顶嘟文", "navigation_bar.preferences": "首选项", - "navigation_bar.profile_directory": "用户目录", "navigation_bar.public_timeline": "跨站公共时间轴", "navigation_bar.security": "安全", "notification.and_n_others": "and {count, plural, one {# other} other {# others}}", @@ -358,6 +368,7 @@ "status.show_more": "显示内容", "status.show_more_all": "显示所有内容", "status.show_thread": "显示全部对话", + "status.uncached_media_warning": "Not available", "status.unmute_conversation": "不再隐藏此对话", "status.unpin": "在个人资料页面取消置顶", "suggestions.dismiss": "关闭建议", @@ -373,22 +384,22 @@ "time_remaining.moments": "即将结束", "time_remaining.seconds": "剩余 {number, plural, one {# 秒} other {# 秒}}", "trends.count_by_accounts": "{count} 人正在讨论", - "trends.refresh": "Refresh", + "trends.trending_now": "现在流行", "ui.beforeunload": "如果你现在离开 Mastodon,你的草稿内容将会丢失。", "upload_area.title": "将文件拖放到此处开始上传", "upload_button.label": "上传媒体文件 (JPEG, PNG, GIF, WebM, MP4, MOV)", "upload_error.limit": "文件大小超过限制。", "upload_error.poll": "投票中不允许上传文件。", "upload_form.description": "为视觉障碍人士添加文字说明", - "upload_form.edit": "Edit", + "upload_form.edit": "编辑", "upload_form.undo": "删除", - "upload_modal.analyzing_picture": "Analyzing picture…", - "upload_modal.apply": "Apply", - "upload_modal.description_placeholder": "A quick brown fox jumps over the lazy dog", - "upload_modal.detect_text": "Detect text from picture", - "upload_modal.edit_media": "Edit media", - "upload_modal.hint": "Click or drag the circle on the preview to choose the focal point which will always be in view on all thumbnails.", - "upload_modal.preview_label": "Preview ({ratio})", + "upload_modal.analyzing_picture": "分析图片…", + "upload_modal.apply": "应用", + "upload_modal.description_placeholder": "天地玄黄 宇宙洪荒 日月盈仄 辰宿列张", + "upload_modal.detect_text": "从图片中检测文本", + "upload_modal.edit_media": "编辑媒体", + "upload_modal.hint": "在预览图上点击或拖动圆圈,以选择缩略图的焦点。", + "upload_modal.preview_label": "预览 ({ratio})", "upload_progress.label": "上传中……", "video.close": "关闭视频", "video.exit_fullscreen": "退出全屏", diff --git a/app/javascript/mastodon/locales/zh-HK.json b/app/javascript/mastodon/locales/zh-HK.json index f09ceffb3..d63a9dd34 100644 --- a/app/javascript/mastodon/locales/zh-HK.json +++ b/app/javascript/mastodon/locales/zh-HK.json @@ -16,6 +16,7 @@ "account.follows.empty": "This user doesn't follow anyone yet.", "account.follows_you": "關注你", "account.hide_reblogs": "隱藏 @{name} 的轉推", + "account.last_status": "Last active", "account.link_verified_on": "Ownership of this link was checked on {date}", "account.locked_info": "This account privacy status is set to locked. The owner manually reviews who can follow them.", "account.media": "媒體", @@ -24,6 +25,7 @@ "account.mute": "將 @{name} 靜音", "account.mute_notifications": "將來自 @{name} 的通知靜音", "account.muted": "靜音", + "account.never_active": "Never", "account.posts": "文章", "account.posts_with_replies": "包含回覆的文章", "account.report": "舉報 @{name}", @@ -36,6 +38,8 @@ "account.unfollow": "取消關注", "account.unmute": "取消 @{name} 的靜音", "account.unmute_notifications": "取消來自 @{name} 通知的靜音", + "alert.rate_limited.message": "Please retry after {retry_time, time, medium}.", + "alert.rate_limited.title": "Rate limited", "alert.unexpected.message": "發生不可預期的錯誤。", "alert.unexpected.title": "噢!", "autosuggest_hashtag.per_week": "{count} per week", @@ -49,6 +53,7 @@ "column.blocks": "封鎖用戶", "column.community": "本站時間軸", "column.direct": "個人訊息", + "column.directory": "Browse profiles", "column.domain_blocks": "隱藏的服務站", "column.favourites": "最愛的文章", "column.follow_requests": "關注請求", @@ -95,6 +100,8 @@ "confirmations.delete_list.message": "你確定要永久刪除這列表嗎?", "confirmations.domain_block.confirm": "隱藏整個網站", "confirmations.domain_block.message": "你真的真的確定要隱藏整個 {domain} ?多數情況下,比較推薦封鎖或靜音幾個特定目標就好。你從此將不會再看到該站的內容和通知。來自該站的關注者亦會被移除。", + "confirmations.logout.confirm": "Log out", + "confirmations.logout.message": "Are you sure you want to log out?", "confirmations.mute.confirm": "靜音", "confirmations.mute.message": "你確定要將{name}靜音嗎?", "confirmations.redraft.confirm": "刪除並編輯", @@ -103,6 +110,10 @@ "confirmations.reply.message": "Replying now will overwrite the message you are currently composing. Are you sure you want to proceed?", "confirmations.unfollow.confirm": "取消關注", "confirmations.unfollow.message": "真的不要繼續關注 {name} 了嗎?", + "directory.federated": "From known fediverse", + "directory.local": "From {domain} only", + "directory.new_arrivals": "New arrivals", + "directory.recently_active": "Recently active", "embed.instructions": "要內嵌此文章,請將以下代碼貼進你的網站。", "embed.preview": "看上去會是這樣:", "emoji_button.activity": "活動", @@ -250,7 +261,6 @@ "navigation_bar.personal": "Personal", "navigation_bar.pins": "置頂文章", "navigation_bar.preferences": "偏好設定", - "navigation_bar.profile_directory": "Profile directory", "navigation_bar.public_timeline": "跨站時間軸", "navigation_bar.security": "安全", "notification.and_n_others": "and {count, plural, one {# other} other {# others}}", @@ -358,6 +368,7 @@ "status.show_more": "顯示更多", "status.show_more_all": "顯示更多這類文章", "status.show_thread": "Show thread", + "status.uncached_media_warning": "Not available", "status.unmute_conversation": "解禁對話", "status.unpin": "解除置頂", "suggestions.dismiss": "Dismiss suggestion", @@ -373,7 +384,7 @@ "time_remaining.moments": "Moments remaining", "time_remaining.seconds": "{number, plural, one {# second} other {# seconds}} left", "trends.count_by_accounts": "{count} 位用戶在討論", - "trends.refresh": "Refresh", + "trends.trending_now": "Trending now", "ui.beforeunload": "如果你現在離開 Mastodon,你的草稿內容將會被丟棄。", "upload_area.title": "將檔案拖放至此上載", "upload_button.label": "上載媒體檔案", diff --git a/app/javascript/mastodon/locales/zh-TW.json b/app/javascript/mastodon/locales/zh-TW.json index af988b320..d0b95da8c 100644 --- a/app/javascript/mastodon/locales/zh-TW.json +++ b/app/javascript/mastodon/locales/zh-TW.json @@ -16,6 +16,7 @@ "account.follows.empty": "這位使用者尚未關注任何使用者。", "account.follows_you": "關注了你", "account.hide_reblogs": "隱藏來自 @{name} 的轉推", + "account.last_status": "Last active", "account.link_verified_on": "已在 {date} 檢查此連結的擁有者權限", "account.locked_info": "這隻帳戶的隱私狀態被設成鎖定。該擁有者會手動審核能關注這隻帳號的人。", "account.media": "媒體", @@ -24,6 +25,7 @@ "account.mute": "靜音 @{name}", "account.mute_notifications": "靜音來自 @{name} 的通知", "account.muted": "已靜音", + "account.never_active": "Never", "account.posts": "嘟文", "account.posts_with_replies": "嘟文與回覆", "account.report": "檢舉 @{name}", @@ -36,6 +38,8 @@ "account.unfollow": "取消關注", "account.unmute": "取消靜音 @{name}", "account.unmute_notifications": "重新接收來自 @{name} 的通知", + "alert.rate_limited.message": "Please retry after {retry_time, time, medium}.", + "alert.rate_limited.title": "Rate limited", "alert.unexpected.message": "發生了非預期的錯誤。", "alert.unexpected.title": "哎呀!", "autosuggest_hashtag.per_week": "{count} per week", @@ -49,6 +53,7 @@ "column.blocks": "封鎖的使用者", "column.community": "本機時間軸", "column.direct": "私訊", + "column.directory": "Browse profiles", "column.domain_blocks": "隱藏的網域", "column.favourites": "收藏", "column.follow_requests": "關注請求", @@ -95,6 +100,8 @@ "confirmations.delete_list.message": "確定永久刪除此名單?", "confirmations.domain_block.confirm": "隱藏整個網域", "confirmations.domain_block.message": "真的非常確定封鎖整個 {domain} 嗎?大部分情況下,你只需要封鎖或靜音少數特定的人就能滿足需求了。你將不能在任何公開的時間軸及通知中看到那個網域的內容。你來自該網域的關注者也會被移除。", + "confirmations.logout.confirm": "Log out", + "confirmations.logout.message": "Are you sure you want to log out?", "confirmations.mute.confirm": "靜音", "confirmations.mute.message": "確定靜音 {name} ?", "confirmations.redraft.confirm": "刪除並重新編輯", @@ -103,6 +110,10 @@ "confirmations.reply.message": "現在回覆將蓋掉您目前正在撰寫的訊息。是否仍要回覆?", "confirmations.unfollow.confirm": "取消關注", "confirmations.unfollow.message": "真的要取消關注 {name} 嗎?", + "directory.federated": "From known fediverse", + "directory.local": "From {domain} only", + "directory.new_arrivals": "New arrivals", + "directory.recently_active": "Recently active", "embed.instructions": "要嵌入此嘟文,請將以下程式碼貼進你的網站。", "embed.preview": "他會顯示成這樣:", "emoji_button.activity": "活動", @@ -250,7 +261,6 @@ "navigation_bar.personal": "個人", "navigation_bar.pins": "釘選的嘟文", "navigation_bar.preferences": "偏好設定", - "navigation_bar.profile_directory": "Profile directory", "navigation_bar.public_timeline": "聯邦時間軸", "navigation_bar.security": "安全性", "notification.and_n_others": "and {count, plural, one {# other} other {# others}}", @@ -358,6 +368,7 @@ "status.show_more": "顯示更多", "status.show_more_all": "顯示更多這類嘟文", "status.show_thread": "顯示討論串", + "status.uncached_media_warning": "Not available", "status.unmute_conversation": "解除此對話的靜音", "status.unpin": "解除置頂", "suggestions.dismiss": "關閉建議", @@ -373,7 +384,7 @@ "time_remaining.moments": "剩餘時間", "time_remaining.seconds": "剩餘 {number, plural, one {# 秒} other {# 秒}}", "trends.count_by_accounts": "{count} 位使用者在討論", - "trends.refresh": "Refresh", + "trends.trending_now": "Trending now", "ui.beforeunload": "如果離開 Mastodon,你的草稿將會不見。", "upload_area.title": "拖放來上傳", "upload_button.label": "上傳媒體檔案 (JPEG, PNG, GIF, WebM, MP4, MOV)", diff --git a/config/locales/activerecord.bg.yml b/config/locales/activerecord.bg.yml index d0e375da9..a1f60b45a 100644 --- a/config/locales/activerecord.bg.yml +++ b/config/locales/activerecord.bg.yml @@ -1 +1,7 @@ +--- bg: + activerecord: + attributes: + poll: + expires_at: Краен срок + options: Избори diff --git a/config/locales/activerecord.da.yml b/config/locales/activerecord.da.yml index 5e7266ef1..e7367a4af 100644 --- a/config/locales/activerecord.da.yml +++ b/config/locales/activerecord.da.yml @@ -1,6 +1,10 @@ --- da: activerecord: + attributes: + poll: + expires_at: Deadline + options: Valgmuligheder errors: models: account: diff --git a/config/locales/activerecord.tr.yml b/config/locales/activerecord.tr.yml index 1cc2d9876..8ce55599c 100644 --- a/config/locales/activerecord.tr.yml +++ b/config/locales/activerecord.tr.yml @@ -1,6 +1,10 @@ --- tr: activerecord: + attributes: + poll: + expires_at: Son Teslim Tarihi + options: Seçenekler errors: models: account: diff --git a/config/locales/ar.yml b/config/locales/ar.yml index 14562db03..82d2485a7 100644 --- a/config/locales/ar.yml +++ b/config/locales/ar.yml @@ -11,7 +11,7 @@ ar: apps: تطبيقات الأجهزة المحمولة apps_platforms: إستخدم ماستودون في iOS، أندرويد وأنظمة أخرى browse_directory: تصفح دليل المستخدمين وافرز بالمصالح - browse_public_posts: تصفح تيار مباشر من منشورات عامة على ماستدون + browse_public_posts: تصفح تيارًا مباشرًا مِن منشورات عامة على ماستدون contact: للتواصل معنا contact_missing: لم يتم تعيينه contact_unavailable: غير متوفر @@ -65,6 +65,7 @@ ar: media: الوسائط moved_html: "%{name} إنتقلَ إلى %{new_profile_link}:" network_hidden: إنّ المعطيات غير متوفرة + never_active: أبدا nothing_here: لا يوجد أي شيء هنا! people_followed_by: الأشخاص الذين يتبعهم %{name} people_who_follow: الأشخاص الذين يتبعون %{name} @@ -267,10 +268,13 @@ ar: feature_profile_directory: دليل الحسابات feature_registrations: التسجيلات feature_relay: المُرحّل الفديرالي + feature_spam_check: مكافح البريد المزعج feature_timeline_preview: معاينة الخيط الزمني features: الميّزات hidden_service: الفيديرالية مع الخدمات الخفية open_reports: فتح الشكاوى + pending_tags: وسوم في انتظار المراجعة + pending_users: مستخدمين في انتظار مراجعة recent_users: أحدث المستخدِمين search: البحث النصي الكامل single_user_mode: وضع المستخدِم الأوحد @@ -421,6 +425,8 @@ ar: custom_css: desc_html: يقوم بتغيير المظهر بواسطة سي أس أس يُحمَّل على كافة الصفحات title: سي أس أس مخصص + domain_blocks: + all: للجميع hero: desc_html: معروض على الصفحة الأولى. لا يقل عن 600 × 100 بكسل. عند عدم التعيين ، تعود الصورة إلى النسخة المصغرة على سبيل المثال title: الصورة الرأسية @@ -445,6 +451,7 @@ ar: title: المستخدِمون المصرح لهم لإرسال الدعوات registrations_mode: modes: + approved: طلب الموافقة لازم عند إنشاء حساب none: لا أحد يمكنه إنشاء حساب open: يمكن للجميع إنشاء حساب title: طريقة إنشاء الحسابات @@ -473,12 +480,15 @@ ar: desc_html: عرض الخيط العمومي على صفحة الاستقبال title: مُعاينة الخيط العام title: إعدادات الموقع + trends: + title: الوسوم المتداولة statuses: back_to_account: العودة إلى صفحة الحساب batch: delete: حذف nsfw_off: تعيينه كمنشور غير حساس nsfw_on: تعيينه كمنشور حساس + deleted: محذوف failed_to_execute: خطأ في التفعيل media: title: الوسائط @@ -488,7 +498,11 @@ ar: with_media: تحتوي على وسائط tags: context: السياق + in_directory: "%{count} في سجل حسابات المستخدمين" title: الوسوم + trending_right_now: متداول اللحظة + unreviewed: غير مُراجَع + updated_msg: تم تحديث إعدادات الوسوم بنجاح title: الإدارة warning_presets: add_new: إضافة واحد جديد @@ -505,6 +519,7 @@ ar: subject: تقرير جديد ل%{instance} (#%{id}) appearance: advanced_web_interface: واجهة الويب المتقدمة + animations_and_accessibility: الإتاحة والحركة confirmation_dialogs: نوافذ التأكيد discovery: استكشاف sensitive_content: محتوى حساس @@ -529,6 +544,8 @@ ar: checkbox_agreement_without_rules_html: أوافق على شروط الخدمة delete_account: حذف حساب delete_account_html: إن كنت ترغب في حذف حسابك يُمكنك المواصلة هنا. سوف يُطلَبُ منك التأكيد قبل الحذف. + description: + prefix_sign_up: أنشئ حسابًا على ماستدون اليوم! didnt_get_confirmation: لم تتلق تعليمات التأكيد ؟ forgot_password: نسيت كلمة المرور ؟ invalid_reset_password_token: رمز إعادة تعيين كلمة المرور غير صالح أو منتهي الصلاحية. يرجى طلب واحد جديد. @@ -546,6 +563,8 @@ ar: reset_password: إعادة تعيين كلمة المرور security: الأمان set_new_password: إدخال كلمة مرور جديدة + setup: + title: الضبط status: account_status: حالة الحساب functional: حسابك جاهز. @@ -576,28 +595,26 @@ ar: x_months: "%{count} شه" x_seconds: "%{count}ث" deletes: - bad_password_msg: محاولة جيدة يا هاكرز! كلمة السر خاطئة + bad_password_msg: إنّ الكلمة السرية التي أدخلتها غير صحيحة confirm_password: قم بإدخال كلمتك السرية الحالية للتحقق من هويتك proceed: حذف حساب success_msg: تم حذف حسابك بنجاح - warning_title: توافر المحتوى المنشور و المبعثَر directories: directory: سِجلّ الحسابات - enabled: إنّ حسابك الآن ضمن فهرس المستخدِمين. explanation: استكشف مستخدِمين آخرين حسب المواضيع التي تهمهم explore_mastodon: استكشف %{title} - people: - few: "%{count} شخص" - many: "%{count} شخص" - one: "%{count} شخص" - other: "%{count} شخص" - two: "%{count} شخص" - zero: "%{count} شخص" + domain_blocks: + domain: النطاق + severity: القوّة + silence: اكتم + suspension: علّقه domain_validator: invalid_domain: ليس بإسم نطاق صالح errors: + '400': The request you submitted was invalid or malformed. '403': ليس لك الصلاحيات الكافية لعرض هذه الصفحة. '404': إنّ الصفحة التي تبحث عنها لا وجود لها أصلا. + '406': This page is not available in the requested format. '410': إنّ الصفحة التي تبحث عنها لم تعد موجودة. '422': content: فشل التحقق الآمن. ربما منعتَ كعكات الكوكيز؟ @@ -606,6 +623,7 @@ ar: '500': content: نحن متأسفون، لقد حدث خطأ ما مِن جانبنا. title: هذه الصفحة خاطئة + '503': The page could not be served due to a temporary server failure. noscript_html: يرجى تفعيل الجافا سكريبت لاستخدام تطبيق الويب لماستدون، أو عِوض ذلك قوموا بتجريب إحدى التطبيقات الأصلية الدّاعمة لماستدون على منصّتكم. existing_username_validator: not_found_multiple: تعذر العثور على %{usernames} @@ -646,6 +664,7 @@ ar: developers: المطورون more: المزيد… resources: الموارد + trending_now: المتداولة الآن generic: all: الكل changes_saved_msg: تم حفظ التعديلات بنجاح! @@ -787,6 +806,7 @@ ar: errors: already_voted: لقد قمت بالتصويت على استطلاع الرأي هذا مِن قبل duplicate_options: يحتوي على عناصر مكررة + duration_too_long: بعيد جدا في المستقبَل duration_too_short: مبكّر جدا expired: لقد انتهى استطلاع الرأي preferences: @@ -799,6 +819,7 @@ ar: last_active: آخر نشاط most_recent: الأحدث moved: هاجر + mutual: متبادل primary: رئيسي relationship: العلاقة remove_selected_domains: احذف كافة المتابِعين القادمين مِن النطاقات المختارة @@ -960,6 +981,7 @@ ar: title: المغادرة بأرشيف الحساب warning: review_server_policies: مراجعة شروط السيرفر + statuses: 'خصيصا لـ:' subject: disable: تم تجميد حسابك %{acct} none: تحذير إلى %{acct} diff --git a/config/locales/ast.yml b/config/locales/ast.yml index 30390c163..e801d4b51 100644 --- a/config/locales/ast.yml +++ b/config/locales/ast.yml @@ -133,19 +133,18 @@ ast: deletes: bad_password_msg: "¡Bon intentu, crackers! Contraseña incorreuta" confirm_password: Introduz la contraseña pa verificar la to identidá - directories: - people: - one: "%{count} persona" - other: "%{count} persones" errors: + '400': The request you submitted was invalid or malformed. '403': Nun tienes permisu pa ver esta páxina. '404': La páxina que tabes guetando nun esiste. + '406': This page is not available in the requested format. '410': La páxina que tabes guetando yá nun esiste. '422': content: Falló la verificación de seguranza. ¿Tas bloquiando les cookies? title: Falló la verificación de seguranza '429': Ficiéronse milenta solicitúes '500': + '503': The page could not be served due to a temporary server failure. exports: archive_takeout: date: Data diff --git a/config/locales/bg.yml b/config/locales/bg.yml index e11340542..85431bc8d 100644 --- a/config/locales/bg.yml +++ b/config/locales/bg.yml @@ -48,12 +48,15 @@ bg: x_months: "%{count} м" x_seconds: "%{count} сек" errors: + '400': The request you submitted was invalid or malformed. '403': You don't have permission to view this page. '404': The page you are looking for isn't here. + '406': This page is not available in the requested format. '410': The page you were looking for doesn't exist here anymore. '422': '429': Throttled '500': + '503': The page could not be served due to a temporary server failure. exports: blocks: Вашите блокирания follows: Вашите следвания diff --git a/config/locales/bn.yml b/config/locales/bn.yml index b3eb0bd62..5f05fe30e 100644 --- a/config/locales/bn.yml +++ b/config/locales/bn.yml @@ -140,12 +140,15 @@ bn: pending: পয্র্যবেক্ষণের অপেক্ষায় আছে perform_full_suspension: বাতিল করা errors: + '400': The request you submitted was invalid or malformed. '403': You don't have permission to view this page. '404': The page you are looking for isn't here. + '406': This page is not available in the requested format. '410': The page you were looking for doesn't exist here anymore. '422': '429': Throttled '500': + '503': The page could not be served due to a temporary server failure. invites: expires_in: '1800': 30 minutes diff --git a/config/locales/ca.yml b/config/locales/ca.yml index 64bd68e54..a23b6ddf4 100644 --- a/config/locales/ca.yml +++ b/config/locales/ca.yml @@ -45,6 +45,8 @@ ca: what_is_mastodon: Què és Mastodon? accounts: choices_html: 'Eleccions de %{name}:' + endorsements_hint: Pots recomanar persones que segueixes a l'interfície de web, que apareixeran aquí. + featured_tags_hint: Pots presentar etiquetes específiques que seràn mostrades aquí. follow: Segueix followers: one: Seguidor @@ -186,6 +188,7 @@ ca: username: Nom d'usuari warn: Avís web: Web + whitelisted: Llista blanca action_logs: actions: assigned_to_self_report: "%{name} han assignat l'informe %{target} a ells mateixos" @@ -246,6 +249,7 @@ ca: updated_msg: Emoji s'ha actualitzat correctament! upload: Carrega dashboard: + authorized_fetch_mode: Mode d'obtenció autoritzat backlog: treballs en espera config: Configuració feature_deletions: Supressions del compte @@ -258,6 +262,8 @@ ca: features: Característiques hidden_service: Federació amb serveis ocults open_reports: informes oberts + pending_tags: etiquetes pendents de revisar + pending_users: usuaris pendents de revisar recent_users: Usuaris recents search: Cerca de text complet single_user_mode: Mode d'usuari únic @@ -269,11 +275,18 @@ ca: week_interactions: interaccions d'aquesta setmana week_users_active: usuaris actius aquesta setmana week_users_new: nous usuaris aquest setmana + whitelist_mode: Mode llista blanca + domain_allows: + add_new: Dominis autoritzats + created_msg: El domini ha estat correctament autoritzat + destroyed_msg: S'ha esborrat el domini de la llista blanca + undo: Treure de la llista blanca domain_blocks: add_new: Afegir nou bloqueig de domini created_msg: El bloqueig de domini ara s'està processant destroyed_msg: El bloqueig de domini s'ha desfet domain: Domini + edit: Editar el bloqueig del domini existing_domain_block_html: Ja has imposat uns limits més estrictes a %{name}, l'hauries de desbloquejar-lo primer. new: create: Crea un bloqueig @@ -284,6 +297,10 @@ ca: silence: Silenci suspend: Suspensió title: Bloqueig de domini nou + private_comment: Comentari privat + private_comment_hint: Comentari sobre aquesta limitació del domini per a ús intern dels moderadors. + public_comment: Comentari públic + public_comment_hint: Comentari pel públic general sobre aquesta limitació del domini, si la publicació de la llista de limitacions de domini està habilitada. reject_media: Rebutja els fitxers multimèdia reject_media_hint: Elimina els fitxers multimèdia emmagatzemats localment i impedeix baixar-ne cap en el futur. Irrellevant en les suspensions reject_reports: Rebutja informes @@ -303,6 +320,7 @@ ca: title: Desfés el bloqueig de domini de %{domain} undo: Desfés undo: Desfés el bloqueig del domini + view: Veure el bloqueig del domini email_domain_blocks: add_new: Afegir nou created_msg: S'ha creat el bloc de domini de correu electrònic @@ -326,6 +344,8 @@ ca: all: Totes limited: Limitades title: Moderació + private_comment: Comentari privat + public_comment: Comentari públic title: Federació total_blocked_by_us: Bloquejats per nosaltres total_followed_by_them: Seguits per ells @@ -403,6 +423,13 @@ ca: custom_css: desc_html: Modifica l'aspecte amb CSS carregat a cada pàgina title: CSS personalitzat + domain_blocks: + all: Per a tothom + disabled: Per a ningú + title: Mostra els bloquejos de domini + users: Per als usuaris locals en línia + domain_blocks_rationale: + title: Mostra el raonament hero: desc_html: Es mostra en pàgina frontal. Recomanat al menys 600x100px. Si no es configura es mostrarà el del servidor title: Imatge d’heroi @@ -463,6 +490,9 @@ ca: desc_html: Mostra la línia de temps pública a la pàgina inicial title: Vista prèvia de la línia de temps title: Configuració del lloc + trends: + desc_html: Mostra públicament les etiquetes revisades anteriorment que actualment estan en tendència + title: Etiquetes tendència statuses: back_to_account: Torna a la pàgina del compte batch: @@ -477,7 +507,19 @@ ca: title: Estats del compte with_media: Amb contingut multimèdia tags: + accounts_today: Usos únics actuals + accounts_week: Usos únics d'aquesta setmana + breakdown: Desglossament de l’ús actual per origen + context: Context + directory: En el directori + in_directory: "%{count} en el directori" + review: Revisar l'estat + reviewed: Revisades title: Etiquetes + trending_right_now: Actualment en tendència + unique_uses_today: "%{count} publicacions d'avui" + unreviewed: Sense revisar + updated_msg: Ajustaments d'etiquetes actualitzats amb èxit title: Administració warning_presets: add_new: Afegir nou @@ -493,11 +535,15 @@ ca: body: "%{reporter} ha informat de %{target}" body_remote: Algú des de el domini %{domain} ha informat sobre %{target} subject: Informe nou per a %{instance} (#%{id}) + new_trending_tag: + body: 'La etiqueta #%{name} està actualment en tendència però no s''ha revisat prèviament. No es mostrarà públicament tret que ho permetis o guardis el formulari tal com està per a no tornar a escoltar res al respecte.' + subject: Nova etiqueta pendent de revisió a %{instance} (#%{name}) appearance: advanced_web_interface: Interfície web avançada advanced_web_interface_hint: 'Si vols fer ús de tota l''amplada de la teva pantalla, l''interfície web avançada et permet configurar diverses columnes per a veure molta més informació al mateix temps: Inici, notificacions, línia de temps federada i qualsevol número de llistes i etiquetes.' animations_and_accessibility: Animacions i accessibilitat confirmation_dialogs: Diàlegs de confirmació + discovery: Descobriment sensitive_content: Contingut sensible application_mailer: notification_preferences: Canvia les preferències de correu @@ -518,6 +564,7 @@ ca: apply_for_account: Demana una invitació change_password: Contrasenya checkbox_agreement_html: Estic d'acord amb les normes del servidor i els termes del servei + checkbox_agreement_without_rules_html: Acepto els termes del servei delete_account: Suprimeix el compte delete_account_html: Si vols suprimir el compte pots fer-ho aquí. Se't demanarà confirmació. didnt_get_confirmation: No has rebut el correu de confirmació? @@ -544,6 +591,7 @@ ca: status: account_status: Estat del compte confirming: Esperant que es completi la confirmació del correu electrònic. + functional: El teu compte és plenament operatiu. pending: La vostra sol·licitud està pendent de revisió pel nostre personal. Això pot trigar una mica. Rebreu un correu electrònic quan sigui aprovada. trouble_logging_in: Problemes per iniciar la sessió? authorize_follow: @@ -574,24 +622,36 @@ ca: deletes: bad_password_msg: Bon intent hackers! La contrasenya no és correcta confirm_password: Introdueix la contrasenya actual per a verificar la identitat - description_html: Això eliminarà de forma irreversible i permanent el contingut del teu compte i el desactivarà. El teu nom d'usuari romandrà reservat per evitar que algú volgués fer-se passar per tu. proceed: Suprimeix el compte success_msg: El compte s'ha eliminat correctament - warning_html: Només és garantida l'eliminació del contingut d'aquest servidor en particular. El contingut que s'ha compartit àmpliament deixa petjades. Els servidors fora de línia i els que ja no estan subscrits no actualitzaran les seves bases de dades. - warning_title: Disponibilitat de contingut disseminat directories: directory: Directori de perfils - enabled: Actualment estàs inclòs al directori. - enabled_but_waiting: Has optat per aparèixer al directori però encara no tens el nombre mínim de seguidors (%{min_followers}) per ser-hi. explanation: Descobreix usuaris segons els seus interessos explore_mastodon: Explora %{title} - how_to_enable: Actualment no tens activat ser al directori. Pots optar-hi a continuació. Utilitza etiquetes en el teu text bio per incloure't sota etiquetes especifiques! - people: - one: "%{count} persona" - other: "%{count} gent" + domain_blocks: + blocked_domains: Llistat dels dominis limitats i bloquejats + description: Aquesta és la llista de servidors que %{instance} limita o en rebutja la federació. + domain: Domini + media_block: Bloqueig multimèdia + no_domain_blocks: "(Sense bloquejos de domini)" + severity: Severitat + severity_legend: + media_block: Els fitxers multimèdia procedents del servidor no es poden recuperar, emmagatzemar ni mostrar a l'usuari. + silence: Es poden trobar comptes de servidors silenciats, seguits i amb interacció, però els seus tuts no apareixeran en les línies de temps públiques i les seves notificacions no arribaran als usuaris locals que no els segueixen. + suspension: No s’emmagatzema ni es mostra contingut de servidors en suspens, ni se’ls envia cap contingut. S'ignoren les interaccions dels servidors suspesos. + suspension_disclaimer: Els servidors suspesos poden ocasionalment recuperar contingut públic d’aquest servidor. + title: Severitats + show_rationale: Mostra el raonament + silence: Silenci + suspension: Suspensió + title: "%{instance} Llistat de les instàncies bloquejades" + domain_validator: + invalid_domain: no es un nom de domini vàlid errors: + '400': The request you submitted was invalid or malformed. '403': No tens permís per a veure aquesta pàgina. '404': La pàgina que estàs cercant no és aquí. + '406': This page is not available in the requested format. '410': La pàgina que estàs cercant ja no existeix. '422': content: La verificació de seguretat ha fallat. Tens les galetes blocades? @@ -600,6 +660,7 @@ ca: '500': content: Ho sentim, però alguna cosa ha fallat a la nostra banda. title: Aquesta pàgina no es correcta + '503': The page could not be served due to a temporary server failure. noscript_html: Per a utilitzar Mastodon, activa el JavaScript. També pots provar una de les aplicacions natives de Mastodon per a la vostra plataforma. existing_username_validator: not_found: no s'ha pogut trobar cap usuari local amb aquest nom d'usuari @@ -623,6 +684,7 @@ ca: add_new: Afegir nova errors: limit: Ja has mostrat la quantitat màxima d'etiquetes + hint_html: "Què son les etiquetes destacades? Es mostren de manera destacada en el teu perfil públic i permeten a les persones navegar per les teves publicacions amb aquestes etiquetes. Són una gran eina per fer un seguiment de treballs creatius o de projectes a llarg termini." filters: contexts: home: Línia de temps Inici @@ -643,6 +705,7 @@ ca: developers: Desenvolupadors more: Més… resources: Recursos + trending_now: En tendència generic: all: Tot changes_saved_msg: Els canvis s'han desat correctament! @@ -925,6 +988,8 @@ ca: pinned: Toot fixat reblogged: ha impulsat sensitive_content: Contingut sensible + tags: + does_not_match_previous_name: no coincideix amb el nom anterior terms: body_html: |

Política de Privacitat

diff --git a/config/locales/co.yml b/config/locales/co.yml index 94c363511..8ecff0d59 100644 --- a/config/locales/co.yml +++ b/config/locales/co.yml @@ -58,6 +58,7 @@ co: media: Media moved_html: "%{name} hà cambiatu di contu, avà hè nant’à %{new_profile_link}:" network_hidden: St'infurmazione ùn hè micca dispunibule + never_active: Mai nothing_here: Ùn c’hè nunda quì! people_followed_by: Seguitati da %{name} people_who_follow: Seguitanu %{name} @@ -224,10 +225,12 @@ co: deleted_status: "(statutu sguassatu)" title: Ghjurnale d’audit custom_emojis: + assign_category: Aghjunghje categuria by_domain: Duminiu copied_msg: Copia lucale di l’emoji creata copy: Cupià copy_failed_msg: Ùn s’hè micca pussutu creà una copia di l’emoji + create_new_category: Creà nova categuria created_msg: L’emoji hè stata creata! delete: Toglie destroyed_msg: L’emoji hè stata tolta! @@ -244,6 +247,7 @@ co: shortcode: Accorta shortcode_hint: 2 caratteri o più, solu lettere, numeri è liniette basse title: Emoji parsunalizate + uncategorized: Micca categurizatu unlisted: Micca listata update_failed_msg: Ùn s’hè micca pussutu mette à ghjornu l’emoji updated_msg: L’emoji hè stata messa à ghjornu! @@ -499,6 +503,7 @@ co: delete: Toglie nsfw_off: Indicà cum’è micca sensibile nsfw_on: Indicà cum’è sensibile + deleted: Sguassatu failed_to_execute: Esecuzione impussibule media: title: Media @@ -567,6 +572,10 @@ co: checkbox_agreement_without_rules_html: Accettu i termini di u serviziu delete_account: Sguassà u contu delete_account_html: S’è voi vulete toglie u vostru contu ghjè quì. Duverete cunfirmà a vostra scelta. + description: + prefix_invited_by_user: "@%{name} v'invita à raghjunghje stu servore di Mastodon!" + prefix_sign_up: Arregistratevi nant'à Mastodon oghji! + suffix: Cù un contu, puderete siguità l'altri, pustà statuti è scambià missaghji cù l'utilizatori di tutti i servori Mastodon è ancu di più! didnt_get_confirmation: Ùn avete micca ricevutu l’istruzione di cunfirmazione? forgot_password: Chjave scurdata? invalid_reset_password_token: U ligame di riinizializazione di a chjave d’accessu hè spiratu o ùn hè micca validu. Pudete dumandà un'altru ligame. @@ -622,21 +631,23 @@ co: deletes: bad_password_msg: È nò! Sta chjave ùn hè curretta confirm_password: Entrate a vostra chjave d’accessu attuale per verificà a vostra identità - description_html: U contu sarà deattivatu è u cuntenutu sarà sguassatu di manera permanente è irreversibile. Ùn sarà micca pussibule piglià stu cugnome torna per evità l’impusture. proceed: Sguassà u contu success_msg: U vostru contu hè statu sguassatu - warning_html: Pudete esse sicuru·a solu chì u cuntenutu sarà sguassatu di stu servore. S’ellu hè statu spartutu in altrò, sarà forse sempre quallà. I servori scunettati è quelli ch'ùn sò più abbunati à e vostre pubblicazione ùn anu micca da mette à ghjornu e so database. - warning_title: Dispunibilità di i cuntenuti sparsi + warning: + before: 'Nanz''à cuntinuà, leghjete ste note attentamente:' + caches: U cuntinutu indè u cache di l'altri servori sarà forse cunservatu + data_removal: I vostri posti è dati saranu sguassati di manera permanente + email_change_html: Pudete cambià u vostr'indirizzu e-mail senza toglie u vostru contu + email_contact_html: S'ellu ùn hè sempre micca rimettu, pudete dumandà aiutu à %{email} + email_reconfirmation_html: S'e voi ùn ricevete micca l'e-mail di cunfirmazione, pudete richiestà un'altru + irreversible: Ùn puderete micca ricuperà o riattivà u vostru contu + more_details_html: Per più di ditagli, videte a pulitica di vita privata. + username_available: U vostru cugnome riduvinterà dispunibule + username_unavailable: U vostru cugnome ùn sarà sempre micca dispunibule directories: directory: Annuariu di i prufili - enabled: Site inscrittu·a indè l'annuariu. - enabled_but_waiting: Avete sceltu d'esse inscrittu·a indè l'annuariu, mà ùn avete micca ancu u numeru minimale d'abbunati (%{min_followers}) per esse listatu·a. explanation: Scopre utilizatori à partesi di i so centri d'interessu explore_mastodon: Scopre à %{title} - how_to_enable: Ùn site micca ancu inscrittu·a indè l'annuariu. Pudete inscrive vi quì sottu. Utilizate qualchi hashtag indè a vostra biugrafia per esse listatu·a indè tag specifichi! - people: - one: "%{count} persona" - other: "%{count} persone" domain_blocks: blocked_domains: Lista di dumini bluccati è limitati description: Quessa ghjè a lista di i servori limitati da o cù quelli %{instance} righjetta a federazione. @@ -657,8 +668,10 @@ co: domain_validator: invalid_domain: ùn hè micca un nome di duminiu currettu errors: + '400': A richiesta mandata ùn era micca valida o curretta. '403': Ùn site micca auturizatu·a à vede sta pagina. '404': Sta pagina ùn esiste micca quì. + '406': A pagina ùn hè micca dispunivule in u furmatu riquisitu. '410': Sta pagina ùn esiste più quì. '422': content: C’hè statu un prublemu cù a verificazione di sicurità. Forse bluccate cookies? @@ -667,6 +680,7 @@ co: '500': content: Scusate, mà c’hè statu un prublemu cù u nostru servore. title: Sta pagina ùn hè curretta + '503': A pagina ùn hè micca stata servita per via di un prublemu timpuraneu di u servore. noscript_html: Mastodon nant’à u web hà bisognu di JavaScript per funziunà. Pudete ancu pruvà l’applicazione native per a vostra piattaforma. existing_username_validator: not_found: ùn si pudeva micca truvà un'utilizatore lucale cù stu cugnome @@ -716,6 +730,7 @@ co: all: Tuttu changes_saved_msg: Cambiamenti salvati! copy: Cupià + no_batch_actions_available: Alcun'azzione di gruppu nant'à sta pagina order_by: Urdinà da save_changes: Salvà e mudificazione validation_errors: @@ -1101,7 +1116,7 @@ co: recovery_codes: Codici di ricuperazione recovery_codes_regenerated: Codici di ricuperazione ricreati recovery_instructions_html: Pudete fà usu di i codici quì sottu per sempre avè accessu à u vostru contu s’ellu hè statu persu u vostru telefuninu. Guardateli in una piazza sicura. Per esempiu, stampati è cunservati cù altri ducumenti impurtanti. - setup: Installà + setup: Attivà wrong_code: U codice ùn hè micca currettu! Site sicuru che l’ora di u telefuninu è di u servore sò esatte? user_mailer: backup_ready: @@ -1113,7 +1128,9 @@ co: disable: Quandu u vostru contu hè ghjacciatu, i vostri dati stannu intatti, mà ùn pudete fà nunda fin'à ch'ellu sia sbluccatu. silence: Quandu u vostru contu hè limitatu, solu quelli chì sò digià abbunati à u vostru contu viderenu i vostri statuti nant'à quessu servore, è puderete esse esclusu·a di parechje liste pubbliche. Però, altri conti puderenu sempre seguitavi. suspend: U vostru contu hè statu suspesu, è tutti i vo statuti è fugliali media caricati sò stati sguassati di manera irreversibile di stu servore, è di i servori induve aviate abbunati. + get_in_touch: Pudete risponde à quest'e-mail per cuntattà a squadra di muderazione di %{instance}. review_server_policies: Leghje e pulitiche di u servore + statuses: 'Più pricisamente, per:' subject: disable: U vostru contu %{acct} hè statu ghjacciatu none: Avertimentu pè %{acct} diff --git a/config/locales/cs.yml b/config/locales/cs.yml index c07da5245..46700be56 100644 --- a/config/locales/cs.yml +++ b/config/locales/cs.yml @@ -49,6 +49,8 @@ cs: what_is_mastodon: Co je Mastodon? accounts: choices_html: 'Volby uživatele %{name}:' + endorsements_hint: Z webového rozhraní můžete podpořit lidi, které sledujete. Ti se poté zobrazí zde. + featured_tags_hint: Můžete vybrat konkrétní hashtagy, které se zobrazí zde. follow: Sledovat followers: few: Sledující @@ -62,6 +64,7 @@ cs: media: Média moved_html: "%{name} se přesunul/a na %{new_profile_link}:" network_hidden: Tato informace není k dispozici + never_active: Nikdy nothing_here: Tady nic není! people_followed_by: Lidé, které sleduje %{name} people_who_follow: Lidé, kteří sledují uživatele %{name} @@ -194,6 +197,7 @@ cs: username: Uživatelské jméno warn: Varovat web: Web + whitelisted: Na bílé listině action_logs: actions: assigned_to_self_report: "%{name} přidělil/a hlášení %{target} sobě" @@ -254,6 +258,7 @@ cs: updated_msg: Emoji úspěšně aktualizováno! upload: Nahrát dashboard: + authorized_fetch_mode: Autorizovaný režim fetch backlog: opožděné úlohy config: Konfigurace feature_deletions: Smazání účtů @@ -266,6 +271,8 @@ cs: features: Vlastnosti hidden_service: Federace se skrytými službami open_reports: otevřená hlášení + pending_tags: hashtagů čeká na posouzení + pending_users: uživatelů recent_users: Nedávní uživatelé search: Fulltextové vyhledávání single_user_mode: Režim jednoho uživatele @@ -277,11 +284,18 @@ cs: week_interactions: interakcí tento týden week_users_active: aktivních tento týden week_users_new: uživatelů tento týden + whitelist_mode: Režim bílé listiny + domain_allows: + add_new: Přidat doménu na bílou listinu + created_msg: Doména byla úspěšně přidána na bílou listinu + destroyed_msg: Doména byla odstraněna z bílé listiny + undo: Odstranit z bílé listiny domain_blocks: add_new: Přidat novou blokaci domény created_msg: Blokace domény se právě vyřizuje destroyed_msg: Blokace domény byla zrušena domain: Doména + edit: Upravit doménovou blokaci existing_domain_block_html: Pro účet %{name} jste již nastavil/a přísnější omezení, musíte jej nejdříve odblokovat. new: create: Vytvořit blokaci @@ -292,6 +306,10 @@ cs: silence: Utišit suspend: Pozastavit title: Nová doménová blokace + private_comment: Soukromý komentář + private_comment_hint: Komentář o tomto omezení domény pro vnitřní použití moderátory. + public_comment: Veřejný komentář + public_comment_hint: Komentář o tomto omezení domény pro obecnou veřejnost, pokud je povoleno zobrazování seznamu omezení domén. reject_media: Odmítat mediální soubory reject_media_hint: Odstraní lokálně uložené mediální soubory a odmítne jejich stahování v budoucnosti. Nepodstatné pro pozastavení reject_reports: Odmítat nahlášení @@ -313,6 +331,7 @@ cs: title: Zrušit blokaci domény %{domain} undo: Odvolat undo: Odvolat blokaci domény + view: Zobrazit doménovou blokaci email_domain_blocks: add_new: Přidat nový created_msg: E-mailová doména úspěšně přidána na černou listinu @@ -338,6 +357,8 @@ cs: all: Všechny limited: Omezené title: Moderování + private_comment: Soukromý komentář + public_comment: Veřejný komentář title: Federace total_blocked_by_us: Blokované námi total_followed_by_them: Sledované jimi @@ -415,6 +436,13 @@ cs: custom_css: desc_html: Pozměnit vzhled pomocí šablony CSS načtené na každé stránce title: Vlastní CSS + domain_blocks: + all: Všem + disabled: Nikomu + title: Zobrazit doménové blokace + users: Přihlášeným místním uživatelům + domain_blocks_rationale: + title: Zobrazit odůvodnění hero: desc_html: Zobrazuje se na hlavní stránce. Doporučuje se rozlišení alespoň 600x100 px. Pokud toto není nastaveno, bude zobrazena miniatura serveru title: Hlavní obrázek @@ -475,12 +503,16 @@ cs: desc_html: Zobrazit na hlavní straně veřejnou časovou osu title: Náhled časové osy title: Nastavení stránky + trends: + desc_html: Veřejně zobrazit předtím schválené hashtagy, které jsou aktuálně populární + title: Populární hashtagy statuses: back_to_account: Zpět na stránku účtu batch: delete: Smazat nsfw_off: Označit, že není citlivý nsfw_on: Označit jako citlivý + deleted: Smazáno failed_to_execute: Nepodařilo se vykonat media: title: Média @@ -489,7 +521,19 @@ cs: title: Tooty účtu with_media: S médii tags: + accounts_today: Jedinečná použití dnes + accounts_week: Jedinečná použití tento týden + breakdown: Přehled dnešního používání podle zdroje + context: Kontext + directory: V adresáři + in_directory: "%{count} v adresáři" + review: Stav schválení + reviewed: Schválen title: Hashtagy + trending_right_now: Aktuální trendy + unique_uses_today: "%{count} dnes píší" + unreviewed: Neposouzeno + updated_msg: Nastavení hashtagu bylo úspěšně aktualizováno title: Administrace warning_presets: add_new: Přidat nové @@ -505,11 +549,15 @@ cs: body: "%{reporter} nahlásil/a uživatele %{target}" body_remote: Někdo z %{domain} nahlásil uživatele %{target} subject: Nové nahlášení pro %{instance} (#%{id}) + new_trending_tag: + body: 'Hashtag #%{name} je dnes populární, nebyl však dříve schválen. Nebude zobrazen veřejně, pokud to nedovolíte. Můžete také pouze uložit formulář tak, jak je, a nikdy o něm opět neslyšet.' + subject: Nový hashtag ke schválení na %{instance} (#%{name}) appearance: advanced_web_interface: Pokročilé webové rozhraní advanced_web_interface_hint: 'Chcete-li využít celé šířky vaší obrazovky, dovolí vám pokročilé webové rozhraní nastavit si mnoho různých sloupců, takže můžete vidět ve stejnou chvíli tolik informací, kolik chcete: domovskou časovou osu, oznámení, federovanou časovou osu a libovolný počet seznamů a hashtagů.' animations_and_accessibility: Animace a přístupnost confirmation_dialogs: Potvrzovací dialogy + discovery: Objevování sensitive_content: Citlivý obsah application_mailer: notification_preferences: Změnit volby e-mailu @@ -530,8 +578,13 @@ cs: apply_for_account: Vyžádat si pozvánku change_password: Heslo checkbox_agreement_html: Souhlasím s pravidly serveru a podmínkami používání + checkbox_agreement_without_rules_html: Souhlasím s podmínkami používání delete_account: Odstranit účet delete_account_html: Chcete-li odstranit svůj účet, pokračujte zde. Budete požádán/a o potvrzení. + description: + prefix_invited_by_user: "@%{name} vás zve, abyste se přidal/a na tento server Mastodon!" + prefix_sign_up: Registrujte se na Mastodonu již dnes! + suffix: S účtem budete moci sledovat lidi, psát příspěvky a vyměňovat si zprávy s uživateli z kteréhokoliv serveru Mastodon a dalších služeb! didnt_get_confirmation: Neobdržel/a jste pokyny pro potvrzení? forgot_password: Zapomněl/a jste heslo? invalid_reset_password_token: Token pro obnovení hesla je buď neplatný, nebo vypršel. Prosím vyžádejte si nový. @@ -556,6 +609,7 @@ cs: status: account_status: Stav účtu confirming: Čekám na dokončení potvrzení e-mailu. + functional: Váš účet je zcela funkční. pending: Váš požadavek čeká na schválení naším personálem. To může nějakou dobu trvat. Pokud bude váš požadavek schválen, obdržíte e-mail. trouble_logging_in: Problémy s přihlašováním? authorize_follow: @@ -586,26 +640,47 @@ cs: deletes: bad_password_msg: Dobrý pokus, hackeři! Nesprávné heslo confirm_password: Zadejte svoje současné heslo pro ověření vaší identity - description_html: Tímto trvale a nenávratně odstraníte obsah z vašeho účtu a deaktivujete ho. Vaše uživatelské jméno zůstane rezervované pro zabránění budoucím napodobováním. proceed: Odstranit účet success_msg: Váš účet byl úspěšně odstraněn - warning_html: Pouze vymazání obsahu z tohoto konkrétního serveru je zaručeno. Obsah, který byl široce sdílen, po sobě pravděpodobně zanechá stopy. U offline serverů a serverů, které vaše aktualizace již neodebírají, nebudou databáze aktualizovány. - warning_title: Dostupnost rozšířeného obsahu + warning: + before: 'Před pokračováním si prosím pečlivě přečtěte tyto poznámky:' + caches: Obsah, který byl uložen do cache jiných serverů, nemusí být smazán + data_removal: Vaše příspěvky a další data budou trvale smazána + email_change_html: Můžete si změnit svou e-mailovou adresu bez smazání účtu + email_contact_html: Pokud stále nepřijde, můžete požádat o pomoc zasláním e-mailu na %{email} + email_reconfirmation_html: Pokud neobdržíte potvrzovací e-mail, můžete si ho vyžádat znovu + irreversible: Nebudete moci obnovit nebo znovu aktivovat váš účet + more_details_html: Více detailů najdete v zásadách soukromí. + username_available: Vaše uživatelské jméno bude opět dostupné + username_unavailable: Vaše uživatelské jméno zůstane nedostupným directories: directory: Adresář profilů - enabled: Aktuálně jste v adresáři uveden/a. - enabled_but_waiting: Přihlásil/a jste se k uvedení v adresáři, ale ještě nemáte minimální počet sledujících (%{min_followers}) pro uvedení. explanation: Objevujte uživatele podle jejich zájmů explore_mastodon: Prozkoumejte %{title} - how_to_enable: Aktuálně nejste přihlášen/a do adresáře. Přihlásit se můžete níže. Použijte ve svém popisu profilu hashtagy, abyste mohl/a být uveden/a pod konkrétními hashtagy! - people: - few: "%{count} lidé" - many: "%{count} lidí" - one: "%{count} člověk" - other: "%{count} lidí" + domain_blocks: + blocked_domains: Seznam omezených a blokovaných domén + description: Tohle je seznam serverů, které server %{instance} omezuje nebo odmítá federaci. + domain: Doména + media_block: Blokace médií + no_domain_blocks: "(Žádné blokované domény)" + severity: Přísnost + severity_legend: + media_block: Mediální soubory přicházející ze serveru nejsou stahovány, ukládány ani zobrazovány uživatelům. + silence: Účty z utišených serverů lze nalézt, sledovat a interagovat s nimi, ale jejich tooty nebudou zobrazovány na veřejných časových osách a oznámení od nich se nedostanou k místním uživatelům, kteří je nesledují. + suspension: Z pozastavených serverů se neukládá ani nezobrazuje žádný obsah, ani se naně žádný obsah neposílá. Interakce z pozastavených serverů jsou ignorovány. + suspension_disclaimer: Pozastavené servery mohou občas stahovat veřejný obsah z tohoto serveru. + title: Přísnosti + show_rationale: Zobrazit odůvodnění + silence: Utišení + suspension: Pozastavení + title: "%{instance} Seznam blokovaných serverů" + domain_validator: + invalid_domain: není platné doménové jméno errors: + '400': Požadavek, který jste odeslal/a, byl neplatný nebo poškozený. '403': Nemáte povolení zobrazit tuto stránku. '404': Stránka, kterou hledáte, tu není. + '406': Tato stránka není dostupná v požadovaném formátu. '410': Stránka, kterou hledáte, tu již neexistuje. '422': content: Bezpečnostní ověření selhalo. Neblokujete cookies? @@ -614,6 +689,7 @@ cs: '500': content: Omlouváme se, ale něco se u nás pokazilo. title: Tato stránka není správná + '503': Stránku nelze načíst kvůli dočasnému selhání serveru. noscript_html: Pro použití webové aplikace Mastodon prosím povolte JavaScript. Nebo zkuste jednu z nativních aplikací pro Mastodon pro vaši platformu. existing_username_validator: not_found: nelze najít místního uživatele s tímto uživatelským jménem @@ -637,6 +713,7 @@ cs: add_new: Přidat nový errors: limit: Již jste zvýraznil/a maximální počet hashtagů + hint_html: "Co jsou zvýrazněné hashtagy? Zobrazují se prominentně na vašem veřejném profilu a dovolují lidem prohlížet si vaše veřejné příspěvky konkrétně pod těmi hashtagy. Je to skvělý nástroj pro sledování kreativních děl nebo dlouhodobých projektů." filters: contexts: home: Domovská časová osa @@ -657,10 +734,12 @@ cs: developers: Vývojáři more: Více… resources: Zdroje + trending_now: Aktuální trendy generic: all: Všechny changes_saved_msg: Změny byly úspěšně uloženy! copy: Kopírovat + no_batch_actions_available: Pro tuto stránku nejsou dostupny žádné souhrnné akce order_by: Seřadit od save_changes: Uložit změny validation_errors: @@ -955,6 +1034,8 @@ cs: pinned: Připnutý toot reblogged: boostnul/a sensitive_content: Citlivý obsah + tags: + does_not_match_previous_name: se neshoduje s předchozím názvem terms: body_html: |

Zásady soukromí

@@ -1072,7 +1153,9 @@ cs: disable: Zatímco je váš účet zmražen, zůstávají data vašeho účtu nedotčená, ale nemůžete vykonávat žádné akce, dokud nebude odemčen. silence: Zatímco je váš účet omezen, mohou vaše tooty na tomto serveru vidět pouze lidé, kteří váš již sledují, a můžete být vyloučen/a z různých veřejných výpisů. Ostatní vás však pořád mohou manuálně sledovat. suspend: Váš účet byl pozastaven a všechny vaše tooty a vaše nahrané mediální soubory byly nenávratně odstraněny z tohoto serveru a serverů, na kterých jste měl/a sledující. + get_in_touch: Můžete odpovědět na tento e-mail a spojit se s personálem serveru %{instance}. review_server_policies: Posoudit politiku serveru + statuses: 'Konkrétně kvůli:' subject: disable: Váš účet %{acct} byl zmražen none: Varování pro uživatele %{acct} diff --git a/config/locales/cy.yml b/config/locales/cy.yml index 0763341a3..a1d637f2e 100644 --- a/config/locales/cy.yml +++ b/config/locales/cy.yml @@ -583,28 +583,17 @@ cy: deletes: bad_password_msg: Go dda, hacwyr! Cyfrinair anghywir confirm_password: Mewnbynnwch eich cyfrinair presennol i gadarnhau mai chi sydd yno - description_html: Bydd hyn yn cael gwared ar gynnwys o'ch cyfrif am byth heb fodd i'w adfer ac yn diffodd y cyfrif. Caiff eich eich enw defnyddiwr ei gadw i atal unrhyw ddynwarediadau yn y dyfodol. proceed: Dileu cyfrif success_msg: Llwyddwyd i ddileu eich cyfrif - warning_html: Dim ond dileu cynnwys o'r achos hwn ellid bod yn sicr ei fod wedi ei ddileu. Mae cynnwys sydd wedi ei rannu'n eang yn debygol o adael olion. Ni fydd gweinyddwyr all-lein a gweinyddwyr sydd wedi dad-danysgrifio o'ch diwedderiadau ddim yn diweddaru eu cronfeydd data. - warning_title: Argaeledd cynnwys wedi'i rannu directories: directory: Cyfeiriadur proffil - enabled: Rydych chi wedi'ch rhestru yn y cyfeiriadur ar hyn o bryd. - enabled_but_waiting: Rydych wedi dewis i chi gael eich rhestru yn y cyfeiriadur, ond nid oes gennych y nifer lleiaf o ddilynwyr (%{min_followers}) i'w rhestru eto. explanation: Darganfod defnyddwyr yn seiliedig ar eu diddordebau explore_mastodon: Archwilio %{title} - how_to_enable: Ar hyn o bryd nid ydych chi wedi dewis y cyfeiriadur. Gallwch ddewis i mewn isod. Defnyddiwch hashnodau yn eich bio-destun i'w restru dan hashnodau penodol! - people: - few: "%{count} o bobl" - many: "%{count} o bobl" - one: "%{count} berson" - other: "%{count} o bobl" - two: "%{count} o bobl" - zero: "%{count} person" errors: + '400': The request you submitted was invalid or malformed. '403': Nid oes gennych ganiatad i weld y dudalen hon. '404': Nid yw'r dudalen yr oeddech yn chwilio amdani'n bodoli. + '406': This page is not available in the requested format. '410': Nid yw'r dudalen yr oeddech yn chwilio amdani'n bodoli mwyach. '422': content: Methwyd i ddilysu diogelwch. A ydych chi'n blocio cwcîs? @@ -613,6 +602,7 @@ cy: '500': content: Mae'n ddrwg gennym ni, ond fe aeth rhywbeth o'i le ar ein rhan ni. title: Nid yw'r dudalen hon yn gywir + '503': The page could not be served due to a temporary server failure. noscript_html: I ddefnyddio ap gwe Mastodon, galluogwch JavaScript os gwlwch yn dda. Fel arall, gallwch drio un o'r apiau cynhenid ar gyfer Mastodon ar eich platfform. existing_username_validator: not_found: ni ddarganfwyd defnyddiwr lleol gyda'r enw cyfrif hynny diff --git a/config/locales/da.yml b/config/locales/da.yml index 160460cc2..70397c77b 100644 --- a/config/locales/da.yml +++ b/config/locales/da.yml @@ -4,21 +4,29 @@ da: about_hashtag_html: Disse er offentlige trut der indeholder tagget #%{hashtag}. Du kan interagere med dem hvis du har en konto hvor som helst i fediverset. about_mastodon_html: Mastodon er et socialt netværk der er baseret på åbne web protokoller og frit, open-source source software. Der er decentraliseret ligesom e-mail tjenester. about_this: Om + active_count_after: aktive administered_by: 'Administreret af:' + api: API apps: Apps til mobilen apps_platforms: Brug Mastodon på iOS, Android og andre platformer contact: Kontakt contact_missing: Ikke sat contact_unavailable: Ikke tilgængeligt + discover_users: Opdag brugere documentation: Dokumentation extended_description_html: |

Et godt sted for regler

Den udvidede beskrivelse er endnu ikke blevet opsat.

generic_description: "%{domain} er en server i netværket" + get_apps: Prøv en mobil app hosted_on: Mostodon hostet på %{domain} learn_more: Lær mere privacy_policy: Privatlivspolitik + see_whats_happening: Se hvad der sker source_code: Kildekode + status_count_after: + one: status + other: statusser status_count_before: Som har skrevet terms: Vilkår for service user_count_after: @@ -34,10 +42,12 @@ da: other: Følgere following: Følger joined: Tilmeldt den %{date} + last_active: sidst aktiv link_verified_on: Ejerskabet af dette link blev tjekket den %{date} media: Medier moved_html: "%{name} er flyttet til %{new_profile_link}:" network_hidden: Denne information er ikke tilgængelig + never_active: Aldrig nothing_here: Der er intet her! people_followed_by: Folk som %{name} følger people_who_follow: Folk der følger %{name} @@ -53,6 +63,7 @@ da: admin: Administrator bot: Robot moderator: Moderator + unavailable: Profil utilgængelig unfollow: Følg ikke længere admin: account_actions: @@ -63,6 +74,8 @@ da: delete: Slet destroyed_msg: Moderator notat succesfuldt destrueret! accounts: + approve: Godkend + approve_all: Godkend alle are_you_sure: Er du sikker? avatar: Profilbillede by_domain: Domæne @@ -76,6 +89,7 @@ da: confirm: Bekræft confirmed: Bekræftet confirming: Bekræfter + deleted: Slettet demote: Degrader disable: Deaktiver disable_two_factor_authentication: Deaktiver 2FA @@ -90,7 +104,9 @@ da: followers_url: Link til følgere follows: Følger inbox_url: Link til indbakke + invited_by: Inviteret af ip: IP-adresse + joined: Tilmeldt den location: all: Alle local: Lokalt @@ -100,7 +116,9 @@ da: media_attachments: Medie bilag memorialize: Omdan til et memoriam moderation: + active: Aktiv all: Alle + pending: Afventer silenced: Dæmpet suspended: Udelukket title: Moderasion @@ -116,6 +134,8 @@ da: public: Offentligt push_subscription_expires: PuSH abonnement udløber redownload: Opdater profil + reject: Afvis + reject_all: Afvis alle remove_avatar: Fjern profilbillede resend_confirmation: already_confirmed: Denne bruger er allerede blevet bekræftet @@ -147,11 +167,14 @@ da: undo_suspension: Fortryd udelukkelse unsubscribe: Abonner ikke længere username: Brugernavn + warn: Advar + whitelisted: Hvidlistet action_logs: actions: assigned_to_self_report: "%{name} tildelte anmeldelsen %{target} til sig selv" change_email_user: "%{name} ændrede email adressen for brugeren %{target}" confirm_user: "%{name} bekræftede %{target}s email adresse" + create_account_warning: "%{name} sendte en advarsel til %{target}" create_custom_emoji: "%{name} uploadede humørikonet %{target}" create_domain_block: "%{name} blokerede domænet %{target}" create_email_domain_block: "%{name} sortlistede email domænet %{target}" @@ -209,6 +232,7 @@ da: config: Konfiguration feature_deletions: Konto sletninger feature_invites: Invitations links + feature_profile_directory: Profilliste feature_registrations: Registreringer feature_relay: Føderations relæ features: Funktioner @@ -224,6 +248,8 @@ da: week_interactions: interaktioner denne uge week_users_active: aktive denne uge week_users_new: brugere denne uge + domain_allows: + undo: Fjern fra hvidliste domain_blocks: add_new: Tilføj ny domain block created_msg: Domæne blokade bliver nu behandlet @@ -238,6 +264,8 @@ da: silence: Dæmp suspend: Udeluk title: Ny domæne blokering + private_comment: Privat kommentar + public_comment: Offentlig kommentar reject_media: Afvis medie filer reject_media_hint: Fjerner lokalt lagrede multimedie filer og nægter at hente nogen i fremtiden. Irrelevant for udelukkelser reject_reports: Afvis anmeldelser @@ -263,8 +291,18 @@ da: title: Email sortliste followers: back_to_account: Tilbage til konto + title: "%{acct}'s følgere" instances: + by_domain: Domæne + moderation: + all: Alle + limited: Begrænset + private_comment: Privat kommentar + public_comment: Offentlig kommentar title: Førderation + total_blocked_by_us: Blokeret af os + total_followed_by_them: Fulgt af dem + total_followed_by_us: Fulgt af os invites: deactivate_all: Deaktiver alle filter: @@ -286,6 +324,7 @@ da: pending: Venter på godkendelse fra relæet save_and_enable: Gem og aktiver setup: Opsæt en videresendelses forbindelse + status: Status title: Videresendelser report_notes: created_msg: Anmeldelse note blev oprettet! @@ -315,6 +354,7 @@ da: reported_by: Anmeldt af resolved: Løst resolved_msg: Anmeldelse er sat til at være løst! + status: Status title: Anmeldelser unassign: Utildel unresolved: Uløst @@ -332,6 +372,9 @@ da: custom_css: desc_html: Ændre udseendet med CSS indlæst på hver side title: Brugerdefineret CSS + domain_blocks: + all: Til alle + disabled: Til ingen hero: desc_html: Vist på forsiden. Mindst 600x100px anbefales. Hvis ikke sat, vil dette falde tilbage til billedet fra serveren title: Billede af helt @@ -351,6 +394,10 @@ da: min_invite_role: disabled: Ingen title: Tillad invitationer af + registrations_mode: + modes: + none: Ingen kan tilmelde sig + open: Alle kan tilmelde sig show_known_fediverse_at_about_page: desc_html: Når slået til, vil det vise trut fra hele det kendte fedivers på forhåndsvisning. Ellers vil det kun vise lokale trut. title: Vis kendte fedivers på tidslinje forhåndsvisning @@ -383,6 +430,7 @@ da: delete: Slet nsfw_off: Marker som værende ikke følsomt nsfw_on: Marker som værende følsomt + deleted: Slettet failed_to_execute: Udførelsen kunne ikke lade sig gøre media: title: Multimedier @@ -390,13 +438,24 @@ da: no_status_selected: Ingen statusser blev ændret eller ingen blev valgt title: Konto statusser with_media: Med multimedier + tags: + accounts_today: Unikke brug i dag + accounts_week: Unikke brug denne uge + context: Kontekst + warning_presets: + delete: Slet + edit: Rediger admin_mailer: new_report: body: "%{reporter} har anmeldt %{target}" body_remote: Nogen fra %{domain} har anmeldt %{target} subject: Ny anmeldelse for %{instance} (#%{id}) + appearance: + discovery: Opdagelse + sensitive_content: Følsomt indhold application_mailer: notification_preferences: Ændre email præferencer + salutation: "%{name}" settings: 'Ændre email præferencer: %{link}' view: 'Se:' view_profile: Se profil @@ -410,9 +469,12 @@ da: warning: Vær meget forsigtig med disse data. Del dem aldrig med nogen! your_token: Din adgangs token auth: + apply_for_account: Anmod om en invitation change_password: Kodeord delete_account: Slet konto delete_account_html: Hvis du ønsker at slette din konto, kan du gøre det her. Du vil blive bedt om bekræftelse. + description: + prefix_sign_up: Tilmeld dig Mastodon i dag! didnt_get_confirmation: Har du endnu ikke modtaget instrukser for bekræftelse? forgot_password: Glemt dit kodeord? invalid_reset_password_token: Adgangskode nulstillings token er ugyldig eller udløbet. Anmod venligst om en ny. @@ -422,10 +484,14 @@ da: migrate_account_html: Hvis du ønsker at omdirigere denne konto til en anden, kan du gøre det her. or_log_in_with: Eller log in med register: Opret dig + registration_closed: "%{instance} accepterer ikke nye medlemmer" resend_confirmation: Gensend bekræftelses instrukser reset_password: Nulstil kodeord security: Sikkerhed set_new_password: Sæt et nyt kodeord + status: + account_status: Kontostatus + trouble_logging_in: Har du problemer med at logge på? authorize_follow: already_following: Du følger allerede denne konto error: Der opstod desværre en fejl under søgningen af denne fjerne konto @@ -450,14 +516,21 @@ da: deletes: bad_password_msg: Godt forsøg, hackere! Forkert kodeord confirm_password: Indtast dit nuværende kodeord for at bekræfte din identitet - description_html: Dette vil permanent, uigenkaldeligt fjerne indhold fra din konto samt deaktivere den. Dit brugernavn vil forblive reserveret for at forhindre fremtidige efterligninger. proceed: Slet konto success_msg: Din konto er nu blevet slettet - warning_html: Kun sletning af indhold fra denne specifikke server er garanteret. Indhold der er blevet delt rundt omkring vil sandsynligvis efterlade spor. Offline servere og servere der ikke længere abonnerer på dine opdateringer vil ikke opdatere deres databaser. - warning_title: Tilgængelighed af delt indhold + warning: + username_available: Dit brugernavn vil blive tilgængeligt igen + username_unavailable: Dit brugernavn vil forblive utilgængeligt + directories: + directory: Profilliste + explore_mastodon: Uforsk %{title} + domain_blocks: + domain: Domæne errors: + '400': The request you submitted was invalid or malformed. '403': Du har ikke tilladelse til at se denne side. '404': Den side du leder efter findes ikke. + '406': This page is not available in the requested format. '410': Den side du leder efter findes ikke mere. '422': content: Sikkerhedsbekræftelse mislykkedes. Blokerer du cookies? @@ -466,7 +539,11 @@ da: '500': content: Beklager men der gik noget galt i vores ende. title: Siden er ikke korrekt + '503': The page could not be served due to a temporary server failure. noscript_html: For at bruge Mastodon web applikationen, aktiver JavaScript. Alternativt kan du prøve en af disse apps til Mastodon for din platform. + existing_username_validator: + not_found: kunne ikke finde en lokal bruger med dette brugenavn + not_found_multiple: kunne ikke finde %{usernames} exports: archive_takeout: date: Dato @@ -476,7 +553,9 @@ da: request: Anmod om dit arkiv size: Størrelse blocks: Du blokerer + csv: CSV follows: Du følger + lists: Lister mutes: Du dæmper storage: Medie lager filters: @@ -499,14 +578,22 @@ da: developers: Udviklere more: Mere… resources: Ressourcer + trending_now: Hot lige nu generic: + all: Alle changes_saved_msg: Ændringerne blev gemt! copy: Kopier + order_by: Sorter efter save_changes: Gem ændringer validation_errors: one: Der er noget der ikke er helt som det bør være! Tag lige et kig på følgende fejl forneden other: Der er noget der ikke er helt som det bør være! Tag lige et kig på følgende %{count} fejl forneden + identity_proofs: + i_am_html: Jeg er %{username} på %{service}. + identity: Identitet imports: + modes: + overwrite: Overskriv preface: Du kan importere data du har eksporteret fra en anden server, så som en liste over folk du følger eller blokerer. success: Dine data blev succesfuldt uploaded og vil nu blive behandlet hurtigst muligt types: @@ -597,8 +684,19 @@ da: older: Ældre prev: Forrige truncate: "...…" + polls: + errors: + duration_too_long: er for langt ude i fremtiden + duration_too_short: er for tidligy + expired: Denne afstemning er allerede afsluttet preferences: other: Andet + public_timelines: Offentlige tidslinjer + relationships: + last_active: Sidst aktiv + moved: Flyttet + mutual: Fælles + primary: Primær remote_follow: acct: Indtast dit brugernavn@domæne du vil handle fra missing_resource: Kunne ikke finde det påkrævede omdirigerings link for din konto @@ -607,6 +705,7 @@ da: prompt: 'Du er ved at følge:' sessions: activity: Sidste aktivitet + browser: Browser browsers: alipay: Ali-pay blackberry: Blackberry OS @@ -628,11 +727,15 @@ da: current_session: Nuværrende session description: "%{browser} på %{platform}" explanation: Disse er de web browsere der på nuværende tidspunkt er logget ind på din Mastodon konto. + ip: IP platforms: adobe_air: Adobe air + android: Android blackberry: Blackberry OS chrome_os: Chromeos firefox_os: Firefox Os + ios: iOS + linux: Linux mac: Mac. other: ukendt platform windows: Microsoft windows @@ -642,6 +745,9 @@ da: revoke_success: Sessionen blev tilbagekaldt title: Sessioner settings: + account: Konto + account_settings: Kontoindstillinger + appearance: Udseende authorized_apps: Godkendte apps back: Tilbage til Mastodon delete: Sletning af konto @@ -649,9 +755,12 @@ da: edit_profile: Rediger profil export: Data eksportering import: Importer + import_and_export: Importer og eksporter migrate: Konto migrering notifications: Notifikationer preferences: Præferencer + profile: Profil + relationships: Følger og følgere two_factor_authentication: To-faktor godkendelse statuses: attached: @@ -659,6 +768,9 @@ da: image: one: "%{count} billede" other: "%{count} billeder" + video: + one: "%{count} video" + other: "%{count} videoer" boosted_from_html: Fremhævet fra %{acct_link} content_warning: 'Advarsel om indhold: %{warning}' disallowed_hashtags: @@ -672,6 +784,8 @@ da: ownership: Du kan ikke fastgøre en anden persons trut private: Ikke offentlige trut kan ikke blive fastgjort reblog: Fremhævede trut kan ikke fastgøres + poll: + vote: Stem show_more: Vis mere sign_in_to_participate: Log ind for at deltage i samtalen visibilities: @@ -713,6 +827,9 @@ da: explanation: Din anmodning for fuld backup af din Mastodon konto. Den er nu klar til at blive hentet! subject: Dit arkiv er klar til at blive hentet ned title: Udpluk af arkiv + warning: + title: + none: Advarsel welcome: edit_profile_action: Opsæt profil edit_profile_step: Du kan skræddersy din profil ved at uploade et profilbillede, overskrift, ændre dit visningsnavn og mere. Hvis du kunne tænke dig at gennemse nye følgere før de må følge dig, kan du låse din konto. @@ -736,3 +853,5 @@ da: otp_lost_help_html: Hvis du har mistet adgang til begge, kan du få kontakt via %{email} seamless_external_login: Du er logget ind via en ekstern service, så er kodeord og e-mail indstillinger ikke tilgængelige. signed_in_as: 'Logget ind som:' + verification: + verification: Verificering diff --git a/config/locales/de.yml b/config/locales/de.yml index 1e3e78878..0af7be2f4 100644 --- a/config/locales/de.yml +++ b/config/locales/de.yml @@ -45,7 +45,7 @@ de: what_is_mastodon: Was ist Mastodon? accounts: choices_html: "%{name} empfiehlt:" - endorsements_hint: Du kannst Personen unterstützen, die du von der Web-Schnittstelle folgen kannst, und sie werden hier angezeigt. + endorsements_hint: Du kannst Personen, denen du über die Weboberfläche folgst, auswählen, und sie werden hier angezeigt. featured_tags_hint: Du kannst spezifische Hashtags, die hier angezeigt werden, angeben. follow: Folgen followers: @@ -58,6 +58,7 @@ de: media: Medien moved_html: "%{name} ist auf %{new_profile_link} umgezogen:" network_hidden: Diese Informationen sind nicht verfügbar + never_active: Nie nothing_here: Hier gibt es nichts! people_followed_by: Profile, denen %{name} folgt people_who_follow: Profile, die %{name} folgen @@ -499,6 +500,7 @@ de: delete: Löschen nsfw_off: Als nicht heikel markieren nsfw_on: Als heikel markieren + deleted: Gelöscht failed_to_execute: Ausführen fehlgeschlagen media: title: Medien @@ -543,7 +545,7 @@ de: advanced_web_interface_hint: Wenn du mehr aus deiner Bildschirmbreite herausholen möchtest, erlaubt dir die fortgeschrittene Benutzeroberfläche viele unterschiedliche Spalten auf einmal zu sehen, wie z.B. deine Startseite, Benachrichtigungen, das gesamte bekannte Netz, deine Listen und beliebige Hashtags. animations_and_accessibility: Animationen und Barrierefreiheit confirmation_dialogs: Bestätigungsfenster - discovery: Erkennung + discovery: Entdecken sensitive_content: Heikle Inhalte application_mailer: notification_preferences: Ändere E-Mail-Einstellungen @@ -567,6 +569,10 @@ de: checkbox_agreement_without_rules_html: Ich stimme den Nutzungsbedingungen zu delete_account: Konto löschen delete_account_html: Falls du dein Konto löschen willst, kannst du hier damit fortfahren. Du wirst um Bestätigung gebeten werden. + description: + prefix_invited_by_user: "@%{name} lädt dich ein, diesem Server von Mastodon beizutreten!" + prefix_sign_up: Melde dich heute bei Mastodon an! + suffix: Mit einem Konto kannst du Leuten folgen, Updates veröffentlichen und Nachrichten mit Benutzern von jedem Mastodon-Server austauschen und mehr! didnt_get_confirmation: Keine Bestätigungs-Mail erhalten? forgot_password: Passwort vergessen? invalid_reset_password_token: Das Token zum Zurücksetzen des Passworts ist ungültig oder abgelaufen. Bitte fordere ein neues an. @@ -592,7 +598,7 @@ de: account_status: Kontostatus confirming: Warte auf die Bestätigung der E-Mail. functional: Dein Konto ist voll funktionsfähig. - pending: Deine Bewerbung wird von unseren Mitarbeitern noch nicht überprüft. Dies kann einige Zeit dauern. Du erhälst eine E-Mail, wenn deine Bewerbung genehmigt ist. + pending: Deine Bewerbung wird von unseren Mitarbeitern noch überprüft. Dies kann einige Zeit dauern. Du erhältst eine E-Mail, wenn deine Bewerbung genehmigt wurde. trouble_logging_in: Schwierigkeiten beim Anmelden? authorize_follow: already_following: Du folgst diesem Konto bereits @@ -622,21 +628,23 @@ de: deletes: bad_password_msg: Falsches Passwort confirm_password: Gib dein derzeitiges Passwort ein, um deine Identität zu bestätigen - description_html: Hiermit wird dauerhaft und unwiederbringlich der Inhalt deines Kontos gelöscht und dein Konto deaktiviert. Dein Profilname wird reserviert, um künftige Imitationen zu verhindern. proceed: Konto löschen success_msg: Dein Konto wurde erfolgreich gelöscht - warning_html: Wir können nur dafür garantieren, dass die Inhalte auf diesem einen Server gelöscht werden. Bei Inhalten, die weit verbreitet wurden, ist es wahrscheinlich, dass Spuren bleiben werden. Server, die offline sind oder keine Benachrichtigungen von deinem Konto mehr empfangen, werden ihre Datenbanken nicht bereinigen. - warning_title: Verfügbarkeit verstreuter Inhalte + warning: + before: 'Bevor du fortfährst, lese bitte diese Punkte sorgfältig durch:' + caches: Inhalte, die von anderen Servern zwischengespeichert wurden, können weiterhin bestehen + data_removal: Deine Beiträge und andere Daten werden dauerhaft entfernt + email_change_html: Du kannst deine E-Mail-Adresse ändern, ohne dein Konto zu löschen + email_contact_html: Wenn die Bestätigungs-E-Mail immer noch nicht ankam, kannst du eine E-Mail an %{email} senden, um weitere Hilfe zu erhalten + email_reconfirmation_html: Wenn du die Bestätigungs-E-Mail nicht erhalten hast, kannst du sie erneut anfordern + irreversible: Du kannst dein Konto nicht reaktivieren + more_details_html: Weitere Details findest du in der Datenschutzrichtlinie. + username_available: Dein Benutzername wird wieder verfügbar + username_unavailable: Dein Benutzername bleibt nicht verfügbar directories: directory: Profilverzeichnis - enabled: Du bist gerade in dem Verzeichnis gelistet. - enabled_but_waiting: Du bist damit einverstanden im Verzeichnis aufgelistet zu werden, aber du hast noch nicht genug Folger_innen (%{min_followers}). explanation: Entdecke Benutzer_innen basierend auf deren Interessen explore_mastodon: Entdecke %{title} - how_to_enable: Du hast dich gerade nicht dazu entschieden im Verzeichnis gelistet zu werden. Du kannst dich unten dafür eintragen. Benutze Hashtags in deiner Profilbeschreibung, um unter spezifischen Hashtags gelistet zu werden! - people: - one: "%{count} Person" - other: "%{count} Leute" domain_blocks: blocked_domains: Liste der begrenzten und blockierten Domains description: Dies ist die Liste der Server, die %{instance} limitiert oder dessen Föderation ablehnt. @@ -657,8 +665,10 @@ de: domain_validator: invalid_domain: ist kein gültiger Domain-Name errors: + '400': Die Anfrage, die du gesendet hast, war ungültig oder fehlerhaft. '403': Dir fehlt die Befugnis, diese Seite sehen zu können. '404': Die Seite nach der du gesucht hast wurde nicht gefunden. + '406': Diese Seite ist im gewünschten Format nicht verfügbar. '410': Die Seite nach der du gesucht hast existiert hier nicht mehr. '422': content: Sicherheitsüberprüfung fehlgeschlagen. Blockierst du Cookies? @@ -667,6 +677,7 @@ de: '500': content: Bitte verzeih, etwas ist bei uns schief gegangen. title: Diese Seite ist kaputt + '503': Die Seite konnte wegen eines temporären Serverfehlers nicht angezeigt werden. noscript_html: Bitte aktiviere JavaScript, um die Mastodon-Web-Anwendung zu verwenden. Alternativ kannst du auch eine der nativen Mastodon-Anwendungen für deine Plattform probieren. existing_username_validator: not_found: kann lokalen Benutzer nicht mit diesem Nuternamen finden @@ -1115,7 +1126,9 @@ de: disable: Solange dein Konto eingefroren ist, sind deine Benutzerdaten intakt; aber du kannst nichts tun, bis dein Konto entsperrt wurde. silence: Solange dein Konto limitiert ist, können nur die Leute, die dir bereits folgen, deine Beiträge auf dem Server sehen und es könnte sein, dass du von verschiedenen öffentlichen Listungen ausgeschlossen wirst. Andererseits können andere dir manuell folgen. suspend: Dein Konto wurde gesperrt und alle deine Beiträge und hochgeladenen Medien wurden unwiderruflich vom Server und anderen Servern, bei denen du Folgende hattest, gelöscht. + get_in_touch: Du kannst auf diese E-Mail antworten, um mit dem Personal von %{instance} in Kontakt zu treten. review_server_policies: Serverrichtlinien ansehen + statuses: 'Besonders für:' subject: disable: Dein Konto %{acct} wurde eingefroren none: Warnung für %{acct} diff --git a/config/locales/devise.da.yml b/config/locales/devise.da.yml index 4816d6456..1b05d77c1 100644 --- a/config/locales/devise.da.yml +++ b/config/locales/devise.da.yml @@ -2,7 +2,7 @@ da: devise: confirmations: - confirmed: Din email adresse er blevet succesfuldt bekræftet. + confirmed: Din e-mail er nu bekræftet. send_instructions: Du vil modtage en mail med instrukser for hvordan du bekræfter din email adresse om få minutter. Tjek venligst din spam mappe hvis du ikke har modtaget denne email. send_paranoid_instructions: Hvis din email adresse allerede findes i vores database, vil du modtage en email med instrukser for hvordan du bekræfter din email adresse om få minutter. Tjek gerne din spam mappe hvis du ikke modtager denne email. failure: @@ -12,6 +12,7 @@ da: last_attempt: Du har et forsøg tilbage før din konto låses. locked: Din konto er låst. not_found_in_database: Ugyldig %{authentication_keys} eller ugyldigt kodeord. + pending: Din konto er stadig under bedømmelse. timeout: Din session er udløbet. Log venligst ind igen for at fortsætte. unauthenticated: Du er nødt til at logge ind eller oprette dig for at fortsætte. unconfirmed: Du er nødt til at bekræfte din email adresse for at fortsætte. @@ -20,6 +21,7 @@ da: action: Bekræft email adresse action_with_app: Bekræft og vend tilbage til %{app} explanation: Du har oprettet en konto på %{host} med denne email adresse. Du er et klik fra at aktivere din konto. Hvis du ikke har oprettet dig, ignorer venligst denne email. + explanation_when_pending: Du har ansøgt om en invitation til %{host} med denne mailadresse. Når du bekræfter din mailadresse vil vi bedømme din ansøgning. Indtil da kan du ikke logge ind. Din data slettes hvis din ansøgning bliver afvist så du behøver ikke foretage yderligere handlinger. Hvis dette ikke var dig kan du ignorere denne mail. extra_html: Tjek også reglerne for serveren og vores betingelser. subject: 'Mastodon: Bekræftelses instrukser for %{instance}' title: Bekræft email adresse @@ -60,6 +62,7 @@ da: signed_up: Velkommen! Du har nu tilmeldt dig. signed_up_but_inactive: Du har nu oprettet dig. Vi kunne dog ikke logge dig ind da din konto endnu ikke er aktiveret. signed_up_but_locked: Du har nu oprettet dig. Vi kunne dog ikke logge dig ind da din konto er låst. + signed_up_but_pending: En besked med et bekræftelseslink er blevet sendt til din mailadresse. Vi vil behandle din ansøgning når du har trykket på dette link. Du får en meddelelse hvis din ansøgning bliver accepteret. signed_up_but_unconfirmed: En besked med et bekræftelses link er nu blevet sendt til din email adresse. Følg linket for at aktivere din konti. Tjek din spam mappe hvis du ikke har modtaget denne email. update_needs_confirmation: Du har succesfuldt opdateret din konto, men vi er nødt til at bekræfte din email adresse. Tjek venligst din email og følg bekræftelses linket for at bekræfte din nye email adresse. Tjek venligst din spam mappe hvis du ikke har modtaget denne email. updated: Din konto er nu blevet opdateret. diff --git a/config/locales/devise.fr.yml b/config/locales/devise.fr.yml index 2d3c86c1f..321e72f4a 100644 --- a/config/locales/devise.fr.yml +++ b/config/locales/devise.fr.yml @@ -21,7 +21,7 @@ fr: action: Vérifier l’adresse courriel action_with_app: Confirmer et retourner à %{app} explanation: Vous avez créé un compte sur %{host} avec cette adresse courriel. Vous êtes à un clic de l’activer. Si ce n’était pas vous, veuillez ignorer ce courriel. - explanation_when_pending: Vous avez demandé à vous inscrire à %{host} avec cette adresse courriel. Une fois que vous aurez confirmé cette adresse, nous étudierons votre demande. Vous ne pourrez pas vous connecté d'ici-là. Si votre demande est refusée, vos données seront supprimées du serveur, aucune action supplémentaire de votre part n'est donc requise. Si vous n'êtes pas à l'origine de cette demande, veuillez ignorer ce courriel. + explanation_when_pending: Vous avez demandé à vous inscrire à %{host} avec cette adresse de courriel. Une fois que vous aurez confirmé cette adresse, nous étudierons votre demande. Vous ne pourrez pas vous connecter d’ici-là. Si votre demande est refusée, vos données seront supprimées du serveur, aucune action supplémentaire de votre part n’est donc requise. Si vous n’êtes pas à l’origine de cette demande, veuillez ignorer ce message. extra_html: Merci de consultez également les règles du serveur et nos conditions d’utilisation. subject: 'Mastodon : Merci de confirmer votre inscription sur %{instance}' title: Vérifier l’adresse courriel diff --git a/config/locales/devise.tr.yml b/config/locales/devise.tr.yml index 0a504dd67..476d42317 100644 --- a/config/locales/devise.tr.yml +++ b/config/locales/devise.tr.yml @@ -8,8 +8,68 @@ tr: failure: already_authenticated: Zaten oturum açtınız. inactive: Hesabınız henüz etkinleştirilmedi. + invalid: Geçersiz %{authentication_keys} ya da şifre. last_attempt: Hesabınız kilitlenmeden önce bir kez daha denemeniz gerekir. locked: Hesabınız kilitli. + not_found_in_database: Geçersiz %{authentication_keys} ya da şifre. + 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. + unconfirmed: Devam etmeden önce e-posta adresini onaylamanız gerekli. mailer: confirmation_instructions: action: E-posta adresinizi doğrulayın + action_with_app: Onayla ve %{app}'a dön + explanation: Bu e-posta adresiyle %{host} bir hesap oluşturdunuz. Etkinleştirmekten bir tık uzaktasınız. Bu siz değilseniz, lütfen bu e-postayı dikkate almayın. + explanation_when_pending: Bu e-posta adresiyle %{host} adresine bir davetiye için başvuru yaptınız. E-posta adresinizi onayladıktan sonra başvurunuzu inceleyeceğiz. O zamana kadar giriş yapamazsınız. Başvurunuz reddedilirse, verileriniz silinecek, başka bir işlem yapmanız gerekmeyecek. Bu siz değilseniz, lütfen bu e-postayı dikkate almayın. + extra_html: Lütfen ayrıca sunucu kurallarını ve hizmet şartlarımızı inceleyin. + subject: 'Mastodon: %{instance} için onay talimatları' + title: E-posta adresini doğrulayın + email_changed: + explanation: 'Hesabınızın e-posta adresi şu şekilde değiştirildi:' + extra: E-posta adresinizi değiştirmediyseniz, büyük olasılıkla birileri hesabınıza erişti. Lütfen derhal parolanızı değiştirin veya hesabınız kilitlendiyse sunucu yöneticisine başvurun. + subject: 'Mastodon: E-posta değişti' + title: Yeni e-posta adresi + password_change: + explanation: Hesabınızın parolası değiştirildi. + extra: Parolanızı değiştirmediyseniz, büyük olasılıkla birileri hesabınıza erişmiş olabilir. Lütfen derhal parolanızı değiştirin veya hesabınız kilitlendiyse sunucu yöneticisine başvurun. + subject: 'Mastodon: Parola değiştirildi' + title: Parola değiştirildi + reconfirmation_instructions: + explanation: E-postanızı değiştirmek için yeni adresi onaylayın. + extra: Bu değişiklik sizin tarafınızdan başlatılmadıysa, lütfen bu e-postayı dikkate almayın. Mastodon hesabının e-posta adresi, yukarıdaki bağlantıya erişene kadar değişmez. + subject: 'Mastodon: %{instance} için e-postayı onayla' + title: E-posta adresinizi doğrulayın + reset_password_instructions: + action: Parolayı değiştir + explanation: Hesabınız için yeni bir parola istediniz. + extra: Bunu siz yapmadıysanız, lütfen bu e-postayı dikkate almayın. Parolanız yukarıdaki bağlantıya erişene ve yeni bir tane oluşturuncaya kadar değişmez. + subject: 'Mastodon: Parola sıfırlama talimatları' + title: Parola sıfırlama + unlock_instructions: + subject: 'Mastodon: Engel kaldırma talimatları' + passwords: + no_token: Bu sayfaya şifre sıfırlama e-postasından gelmeden erişemezsiniz. Şifre sıfırlama e-postasından geliyorsanız lütfen sağlanan tam URL'yi kullandığınızdan emin olun. + send_instructions: E-posta adresiniz veritabanımızda varsa, e-posta adresinize birkaç dakika içinde bir parola kurtarma bağlantısı gönderilir. Bu e-postayı almadıysanız, lütfen spam klasörünüzü kontrol edin. + send_paranoid_instructions: E-posta adresiniz veritabanımızda varsa, e-posta adresinize birkaç dakika içinde bir parola kurtarma bağlantısı gönderilir. Bu e-postayı almadıysanız, lütfen spam klasörünüzü kontrol edin. + updated: Parolanız başarıyla değiştirildi. Şuan oturumunuz açıldı. + updated_not_active: Parolanız başarıyla değiştirildi. + registrations: + destroyed: Görüşürüz! hesabın başarıyla iptal edildi. Umarız seni sonra tekrar görürüz. + signed_up: Hoş geldiniz! Başarılı bir şekilde oturum açtınız. + signed_up_but_inactive: Başarıyla kaydoldun. Ancak, seni içeri alamıyoruz çünkü hesabın henüz aktif değil. + signed_up_but_locked: Başarıyla kaydoldun. Ancak, seni içeri alamıyoruz çünkü hesabın kilitli. + signed_up_but_pending: Onay bağlantısına sahip bir mesaj e-posta adresinize gönderildi. Bağlantıyı tıkladıktan sonra başvurunuzu inceleyeceğiz. Onaylanması durumunda size bilgi verilecektir. + signed_up_but_unconfirmed: Onay bağlantısına sahip bir mesaj e-posta adresinize gönderildi. Lütfen hesabınızı etkinleştirmek için bağlantıyı takip edin. Bu e-postayı almadıysanız, lütfen spam klasörünüzü kontrol edin. + update_needs_confirmation: Hesabınızı başarıyla güncellediniz, ancak yeni e-posta adresinizi doğrulamamız gerekiyor. Lütfen e-postanızı kontrol edin ve yeni e-posta adresinizi onaylamak için onay bağlantısını izleyin. Bu e-postayı almadıysanız, lütfen spam klasörünüzü kontrol edin. + updated: Hesabınız başarıyla güncellendi. + sessions: + already_signed_out: Başarıyla çıkış yapıldı. + signed_in: Başarıyla giriş yapıldı. + signed_out: Başarıyla çıkış yapıldı. + unlocks: + send_instructions: Hesabınızı birkaç dakika içinde nasıl açacağınıza ilişkin talimatları içeren bir e-posta alacaksınız. Bu e-postayı almadıysanız, lütfen spam klasörünüzü kontrol edin. + send_paranoid_instructions: Hesabınız varsa, birkaç dakika içinde nasıl kilidini açacağınıza ilişkin talimatları içeren bir e-posta alacaksınız. Bu e-postayı almadıysanız, lütfen spam klasörünüzü kontrol edin. + errors: + messages: + not_found: bulunamadı diff --git a/config/locales/doorkeeper.ar.yml b/config/locales/doorkeeper.ar.yml index 6f9e38f8b..f443d0dd3 100644 --- a/config/locales/doorkeeper.ar.yml +++ b/config/locales/doorkeeper.ar.yml @@ -113,6 +113,11 @@ ar: application: title: طلب تصريح مفتوح OAuth scopes: + admin:read: قراءة كافة البيانات على الخادم + admin:read:accounts: قراءة المعلومات الحساسة عن كافة الحسابات + admin:write: تعديل كافة البيانات على الخادم + admin:write:accounts: اتخاذ إجراءات إشراف على الحسابات + admin:write:reports: اتخاذ إجراءات إشراف على الإبلاغات follow: تعديل علاقات الحساب push: تلقي إشعاراتك read: قراءة كافة بيانات حسابك diff --git a/config/locales/doorkeeper.da.yml b/config/locales/doorkeeper.da.yml index b0f50a893..4d2c95aff 100644 --- a/config/locales/doorkeeper.da.yml +++ b/config/locales/doorkeeper.da.yml @@ -72,6 +72,7 @@ da: index: application: Applikation created_at: Godkendt + date_format: "%Y-%m-%d %H:%M:%S" scopes: Omfang title: Dine godkendte applikationer errors: @@ -113,6 +114,12 @@ da: application: title: OAuth godkendelse påkrævet scopes: + admin:read: læs al data på serveren + admin:read:accounts: læs sensitiv information fra alle konti + admin:read:reports: læs sensitiv information fra alle anmeldelser og anmeldte konti + admin:write: redigér al data på serveren + admin:write:accounts: udfør modereringshandlinger på konti + admin:write:reports: udfør modereringshandlinger på anmeldelser follow: ændre din kontos forhold push: modtage dine push notifikationer read: læse alle din kontos data diff --git a/config/locales/doorkeeper.fr.yml b/config/locales/doorkeeper.fr.yml index 352561768..09908b89a 100644 --- a/config/locales/doorkeeper.fr.yml +++ b/config/locales/doorkeeper.fr.yml @@ -114,6 +114,12 @@ fr: application: title: Autorisation OAuth requise scopes: + admin:read: lire toutes les données du serveur + admin:read:accounts: lire les informations sensibles de tous les comptes + admin:read:reports: lire les informations sensibles de tous les signalements et des comptes signalés + admin:write: modifier toutes les données sur le serveur + admin:write:accounts: effectuer des actions de modération sur les comptes + admin:write:reports: effectuer des actions de modération sur les singnalements follow: modifier les relations avec les comptes push: recevoir vos notifications read: lire toutes les données de votre compte diff --git a/config/locales/doorkeeper.tr.yml b/config/locales/doorkeeper.tr.yml index 686a018e0..e421b6a80 100644 --- a/config/locales/doorkeeper.tr.yml +++ b/config/locales/doorkeeper.tr.yml @@ -5,6 +5,15 @@ tr: doorkeeper/application: name: Uygulama adı website: Uygulama web sitesi + errors: + models: + doorkeeper/application: + attributes: + redirect_uri: + fragment_present: parça içeremez. + invalid_uri: geçerli bir URI olmalıdır. + relative_uri: mutlaka bir URI olmalıdır. + secured_uri: HTTPS/SSL URI olması gerekir. doorkeeper: applications: buttons: @@ -17,3 +26,83 @@ tr: destroy: Emin misiniz? edit: title: Uygulamayı düzenle + form: + error: Tüh! Muhtemel hatalar için formunuzu kontrol edin + help: + native_redirect_uri: Yerel testler için %{native_redirect_uri} kullanın + redirect_uri: URl başına bir satır kullanın + index: + application: Uygulama + callback_url: Geri Dönüş URL + delete: Sil + name: İsim + new: Yeni uygulama + show: Göster + title: Uygulamalarınız + new: + title: Yeni uygulama + show: + actions: Eylemler + title: 'Uygulama: %{name}' + authorizations: + buttons: + authorize: Yetkilendir + deny: Reddet + error: + title: Bir hata oluştu + new: + prompt: "%{client_name} uygulaması hesabınıza erişim istiyor" + title: Yetkilendirme gerekli + show: + title: Bu yetki kodunu kopyalayın ve uygulamaya yapıştırın. + authorized_applications: + buttons: + revoke: İptal + confirmations: + revoke: Emin misiniz? + index: + application: Uygulama + created_at: Yetkili + date_format: "%Y-%m-%d %H:%M:%S" + title: Yetkili uygulamalarınız + errors: + messages: + access_denied: Kaynak sahibi veya yetkilendirme sunucusu isteği reddetti. + credential_flow_not_configured: Kaynak Sahibi Şifresinin Bilgi akışı Doorkeeper.configure.resource_owner_from_credentials bilgilerinin 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 URI'siyle eşleşmiyor veya başka bir müşteriye verilmiş. + invalid_redirect_uri: Dahil edilmiş yönlendirme Uri'si geçersiz. + invalid_request: İstekte gerekli bir parametre eksik, desteklenmeyen bir parametre değeri içeriyor veya başka türlü hatalı biçimlendirilmiş. + invalid_resource_owner: Sağlanan kaynak sahibi kimlik bilgileri geçerli değil veya kaynak sahibi bulunamıyor + invalid_scope: İstenen kapsam geçersiz, bilinmeyen veya hatalı biçimlendirilmiş olabilir. + invalid_token: + expired: Erişim belirtecinin süresi dolmuş + revoked: Erişim belirteci iptal edildi + unknown: Erişim belirteci geçersiz + resource_owner_authenticator_not_configured: Kaynak Sahibi yapılandırılmamış Doorkeeper.configure.resource_owner_authenticator nedeniyle başarısız oldu. + server_error: Yetkilendirme sunucusu, isteği yerine getirmesini engelleyen beklenmeyen bir koşulla karşılaştı. + temporarily_unavailable: Yetkilendirme sunucusu şu anda sunucunun geçici bir aşırı yüklenmesi veya bakımı nedeniyle isteği yerine getiremiyor. + unauthorized_client: İstemci bu yöntemi kullanarak bu isteği gerçekleştirmek için yetkili değil. + unsupported_grant_type: Yetkilendirme izni türü, yetkilendirme sunucusu tarafından desteklenmiyor. + unsupported_response_type: Yetkilendirme sunucusu bu yanıt türünü desteklemiyor. + layouts: + admin: + nav: + oauth2_provider: OAuth2 Sağlayıcısı + application: + title: OAuth yetkilendirme gerekli + scopes: + admin:read: sunucudaki tüm verileri oku + admin:read:accounts: tüm hesapların hassas bilgilerini oku + admin:read:reports: tüm raporların ve raporlanan hesapların hassas bilgilerini oku + read:accounts: hesap bilgilerini gör + read:favourites: favorilerini gör + read:follows: izlerini gör + write:accounts: profilini değiştir + write:favourites: favori durumlar + write:filters: filtre oluştur + write:follows: insanları takip et + write:lists: liste oluştur + write:media: medya dosyalarını yükle + write:mutes: insanları ve konuşmaları sustur + write:reports: diğer insanları bildir diff --git a/config/locales/el.yml b/config/locales/el.yml index af7d3cc9d..43fec340a 100644 --- a/config/locales/el.yml +++ b/config/locales/el.yml @@ -45,6 +45,8 @@ el: what_is_mastodon: Τι είναι το Mastodon; accounts: choices_html: 'Επιλογές από %{name}:' + endorsements_hint: Μπορεις να εγκρίνεις ανθρώπους που ακολουθείς μέσω της δικτυακής εφαρμογής και αυτοί θα εμφανίζονται εδώ. + featured_tags_hint: Μπορείς να επιλέξεις συγκεκριμένες ταμπέλες που θα εμφανίζονται εδώ. follow: Ακολούθησε followers: one: Ακόλουθος @@ -56,6 +58,7 @@ el: media: Πολυμέσα moved_html: 'Ο/Η %{name} μετακόμισε στο %{new_profile_link}:' network_hidden: Αυτή η πληροφορία δεν είναι διαθέσιμη + never_active: Ποτέ nothing_here: Δεν υπάρχει τίποτα εδώ! people_followed_by: Χρήστες που ακολουθεί ο/η %{name} people_who_follow: Χρήστες που ακολουθούν τον/την %{name} @@ -260,6 +263,8 @@ el: features: Λειτουργίες hidden_service: Ομοσπονδία με κρυμμένες υπηρεσίες open_reports: ανοιχτές καταγγελίες + pending_tags: ταμπέλες προς έγκριση + pending_users: χρήστες προς έγκριση recent_users: Πρόσφατοι χρήστες search: Αναζήτηση πλήρους κειμένου single_user_mode: Λειτουργία μοναδιαίου χρήστη @@ -282,6 +287,7 @@ el: created_msg: Ο αποκλεισμός τομέα είναι υπό επεξεργασία destroyed_msg: Ο αποκλεισμός τομέα άρθηκε domain: Τομέας + edit: Διαχείρηση αποκλεισμένου τομέα existing_domain_block_html: Έχεις ήδη επιβάλλει αυστηρότερους περιορισμούς στο %{name}, πρώτα θα πρέπει να τους αναιρέσεις. new: create: Δημιουργία αποκλεισμού @@ -292,6 +298,10 @@ el: silence: Σίγαση suspend: Αναστολή title: Αποκλεισμός νέου τομέα + private_comment: Ιδιωτικό σχόλιο + private_comment_hint: Σχόλιο για τον περιορισμό αυτού του τομέα για εσωτερική χρήση από τους διαχειριστές. + public_comment: Δημόσιο σχόλιο + public_comment_hint: Σχόλιο σχετικά με τον περιορισμό αυτού του τομέα προς το κοινό, αν η λειτουργία δημοσιοποίησης των περιορισμένων τομέων είναι ενεργοποιημένη. reject_media: Απόρριψη πολυμέσων reject_media_hint: Αφαιρεί τα τοπικά αποθηκευμένα αρχεία πολυμέσων και αποτρέπει τη λήψη άλλων στο μέλλον. Δεν έχει σημασία για τις αναστολές reject_reports: Απόρριψη καταγγελιών @@ -311,6 +321,7 @@ el: title: Αναίρεση αποκλεισμού για τον τομέα %{domain} undo: Αναίρεση undo: Αναίρεση + view: Εμφάνιση αποκλεισμού τομέα email_domain_blocks: add_new: Πρόσθεση νέου created_msg: Επιτυχής πρόσθεση email τομέα σε μαύρη λίστα @@ -334,6 +345,8 @@ el: all: Όλα limited: Περιορισμένα title: Διαμεσολάβηση + private_comment: Ιδιωτικό σχόλιο + public_comment: Δημόσιο σχόλιο title: Γνωστοί κόμβοι total_blocked_by_us: Μπλοκάρονται από εμάς total_followed_by_them: Ακολουθούνται από εκείνους @@ -411,6 +424,13 @@ el: custom_css: desc_html: Τροποποίηση της εμφάνισης μέσω CSS που φορτώνεται σε κάθε σελίδα title: Προσαρμοσμένο CSS + domain_blocks: + all: Για όλους + disabled: Για κανέναν + title: Εμφάνιση αποκλεισμένων τομέων + users: Προς συνδεδεμένους τοπικούς χρήστες + domain_blocks_rationale: + title: Εμφάνιση σκεπτικού hero: desc_html: Εμφανίζεται στην μπροστινή σελίδα. Συνίσταται τουλάχιστον 600x100px. Όταν λείπει, χρησιμοποιείται η μικρογραφία του κόμβου title: Εικόνα ήρωα @@ -480,6 +500,7 @@ el: delete: Διαγραφή nsfw_off: Σημείωσε ως μη ευαίσθητο nsfw_on: Σημείωσε ως ευαίσθητο + deleted: Διαγραμμένα failed_to_execute: Αποτυχία εκτέλεσης media: title: Πολυμέσα @@ -488,6 +509,9 @@ el: title: Καταστάσεις λογαριασμού with_media: Με πολυμέσα tags: + accounts_today: Μοναδικές χρήσεις ημέρας + accounts_week: Μοναδικές χρήσεις εβδομάδας + breakdown: Ανάλυση σημερινής χρήσης ανα πηγή context: Συνάφεια directory: Στον κατάλογο in_directory: "%{count} στον κατάλογο" @@ -496,6 +520,7 @@ el: title: Ταμπέλες trending_right_now: Δημοφιλείς αυτή τη στιγμή unique_uses_today: "%{count} σημερινές δημοσιεύσεις" + unreviewed: Εκκρεμεί έγκριση updated_msg: Οι ρυθμίσεις των ταμπελών ενημερώθηκαν επιτυχώς title: Διαχείριση warning_presets: @@ -544,6 +569,10 @@ el: checkbox_agreement_without_rules_html: Συμφωνώ με τους όρους χρήσης delete_account: Διαγραφή email delete_account_html: Αν θέλεις να διαγράψεις το λογαριασμό σου, μπορείς να συνεχίσεις εδώ. Θα σου ζητηθεί επιβεβαίωση. + description: + prefix_invited_by_user: Ο/Η @%{name} σε προσκαλεί να συνδεθείς με αυτό τον διακομιστή του Mastodon! + prefix_sign_up: Άνοιξε λογαριασμό στο Mastodon σήμερα! + suffix: Ανοίγοντας λογαριασμό θα μπορείς να ακολουθείς άλλους, να ανεβάζεις ενημερώσεις και να ανταλλάζεις μηνύματα με χρήστες σε οποιοδήποτε διακομιστή Mastodon, καθώς και άλλα! didnt_get_confirmation: Δεν έλαβες τις οδηγίες επιβεβαίωσης; forgot_password: Ξέχασες το συνθηματικό σου; invalid_reset_password_token: Το διακριτικό επαναφοράς συνθηματικού είναι άκυρο ή ληγμένο. Παρακαλώ αιτήσου νέο. @@ -599,24 +628,47 @@ el: deletes: bad_password_msg: Καλή προσπάθεια χάκερς! Λάθος συνθηματικό confirm_password: Γράψε το τρέχον συνθηματικό σου για να πιστοποιήσεις την ταυτότητά σου - description_html: Αυτό θα διαγράψει οριστικά και αμετάκλητα το περιεχόμενο του λογαριασμού σου και θα τον απενεργοποιήσει. Το όνομα χρήστη θα παραμείνει δεσμευμένο για να αποφευχθούν μελλοντικές πλαστοπροσωπίες. proceed: Διαγραφή λογαριασμού success_msg: Ο λογαριασμός σου διαγράφηκε με επιτυχία - warning_html: Μόνο η διαγραφή περιεχομένου από αυτό τον συγκεκριμένο κόμβο είναι εγγυημένη. Το περιεχόμενο που έχει διαμοιραστεί ευρέως είναι πιθανό να αφήσει ίχνη. Όσοι διακομιστές είναι εκτός σύνδεσης και όσοι έχουν διακόψει τη λήψη των ενημερώσεων του κόμβου σου, δε θα ενημερώσουν τις βάσεις δεδομένων τους. - warning_title: Διαθεσιμότητα ήδη διανεμημένου περιεχομένου + warning: + before: 'Πριν συνεχίσεις, παρακαλούμε να διαβάσεις τις παρακάτω σημειώσεις προσεκτικά:' + caches: Οποίο περιεχόμενο έχει αποθηκευτεί προσωρινά σε άλλους διακομιστές μπορεί να παραμείνει + data_removal: Οι δημοσιεύσεις σου και άλλα δεδομένα θα διαγραφούν οριστικά + email_change_html: Μπορείς να αλλάξεις τη διεύθυνση email σου Χωρίς να διαγράψεις το λογαριασμό σου + email_contact_html: Αν και πάλι δεν εμφανιστεί, μπορείς να στείλεις email προς %{email} για βοήθεια + email_reconfirmation_html: Αν δεν έχεις λάβει το email επιβεβαίωσης, μπορείς να το ζητήσεις ξανά + irreversible: Δεν θα μπορείς να ανακτήσεις ή ενεργοποιήσεις ξανά το λογαριασμό σου + more_details_html: Για περισσότερες πληροφορίες, δες την πολιτική απορρήτου. + username_available: Το όνομα χρήστη σου θα γίνει ξανά διαθέσιμο + username_unavailable: Το όνομα χρήστη σου θα παραμείνει μη διαθέσιμο directories: directory: Κατάλογος λογαριασμών - enabled: Περιλαμβάνεσαι στον κατάλογο. - enabled_but_waiting: Έχεις επιλέξει να εμφανίζεσαι στον κατάλογο μεν, αλλά ακόμα δεν έχεις τον ελάχιστο αριθμό ακόλουθων (%{min_followers}) που απαιτείται για να συμπεριληφθείς. explanation: Βρες χρήστες βάσει των ενδιαφερόντων τους explore_mastodon: Εξερεύνησε το %{title} - how_to_enable: Δεν έχεις επιλέξει να συμπεριληφθείς στον καταλογο. Μπορείς να επιλέξεις παρακάτω. Χρησιμοποίησε ταμπέλες στο κείμενο του βιογραφικού σου για να εμφανίζεσαι κάτω από συγκεκριμένες ταμπέλες! - people: - one: "%{count} άτομο" - other: "%{count} άτομα" + domain_blocks: + blocked_domains: Λίστα περιορισμένων και αποκλεισμένων τομέων + description: Αυτή είναι η λίστα των διακομιστών που ο %{instance} περιορίζει ή απορρίπτει τη σύνδεση μαζί τους. + domain: Τομέας + media_block: Αποκλεισμός πολυμέσων + no_domain_blocks: "(Χωρίς αποκλεισμό πολυμέσων)" + severity: Αυστηρότητα + severity_legend: + media_block: Τα αρχεία πολυμέσων από αυτό τον διακομιστή δεν ανακτώνται, δεν αποθηκεύονται και δεν προβάλλονται στο χρήστη. + silence: Οι λογαριασμοί από διακομιστές που έχουν αποσιωπηθεί μπορούν να βρεθούν, να ακολουθηθούν και να δεχτούν αλληλεπιδράσεις αλλά τα τουτ τους δε θα εμφανίζονται στις δημόσιες ροές και οι ειδοποιήσεις τους δε θα παραδίδονται στους τοπικούς χρήστες που δεν τους ακολουθούν. + suspension: Κανένα περιεχόμενο ανασταλμένων διακομιστών δεν αποθηκεύεται και δεν εμφανίζεται, ούτε αποστέλλεται σε αυτούς. Οι ενέργειες από τους ανασταλμένους διακομιστές αγνοούνται. + suspension_disclaimer: Οι ανασταλμενοι διακομιστές μπορεί περιστασιακά να ανακτήσουν δημόσιο περιεχόμενο από αυτό τον διακομιστή. + title: Αυστηρότητες + show_rationale: Εμφάνιση αιτιολογίας + silence: Αποσιώπηση + suspension: Αναστολή + title: "%{instance} Λίστα αποκλεισμένων κόμβων" + domain_validator: + invalid_domain: δεν είναι έγκυρο όνομα τομέα errors: + '400': Το αίτημα ήταν άκυρο ή με λάθος μορφή. '403': Δεν έχεις δικαίωμα πρόσβασης σε αυτή τη σελίδα. '404': Η σελίδα που ψάχνεις δεν υπάρχει. + '406': Η σελίδα αυτή δεν είναι διαθέσιμη στην αιτούμενη μορφή. '410': Η σελίδα που έψαχνες δεν υπάρχει πια εδώ. '422': content: Απέτυχε η επιβεβαίωση ασφαλείας. Μήπως μπλοκάρεις τα cookies; @@ -625,6 +677,7 @@ el: '500': content: Λυπούμαστε, κάτι πήγε στραβά από τη δική μας μεριά. title: Η σελίδα αυτή δεν είναι σωστή + '503': Η σελίδα δε μπόρεσε να εμφανιστεί λόγω προσωρινού σφάλματος του διακομιστή. noscript_html: Για να χρησιμοποιήσετε τη δικτυακή εφαρμογή του Mastodon, ενεργοποίησε την Javascript. Εναλλακτικά, δοκίμασε μια από τις εφαρμογές για το Mastodon στην πλατφόρμα σου. existing_username_validator: not_found: δεν βρέθηκε τοπικός χρήστης με αυτό το όνομα @@ -648,6 +701,7 @@ el: add_new: Προσθήκη νέας errors: limit: Έχεις ήδη προσθέσει το μέγιστο αριθμό ταμπελών + hint_html: "Τι είναι οι προβεβλημένες ταμπέλες; Προβάλλονται στο δημόσιο προφίλ σου επιτρέποντας σε όποιον το βλέπει να χαζέψει τις δημοσιεύσεις που τις χρησιμοποιούν. Είναι ωραίος τρόπος να παρακολουθείς κάποια δημιουργία ή ένα μακροπρόθεσμο έργο." filters: contexts: home: Αρχική ροή @@ -668,6 +722,7 @@ el: developers: Ανάπτυξη more: Περισσότερα… resources: Πόροι + trending_now: Τάσεις generic: all: Όλα changes_saved_msg: Οι αλλαγές αποθηκεύτηκαν! @@ -1069,7 +1124,9 @@ el: disable: Όσο ο λογαριασμός σου είναι παγωμένος, τα στοιχεία του παραμένουν άθικτα αλλά δεν μπορείς να κανείς καμία ενέργεια μέχρι να ξεκλειδωθείς. silence: Όσο ο λογαριασμός σου είναι περιορισμένος, μόνο όσοι σε ακολουθούν ήδη θα βλέπουν τα τουτ σου σε αυτό τον κόμβο ενώ μπορεί να εξαιρεθείς από διάφορες δημόσιες απαριθμήσεις. Πάντως, θα μπορούν να σε ακολουθήσουν χειροκίνητα. suspend: Ο λογαριασμός σου αναστάλθηκε μόνιμα, όλα τα τουτ και τα ανεβασμένα πολυμέσα σου διαγράφηκαν αμετάκλητα από αυτόν τον κόμβο και σε όσους άλλους είχες ακόλουθους. + get_in_touch: Μπορείς να απαντήσεις σε αυτό το email για να επικοινωνήσεις με το προσωπικό του %{instance}. review_server_policies: Αναθεώρηση πολιτικής του κόμβου + statuses: 'Συγκεκριμένα, για:' subject: disable: Ο λογαριασμός σου %{acct} έχει παγώσει none: Προειδοποίηση προς %{acct} diff --git a/config/locales/eo.yml b/config/locales/eo.yml index edab60586..5785f9b20 100644 --- a/config/locales/eo.yml +++ b/config/locales/eo.yml @@ -53,6 +53,7 @@ eo: media: Aŭdovidaĵoj moved_html: "%{name} moviĝis al %{new_profile_link}:" network_hidden: Tiu informo ne estas disponebla + never_active: Neniam nothing_here: Estas nenio ĉi tie! people_followed_by: Sekvatoj de %{name} people_who_follow: Sekvantoj de %{name} @@ -263,18 +264,22 @@ eo: space: Memorspaca uzado title: Kontrolpanelo total_users: uzantoj sume - trends: Furoroj + trends: Furoraĵoj week_interactions: interagoj tiusemajne week_users_active: aktivaj tiusemajne week_users_new: uzantoj tiusemajne whitelist_mode: En la blanka listo domain_allows: add_new: En la blanka listo domajno + created_msg: Domajno sukcese blanklistigita + destroyed_msg: Domajno estis forigita de la blanklisto + undo: Forigi de la blanklisto domain_blocks: add_new: Aldoni novan created_msg: Domajna blokado en traktado destroyed_msg: Domajna blokado malfarita domain: Domajno + edit: Redakti domajna blokado existing_domain_block_html: Vi jam trudis pli striktajn limojn al %{name}, vi devas malbloki ĝin unue. new: create: Krei blokadon @@ -306,6 +311,7 @@ eo: title: Malfari domajnan blokadon por %{domain} undo: Malfari undo: Malfari + view: Vidi domajna blokado email_domain_blocks: add_new: Aldoni novan created_msg: Retadreso sukcese aldonita al la nigra listo @@ -408,6 +414,11 @@ eo: custom_css: desc_html: Ŝanĝi la aspekton per CSS ŝargita en ĉiu pago title: Propra CSS + domain_blocks: + all: Al ciuj + disabled: Al neniu + title: Vidi domajna blokado + users: Al ensalutintaj lokaj uzantoj hero: desc_html: Montrata en la ĉefpaĝo. Almenaŭ 600x100px rekomendita. Kiam ne agordita, la bildeto de la servilo estos uzata title: Kapbildo @@ -467,12 +478,16 @@ eo: desc_html: Montri publikan templinion en komenca paĝo title: Tempolinia antaŭvido title: Retejaj agordoj + trends: + desc_html: Publike montri antaŭe kontrolitajn kradvortojn, kiuj nune furoras + title: Furoraj kradvortoj statuses: back_to_account: Reveni al konta paĝo batch: delete: Forigi nsfw_off: Marki ne tikla nsfw_on: Marki tikla + deleted: Forigita failed_to_execute: Ekigo malsukcesa media: title: Aŭdovidaĵoj @@ -483,9 +498,11 @@ eo: tags: context: Kunteksto directory: En la adresaro + in_directory: "%{count} en adresaro" review: La statuso de la recenzo reviewed: Recenzis title: Kradvortoj + trending_right_now: Nunaj furoraĵoj unreviewed: Ne recenzis title: Administrado warning_presets: @@ -502,10 +519,13 @@ eo: body: "%{reporter} signalis %{target}" body_remote: Iu de %{domain} signalis %{target} subject: Nova signalo por %{instance} (#%{id}) + new_trending_tag: + body: 'La kradvorto #%{name} furoras hodiaŭ, sed ankoraŭ ne estis kontrolita. Ĝi ne aperos publike sen via aprobo. Se vi ne volas tion, simple konservu la formularon tiel kiel.' + subject: Nova kradvorto kontrolebla en %{instance} (#%{name}) appearance: advanced_web_interface: Altnivela retpaĝa interfaco animations_and_accessibility: Animacioj kaj alirebleco - confirmation_dialogs: Konfirmaj dialogoj + confirmation_dialogs: Konfirmaj fenestroj sensitive_content: Tikla enhavo application_mailer: notification_preferences: Ŝanĝi retmesaĝajn preferojn @@ -579,24 +599,23 @@ eo: deletes: bad_password_msg: Malĝusta pasvorto confirm_password: Enmetu vian nunan pasvorton por konfirmi vian identecon - description_html: Tio porĉiame kaj neŝanĝeble forigos la enhavon de via konto kaj malaktivigos ĝin. Via uzantnomo restos rezervita por eviti postajn trompojn pri identeco. proceed: Forigi konton success_msg: Via konto estis sukcese forigita - warning_html: La forigo de la enhavo estas certa nur por ĉi tiu aparta servilo. Enhavo, kiu estis disvastigita verŝajne lasos spurojn. Eksterretaj serviloj kaj serviloj, kiuj ne abonas viajn ĝisdatigojn ne ĝisdatigos siajn datumbazojn. - warning_title: Disponebleco de disvastigita enhavo directories: directory: Profilujo - enabled: Vi estas listigata en la profilujo. - enabled_but_waiting: Vi elektis esti listigata en la profilujo, sed vi ankoraŭ ne havas la minimuman kvanton da sekvantoj (%{min_followers}) por esti listigata. explanation: Malkovru uzantojn per iliaj interesoj explore_mastodon: Esplori %{title} - how_to_enable: Vi ankoraŭ ne donis permeson listigi vin en la profilujo. Vi povas doni permeson ĉi-sube. Uzu kradvortojn en via biografia teksto por esti listigata sub specifaj kradvortoj! - people: - one: "%{count} persono" - other: "%{count} personoj" + domain_blocks: + domain: Domajno + no_domain_blocks: "(Nenio domajna blokado)" + silence: Silenta + domain_validator: + invalid_domain: ne estas valida domajna nomo errors: + '400': The request you submitted was invalid or malformed. '403': Vi ne havas la rajton por vidi ĉi tiun paĝon. '404': La paĝo ke kiun vi serĉas ne ekzistas ĉi tie. + '406': This page is not available in the requested format. '410': La paĝo, kiun vi serĉas, ne plu ekzistas ĉi tie. '422': content: Sekureca konfirmo malsukcesa. Ĉu vi blokas kuketojn? @@ -605,6 +624,7 @@ eo: '500': content: Ni bedaŭras, io malsukcesis niaflanke. title: Ĉi tiu paĝo ne estas ĝusta + '503': The page could not be served due to a temporary server failure. noscript_html: |- Por uzi la retan aplikaĵon de Mastodon, bonvolu ebligi JavaScript. Alimaniere, provu unu el la operaciumaj aplikaĵoj por Mastodon por via platformo. @@ -650,6 +670,7 @@ eo: developers: Programistoj more: Pli… resources: Rimedoj + trending_now: Nunaj furoraĵoj generic: all: Ĉio changes_saved_msg: Ŝanĝoj sukcese konservitaj! @@ -967,6 +988,7 @@ eo: silence: Dum via konto estas limigita, nur tiuj, kiuj jam sekvas vin, vidos viajn mesaĝojn en ĉi tiu servilo, kaj vi povus esti ekskludita de diversaj publikaj listoj. Tamen, aliaj ankoraŭ povas mane sekvi vin. suspend: Via konto estis haltigita, kaj ĉiuj el viaj mesaĝoj kaj alŝutitaj aŭdovidaj dosieroj estis nemalfareble forigitaj de ĉi tiu servilo, kaj de la serviloj, kie vi havis sekvantojn. review_server_policies: Superrigardi servilajn politikojn + statuses: 'Specife, per:' subject: disable: Via konto %{acct} estas frostigita none: Averto por %{acct} diff --git a/config/locales/es.yml b/config/locales/es.yml index 2d3e321e4..184f0da0e 100644 --- a/config/locales/es.yml +++ b/config/locales/es.yml @@ -611,26 +611,19 @@ es: deletes: bad_password_msg: "¡Buen intento, hackers! Contraseña incorrecta" confirm_password: Ingresa tu contraseña actual para demostrar tu identidad - description_html: Esto removerá el contenido de tu cuenta y la desactivará permanente e irrevesiblemente. Tu nombre de usuario quedará reservado para prevenir futuros robos de identidad. proceed: Eliminar cuenta success_msg: Tu cuenta se eliminó con éxito - warning_html: Se garantiza únicamente la eliminación del contenido de esta instancia. El contenido que se haya compartido extensamente dejará sus huellas. Los servidores fuera de línea y los que se hayan desuscrito de tus actualizaciones ya no actualizarán sus bases de datos. - warning_title: Disponibilidad diseminada del contenido directories: directory: Directorio de perfiles - enabled: Actualmente está listado en el directorio. - enabled_but_waiting: Ha optado por ser listado en el directorio, pero aún no cumple con el número mínimo de seguidores (%{min_followers}) para ser listado. explanation: Descubre usuarios según sus intereses explore_mastodon: Explorar %{title} - how_to_enable: Usted no está registrado por el directorio. Puede registrar por abajo. ¡Utilice hashtags en su bio para aparecer bajo hashtags específicos! - people: - one: "%{count} persona" - other: "%{count} personas" domain_validator: invalid_domain: no es un nombre de dominio válido errors: + '400': The request you submitted was invalid or malformed. '403': No tienes permiso para acceder a esta página. '404': La página que estabas buscando no existe. + '406': This page is not available in the requested format. '410': La página que estabas buscando no existe más. '422': content: Verificación de seguridad fallida. ¿Estás bloqueando algunas cookies? @@ -639,6 +632,7 @@ es: '500': content: Lo sentimos, algo ha funcionado mal por nuestra parte. title: Esta página no es correcta + '503': The page could not be served due to a temporary server failure. noscript_html: Para usar la aplicación web de Mastodon, por favor activa Javascript. Alternativamente, prueba alguna de las aplicaciones nativas para Mastodon para tu plataforma. existing_username_validator: not_found: no pudo encontrar un usuario local con ese nombre de usuario diff --git a/config/locales/et.yml b/config/locales/et.yml index fdb743273..d02eb24ba 100644 --- a/config/locales/et.yml +++ b/config/locales/et.yml @@ -587,24 +587,17 @@ et: deletes: bad_password_msg: Hea proov, häkkerid! Vale salasõna confirm_password: Sisesta oma praegune salasõna, et kinnitada oma identiteet - description_html: Seda tehes kustutatakse igaveseks ja taastamatult kogu konto andmed ja sisselogimine keelatakse. Sinu kasutajanimi jääb reserveerituks, et vältida tulevikus kehastamist. proceed: Kustuta konto success_msg: Konto kustutamine õnnestus - warning_html: Ainult sellel serveril oleva sisu kustutamine on garanteeritud. Sisu, mis on laialdaselt jagatud, jätab tõenäoliselt jälgi. Serverid, mis on välja lülitatud, ning serverid, mis on sinu uuendustest loobunud, ei uuenda oma andmebaase. - warning_title: Levitatud sisu kättesaadavus directories: directory: Profiilikataloog - enabled: Te olete praegu nimekirjastatud kataloogis. - enabled_but_waiting: Te olete ennast lubanud kataloogi kanda, kuid teil ei ole miinimum kohustuslik jälgijate arv (%{min_followers}), et teid nimekirjastada. explanation: Avasta kasutajaid nende huvide põhjal explore_mastodon: Avasta %{title} - how_to_enable: Te ei ole hetkel kataloogis. Te saate end lisada allpool. Kasutage silte oma eluloos, et saaksite ilmuda kindlate siltide all! - people: - one: "%{count} inimene" - other: "%{count} inimest" errors: + '400': The request you submitted was invalid or malformed. '403': Sul puudub õigus seda lehte vaadata. '404': Soovitud lehte ei leitud. + '406': This page is not available in the requested format. '410': Soovitud lehekülge pole enam siin. '422': content: Turvalisuse kontroll ebaõnnestus. Kas Te blokeerite küpsiseid? @@ -613,6 +606,7 @@ et: '500': content: Palume vabandust, midagi läks valesti meie pool. title: See lehekülg pole õige + '503': The page could not be served due to a temporary server failure. noscript_html: Et kasutada Mastodoni veebirakendust, palun lubage JavaScript. Alternatiivselt, proovige mõnda rakendust Teie platvormile. existing_username_validator: not_found: ei suutnud leida kohalikku kasutajat selle kasutajanimega diff --git a/config/locales/eu.yml b/config/locales/eu.yml index 8000f931e..56271f3c3 100644 --- a/config/locales/eu.yml +++ b/config/locales/eu.yml @@ -56,6 +56,7 @@ eu: media: Multimedia moved_html: "%{name} hona lekualdatu da %{new_profile_link}:" network_hidden: Informazio hau ez dago eskuragarri + never_active: Inoiz ez nothing_here: Ez dago ezer hemen! people_followed_by: "%{name}(e)k jarraitzen dituenak" people_who_follow: "%{name} jarraitzen dutenak" @@ -421,6 +422,9 @@ eu: custom_css: desc_html: Aldatu itxura orri bakoitzean kargatutako CSS bidez title: CSS pertsonala + domain_blocks: + all: Guztiei + disabled: Inori ez hero: desc_html: Azaleko orrian bistaratua. Gutxienez 600x100px aholkatzen da. Ezartzen ez bada, zerbitzariaren irudia hartuko du title: Azaleko irudia @@ -489,6 +493,7 @@ eu: delete: Ezabatu nsfw_off: Markatu ez hunkigarri gisa nsfw_on: Markatu hunkigarri gisa + deleted: Ezabatuta failed_to_execute: Ezin izan da burutu media: title: Multimedia @@ -608,26 +613,23 @@ eu: deletes: bad_password_msg: Saiakera ona hacker! Pasahitz okerra confirm_password: Sartu zure oraingo pasahitza zure identitatea baieztatzeko - description_html: Honek behin betirako eta atzera egiteko aukera gabe zure kontuko edukia kendu eta hau desaktibatuko du. Zure erabiltzaile-izena erreserbatuko da etorkizunean inork zure itxurak ez egiteko. proceed: Ezabatu kontua success_msg: Zure kontua ongi ezabatu da - warning_html: Zerbitzari honetako edukiak ezabatzea besterik ezin da bermatu. Asko partekatu den edukiaren arrastoak geratzea izan liteke. Deskonektatuta dauden zerbitzariak edo zure eguneraketetatik harpidetza kendu duten zerbitzariek ez dituzte beraien datu-baseak eguneratuko. - warning_title: Sakabanatutako edukiaren eskuragarritasuna directories: directory: Profilen direktorioa - enabled: Direktorioan zerrendatuta zaude orain. - enabled_but_waiting: Direktorioan zerrendatuta izatea aukeratu duzu, baina ez duzu oraindik gutxieneko jarraitzaile kopurua (%{min_followers}) zerrendan agertzeko. explanation: Deskubritu erabiltzaileak interesen arabera explore_mastodon: Esploratu %{title} - how_to_enable: Ez duzu aukeratu direktorioan zerrendatua izatea aukeratu. Behean aukeratu dezakezu. Erabili traolak zure biografiaren testuan traola zehatzetan agertzeko! - people: - one: pertsona %{count} - other: "%{count} pertsona" + domain_blocks: + domain: Domeinua + severity: Larritasuna + silence: Isilarazi domain_validator: invalid_domain: ez da domeinu izen baliogarria errors: + '400': The request you submitted was invalid or malformed. '403': Ez duzu orri hau ikusteko baimenik. '404': Bilatu duzun orria ez dago hemen. + '406': This page is not available in the requested format. '410': Bilatu duzun orria ez dago hemen jada. '422': content: Segurtasun egiaztaketak huts egin du. Cookie-ak blokeatzen dituzu? @@ -636,6 +638,7 @@ eu: '500': content: Sentitzen dugu, zerbait okerra gertatu da gure aldean. title: Orri hau ez da zuzena + '503': The page could not be served due to a temporary server failure. noscript_html: Mastodon web aplikazioa erabiltzeko, gaitu JavaScript. Bestela, probatu Mastodon plataformarako aplikazio natiboren bat. existing_username_validator: not_found: ezin izan da izen hori duen kide lokalik aurkitu @@ -679,6 +682,7 @@ eu: developers: Garatzaileak more: Gehiago… resources: Baliabideak + trending_now: Joera orain generic: all: Denak changes_saved_msg: Aldaketak ongi gorde dira! diff --git a/config/locales/fa.yml b/config/locales/fa.yml index 8a58ad686..0b4d046f3 100644 --- a/config/locales/fa.yml +++ b/config/locales/fa.yml @@ -45,6 +45,8 @@ fa: what_is_mastodon: ماستدون چیست؟ accounts: choices_html: 'انتخاب‌های %{name}:' + endorsements_hint: شما می‌توانید از محیط وب ماستدون، کسانی را که پی می‌گیرید به دیگران هم پیشنهاد دهید تا این‌جا نشان داده شوند. + featured_tags_hint: شما می‌توانید برچسب‌های دلخواه خود را پیشنهاد دهید که این‌جا نمایش خواهند یافت. follow: پی بگیرید followers: one: پیگیر @@ -186,6 +188,7 @@ fa: username: نام کاربری warn: هشدار web: وب + whitelisted: فهرست مجاز action_logs: actions: assigned_to_self_report: "%{name} رسیدگی به گزارش %{target} را به عهده گرفت" @@ -258,6 +261,8 @@ fa: features: ویژگی‌ها hidden_service: ارتباط میان‌سروری با سرویس‌های نهفته open_reports: گزارش‌های فعال + pending_tags: برچسب منتظر بازبینی + pending_users: کاربران منتظر بازبینی recent_users: کاربران تازه search: جستجوی متنی single_user_mode: حالت تک‌کاربره @@ -265,15 +270,22 @@ fa: space: فضای مصرف‌شده title: ابزارهای مدیریت total_users: شمار کاربران - trends: هشتگ‌های پرکاربرد + trends: برچسب‌های پرکاربرد week_interactions: فعالیت‌ها در این هفته week_users_active: کاربران فعال هفتهٔ اخیر week_users_new: کاربران هفتهٔ اخیر + whitelist_mode: حالت فهرست مجاز + domain_allows: + add_new: دامین مجازشده + created_msg: این دامین با موفقیت مجاز شد + destroyed_msg: دامین از حالت مجاز خارج شد + undo: برداشتن از فهرست مجازها domain_blocks: add_new: افزودن مسدودسازی دامین تازه created_msg: مسدودکردن دامین در حال انجام است destroyed_msg: مسدودکردن دامین واگردانده شد domain: دامین + edit: ویرایش مسدودسازی دامین existing_domain_block_html: شما پیش‌تر محدودیت‌های سخت‌تری روی %{name} اعمال کرده‌اید، و باید نخست مسدودسازی را لغو کنید. new: create: مسدودسازی @@ -284,6 +296,10 @@ fa: silence: بی‌صداکردن suspend: معلق‌کردن title: مسدودسازی دامین دیگر + private_comment: یادداشت خصوصی + private_comment_hint: یادداشتی دربارهٔ محدودیت روی این دامین برای سایر ناظمان. + public_comment: یادداشت عمومی + public_comment_hint: یادداشتی دربارهٔ محدودیت روی این دامین برای عموم، در صورتی که فهرست دامین‌های محدود شده منتشر شود. reject_media: نپذیرفتن پرونده‌های تصویری reject_media_hint: تصویرهای ذخیره‌شده در این‌جا را پاک می‌کند و جلوی دریافت تصویرها را در آینده می‌گیرد. بی‌تأثیر برای معلق‌شده‌ها reject_reports: نپذیرفتن گزارش‌ها @@ -303,6 +319,7 @@ fa: title: واگردانی مسدودسازی دامنه برای %{domain} undo: واگردانی undo: واگردانی مسدودسازی دامین + view: دیدن مسدودسازی دامنه email_domain_blocks: add_new: افزودن تازه created_msg: مسدودسازی دامین ایمیل با موفقیت ساخته شد @@ -326,6 +343,8 @@ fa: all: همه limited: محدود title: مدیریت + private_comment: یادداشت خصوصی + public_comment: یادداشت عمومی title: ارتباط میان‌سروری total_blocked_by_us: مسدودشده از طرف ما total_followed_by_them: ما را پی می‌گیرند @@ -403,6 +422,13 @@ fa: custom_css: desc_html: ظاهر ماستدون را با CSS-ای که در همهٔ صفحه‌ها جاسازی می‌شود تغییر دهید title: سبک CSS سفارشی + domain_blocks: + all: برای همه + disabled: برای هیچ‌کدام + title: نمایش دامین‌های مسدودشده + users: برای کاربران محلی واردشده + domain_blocks_rationale: + title: دیدن دلیل hero: desc_html: در صفحهٔ آغازین نمایش می‌یابد. دست‌کم ۶۰۰×۱۰۰ پیکسل توصیه می‌شود. اگر تعیین نشود، با تصویر بندانگشتی سرور جایگزین خواهد شد title: تصویر سربرگ @@ -463,12 +489,16 @@ fa: desc_html: نوشته‌های عمومی این سرور را در صفحهٔ آغازین نشان دهید title: پیش‌نمایش نوشته‌ها title: تنظیمات سایت + trends: + desc_html: برچسب‌های عمومی که پیش‌تر بازبینی شده‌اند و هم‌اینک پرطرفدارند + title: برچسب‌های پرطرفدار statuses: back_to_account: بازگشت به صفحهٔ حساب batch: delete: پاک‌کردن nsfw_off: علامت‌زدن به عنوان غیرحساس nsfw_on: علامت‌زدن به عنوان حساس + deleted: پاک‌شده failed_to_execute: اجرا نشد media: title: رسانه @@ -477,7 +507,19 @@ fa: title: نوشته‌های حساب with_media: دارای عکس یا ویدیو tags: + accounts_today: کاربرد یکتا در امروز + accounts_week: کاربرد یکتا در این هفته + breakdown: کاربردهای امروز به تفکیک منبع + context: زمینه + directory: در فهرست + in_directory: "%{count} در فهرست" + review: وضعیت بازبینی + reviewed: بازبینی شده title: برچسب‌ها + trending_right_now: پرطرفدارهای کنونی + unique_uses_today: "%{count} امروز منتشر شده" + unreviewed: بازبینی نشده + updated_msg: تنظیمات برچسب‌ها با موفقیت به‌روز شد title: مدیریت سرور warning_presets: add_new: افزودن تازه @@ -493,11 +535,15 @@ fa: body: کاربر %{reporter} کاربر %{target} را گزارش داد body_remote: کسی از %{domain} گزارش %{target} را فرستاده subject: گزارش تازه‌ای برای %{instance} (#%{id}) + new_trending_tag: + body: 'برچسب #%{name} امروز پرطرفدار است، ولی تا حالا بازبینی نشده. تا وقتی که شما اجازه نداده‌اید، این برچسب به طور عمومی نمایش داده نخواهد شد. اگر فرم را به شکل فعلی ذخیره کنید، هیچ وقت چیزی دربارهٔ این برچسب نخواهید دید.' + subject: برچسب تازه‌ای در %{instance} نیازمند بررسی است (#%{name}) appearance: advanced_web_interface: رابط کاربری پیشرفته advanced_web_interface_hint: 'اگر می‌خواهید همهٔ فضای نمایشگر خود را به کار ببرید، می‌توانید به کمک رابط کاربری پیشرفته ستون‌های گوناگونی داشته باشید تا در یک نگاه همهٔ اطلاعاتی را که می‌خواهید ببینید: نوشته‌های دیگران، اعلان‌ها، فهرست نوشته‌های همه‌جا، و هر تعداد فهرست و برچسب که بخواهید.' animations_and_accessibility: پویانمایی‌های و دسترسی‌پذیری confirmation_dialogs: پیغام‌های تأیید + discovery: کاوش sensitive_content: محتوای حساس application_mailer: notification_preferences: تغییر ترجیحات ایمیل @@ -518,6 +564,7 @@ fa: apply_for_account: درخواست دعوت‌نامه change_password: رمز checkbox_agreement_html: من قانون‌های این سرور و شرایط کاربری را می‌پذیرم + checkbox_agreement_without_rules_html: من با شرایط استفاده موافقم delete_account: پاک‌کردن حساب delete_account_html: اگر می‌خواهید حساب خود را پاک کنید، از این‌جا پیش بروید. از شما درخواست تأیید خواهد شد. didnt_get_confirmation: راهنمایی برای تأیید را دریافت نکردید؟ @@ -537,6 +584,15 @@ fa: reset_password: بازنشانی رمز security: امنیت set_new_password: تعیین رمز تازه + setup: + email_below_hint_html: اگر نشانی ایمیل زیر نادرست است، می‌توانید آن را تغییر دهید و ایمیل تأیید دوباره‌ای دریافت کنید. + email_settings_hint_html: ایمیل تأیید به %{email} فرستاده شد. اگر این نشانی ایمیل درست نیست، می‌توانید از تنظیمات حساب آن را تغییر دهید. + title: راه اندازی + status: + account_status: وضعیت حساب + confirming: در حال انتظار برای کامل شدن تأیید ایمیل. + functional: حساب شما قابل استفاده است. + pending: درخواست شما منتظر تأیید مسئولان سایت است و این فرایند ممکن است کمی طول بکشد. اگر درخواست شما پذیرفته شود به شما ایمیلی فرستاده خواهد شد. trouble_logging_in: برای ورود مشکلی دارید؟ authorize_follow: already_following: شما همین الان هم این حساب را پی‌می‌گیرید @@ -566,24 +622,19 @@ fa: deletes: bad_password_msg: هکر گرامی، رمزی که وارد کردید اشتباه است ؛) confirm_password: رمز فعلی خود را وارد کنید تا معلوم شود که خود شمایید - description_html: این کار همهٔ محتوای حساب شما را برای همیشه و به‌طور بازگشت‌ناپذیری پاک کرده و حساب را غیرفعال می‌کند. نام کاربری شما برای جلوگیری از جعل هویت احتمالی در آینده از دسترس خارج خواهد شد. proceed: پاک‌کردن حساب success_msg: حساب شما با موفقیت پاک شد - warning_html: تنها پاک‌شدن محتوای حساب در این سرور خاص تضمین می‌شود. محتوایی که به گستردگی هم‌رسانی شده باشد ممکن است ردش همچنان باقی بماند. سرورهای آفلاین یا سرورهایی که دیگر مشترک شما نیستند پایگاه‌های دادهٔ خود را به‌روز نخواهند کرد. - warning_title: دسترس‌پذیری محتوای هم‌رسان‌شده directories: directory: فهرست گزیدهٔ کاربران - enabled: شما هم‌اینک در فهرست گزیدهٔ کاربران نمایش می‌یابید. - enabled_but_waiting: شما می‌خواهید در فهرست گزیدهٔ کاربران این سرور باشید، ولی تعداد پیگیران شما هنوز به مقدار لازم (%{min_followers}) نرسیده است. explanation: کاربران این سرور را بر اساس علاقه‌مندی‌هایشان پیدا کنید explore_mastodon: گشت و گذار در %{title} - how_to_enable: شما هنوز در فهرست گزیدهٔ کاربران این سرور نشان داده نمی‌شوید. این‌جا می‌توانید انتخابش کنید. اگر در بخش معرفی خود در نمایه‌تان برچسب (هشتگ) داشته باشد، نام شما هم برای آن هشتگ‌ها فهرست می‌شود! - people: - one: "%{count} نفر" - other: "%{count} نفر" + domain_blocks: + blocked_domains: فهرست دامین‌های محدود یا مسدود errors: + '400': The request you submitted was invalid or malformed. '403': شما اجازهٔ دیدن این صفحه را ندارید. '404': صفحه‌ای که به دنبالش هستید این‌جا نیست. + '406': This page is not available in the requested format. '410': صفحه‌ای که به دنبالش بودید دیگر این‌جا وجود ندارد. '422': content: تأیید امنیتی انجام نشد. آیا مرورگر شما کوکی‌ها را مسدود می‌کند؟ @@ -592,6 +643,7 @@ fa: '500': content: شرمنده، یک چیزی از سمت ما اشتباه شده. title: این صفحه درست نیست + '503': The page could not be served due to a temporary server failure. noscript_html: برای استفاده از نسخهٔ تحت وب ماستدون، لطفاً جاوااسکریپت را فعال کنید. یا به جایش می‌توانید یک اپ ماستدون را به‌کار ببرید. existing_username_validator: not_found: کاربری در این سرور با این نام کاربری پیدا نشد @@ -1050,7 +1102,7 @@ fa: edit_profile_step: 'شما می‌توانید نمایهٔ خود را به دلخواه خود تغییر دهید: می‌توانید تصویر نمایه، تصویر پس‌زمینه، نام، و چیزهای دیگری را تعیین کنید. اگر بخواهید، می‌توانید حساب خود را خصوصی کنید تا فقط کسانی که شما اجازه می‌دهید بتوانند پیگیر حساب شما شوند.' explanation: نکته‌هایی که برای آغاز کار به شما کمک می‌کنند final_action: چیزی منتشر کنید - final_step: 'چیزی بنویسید! حتی اگر الان کسی پیگیر شما نباشد، دیگران نوشته‌های عمومی شما را می‌بینند، مثلاً در فهرست نوشته‌های محلی و در هشتگ‌ها. شاید بخواهید با هشتگ #آشنایی خودتان را معرفی کنید.' + final_step: 'چیزی بنویسید! حتی اگر الان کسی پیگیر شما نباشد، دیگران نوشته‌های عمومی شما را می‌بینند، مثلاً در فهرست نوشته‌های محلی و در برچسب (هشتگ)ها. شاید بخواهید با برچسب #معرفی خودتان را معرفی کنید.' full_handle: نام کاربری کامل شما full_handle_hint: این چیزی است که باید به دوستان خود بگویید تا بتوانند به شما پیغام بفرستند یا از سرورهای دیگر پیگیر شما شوند. review_preferences_action: تغییر ترجیحات diff --git a/config/locales/fi.yml b/config/locales/fi.yml index beecdecb0..5a3a8ad60 100644 --- a/config/locales/fi.yml +++ b/config/locales/fi.yml @@ -395,14 +395,13 @@ fi: deletes: bad_password_msg: Hyvä yritys, hakkerit! Väärä salasana confirm_password: Tunnistaudu syöttämällä nykyinen salasanasi - description_html: Tämä poistaa pysyvästi ja peruuttamattomasti kaiken tilisi sisällön ja poistaa tilin käytöstä. Käyttäjänimesi pysyy varattuna, jotta identiteettiäsi ei myöhemmin varasteta. proceed: Poista tili success_msg: Tilin poisto onnistui - warning_html: Sisällön poistaminen taataan vain tämän instanssin osalta. Jos sisältöä on jaettu paljon, siitä todennäköisesti jää jälkiä. Palvelimet, joihin ei saada yhteyttä tai jotka ovat lopettaneet päivitystesi tilaamisen, eivät päivitä tietokantojaan. - warning_title: Sisällön saatavuustieto levitetty errors: + '400': The request you submitted was invalid or malformed. '403': Sinulla ei ole lupaa nähdä tätä sivua. '404': Etsimääsi sivua ei ole olemassa. + '406': This page is not available in the requested format. '410': Etsimääsi sivua ei ole enää olemassa. '422': content: Turvallisuusvahvistus epäonnistui. Oletko estänyt evästeet? @@ -411,6 +410,7 @@ fi: '500': content: Valitettavasti jokin meni pieleen meidän päässämme. title: Sivu ei ole oikein + '503': The page could not be served due to a temporary server failure. noscript_html: Mastodon-selainsovelluksen käyttöön vaaditaan JavaScript. Voit vaihtoehtoisesti kokeilla jotakin omalle käyttöjärjestelmällesi tehtyä Mastodonsovellusta. exports: archive_takeout: diff --git a/config/locales/fr.yml b/config/locales/fr.yml index 277d2f10a..58b160751 100644 --- a/config/locales/fr.yml +++ b/config/locales/fr.yml @@ -2,7 +2,7 @@ fr: about: about_hashtag_html: Figurent ci-dessous les pouets tagués avec #%{hashtag}. Vous pouvez interagir avec eux si vous avez un compte n’importe où dans le Fediverse. - about_mastodon_html: Mastodon est un réseau social utilisant des formats ouverts et des logiciels libres. Comme le courriel, il est décentralisé. + about_mastodon_html: Mastodon est un réseau social utilisant des protocoles Web ouverts et des logiciels libres. Tout comme le courriel, il est décentralisé. about_this: À propos active_count_after: actif·ve·s active_footnote: Utilisateur·rice·s actif·ve·s mensuels (MAU) @@ -24,6 +24,9 @@ fr: generic_description: "%{domain} est seulement un serveur du réseau" get_apps: Essayez une application mobile hosted_on: Serveur Mastodon hébergée par %{domain} + instance_actor_flash: | + Ce compte est un acteur virtuel utilisé pour représenter le serveur lui-même et non un utilisateur individuel. + Il est utilisé à des fins de fédération et ne doit pas être bloqué à moins que vous ne vouliez bloquer l’instance entière, dans ce cas vous devriez utiliser un bloqueur de domaine. learn_more: En savoir plus privacy_policy: Politique de vie privée see_whats_happening: Voir ce qui se passe @@ -42,6 +45,8 @@ fr: what_is_mastodon: Qu’est-ce que Mastodon ? accounts: choices_html: "%{name} recommande :" + endorsements_hint: Vous pouvez soutenir les personnes que vous suivez depuis l’interface web, et elles apparaîtront ici. + featured_tags_hint: Vous pouvez mettre en avant des hashtags spécifiques qui seront affichés ici. follow: Suivre followers: one: Abonné·e @@ -53,6 +58,7 @@ fr: media: Médias moved_html: "%{name} a changé de compte pour %{new_profile_link} :" network_hidden: Cette information n’est pas disponible + never_active: Jamais nothing_here: Rien à voir ici ! people_followed_by: Personnes suivies par %{name} people_who_follow: Personnes qui suivent %{name} @@ -244,6 +250,7 @@ fr: updated_msg: Émoji mis à jour avec succès ! upload: Téléverser dashboard: + authorized_fetch_mode: Mode de récupération autorisé backlog: tâches en attente config: Configuration feature_deletions: Suppressions de comptes @@ -273,11 +280,14 @@ fr: domain_allows: add_new: Mettre le domaine sur liste sur blanche created_msg: Ce domaine a été ajouté à la liste blanche avec succès + destroyed_msg: Le domaine a été supprimé de la liste blanche + undo: Supprimer de la liste blanche domain_blocks: add_new: Ajouter un nouveau bloqueur de domaine created_msg: Le blocage de domaine est désormais activé destroyed_msg: Le blocage de domaine a été désactivé domain: Domaine + edit: Modifier le bloqueur de domaine existing_domain_block_html: Vous avez déjà imposé des limites plus strictes à %{name}, vous devez d’abord le débloquer. new: create: Créer le blocage @@ -288,6 +298,10 @@ fr: silence: Masqué suspend: Suspendre title: Nouveau blocage de domaine + private_comment: Commentaire privé + private_comment_hint: Commenter sur cette limitation de domaine pour informer les modérateurs internes. + public_comment: Commentaire public + public_comment_hint: Commentaire sur cette limitation de domaine pour le grand public, si la visibilité publique de la liste des limitations de domaine est activée. reject_media: Fichiers média rejetés reject_media_hint: Supprime localement les fichiers média stockés et refuse d’en télécharger ultérieurement. Ne concerne pas les suspensions reject_reports: Rejeter les signalements @@ -307,6 +321,7 @@ fr: title: Annuler le blocage de domaine pour %{domain} undo: Annuler undo: Annuler le bloqueur de domaine + view: Afficher les bloqueurs de domaines email_domain_blocks: add_new: Ajouter created_msg: Le blocage de domaine de courriel est désormais activé @@ -409,6 +424,13 @@ fr: custom_css: desc_html: Modifier l’apparence avec une CSS chargée sur chaque page title: CSS personnalisé + domain_blocks: + all: À tout le monde + disabled: À personne + title: Afficher les bloqueurs de domaines + users: Pour les utilisateurs locaux connectés + domain_blocks_rationale: + title: Voir le raisonnement hero: desc_html: Affichée sur la page d’accueil. Au moins 600x100px recommandé. Lorsqu’elle n’est pas définie, se rabat sur la vignette du serveur title: Image d’en-tête @@ -459,6 +481,9 @@ fr: desc_html: Affichée sur la page des conditions d’utilisation du site
Vous pouvez utiliser des balises HTML title: Politique de confidentialité site_title: Nom du serveur + spam_check_enabled: + desc_html: Mastodon peut auto-silencer et signaler des comptes qui envoient des messages répétés non sollicités. Il peut y avoir de faux positifs. + title: Automatisation anti-spam thumbnail: desc_html: Utilisée pour les prévisualisations via OpenGraph et l’API. 1200x630px recommandé title: Vignette du serveur @@ -475,6 +500,7 @@ fr: delete: Supprimer nsfw_off: Marquer comme non-sensible nsfw_on: Marquer comme sensible + deleted: Supprimé failed_to_execute: Erreur d’exécution media: title: Médias @@ -483,11 +509,19 @@ fr: title: État du compte with_media: avec médias tags: + accounts_today: Utilisations uniques aujourd'hui + accounts_week: Utilisation unique cette semaine + breakdown: Répartition de l’utilisation actuelle par source + context: Contexte  + directory: Dans le répertoire + in_directory: "%{count} dans le répertoire" review: État de traitement reviewed: Traité title: Hashtags trending_right_now: Populaire en ce moment + unique_uses_today: "%{count} posts aujourd'hui" unreviewed: Non traité + updated_msg: Paramètres Hashtag mis à jour avec succès title: Administration warning_presets: add_new: Ajouter un nouveau @@ -511,6 +545,7 @@ fr: advanced_web_interface_hint: 'Si vous voulez utiliser toute la largeur de votre écran, l’interface web avancée vous permet de configurer plusieurs colonnes différentes pour voir autant d’informations que vous le souhaitez en même temps : Accueil, notifications, fil public fédéré, un nombre illimité de listes et hashtags.' animations_and_accessibility: Animations et accessibilité confirmation_dialogs: Dialogues de confirmation + discovery: Découverte sensitive_content: Contenu sensible application_mailer: notification_preferences: Modifier les préférences de courriel @@ -534,6 +569,10 @@ fr: checkbox_agreement_without_rules_html: J’accepte les conditions d’utilisation delete_account: Supprimer le compte delete_account_html: Si vous désirez supprimer votre compte, vous pouvez cliquer ici. Il vous sera demandé de confirmer cette action. + description: + prefix_invited_by_user: "@%{name} vous invite à rejoindre ce serveur Mastodon !" + prefix_sign_up: Inscrivez-vous aujourd’hui sur Mastodon ! + suffix: Avec un compte, vous pourrez suivre des gens, publier des statuts et échanger des messages avec les utilisateurs de n'importe quel serveur Mastodon et bien plus ! didnt_get_confirmation: Vous n’avez pas reçu les consignes de confirmation ? forgot_password: Mot de passe oublié ? invalid_reset_password_token: Le lien de réinitialisation du mot de passe est invalide ou a expiré. Merci de réessayer. @@ -551,8 +590,15 @@ fr: reset_password: Réinitialiser le mot de passe security: Sécurité set_new_password: Définir le nouveau mot de passe + setup: + email_below_hint_html: Si l’adresse e-mail ci-dessous est incorrecte, vous pouvez la modifier ici et recevoir un nouveau courriel de confirmation. + email_settings_hint_html: L’e-mail de confirmation a été envoyé à %{email}. Si cette adresse e-mail n’est pas correcte, vous pouvez la modifier dans les paramètres du compte. + title: Configuration status: + account_status: Statut du compte + confirming: En attente de la confirmation par e-mail à compléter. functional: Votre compte est entièrement opérationnel. + pending: Votre demande est en attente d'examen par notre personnel. Cela peut prendre un certain temps. Vous recevrez un courriel si votre demande est approuvée. trouble_logging_in: Vous avez un problème pour vous connecter ? authorize_follow: already_following: Vous suivez déjà ce compte @@ -582,26 +628,40 @@ fr: deletes: bad_password_msg: Bien essayé ! Mot de passe incorrect confirm_password: Entrez votre mot de passe pour vérifier votre identité - description_html: Cela va supprimer votre compte et le désactiver de manière permanente et irréversible. Votre nom d’utilisateur⋅ice restera réservé afin d’éviter la confusion. proceed: Supprimer compte success_msg: Votre compte a été supprimé avec succès - warning_html: Seule la suppression du contenu depuis ce serveur est garantie. Le contenu qui a été partagé est susceptible de laisser des traces. Les serveurs hors-ligne ainsi que ceux n’étant plus abonnées à vos publications ne mettront pas leur base de données à jour. - warning_title: Disponibilité du contenu disséminé + warning: + more_details_html: Pour plus de détails, voir la politique de confidentialité. + username_available: Votre nom d’utilisateur sera à nouveau disponible + username_unavailable: Votre nom d’utilisateur restera indisponible directories: directory: Annuaire des profils - enabled: Vous êtes actuellement listé dans l’annuaire. - enabled_but_waiting: Vous avez choisi d’être listé dans l’annuaire, mais vous n’avez pas encore le nombre minimum de suiveurs (%{min_followers}) pour y être inscrit. explanation: Découvrir des utilisateurs en se basant sur leurs centres d’intérêt explore_mastodon: Explorer %{title} - how_to_enable: Vous n’êtes pas encore inscrit dans l’annuaire. Vous pouvez vous inscrire ci-dessous. Utilisez des hashtags dans votre texte biographique pour être listé sous des hashtags spécifiques ! - people: - one: "%{count} personne" - other: "%{count} personne" + domain_blocks: + blocked_domains: Liste des domaines limités et bloqués + description: Ceci est la liste des serveurs envers qui %{instance} limite ou rejette la fédération. + domain: Domaine + media_block: Bloqueur de média + no_domain_blocks: "(Aucun bloqueur de domaine)" + severity: Sévérité + severity_legend: + media_block: Les fichiers de média provenant du serveur ne sont ni récupérés, ni stockés, ni affichés à l’utilisateur·rice. + silence: Les comptes des serveurs masqués peuvent être trouvés, suivis et interagis avec, mais leurs Toots n'apparaîtront pas dans les fil d'actualité publiques, et les notifications de ceux-ci ne parviendront pas aux utilisateurs locaux qui ne les suivent pas. + suspension: Aucun contenu des serveurs suspendus n'est stocké ou affiché, ni ne leur est communiqué. Les interactions des serveurs suspendus sont ignorées. + suspension_disclaimer: Les serveurs suspendus peuvent parfois récupérer du contenu public de ce serveur. + title: Séverités + show_rationale: Voir le raisonnement + silence: Masquer + suspension: Suspendre + title: "%{instance} Liste des instances bloquées" domain_validator: invalid_domain: n’est pas un nom de domaine valide errors: + '400': The request you submitted was invalid or malformed. '403': Vous n’avez pas accès à cette page. '404': La page que vous recherchez n’existe pas. + '406': Cette page n'est pas disponible au format demandé. '410': La page que vous recherchez n’existe plus. '422': content: Vérification de sécurité échouée. Bloquez-vous les cookies ? @@ -610,6 +670,7 @@ fr: '500': content: Nous sommes désolé·e·s, mais quelque chose s’est mal passé de notre côté. title: Cette page n’est pas correcte + '503': The page could not be served due to a temporary server failure. noscript_html: Pour utiliser Mastodon, veuillez activer JavaScript. Sinon, essayez l’une des applications natives pour Mastodon pour votre plate-forme. existing_username_validator: not_found: n’a pas trouvé d’utilisateur·rice local·e avec ce nom @@ -633,6 +694,7 @@ fr: add_new: Ajouter un nouvel hashtag errors: limit: Vous avez déjà mis en avant le nombre maximum de hashtags + hint_html: "Que sont les hashtags vedettes ? Ils sont affichés avec emphase sur votre flux d'actualités publique et permettent aux gens de parcourir vos messages publics spécifiquement sous ces hashtags. Ils sont un excellent outil pour garder trace des œuvres créatives ou des projets à long terme." filters: contexts: home: Accueil @@ -653,6 +715,7 @@ fr: developers: Développeurs more: Davantage… resources: Ressources + trending_now: Tendance en ce moment generic: all: Tous changes_saved_msg: Les modifications ont été enregistrées avec succès ! @@ -836,7 +899,7 @@ fr: browser: Navigateur browsers: alipay: Alipay - blackberry: Blackberry + blackberry: BlackBerry chrome: Chrome edge: Microsoft Edge electron: Electron @@ -850,7 +913,7 @@ fr: phantom_js: PhantomJS qq: QQ Browser safari: Safari - uc_browser: UCBrowser + uc_browser: UC Browser weibo: Weibo current_session: Session courante description: "%{browser} sur %{platform}" @@ -859,8 +922,8 @@ fr: platforms: adobe_air: Adobe Air android: Android - blackberry: Blackberry - chrome_os: ChromeOS + blackberry: BlackBerry + chrome_os: Chrome OS firefox_os: Firefox OS ios: iOS linux: Linux @@ -892,6 +955,8 @@ fr: profile: Profil relationships: Abonnements et abonné·e·s two_factor_authentication: Identification à deux facteurs + spam_check: + spam_detected_and_silenced: Ceci est un rapport automatisé. Du spam a été détecté et l’expéditeur a été silencié automatiquement. Si c’est une erreur, veuillez désactiver la sourdine du compte. statuses: attached: description: 'Attaché : %{attached}' @@ -1052,7 +1117,9 @@ fr: disable: Lorsque votre compte est gelé, les données de votre compte demeurent intactes, mais vous ne pouvez effectuer aucune action jusqu’à ce qu’il soit débloqué. silence: Lorsque votre compte est limité, seulement les utilisateurs qui vous suivent déjà verront vos pouets sur ce serveur, et vous pourriez être exclu de plusieurs listes publiques. Néanmoins, d’autres utilisateurs peuvent vous suivre manuellement. suspend: Votre compte a été suspendu, et tous vos pouets et vos fichiers multimédia téléversés ont été supprimés irréversiblement de ce serveur, et des serveurs où vous aviez des abonné⋅e⋅s. + get_in_touch: Vous pouvez répondre à cette adresse pour entrer en contact avec l’équipe de %{instance}. review_server_policies: Passer en revue les politiques du serveur + statuses: 'Spécialement, pour :' subject: disable: Votre compte %{acct} a été gelé none: Avertissement pour %{acct} diff --git a/config/locales/gl.yml b/config/locales/gl.yml index ec412dd8f..0c515a2ec 100644 --- a/config/locales/gl.yml +++ b/config/locales/gl.yml @@ -45,6 +45,8 @@ gl: what_is_mastodon: Qué é Mastodon? accounts: choices_html: 'Eleccións de %{name}:' + endorsements_hint: Desde a interface web pode recomendar xente que segue, e aparecerán aquí. + featured_tags_hint: Pode destacar determinadas etiquetas que se mostrarán aquí. follow: Seguir followers: one: Seguidora @@ -56,6 +58,7 @@ gl: media: Medios moved_html: "%{name} mudouse a %{new_profile_link}:" network_hidden: A información non está dispoñible + never_active: Nunca nothing_here: Nada por aquí! people_followed_by: Personas que segue %{name} people_who_follow: Personas que seguen a %{name} @@ -222,10 +225,12 @@ gl: deleted_status: "(estado eliminado)" title: Rexistro de auditoría custom_emojis: + assign_category: Asignar categoría by_domain: Dominio copied_msg: Creouse con éxito unha copia local dos emoji copy: Copiar copy_failed_msg: Non se puido facer copia local de ese emoji + create_new_category: Crear nova categoría created_msg: Creou o emoji con satisfactoriamente! delete: Eliminar destroyed_msg: Emojo destruído satisfactoriamente! @@ -242,6 +247,7 @@ gl: shortcode: Código corto shortcode_hint: Cando menos 2 caracteres, só caracteres alfanuméricos e subliñados title: Emojis persoalizados + uncategorized: Sen categorizar unlisted: Non listado update_failed_msg: Non se puido actualizar ese emoji updated_msg: Actualizouse correctamente o emoji! @@ -260,6 +266,8 @@ gl: features: Características hidden_service: Federación con servizos ocultos open_reports: informes abertos + pending_tags: etiquetas agardando revisión + pending_users: usuarias agardando revisión recent_users: Usuarias recentes search: Busca de texto completo single_user_mode: Modo de usuario individual @@ -282,6 +290,7 @@ gl: created_msg: Estase a procesar o bloqueo do dominio destroyed_msg: Desfixose a acción de bloqueo de dominio domain: Dominio + edit: Editar bloqueo de dominio existing_domain_block_html: Xa estableceu límites estrictos para %{name}, precisa desbloqueala primeiro. new: create: Crear bloque @@ -292,6 +301,10 @@ gl: silence: Silenciar suspend: Suspender title: Novo bloqueo de dominio + private_comment: Comentario privado + private_comment_hint: Comentar entre moderadores para uso interno as limitacións de este dominio. + public_comment: Comentario público + public_comment_hint: Comentar sobre as limitacións de este dominio para o interese público, se o aviso da lista de dominios limitados está activado. reject_media: Rexeitar ficheiros de medios reject_media_hint: Eliminar ficheiros de medios almacenados localmente e rexeita descargalos no futuro. Irrelevante para as suspensións reject_reports: Rexeitar informes @@ -311,6 +324,7 @@ gl: title: Desfacer o bloqueo de dominio para %{domain} undo: Desfacer undo: Desfacer bloqueo de dominio + view: Ver dominios bloqueados email_domain_blocks: add_new: Engadir novo created_msg: Engadeuse correctamente o dominio de email a lista negra @@ -334,6 +348,8 @@ gl: all: Todo limited: Limitado title: Moderación + private_comment: Comentario privado + public_comment: Comentario público title: Federación total_blocked_by_us: Bloqueado por nós total_followed_by_them: Seguidas por eles @@ -411,6 +427,13 @@ gl: custom_css: desc_html: Modificar o aspecto con CSS cargado en cada páxina title: CSS persoalizado + domain_blocks: + all: Para todas + disabled: Para ninguén + title: Mostrar dominios bloqueados + users: Para usuarias locais conectadas + domain_blocks_rationale: + title: Mostrar razón hero: desc_html: Mostrado na portada. Recoméndase 600x100px como mínimo. Se non se establece, mostrará a imaxe por omisión do servidor title: Imáxe Heróe @@ -480,6 +503,7 @@ gl: delete: Eliminar nsfw_off: Marcar como non sensible nsfw_on: Marcar como sensible + deleted: Eliminado failed_to_execute: Fallou a execución media: title: Medios @@ -488,6 +512,9 @@ gl: title: Estados da conta with_media: con medios tags: + accounts_today: Usos únicos hoxe + accounts_week: Usos únicos esta semana + breakdown: Consumo do uso diario por fonte context: Contexto directory: No directorio in_directory: "%{count} no directorio" @@ -496,6 +523,7 @@ gl: title: Etiquetas trending_right_now: Agora como Tendencia unique_uses_today: "%{count} publicando hoxe" + unreviewed: Sen revisar updated_msg: Actualizaronse os axustes das etiquetas title: Administración warning_presets: @@ -544,6 +572,10 @@ gl: checkbox_agreement_without_rules_html: Acepto os termos do servizo delete_account: Eliminar conta delete_account_html: Se desexa eliminar a súa conta, pode facelo aquí. Pediráselle confirmación. + description: + prefix_invited_by_user: "@%{name} convídate a que te unas a este servidor Mastodon!" + prefix_sign_up: Rexístrate agora en Mastodon! + suffix: Ao abrir unha conta, poderás seguir a xente, actualizacións das publicacións e intercambiar mensaxes coas usuarias de calquera servidor de Mastodon e moito máis! didnt_get_confirmation: Non recibeu as instruccións de confirmación? forgot_password: Esqueceu o contrasinal? invalid_reset_password_token: O testemuño para restablecer o contrasinal non é válido ou caducou. Por favor solicite un novo. @@ -599,24 +631,47 @@ gl: deletes: bad_password_msg: Bo intento, hackers! Contrasinal incorrecto confirm_password: Introduza o seu contrasinal para verificar a súa identidade - description_html: Esto eliminará de xeito permanente e irreversible o contido da súa conta e será desactivada. O seu nome de usuaria permanecerá reservado para evitar futuras confusións de identidades. proceed: Eliminar conta success_msg: A súa conta eliminouse correctamente - warning_html: Só se garantiza a eliminación de contido de este servidor. O contido que foi compartido con outras instancias é probable que deixe rastros. O servidores fora de liña e servidores que se desuscribiron das súas actualizacións non actualizarán as súas bases de datos. - warning_title: Dispoñibilidade do contido espallado + warning: + before: 'Antes de seguir, por favor lé estas notas con atención:' + caches: O contido almacenado en outros servidores podería persistir + data_removal: As túas publicacións e outros datos serán permanentemente borrados + email_change_html: Podes cambiar o enderezo de correo sen eliminar a conta + email_contact_html: Se non o recibes, podes escribir a %{email} pedindo axuda + email_reconfirmation_html: Se non recibes o correo de confirmación, podes solicitalo de novo + irreversible: Non poderás restaurar ou reactivar a conta + more_details_html: Para máis detalles, mira a política de intimidade. + username_available: O nome de usuario estará dispoñible novamente + username_unavailable: O nome de usuario non estará dispoñible directories: directory: Directorio de perfil - enabled: Vostede está actualmente na lista do directorio. - enabled_but_waiting: Vostede optou por ser incluída no directorio, mais por agora non ten o número mínimo de seguidoras (%{min_followers}) para aparecer. explanation: Descubra usuarias según o seu interese explore_mastodon: Explorar %{title} - how_to_enable: Actualmente non solicitou ser incluída no directorio, pode facelo abaixo. Utilice etiquetas no texto de biografía para ser incluída baixo etiquetas específicas! - people: - one: "%{count} persoa" - other: "%{count} persoas" + domain_blocks: + blocked_domains: Lista de dominios limitados e bloqueados + description: Esta é a lista dos servidores cos que %{instance} limita ou rexeita federar. + domain: Dominio + media_block: Bloqueo de medios + no_domain_blocks: "(Sen bloqueo de medios)" + severity: Rigurosidade + severity_legend: + media_block: Os ficheiros de medios procedentes do servidor non se obterán, gardarán nin mostrarán as usuarias. + silence: As contas de servidores silenciados pódense atopar, seguir e interactuar con elas, pero os seus toots non aparecerán na liña temporal púbica, as notificacións procedentes deles non chegarán as usuarias que non as están a seguir. + suspension: Non se mostra nin garda ningún contido de servidores suspendidos, tampouco se lles envía contido. As interaccións con servidores suspendidos son ignoradas. + suspension_disclaimer: Os servidores suspendidos poderían obter ocasionalmente contido público de este servidor. + title: Rigurosidades + show_rationale: Mostrar razón + silence: Silenciar + suspension: Suspensión + title: "%{instance} Lista de instancias bloqueadas" + domain_validator: + invalid_domain: non é un nome de dominio válido errors: + '400': A solicitude que enviou non é válida ou ten formato incorrecto. '403': Non ten permiso para ver esta páxina. '404': A páxina que está a buscar non está aquí. + '406': Esta páxina non está dispoñible no formato solicitado. '410': A páxina que estaba a buscar xa non existe. '422': content: Fallou a verificación de seguridade. Está bloqueando as cookies? @@ -625,6 +680,7 @@ gl: '500': content: Sentímolo, pero algo do noso lado falloou. title: Esta páxina non é correcta + '503': A páxina non se puido servir debido a un fallo temporal no servidor. noscript_html: Para utilizar a aplicación web de Mastodon debe habilitar JavaScript. De xeito alternativo, intente unha das apps nativas para Mastodon da súa plataforma. existing_username_validator: not_found: non se atopou unha usuaria local con ese alcume @@ -648,6 +704,7 @@ gl: add_new: Engadir novo errors: limit: Xa acadou o número máximo de etiquetas + hint_html: "¿Qué son as etiquetas destacadas? Móstranse destacadas no seu perfil público e permítenlle a outras persoas ver os seus toots públicos nos que as utilizou. Son unha ferramenta moi útil para facer seguimento de traballos creativos e proxectos a longo prazo." filters: contexts: home: Liña temporal inicial @@ -668,10 +725,12 @@ gl: developers: Desenvolvedoras more: Máis… resources: Recursos + trending_now: Tendencia agora generic: all: Todo changes_saved_msg: Cambios gardados correctamente!! copy: Copiar + no_batch_actions_available: Non hai accións en pila dispoñibles nesta páxina order_by: Ordenar por save_changes: Gardar cambios validation_errors: @@ -1069,7 +1128,9 @@ gl: disable: Cando a súa conta está conxelada, os datos permanecen intactos, pero non pode levar a fin accións ate que se desbloquea. silence: Mentras a conta está limitada, só a xente que actualmente a segue verá os seus toots en este servidor, e vostede podería estar excluída de varias listas públicas. Porén, outras persoas poderíana seguila de xeito manual. suspend: A súa conta foi suspendida, e todos os seus toots e medios subidos foron eliminados de este servidor de xeito irreversible, e dos servidores onde tivese seguidoras. + get_in_touch: Pode responder a este correo para contactar coa administración de %{instance}. review_server_policies: Revisar políticas do servidor + statuses: 'En concreto, para:' subject: disable: A súa conta %{acct} foi conxelada none: Aviso para %{acct} diff --git a/config/locales/he.yml b/config/locales/he.yml index 12953c223..62c04a8e8 100644 --- a/config/locales/he.yml +++ b/config/locales/he.yml @@ -212,14 +212,17 @@ he: x_months: "%{count} חודשים" x_seconds: "%{count} שניות" errors: + '400': The request you submitted was invalid or malformed. '403': חסרות לך הרשאות לצפיה בעמוד זה. '404': הדף המבוקש לא קיים. + '406': This page is not available in the requested format. '410': הדף המבוקש כבר לא קיים. '422': content: בדיקת אבטחה נכשלה. החסמת עוגיותיך מפנינו? title: בדיקת בטיחות נכשלה '429': הוחנק '500': + '503': The page could not be served due to a temporary server failure. exports: blocks: רשימת חסימות follows: רשימת נעקבים diff --git a/config/locales/hr.yml b/config/locales/hr.yml index a4fe62055..67d83525b 100644 --- a/config/locales/hr.yml +++ b/config/locales/hr.yml @@ -44,12 +44,15 @@ hr: x_months: "%{count}mj" x_seconds: "%{count}sek" errors: + '400': The request you submitted was invalid or malformed. '403': You don't have permission to view this page. '404': The page you are looking for isn't here. + '406': This page is not available in the requested format. '410': The page you were looking for doesn't exist here anymore. '422': '429': Throttled '500': + '503': The page could not be served due to a temporary server failure. exports: blocks: Blokirao si follows: Slijediš diff --git a/config/locales/hu.yml b/config/locales/hu.yml index e8534a992..7aa75434c 100644 --- a/config/locales/hu.yml +++ b/config/locales/hu.yml @@ -613,26 +613,19 @@ hu: deletes: bad_password_msg: Haha, hekker! Helytelen jelszó confirm_password: Személyazonosságod megerősítéséhez írd be a jelenlegi jelszavad - description_html: Ezzel véglegesen és visszafordíthatatlanul törlöd minden tartalmadat és deaktiválod a fiókodat. A felhasználónevedet megtartjuk, hogy megakadályozzuk a neveddel történő jövőbeni visszaélések lehetőségét. proceed: Felhasználói fiók törlése success_msg: Felhasználói fiókod sikeresen töröltük - warning_html: Csak azt tudjuk garantálni, hogy az általad létrehozott tartalmat erről a szerverről töröljük. Ha egyes tartalmaidat sokan megosztották, valószínűleg marad nyomuk a megosztások miatt. Nem fogjuk tudni frissíteni azon szerverek adatbázisát, amelyek nem kapcsolódnak a föderációhoz vagy amelyek leiratkoztak a tülkjeidről. - warning_title: Szórt tartalmak elérése directories: directory: Profilok - enabled: Szerepelsz a profil adatbázisban. - enabled_but_waiting: Engedélyezted, hogy szerepelj a profil adatbázisban, de még nincs elegendő követőd (%{min_followers}) ehhez. explanation: Találj másokra érdeklődésük alapján explore_mastodon: "%{title} felfedezése" - how_to_enable: Nem engedélyezted a profil adatbázisban való megjelenésed. Engedélyezheted alább. Használj hashtageket az életrajzodban, hogy az ezekhez tartozó listákba bekerülj! - people: - one: "%{count} ember" - other: "%{count} ember" domain_validator: invalid_domain: nem egy valódi domain név errors: + '400': The request you submitted was invalid or malformed. '403': Nincs jogosultságod az oldal megtekintéséhez. '404': Az általad keresett oldal nem található. + '406': This page is not available in the requested format. '410': Az általad keresett oldal már nem létezik. '422': content: Megerősítés sikertelen. Nem tiltottad le esetleg a sütiket? @@ -641,6 +634,7 @@ hu: '500': content: Sajnáljuk, valami hiba történt a mi oldalunkon. title: Az oldal nem megfelelő + '503': The page could not be served due to a temporary server failure. noscript_html: A Mastodon webalkalmazás használatához engedélyezned kell a JavaScriptet. A másik megoldás, hogy kipróbálsz egy platformodnak megfelelő alkalmazást. existing_username_validator: not_found: ezzel a névvel nem találtunk helyi felhasználót diff --git a/config/locales/hy.yml b/config/locales/hy.yml index 197ddae79..203351893 100644 --- a/config/locales/hy.yml +++ b/config/locales/hy.yml @@ -12,12 +12,15 @@ hy: auth: login: Մտնել errors: + '400': The request you submitted was invalid or malformed. '403': You don't have permission to view this page. '404': The page you are looking for isn't here. + '406': This page is not available in the requested format. '410': The page you were looking for doesn't exist here anymore. '422': '429': Throttled '500': + '503': The page could not be served due to a temporary server failure. invites: expires_in: '1800': 30 minutes diff --git a/config/locales/id.yml b/config/locales/id.yml index 16098b189..81a8ffd1f 100644 --- a/config/locales/id.yml +++ b/config/locales/id.yml @@ -226,14 +226,17 @@ id: x_months: "%{count}bln" x_seconds: "%{count}dtk" errors: + '400': The request you submitted was invalid or malformed. '403': Anda tidak mempunyai izin untuk melihat halaman ini. '404': Halaman yang anda cari tidak ditemukan + '406': This page is not available in the requested format. '410': Halaman yang anda cari sudah tidak dapat ditemukan lagi. '422': content: Verifikasi keamanan gagal. Apa anda memblokir cookie? title: Verifikasi keamanan gagal '429': Throttled '500': + '503': The page could not be served due to a temporary server failure. exports: blocks: Anda blokir follows: Anda ikuti diff --git a/config/locales/io.yml b/config/locales/io.yml index 559bf0f53..2b3e50691 100644 --- a/config/locales/io.yml +++ b/config/locales/io.yml @@ -73,12 +73,15 @@ io: half_a_minute: Jus less_than_x_seconds: Jus errors: + '400': The request you submitted was invalid or malformed. '403': You don't have permission to view this page. '404': La pagino quan tu serchas ne existas. + '406': This page is not available in the requested format. '410': La pagino quan tu serchas ne plus existas. '422': '429': Throttled '500': + '503': The page could not be served due to a temporary server failure. exports: blocks: Tu blokusas follows: Tu sequas diff --git a/config/locales/it.yml b/config/locales/it.yml index 781d99919..f62d309df 100644 --- a/config/locales/it.yml +++ b/config/locales/it.yml @@ -8,7 +8,7 @@ it: active_footnote: Utenti Attivi Mensili (MAU) administered_by: 'Amministrato da:' api: API - apps: Applicazioni Mobile + apps: Applicazioni per dispositivi mobili apps_platforms: Usa Mastodon da iOS, Android e altre piattaforme browse_directory: Sfoglia la directory dei profili e filtra per interessi browse_public_posts: Sfoglia il flusso in tempo reale di post pubblici su Mastodon @@ -24,6 +24,9 @@ it: generic_description: "%{domain} è un server nella rete" get_apps: Prova un'app per smartphone hosted_on: Mastodon ospitato su %{domain} + instance_actor_flash: | + Questo account è un attore virtuale utilizzato per rappresentare il server stesso e non un particolare utente. + È utilizzato per scopi di federazione e non dovrebbe essere bloccato a meno che non si voglia bloccare l'intera istanza: in questo caso si dovrebbe utilizzare un blocco di dominio. learn_more: Scopri altro privacy_policy: Politica della privacy see_whats_happening: Guarda cosa succede @@ -52,7 +55,7 @@ it: last_active: ultima attività link_verified_on: La proprietà di questo link è stata controllata il %{date} media: Media - moved_html: "%{name} è stato spostato su %{new_profile_link}:" + moved_html: "%{name} si è spostato su %{new_profile_link}:" network_hidden: Questa informazione non e' disponibile nothing_here: Qui non c'è nulla! people_followed_by: Persone seguite da %{name} @@ -64,7 +67,7 @@ it: other: Toot posts_tab_heading: Toot posts_with_replies: Toot e risposte - reserved_username: Il nome utente è gia stato preso + reserved_username: Questo nome utente è già stato preso roles: admin: Amministratore bot: Bot @@ -88,7 +91,7 @@ it: by_domain: Dominio change_email: changed_msg: Account email cambiato con successo! - current_email: Email corrente + current_email: Email attuale label: Cambia email new_email: Nuova email submit: Cambia email @@ -99,7 +102,7 @@ it: deleted: Cancellato demote: Declassa disable: Disabilita - disable_two_factor_authentication: Disabilita 2FA + disable_two_factor_authentication: Disabilita l'autenticazione a due fattori disabled: Disabilitato display_name: Nome visualizzato domain: Dominio @@ -116,7 +119,7 @@ it: inbox_url: URL inbox invited_by: Invitato da ip: IP - joined: Unito + joined: Iscritto da location: all: Tutto local: Locale @@ -134,7 +137,7 @@ it: title: Moderazione moderation_notes: Note di moderazione most_recent_activity: Attività più recenti - most_recent_ip: IP più recenti + most_recent_ip: IP più recente no_account_selected: Nessun account è stato modificato visto che non ne è stato selezionato nessuno no_limits_imposed: Nessun limite imposto not_subscribed: Non sottoscritto @@ -281,6 +284,7 @@ it: created_msg: Il blocco del dominio sta venendo processato destroyed_msg: Il blocco del dominio è stato rimosso domain: Dominio + edit: Modifica blocco di dominio existing_domain_block_html: Hai già impostato limitazioni più stringenti su %{name}, dovresti sbloccare prima. new: create: Crea blocco @@ -292,7 +296,9 @@ it: suspend: Sospendi title: Nuovo blocco dominio private_comment: Commento privato + private_comment_hint: Commento su questa limitazione di dominio per uso interno da parte dei moderatori. public_comment: Commento pubblico + public_comment_hint: Commento pubblico su questa limitazione di dominio, se l'elenco delle limitazioni di dominio è pubblico. reject_media: Rifiuta file media reject_media_hint: Rimuovi i file media salvati in locale e blocca i download futuri. Irrilevante per le sospensioni reject_reports: Respingi rapporti @@ -312,6 +318,7 @@ it: title: Annulla il blocco del dominio per %{domain} undo: Annulla undo: Annulla + view: Visualizza blocco di dominio email_domain_blocks: add_new: Aggiungi nuovo created_msg: Dominio email aggiunto con successo alla lista nera @@ -414,6 +421,13 @@ it: custom_css: desc_html: Modifica l'aspetto con il CSS caricato in ogni pagina title: CSS personalizzato + domain_blocks: + all: A tutti + disabled: A nessuno + title: Mostra blocchi di dominio + users: Agli utenti locali connessi + domain_blocks_rationale: + title: Mostra motivazione hero: desc_html: Mostrata nella pagina iniziale. Almeno 600x100 px consigliati. Se non impostata, sarà usato il thumbnail del server title: Immagine dell'eroe @@ -483,6 +497,7 @@ it: delete: Elimina nsfw_off: Segna come non sensibile nsfw_on: Segna come sensibile + deleted: Cancellato failed_to_execute: Impossibile eseguire media: title: Media @@ -496,7 +511,11 @@ it: breakdown: Suddivisione dell'utilizzo di oggi per fonte context: Contesto directory: Nella directory + in_directory: "%{count} nella directory" + reviewed: Controllato title: Hashtag + trending_right_now: Di tendenza ora + unreviewed: Non controllato updated_msg: Impostazioni degli hashtag aggiornate title: Amministrazione warning_presets: @@ -513,6 +532,9 @@ it: body: "%{reporter} ha segnalato %{target}" body_remote: Qualcuno da %{domain} ha segnalato %{target} subject: Nuova segnalazione per %{instance} (#%{id}) + new_trending_tag: + body: 'L''hashtag #%{name} oggi è di tendenza, ma non è stato mai controllato. Non sarà visualizzato pubblicamente se non lo permetti; se salvi il form senza modifiche non lo vedrai mai più.' + subject: Nuovo hashtag pronto per essere controllato su %{instance} (%{name}) appearance: advanced_web_interface: Interfaccia web avanzata advanced_web_interface_hint: |- @@ -597,26 +619,36 @@ it: deletes: bad_password_msg: Ci avete provato, hacker! Password errata confirm_password: Inserisci la tua password attuale per verificare la tua identità - description_html: Questa azione eliminerà in modo permanente e irreversibile tutto il contenuto del tuo account e lo disattiverà. Il tuo nome utente resterà riservato per prevenire che qualcuno in futuro assuma la tua identità. proceed: Cancella l'account success_msg: Il tuo account è stato cancellato - warning_html: È garantita la cancellazione del contenuto solo da questo server. I contenuti che sono stati ampiamente condivisi probabilmente lasceranno delle tracce. I server offline e quelli che non ricevono più i tuoi aggiornamenti non aggiorneranno i loro database. - warning_title: Disponibilità di contenuto diffuso directories: directory: Directory dei profili - enabled: Attualmente sei elencato nella directory. - enabled_but_waiting: Hai scelto di essere elencato nella directory, ma non hai ancora il numero minimo di seguaci (%{min_followers}) per comparire. explanation: Scopri utenti in base ai loro interessi explore_mastodon: Esplora %{title} - how_to_enable: Attualmente non hai scelto di comparire nella directory. Puoi farlo qui sotto. Se vuoi comparire sotto determinati hashtag, usali nel testo della tua biografia. - people: - one: "%{count} persona" - other: "%{count} persone" + domain_blocks: + blocked_domains: Elenco dei domini limitati e bloccati + description: Questo è l'elenco dei server con cui %{instance} limita o rifiuta la federazione. + domain: Dominio + media_block: Blocco dei media + no_domain_blocks: "(Nessun blocco di dominio)" + severity: Gravità + severity_legend: + media_block: I file multimediali provenienti dal server non sono recuperati, memorizzati o visualizzati all'utente. + silence: Gli account di server silenziati possono essere trovati e seguiti, e gli utenti possono interagire con essi, ma i loro toot non appariranno nelle timeline pubbliche e le relative notifiche non raggiungeranno gli utenti locali che non li seguono. + suspension: Nessun contenuto dai server sospesi è memorizzato o visualizzato, e nessun contenuto gli viene inviato. Le interazioni dai server sospesi sono ignorate. + suspension_disclaimer: I server sospesi possono talvolta recuperare contenuti pubblici da questo server. + title: Gravità + show_rationale: Mostra motivazione + silence: Silenzia + suspension: Sospensione + title: "%{instance} Elenco delle istanze bloccate" domain_validator: invalid_domain: non è un nome di dominio valido errors: + '400': The request you submitted was invalid or malformed. '403': Non sei autorizzato a visualizzare questa pagina. '404': La pagina che stavi cercando non esiste. + '406': This page is not available in the requested format. '410': La pagina che stavi cercando qui non esiste più. '422': content: Verifica di sicurezza non riuscita. Stai bloccando i cookies? @@ -625,6 +657,7 @@ it: '500': content: Siamo spiacenti, ma qualcosa non ha funzionato dal nostro lato. title: Questa pagina non è corretta + '503': The page could not be served due to a temporary server failure. noscript_html: Per usare l'interfaccia web di Mastodon dovi abilitare JavaScript. In alternativa puoi provare una delle app native per Mastodon per la tua piattaforma. existing_username_validator: not_found: impossibile trovare un utente locale con quel nome utente @@ -669,6 +702,7 @@ it: developers: Sviluppatori more: Altro… resources: Risorse + trending_now: Di tendenza ora generic: all: Tutto changes_saved_msg: Modifiche effettuate con successo! @@ -989,7 +1023,9 @@ it: disable: Mentre il tuo account è congelato, i tuoi dati dell'account rimangono intatti, ma non potrai eseguire nessuna azione fintanto che non viene sbloccato. silence: Mentre il tuo account è limitato, solo le persone che già ti seguono possono vedere i tuoi toot su questo server, e potresti essere escluso da vari elenchi pubblici. Comunque, altri possono manualmente seguirti. suspend: Il tuo account è stato sospeso, e tutti i tuoi toot ed i tuoi file media caricati sono stati irreversibilmente rimossi da questo server, e dai server dove avevi dei seguaci. + get_in_touch: Puoi rispondere a questa email per entrare in contatto con lo staff di %{instance}. review_server_policies: Rivedi regole del server + statuses: 'Nello specifico, per:' subject: disable: Il tuo account %{acct} è stato congelato none: Avviso per %{acct} diff --git a/config/locales/ja.yml b/config/locales/ja.yml index e34d90c2d..d4c6058bf 100644 --- a/config/locales/ja.yml +++ b/config/locales/ja.yml @@ -43,6 +43,8 @@ ja: what_is_mastodon: Mastodon とは? accounts: choices_html: "%{name} によるおすすめ:" + endorsements_hint: あなたがフォローしている中でおすすめしたい人をここで紹介できます。 + featured_tags_hint: 特定のハッシュタグをここに表示できます。 follow: フォロー followers: other: フォロワー @@ -53,6 +55,7 @@ ja: media: メディア moved_html: "%{name} さんは引っ越しました %{new_profile_link}:" network_hidden: この情報は利用できません + never_active: 活動なし nothing_here: 何もありません! people_followed_by: "%{name} さんがフォロー中のアカウント" people_who_follow: "%{name} さんをフォロー中のアカウント" @@ -182,6 +185,7 @@ ja: username: ユーザー名 warn: 警告 web: Web + whitelisted: ホワイトリストに登録済み action_logs: actions: assigned_to_self_report: "%{name} さんが通報 %{target} を自身の担当に割り当てました" @@ -270,6 +274,7 @@ ja: week_users_new: 今週登録した人数 whitelist_mode: ホワイトリストモード domain_allows: + add_new: ホワイトリストに追加 created_msg: ドメインのホワイトリストへの登録が正常に完了しました destroyed_msg: ドメインがホワイトリストから削除されました undo: ホワイトリストから削除 @@ -413,6 +418,13 @@ ja: custom_css: desc_html: 全ページに適用されるCSSの編集 title: カスタムCSS + domain_blocks: + all: 誰でも許可 + disabled: 誰も許可しない + title: ドメインブロックを表示 + users: ログイン済みローカルユーザーのみ許可 + domain_blocks_rationale: + title: コメントを表示 hero: desc_html: フロントページに表示されます。サイズは600x100px以上推奨です。未設定の場合、標準のサムネイルが使用されます title: ヒーローイメージ @@ -482,6 +494,7 @@ ja: delete: 削除 nsfw_off: 閲覧注意をはずす nsfw_on: 閲覧注意にする + deleted: 削除済み failed_to_execute: 実行に失敗しました media: title: メディア @@ -570,6 +583,7 @@ ja: setup: email_below_hint_html: 下記のメールアドレスが間違っている場合、ここで変更することで新たに確認メールを受信できます。 email_settings_hint_html: 確認用のメールを %{email} に送信しました。メールアドレスが正しくない場合、以下より変更することができます。 + title: セットアップ status: account_status: アカウントの状態 confirming: メールアドレスの確認が完了するのを待っています。 @@ -604,25 +618,36 @@ ja: deletes: bad_password_msg: パスワードが違います confirm_password: 本人確認のため、現在のパスワードを入力してください - description_html: あなたのアカウントに含まれるコンテンツは全て削除され、アカウントは無効化されます。これは恒久的なもので、取り消すことはできません。なりすましを防ぐために、同じユーザー名で再度登録することはできなくなります。 proceed: アカウントを削除する success_msg: アカウントは正常に削除されました - warning_html: 削除が保証されるのはこのサーバー上のコンテンツのみです。他のサーバー等、外部に広く共有されたコンテンツについては痕跡が残ることがあります。また、現在接続できないサーバーや、あなたの更新を受け取らなくなったサーバーに対しては、削除は反映されません。 - warning_title: 共有されたコンテンツについて directories: directory: ディレクトリ - enabled: あなたはディレクトリに掲載されています。 - enabled_but_waiting: あなたはディレクトリへの掲載を選択しましたが、掲載に必要な最小フォロワー数 (%{min_followers} 人) を満たしていません。 explanation: 関心を軸にユーザーを発見しよう explore_mastodon: "%{title}を探索" - how_to_enable: あなたはディレクトリへの掲載を選択していません。下記から選択できます。ハッシュタグカラムに掲載するにはプロフィール文にハッシュタグを使用してください。 - people: - other: "%{count} 人" + domain_blocks: + blocked_domains: ドメインブロックリスト + description: "%{instance} が連合を制限または拒否しているサーバーのリストです。" + domain: ドメイン + media_block: メディアを拒否 + no_domain_blocks: "(ドメインブロックなし)" + severity: 重大性 + severity_legend: + media_block: サーバーから送信されるメディアファイルは取得も保存もされず、またユーザーには表示されません。 + silence: サイレンスされたサーバーのアカウントは検索やフォロー、交流することができますが、トゥートは公開タイムラインに表示されません。またフォローしていないユーザーには通知が届きません。 + suspension: 停止されたサーバーからのコンテンツは保存も表示もされず、また送信もされません。停止されたサーバーからの交流は拒否されます。 + suspension_disclaimer: 停止されたサーバーでもこのサーバーから公開コンテンツを取得することがあります。 + title: 重大性 + show_rationale: コメントを表示 + silence: サイレンス + suspension: 停止 + title: "%{instance} のドメインブロックリスト" domain_validator: invalid_domain: は無効なドメイン名です errors: + '400': 送信されたリクエストは無効であるか、または不正なフォーマットです。 '403': このページを表示する権限がありません。 '404': お探しのページは見つかりませんでした。 + '406': このページは要求された形式では利用できません。 '410': お探しのページはもう存在しません。 '422': content: セキュリティ認証に失敗しました。Cookieをブロックしていませんか? @@ -631,6 +656,7 @@ ja: '500': content: もうしわけありませんが、なにかが間違っています。 title: このページは正しくありません + '503': 一時的なサーバー障害のため利用することができません。 noscript_html: Mastodonのウェブアプリケーションを利用する場合はJavaScriptを有効にしてください。またはあなたのプラットフォーム向けのMastodonネイティブアプリを探すことができます。 existing_username_validator: not_found: そのようなユーザー名はローカルに見つかりませんでした @@ -654,6 +680,7 @@ ja: add_new: 追加 errors: limit: 注目のハッシュタグの上限に達しました + hint_html: "注目のハッシュタグとは?プロフィールページに目立つ形で表示され、そのハッシュタグのついたあなたの公開投稿だけを抽出して閲覧できるようにします。クリエイティブな仕事や長期的なプロジェクトを追うのに優れた機能です。" filters: contexts: home: ホームタイムライン @@ -949,6 +976,8 @@ ja: pinned: 固定されたトゥート reblogged: さんがブースト sensitive_content: 閲覧注意 + tags: + does_not_match_previous_name: 以前の名前と一致しません terms: body_html: |

プライバシーポリシー

@@ -1066,7 +1095,9 @@ ja: disable: アカウントが凍結されている間、データはそのまま残りますが、凍結が解除されるまでは何の操作もできません。 silence: あなたのアカウントは制限されていますが、あなたをフォローしているユーザーのみ、このサーバー上の投稿を見ることができます。そしてあなたは様々な公開リストから除外されるかもしれません。ただし、他のユーザーは手動であなたをフォローすることができます。 suspend: あなたのアカウントは停止されています。あなたの投稿とアップロードされたメディアファイルは、このサーバーとあなたのフォロワーが参加していたサーバーから完全に削除されました。 + get_in_touch: このメールに返信することで %{instance} のスタッフと連絡を取ることができます。 review_server_policies: サーバーのポリシーを確認 + statuses: '特に次のトゥート:' subject: disable: あなたのアカウント %{acct} は凍結されています none: "%{acct} に対する警告" diff --git a/config/locales/ka.yml b/config/locales/ka.yml index ba114e7c0..b9b9b664f 100644 --- a/config/locales/ka.yml +++ b/config/locales/ka.yml @@ -436,14 +436,13 @@ ka: deletes: bad_password_msg: კარგად სცადეთ, ჰაკერებო! არასწორი პაროლი confirm_password: იდენტობის დასამოწმებლად შეიყვანეთ მიმდინარე პაროლი - description_html: ეს სამუდამოდ, დაუბრუნებლად გააუქმებს კონტენტს თქვენი ანგარიშიდან და მოახდენს მის დეაქტივაციას. მომხმარებლის სახელი კი, სამომავლო იმპერსონაციების შესაჩერებლად, გახდება რეზერვირებული. proceed: ანგარიშის გაუქმება success_msg: თქვენი ანგარიში წარმატებით გაუქმდა - warning_html: მოცულობის გაუქმება გარანტირებულია მხოლოდ ამ ინსტანციაზე. კონტენტი რომელიც ფართო მასშტაბით გაზიარდა უფრო დატოვებს კვალს. ოფლაინ სერვერები და სერვერები, რომლებმაც შეწყვიტეს თქვენი განახლებების გამოწერა არ განაახლებენ მონაცემთა ბაზებს. - warning_title: წვდომა გავრცელებულ კონტენტზე errors: + '400': The request you submitted was invalid or malformed. '403': ამ გვერდის ხილვის უფლება არ გაქვთ. '404': გვერდი რომელსაც ეძებთ არ არსებობს. + '406': This page is not available in the requested format. '410': გვერდი რომელსაც ეძებდით აღარ არსებობს. '422': content: უსაფრთხოების ვერიფიკაცია ვერ მოხერხდა. ბლოკავთ ქუქის? @@ -452,6 +451,7 @@ ka: '500': content: ბოდიში, ჩვენ მხარეს რაღაც არია. title: გვერდი არაა სწორი + '503': The page could not be served due to a temporary server failure. noscript_html: მასტოდონ ვებ-აპლიკაციის გამოყენებისთვის, გთხოვთ ჩართოთ ჯავასკრიპტი. სხვა შემთხვევაში, მასტოდონის თქვენი პატფორმისთვის სცადეთ გამოიყენოთ ერთ-ერთი მშობლიური აპლიკაცია. exports: archive_takeout: diff --git a/config/locales/kk.yml b/config/locales/kk.yml index 8ee043930..736816425 100644 --- a/config/locales/kk.yml +++ b/config/locales/kk.yml @@ -512,24 +512,17 @@ kk: deletes: bad_password_msg: Болмады ма, хакер бала? Құпиясөз қате confirm_password: Қазіргі құпиясөзіңізді жазыңыз - description_html: This will permanently, irreversibly remove content from your account аnd deactivate it. Your username will remain reserved to prevent future impersonations. proceed: Аккаунт өшіру success_msg: Аккаунтыңыз сәтті өшірілді - warning_html: Only deletion of content from this particular server is guaranteed. Content that has been widely sharеd is likely to leave traces. Offline servers and servers that have unsubscribed from your updates will not update their databases. - warning_title: Бөлінген мазмұнның қол жетімділігі directories: directory: Профильдер каталогы - enabled: Каталогтағы тізімге ендіңіз. - enabled_but_waiting: Каталогта көрінгіңіз келетінін түсінеміз, бірақ ол үшін кем дегенде (%{min_followers}) оқырманыңыз болуы қажет. explanation: Қолданушыларды қызығушылықтарына қарай реттеу explore_mastodon: "%{title} шарлау" - how_to_enable: Сіз қазіргі уақытта каталогқа қосылмағансыз. Төменде қосылуға болады. Арнайы био мәтініндегі хэштегтерді қолданыңыз! - people: - one: "%{count} адам" - other: "%{count} адам" errors: + '400': The request you submitted was invalid or malformed. '403': Бұны көру үшін сізде рұқсат жоқ. '404': Сіз іздеген бет бұл жерде емес екен. + '406': This page is not available in the requested format. '410': Сіз іздеген бет қазір жоқ екен. '422': content: Қауіпсіздік растауы қате. кукилерді блоктағансыз ба? @@ -538,6 +531,7 @@ kk: '500': content: Кешірерсіз, бірақ қазір бір қате пайда болып тұр. title: Бұл бет дұрыс емес екен + '503': The page could not be served due to a temporary server failure. noscript_html: Mastodon веб қосымшасын қолдану үшін, JavaScript қосыңыз. Болмай жатса, мына қосымшаларды қосып көріңіз, Mastodon қолдану үшін. exports: archive_takeout: diff --git a/config/locales/ko.yml b/config/locales/ko.yml index a2b98ebe2..1c4170d8a 100644 --- a/config/locales/ko.yml +++ b/config/locales/ko.yml @@ -55,6 +55,7 @@ ko: media: 미디어 moved_html: "%{name}은 %{new_profile_link}으로 이동되었습니다:" network_hidden: 이 정보는 사용할 수 없습니다 + never_active: 없음 nothing_here: 아무 것도 없습니다! people_followed_by: "%{name} 님이 팔로우 중인 계정" people_who_follow: "%{name} 님을 팔로우 중인 계정" @@ -495,6 +496,7 @@ ko: delete: 삭제 nsfw_off: NSFW 끄기 nsfw_on: NSFW 켜기 + deleted: 삭제됨 failed_to_execute: 실행을 실패하였습니다 media: title: 미디어 @@ -618,20 +620,12 @@ ko: deletes: bad_password_msg: 비밀번호가 올바르지 않습니다 confirm_password: 본인 확인을 위해 현재 사용 중인 암호를 입력해 주십시오 - description_html: 계정에 업로드된 모든 컨텐츠가 삭제되며, 계정은 비활성화 됩니다. 이것은 영구적으로 이루어지는 것이므로 되돌릴 수 없습니다. 사칭 행위를 방지하기 위해 같은 아이디로 다시 등록하는 것은 불가능합니다. proceed: 계정 삭제 success_msg: 계정이 성공적으로 삭제되었습니다 - warning_html: 삭제가 보장되는 것은 이 서버 상에서의 컨텐츠에 한합니다. 타 서버 등, 외부에 멀리 공유된 컨텐츠는 흔적이 남아 삭제되지 않는 경우도 있습니다. 그리고 현재 접속이 불가능한 서버나, 업데이트를 받지 않게 된 서버에 대해서는 삭제가 반영되지 않을 수도 있습니다. - warning_title: 공유된 컨텐츠에 대해서 directories: directory: 프로필 디렉토리 - enabled: 당신은 디렉터리에 표시 되고 있습니다. - enabled_but_waiting: 디렉터리에 표시 되기 위해서는 수동으로 참여해야 합니다, 하지만 디렉터리에 표시 되기 위한 최소 팔로워(%{min_followers})수에 미치지 못했습니다. explanation: 관심사에 대한 유저들을 발견합니다 explore_mastodon: "%{title} 탐사하기" - how_to_enable: 아직 디렉터리에 참여하지 않았습니다. 아래에서 참여할 수 있습니다. 바이오 텍스트에 해시태그를 사용해 특정 해시태그 디렉터리에 표시 될 수 있습니다! - people: - other: "%{count}명" domain_blocks: blocked_domains: 제한 되거나 차단 된 도메인 목록 description: 이것은 %{instance}가 제한하거나 연합을 거부한 서버들의 목록입니다. @@ -652,8 +646,10 @@ ko: domain_validator: invalid_domain: 올바른 도메인 네임이 아닙니다 errors: + '400': 제출한 요청이 올바르지 않습니다. '403': 이 페이지를 표시할 권한이 없습니다. '404': 당신이 찾으려는 페이지는 존재하지 않습니다. + '406': 이 페이지는 요청한 자료형으로 제공되지 않습니다. '410': 당신이 보려는 페이지는 더이상 여기에 존재하지 않습니다. '422': content: 보안 인증에 실패했습니다. 쿠키를 차단하고 있진 않습니까? @@ -662,6 +658,7 @@ ko: '500': content: 죄송합니다, 뭔가 잘못 되었습니다. title: 이 페이지는 잘못되었습니다 + '503': 이 페이지는 임시적인 서버 문제로 인해 제공 될 수 없습니다. noscript_html: 마스토돈을 사용하기 위해서는 자바스크립트를 켜 주십시오. 아니면 네이티브 앱 중 하나를 사용할 수 있습니다. existing_username_validator: not_found: 해당 유저네임에 대한 로컬 유저를 찾을 수 없습니다 @@ -1100,7 +1097,9 @@ ko: disable: 당신의 계정이 동결 된 동안 당신의 계정은 유지 됩니다. 하지만 잠금이 풀릴 때까지 당신은 아무 것도 할 수 없습니다. silence: 당신의 계정이 제한 된 동안엔 당신의 팔로워 이외엔 툿을 받아 볼 수 없고 공개 리스팅에서 제외 됩니다. 하지만 다른 사람들은 여전히 당신을 팔로우 가능합니다. suspend: 당신의 계정은 정지 되었으며, 모든 툿과 업로드 한 미디어가 서버에서 삭제 되어 되돌릴 수 없습니다. + get_in_touch: 이 메일에 대해 답장해서 %{instance}의 스태프와 연락 할 수 있습니다. review_server_policies: 서버 정책 검토하기 + statuses: '구체적으로:' subject: disable: 당신의 계정 %{acct}가 동결 되었습니다 none: "%{acct}에게의 경고" diff --git a/config/locales/lt.yml b/config/locales/lt.yml index cf1ae2709..a5dd5cbf5 100644 --- a/config/locales/lt.yml +++ b/config/locales/lt.yml @@ -492,21 +492,17 @@ lt: deletes: bad_password_msg: Geras bandymas, programišiau! Neteisingas slaptažodis confirm_password: Kad patvirtintumėte savo tapatybę, įveskite dabartini slaptažodį - description_html: Tai be sugrąžinimo, visam laikui panaikins visa turini iš Jūsų paskyros ir deaktyvuos ją. Jūsų vartotojo vardas paliks rezervuotas, kad išvengtumėme tapatybės pavagimo ateityje. proceed: Ištrinti paskyrą success_msg: Jūsų paskyra sėkmingai ištrinta - warning_html: Tiktai panaikinimas turinio iš šio serverio garantuotas. Turinys, kuris buvo viešai prieinamas ir dalinamas kituose serveriuose paliks pėdsakus. Serveriai, kurie neseka jūsų, kurie nėra tinkle, nepakeis savo duomenų sistemos. - warning_title: Platinamo turinio prieinamumas directories: directory: Profilio direktorija - enabled: Jūs esate rodomas šioje direktorijoje. - enabled_but_waiting: Jūs pasirinkote būti įtrauktas į direktorija, bet jūs neturite minimalaus sekėjų skaičiaus (%{min_followers}), kad būtumėte rodomas. explanation: Raskite vartotojus, remiantis tuo, kuo jie domisi explore_mastodon: Naršyti %{title} - how_to_enable: Jūs nesate prisijungęs prie šios direktorijos. Galite prisijungti žemiau. Naudokite saitažodžius savo biografiniame tekste, kad būtumėte rastas naudojantis specifinius saitažodžius! errors: + '400': The request you submitted was invalid or malformed. '403': Jūs neturie prieigos matyti šiam puslapiui. '404': Puslapis nerastas. + '406': This page is not available in the requested format. '410': Puslapis neegzistuoja. '422': content: Apsaugos patvirtinmas klaidingas. Ar jūs blokuojate sausainius? @@ -515,6 +511,7 @@ lt: '500': content: Atsiprašome, tačiau mūsų pusėje įvyko klaida. title: Netinkamas puslapis + '503': The page could not be served due to a temporary server failure. noscript_html: Kad naudotumėtės Mastodon web aplikacija, prašome įsijungti JavaScript. Alternatyviai, pabandykite viena iš vietinių aplikacijų Mastodon savo platformai. exports: archive_takeout: diff --git a/config/locales/lv.yml b/config/locales/lv.yml index 971450a89..f6625dd41 100644 --- a/config/locales/lv.yml +++ b/config/locales/lv.yml @@ -1,12 +1,15 @@ --- lv: errors: + '400': The request you submitted was invalid or malformed. '403': You don't have permission to view this page. '404': The page you are looking for isn't here. + '406': This page is not available in the requested format. '410': The page you were looking for doesn't exist here anymore. '422': '429': Throttled '500': + '503': The page could not be served due to a temporary server failure. invites: expires_in: '1800': 30 minutes diff --git a/config/locales/ms.yml b/config/locales/ms.yml index 3597ccd15..4573d53dd 100644 --- a/config/locales/ms.yml +++ b/config/locales/ms.yml @@ -297,12 +297,15 @@ ms: create_and_resolve: Selesaikan dengan nota placeholder: Terangkan tindakan apa yang telah diambil, atau sebarang kemas kini lain yang berkaitan... errors: + '400': The request you submitted was invalid or malformed. '403': You don't have permission to view this page. '404': The page you are looking for isn't here. + '406': This page is not available in the requested format. '410': The page you were looking for doesn't exist here anymore. '422': '429': Throttled '500': + '503': The page could not be served due to a temporary server failure. exports: archive_takeout: in_progress: Mengkompil arkib anda... diff --git a/config/locales/nl.yml b/config/locales/nl.yml index 9ef60b701..25e6c6591 100644 --- a/config/locales/nl.yml +++ b/config/locales/nl.yml @@ -183,6 +183,7 @@ nl: username: Gebruikersnaam warn: Waarschuwen web: Webapp + whitelisted: Op de witte lijst action_logs: actions: assigned_to_self_report: "%{name} heeft rapportage %{target} aan zichzelf toegewezen" @@ -243,6 +244,7 @@ nl: updated_msg: Bijwerken van emoji is geslaagd! upload: Uploaden dashboard: + authorized_fetch_mode: Geautoriseerde ophaalmodus backlog: achterstallige taken config: Configuratie feature_deletions: Verwijderen van account @@ -250,10 +252,13 @@ nl: feature_profile_directory: Gebruikersgids feature_registrations: Registraties feature_relay: Federatierelay + feature_spam_check: Anti-spam feature_timeline_preview: Voorvertoning van tijdlijn features: Functies hidden_service: Federatie met verborgen diensten open_reports: onopgeloste rapportages + pending_tags: hashtags die op een beoordeling wachten + pending_users: gebruikers die op een beoordeling wachten recent_users: Recente gebruikers search: In volledige tekst zoeken single_user_mode: Modus voor één gebruiker @@ -265,11 +270,18 @@ nl: week_interactions: interacties deze week week_users_active: actieve gebruikers deze week week_users_new: nieuwe gebruikers deze week + whitelist_mode: Modus voor de witte lijst + domain_allows: + add_new: Domein voor de witte lijst + created_msg: Het domein is succesvol aan de witte lijst toegevoegd + destroyed_msg: Het domein is van de witte lijst verwijderd + undo: Van de witte lijst verwijderen domain_blocks: add_new: Nieuwe domeinblokkade toevoegen created_msg: Domeinblokkade wordt nu verwerkt destroyed_msg: Domeinblokkade is ongedaan gemaakt domain: Domein + edit: Domeinblokkade bewerken existing_domain_block_html: Jij hebt al strengere beperkingen opgelegd aan %{name}, je moet het domein eerst deblokkeren. new: create: Blokkade aanmaken @@ -280,6 +292,10 @@ nl: silence: Negeren suspend: Opschorten title: Nieuwe domeinblokkade + private_comment: Privé-opmerking + private_comment_hint: Opmerking over deze domeinbeperking voor intern gebruik door de moderatoren. + public_comment: Openbare opmerking + public_comment_hint: Opmerking over deze domeinbeperking voor het grote publiek, voor wanneer de openbare lijst met domeinbeperkingen is ingeschakeld. reject_media: Mediabestanden weigeren reject_media_hint: Verwijderd lokaal opgeslagen mediabestanden en weigert deze in de toekomst te downloaden. Irrelevant voor opgeschorte domeinen reject_reports: Rapportages weigeren @@ -299,6 +315,7 @@ nl: title: Domeinblokkade voor %{domain} ongedaan maken undo: Ongedaan maken undo: domeinblokkade ongedaan maken + view: Domeinblokkade bekijken email_domain_blocks: add_new: Nieuwe toevoegen created_msg: Blokkeren e-maildomein geslaagd @@ -322,6 +339,8 @@ nl: all: Alles limited: Beperkt title: Moderatie + private_comment: Privé-opmerking + public_comment: Openbare opmerking title: Andere domeinen total_blocked_by_us: Door ons geblokkeerd total_followed_by_them: Door hun gevolgd @@ -399,6 +418,13 @@ nl: custom_css: desc_html: Het uiterlijk van deze server met CSS aanpassen title: Aangepaste CSS + domain_blocks: + all: Naar iedereen + disabled: Naar niemand + title: Domeinblokkades tonen + users: Naar ingelogde lokale gebruikers + domain_blocks_rationale: + title: Motivering tonen hero: desc_html: Wordt op de voorpagina getoond. Tenminste 600x100px aanbevolen. Wanneer dit niet is ingesteld wordt de thumbnail van de Mastodonserver getoond title: Hero-afbeelding @@ -456,12 +482,15 @@ nl: desc_html: Toon een openbare tijdlijn op de voorpagina title: Tijdlijn op de voorpagina tonen title: Server-instellingen + trends: + title: Trending hashtags statuses: back_to_account: Terug naar accountpagina batch: delete: Verwijderen nsfw_off: Als niet gevoelig markeren nsfw_on: Als gevoelig markeren + deleted: Verwijderd failed_to_execute: Uitvoeren mislukt media: title: Media @@ -470,7 +499,16 @@ nl: title: Toots van account with_media: Met media tags: + accounts_today: Aantal unieke keren vandaag gebruikt + accounts_week: Aantal unieke keren deze week gebruikt + context: Context + directory: In de gebruikersgids + in_directory: "%{count} keer in de gebruikersgids" + review: Status beoordelen + reviewed: Beoordeeld title: Hashtags + trending_right_now: Op dit moment trending + unreviewed: Niet beoordeeld title: Beheer warning_presets: add_new: Nieuwe toevoegen @@ -491,6 +529,7 @@ nl: advanced_web_interface_hint: 'Wanneer je van de hele schermbreedte gebruik wilt maken, stelt de geavanceerde webomgeving je in staat om meerdere verschillende kolommen te configureren. Hiermee kun je zoveel mogelijk informatie op hetzelfde moment bekijken, zoals: Start, meldingen, de globale tijdlijn, meerdere lijsten en hashtags.' animations_and_accessibility: Animaties en toegankelijkheid confirmation_dialogs: Bevestigingen + discovery: Ontdekken sensitive_content: Gevoelige inhoud application_mailer: notification_preferences: E-mailvoorkeuren wijzigen @@ -530,6 +569,10 @@ nl: reset_password: Wachtwoord opnieuw instellen security: Beveiliging set_new_password: Nieuw wachtwoord instellen + setup: + title: Instellen + status: + account_status: Accountstatus trouble_logging_in: Problemen met inloggen? authorize_follow: already_following: Je volgt dit account al @@ -559,24 +602,27 @@ nl: deletes: bad_password_msg: Goed geprobeerd hackers! Ongeldig wachtwoord confirm_password: Voer jouw huidige wachtwoord in om jouw identiteit te bevestigen - description_html: Hierdoor worden alle gegevens van jouw account permanent, onomkeerbaar verwijderd en wordt deze gedeactiveerd. Om toekomstige identiteitsdiefstal te voorkomen, kan op deze server jouw gebruikersnaam niet meer gebruikt worden. proceed: Account verwijderen success_msg: Jouw account is succesvol verwijderd - warning_html: We kunnen alleen garanderen dat jouw gegevens op deze server worden verwijderd. Berichten (toots), incl. media, die veel zijn gedeeld laten mogelijk sporen achter. Offline servers en servers die niet meer op jouw updates zijn geabonneerd zullen niet hun databases updaten. - warning_title: Verwijdering gegevens op andere servers directories: directory: Gebruikersgids - enabled: Je staat momenteel in de gebruikersgids vermeldt. - enabled_but_waiting: Je hebt er voor gekozen om in de gebruikersgids te worden vermeldt, maar je hebt daarvoor nog niet het minimaal aantal volgers (%{min_followers}). explanation: Ontdek gebruikers aan de hand van hun interesses explore_mastodon: "%{title} verkennen" - how_to_enable: Je geeft momenteel geen toestemming om in de gebruikersgids te worden vermeldt. Je kunt hieronder toestemming geven. Gebruik hashtags in de tekst van jouw bio, om onder bepaalde hashtags te worden vermeldt! - people: - one: "%{count} gebruikers" - other: "%{count} gebruikers" + domain_blocks: + domain: Domein + media_block: Mediabestanden weigeren + no_domain_blocks: "(geen domeinblokkades)" + severity: Zwaarte + severity_legend: + media_block: Mediabestanden die van deze server komen worden niet opgehaald, opgeslagen en aan de gebruiker getoond. + title: Zwaartes + show_rationale: Motivering tonen + silence: Negeren errors: + '400': The request you submitted was invalid or malformed. '403': Jij hebt geen toestemming om deze pagina te bekijken. '404': De pagina waarnaar jij op zoek bent bestaat niet. + '406': This page is not available in the requested format. '410': De pagina waarnaar jij op zoek bent bestaat niet meer. '422': content: Veiligheidsverificatie mislukt. Blokkeer je toevallig cookies? @@ -585,6 +631,7 @@ nl: '500': content: Het spijt ons, er is aan onze kant iets fout gegaan. title: Er is iets mis + '503': The page could not be served due to a temporary server failure. noscript_html: Schakel JavaScript in om de webapp van Mastodon te kunnen gebruiken. Als alternatief kan je een Mastodon-app zoeken voor jouw platform. existing_username_validator: not_found: Kon geen lokale gebruiker met die gebruikersnaam vinden @@ -628,6 +675,7 @@ nl: developers: Ontwikkelaars more: Meer… resources: Hulpmiddelen + trending_now: Trends generic: all: Alles changes_saved_msg: Wijzigingen succesvol opgeslagen! diff --git a/config/locales/no.yml b/config/locales/no.yml index fbf138393..4cf080be9 100644 --- a/config/locales/no.yml +++ b/config/locales/no.yml @@ -328,14 +328,13 @@ deletes: bad_password_msg: Godt forsøk, hacker! Feil passord confirm_password: Skriv inn ditt passord for å verifisere din identitet - description_html: Dette vil permanent, irreversibelt fjerne innhold fra din konto og deaktivere den. Ditt brukernavn vil forbli reservert for å forhindre fremtidige etterligninger. proceed: Slett konto success_msg: Din konto ble slettet - warning_html: Kun sletting av innhold fra denne instansen er garantert. Innhold som har blitt delt i stor utstrekning vil sannsynligvis legge igjen spor. Tjenere som er frakoblet og tjenere som ikke abbonerer på dine oppdatereringer vil ikke oppdatere sine databaser. - warning_title: Tilgjengelighet av spredt innhold errors: + '400': The request you submitted was invalid or malformed. '403': Du har ikke tillatelse til å vise denne siden. '404': Siden du leter etter finnes ikke. + '406': This page is not available in the requested format. '410': Siden du leter etter finnes ikke lenger. '422': content: Sikkerhetsverifisering feilet. Blokkerer du informasjonskapsler? @@ -344,6 +343,7 @@ '500': content: Beklager men noe gikk galt ved vår ende. title: Denne siden er ikke korrekt + '503': The page could not be served due to a temporary server failure. noscript_html: For å bruke Mastodon webapplikasjon må du aktivere JavaScript. Alternativt kan du forsøke en av de mange integrerte appene for Mastodon til din plattform. exports: blocks: Du blokkerer diff --git a/config/locales/oc.yml b/config/locales/oc.yml index aac54639c..65e381b3a 100644 --- a/config/locales/oc.yml +++ b/config/locales/oc.yml @@ -582,24 +582,17 @@ oc: deletes: bad_password_msg: Ben ensajat pirata ! Senhal incorrècte confirm_password: Picatz vòstre senhal actual per verificar vòstra identitat - description_html: Aquò suprimirà definitivament e sens possibilitat de retorn lo contengut de vòstre compte e lo desactivarà. Lo nom d’utilizaire serà gardat per evitar una futura impostura. proceed: Suprimir lo compte success_msg: Compte ben suprimit - warning_html: La supression del contengut d’aqueste servidor es sola assegurada. Lo contengut fòrça partejat daissarà probablament de traças. Los servidors fòra-linha e los que vos sègon pas mai auràn pas la mesa a jorn de lor basa de donada. - warning_title: Disponibilitat del contengut difusat directories: directory: Annuari de perfils - enabled: Sètz actualament listat dins l'annuari. - enabled_but_waiting: Avètz causit d'èsser listat dins l'annuari mas avètz pas encara lo nombre minimum de seguidors (%{min_followers}) per i èsser listat. explanation: Trobar d’utilizaires segon lor interèsses explore_mastodon: Explorar %{title} - how_to_enable: Sètz pas actualament listat dins l’annuari. Podètz cambiar aquò çai-jos. Utilizatz d'etiquetas dins vòstre tèxt de bio per èsser listat amb d’etiquetas especificas ! - people: - one: "%{count} persona" - other: "%{count} personas" errors: + '400': The request you submitted was invalid or malformed. '403': Avètz pas l’autorizacion de veire aquesta pagina. '404': La pagina que cercatz existís pas aquí. + '406': This page is not available in the requested format. '410': La pagina que cercatz existís pas mai aquí. '422': content: Verificacion de seguretat fracassada. Blocatz los cookies ? @@ -608,6 +601,7 @@ oc: '500': content: Un quicomet a pas foncionat coma caliá. title: Aquesta pagina es pas corrècta + '503': The page could not be served due to a temporary server failure. noscript_html: Per utilizar l’aplicacion web de Mastodon, mercés d’activar JavaScript. O podètz utilizar una aplicacion per vòstra plataforma coma alernativa. existing_username_validator: not_found: impossible de trobar un utilizaire local amb aqueste nom d’utilizaire diff --git a/config/locales/pl.yml b/config/locales/pl.yml index 6d6f407b3..0671979fe 100644 --- a/config/locales/pl.yml +++ b/config/locales/pl.yml @@ -571,26 +571,17 @@ pl: deletes: bad_password_msg: Niezła próba, hakerze! Wprowadzono nieprawidłowe hasło confirm_password: Wprowadź aktualne hasło, aby potwierdzić tożsamość - description_html: Ta opcja usunie bezpowrotnie i nieodwracalnie całą zawartość konta i zdezaktywuje je. Twoja nazwa użytkownika pozostanie zarezerwowana, aby zapobiec nadużyciom. proceed: Usuń konto success_msg: Twoje konto zostało pomyślnie usunięte - warning_html: Możemy usunąć zawartość jedynie w obrębie tego serwera. Zawartość udostępniona publicznie pozostawia trwałe ślady. Serwery niepodłączone do sieci bądź nieśledzące Twoich aktualizacji mogą zachować Twoje dane. - warning_title: Dostępność usuniętej zawartości directories: directory: Katalog profilów - enabled: Jesteś obecnie zapisany(-a) do katalogu - enabled_but_waiting: Jesteś zapisany(-a) do katalogu, ale jeszcze nie śledzi Cię wystarczająca liczba osób (%{min_followers}), aby się tam pojawić. explanation: Poznaj profile na podstawie zainteresowań explore_mastodon: Odkrywaj %{title} - how_to_enable: Nie jesteś obecnie zapisany(-a) do katalogu. Poniżej możesz zapisać się. Użyj hashtagów w swoim opisie, aby zostać wyświetlonym pod określonymi hashtagami! - people: - few: "%{count} osoby" - many: "%{count} osób" - one: "%{count} osoba" - other: "%{count} osób" errors: + '400': The request you submitted was invalid or malformed. '403': Nie masz uprawnień, aby wyświetlić tę stronę. '404': Strona, którą próbujesz odwiedzić, nie istnieje. + '406': This page is not available in the requested format. '410': Strona, którą próbujesz odwiedzić, przestała istnieć. '422': content: Sprawdzanie bezpieczeństwa nie powiodło się. Czy blokujesz pliki cookie? @@ -599,6 +590,7 @@ pl: '500': content: Przepraszamy, coś poszło nie tak, po naszej stronie. title: Ta strona jest nieprawidłowa + '503': The page could not be served due to a temporary server failure. noscript_html: Aby korzystać z aplikacji Mastodon, włącz JavaScript. Możesz też skorzystać z jednej z natywnych aplikacji obsługującej Twoje urządzenie. existing_username_validator: not_found: nie znaleziono lokalnego użytkownika o tej nazwie @@ -1005,9 +997,9 @@ pl:

Korzystanie ze strony przez dzieci

-

Jeżeli serwer znajduje się w UE lub w EOG: Ta strona, produkty i usługi są przeznaczone dla osób, które ukończyły 16 lat. Jeżeli nie ukończyłeś(-aś) 16 roku życia, zgodnie z wymogami COPPA (Prawo o Ochronie Prywatności Dzieci w Internecie), nie używaj tej strony.

+

Jeżeli serwer znajduje się w UE lub w EOG: Ta strona, produkty i usługi są przeznaczone dla osób, które ukończyły 16 lat. Jeżeli nie ukończyłeś(-aś) 16 roku życia, zgodnie z wymogami RODO (Ogólne rozporządzenie o ochronie danych), nie używaj tej strony.

-

Jeżeli serwer znajduje się w USA: Ta strona, produkty i usługi są przeznaczone dla osób, które ukończyły 13 lat. Jeżeli nie ukończyłeś(-aś) 13 roku życia, zgodnie z wymogami RODO (Ogólne rozporządzenie o ochronie danych), nie używaj tej strony.

+

Jeżeli serwer znajduje się w USA: Ta strona, produkty i usługi są przeznaczone dla osób, które ukończyły 13 lat. Jeżeli nie ukończyłeś(-aś) 13 roku życia, zgodnie z wymogami COPPA (Prawo o Ochronie Prywatności Dzieci w Internecie), nie używaj tej strony.

Wymogi mogą być inne, jeżeli serwer znajduje się w innym kraju.

diff --git a/config/locales/pt-BR.yml b/config/locales/pt-BR.yml index d65367183..af4d117e0 100644 --- a/config/locales/pt-BR.yml +++ b/config/locales/pt-BR.yml @@ -528,24 +528,17 @@ pt-BR: deletes: bad_password_msg: Boa tentativa, hackers! Senha incorreta confirm_password: Insira a sua senha atual para verificar a sua identidade - description_html: Isto vai permanente e irreversivelmente remover conteúdo de sua conta e desativá-la. O seu nome de usuário permanecerá reservado para previnir futuros roubos de identidade. proceed: Excluir conta success_msg: A sua conta foi excluída com sucesso - warning_html: Apenas a exclusão de conteúdo desta instância em particular é garantida. Conteúdo que tenha sido largamente compartilhado muito provavelmente deixará traços. Servidores offline e servidores que se desinscreveram de suas atualizações não irão atualizar as suas bases de dados. - warning_title: Disponibilidade de conteúdo disseminado directories: directory: Diretório de perfis - enabled: Você está na lista do diretório. - enabled_but_waiting: Você escolheu ser listado no diretório, mas você ainda não tem o mínimo de seguidores (%{min_followers}) para ser listado. explanation: Descobrir usuários baseado em seus interesses explore_mastodon: Explorar %{title} - how_to_enable: Você não se inscreveu no diretório. Você pode se inscrever abaixo. Use hashtags no texto da sua bio para ser listado em hashtags específicas! - people: - one: "%{count} pessoa" - other: "%{count} pessoas" errors: + '400': The request you submitted was invalid or malformed. '403': Você não tem permissão para ver esta página. '404': A página pela qual você está procurando não existe. + '406': This page is not available in the requested format. '410': A página pela qual você está procurando não existe mais. '422': content: A verificação de segurança falhou. Você desativou o uso de cookies? @@ -554,6 +547,7 @@ pt-BR: '500': content: Desculpe, algo deu errado. title: Esta página não está certa + '503': The page could not be served due to a temporary server failure. noscript_html: Para usar o aplicativo web do Mastodon, por favor ative o JavaScript. Ou, se quiser, experimente um dos apps nativos para o Mastodon em sua plataforma. existing_username_validator: not_found: não foi possível encontrar um usuário local com esse nome de usuário diff --git a/config/locales/pt.yml b/config/locales/pt.yml index 4f0441991..eeb158f6c 100644 --- a/config/locales/pt.yml +++ b/config/locales/pt.yml @@ -501,26 +501,17 @@ pt: deletes: bad_password_msg: Boa tentativa, hackers! Palavra-passe incorreta confirm_password: Introduz a palavra-passe atual para verificar a tua identidade - description_html: Isto vai permanente e irreversivelmente remover conteúdo da tua conta e desativá-la. O teu nome de utilizador permanecerá reservado para prevenir futuros roubos de identidade. proceed: Eliminar conta success_msg: A tua conta foi eliminada com sucesso - warning_html: |- - Apenas a eliminação de conteúdo desta instância é garantido. - Conteúdo que tenha sido partilhado com outras instâncias muito provavelmente deixará pegadas. Servidores offline e servidores que se desinscreveram das tuas atualizações não atualizarão as suas bases de dados. - warning_title: Disponibilidade de conteúdo disseminado directories: directory: Dirétorio de perfil - enabled: Neste momento tu estás listado no dirétorio. - enabled_but_waiting: Tu escolheste ser listado no diretório, mas ainda não tens o número mínimo de seguidores (%{min_followers}) para integrares esta lista. explanation: Descobre utilizadores com base nos seus interesses explore_mastodon: Explorar %{title} - how_to_enable: Tu ainda não integras este directório. Podes fazer isso abaixo. Usa hashtags na tua biografia para seres listado em hashtags específicas! - people: - one: "%{count} pessoa" - other: "%{count} pessoas" errors: + '400': The request you submitted was invalid or malformed. '403': Não tens a permissão necessária para ver esta página. '404': A página que estás a procurar não existe. + '406': This page is not available in the requested format. '410': A página que estás a procurar não existe mais. '422': content: "A verificação de segurança falhou. \nDesativaste o uso de cookies?" @@ -529,6 +520,7 @@ pt: '500': content: Desculpe, mas algo correu mal. title: Esta página não está correta + '503': The page could not be served due to a temporary server failure. noscript_html: Para usar o aplicativo web do Mastodon, por favor ativa o JavaScript. Alternativamente, experimenta um dos apps nativos para o Mastodon na sua plataforma. exports: archive_takeout: diff --git a/config/locales/ro.yml b/config/locales/ro.yml index 0f0d6b892..d04d0015f 100644 --- a/config/locales/ro.yml +++ b/config/locales/ro.yml @@ -45,20 +45,16 @@ ro: deletes: bad_password_msg: Bună încercare, hackere! Parolă incorectă confirm_password: Introdu parola curentă pentru a-ți verifica identitatea - description_html: Această acțiune este permanentă și ireversibilă, elimină conținutul și dezactivează contul tău. Acest username va rămâne permanent rezervat pentru a evita furtul de identitate. proceed: Șterge contul success_msg: Contul tău a fost șterg. Nu mai poate fi recuperat :D - warning_html: Doar ștergerea conținutului de pe acest server este garantată. Conținutul tău care a fost redistribuit în alte instațe e posibil să lase urme. Serverele deconecate sau care nu mai sunt abonate la actualizările contului tău nu își vor mai actualiza baza de date. directories: explanation: Descoperă oameni și companii în funcție de interesele lor explore_mastodon: Explorează %{title} - people: - few: "%{count} persoană" - one: "%{count} persoană" - other: "%{count} oameni" errors: + '400': The request you submitted was invalid or malformed. '403': Nu ai permisiunea să vizitezi această pagină. '404': Pagina pe care o cauți nu există. + '406': This page is not available in the requested format. '410': Pagina pe care o cauți nu mai există. '422': content: Verificarea securității a eșuat. Ai blocat cookiurile? @@ -67,6 +63,7 @@ ro: '500': content: Ne pare rău, dar ceva a funcționat greșit. Încercați din nou!? title: Această pagină nu este corectă + '503': The page could not be served due to a temporary server failure. noscript_html: Pentru a utiliza o aplicație web Mastodon, te rog activează JavaScript. Alternativ, încearcă una din aplicațiile native Mastodon pentru platforma ta. exports: archive_takeout: diff --git a/config/locales/ru.yml b/config/locales/ru.yml index ec639c7a9..d1ed8d1de 100644 --- a/config/locales/ru.yml +++ b/config/locales/ru.yml @@ -279,6 +279,7 @@ ru: week_users_new: пользователей на этой неделе whitelist_mode: Белый список domain_allows: + add_new: Внести в белый список created_msg: Домен добавлен в белый список destroyed_msg: Домен убран из белого списка undo: Убрать из белого списка @@ -345,9 +346,11 @@ ru: all: Все limited: Ограниченные title: Модерация + private_comment: Приватный комментарий + public_comment: Публичный комментарий title: Известные узлы total_blocked_by_us: Заблокировано нами - total_followed_by_them: Заблокировано ими + total_followed_by_them: Их подписчиков total_followed_by_us: Наших подписчиков total_reported: Жалобы на них total_storage: Медиафайлы @@ -495,6 +498,7 @@ ru: title: Статусы аккаунта with_media: С медиаконтентом tags: + context: Контекст title: Хэштеги title: Администрирование warning_presets: @@ -581,26 +585,19 @@ ru: deletes: bad_password_msg: Не вышло, хакеры! Неверный пароль confirm_password: Введите текущий пароль для подтверждения Вашей личности - description_html: Это действие перманентно и необратимо удалит контент Вашего аккаунта и деактивирует его. Ваше имя пользователя будет зарезервировано для предотвращения имперсонации в будущем. proceed: Удалить аккаунт success_msg: Ваш аккаунт был успешно удален - warning_html: Гарантируется удаление контента только на этом узле. Широко распространившийся контент, скорее всего, оставит следы. Сервера, отключенные от сети или отписавшиеся от Ваших обновлений, не обновят свои базы данных. - warning_title: О доступности распространившегося контента directories: directory: Каталог профилей - enabled: В настоящий момент вы указаны в каталоге. - enabled_but_waiting: Вы согласились находиться в каталоге, но у вас ещё нет необходимого количества подписчиков (%{min_followers}), чтобы оказаться в каталоге. explanation: Находите пользователей по интересам explore_mastodon: Изучайте %{title} - how_to_enable: Вы ещё не находитесь в каталоге. Можете добавиться ниже. Используйте хэштеги в разделе "о себе", чтобы вас находили по этим хэштегам! - people: - few: "%{count} человека" - many: "%{count} человек" - one: "%{count} человек" - other: "%{count} человек" + domain_blocks: + domain: Домен errors: + '400': The request you submitted was invalid or malformed. '403': У Вас нет доступа к просмотру этой страницы. '404': Страница, которую Вы искали, не существует. + '406': This page is not available in the requested format. '410': Страница, которую Вы искали, больше не существует. '422': content: Проверка безопасности не удалась. Возможно, Вы блокируете cookies? @@ -609,6 +606,7 @@ ru: '500': content: Приносим извинения, но на нашей стороне что-то пошло не так. title: Страница неверна + '503': The page could not be served due to a temporary server failure. noscript_html: Для работы с Mastodon, пожалуйста, включите JavaScript. Кроме того, вы можете использовать одно из приложений Mastodon для Вашей платформы. existing_username_validator: not_found: не удалось найти локального пользователя с таким именем @@ -1073,7 +1071,7 @@ ru: suspend: Аккаунт заблокирован welcome: edit_profile_action: Настроить профиль - edit_profile_step: Вы можете настроить свой профиль, загрузив аватар, обложку, сменив имя и много чего ещё. Если вы хотите фильтровать подписчиков до того, как они смогут на вас подписаться, вы можете закрыть свой аккаунт. + edit_profile_step: Настройте свой профиль, загрузив аватарку, шапку, изменив отображаемое имя и ещё много чего. Если вы хотите вручную рассматривать и подтверждать подписчиков, можно закрыть свой аккаунт. explanation: Несколько советов для новичков final_action: Начать постить final_step: 'Начните постить! Ваши публичные посты могут видеть другие, например, в локальной ленте или по хэштегам, даже если у вас нет подписчиков. Вы также можете поздороваться с остальными и представиться, используя хэштег #приветствие.' diff --git a/config/locales/simple_form.ar.yml b/config/locales/simple_form.ar.yml index 963693d02..e09f92205 100644 --- a/config/locales/simple_form.ar.yml +++ b/config/locales/simple_form.ar.yml @@ -103,6 +103,7 @@ ar: setting_show_application: اكشف اسم التطبيقات المستخدمة لنشر التبويقات setting_system_font_ui: استخدم الخطوط الافتراضية للنظام setting_theme: سمة الموقع + setting_trends: اعرض ما يُتداوَل اليوم setting_unfollow_modal: إظهار مربع حوار للتأكيد قبل إلغاء متابعة أي حساب setting_use_pending_items: الوضع البطيء severity: القوّة @@ -126,6 +127,9 @@ ar: mention: ابعث بريداً إلكترونيًا عندما يُشير إليك أو يذكُرك أحدهم reblog: ابعث بريداً إلكترونيًا عندما يقوم أحدهم بترقية منشورك report: إرسال رسالة إلكترونية عند تلقّي إبلاغ جديد + tag: + name: الوسم + usable: اسمح للتبويقات باستخدام هذا الوسم 'no': لا recommended: موصى بها required: diff --git a/config/locales/simple_form.ca.yml b/config/locales/simple_form.ca.yml index 33d5a8493..6a13e81e3 100644 --- a/config/locales/simple_form.ca.yml +++ b/config/locales/simple_form.ca.yml @@ -15,7 +15,6 @@ ca: bot: Aquest compte realitza principalment accions automatitzades i pot no estar controlat per cap persona context: Un o diversos contextos on s'ha d'aplicar el filtre digest: Només s'envia després d'un llarg període d'inactivitat amb un resum de les mencions que has rebut en la teva absència - discoverable_html: El directori permet trobar usuaris en funció dels interessos i activitat. Requereix almenys %{min_followers} seguidors email: Se t'enviarà un correu electrònic de confirmació fields: Pots tenir fins a 4 elements que es mostren com a taula al teu perfil header: PNG, GIF o JPG. Màxim %{size}. S'escalarà a %{dimensions}px @@ -38,6 +37,8 @@ ca: setting_use_pending_items: Amaga les actualitzacions de la línia de temps després d'un clic en comptes de desplaçar-se automàticament username: El teu nom d'usuari serà únic a %{domain} whole_word: Quan la paraula clau o la frase sigui només alfanumèrica, s'aplicarà si coincideix amb la paraula sencera + domain_allow: + domain: Aquest domini podrà obtenir dades d’aquest servidor i les dades entrants d’aquests seran processades i emmagatzemades featured_tag: name: 'És possible que vulguis utilitzar un d''aquests:' imports: @@ -46,6 +47,8 @@ ca: text: Això ens ajudarà a revisar la teva petició sessions: otp: 'Introdueix el codi de dos factors generat per el teu telèfon o utilitza un dels teus codis de recuperació:' + tag: + name: Només pots canviar la caixa de les lletres, per exemple, per fer-la més llegible user: chosen_languages: Quan estigui marcat, només es mostraran els toots de les llengües seleccionades en les línies de temps públiques labels: @@ -110,6 +113,7 @@ ca: setting_show_application: Desvela l'aplicació utilitzada per enviar toots setting_system_font_ui: Utilitza el tipus de lletra predeterminat del sistema setting_theme: Tema del lloc + setting_trends: Mostra les tendències d'avui setting_unfollow_modal: Mostra el diàleg de confirmació abans de deixar de seguir a algú setting_use_blurhash: Mostra degradats de colors per als Mèdia amagats setting_use_pending_items: Mode lent @@ -135,6 +139,11 @@ ca: pending_account: Envia un correu electrònic quan es necessiti revisar un compte nou reblog: Envia un correu electrònic si algú comparteix el teu estat report: Envia un correu electrònic quan s'enviï un nou informe + trending_tag: Envia un correu quan una etiqueta sense revisar està en tendència + tag: + listable: Permet que aquesta etiqueta aparegui en les cerques i en el directori de perfils + trendable: Permet que aquesta etiqueta aparegui en les tendències + usable: Permet als tuts emprar aquesta etiqueta 'no': 'No' recommended: Recomanat required: diff --git a/config/locales/simple_form.co.yml b/config/locales/simple_form.co.yml index 636d5f7aa..eeb5a913a 100644 --- a/config/locales/simple_form.co.yml +++ b/config/locales/simple_form.co.yml @@ -5,6 +5,7 @@ co: account_warning_preset: text: Pudete utilizà a sintassa di i statuti, per esempiu l'URL, hashtag, minzione admin_account_action: + include_statuses: L'utilizatore viderà i statuti rispunsevuli di l'azzione o l'avertimentu di muderazione send_email_notification: L'utilizatore hà da riceve una spiegazione di cio chì hè accadutu à u so contu text_html: In uzzione. Pudete utilizà a sintassa di i statuti. Pudete ancu aghjustà preselezzione d'avertimentu per piglià tempu type_html: Sceglie chì fà cù %{acct} @@ -15,7 +16,7 @@ co: bot: Stu contu hè autumatizatu è ùn hè forse micca survegliatu context: Cuntestu·i induve u filtru deve esse applicatu digest: Solu mandatu dopu à una longa perioda d’inattività, è solu s’elli ci sò novi missaghji diretti - discoverable_html: L'annuariu permette à a ghjente di truvà conti à partesi d'interessi è d'attività. Ci vole à avè almenu %{min_followers} abbunati + discoverable: L'annuariu di i prufili hè un'altra manera per u vostru contu di tuccà un'audienza più larga email: Avete da riceve un'e-mail di cunfirmazione fields: Pudete avè fin’à 4 elementi mustrati cum’un tavulone nant’à u vostru prufile header: Furmatu PNG, GIF o JPG. %{size} o menu. Sarà ridottu à %{dimensions}px @@ -60,6 +61,7 @@ co: account_warning_preset: text: Testu preselezziunatu admin_account_action: + include_statuses: Inchjude i statuti palisati indè l'e-mail send_email_notification: Nutificà l'utilizatore cù un'e-mail text: Avertimentu persunalizatu type: Azzione @@ -143,6 +145,7 @@ co: trending_tag: Mandà un'e-mail quandu un hashtag micca verificatu hè in e tendenze tag: listable: Auturizà stu hashtag à esse vistu nant'à l'annuariu di i prufili + name: Hashtag trendable: Auturizà stu hashtag à esse vistu in e tendenze usable: Auturizà i statuti à utilizà stu hashtag 'no': Nò diff --git a/config/locales/simple_form.cs.yml b/config/locales/simple_form.cs.yml index beabcd087..b6b61747f 100644 --- a/config/locales/simple_form.cs.yml +++ b/config/locales/simple_form.cs.yml @@ -5,6 +5,7 @@ cs: account_warning_preset: text: Můžete používat syntaxi tootů, jako například URL, hashtagy a zmínky admin_account_action: + include_statuses: Uživatel uvidí, které tooty způsobily moderátorskou akci nebo varování send_email_notification: Uživatel obdrží vysvětlení toho, co se stalo s jeho účtem text_html: Volitelné. Můžete používat syntaxi tootů. Pro ušetření času si můžete přidat předlohy pro varování type_html: Vyberte, co chcete udělat s účtem %{acct} @@ -15,7 +16,7 @@ cs: bot: Tento účet provádí hlavně automatizované akce a nemusí být spravován context: Jeden či více kontextů, ve kterých má být filtr uplatněn digest: Odesíláno pouze po dlouhé době nečinnosti a pouze, pokud jste při své nepřítomnosti obdržel/a osobní zprávy - discoverable_html: Adresář dovoluje lidem najít účty podle zájmů a aktivity. Vyžaduje alespoň %{min_followers} sledujících + discoverable: Adresář profilů je další způsob, díky kterému se může váš účet dostat k širšímu publiku email: Bude vám poslán potvrzovací e-mail fields: Na profilu můžete mít až 4 položky zobrazené jako tabulka header: PNG, GIF či JPG. Maximálně %{size}. Bude zmenšen na %{dimensions} px @@ -38,6 +39,8 @@ cs: setting_use_pending_items: Skrýt aktualizace časový osy a načíst je kliknutím namísto automatického rolování proudu username: Vaše uživatelské jméno bude na %{domain} unikátní whole_word: Je-li klíčové slovo či fráze pouze alfanumerická, bude aplikována pouze, pokud se shoduje s celým slovem + domain_allow: + domain: Tato doména bude moci stahovat data z tohoto serveru a příchozí data z ní budou zpracována a uložena featured_tag: name: 'Nejspíš budete chtít použít jeden z těchto:' imports: @@ -46,6 +49,8 @@ cs: text: To nám pomůže posoudit váš požadavek sessions: otp: 'Napište dvoufázový kód vygenerovaný vaší mobilní aplikací, nebo použijte jeden z vašich záložních kódů:' + tag: + name: Můžete měnit pouze velikost písmen, například kvůli lepší čitelnosti user: chosen_languages: Je-li tohle zaškrtnuto, budou ve veřejných časových osách zobrazeny pouze tooty ve zvolených jazycích labels: @@ -56,6 +61,7 @@ cs: account_warning_preset: text: Text předlohy admin_account_action: + include_statuses: Zahrnout v e-mailu nahlášené tooty send_email_notification: Informovat uživatele e-mailem text: Vlastní varování type: Akce @@ -110,6 +116,7 @@ cs: setting_show_application: Zobrazit aplikaci používanou k psaní tootů setting_system_font_ui: Použít výchozí písmo systému setting_theme: Motiv stránky + setting_trends: Zobrazit dnešní trendy setting_unfollow_modal: Zobrazovat před zrušením sledování potvrzovací okno setting_use_blurhash: Zobrazit pro skrytá média barevné gradienty setting_use_pending_items: Pomalý režim @@ -135,6 +142,12 @@ cs: pending_account: Posílat e-maily, když je třeba posoudit nový účet reblog: Posílat e-maily, když někdo boostne váš toot report: Posílat e-maily, je-li odesláno nové nahlášení + trending_tag: Posílat e-maily, když se neschválený hashtag stane populárním + tag: + listable: Dovolit tomuto hashtagu objevovat se v hledáních a v adresáři profilů + name: Hashtag + trendable: Dovolit tomuto hashtagu objevovat se v trendech + usable: Dovolit tootům používat tento hashtag 'no': Ne recommended: Doporučeno required: diff --git a/config/locales/simple_form.cy.yml b/config/locales/simple_form.cy.yml index 9f4ef0708..1d5ecae95 100644 --- a/config/locales/simple_form.cy.yml +++ b/config/locales/simple_form.cy.yml @@ -15,7 +15,6 @@ cy: bot: Mae'r cyfrif hwn yn perfformio gweithredoedd awtomatig yn bennaf ac mae'n bosib nad yw'n cael ei fonitro context: Un neu fwy cyd-destun lle dylai'r hidlydd weithio digest: Ond yn cael eu hanfon ar ôl cyfnod hir o anweithgarwch ac ond os ydych wedi derbyn unrhyw negeseuon personol yn eich absenoldeb - discoverable_html: Mae'r cyfeiriadur yn gadael i bobl ddarganfod cyfrifau wedi'i seilio ar ddiddordebau a gweithgareddau.. Mae hyn angen o leiaf %{min_followers} o ddilynwyr email: Byddwch yn derbyn e-bost i gadarnhau fields: Mae modd i chi arddangos hyd at 4 eitem fel tabl ar eich proffil header: PNG, GIF neu JPG. %{size} ar y mwyaf. Ceith ei israddio i %{dimensions}px diff --git a/config/locales/simple_form.da.yml b/config/locales/simple_form.da.yml index 324afece6..48a0a6883 100644 --- a/config/locales/simple_form.da.yml +++ b/config/locales/simple_form.da.yml @@ -26,6 +26,8 @@ da: setting_noindex: Påvirker din offentlige profil og status sider username: Dit brugernavn vil være unikt på %{domain} whole_word: Når nøgle ordet eller udtrykket kun er alfanumerisk, vil det kun blive brugt hvis det passer hele ordet + featured_tag: + name: 'Du kunne måske tænke dig at bruge en af følgende:' imports: data: CSV fil eksporteret fra en anden Mastodon server sessions: @@ -83,6 +85,7 @@ da: setting_system_font_ui: Brug systemets standard font setting_theme: Tema for side setting_unfollow_modal: Vis bekræftelses dialog før du stopper med at følge nogen + setting_use_pending_items: Langsom tilstand severity: Omfang type: Importtype username: Brugernavn @@ -92,6 +95,8 @@ da: must_be_follower: Bloker notifikationer fra folk der ikke følger dig must_be_following: Bloker notifikationer fra folk du ikke følger must_be_following_dm: Bloker direkte beskeder fra folk du ikke følger + invite_request: + text: Hvorfor ønsker du at tilmelde dig? notification_emails: digest: Send sammendrag via emails favourite: Send email når nogen favoriserer din status @@ -100,7 +105,11 @@ da: mention: Send e-mail når nogen nævner dig reblog: Send email når nogen fremhæver din status report: Send email når en ny anmeldelse bliver indsendt + tag: + name: Hashtag 'no': Nej + recommended: Anbefalet required: + mark: "*" text: påkrævet 'yes': Ja diff --git a/config/locales/simple_form.de.yml b/config/locales/simple_form.de.yml index b9e7c01d3..ac153805e 100644 --- a/config/locales/simple_form.de.yml +++ b/config/locales/simple_form.de.yml @@ -5,6 +5,7 @@ de: account_warning_preset: text: Du kannst Beitragssyntax benutzen, wie z.B. URLs, Hashtags und Erwähnungen admin_account_action: + include_statuses: Der Benutzer wird sehen, welche Beiträge diese Maßnahme verursacht haben send_email_notification: Benutzer_in wird Bescheid gegeben, was mit dem Konto geschehen ist text_html: Optional. Du kannst Beitragssyntax nutzen. Du kannst Warnungsvorlagen benutzen um Zeit zu sparen type_html: Wähle aus, was du mit %{acct} machen möchtest @@ -15,7 +16,7 @@ de: bot: Dieses Konto führt lediglich automatisierte Aktionen durch und wird möglicherweise nicht überwacht context: Ein oder mehrere Kontexte, wo der Filter aktiv werden soll digest: Wenn du eine lange Zeit inaktiv bist, wird dir eine Zusammenfassung von Erwähnungen zugeschickt, die du in deiner Abwesenheit empfangen hast - discoverable_html: Das Verzeichnis erlaubt es dein Profil durch deine Hashtags und deine Aktivitäten zu entdecken. Voraussetzung ist allerdings mindestens %{min_followers} Folger_innen + discoverable: Das Profilverzeichnis ist eine andere Möglichkeit, mit der dein Konto ein größeres Publikum erreichen kann email: Du wirst eine Bestätigungs-E-Mail erhalten fields: Du kannst bis zu 4 Elemente auf deinem Profil anzeigen lassen, die als Tabelle dargestellt werden header: PNG, GIF oder JPG. Maximal %{size}. Wird auf %{dimensions} px herunterskaliert @@ -60,6 +61,7 @@ de: account_warning_preset: text: Vorlagentext admin_account_action: + include_statuses: Meldungen der E-Mail beifügen send_email_notification: Benachrichtige den Nutzer per E-Mail text: Eigene Warnung type: Aktion @@ -143,6 +145,7 @@ de: trending_tag: E-Mail senden, wenn ein ausstehender Hashtag angesagt ist tag: listable: Erlaube diesem Hashtag im Profilverzeichnis zu erscheinen + name: Hashtag trendable: Erlaube es diesen Hashtag in den Trends erscheinen zu lassen usable: Beiträge erlauben, diesen Hashtag zu verwenden 'no': Nein diff --git a/config/locales/simple_form.el.yml b/config/locales/simple_form.el.yml index 30252458c..4eb0ce710 100644 --- a/config/locales/simple_form.el.yml +++ b/config/locales/simple_form.el.yml @@ -5,6 +5,7 @@ el: account_warning_preset: text: Μπορεις να χρησιμοποιήσεις συντακτικό ενός τουτ όπως διευθύνσεις URL, ταμπέλες και αναφορές admin_account_action: + include_statuses: Ο χρήστης θα δει ποια τουτ προκάλεσαν την προειδοποίηση ή την ενέργεια των διαχειριστών send_email_notification: Ο χρήστης θα λάβει μια εξήγηση του τι συνέβη με τον λογαριασμό του text_html: Προαιρετικό. Μπορείς να χρησιμοποιήσεις συντακτικό ενός τουτ. Μπορείς να ορίσεις προκαθορισμένες προειδοποιήσεις για να γλυτώσεις χρόνο type_html: Διάλεξε τι θα κανείς με τον %{acct} @@ -15,7 +16,7 @@ el: bot: Ο λογαριασμός αυτός εκτελεί κυρίως αυτοματοποιημένες ενέργειες και ίσως να μην παρακολουθείται context: Ένα ή περισσότερα πλαίσια στα οποία μπορεί να εφαρμόζεται αυτό το φίλτρο digest: Αποστέλλεται μόνο μετά από μακρά περίοδο αδράνειας και μόνο αν έχεις λάβει προσωπικά μηνύματα κατά την απουσία σου - discoverable_html: "Ο κατάλογος \nσου επιτρέπει να βρεις λογαριασμούς βάσει ενδιαφερόντων και δραστηριότητας. Απαιτεί τουλάχιστον %{min_followers} ακόλουθους" + discoverable: Ο κατάλογος λογαριασμών είναι ένας ακόμα τρόπος ώστε ο λογαριασμός σου να βρει μεγαλύτερο κοινό email: Θα σου σταλεί email επιβεβαίωσης fields: Μπορείς να έχεις έως 4 σημειώσεις σε μορφή πίνακα στο προφίλ σου header: PNG, GIF ή JPG. Έως %{size}. Θα περιοριστεί σε διάσταση %{dimensions}px @@ -60,6 +61,7 @@ el: account_warning_preset: text: Προκαθορισμένο κείμενο admin_account_action: + include_statuses: Συμπερίληψη των καταγγελλομένων τουτ στο email send_email_notification: Ενημέρωση χρήστη μέσω email text: Προσαρμοσμένη προειδοποίηση type: Ενέργεια @@ -143,6 +145,7 @@ el: trending_tag: Αποστολή email όταν μια μη-εγκεκριμένη ταμπέλα γίνεται δημοφιλής tag: listable: Εμφάνιση αυτής της ταμπέλας στο δημόσιο κατάλογο + name: Ταμπέλα trendable: Εμφάνιση της ταμπέλας στις τάσεις usable: Χρήση της ταμπέλας σε τουτ 'no': Όχι diff --git a/config/locales/simple_form.eo.yml b/config/locales/simple_form.eo.yml index f8c213858..b6bacde3a 100644 --- a/config/locales/simple_form.eo.yml +++ b/config/locales/simple_form.eo.yml @@ -15,7 +15,6 @@ eo: bot: Tiu konto ĉefe faras aŭtomatajn agojn, kaj povas esti ne kontrolata context: Unu ol pluraj kuntekstoj kie la filtrilo devus agi digest: Sendita nur post longa tempo de neaktiveco, kaj nur se vi ricevis personan mesaĝon en via foresto - discoverable_html: La profilujo permesas al homoj trovi kontojn laŭ interesoj kaj aktiveco. Postulas almenaŭ %{min_followers} sekvantojn email: Vi ricevos konfirman retmesaĝon fields: Vi povas havi ĝis 4 tabelajn elementojn en via profilo header: Formato PNG, GIF aŭ JPG. Ĝis %{size}. Estos malgrandigita al %{dimensions}px @@ -108,7 +107,7 @@ eo: setting_show_application: Publikigi la aplikaĵon uzatan por sendi mesaĝojn setting_system_font_ui: Uzi la dekomencan tiparon de la sistemo setting_theme: Reteja etoso - setting_trends: Montru Hodiaujn tendencojn + setting_trends: Montri hodiaŭajn furoraĵojn setting_unfollow_modal: Montri fenestron por konfirmi antaŭ ol ĉesi sekvi iun setting_use_pending_items: Malrapida reĝimo severity: Graveco @@ -133,7 +132,10 @@ eo: pending_account: Sendi retmesaĝon kiam nova konto bezonas kontrolon reblog: Sendi retmesaĝon kiam iu diskonigas vian mesaĝon report: Sendi retmesaĝon kiam nova signalo estas sendita + trending_tag: Sendi retpoŝtmesaĝon kiam nekontrolita kradvorto furoras tag: + name: Kradvorto + trendable: Permesi al ĉi tiu kradvorto aperi en furoraĵoj usable: Permesi tootojn uzi ĉiun tiun haketon 'no': Ne recommended: Rekomendita diff --git a/config/locales/simple_form.es.yml b/config/locales/simple_form.es.yml index 4f227dd9d..35cebcad8 100644 --- a/config/locales/simple_form.es.yml +++ b/config/locales/simple_form.es.yml @@ -15,7 +15,6 @@ es: bot: Esta cuenta ejecuta principalmente acciones automatizadas y podría no ser monitorizada context: Uno o múltiples contextos en los que debe aplicarse el filtro digest: Solo enviado tras un largo periodo de inactividad y solo si has recibido mensajes personales durante tu ausencia - discoverable_html: El directorio permite a la gente encontrar cuentas basadas en intereses y actividad. Requiere al menos %{min_followers} seguidores email: Se le enviará un correo de confirmación fields: Puedes tener hasta 4 elementos mostrándose como una tabla en tu perfil header: PNG, GIF o JPG. Máximo %{size}. Será escalado a %{dimensions}px diff --git a/config/locales/simple_form.et.yml b/config/locales/simple_form.et.yml index c87db1042..c52818a35 100644 --- a/config/locales/simple_form.et.yml +++ b/config/locales/simple_form.et.yml @@ -15,7 +15,6 @@ et: bot: See konto teeb enamjaolt automatiseeritud tegevusi ja ei pruugi olla järelvalve all context: Üks või mitu konteksti, mille vastu see filter peaks rakenduma digest: Saadetakse ainult pärast pikka perioodi tegevusetust ja ainult siis, kui Teile on saadetud privaatseid sõnumeid - discoverable_html: Kataloog aitab inimestel leida kontosi sarnaste huvide ja aktiivsuse alusel. Nõuab vähemalt %{min_followers} jälgijat email: Teile saadetakse kinnituskiri e-posti teel fields: Te saate oma profiilil tabelina kuvada kuni 4 asja header: PNG, GIF või JPG. Kõige rohkem %{size}. Vähendatakse %{dimensions} pikslini diff --git a/config/locales/simple_form.eu.yml b/config/locales/simple_form.eu.yml index 0a88116f1..65fa6c846 100644 --- a/config/locales/simple_form.eu.yml +++ b/config/locales/simple_form.eu.yml @@ -15,7 +15,6 @@ eu: bot: Kontu honek nagusiki automatizatutako ekintzak burutzen ditu eta agian ez du inork monitorizatzen context: Iragazkia aplikatzeko testuinguru bat edo batzuk digest: Jarduerarik gabeko epe luze bat eta gero mezu pertsonalen bat jaso baduzu, besterik ez - discoverable_html: Direktorioak Jendea interesen eta jardueraren arabera aurkitzea ahalbidetzen du. Gutxienez %{min_followers} jarraitzaile behar dira bertan agertzeko email: Baieztapen e-mail bat bidaliko zaizu fields: 4 elementu bistaratu ditzakezu taula batean zure profilean header: PNG, GIF edo JPG. Gehienez %{size}. %{dimensions}px eskalara txikituko da diff --git a/config/locales/simple_form.fa.yml b/config/locales/simple_form.fa.yml index 655c57bc3..90e644e55 100644 --- a/config/locales/simple_form.fa.yml +++ b/config/locales/simple_form.fa.yml @@ -15,7 +15,6 @@ fa: bot: این حساب بیشتر به طور خودکار فعالیت می‌کند و نظارت پیوسته‌ای روی آن وجود ندارد context: یک یا چند زمینه که فیلتر باید در آن‌ها اعمال شود digest: تنها وقتی فرستاده می‌شود که مدتی طولانی فعالیتی نداشته باشید و در این مدت برای شما پیغام خصوصی‌ای نوشته شده باشد - discoverable_html: با فهرست گزیدهٔ کاربران مردم می‌توانند حساب‌های این سرور را بر اساس علاقه‌مندی‌ها و فعالیت‌شان پیدا کنند. هر حساب دست‌کم باید %{min_followers} پیگیر داشته باشد email: به شما ایمیل تأییدی فرستاده خواهد شد fields: شما می‌توانید تا چهار مورد را در یک جدول در نمایهٔ خود نمایش دهید header: یکی از قالب‌های PNG یا GIF یا JPG. بیشترین اندازه %{size}. تصویر به اندازهٔ %{dimensions} پیکسل تبدیل خواهد شد diff --git a/config/locales/simple_form.fr.yml b/config/locales/simple_form.fr.yml index 6b3aa9bfb..a92c20f10 100644 --- a/config/locales/simple_form.fr.yml +++ b/config/locales/simple_form.fr.yml @@ -5,6 +5,7 @@ fr: account_warning_preset: text: Vous pouvez utiliser la syntaxe des pouets, comme les URLs, les hashtags et les mentions admin_account_action: + include_statuses: L’utilisateur·rice verra quels sont les pouets qui ont provoqué l’action de modération ou l’avertissement send_email_notification: L’utilisateur recevra une explication de ce qu’il s’est passé avec son compte text_html: Optionnel. Vous pouvez utilisez la syntaxe des pouets. Vous pouvez ajouter des présélections d’attention pour économiser du temps type_html: Choisir que faire avec %{acct} @@ -15,7 +16,7 @@ fr: bot: Ce compte exécute principalement des actions automatisées et pourrait ne pas être surveillé context: Un ou plusieurs contextes où le filtre devrait s’appliquer digest: Uniquement envoyé après une longue période d’inactivité et uniquement si vous avez reçu des messages personnels pendant votre absence - discoverable_html: L’annuaire permet aux gens de trouver des comptes en se basant sur les intérêts et les activités. Nécessite au moins %{min_followers} abonnés + discoverable: L’annuaire des profils est une autre façon pour votre compte d’atteindre une plus grand audience email: Vous recevrez un courriel de confirmation fields: Vous pouvez avoir jusqu’à 4 éléments affichés en tant que tableau sur votre profil header: Au format PNG, GIF ou JPG. %{size} maximum. Sera réduit à %{dimensions}px @@ -34,8 +35,12 @@ fr: setting_hide_network: Ceux que vous suivez et ceux qui vous suivent ne seront pas affichés sur votre profil setting_noindex: Affecte votre profil public ainsi que vos statuts setting_show_application: Le nom de l’application que vous utilisez afin d’envoyer des pouets sera affiché dans la vue détaillée de ceux-ci + setting_use_blurhash: Les dégradés sont basés sur les couleurs des visuels cachés mais ne divulgent pas les détails + setting_use_pending_items: Masquer les mises à jour chronologiques derrière un clic au lieu de les montrer automatiquement en faisant défiler le flux d'actualités username: Votre nom d’utilisateur sera unique sur %{domain} whole_word: Lorsque le mot-clef ou la phrase-clef est uniquement alphanumérique, ça sera uniquement appliqué s’il correspond au mot entier + domain_allow: + domain: Ce domaine pourra récupérer des données de ce serveur et les données entrantes seront traitées et stockées featured_tag: name: 'Vous pourriez vouloir utiliser l’un d’entre eux :' imports: @@ -44,6 +49,8 @@ fr: text: Cela nous aidera à considérer votre demande sessions: otp: 'Entrez le code d’authentification à deux facteurs généré par l’application de votre téléphone ou utilisez un de vos codes de récupération :' + tag: + name: Vous ne pouvez modifier que la casse des lettres, par exemple, pour le rendre plus lisible user: chosen_languages: Lorsque coché, seuls les pouets dans les langues sélectionnées seront affichés sur les fils publics labels: @@ -54,6 +61,7 @@ fr: account_warning_preset: text: Texte de présélection admin_account_action: + include_statuses: Inclure les pouets signalés dans le courriel send_email_notification: Notifier l’utilisateur par courriel text: Attention personnalisée type: Action @@ -108,7 +116,10 @@ fr: setting_show_application: Dévoiler le nom de l’application utilisée pour envoyer des pouets setting_system_font_ui: Utiliser la police par défaut du système setting_theme: Thème du site + setting_trends: Afficher les tendances du jour setting_unfollow_modal: Afficher une fenêtre de confirmation avant de vous désabonner d’un compte + setting_use_blurhash: Afficher les dégradés colorés pour les médias cachés + setting_use_pending_items: Mode lent severity: Sévérité type: Type d’import username: Identifiant @@ -131,6 +142,12 @@ fr: pending_account: Envoyer un courriel lorsqu’un nouveau compte est en attente d’approbation reblog: Envoyer un courriel lorsque quelqu’un partage mes statuts report: Envoyer un courriel lorsqu’un nouveau rapport est soumis + trending_tag: Envoyer un e-mail quand un hashtag non contrôlé est en tendance actuelle + tag: + listable: Autoriser ce hashtag à apparaître dans les recherches et dans l’annuaire des profils + name: Hashtag + trendable: Autoriser ce hashtag à apparaître sous les tendances du jour + usable: Autoriser les toots à utiliser ce hashtag 'no': Non recommended: Recommandé required: diff --git a/config/locales/simple_form.gl.yml b/config/locales/simple_form.gl.yml index f4966a030..adb06bc2c 100644 --- a/config/locales/simple_form.gl.yml +++ b/config/locales/simple_form.gl.yml @@ -3,8 +3,9 @@ gl: simple_form: hints: account_warning_preset: - text: Vostede pode darlle formato ao toot, como URLs, etiquetas e mencións + text: Pódeslle dar formato ao toot, como URLs, etiquetas e mencións admin_account_action: + include_statuses: A usuaria verá que toots causaron a acción da moderación ou aviso send_email_notification: A usuaria recibirá unha explicación sobre o que lle aconteceu a súa conta text_html: Optativo. Pode utilizar formato no toot. Pode engadir avisos preestablecidos para aforrar tempo type_html: Escolla que facer con %{acct} @@ -15,7 +16,7 @@ gl: bot: Esta conta realiza principalmente accións automatizadas e podería non estar monitorizada context: Un ou varios contextos onde se debería aplicar o filtro digest: Enviar só tras un longo período de inactividade e só si recibeu algunha mensaxe persoal na súa ausencia - discoverable_html: O directorio permite atopar contas en función de intereses e actividade. Require ter ao menos %{min_followers} seguidoras + discoverable: O directorio de perfil é outro xeito para que a túa conta alcance unha maior audiencia email: Enviaráselle un correo-e de confirmación fields: Pode ter ate 4 elementos no seu perfil mostrados como unha táboa header: PNG, GIF ou JPG. Máximo %{size}. Será reducida a %{dimensions}px @@ -48,6 +49,8 @@ gl: text: Esto axudaranos a revisar a súa aplicación sessions: otp: 'Introduza o código de dobre-factor creado pola aplicación do seu móbil ou utilice un dos seus códigos de recuperación:' + tag: + name: Só pode cambiar maiús/minúsculas, por exemplo, mellorar a lexibilidade user: chosen_languages: Se ten marca, só os toots nos idiomas seleccionados serán mostrados en liñas temporais públicas labels: @@ -58,6 +61,7 @@ gl: account_warning_preset: text: Texto preestablecido admin_account_action: + include_statuses: Incluír toots reportados no correo send_email_notification: Notificar a usuaria por correo-e text: Aviso personalizado type: Acción @@ -141,6 +145,7 @@ gl: trending_tag: Enviar correo cando unha etiqueta non revisada é tendencia tag: listable: Permitir a esta etiqueta aparecer no directorio de perfil + name: Etiqueta trendable: Permitir a esta etiqueta aparecer baixo Tendencias usable: Permitir que os toots utilicen esta etiqueta 'no': Non diff --git a/config/locales/simple_form.hu.yml b/config/locales/simple_form.hu.yml index fe7556bc3..e3875cd6b 100644 --- a/config/locales/simple_form.hu.yml +++ b/config/locales/simple_form.hu.yml @@ -15,7 +15,6 @@ hu: bot: Ez a fiók automatikus műveleteket végez és valószínűleg nem figyeljük context: Kontextusok, ahol a szűrőnek működnie kell digest: Csak hosszú távollét esetén küldődik és csak ha személyes üzenetet kaptál távollétedben - discoverable_html: A profilok adatbázisa lehetővé teszi, hogy embereket közös érdeklődés vagy tevékenység alapján találj meg. Legalább %{min_followers} követőre van szükség az adatbázisba való bekerüléshez email: Kapsz egy megerősítő e-mailt fields: A profilodon legfeljebb 4 bejegyzés szerepelhet táblázatos formában header: PNG, GIF vagy JPG. Maximum %{size}. Átméretezzük %{dimensions} pixelre diff --git a/config/locales/simple_form.it.yml b/config/locales/simple_form.it.yml index 1778d7ece..21c86da9e 100644 --- a/config/locales/simple_form.it.yml +++ b/config/locales/simple_form.it.yml @@ -5,6 +5,7 @@ it: account_warning_preset: text: Puoi usare la sintassi dei toot, come URL, hashtag e menzioni admin_account_action: + include_statuses: L'utente vedrà quali toot hanno causato l'azione di moderazione o l'avviso send_email_notification: L'utente riceverà una spiegazione di ciò che è successo con suo account text_html: Opzionale. Puoi usare la sintassi dei toot. Puoi aggiungere avvisi preimpostati per risparmiare tempo type_html: Decidi cosa fare con %{acct} @@ -15,7 +16,6 @@ it: bot: Questo account esegue principalmente operazioni automatiche e potrebbe non essere tenuto sotto controllo da una persona context: Uno o più contesti nei quali il filtro dovrebbe essere applicato digest: Inviata solo dopo un lungo periodo di inattività e solo se hai ricevuto qualche messaggio personale in tua assenza - discoverable_html: La directory permette alle persone di trovare account in base a determinati interessi o attività. Richiede almeno %{min_followers} seguaci email: Ti manderemo una email di conferma fields: Puoi avere fino a 4 voci visualizzate come una tabella sul tuo profilo header: PNG, GIF o JPG. Al massimo %{size}. Verranno scalate a %{dimensions}px @@ -60,6 +60,7 @@ it: account_warning_preset: text: Testo preimpostato admin_account_action: + include_statuses: Includi i toots segnalati nell'email send_email_notification: Informa l'utente via email text: Avviso personalizzato type: Azione @@ -130,7 +131,7 @@ it: must_be_following: Blocca notifiche dalle persone che non segui must_be_following_dm: Blocca i messaggi diretti dalle persone che non segui invite_request: - text: Perchè vuoi unirti? + text: Perché vuoi iscriverti? notification_emails: digest: Invia email riassuntive favourite: Invia email quando segna come preferito al tuo stato @@ -140,8 +141,10 @@ it: pending_account: Invia e-mail quando un nuovo account richiede l'approvazione reblog: Invia email quando qualcuno da un boost al tuo stato report: Manda una mail quando viene inviato un nuovo rapporto + trending_tag: Invia e-mail quando un hashtag non controllato è in tendenza tag: listable: Permetti a questo hashtag di apparire nella directory dei profili + name: Hashtag trendable: Permetti a questo hashtag di apparire nelle tendenze usable: Permetti ai toot di utilizzare questo hashtag 'no': 'No' diff --git a/config/locales/simple_form.ja.yml b/config/locales/simple_form.ja.yml index 4a0d16028..2205dcf8f 100644 --- a/config/locales/simple_form.ja.yml +++ b/config/locales/simple_form.ja.yml @@ -5,6 +5,7 @@ ja: account_warning_preset: text: URL、ハッシュタグ、メンションなど、投稿に用いる構文が使用できます admin_account_action: + include_statuses: ユーザーは取られた制限や警告の原因となったトゥートを確認できるようになります send_email_notification: ユーザーは自分のアカウントに何が起こったのか説明を受け取ります text_html: オプションです。投稿に用いる構文を使うことができます。簡略化のためプリセット警告文を追加することができます type_html: "%{acct}さんに対し、何を行うか選択してください" @@ -15,7 +16,7 @@ ja: bot: このアカウントは主に自動で動作し、人が見ていない可能性があります context: フィルターを適用する対象 (複数選択可) digest: 長期間使用していない場合と不在時に返信を受けた場合のみ送信されます - discoverable_html: ディレクトリ は興味や活動をもとにアカウントを見つけることを可能にします。 掲載には %{min_followers} 人以上のフォロワーが必要です + discoverable: ディレクトリはあなたのアカウントをより多くの人に見つけてもらうためのひとつの手段です email: 確認のメールが送信されます fields: プロフィールに表として4つまでの項目を表示することができます header: "%{size}までのPNG、GIF、JPGが利用可能です。 %{dimensions}pxまで縮小されます" @@ -38,6 +39,8 @@ ja: setting_use_pending_items: 新着があってもタイムラインを自動的にスクロールしないようにします username: あなたのユーザー名は %{domain} の中で重複していない必要があります whole_word: キーワードまたはフレーズが英数字のみの場合、単語全体と一致する場合のみ適用されるようになります + domain_allow: + domain: 登録するとこのサーバーからデータを受信したり、このドメインから受信するデータを処理して保存できるようになります featured_tag: name: 'これらを使うといいかもしれません:' imports: @@ -58,6 +61,7 @@ ja: account_warning_preset: text: プリセット警告文 admin_account_action: + include_statuses: 通報されたトゥートをメールに含める send_email_notification: メールでユーザーに通知 text: カスタム警告文 type: アクション @@ -141,6 +145,7 @@ ja: trending_tag: 未審査のハッシュタグが人気の時にメールで通知する tag: listable: 検索とディレクトリへの使用を許可する + name: ハッシュタグ trendable: トレンドへの表示を許可する usable: トゥートへの使用を許可する 'no': いいえ diff --git a/config/locales/simple_form.ko.yml b/config/locales/simple_form.ko.yml index 2baf72e87..118bf50d4 100644 --- a/config/locales/simple_form.ko.yml +++ b/config/locales/simple_form.ko.yml @@ -5,6 +5,7 @@ ko: account_warning_preset: text: URL, 해시태그, 멘션과 같은 툿 문법을 사용할 수 있습니다 admin_account_action: + include_statuses: 사용자는 어떤 툿에 대해 경고나 조치가 취해졌는지 볼 수 있게 됩니다 send_email_notification: 유저는 어떤 일이 일어났는 지에 대한 설명을 받게 됩니다 text_html: 선택사항. 툿 문법을 사용할 수 있습니다. 경고 틀을 추가하여 시간을 절약할 수 있습니다 type_html: "%{acct}에 대해 취할 행동 선택" @@ -15,7 +16,7 @@ ko: bot: 사람들에게 계정이 사람이 아님을 알립니다 context: 필터를 적용 할 한 개 이상의 컨텍스트 digest: 오랫동안 활동하지 않았을 때 받은 멘션들에 대한 요약 받기 - discoverable_html: 디렉토리 는 사람들의 관심사와 활동에 관련 된 계정들을 찾을 수 있게 해 줍니다. 최소 %{min_followers}명의 팔로어가 필요합니다 + discoverable: 프로필 디렉터리는 내 계정이 더 많은 관심을 갖게 할 수 있는 다른 방법입니다 email: 당신은 확인 메일을 받게 됩니다 fields: 당신의 프로파일에 최대 4개까지 표 형식으로 나타낼 수 있습니다 header: PNG, GIF 혹은 JPG. 최대 %{size}. %{dimensions}px로 다운스케일 됨 @@ -60,6 +61,7 @@ ko: account_warning_preset: text: 프리셋 텍스트 admin_account_action: + include_statuses: 신고된 툿을 이메일에 포함 send_email_notification: 이메일로 유저에게 알리기 text: 커스텀 경고 type: 조치 @@ -143,6 +145,7 @@ ko: trending_tag: 리뷰 되지 않은 해시태그가 유행할 때 이메일 보내기 tag: listable: 이 해시태그가 프로필 디렉토리에 보여지도록 허용 + name: 해시태그 trendable: 이 해시태그가 유행에 보여지도록 허용 usable: 이 해시태그를 툿에 사용 가능하도록 허용 'no': 아니오 diff --git a/config/locales/simple_form.nl.yml b/config/locales/simple_form.nl.yml index 58d29ce12..cda4e9ead 100644 --- a/config/locales/simple_form.nl.yml +++ b/config/locales/simple_form.nl.yml @@ -15,7 +15,6 @@ nl: bot: Dit is een geautomatiseerd account en wordt mogelijk niet gemonitord context: Een of meerdere locaties waar de filter actief moet zijn digest: Wordt alleen na een lange periode van inactiviteit verzonden en alleen wanneer je tijdens jouw afwezigheid persoonlijke berichten hebt ontvangen - discoverable_html: In de gebruikersgids kunnen mensen andere accounts vinden aan de hand van interesses en activiteit. Dit vereist tenminste %{min_followers} volgers email: Je krijgt een bevestigingsmail fields: Je kan maximaal 4 items als een tabel op je profiel weergeven header: PNG, GIF of JPG. Maximaal %{size}. Wordt teruggeschaald naar %{dimensions}px @@ -109,6 +108,7 @@ nl: setting_system_font_ui: Standaardlettertype van jouw systeem gebruiken setting_theme: Thema website setting_unfollow_modal: Vraag voor het ontvolgen van iemand een bevestiging + setting_use_pending_items: Langzame modus severity: Zwaarte type: Importtype username: Gebruikersnaam @@ -131,6 +131,8 @@ nl: pending_account: Een e-mail verzenden wanneer een nieuw account moet worden beoordeeld reblog: Een e-mail versturen wanneer iemand jouw toot heeft geboost report: Verstuur een e-mail wanneer een nieuw rapportage is ingediend + tag: + name: Hashtag 'no': Nee recommended: Aanbevolen required: diff --git a/config/locales/simple_form.oc.yml b/config/locales/simple_form.oc.yml index 9ebd64a90..9336a9846 100644 --- a/config/locales/simple_form.oc.yml +++ b/config/locales/simple_form.oc.yml @@ -15,7 +15,6 @@ oc: bot: Avisar lo monde qu’aqueste compte es pas d’una persona context: Un o mai de contèxtes ont lo filtre deuriá s’aplicar digest: Solament enviat aprèp un long moment d’inactivitat e solament s’avètz recebut de messatges personals pendent vòstra abséncia - discoverable_html: L’annuari permet al monde de trobar de comptes segon lor interèsses e activitats. Requerís almens %{min_followers} seguidors email: Vos mandarem un corrièl de confirmacion fields: Podètz far veire cap a 4 elements sus vòstre perfil header: PNG, GIF o JPG. Maximum %{size}. Serà retalhada en %{dimensions}px diff --git a/config/locales/simple_form.pl.yml b/config/locales/simple_form.pl.yml index 553900855..695817985 100644 --- a/config/locales/simple_form.pl.yml +++ b/config/locales/simple_form.pl.yml @@ -15,7 +15,6 @@ pl: bot: To konto wykonuje głównie zautomatyzowane działania i może nie być monitorowane context: Jedno lub wiele miejsc, w których filtr zostanie zastosowany digest: Wysyłane tylko po długiej nieaktywności, jeżeli w tym czasie otrzymaleś jakąś wiadomość bezpośrednią - discoverable_html: Katalog pozwala znaleźć konta na podstawie zainteresowań i aktywności. Profil musi śledzić przynajmniej %{min_followers} osób email: Otrzymasz e-mail potwierdzający fields: Możesz ustawić maksymalnie 4 niestandardowe pola wyświetlane jako tabela na Twoim profilu header: PNG, GIF lub JPG. Maksymalnie %{size}. Zostanie zmniejszony do %{dimensions}px diff --git a/config/locales/simple_form.pt-BR.yml b/config/locales/simple_form.pt-BR.yml index 10475e515..8400951f0 100644 --- a/config/locales/simple_form.pt-BR.yml +++ b/config/locales/simple_form.pt-BR.yml @@ -15,7 +15,6 @@ pt-BR: bot: Essa conta executa principalmente ações automatizadas e pode não ser monitorada context: Um ou mais contextos onde o filtro deve ser aplicado digest: Enviado após um longo período de inatividade com um resumo das menções que você recebeu em sua ausência - discoverable_html: O diretório permite encontrar contas baseado em seus interesses e atividades. Requer pelo menos %{min_followers} seguidores email: Você receberá um email de confirmação fields: Você pode ter até 4 itens exibidos em forma de tabela no seu perfil header: PNG, GIF or JPG. Arquivos de até %{size}. Eles serão diminuídos para %{dimensions}px diff --git a/config/locales/simple_form.pt.yml b/config/locales/simple_form.pt.yml index bf6381889..9f9d0fdc2 100644 --- a/config/locales/simple_form.pt.yml +++ b/config/locales/simple_form.pt.yml @@ -15,7 +15,6 @@ pt: bot: Esta conta executa essencialmente acções automáticas e pode não poder ser monitorizada context: Um ou múltiplos contextos nos quais o filtro deve ser aplicado digest: Enviado após um longo período de inatividade e apenas se foste mencionado na tua ausência - discoverable_html: O directory permite encontrar contas de pessoas com base nos seus interesses e actividades. Exige, pelo menos %{min_followers} seguidores email: Será enviado um e-mail de confirmação fields: Podes ter até 4 itens expostos, em forma de tabela, no teu perfil header: PNG, GIF or JPG. Arquivos até %{size}. Vão ser reduzidos para %{dimensions}px diff --git a/config/locales/simple_form.ro.yml b/config/locales/simple_form.ro.yml index 4df2fe161..ac4c344f1 100644 --- a/config/locales/simple_form.ro.yml +++ b/config/locales/simple_form.ro.yml @@ -15,7 +15,6 @@ ro: bot: Acest cont performează în cea mai mare parte acțiuni automate și nu poate fi monitorizat context: Contextele în care filtrul trebuie aplicat digest: Este trimis doar după o lungă perioadă de inactivitate și numai dacă primești mesaje personale în perioada de absență - discoverable_html: Directorul permite utilizatorilor să găsească conturi după interese și activități. Necesită minim %{min_followers} urmăritori email: Vei primi un e-mail de confirmare fields: Poti afișa pană la maxim 4 adrese sub formă de tabel pe pofilul tău header: PNG, GIF sau JPG. Cel mult %{size}. Vor fi redimensionate la %{dimensions}px diff --git a/config/locales/simple_form.ru.yml b/config/locales/simple_form.ru.yml index 2835cdb30..c4560100a 100644 --- a/config/locales/simple_form.ru.yml +++ b/config/locales/simple_form.ru.yml @@ -15,7 +15,6 @@ ru: bot: Этот аккаунт обычно выполяет автоматизированные действия и может не просматриваться владельцем context: Один или несколько контекстов, к которым должны быть применены фильтры digest: Отсылается лишь после длительной неактивности, если вы в это время получали личные сообщения - discoverable_html: Каталог позволяет пользователям искать людей по интересам и активности. Необходимо наличие не менее %{min_followers} подписчиков email: Вам будет отправлено электронное письмо с подтверждением fields: В профиле можно отобразить до 4 пунктов как таблицу header: Поддерживается PNG, GIF и JPG. Максимальный размер — %{size}. Будет уменьшена до %{dimensions}px diff --git a/config/locales/simple_form.sk.yml b/config/locales/simple_form.sk.yml index c30785612..b908c0196 100644 --- a/config/locales/simple_form.sk.yml +++ b/config/locales/simple_form.sk.yml @@ -5,6 +5,7 @@ sk: account_warning_preset: text: Môžeš používať rovnakú syntaxiu ako v rámci príspevkov, čiže URL, haštagy, a spomenutia admin_account_action: + include_statuses: Užívateľ uvidí, ktoré príspevky majú za následok moderačný zásah, alebo upozornenie send_email_notification: Užívateľ dostane vysvetlenie ohľadom toho, čo sa stalo s ich účtom text_html: Voliteľné. Môžeš používať rovnakú syntaxiu ako v príspevkoch. Môžeš pridať varovné predlohy a ušetriť tak čas type_html: Vyber si, čo urobiť s účtom %{acct} @@ -15,7 +16,6 @@ sk: bot: Tento účet vykonáva hlavne automatizované akcie, a je pravdepodobne nespravovaný context: Jedno, alebo viac kritérií, v ktorých má byť filtrovanie uplatnené digest: Odoslané iba v prípade dlhodobej neprítomnosti, a len ak si obdržal/a nejaké osobné správy kým si bol/a preč - discoverable_html: Táto databáza umožňuje ľudom nájsť profily podľa záujmu a aktívnosti. Vyžaduje aby mali aspoň %{min_followers} sledovateľov email: Bude ti odoslaný potvrdzujúci email fields: Až štyri položky môžeš mať na svojom profile zobrazené vo forme tabuľky header: PNG, GIF, alebo JPG. Maximálne %{size}. Bude zmenšený na %{dimensions}px @@ -57,6 +57,7 @@ sk: account_warning_preset: text: Text predlohy admin_account_action: + include_statuses: Zahrnúť nahlásené príspevky v emaile send_email_notification: Oznam užívateľovi cez email text: Špecifické varovanie type: Úkon @@ -140,6 +141,7 @@ sk: trending_tag: Pošli email, ak sa neoverený haštag stane populárnym tag: listable: Povoľ zobrazovanie tohto haštagu v zozname profilov + name: Haštag trendable: Povoľ zobrazovanie tohto haštagu medzi trendujúcimi usable: Povoľ používanie tohto haštagu v príspevkoch 'no': Nie diff --git a/config/locales/simple_form.sl.yml b/config/locales/simple_form.sl.yml index 405af24c6..771edf383 100644 --- a/config/locales/simple_form.sl.yml +++ b/config/locales/simple_form.sl.yml @@ -15,7 +15,6 @@ sl: bot: Ta račun v glavnem opravlja samodejna dejanja in morda ni pod nadzorom context: En ali več kontekstov, kjer naj se uporabi filter digest: Pošlje se le po dolgem obdobju nedejavnosti in samo, če ste prejeli osebna sporočila v vaši odsotnosti - discoverable_html: Imenik ljudem omogoča iskanje računov na podlagi interesov in dejavnosti. Potrebuje najmanj %{min_followers} sledilcev email: Poslali vam bomo potrditveno e-pošto fields: Na svojem profilu lahko imate do 4 predmete prikazane kot tabelo. header: PNG, GIF ali JPG. Največ %{size}. Zmanjšana bo na %{dimensions}px diff --git a/config/locales/simple_form.sq.yml b/config/locales/simple_form.sq.yml index 04ef12c9a..b365bdda8 100644 --- a/config/locales/simple_form.sq.yml +++ b/config/locales/simple_form.sq.yml @@ -15,7 +15,6 @@ sq: bot: Kjo llogari kryesisht bën veprime të automatizuara dhe mund të mos mbikëqyret dot context: Një ose disa kontekste kur duhet të zbatohet filtri digest: I dërguar vetëm pas një periudhe të gjatë pasiviteti dhe vetëm nëse keni marrë ndonjë mesazh personal gjatë mungesës suaj - discoverable_html: Drejtoria u lejon njerëzve të gjejnë llogari bazuar në interesat dhe veprimtarinë. Lyp të paktën %{min_followers} ndjekës email: Do t’ju dërgohet një email ripohimi fields: Te profili juaj mund të keni deri në 4 objekte të shfaqur si tabelë header: PNG, GIF ose JPG. E shumta %{size}. Do të ripërmasohet në %{dimensions}px diff --git a/config/locales/simple_form.sr.yml b/config/locales/simple_form.sr.yml index a097be5dd..6901b842c 100644 --- a/config/locales/simple_form.sr.yml +++ b/config/locales/simple_form.sr.yml @@ -15,7 +15,6 @@ sr: bot: Овај налог углавном врши аутоматизоване радње и можда се не надгледа context: Један или више контекста у којима треба да се примени филтер digest: Послато после дужег периода неактивности са прегледом свих битних ствари које сте добили док сте били одсутни - discoverable_html: Директоријум омогућава људима да пронађу налоге засноване на интересима и активности. Захтева бар %{min_followers} пратиоца email: Биће вам послата е-пошта са потврдом fields: Можете имати до 4 ставке приказане као табела на вашем профилу header: PNG, GIF или JPG. Највише %{size}. Биће смањена на %{dimensions}px diff --git a/config/locales/simple_form.th.yml b/config/locales/simple_form.th.yml index 655483569..8caae951c 100644 --- a/config/locales/simple_form.th.yml +++ b/config/locales/simple_form.th.yml @@ -15,7 +15,6 @@ th: bot: บัญชีนี้ทำการกระทำอัตโนมัติเป็นหลักและอาจไม่ได้รับการสังเกตการณ์ context: บริบทจำนวนหนึ่งหรือมากกว่าที่ตัวกรองควรใช้ digest: ส่งเฉพาะหลังจากไม่มีการใช้งานเป็นเวลานานและในกรณีที่คุณได้รับข้อความส่วนบุคคลใด ๆ เมื่อคุณไม่อยู่เท่านั้น - discoverable_html: ไดเรกทอรี ช่วยให้ผู้คนค้นหาบัญชีตามความสนใจและกิจกรรม ต้องการอย่างน้อย %{min_followers} ผู้ติดตาม email: คุณจะได้รับอีเมลยืนยัน fields: คุณสามารถมีได้มากถึง 4 รายการแสดงเป็นตารางในโปรไฟล์ของคุณ header: PNG, GIF หรือ JPG สูงสุด %{size} จะถูกย่อขนาดเป็น %{dimensions}px @@ -135,6 +134,9 @@ th: pending_account: ส่งอีเมลเมื่อบัญชีใหม่ต้องการการตรวจทาน reblog: ส่งอีเมลเมื่อใครสักคนดันสถานะของคุณ report: ส่งอีเมลเมื่อมีการส่งรายงานใหม่ + tag: + name: แฮชแท็ก + usable: อนุญาตให้โพสต์ใช้แฮชแท็กนี้ 'no': ไม่ recommended: แนะนำ required: diff --git a/config/locales/simple_form.tr.yml b/config/locales/simple_form.tr.yml index 68b4c24c9..fd971daa8 100644 --- a/config/locales/simple_form.tr.yml +++ b/config/locales/simple_form.tr.yml @@ -4,49 +4,125 @@ tr: hints: admin_account_action: send_email_notification: Kullanıcı, hesabına ne olduğu hakkında bir bildirim alacak + type_html: "%{acct} ile ne yapılacağını seçin" warning_preset_id: İsteğe bağlı. Hazır ayarın sonuna hala özel metin ekleyebilirsiniz defaults: autofollow: Davetiyeyle kaydolan kişiler sizi otomatik olarak takip eder avatar: En fazla %{size} olacak şekilde PNG, GIF veya JPG formatında yükleyiniz. %{dimensions}px büyüklüğüne indirgenecektir + bot: Bu hesap temelde otomatik eylemler gerçekleştirir ve izlenmeyebilir + context: Filtrenin geçerli olması gereken bir veya daha fazla içerik + digest: Yalnızca uzun süre kullanılmadığında ve yalnızca yokluğunda kişisel mesajlar aldıysanız gönderilir + discoverable: Profil dizini, hesabınızın daha geniş bir kitleye ulaşmasının başka bir yoludur + email: Onay e-postası gönderilecek header: En fazla %{size} olacak şekilde PNG, GIF veya JPG formatında yükleyiniz. %{dimensions}px büyüklüğüne indirgenecektir. + irreversible: Filtre uygulanmış gönderiler, filtre daha sonra çıkartılsa bile geri dönüşümsüz biçimde kaybolur + locale: Kullanıcı arayüzünün dili, e-postalar ve push bildirimleri locked: Takipçilerinizi manuel olarak kabul etmenizi ve gönderilerinizi varsayılan olarak sadece takipçilerinizin göreceği şekilde paylaşmanızı sağlar. + password: En az 8 karakter kullanın + setting_default_sensitive: Hassas medya varsayılan olarak gizlenir ve bir tıklama ile görüntülenebilir + setting_display_media_default: Hassas olarak işaretlenmiş medyayı gizle + setting_display_media_hide_all: Tüm medyayı gizle + setting_display_media_show_all: Hassas olarak işaretlenmiş medyayı göster + setting_hide_network: Takip edilenler ve takipçiler profilinizde gösterilmeyecek + setting_noindex: Herkese açık profilinizi ve durum sayfalarınızı etkiler + username: Kullanıcı adınız %{domain} alanında benzersiz olacak + whole_word: Anahtar kelime veya kelime öbeği yalnızca alfasayısal olduğunda, yalnızca tüm sözcükle eşleşirse uygulanır + featured_tag: + name: 'Bunlardan birini kullanmak isteyebilirsiniz:' imports: data: Diğer Mastodon sunucusundan dışarı aktardığınız CSV dosyası + invite_request: + text: Bu, başvurunuzu gözden geçirmemize yardımcı olacaktır sessions: otp: Telefonunuzdaki two-factor kodunuzu giriniz veya kurtarma kodlarınızdan birini giriniz. + user: + chosen_languages: İşaretlendiğinde, yalnızca seçilen dillerdeki karakterler genel zaman çizelgelerinde görüntülenir labels: + account: + fields: + name: Etiket + value: İçerik + admin_account_action: + send_email_notification: E-postayla kullanıcıyı bilgilendir + text: Özel uyarı + type: Eylem + types: + disable: Devre dışı + none: Hiç birşey + silence: Sessiz + suspend: Hesap verilerini askıya alın ve geri alınamaz şekilde silin defaults: + autofollow: Hesabınızı takip etmeye davet edin avatar: Profil resmi + bot: Bu bir bot hesabı + chosen_languages: Dilleri filtrele confirm_new_password: Yeni parolanız (tekrar) confirm_password: Parolanız (tekrar) + context: İçeriği filtrele current_password: Mevcut parolanız data: Dosya display_name: Görünen adınız email: E-posta adresiniz + fields: Profil Metaverisi header: Kapak resmi locale: Dil locked: Hesabımı kilitle + max_uses: Maksimum kullanım sayısı new_password: Yeni parolanız note: Kişisel bilgiler otp_attempt: İki-faktörlü kod password: Parolanız + phrase: Anahtar kelime veya kelime öbeği + setting_advanced_layout: Gelişmiş web arayüzünü etkinleştir setting_auto_play_gif: GIF'leri otomatik oynatt setting_boost_modal: Boost etmeden önce onay diyaloğu göster setting_default_privacy: Gönderi gizliliği + setting_default_sensitive: Her zaman hassas medya olarak işaretle + setting_delete_modal: Bir gönderiyi silmeden önce onay iletişim kutusunu göster + setting_display_media: Medya görünümü + setting_display_media_default: Varsayılan + setting_display_media_hide_all: Tümünü gizle + setting_display_media_show_all: Tümünü göster + setting_hide_network: Ağını gizle + setting_noindex: Arama motoru endekslemesini iptal et + setting_reduce_motion: Animasyonlarda hareketi azalt + setting_show_application: İçerik göndermek için kullanılan uygulamayı belirt + setting_system_font_ui: Sistemin varsayılan yazı tipini kullan + setting_theme: Site teması + setting_trends: Bugünün trendlerini göster + setting_unfollow_modal: Birini takip etmeden önce onay iletişim kutusunu göster + setting_use_blurhash: Gizli ortamlar için renkli gradyen göster + setting_use_pending_items: Yavaş mod severity: Zorluk type: Dosya türü username: Kullanıcı adınız + username_or_email: Kullanıcı adı ya da email + whole_word: Tüm dünya + featured_tag: + name: Hashtag interactions: must_be_follower: Takipçim olmayan kişilerden gelen bildirimleri engelle must_be_following: Takip etmediğim kişilerden gelen bildirimleri engelle + must_be_following_dm: Takip etmediğiniz kişilerin doğrudan ileti göndermesini engelle + invite_request: + text: Neden katılmak istiyorsun? notification_emails: digest: Özet e-postaları gönder favourite: Biri durumumu favorilerine eklediginde bana e-posta gönder follow: Biri beni takip ettiğinde bana e-posta gönder follow_request: Biri bana takip isteği gönderdiğinde, bana e-posta gönder mention: Biri benden bahsettiğinde, bana e-posta gönder + pending_account: Yeni bir hesap incelemesi gerektiğinde e-posta gönder reblog: Biri durumumu paylaştığında, bana e-posta gönder + report: Yeni bir rapor gönderildiğinde e-posta gönder + trending_tag: İncelenmemiş bir hashtag trend olduğunda e-posta gönder + tag: + listable: Bu etiketin aramalarda ve profil dizininde görünmesine izin ver + name: Hashtag + trendable: Bu etiketin trendlerin altında görünmesine izin ver 'no': Hayır + recommended: Önerilen required: + mark: "*" text: gerekli 'yes': Evet diff --git a/config/locales/simple_form.uk.yml b/config/locales/simple_form.uk.yml index 825abf7a9..1e4a262e7 100644 --- a/config/locales/simple_form.uk.yml +++ b/config/locales/simple_form.uk.yml @@ -5,6 +5,7 @@ uk: account_warning_preset: text: Ви можете використовувати синтаксис дмухів, наприклад URLи, хештеґи та згадки admin_account_action: + include_statuses: Користувач побачить, які дмухи призвели до адміністративних дій або попереджень send_email_notification: Користувач отримає роз'яснення, що сталося з його обліковим записом text_html: Необов'язково. Ви можете використовувати синтакс дмухів. Ви можете додати шаблони попереджень, щоб заощадити час type_html: Оберіть, що робити з %{acct} @@ -14,7 +15,7 @@ uk: avatar: PNG, GIF, або JPG. Максимум - %{size}. Буде зменшено до %{dimensions}px bot: Цей аккаунт в основному виконує автоматичні дії та може не відстежуватіся digest: Буде послано тільки після довгого періоду неактивності, та тільки якщо ви отримаєте персональне повідомлення у цей період - discoverable_html: каталог дає змогу шукати облікові записи за інтересами та активністю. Вимагає щонайменше %{min_followers} підписників + discoverable: Ще один шлях, за яким про вас можуть дізнатися користувачі — каталог профілів email: Вам надійде електронний лист з підтвердженням fields: До 4 елементів може бути відображено як таблиця у вашому профілі header: PNG, GIF, або JPG. Максимум - %{size}. Буде зменшено до %{dimensions}px @@ -24,6 +25,7 @@ uk: locked: Буде вимагати від Вас самостійного підтверждення підписників, змінить приватність постів за замовчуванням на "тільки для підписників" password: Не менше 8 символів phrase: Шукає без врахування регістру у тексті дмуха або у його попередженні про вміст + setting_aggregate_reblogs: Не показувати передмухи для дмухів, які нещодавно вже були передмухнуті (не вплине на вже отримані передмухи) setting_default_sensitive: Дражливі медіа приховані за промовчанням та можуть бути розкрити кліком setting_display_media_default: Приховувати медіа, помічені як дражливі setting_display_media_hide_all: Приховувати будь-які медіа @@ -32,6 +34,7 @@ uk: setting_noindex: Впливає на ваш публічний профіль та сторінки статусу setting_show_application: Застосунок, за допомогою якого ви дмухнули, буде відображено серед деталей дмуху setting_use_blurhash: Градієнти, що базуються на кольорах прихованих медіа, але роблять нерозрізненними будь-які деталі + setting_use_pending_items: Не додавати нові повідомлення до стрічок миттєво. Показувати їх тільки після додаткового клацання. username: Ваше ім'я користувача буде унікальним у %{domain} whole_word: Якщо пошукове слово або фраза містить тільки літери та цифри, воно має співпадати цілком domain_allow: @@ -56,6 +59,7 @@ uk: account_warning_preset: text: Текст шаблону admin_account_action: + include_statuses: Додати дмухи, на які ви скаржитесь, до електронного листа send_email_notification: Сповістити користувача електронною поштою text: Користувацьке попередження type: Дія @@ -78,6 +82,7 @@ uk: discoverable: Оприлюднити обліковий запис у каталозі display_name: Ім'я email: Email адреса + fields: Метадані профіля header: Заголовок inbox_url: URL поштової скриньки ретранслятора irreversible: Видалити назавжди, а не просто сховати @@ -136,6 +141,7 @@ uk: trending_tag: Надсилати електронного листа, коли нерозглянутий хештеґ стає популярним tag: listable: Дозволити появу цього хештеґа у каталозі профілів + name: Хештеґ trendable: Дозволити появу цього хештеґа у списку популярних хештеґів usable: Дозволити дмухам використовувати цей хештеґ 'no': Ні diff --git a/config/locales/simple_form.zh-CN.yml b/config/locales/simple_form.zh-CN.yml index 04ae16ecd..9bff15d1d 100644 --- a/config/locales/simple_form.zh-CN.yml +++ b/config/locales/simple_form.zh-CN.yml @@ -15,7 +15,6 @@ zh-CN: bot: 来自这个帐户的绝大多数操作都是自动进行的,并且可能无人监控 context: 过滤器的应用场景 digest: 仅在你长时间未登录,且收到了私信时发送 - discoverable_html: 用户目录 让大家能根据兴趣和活动寻找用户。需要至少 %{min_followers} 位关注者 email: 我们会向你发送一封确认邮件 fields: 这将会在个人资料页上以表格的形式展示,最多 4 个项目 header: 文件大小限制 %{size},只支持 PNG、GIF 或 JPG 格式。图片分辨率将会压缩至 %{dimensions}px diff --git a/config/locales/simple_form.zh-TW.yml b/config/locales/simple_form.zh-TW.yml index 4da117b61..97f2d0cff 100644 --- a/config/locales/simple_form.zh-TW.yml +++ b/config/locales/simple_form.zh-TW.yml @@ -15,7 +15,6 @@ zh-TW: bot: 此帳戶主要執行自動操作且可能未被監控 context: 應該套用過濾器的一項或多項內容 digest: 僅在你長時間未登入且在未登入期間收到私訊時傳送 - discoverable_html: 目錄 讓使用者們能基於興趣與活動尋找帳戶。需要至少 %{min_followers} 位關注者 email: 您將收到一封確認電子郵件 fields: 您可在個人資料上有至多 4 個以表格形式顯示的項目 header: 支援 PNG, GIF 或 JPG 圖片,檔案最大為 %{size},會按比例縮小成 %{dimensions} 像素 diff --git a/config/locales/sk.yml b/config/locales/sk.yml index dc75706b1..980e4613e 100644 --- a/config/locales/sk.yml +++ b/config/locales/sk.yml @@ -39,16 +39,18 @@ sk: other: príspevky status_count_before: Ktorí napísali tagline: Následuj kamarátov, a objavuj nových - terms: Podmienky užívania + terms: Podmienky užitia user_count_after: few: užívateľov - many: užívateľov + many: užívatelia one: užívateľ - other: uživatelia + other: užívateľov user_count_before: Domov pre what_is_mastodon: Čo je Mastodon? accounts: choices_html: "%{name}vé voľby:" + endorsements_hint: Môžeš ukázať sledovaných užívateľov, s ktorými si spriaznený/á cez webové rozhranie, a tí tu budú zobrazení. + featured_tags_hint: Môžeš zvýrazniť určité haštagy, ktoré tu budú zobrazené. follow: Následuj followers: few: Sledovateľov @@ -62,6 +64,7 @@ sk: media: Médiá moved_html: "%{name} účet bol presunutý na %{new_profile_link}:" network_hidden: Táto informácia nieje k dispozícii + never_active: Nikdy nothing_here: Nič tu nie je! people_followed_by: Ľudia, ktorých %{name} sleduje people_who_follow: Ľudia sledujúci %{name} @@ -434,6 +437,7 @@ sk: all: Všetkým disabled: Nikomu title: Ukáž blokované domény + users: Prihláseným, miestnym užívateľom domain_blocks_rationale: title: Ukáž zdôvodnenie hero: @@ -505,6 +509,7 @@ sk: delete: Vymaž nsfw_off: Označ ako nechúlostivé nsfw_on: Označ ako chúlostivé + deleted: Vymazané failed_to_execute: Nepodarilo sa vykonať media: title: Médiá @@ -572,6 +577,9 @@ sk: checkbox_agreement_without_rules_html: Súhlasím s podmienkami užívania delete_account: Vymaž účet delete_account_html: Pokiaľ chceš svoj účet odtiaľto vymazať, môžeš tak urobiť tu. Budeš požiadaný/á o potvrdenie tohto kroku. + description: + prefix_invited_by_user: "@%{name} ťa pozýva na tento Mastodon server!" + prefix_sign_up: Zaregistruj sa na Mastodone už dnes! didnt_get_confirmation: Neobdržal/a si kroky na potvrdenie? forgot_password: Zabudnuté heslo? invalid_reset_password_token: Token na obnovu hesla vypršal. Prosím vypítaj si nový. @@ -624,28 +632,38 @@ sk: deletes: bad_password_msg: Dobrý pokus, hakeri! Nesprávne heslo confirm_password: Napíšte svoje terajšie heslo pre overenie vašej identity - description_html: Týmto natrvalo, nenavrátiteľne vymažeš obsah tvojho účtu, a deaktivuješ ho. Tvoja prezývka ale ostane rezervovaná ako prevencia pred budúcimi impersonáciami. proceed: Vymaž účet success_msg: Tvoj účet bol úspešne vymazaný - warning_html: Iba vymazanie obsahu z tohto konkrétneho serveru je zaručené. Obsah, ktorý bol zdieľaný široko-ďaleko pravdepodobne zanechá nejaké stopy. Servery ktoré sú offline a tie ktoré ignorujú tvoje zmeny teda nezaktualizujú svoje databázy. - warning_title: Dostupnosť rozšírovaného obsahu + warning: + before: 'Predtým, než budeš pokračovať, prosím pozorne si prečítaj tieto poznámky:' + caches: Obsah, ktorý bol predčítaný inými servermi môže zanechať pozostatky + username_unavailable: Tvoja prezývka ostane neprístupná directories: directory: Katalóg profilov - enabled: Momentálne si uvedený/á na zozname profilov. - enabled_but_waiting: Vyjadril/a si záujem o uvedenie na zozname profilov, lenže ešte nemáš minimálny vyžadovaný počet následovateľov (%{min_followers}), aby si tam bol/a uveden/á. explanation: Pátraj po užívateľoch podľa ich záujmov explore_mastodon: Prebádaj %{title} - how_to_enable: Momentálne niesi zaradený/á do verejnej profilovej databázy. Prihlásiť sa môžeš nižšie. Použi haštagy vo svojom biografickom popise na profile, ak chceš byť uvedený/á aj pod konkrétnými haštagmi! - people: - few: "%{count} ľudí" - many: "%{count} ľudí" - one: "%{count} človek" - other: "%{count} ľudia" + domain_blocks: + blocked_domains: Zoznam obmedzovaných a blokovaných domén + description: Toto je zoznam serverov, ktorých federáciu %{instance} obmedzuje, alebo nepríjma. + domain: Doména + media_block: Blokovanie médií + no_domain_blocks: "(Žiadne domény niesú blokované)" + severity: Závažnosť + severity_legend: + media_block: Mediálne súbory zo servera niesú ani zachytávané, ani ukladané, či zobrazované užívateľovi. + suspension_disclaimer: Vylúčené servery sa môžu občas dostať k verejnému obsahu tohto servera. + title: Závažnosti + show_rationale: Ukáž zdôvodnenie + silence: Stíš + suspension: Vylúčenie + title: Zoznam instancií, ktoré blokuje %{instance} domain_validator: invalid_domain: nieje správny tvar domény errors: + '400': The request you submitted was invalid or malformed. '403': Nemáš povolenie pre zobrazenie tejto stránky. '404': Stránka ktorú hľadáš nieje tu. + '406': This page is not available in the requested format. '410': Stránka ktorú si tu hľadal/a sa tu už viac nenachádza. '422': content: Bezpečtnostné overenie zlyhalo. Blokuješ cookies? @@ -654,6 +672,7 @@ sk: '500': content: Ospravedlňujem sa. Niečo sa pokazilo na našom konci. title: Táto stránka nieje v poriadku + '503': The page could not be served due to a temporary server failure. noscript_html: Aby bolo možné používať Mastodon web aplikáciu, povoľ prosím JavaScript. Alebo skús jednu z aplikácii dostupných pre vašu platformu. existing_username_validator: not_found: nepodarilo sa nájsť miestného užívateľa s takouto prezývkou @@ -697,6 +716,7 @@ sk: developers: Vývojári more: Viac… resources: Podklady + trending_now: Teraz populárne generic: all: Všetko changes_saved_msg: Zmeny boli úspešne uložené! @@ -1034,6 +1054,7 @@ sk: silence: Kým máš účet obmedzený, tvoje príspevky na tomto serveri uvidia iba tí ľudia, ktorí ťa už následujú, a môžeš byť vylúčený/á z rôznych verejných záznamov. Ostatní ťa však stále budú môcť následovať manuálne. suspend: Tvoj účet bol vylúčený, a všetky tvoje príspevky a nahraté médiálné súbory boli nenávratne zmazané z tohto serveru, a zo serverov na ktorých si mal následovateľov. review_server_policies: Prehodnoť pravidlá servera + statuses: 'Konkrétne kvôli:' subject: disable: Tvoj účet %{acct} bol zamrazený none: Varovanie pre %{acct} diff --git a/config/locales/sl.yml b/config/locales/sl.yml index 3cab1313b..02507923b 100644 --- a/config/locales/sl.yml +++ b/config/locales/sl.yml @@ -593,26 +593,17 @@ sl: deletes: bad_password_msg: Lep poskus, hekerji! napačno geslo confirm_password: Vnesite svoje trenutno geslo, da potrdite svojo identiteto - description_html: S tem boste trajno, nepovratno odstranili vsebino iz vašega računa in jo deaktivirali. Vaše uporabniško ime bo ostalo rezervirano za preprečevanje prihodnjih lažnih predstav. proceed: Izbriši račun success_msg: Vaš račun je bil uspešno izbrisan - warning_html: Zagotovljeno je samo brisanje vsebine iz tega strežnika. Vsebina, ki je široko razširjena, bo verjetno pustila sledi. Strežniki brez povezave in strežniki, ki so se odjavili od vaših posodobitev, ne bodo posodabljali svojih podatkovnih baz. - warning_title: Razširjena razpoložljivost vsebine directories: directory: Imenik profilov - enabled: Trenutno ste navedeni v imeniku. - enabled_but_waiting: Vključili ste, da ste navedeni v imeniku, vendar še nimate najmanjšega števila sledilcev (%{min_followers}), da bi vas prikazalo. explanation: Odkrijte uporabnike glede na njihove interese explore_mastodon: Razišči %{title} - how_to_enable: Trenutno niste vključeni v imenik. Spodaj se lahko vključite. Uporabite ključnike v vaši biografiji, da boste navedeni pod specifične ključnike! - people: - few: "%{count} osebe" - one: "%{count} oseba" - other: "%{count} oseb" - two: "%{count} osebi" errors: + '400': The request you submitted was invalid or malformed. '403': Nimate dovoljenja za ogled te strani. '404': Iskana stran ne obstaja. + '406': This page is not available in the requested format. '410': Iskana stran ne obstaja več. '422': content: Varnostno preverjanje ni uspelo. Ali blokirate piškotke? @@ -621,6 +612,7 @@ sl: '500': content: Žal nam je, toda na našem koncu je prišlo do napake. title: Ta stran ni pravilna + '503': The page could not be served due to a temporary server failure. noscript_html: Če želite uporabljati spletno aplikacijo Mastodon, omogočite JavaScript. Druga možnost je, da za svojo platformo poskusite eno od lastnih aplikacij za Mastodon. existing_username_validator: not_found: s tem uporabniškim imenom ni bilo mogoče najti lokalnega uporabnika diff --git a/config/locales/sq.yml b/config/locales/sq.yml index 3373b6771..68754ea24 100644 --- a/config/locales/sq.yml +++ b/config/locales/sq.yml @@ -492,21 +492,17 @@ sq: deletes: bad_password_msg: Provë e bukur, trimosha! Fjalëkalim i pasaktë confirm_password: Jepni fjalëkalimin tuaj të tanishëm që të verifikohet identiteti juaj - description_html: Kjo të heqë në mënyrë të përhershme, të pakthyeshme lëndë nga llogaria juaj dhe do ta çaktivizojë atë. Emri juaj i përdoruesit do të mbetet i rezervuar për të shmangur sozi të ardhme. proceed: Fshini llogarinë success_msg: Llogaria juaj u fshi me sukses - warning_html: Garantohet vetëm fshirja e lëndës prej këtij shërbyesi të veçantë. Lënda që është ndarë gjerësisht me të tjerët ka gjasa të lërë gjurmë. Shërbyesit offline dhe shërbyesit që janë shpajtuar prej përditësimeve tuaja, s’do t’i përditësojnë bazat e tyre të të dhënave. - warning_title: Mund të ketë lëndë të përhapur directories: directory: Drejtori profilesh - enabled: Gjendeni te lista e drejtorisë. - enabled_but_waiting: Keni zgjedhur të jeni pjesë e drejtorisë, por ende s’keni numrin minimum të ndjekësve (%{min_followers}) për përfshirje në të. explanation: Zbuloni përdorues bazuar në interesat e tyre explore_mastodon: Eksploroni %{title} - how_to_enable: S’keni zgjedhur të jeni i pranishëm te drejtoria. Mund ta bëni më poshtë. Përdorni te teksti i jetëshkrimit tuaj hashtagë, për t’u përfshirë nën hashtagë specifikë! errors: + '400': The request you submitted was invalid or malformed. '403': S’keni leje të shihni këtë faqe. '404': Faqja që po kërkonit, s’gjendet këtu. + '406': This page is not available in the requested format. '410': Faqja që po kërkonit, s’gjendet më këtu. '422': content: Verifikimi i sigurisë dështoi. Mos i bllokoni gjë cookie-t? @@ -515,6 +511,7 @@ sq: '500': content: Na ndjeni, diçka shkoi ters në anën tonë. title: Kjo faqe s’është e saktë + '503': The page could not be served due to a temporary server failure. noscript_html: Që të përdorni aplikacionin web Mastodon, ju lutemi, aktivizoni JavaScript-in. Ndryshe, provoni për Mastodon-in një nga aplikacionet e brendshëm të platformës tuaj. exports: archive_takeout: diff --git a/config/locales/sr-Latn.yml b/config/locales/sr-Latn.yml index 6530d4c76..c4a319964 100644 --- a/config/locales/sr-Latn.yml +++ b/config/locales/sr-Latn.yml @@ -316,20 +316,20 @@ sr-Latn: deletes: bad_password_msg: Dobar pokušaj, hakeri! Neispravna lozinka confirm_password: Unesite trenutnu lozinku da bismo proverili Vaš identitet - description_html: Ovo će trajno, bespovratno ukloniti sadržaj sa Vašef naloga i deaktivirati ga. Vaše korisničko ime će ostati rezervisano da se spreči da se neko ne predstavlja kao Vi sutra. proceed: Obriši nalog success_msg: Vaš nalog je uspešno obrisan - warning_html: Garantovano je samo brisanje sadržaja sa ove instance. Sadržaj koji je deljen dalje će verovatno da ostavi neke tragove. Nedostupni i ugašeni serveri, kao i serveri koji su odjavljeni od primanja statusa od Vas, neće ažurirati svoje baze. - warning_title: Dostupnost rasejanog sadržaja errors: + '400': The request you submitted was invalid or malformed. '403': Nemate dozvola da vidite ovu stranu. '404': Strana koju ste tražili ne postoji. + '406': This page is not available in the requested format. '410': Strana koju ste tražili više ne postoji. '422': '429': Uspored '500': content: Izvinjavamo se, nešto je pošlo po zlu sa ove strane. title: Strana nije ispravna + '503': The page could not be served due to a temporary server failure. noscript_html: Da biste koristili Mastodont veb aplikaciju, omogućite JavaScript. U suprotnom, probajte neku od originalnih aplikacija za Mastodont za Vašu platformu. exports: blocks: Blokirali ste diff --git a/config/locales/sr.yml b/config/locales/sr.yml index ba83f0378..992311201 100644 --- a/config/locales/sr.yml +++ b/config/locales/sr.yml @@ -512,23 +512,17 @@ sr: deletes: bad_password_msg: Добар покушај, хакери! Неисправна лозинка confirm_password: Унесите тренутну лозинку да бисмо проверили Ваш идентитет - description_html: Ово ће трајно, бесповратно уклонити садржај са Вашеф налога и деактивирати га. Ваше корисничко име ће остати резервисано да се спречи да се неко не представља као Ви сутра. proceed: Обриши налог success_msg: Ваш налог је успешно обрисан - warning_html: Гарантовано је само брисање садржаја са ове инстанце. Садржај који је дељен даље ће вероватно да остави неке трагове. Недоступни и угашени сервери, као и сервери који су одјављени од примања статуса од Вас, неће ажурирати своје базе. - warning_title: Доступност расејаног садржаја directories: directory: Профил фасцикле - enabled: Ви сте тренутно видљиви у фасцикли. explanation: Откријте кориснике на основу њихових интереса explore_mastodon: Истражи %{title} - people: - few: "%{count} људе" - one: "%{count} особа/е" - other: "%{count} људи" errors: + '400': The request you submitted was invalid or malformed. '403': Немате дозвола да видите ову страну. '404': Страна коју сте тражили не постоји. + '406': This page is not available in the requested format. '410': Страна коју сте тражили више не постоји. '422': content: Безбедоносна провера није успела. Да не блокирате колачиће? @@ -537,6 +531,7 @@ sr: '500': content: Извињавамо се, нешто је пошло по злу са ове стране. title: Страна није исправна + '503': The page could not be served due to a temporary server failure. noscript_html: Да бисте користили Мастодонт веб апликацију, омогућите JavaScript. У супротном, пробајте неку од оригиналних апликација за Мастодонт за Вашу платформу. exports: archive_takeout: diff --git a/config/locales/sv.yml b/config/locales/sv.yml index 3978f6d11..029704671 100644 --- a/config/locales/sv.yml +++ b/config/locales/sv.yml @@ -379,14 +379,13 @@ sv: deletes: bad_password_msg: Bra försök, hackare! Fel lösenord confirm_password: Ange ditt lösenord för att verifiera din identitet - description_html: Detta vill permanent, irreversibelt ta bort innehåll från ditt konto och avaktivera det. Ditt användarnamn kommer att förbli reserverat för att förhindra framtida efterföljare. proceed: Ta bort konto success_msg: Ditt konto har tagits bort - warning_html: Endast borttagning av innehåll från denna speciella instans garanteras. Innehåll som har delats i stor utsträckning kommer sannolikt att lämna spår. Offline-servrar och servrar som har avstängt från dina uppdateringar uppdaterar inte sina databaser. - warning_title: Spridet innehåll och tillgänglighet errors: + '400': The request you submitted was invalid or malformed. '403': Du har inte behörighet att visa den här sidan. '404': Sidan du letade efter existerar inte. + '406': This page is not available in the requested format. '410': Sidan du letade efter existerar inte längre. '422': content: Säkerhetsverifiering misslyckades Blockerar du cookies? @@ -395,6 +394,7 @@ sv: '500': content: Vi är ledsna, men något gick fel från vårat håll. title: Den här sidan är inte korrekt + '503': The page could not be served due to a temporary server failure. noscript_html: För att använda Mastodon webbapplikationen, vänligen aktivera JavaScript. Alternativt kan du prova en av inhemska appar för Mastodon för din plattform. exports: archive_takeout: diff --git a/config/locales/ta.yml b/config/locales/ta.yml index eef06fa7c..75bb81fad 100644 --- a/config/locales/ta.yml +++ b/config/locales/ta.yml @@ -1,12 +1,15 @@ --- ta: errors: + '400': The request you submitted was invalid or malformed. '403': You don't have permission to view this page. '404': The page you are looking for isn't here. + '406': This page is not available in the requested format. '410': The page you were looking for doesn't exist here anymore. '422': '429': Throttled '500': + '503': The page could not be served due to a temporary server failure. invites: expires_in: '1800': 30 minutes diff --git a/config/locales/te.yml b/config/locales/te.yml index d4a2f507d..560a295a6 100644 --- a/config/locales/te.yml +++ b/config/locales/te.yml @@ -113,12 +113,15 @@ te: most_recent_activity: ఇటీవల యాక్టివిటీ most_recent_ip: ఇటీవలి IP errors: + '400': The request you submitted was invalid or malformed. '403': You don't have permission to view this page. '404': The page you are looking for isn't here. + '406': This page is not available in the requested format. '410': The page you were looking for doesn't exist here anymore. '422': '429': Throttled '500': + '503': The page could not be served due to a temporary server failure. invites: expires_in: '1800': 30 minutes diff --git a/config/locales/th.yml b/config/locales/th.yml index 73e6fb178..f27c06617 100644 --- a/config/locales/th.yml +++ b/config/locales/th.yml @@ -428,11 +428,11 @@ th: directory: ไดเรกทอรีโปรไฟล์ explanation: ค้นพบผู้ใช้ตามความสนใจของเขา explore_mastodon: สำรวจ %{title} - people: - other: "%{count} คน" errors: + '400': The request you submitted was invalid or malformed. '403': คุณไม่มีสิทธิอนุญาตเพื่อดูหน้านี้ '404': หน้าที่คุณกำลังมองหาไม่ได้อยู่ที่นี่ + '406': This page is not available in the requested format. '410': หน้าที่คุณกำลังมองหาไม่มีอยู่ที่นี่อีกต่อไป '422': content: การตรวจสอบความปลอดภัยล้มเหลว คุณกำลังปิดกั้นคุกกี้หรือไม่? @@ -440,6 +440,7 @@ th: '429': Throttled '500': title: หน้านี้ไม่ถูกต้อง + '503': The page could not be served due to a temporary server failure. exports: archive_takeout: date: วันที่ diff --git a/config/locales/tr.yml b/config/locales/tr.yml index d9e7ce333..550b1cc49 100644 --- a/config/locales/tr.yml +++ b/config/locales/tr.yml @@ -4,24 +4,39 @@ tr: about_hashtag_html: Bunlar #%{hashtag}X ile etiketlenen genel paylaşımlar. Açık alanda herhangi bir yerde bir hesabınız varsa, onlarla etkileşime geçebilirsiniz. about_mastodon_html: Mastodon ücretsiz ve açık kaynaklı bir sosyal ağdır. Merkezileştirilmemiş yapısı sayesinde diğer ticari sosyal platformların aksine iletişimininizin tek bir firmada tutulmasının/yönetilmesinin önüne geçer. Güvendiğiniz bir sunucuyu seçerek oradaki kişilerle etkileşimde bulunabilirsiniz. Herkes kendi Mastodon sunucusunu kurabilir ve sorunsuz bir şekilde Mastodon sosyal ağına dahil edebilir. about_this: Bu sunucu hakkında + active_count_after: etkin + active_footnote: Aylık Aktif Kullanıcılar (AAK) administered_by: 'Tarafından yönetildi:' + api: API apps: Mobil uygulamalar + apps_platforms: İos, Android ve diğer platformlardaki Mastodon'u kullanın + browse_directory: Bir profil dizinine göz atın ve ilgi alanlarına göre filtreleyin + browse_public_posts: Mastodon'daki herkese açık yayınlara göz atın contact: İletişim contact_missing: Ayarlanmadı contact_unavailable: Yok + discover_users: Kullanıcıları keşfet documentation: Belgeler extended_description_html: |

Kural için iyi bir yer

Genişletilmiş açıklama henüz ayarlanmamış.

+ federation_hint_html: "%{instance} hesabınızla, herhangi bir Mastodon sunucusundaki ve haricindeki kişileri takip edebilirsiniz." generic_description: "%{domain} ağdaki bir sunucudur" + get_apps: Bir mobil uygulamayı deneyin hosted_on: Mastodon %{domain} üzerinde barındırılıyor + instance_actor_flash: | + Bu hesap, herhangi bir kullanıcıyı değil sunucunun kendisini temsil etmek için kullanılan sanal bir aktördür. + Federasyon amaçlı kullanılır ve tüm yansıyı engellemek istemediğiniz sürece engellenmemelidir; bu durumda bir etki alanı bloğu kullanmanız gerekir. learn_more: Daha fazla bilgi edinin privacy_policy: Gizlilik politikası + see_whats_happening: Neler olduğunu görün + server_stats: 'Sunucu istatistikleri:' source_code: Kaynak kodu status_count_after: one: durum other: durum status_count_before: Şu ana kadar + tagline: Arkadaşlarını takip et ve yenilerini keşfet terms: Kullanım şartları user_count_after: one: kullanıcı @@ -30,27 +45,36 @@ tr: what_is_mastodon: Mastodon nedir? accounts: choices_html: "%{name} seçimleri:" + endorsements_hint: Takip ettiğiniz kişileri web arayüzünden onaylayabilirsiniz, burada görünecekler. + featured_tags_hint: Burada görüntülenecek belirli etiketlere sahip olabilirsiniz. follow: Takip et followers: one: Takipçi other: Takipçi following: Takip ediliyor joined: "%{date} tarihinde katıldı" + last_active: son aktivite link_verified_on: Bu bağlantının mülkiyeti %{date} tarihinde kontrol edildi media: Medya moved_html: "%{name}, %{new_profile_link} adresine taşındı:" network_hidden: Bu bilgi mevcut değil + never_active: Asla nothing_here: Burada henüz hiçbir gönderi yok! people_followed_by: Kullanıcı %{name}'in takip ettikleri people_who_follow: Kullanıcı %{name}'i takip edenler pin_errors: following: Onaylamak istediğiniz kişiyi zaten takip ediyor olmalısınız + posts: + one: Gönderi + other: Tootlar posts_tab_heading: Tootlar posts_with_replies: Tootlar ve yanıtlar reserved_username: Kullanıcı adı saklıdır roles: admin: Yönetici + bot: Bot moderator: Denetleyici + unavailable: Profil kullanılamıyor unfollow: Takibi bırak admin: account_actions: @@ -61,7 +85,10 @@ tr: delete: Sil destroyed_msg: Denetim notu başarıyla yok edildi! accounts: + approve: Onayla + approve_all: Tümünü onayla are_you_sure: Emin misiniz? + avatar: Avatar by_domain: Sunucu change_email: changed_msg: Hesap e-postası başarıyla değiştirildi! @@ -74,6 +101,7 @@ tr: confirmed: Onaylandı confirming: Onaylama deleted: Silinen + demote: Düşür disable: Devre dışı disable_two_factor_authentication: 2AD kapat disabled: Kapalı @@ -91,6 +119,7 @@ tr: header: Üstbilgi inbox_url: Gelen kutusu bağlantısı invited_by: Tarafından davet edildi + ip: IP joined: Katıldı location: all: Hepsi @@ -101,14 +130,20 @@ tr: media_attachments: Medya ekleri memorialize: Bir hatıraya dön moderation: + active: Etkin all: Hepsi + pending: Bekliyor silenced: Susturulanlar suspended: Uzaklaştırılanlar title: Yönetim moderation_notes: Denetleme notları most_recent_activity: Son aktivite most_recent_ip: Son IP + no_account_selected: Hiçbiri seçilmediğinden hiçbir hesap değiştirilmedi + no_limits_imposed: Sınır koymaz not_subscribed: Abone edilmedi + outbox_url: Giden Kutusu URL'si + pending: Bekleyen yorum perform_full_suspension: Askıya al profile_url: Profil linki promote: Yükselt @@ -116,6 +151,8 @@ tr: public: Herkese açık push_subscription_expires: PuSH aboneliği dolumu redownload: Profili yenile + reject: Reddet + reject_all: Tümünü reddet remove_avatar: Avatarı kaldır remove_header: Üstbilgiyi kaldır resend_confirmation: @@ -142,6 +179,7 @@ tr: statuses: Durumlar subscribe: Abone ol suspended: Askıya alındı + time_in_queue: "%{time} kuyruğunda bekliyor" title: Hesaplar unconfirmed_email: Onaylanmamış e-posta undo_silenced: Susturmayı geri al @@ -149,25 +187,98 @@ tr: unsubscribe: Abonelikten çık username: Kullanıcı adı warn: Uyar + web: Web + whitelisted: Beyaz listede action_logs: actions: + assigned_to_self_report: "%{name} kendilerine %{target} adlı raporu verdi" + change_email_user: "%{name}, %{target} kullanıcısının e-posta adresini değiştirdi" confirm_user: "%{name} %{target} kullanıcısının e-posta adresini onayladı" + create_account_warning: "%{name} %{target} 'a bir uyarı gönderdi" create_custom_emoji: "%{name} yeni ifade yükledi %{target}" + create_domain_block: "%{target} alanı, %{name} tarafından engellendi" + create_email_domain_block: "%{target} e-posta alanı, %{name} tarafından kara listeye alınmış" + destroy_custom_emoji: "%{target} emoji, %{name} tarafından kaldırıldı" + destroy_domain_block: "%{target} alan adının engeli %{name} tarafından kaldırıldı" + destroy_email_domain_block: "%{target} e-posta sunucusu, %{name} tarafından beyaz listeye alındı" disable_2fa_user: "%{name}, %{target} kullanıcısı için iki adım gereksinimini kapattı" + disable_custom_emoji: "%{target} emoji, %{name} tarafından devre dışı bırakıldı" + deleted_status: "(silinmiş durum)" + title: Denetim günlüğü + custom_emojis: + by_domain: Alan adı + copied_msg: Emojinin yerel kopyası başarıyla oluşturuldu + copy: Kopyala + copy_failed_msg: Bu emojinin yerel bir kopyası oluşturulamadı + create_new_category: Yeni kategori ekle + created_msg: Emoji başarıyla oluşturuldu! + delete: Sil + destroyed_msg: Emojo başarıyla yok edildi! + disable: Devre dışı bırak + disabled_msg: Bu emoji başarıyla devre dışı bırakıldı + emoji: İfadeler + enable: Etkinleştir + enabled_msg: Bu emojiyi başarıyla etkinleştirdi + image_hint: 50 KB'a kadar PNG + listed: Listelenen + new: + title: Yeni özel emoji ekle + overwrite: Üzerine yaz + shortcode_hint: En az 2 karakter, sadece alfanümerik karakterler ve alt çizgiler + title: Özel emojiler + uncategorized: Kategorilenmemiş + unlisted: Listelenmemiş + updated_msg: Emoji başarıyla güncellendi! + upload: Yükle + dashboard: + config: Yapılandırma + feature_deletions: Hesap silme + feature_profile_directory: Profil dizini + feature_registrations: Kayıtlar + feature_spam_check: Anti-spam + feature_timeline_preview: Zaman çizelgesi önizlemesi + features: Özellikler + hidden_service: Gizli servislere sahip federasyon + open_reports: raporları aç + pending_tags: inceleme için bekleyen hashtag'ler + pending_users: inceleme için bekleyen kullanıcılar + recent_users: Son kullanıcılar + search: Tam metin araması + single_user_mode: Tek kullanıcı modu + software: Yazılım + space: Alan kullanımı + title: Kontrol Paneli + total_users: toplam kullanıcı + trends: Trendler + week_interactions: bu haftaki etkileşimler + week_users_active: bu hafta aktif + week_users_new: bu hafta kullanıcılar + whitelist_mode: Beyaz liste modu + domain_allows: + created_msg: Alan adı başarıyla beyaz listeye alındı + destroyed_msg: Alan adı beyaz listeden kaldırıldı + undo: Beyaz listeden çıkar domain_blocks: add_new: Yeni ekle created_msg: Domain bloğu şu an işleniyor destroyed_msg: Domain bloğu silindi + domain: Alan adı + edit: Etki alanı bloğunu düzenle + existing_domain_block_html: '%{name}''e zaten daha katı sınırlar uyguladınız, önce engellemesini kaldırmanız gerekiyor.' new: create: Yeni blok oluştur hint: Domain bloğu, veri tabanında hesap kayıtlarının oluşturulmasını engellemez, fakat o hesapların üzerine otomatik olarak belirli yönetim metodlarını olarak uygular. severity: desc_html: "Susturma, uygulanan hesabın gönderilerini, o hesabı takip etmeyen diğer herkese gizler. Uzaklaştırma hesabın bütün içeriğini, ortam dosyalarını ve profil verisini siler." + noop: Yok silence: Sustur suspend: Uzaklaştır title: Yeni domain bloğu + private_comment: Özel yorum + public_comment: Genel yorum reject_media: Ortam dosyalarını reddetme reject_media_hint: Yerel olarak depolanmış ortam dosyalarını ve gelecekte indirilecek olanları reddeder. Uzaklaştırma için uygun değildir + reject_reports: Raporları reddet show: affected_accounts: one: Veritabanındaki bir hesap etkilendi @@ -178,12 +289,43 @@ tr: title: "%{domain} domain'i için yapılan işlemi geri al" undo: Geri al undo: Geri al + email_domain_blocks: + add_new: Yeni ekle + delete: Sil + domain: Alan adı + new: + create: Alan adı ekle + title: E-posta kara listesi + followers: + back_to_account: Hesaba Geri Dön + title: "%{acct} Takipçileri" instances: + by_domain: Alan adı + known_accounts: + one: "%{count} bilinen hesap" + other: "%{count} bilinen hesap" + moderation: + all: Tümü title: Bilinen Sunucular + invites: + filter: + all: Tümü + relays: + delete: Sil + disable: Devre dışı + enabled: Etkin reports: + account: + note: not + report: şikayet + action_taken_by: tarafından gerçekleştirilen eylem + are_you_sure: Emin misiniz? comment: none: Yok mark_as_resolved: Giderildi olarak işaretle + notes: + create: Not Ekle + delete: Sil report: 'Şikayet #%{id}' reported_account: Şikayet edilen hesap reported_by: Şikayet eden @@ -192,13 +334,38 @@ tr: title: Şikayetler unresolved: Giderilmedi settings: + activity_api_enabled: + title: Kullanıcı etkinliği hakkında toplu istatistikler yayınlayın contact_information: email: Herkese açık e-posta adresiniz username: Bir kullanıcı adı giriniz + custom_css: + title: Özel CSS + domain_blocks: + all: Herkes için + domain_blocks_rationale: + title: Gerekçeyi göster + hero: + title: Kahraman görseli + mascot: + title: Maskot görseli + preview_sensitive_media: + desc_html: Medya duyarlı olarak işaretlenmiş olsa bile, diğer web sitelerindeki bağlantı ön izlemeleri küçük resim gösterecektir + title: OpenGraph ön izlemelerinde hassas medyayı göster + profile_directory: + desc_html: Kullanıcıların keşfedilebilir olmasına izin ver + title: Profil dizinini etkinleştir registrations: closed_message: desc_html: Kayıt alımları kapatıldığında ana sayfada görüntülenecek mesajdır.
HTML etiketleri kullanabilirsiniz title: Kayıt alımları kapatılma mesajı + min_invite_role: + title: tarafından yapılan davetlere izin ver + registrations_mode: + modes: + approved: Kayıt için onay gerekli + none: Hiç kimse kayıt olamaz + open: Herkes kaydolabilir site_description: desc_html: Ana sayfada paragraf olarak görüntülenecek bilgidir.
Özellikle <a> ve <em> olmak suretiyle HTML etiketlerini kullanabilirsiniz. title: Site açıklaması @@ -207,6 +374,8 @@ tr: title: Sunucu hakkında detaylı bilgi site_title: Site başlığı title: Site Ayarları + statuses: + no_status_selected: Hiçbiri seçilmediğinden hiçbir durum değiştirilmedi tags: title: Etiketler title: Yönetim @@ -214,16 +383,40 @@ tr: add_new: Yeni ekle delete: Sil edit: Düzenle + appearance: + advanced_web_interface_hint: 'Tüm ekran genişliğinizden yararlanmak istiyorsanız, gelişmiş web arayüzü istediğiniz kadar bilgi görecek kadar çok sayıda farklı sütunu yapılandırmanıza olanak tanır: Anasayfa, bildirimler, birleşik zaman çizelgesi, istediğiniz sayıda liste ve etiket.' + animations_and_accessibility: Animasyonlar ve erişilebilirlik + confirmation_dialogs: Onay iletişim kutuları + discovery: Keşfet + sensitive_content: Hassas içerik application_mailer: + notification_preferences: E-posta tercihlerini değiştir + salutation: "%{name}," settings: 'E-mail tercihlerini değiştir: %{link}' view: 'Görüntüle:' + view_profile: Profili Görüntüle + view_status: Durumu görüntüle applications: + created: Uygulama başarıyla oluşturuldu + destroyed: Uygulama başarıyla silindi invalid_url: Verilen URL geçerli değil + regenerate_token: Erişim belirtecini yeniden oluştur + warning: Bu verilere çok dikkat edin. Asla kimseyle paylaşmayın! + your_token: Erişim belirteciniz auth: + apply_for_account: Davet et + change_password: Parola + checkbox_agreement_html: sunucu kuralları vehizmet şartlarını kabul ediyorum + checkbox_agreement_without_rules_html: Hizmet şartlarını kabul ediyorum + delete_account: Hesabı sil + delete_account_html: Hesabınızı silmek isterseniz, buradan devam edebilirsiniz. Sizden onay istenecektir. didnt_get_confirmation: Hesap doğrulama mailini almadınız mı? forgot_password: Parolanızı unuttunuz mu? + invalid_reset_password_token: Parola sıfırlama belirteci geçersiz veya süresi dolmuş. Lütfen yeni bir tane talep edin. login: Giriş yap logout: Çıkış + migrate_account_html: Bu hesabı başka bir hesaba yönlendirmek istiyorsanız, buradan yapılandırabilirsiniz. + or_log_in_with: Veya giriş yapın register: Üye ol resend_confirmation: Doğrulama mailini tekrar gönder reset_password: Parolayı değiştir @@ -247,20 +440,68 @@ tr: x_minutes: "%{count}dk" x_months: "%{count}ay" x_seconds: "%{count}sn" + directories: + directory: Profil dizini + explanation: Kullanıcıları ilgi alanlarına göre keşfedin + explore_mastodon: "%{title} keşfet" + domain_blocks: + blocked_domains: Sınırlı ve engellenen alanların listesi + description: Bu, %{instance} öğesinin sınırladığı veya federasyonu reddettiği sunucuların listesidir. + domain: Alan adı + severity_legend: + media_block: Sunucudan gelen medya dosyaları alınmaz, saklanmaz veya kullanıcıya gösterilmez. + silence: Susturulmuş sunuculardaki hesaplar bulunabilir, takip edilebilinir ve onlarla etkileşime girilebilinir, ancak gönderileri genel zaman çizelgelerinde görünmez ve onlardan gelen bildirimler onları takip etmeyen yerel kullanıcılara ulaşmaz. + show_rationale: Gerekçeyi göster + domain_validator: + invalid_domain: geçerli bir alan adı değil errors: + '400': Gönderdiğiniz istek geçersiz veya hatalı biçimlendirilmiş. '403': Bu sayfayı görmek için izniniz yok. '404': Aradığınız sayfa bulunamadı. + '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 '429': Throttled - '500': + '500': + content: Üzgünüz, ancak bir şey ters gitti. + title: Bu sayfa doğru değil + '503': Geçici sunucu hatası nedeniyle sayfa görüntülenemedi. + noscript_html: Mastodon web uygulamasını kullanmak için lütfen JavaScript'i etkinleştirin. Alternatif olarak, platformunuz için Mastodon yerel uygulamalardan birini deneyin. + existing_username_validator: + not_found: bu kullanıcı adına sahip yerel bir kullanıcı bulunamadı exports: + archive_takeout: + date: Tarih + download: Arşivinizi indirin + hint_html: "Gönderileriniz ve yüklediğiniz ortamların bir arşivini talep edebilirsiniz. Dışa aktarılan veriler, herhangi bir uyumlu yazılım tarafından okunabilen ActivityPub formatında olacaktır. Her 7 günde bir arşiv talep edebilirsiniz." + in_progress: Arşivinizi derliyoruz... + size: Boyut blocks: Blokladıklarınız + csv: CSV follows: Takip ettikleriniz + lists: Listeler mutes: Susturduklarınız storage: Ortam deposu + featured_tags: + add_new: Yeni ekle + errors: + limit: Zaten azami hashtag miktarı belirlediniz + hint_html: "Öne çıkan etiketler nelerdir? Genel profilinizde belirgin bir şekilde görüntülenirler ve kişilerin genel yayınlarınıza özellikle bu etiketler altında göz atmalarına izin verir. Yaratıcı çalışmaları veya uzun vadeli projeleri takip etmek için harika bir araçtır." + filters: + contexts: + home: Ana zaman çizelgesi + notifications: Bildirimler + public: Genel zaman çizelgesi + thread: Sohbetler + edit: + title: Filtreyi düzenle + index: + delete: Sil + title: Filtreler + new: + title: Yeni filtre ekle generic: changes_saved_msg: Değişiklikler başarıyla kaydedildi! save_changes: Değişiklikleri kaydet @@ -281,14 +522,33 @@ tr: '21600': 6 hours '3600': 1 hour '43200': 12 hours - '604800': 1 week - '86400': 1 day + '604800': 1 hafta + '86400': 1 gün + expires_in_prompt: Asla + generate: Oluştur + invited_by: 'Tarafından davet edildi:' + max_uses: + one: 1 kullanım + other: "%{count} kullanım" + max_uses_prompt: Limit yok + prompt: Bu sunucuya erişim vermek için bağlantılar oluşturun ve başkalarıyla paylaşın + table: + expires_at: Bitiş tarihi + uses: Kullanım + title: İnsanları davet et media_attachments: validations: images_and_video: Halihazırda görsel içeren bir gönderiye video ekleyemezsiniz too_many: 4'ten fazla dosya ekleyemezsiniz + migrations: + currently_redirecting: 'Profiliniz yönlendirmek üzere ayarlandı:' + proceed: Kaydet + updated_msg: Hesap taşıma ayarınız başarıyla güncellendi! + moderation: + title: Yönetim notification_mailer: digest: + action: Tüm bildirimleri görüntüle body: Son ziyaretiniz olan %{since}'den beri'da kaçırdığınız şeylerin özeti mention: "%{name} senden bahsetti:" new_followers_summary: @@ -297,41 +557,129 @@ tr: subject: one: "Son ziyaretinizden beri 1 yeni bildiriminiz var \U0001F418" other: "Son ziyaretinizden beri %{count} yeni bildiriminiz var \U0001F418" + title: Senin yokluğunda... favourite: body: "%{name} durumunuzu favorilere ekledi:" subject: "%{name} favorilere ekledi" + title: Yeni favori follow: body: "%{name} sizi takip etmeye başladı!" subject: "%{name} sizi takip etmeye başladı" + title: Yeni takipçi follow_request: + action: Takip isteklerini yönet body: "%{name} size takip isteği gönderdi" subject: 'Takip isteği: %{name}' + title: Yeni takip isteği mention: + action: Yanıt body: "%{name} sizden bahsetti:" subject: "%{name} sizden bahsetti" reblog: body: "%{name} durumunuzu boost etti:" subject: "%{name} durumunuzu boost etti" + title: Yeni gönderi + number: + human: + decimal_units: + format: "%n%u" + units: + billion: B + million: M + quadrillion: Q + thousand: K + trillion: T pagination: + newer: Daha yeni next: Sonraki + older: Daha Eski prev: Önceki + truncate: "…" + polls: + errors: + already_voted: Bu ankete daha önce oy verdiniz + expired: Anket çoktan sona erdi + over_character_limit: her biri %{max} karakterden daha uzun olamaz + too_few_options: birden fazla öğeye sahip olmalı + too_many_options: "%{max} öğeden fazla öğe içeremez" + preferences: + other: Diğer + relationships: + activity: Hesap etkinliği + last_active: Son aktivite + most_recent: En son remote_follow: acct: Takip edeceğiniz kişiyi kullaniciadi@sunuculinki şeklinde giriniz missing_resource: Hesabınız için yönlendirme linki bulunamadı proceed: Takip onayı prompt: Bu kullanıcıyı takip etmek istediğinize emin misiniz? + sessions: + ip: IP + platforms: + adobe_air: Adobe Air + android: Android + blackberry: Blackberry + chrome_os: ChromeOS + firefox_os: Firefox OS + ios: iOS + linux: GNU/Linux + mac: Mac + other: bilinmeyen platform + windows: Windows + windows_mobile: Windows Mobil + windows_phone: Windows Phone + revoke: İptal + revoke_success: Oturum başarıyla iptal edildi + title: Oturumlar settings: + account: Hesap + account_settings: Hesap ayarları + appearance: Görünüm authorized_apps: Yetkilendirilen uygulamalar back: Mastodon'a geri dön + delete: Hesap silme + development: Geliştirme edit_profile: Profili düzenle export: Dışa aktar + featured_tags: Öne çıkan hashtag'ler + identity_proofs: Kimlik belgesi import: İçe aktar + import_and_export: İçe al ve dışarı aktar + migrate: Hesap taşıma + notifications: Bildirim preferences: Tercihler + profile: Profil + relationships: Takip edilenler ve takipçiler two_factor_authentication: İki-faktörlü doğrulama statuses: + attached: + description: 'Ekli: %{attached}' + image: + one: "%{count} görsel" + other: "%{count} görsel" + video: + one: "%{count} video" + other: "%{count} video" + boosted_from_html: "%{acct_link} den yinelendi" + content_warning: 'İçerik uyarısı: %{warning}' + disallowed_hashtags: + one: 'izin verilmeyen bir etiket içeriyordu: %{tags}' + other: 'izin verilmeyen hashtag''leri içeriyordu: %{tags}' + language_detection: Dili otomatik olarak algıla open_in_web: Web sayfasında aç over_character_limit: "%{max} karakter limiti aşıldı" + pin_errors: + ownership: Başkasının gönderisi sabitlenemez + private: Halka açık olmayan gönderi sabitlenemez + reblog: Bir yineleme sabitlenemez + poll: + total_votes: + one: "%{count} oy" + other: "%{count} oy" + vote: Oy show_more: Daha fazla + sign_in_to_participate: Sohbete katılmak için oturum açın + title: '%{name}: "%{quote}"' visibilities: private: Sadece takipçiler private_long: Sadece takipçilerime gönder @@ -340,8 +688,16 @@ tr: unlisted: Listelenmemiş unlisted_long: Herkes görebilir fakat herkese açık zaman tünellerinde listelenmez stream_entries: + pinned: Sabitlenmiş gönderi reblogged: boost edildi sensitive_content: Hassas içerik + tags: + does_not_match_previous_name: önceki adla eşleşmiyor + terms: + title: "%{instance} Hizmet Şartları ve Gizlilik Politikası" + themes: + contrast: Mastodon (Yüksek karşıtlık) + default: Mastodon (Karanlık) two_factor_authentication: code_hint: Onaylamak için kimlik doğrulama uygulamanızın oluşturduğu kodu giriniz description_html: Eğer iki-faktörlü kimlik doğrulamayı aktif ederseniz, giriş yaparken sizin için giriş kodu üreten telefonunuza ihtiyaç duyacaksınız. diff --git a/config/locales/uk.yml b/config/locales/uk.yml index ac3ce62dd..564b21db1 100644 --- a/config/locales/uk.yml +++ b/config/locales/uk.yml @@ -62,6 +62,7 @@ uk: media: Медіа moved_html: "%{name} переїхав до %{new_profile_link}:" network_hidden: Ця інформація недоступна + never_active: Ніколи nothing_here: Тут нічого немає! people_followed_by: Люди, на яких підписаний(-а) %{name} people_who_follow: Підписники %{name} @@ -432,6 +433,12 @@ uk: custom_css: desc_html: Відобразити вигляд, коли CSS завантажено для кожної сторінки title: Користувацький CSS + domain_blocks: + all: Всi + disabled: Нікого + title: Показати, які домени заблоковані + domain_blocks_rationale: + title: Обґрунтування hero: desc_html: Відображається на головній сторінці. Рекомендовано як мінімум 600x100 пікселів. Якщо не вказано, буде використано передпоказ інстанції title: Банер інстанції @@ -501,6 +508,7 @@ uk: delete: Видалити nsfw_off: Відмітити прийнятним nsfw_on: Відмітити неприйнятним + deleted: Видалено failed_to_execute: Не вийшло media: title: Медіа @@ -541,6 +549,7 @@ uk: subject: Новий хештеґ надіслано на розгляд до %{instance} (#%{name}) appearance: advanced_web_interface: Розширений web-інтерфейс + advanced_web_interface_hint: 'Розширений веб-інтерфейс дає змогу бачити багато стовпчиків одночасно: основна сторінка, сповіщення, глобальна стрічка, будь-які списки та хештеґи. Потребує широкого екрана.' animations_and_accessibility: Анімація та доступність confirmation_dialogs: Діалоги підтвердження discovery: Виявлення @@ -567,6 +576,10 @@ uk: checkbox_agreement_without_rules_html: Я погоджуюся з умовами використання delete_account: Видалити обліковий запис delete_account_html: Якщо ви хочете видалити свій обліковий запис, ви можете перейти сюди. Вас попросять підтвердити дію. + description: + prefix_invited_by_user: "@%{name} запрошує вас приєднатися до цього сервера Mastodon!" + prefix_sign_up: Зареєструйтеся на Mastodon сьогодні! + suffix: Маючи обліковий запис, ви зможете підписуватися на людей, публікувати пости та листуватися з користувачами будь-якого сервера Mastodon! didnt_get_confirmation: Ви не отримали інструкції з підтвердження? forgot_password: Забули пароль? invalid_reset_password_token: Токен скидання паролю неправильний або просрочений. Спробуйте попросити новий. @@ -622,26 +635,41 @@ uk: deletes: bad_password_msg: Гарна спроба, гакери! Неправильний пароль confirm_password: Введіть актуальний пароль, щоб перевірити що ви це ви - description_html: Це безповоротно і назавжди видалить контент з вашого облікового запису та деактивує його. Ваше ім'я користувача буде залишатися зарезервованим для запобігання можливим підмінам особи. proceed: Видалити обліковий запис success_msg: Ваш обліковий запис було успішно видалено - warning_html: Ми можемо гарантувати видалення контенту лише з цього сайту. Контент, що був поширений, залишає сліди. Сервери, що є офлайн та ті, що відписалися від наших оновлень, не запишуть змін до своїх баз даних. - warning_title: Про доступність поширеного контенту + warning: + before: 'До того як продовжити, будь ласка уважно прочитайте це:' + caches: Інформація, кешована іншими серверами, може залишитися + data_removal: Ваші пости та інші дані будуть видалені назавжди + email_change_html: Ви можете змінити вашу електронну адресу, не видаляючи ваш обліковий запис + email_contact_html: Якщо його все ще немає, ви можете написали до %{email} для допомоги + email_reconfirmation_html: Якщо ви не отримали електронного листа з підтвердженням, ви можете запросити його знову + irreversible: Буде неможливо відновити ваш обліковий запис + more_details_html: Подробиці за посиланням політика конфіденційності. + username_available: Ваше ім'я користувача стане доступним для використання + username_unavailable: Ваше ім'я користувача залишиться недоступним для використання directories: directory: Каталог профілів - enabled: Ви вже присутні у цьому каталозі. explanation: Шукайте користувачів за їх інтересами explore_mastodon: Досліджуйте %{title} - people: - few: "%{count} людей" - many: "%{count} людей" - one: "%{count} людина" - other: "%{count} люди" + domain_blocks: + blocked_domains: Обмежені та заблоковані домени + description: Перелік серверів, з якими %{instance} не хоче або не буде вступати до федеративних відносин. + domain: Домен + no_domain_blocks: "(Немає заблокованих доменів)" + severity_legend: + media_block: Файли медіа з цього сервера не отримуються, не зберігаються та не відображаються. + suspension: Інформація з призупинених серверів не зберігається та не відображається. Ніякі дані не надсилаються до них, взаємодії ігноруються. + suspension_disclaimer: Призупинені сервери можуть інколи отримувати публічні дані з цього сервера. + show_rationale: Обґрунтування + title: "%{instance} Перелік заблокованих серверів" domain_validator: invalid_domain: не є допустимим ім'ям домену errors: + '400': Ваш запит був недійсним або неправильним. '403': У Вас немає доступу до перегляду даної сторінки. '404': Сторінки, яку Ви шукали, не існує. + '406': Ця сторінка недоступна у запрошеному форматі. '410': Сторінки, яку Ви шукали, більше не існує. '422': content: Перевірка безпеки не вдалася. Можливо, Ви блокуєте cookies? @@ -650,6 +678,7 @@ uk: '500': content: Пробачте, та щось пішло не так з нашого боку. title: Ця сторінка неправильна + '503': Ця сторінка не може бути оброблена через тимчасову відмову сервера. noscript_html: Для використання веб-застосунку Mastodon, будь-ласка увімкніть JavaScript. Якщо у вас немає такої можливості, скористайтесь одним із нативних застосунків для Mastodon для вашої платформи. existing_username_validator: not_found: не вдалося знайти локального користувача з таким ім'ям @@ -673,6 +702,7 @@ uk: add_new: Додати новий errors: limit: Ви досягли максимальної кількості хештеґів + hint_html: "Що таке виділені хештеґи? Це ті, що відображаються ни видному місці у вашому публічному профілі. Вони дають змогу людям фільтрувати ваші публічні пости за цими хештеґами. Це дуже корисно для відстеження мистецьких творів та довготривалих проектів." filters: contexts: home: Ваша стрічка @@ -693,6 +723,7 @@ uk: developers: Розробникам more: Більше… resources: Ресурси + trending_now: Актуальні generic: all: Усі changes_saved_msg: Зміни успішно збережені! @@ -713,10 +744,12 @@ uk: errors: failed: Не вдалося встановити це зашифроване з'єднання. Спробуйте ще раз за допомогою %{provider}. i_am_html: Я %{username} з %{service}. + identity: Ідентичність inactive: Неактивний publicize_checkbox: 'Та дмухнути це:' publicize_toot: 'Це доведено! Я таки %{username} з %{service}: %{url}' status: Стан перевірки + view_proof: Переглянути доказ imports: modes: merge: Злиття @@ -836,6 +869,7 @@ uk: too_many_options: не може мати більше ніж %{max} варіантів preferences: other: Інше + posting_defaults: Промовчання для постів public_timelines: Глобальні стрічки relationships: activity: Діяльність облікового запису @@ -923,6 +957,7 @@ uk: edit_profile: Редагувати профіль export: Експорт даних featured_tags: Рекомендовані хештеґи + identity_proofs: Докази ідентичності import: Імпорт import_and_export: Імпорт та експорт migrate: Міграція облікового запису @@ -985,6 +1020,7 @@ uk: tags: does_not_match_previous_name: не збігається з попереднім ім'ям terms: + body_html: "

Політика конфіденційності

\n

Яку інформацію ми збираємо?

\n\n
    \n
  • Основна інформація про обліковий запис: Якщо ви реєструєтесь на цьому сервері, вас можуть попросити ввести ім’я користувача, електронну адресу та пароль. Ви також можете ввести додаткову інформацію профілю, наприклад, ім'я для відображення та біографію, завантажити зображення профілю та зображення заголовка. Ім'я користувача, відображуване ім’я, біографія, зображення профілю та зображення заголовка завжди є загальнодоступними.
  • \n
  • Повідомлення, підписки та інша публічна інформація: Список людей, на яких ви підписані, є публічним, це ж стосується і списка ваших підписників. Коли ви надсилаєте повідомлення, дата та час зберігаються, а також програма, за допомогою якої ви надіслали повідомлення. Повідомлення можуть містити мультимедійні вкладення, такі як зображення та відео. Загальнодоступні публікації, навіть приховані зі стрічок, доступні для всіх. Коли ви розміщуєте публікацію у своєму профілі, це також загальнодоступна інформація. Ваші публікації доставляються вашим підписникам, у деяких випадках це означає, що вони доставляються на інші сервери і копії зберігаються там. Коли ви видаляєте публікації, ця інформація також доставляється вашим \nпідписникам. Перепости та вподобання завжди публічні.
  • \n
  • Прямі публікації та пости лише для підписників: Усі повідомлення зберігаються та обробляються на сервері. Публікації лише для підписників доставляються вашим підписникам та користувачам, які згадуються в них, а прямі повідомлення надсилаються лише тим користувачам, які в них згадуються. У \nдеяких випадках це означає, що вони доставляються на інші сервери і копії зберігаються там. Ми докладаємо сумлінних зусиль, щоб обмежити доступ до цих постів лише уповноваженим особам, але інші сервери можуть цього не зробити. Тому важливо переглянути сервери, до яких належать ваші підписники. Ви можете переключити параметр для схвалення та відхилення нових підписників вручну в налаштуваннях. Будь ласка, майте на увазі, що оператори нашого сервера та будь-якого приймаючого сервера, можуть переглядати такі повідомлення, і що одержувачі можуть робити скріншот, копіювати або повторно ділитися ними. Не діліться будь-якою небезпечною інформацією на Mastodon.
  • \n
  • IP-адреси та інші метадані: Коли ви входите в систему, ми записуємо IP-адресу, з якої ви входите, а також назву веб-переглядача. Усі сеанси, якими ви ввійшли в систему, доступні вам для перегляду та скасування в налаштуваннях. Остання використана IP-адреса зберігається до 12 місяців. Ми також можемо зберігати журнали серверів, які включають IP-адресу кожного запиту на наш сервер.
  • \n
\n\n
\n\n

Для чого ми використовуємо вашу інформацію?

\n\n

Будь-яка інформація, яку ми збираємо від вас, може використовуватися такими способами:

\n\n
    \n
  • Для забезпечення основної функціональності Mastodon. Ви можете взаємодіяти з вмістом інших людей та розміщувати власний вміст лише тоді, коли ви ввійшли в систему. Наприклад, ви можете підписатись на інших людей, щоб переглядати їх публікації об’єднаними на вашій власній персоналізованій локальній стрічці.
  • \n
  • Щоб сприяти модерації спільноти, наприклад, порівнюючи вашу IP-адресу з іншими відомими адресами для визначення ухилення від бану чи інших порушень.
  • \n
  • Електронна адреса, яку ви вводите, може використовуватися для надсилання вам інформації, сповіщень про інших людей, які взаємодіють з вашим вмістом або надсилають вам повідомлення, а також для відповіді на запити та/або інші запитання./li>\n
\n\n
\n\n

Як ми захищаємо вашу інформацію?

\n\n

Ми застосовуємо різноманітні заходи безпеки для підтримки безпеки вашої особистої інформації під час введення, подання чи доступу до вашої особистої інформації. Крім усього іншого, сеанс вашого веб-переглядача, а також трафік між вашими програмами та API захищені SSL, а ваш пароль хеширується за допомогою сильного одностороннього алгоритму. Ви можете дозволити двофакторну автентифікацію для подальшого захисту доступу до свого облікового запису.

\n\n
\n\n

Яка наша політика збереження даних?

\n\n

Ми докладемо зусиль для того, щоб:

\n\n
    \n
  • Зберігати журнали сервера, що містять IP-адресу всіх запитів на цьому сервері, але більше 90 днів.
  • \n
  • Зберігати IP-адреси, пов’язані з зареєстрованими користувачами, не більше 12 місяців.
  • \n
\n\n

Ви можете запитати та завантажити архів свого вмісту, включаючи ваші публікації, медіа-додатки, зображення профілю та зображення заголовка.

\n\n

Ви можете в будь-який час безповоротно видалити свій обліковий запис.

\n\n
\n\n

Чи використовуємо ми файли cookie?

\n\n

Так. Файли cookie — це невеликі файли, які сайт або його постачальник послуг передає на жорсткий диск вашого комп'ютера через веб-браузер (якщо ви це дозволите). Ці файли cookie дозволяють сайту розпізнавати ваш веб-переглядач і, якщо у вас зареєстрований обліковий запис, пов’язувати його зі своїм зареєстрованим обліковим записом.

\n\n

Ми використовуємо файли cookie, щоб зрозуміти і зберегти ваші налаштування для майбутніх відвідувань.

\n\n
\n\n

Чи розкриваємо ми будь-яку інформацію іншим сторонам?

\n\n

Ми не продаємо, не торгуємо та іншим чином не передаємо назовні вашої особистої інформації. Це не стосується довірених третіх осіб, які допомагають нам керувати нашим сайтом, вести наш бізнес або обслуговувати вас, якщо ці сторони погоджуються зберігати цю інформацію конфіденційною. Ми також можемо оприлюднити вашу інформацію, коли вважаємо, що випуск доцільний для дотримання законодавства, \nзастосування політики нашого веб-сайта чи захисту наших або інших прав, власності чи безпеки.

\n\n

Ваш загальнодоступний вміст може завантажуватися іншими серверами в мережі. Ваші загальнодоступні публікації та публікації лише для підписників, доставляються на сервери, де \"проживають\" ваші підписники, а прямі повідомлення надходять на сервери одержувачів, якщо ці підписники або одержувачі проживають на іншому сервері, ніж цей./p>\n\n

Коли ви дозволяєте додатку використовувати ваш обліковий запис, залежно від обсягу дозволів, які ви затверджуєте, він може отримати доступ до вашої інформації про загальнодоступний профіль, список ваших підписок, ваші підписники, ваші списки, всі ваші публікації та вибране. Програми ніколи не можуть отримати доступ до вашої електронної адреси чи пароля.

\n\n
\n\n

Використання сайту дітьми

\n\n

Якщо цей сервер знаходиться в ЄС або ЄЕП: наш сайт, продукти та послуги спрямовані на людей, яким не менше 16 років. Якщо вам не виповнилося 16 років, відповідно до вимог GDPR (Загальне положення про захист даних) не використовуйте цей веб-сайт.

\n\n

Якщо цей сервер знаходиться в США: наш сайт, продукти та послуги спрямовані на людей, яким не менше 13 років. Якщо вам не виповнилося 13 років, відповідно до вимог COPPA (Закон про захист конфіденційності дітей в Інтернеті) не використовуйте цей сайт.

\n\n

Законодавчі вимоги можуть бути різними, якщо цей сервер знаходиться в іншій юрисдикції.

\n\n
\n\n

Зміни в нашій Політиці конфіденційності

\n\n

Якщо ми вирішимо змінити нашу політику конфіденційності, ми опублікуємо ці зміни на цій сторінці.

\n\n

Цей документ є CC-BY-SA. Востаннє оновлено 7 березня 2018 року.

\n\n

Первісно адаптовано з політики конфіденційності дискурсу.

\n" title: Умови використання та Політика приватності %{instance} themes: contrast: Висока контрасність @@ -1020,6 +1056,7 @@ uk: disable: Поки ваш обліковий запис заморожений, його дані залишаються незмінними. Проте ви не зможете виконувати будь-які дії над обліковим записом, доки його не буде розблоковано. silence: Поки ваш обліковий запис обмежено, ваші дмухи на цьому сервері бачитимуть лише ті люди, які вже слідкують за вами, а вас може бути виключено з різних публічних списків. Тим не менш, інші можуть слідкувати за вами вручну. suspend: Ваш обліковий запис було призупинено, а всі ваші дмухи і вивантажені медіафайли - безповоротно видалено з цього сервера та серверів, де ви мали послідовників. + get_in_touch: Ви можете відповісти на цей електронний лист, щоб зконтактувати з працівниками %{instance}. review_server_policies: Переглянути політики сервера subject: disable: Ваш обліковий запис %{acct} було заморожено diff --git a/config/locales/zh-CN.yml b/config/locales/zh-CN.yml index e42c68055..d2549bcb4 100644 --- a/config/locales/zh-CN.yml +++ b/config/locales/zh-CN.yml @@ -276,6 +276,7 @@ zh-CN: created_msg: 正在进行域名屏蔽 destroyed_msg: 域名屏蔽已撤销 domain: 域名 + edit: 编辑域名屏蔽 existing_domain_block_html: 您已经对 %{name} 施加了更严格的限制,您需要先 解封。 new: create: 添加屏蔽 @@ -476,6 +477,7 @@ zh-CN: delete: 删除 nsfw_off: 标记为非敏感内容 nsfw_on: 标记为敏感内容 + deleted: 已删除 failed_to_execute: 执行失败 media: title: 媒体文件 @@ -487,6 +489,7 @@ zh-CN: accounts_today: 今日活跃用户 accounts_week: 本周活跃用户 directory: 在目录中 + review: 审核状态 reviewed: 已审核 title: 话题标签 trending_right_now: 当前热门 @@ -585,23 +588,23 @@ zh-CN: deletes: bad_password_msg: 想得美,黑客!密码输入错误 confirm_password: 输入你当前的密码来验证身份 - description_html: 继续操作将会永久地、不可撤销地删除帐户中的所有内容,然后冻结帐户。你的用户名将会被保留,以防有人冒用你的身份。 proceed: 删除帐户 success_msg: 你的帐户已经成功删除 - warning_html: 我们只能保证本服务器上的内容将会被彻底删除。对于已经被广泛传播的内容,它们在本服务器以外的某些地方可能仍然可见。此外,失去连接的服务器以及停止接收订阅的服务器所存储的数据亦无法删除。 - warning_title: 关于已传播的内容的警告 directories: directory: 用户目录 - enabled: 您已被收录在用户目录中。 - enabled_but_waiting: 你已选择将账号收录到用户目录中,但是你的关注者不足 (%{min_followers}) 人 。 explanation: 根据兴趣发现用户 explore_mastodon: 探索 %{title} - how_to_enable: 您目前没有被收录到用户目录中。您可以在下面选择收录。在个人简介中加上话题标签后,话题标签也会显示在用户目录上! - people: - other: "%{count} 人" + domain_blocks: + silence: 隐藏 + suspension: 屏蔽 + title: "%{instance} 已屏蔽实例列表" + domain_validator: + invalid_domain: 不是一个有效的域名 errors: + '400': 您提交的请求无效或格式不正确。 '403': 你没有访问这个页面的权限。 '404': 无法找到你所要访问的页面。 + '406': This page is not available in the requested format. '410': 你所要访问的页面此处已不存在。 '422': content: 无法确认登录信息。你是不是屏蔽了 Cookie? @@ -610,6 +613,7 @@ zh-CN: '500': content: 抱歉,我们的后台出错了。 title: 这个页面有问题 + '503': The page could not be served due to a temporary server failure. noscript_html: 使用 Mastodon 网页版应用需要启用 JavaScript。你也可以选择适用于你的平台的 Mastodon 应用。 existing_username_validator: not_found: 在本站找不到此用户 @@ -653,6 +657,7 @@ zh-CN: developers: 开发者 more: 更多… resources: 资源 + trending_now: 现在流行 generic: all: 全部 changes_saved_msg: 更改保存成功! @@ -925,6 +930,8 @@ zh-CN: pinned: 置顶嘟文 reblogged: 转嘟 sensitive_content: 敏感内容 + tags: + does_not_match_previous_name: 和之前的名称不匹配 terms: body_html: |

隐私政策

diff --git a/config/locales/zh-HK.yml b/config/locales/zh-HK.yml index b1769871d..75202fa68 100644 --- a/config/locales/zh-HK.yml +++ b/config/locales/zh-HK.yml @@ -393,14 +393,13 @@ zh-HK: deletes: bad_password_msg: 想得美,黑客!密碼輸入錯誤 confirm_password: 輸入你現在的密碼來驗證身份 - description_html: 繼續操作將會永久地、不可還原地刪除帳戶中的所有內容,然後凍結帳戶。你的用戶名將會被保留,以防有人冒用你的身份。 proceed: 刪除帳戶 success_msg: 你的帳戶已經成功刪除 - warning_html: 我們只能保證本服務站上的內容將會被徹底刪除。對於已經被廣泛傳播的內容,它們在本服務站以外的某些地方可能仍然可見。此外,失去連接的服務站以及停止接收訂閱的服務站所存儲的數據亦無法刪除。 - warning_title: 關於已傳播的內容的警告 errors: + '400': The request you submitted was invalid or malformed. '403': 你沒有觀看本頁的權限。 '404': 找不到內容。 + '406': This page is not available in the requested format. '410': 內容已被刪除。 '422': content: 無法確認登入資訊。會不會你阻擋了本站使用 Cookies 的權限? @@ -409,6 +408,7 @@ zh-HK: '500': content: 抱歉,我們的後台出錯了。 title: 這個頁面有問題 + '503': The page could not be served due to a temporary server failure. noscript_html: 使用 Mastodon 網頁版應用需要啟用 JavaScript。你也可以選擇適用於你的平台的 Mastodon 應用。 exports: archive_takeout: diff --git a/config/locales/zh-TW.yml b/config/locales/zh-TW.yml index b7a9a2ec2..95f7d7f9a 100644 --- a/config/locales/zh-TW.yml +++ b/config/locales/zh-TW.yml @@ -467,14 +467,13 @@ zh-TW: deletes: bad_password_msg: 想得美,駭客! 密碼輸入錯誤 confirm_password: 輸入你現在的密碼來驗證身份 - description_html: 繼續操作將會永久地、不可還原地刪除帳戶中的所有內容,然後凍結帳戶。你的使用者名稱將會被保留,以防有人冒用你的身份。 proceed: 刪除帳戶 success_msg: 你的帳戶已經成功刪除 - warning_html: 我們只能保證本伺服器上的內容將會被徹底刪除。對於已經被廣泛傳播的內容,它們在本伺服器以外的某些地方可能仍然可見。此外,離線伺服器以及停止接收訂閱的伺服器所儲存的資料亦無法刪除。 - warning_title: 關於已傳播的內容警告 errors: + '400': The request you submitted was invalid or malformed. '403': 你沒有觀看這個頁面的權限。 '404': 您所尋找的網頁不存在。 + '406': This page is not available in the requested format. '410': 您所尋找的網頁此處已不存在。 '422': content: 安全驗證失敗。請確定有開啟瀏覽器 Cookies 功能? @@ -483,6 +482,7 @@ zh-TW: '500': content: 抱歉,我們的後台出現問題了。 title: 這個頁面有問題 + '503': The page could not be served due to a temporary server failure. noscript_html: 使用 Mastodon 網頁版應用需要啟用 JavaScript。你也可以選擇適用於你的平台的 Mastodon 應用。 exports: archive_takeout: From 9045f5e3f8aabcdff908058764882b7165a03925 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Tue, 10 Sep 2019 12:44:47 +0200 Subject: [PATCH 053/134] Bump webpush from 0.3.8 to 1.0.0 (#11614) Bumps [webpush](https://github.com/zaru/webpush) from 0.3.8 to 1.0.0. - [Release notes](https://github.com/zaru/webpush/releases) - [Changelog](https://github.com/zaru/webpush/blob/master/CHANGELOG.md) - [Commits](https://github.com/zaru/webpush/compare/v0.3.8...v1.0.0) Signed-off-by: dependabot-preview[bot] --- Gemfile.lock | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Gemfile.lock b/Gemfile.lock index b8cdbd151..125cca4ba 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -321,7 +321,7 @@ GEM multi_json (~> 1.12) rdf (~> 3.0) jsonapi-renderer (0.2.2) - jwt (2.1.0) + jwt (2.2.1) kaminari (1.1.1) activesupport (>= 4.1.0) kaminari-actionview (= 1.1.1) @@ -654,7 +654,7 @@ GEM activesupport (>= 4.2) rack-proxy (>= 0.6.1) railties (>= 4.2) - webpush (0.3.8) + webpush (1.0.0) hkdf (~> 0.2) jwt (~> 2.0) websocket-driver (0.7.0) From 86748148256b504c0411119628435b1445959309 Mon Sep 17 00:00:00 2001 From: Eugen Rochko Date: Tue, 10 Sep 2019 13:48:48 +0200 Subject: [PATCH 054/134] Change tootctl to use inline parallelization instead of Sidekiq (#11776) - Remove --background option - Add --concurrency(=5) option - Add progress bars --- Gemfile | 1 + Gemfile.lock | 1 + app/models/media_attachment.rb | 1 + app/models/preview_card.rb | 2 + .../maintenance/destroy_media_worker.rb | 14 -- .../redownload_account_media_worker.rb | 16 -- .../maintenance/uncache_media_worker.rb | 18 -- .../maintenance/uncache_preview_worker.rb | 18 -- lib/mastodon/accounts_cli.rb | 192 +++++++----------- lib/mastodon/cache_cli.rb | 16 +- lib/mastodon/cli_helper.rb | 49 +++++ lib/mastodon/domains_cli.rb | 27 ++- lib/mastodon/feeds_cli.rb | 42 +--- lib/mastodon/media_cli.rb | 57 ++---- lib/mastodon/preview_cards_cli.rb | 83 +++----- 15 files changed, 200 insertions(+), 337 deletions(-) delete mode 100644 app/workers/maintenance/destroy_media_worker.rb delete mode 100644 app/workers/maintenance/redownload_account_media_worker.rb delete mode 100644 app/workers/maintenance/uncache_media_worker.rb delete mode 100644 app/workers/maintenance/uncache_preview_worker.rb diff --git a/Gemfile b/Gemfile index 73edb2a6a..af0e8e2fc 100644 --- a/Gemfile +++ b/Gemfile @@ -77,6 +77,7 @@ gem 'rails-settings-cached', '~> 0.6' gem 'redis', '~> 4.1', require: ['redis', 'redis/connection/hiredis'] gem 'mario-redis-lock', '~> 1.2', require: 'redis_lock' gem 'rqrcode', '~> 0.10' +gem 'ruby-progressbar', '~> 1.10' gem 'sanitize', '~> 5.1' gem 'sidekiq', '~> 5.2' gem 'sidekiq-scheduler', '~> 3.0' diff --git a/Gemfile.lock b/Gemfile.lock index 125cca4ba..6e931c611 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -769,6 +769,7 @@ DEPENDENCIES rspec-sidekiq (~> 3.0) rubocop (~> 0.74) rubocop-rails (~> 2.3) + ruby-progressbar (~> 1.10) sanitize (~> 5.1) sidekiq (~> 5.2) sidekiq-bulk (~> 0.2.0) diff --git a/app/models/media_attachment.rb b/app/models/media_attachment.rb index 44f8e6be6..b58025015 100644 --- a/app/models/media_attachment.rb +++ b/app/models/media_attachment.rb @@ -129,6 +129,7 @@ class MediaAttachment < ApplicationRecord scope :unattached, -> { where(status_id: nil, scheduled_status_id: nil) } scope :local, -> { where(remote_url: '') } scope :remote, -> { where.not(remote_url: '') } + scope :cached, -> { remote.where.not(file_file_name: nil) } default_scope { order(id: :asc) } diff --git a/app/models/preview_card.rb b/app/models/preview_card.rb index a792b352b..9d6c1938a 100644 --- a/app/models/preview_card.rb +++ b/app/models/preview_card.rb @@ -43,6 +43,8 @@ class PreviewCard < ApplicationRecord validates_attachment_size :image, less_than: LIMIT remotable_attachment :image, LIMIT + scope :cached, -> { where.not(image_file_name: [nil, '']) } + before_save :extract_dimensions, if: :link? def save_with_optional_image! diff --git a/app/workers/maintenance/destroy_media_worker.rb b/app/workers/maintenance/destroy_media_worker.rb deleted file mode 100644 index cde33d6d7..000000000 --- a/app/workers/maintenance/destroy_media_worker.rb +++ /dev/null @@ -1,14 +0,0 @@ -# frozen_string_literal: true - -class Maintenance::DestroyMediaWorker - include Sidekiq::Worker - - sidekiq_options queue: 'pull' - - def perform(media_attachment_id) - media = media_attachment_id.is_a?(MediaAttachment) ? media_attachment_id : MediaAttachment.find(media_attachment_id) - media.destroy - rescue ActiveRecord::RecordNotFound - true - end -end diff --git a/app/workers/maintenance/redownload_account_media_worker.rb b/app/workers/maintenance/redownload_account_media_worker.rb deleted file mode 100644 index 6afbe6e19..000000000 --- a/app/workers/maintenance/redownload_account_media_worker.rb +++ /dev/null @@ -1,16 +0,0 @@ -# frozen_string_literal: true - -class Maintenance::RedownloadAccountMediaWorker - include Sidekiq::Worker - - sidekiq_options queue: 'pull', retry: false - - def perform(account_id) - account = account_id.is_a?(Account) ? account_id : Account.find(account_id) - account.reset_avatar! - account.reset_header! - account.save - rescue ActiveRecord::RecordNotFound - true - end -end diff --git a/app/workers/maintenance/uncache_media_worker.rb b/app/workers/maintenance/uncache_media_worker.rb deleted file mode 100644 index 4bc62ef75..000000000 --- a/app/workers/maintenance/uncache_media_worker.rb +++ /dev/null @@ -1,18 +0,0 @@ -# frozen_string_literal: true - -class Maintenance::UncacheMediaWorker - include Sidekiq::Worker - - sidekiq_options queue: 'pull' - - def perform(media_attachment_id) - media = media_attachment_id.is_a?(MediaAttachment) ? media_attachment_id : MediaAttachment.find(media_attachment_id) - - return if media.file.blank? - - media.file.destroy - media.save - rescue ActiveRecord::RecordNotFound - true - end -end diff --git a/app/workers/maintenance/uncache_preview_worker.rb b/app/workers/maintenance/uncache_preview_worker.rb deleted file mode 100644 index 810ffd8cc..000000000 --- a/app/workers/maintenance/uncache_preview_worker.rb +++ /dev/null @@ -1,18 +0,0 @@ -# frozen_string_literal: true - -class Maintenance::UncachePreviewWorker - include Sidekiq::Worker - - sidekiq_options queue: 'pull' - - def perform(preview_card_id) - preview_card = PreviewCard.find(preview_card_id) - - return if preview_card.image.blank? - - preview_card.image.destroy - preview_card.save - rescue ActiveRecord::RecordNotFound - true - end -end diff --git a/lib/mastodon/accounts_cli.rb b/lib/mastodon/accounts_cli.rb index d1854acc0..b16bf2e38 100644 --- a/lib/mastodon/accounts_cli.rb +++ b/lib/mastodon/accounts_cli.rb @@ -7,6 +7,8 @@ require_relative 'cli_helper' module Mastodon class AccountsCLI < Thor + include CLIHelper + def self.exit_on_failure? true end @@ -26,18 +28,20 @@ module Mastodon if options[:all] processed = 0 delay = 0 + scope = Account.local.without_suspended + progress = create_progress_bar(scope.count) - Account.local.without_suspended.find_in_batches do |accounts| + scope.find_in_batches do |accounts| accounts.each do |account| rotate_keys_for_account(account, delay) + progress.increment processed += 1 - say('.', :green, false) end delay += 5.minutes end - say + progress.finish say("OK, rotated keys for #{processed} accounts", :green) elsif username.present? rotate_keys_for_account(Account.find_local(username)) @@ -206,6 +210,8 @@ module Mastodon say('OK', :green) end + option :concurrency, type: :numeric, default: 5, aliases: [:c] + option :verbose, type: :boolean, aliases: [:v] option :dry_run, type: :boolean desc 'cull', 'Remove remote accounts that no longer exist' long_desc <<-LONG_DESC @@ -215,63 +221,45 @@ module Mastodon Accounts that have had confirmed activity within the last week are excluded from the checks. - - Domains that are unreachable are not checked. - - With the --dry-run option, no deletes will actually be carried - out. LONG_DESC def cull skip_threshold = 7.days.ago - culled = 0 - dry_run_culled = [] - skip_domains = Set.new dry_run = options[:dry_run] ? ' (DRY RUN)' : '' + skip_domains = Concurrent::Set.new - Account.remote.where(protocol: :activitypub).partitioned.find_each do |account| - next if account.updated_at >= skip_threshold || (account.last_webfingered_at.present? && account.last_webfingered_at >= skip_threshold) + processed, culled = parallelize_with_progress(Account.remote.where(protocol: :activitypub).partitioned) do |account| + next if account.updated_at >= skip_threshold || (account.last_webfingered_at.present? && account.last_webfingered_at >= skip_threshold) || skip_domains.include?(account.domain) code = 0 - unless skip_domains.include?(account.domain) - begin - code = Request.new(:head, account.uri).perform(&:code) - rescue HTTP::ConnectionError - skip_domains << account.domain - rescue StandardError - next - end + + begin + code = Request.new(:head, account.uri).perform(&:code) + rescue HTTP::ConnectionError + skip_domains << account.domain end if [404, 410].include?(code) - if options[:dry_run] - dry_run_culled << account.acct - else - SuspendAccountService.new.call(account, destroy: true) - end - culled += 1 - say('+', :green, false) + SuspendAccountService.new.call(account, destroy: true) unless options[:dry_run] + 1 else - account.touch # Touch account even during dry run to avoid getting the account into the window again - say('.', nil, false) + # Touch account even during dry run to avoid getting the account into the window again + account.touch end end - say - say("Removed #{culled} accounts. #{skip_domains.size} servers skipped#{dry_run}", skip_domains.empty? ? :green : :yellow) + say("Visited #{processed} accounts, removed #{culled}#{dry_run}", :green) unless skip_domains.empty? - say('The following servers were not available during the check:', :yellow) + say('The following domains were not available during the check:', :yellow) skip_domains.each { |domain| say(' ' + domain) } end - - unless dry_run_culled.empty? - say('The following accounts would have been deleted:', :green) - dry_run_culled.each { |account| say(' ' + account) } - end end option :all, type: :boolean option :domain + option :concurrency, type: :numeric, default: 5, aliases: [:c] + option :verbose, type: :boolean, aliases: [:v] + option :dry_run, type: :boolean desc 'refresh [USERNAME]', 'Fetch remote user data and files' long_desc <<-LONG_DESC Fetch remote user data and files for one or multiple accounts. @@ -280,21 +268,23 @@ module Mastodon Through the --domain option, this can be narrowed down to a specific domain only. Otherwise, a single remote account must be specified with USERNAME. - - All processing is done in the background through Sidekiq. LONG_DESC def refresh(username = nil) + dry_run = options[:dry_run] ? ' (DRY RUN)' : '' + if options[:domain] || options[:all] - queued = 0 scope = Account.remote scope = scope.where(domain: options[:domain]) if options[:domain] - scope.select(:id).reorder(nil).find_in_batches do |accounts| - Maintenance::RedownloadAccountMediaWorker.push_bulk(accounts.map(&:id)) - queued += accounts.size + processed, = parallelize_with_progress(scope) do |account| + next if options[:dry_run] + + account.reset_avatar! + account.reset_header! + account.save end - say("Scheduled refreshment of #{queued} accounts", :green, true) + say("Refreshed #{processed} accounts#{dry_run}", :green, true) elsif username.present? username, domain = username.split('@') account = Account.find_remote(username, domain) @@ -304,76 +294,53 @@ module Mastodon exit(1) end - Maintenance::RedownloadAccountMediaWorker.perform_async(account.id) - say('OK', :green) + unless options[:dry_run] + account.reset_avatar! + account.reset_header! + account.save + end + + say("OK#{dry_run}", :green) else say('No account(s) given', :red) exit(1) end end - desc 'follow ACCT', 'Make all local accounts follow account specified by ACCT' - long_desc <<-LONG_DESC - Make all local accounts follow another local account specified by ACCT. - ACCT should be the username only. - LONG_DESC - def follow(acct) - if acct.include? '@' - say('Target account name should not contain a target instance, since it has to be a local account.', :red) - exit(1) - end - - target_account = ResolveAccountService.new.call(acct) - processed = 0 - failed = 0 + option :concurrency, type: :numeric, default: 5, aliases: [:c] + option :verbose, type: :boolean, aliases: [:v] + desc 'follow USERNAME', 'Make all local accounts follow account specified by USERNAME' + def follow(username) + target_account = Account.find_local(username) if target_account.nil? - say("Target account (#{acct}) could not be resolved", :red) + say('No such account', :red) exit(1) end - Account.local.without_suspended.find_each do |account| - begin - FollowService.new.call(account, target_account) - processed += 1 - say('.', :green, false) - rescue StandardError - failed += 1 - say('.', :red, false) - end + processed, = parallelize_with_progress(Account.local.without_suspended) do |account| + FollowService.new.call(account, target_account) end - say("OK, followed target from #{processed} accounts, skipped #{failed}", :green) + say("OK, followed target from #{processed} accounts", :green) end + option :concurrency, type: :numeric, default: 5, aliases: [:c] + option :verbose, type: :boolean, aliases: [:v] desc 'unfollow ACCT', 'Make all local accounts unfollow account specified by ACCT' - long_desc <<-LONG_DESC - Make all local accounts unfollow an account specified by ACCT. ACCT can be - a simple username, in case of a local user. It can also be in the format - username@domain, in case of a remote user. - LONG_DESC def unfollow(acct) target_account = Account.find_remote(*acct.split('@')) - processed = 0 - failed = 0 if target_account.nil? - say("Target account (#{acct}) was not found", :red) + say('No such account', :red) exit(1) end - target_account.followers.local.find_each do |account| - begin - UnfollowService.new.call(account, target_account) - processed += 1 - say('.', :green, false) - rescue StandardError - failed += 1 - say('.', :red, false) - end + parallelize_with_progress(target_account.followers.local) do |account| + UnfollowService.new.call(account, target_account) end - say("OK, unfollowed target from #{processed} accounts, skipped #{failed}", :green) + say("OK, unfollowed target from #{processed} accounts", :green) end option :follows, type: :boolean, default: false @@ -396,51 +363,50 @@ module Mastodon account = Account.find_local(username) if account.nil? - say('No user with such username', :red) + say('No such account', :red) exit(1) end + total = 0 + total += Account.where(id: ::Follow.where(account: account).select(:target_account_id)).count if options[:follows] + total += Account.where(id: ::Follow.where(target_account: account).select(:account_id)).count if options[:followers] + progress = create_progress_bar(total) + processed = 0 + if options[:follows] - processed = 0 - failed = 0 + scope = Account.where(id: ::Follow.where(account: account).select(:target_account_id)) - say("Unfollowing #{account.username}'s followees, this might take a while...") - - Account.where(id: ::Follow.where(account: account).select(:target_account_id)).find_each do |target_account| + scope.find_each do |target_account| begin UnfollowService.new.call(account, target_account) + rescue => e + progress.log pastel.red("Error processing #{target_account.id}: #{e}") + ensure + progress.increment processed += 1 - say('.', :green, false) - rescue StandardError - failed += 1 - say('.', :red, false) end end BootstrapTimelineWorker.perform_async(account.id) - - say("OK, unfollowed #{processed} followees, skipped #{failed}", :green) end if options[:followers] - processed = 0 - failed = 0 + scope = Account.where(id: ::Follow.where(target_account: account).select(:account_id)) - say("Removing #{account.username}'s followers, this might take a while...") - - Account.where(id: ::Follow.where(target_account: account).select(:account_id)).find_each do |target_account| + scope.find_each do |target_account| begin UnfollowService.new.call(target_account, account) + rescue => e + progress.log pastel.red("Error processing #{target_account.id}: #{e}") + ensure + progress.increment processed += 1 - say('.', :green, false) - rescue StandardError - failed += 1 - say('.', :red, false) end end - - say("OK, removed #{processed} followers, skipped #{failed}", :green) end + + progress.finish + say("Processed #{processed} relationships", :green, true) end option :number, type: :numeric, aliases: [:n] diff --git a/lib/mastodon/cache_cli.rb b/lib/mastodon/cache_cli.rb index 5b0eea91b..803404c34 100644 --- a/lib/mastodon/cache_cli.rb +++ b/lib/mastodon/cache_cli.rb @@ -6,6 +6,8 @@ require_relative 'cli_helper' module Mastodon class CacheCLI < Thor + include CLIHelper + def self.exit_on_failure? true end @@ -16,6 +18,8 @@ module Mastodon say('OK', :green) end + option :concurrency, type: :numeric, default: 5, aliases: [:c] + option :verbose, type: :boolean, aliases: [:v] desc 'recount TYPE', 'Update hard-cached counters' long_desc <<~LONG_DESC Update hard-cached counters of TYPE by counting referenced @@ -25,32 +29,24 @@ module Mastodon size of the database. LONG_DESC def recount(type) - processed = 0 - case type when 'accounts' - Account.local.includes(:account_stat).find_each do |account| + processed, = parallelize_with_progress(Account.local.includes(:account_stat)) do |account| account_stat = account.account_stat account_stat.following_count = account.active_relationships.count account_stat.followers_count = account.passive_relationships.count account_stat.statuses_count = account.statuses.where.not(visibility: :direct).count account_stat.save if account_stat.changed? - - processed += 1 - say('.', :green, false) end when 'statuses' - Status.includes(:status_stat).find_each do |status| + processed, = parallelize_with_progress(Status.includes(:status_stat)) do |status| status_stat = status.status_stat status_stat.replies_count = status.replies.where.not(visibility: :direct).count status_stat.reblogs_count = status.reblogs.count status_stat.favourites_count = status.favourites.count status_stat.save if status_stat.changed? - - processed += 1 - say('.', :green, false) end else say("Unknown type: #{type}", :red) diff --git a/lib/mastodon/cli_helper.rb b/lib/mastodon/cli_helper.rb index 2f807d08c..da7348349 100644 --- a/lib/mastodon/cli_helper.rb +++ b/lib/mastodon/cli_helper.rb @@ -7,3 +7,52 @@ ActiveRecord::Base.logger = dev_null ActiveJob::Base.logger = dev_null HttpLog.configuration.logger = dev_null Paperclip.options[:log] = false + +module Mastodon + module CLIHelper + def create_progress_bar(total = nil) + ProgressBar.create(total: total, format: '%c/%u |%b%i| %e') + end + + def parallelize_with_progress(scope) + ActiveRecord::Base.configurations[Rails.env]['pool'] = options[:concurrency] + + progress = create_progress_bar(scope.count) + pool = Concurrent::FixedThreadPool.new(options[:concurrency]) + total = Concurrent::AtomicFixnum.new(0) + aggregate = Concurrent::AtomicFixnum.new(0) + + scope.reorder(nil).find_in_batches do |items| + futures = [] + + items.each do |item| + futures << Concurrent::Future.execute(executor: pool) do + ActiveRecord::Base.connection_pool.with_connection do + begin + progress.log("Processing #{item.id}") if options[:verbose] + + result = yield(item) + aggregate.increment(result) if result.is_a?(Integer) + rescue => e + progress.log pastel.red("Error processing #{item.id}: #{e}") + ensure + progress.increment + end + end + end + end + + total.increment(items.size) + futures.map(&:value) + end + + progress.finish + + [total.value, aggregate.value] + end + + def pastel + @pastel ||= Pastel.new + end + end +end diff --git a/lib/mastodon/domains_cli.rb b/lib/mastodon/domains_cli.rb index 17cafd1bc..c612c2d72 100644 --- a/lib/mastodon/domains_cli.rb +++ b/lib/mastodon/domains_cli.rb @@ -7,10 +7,14 @@ require_relative 'cli_helper' module Mastodon class DomainsCLI < Thor + include CLIHelper + def self.exit_on_failure? true end + option :concurrency, type: :numeric, default: 5, aliases: [:c] + option :verbose, type: :boolean, aliases: [:v] option :dry_run, type: :boolean option :whitelist_mode, type: :boolean desc 'purge [DOMAIN]', 'Remove accounts from a DOMAIN without a trace' @@ -24,7 +28,6 @@ module Mastodon are removed from the database. LONG_DESC def purge(domain = nil) - removed = 0 dry_run = options[:dry_run] ? ' (DRY RUN)' : '' scope = begin @@ -38,25 +41,22 @@ module Mastodon end end - scope.find_each do |account| + processed, = parallelize_with_progress(scope) do |account| SuspendAccountService.new.call(account, destroy: true) unless options[:dry_run] - removed += 1 - say('.', :green, false) end DomainBlock.where(domain: domain).destroy_all unless options[:dry_run] - say - say("Removed #{removed} accounts#{dry_run}", :green) + say("Removed #{processed} accounts#{dry_run}", :green) custom_emojis = CustomEmoji.where(domain: domain) custom_emojis_count = custom_emojis.count custom_emojis.destroy_all unless options[:dry_run] + say("Removed #{custom_emojis_count} custom emojis", :green) end option :concurrency, type: :numeric, default: 50, aliases: [:c] - option :silent, type: :boolean, default: false, aliases: [:s] option :format, type: :string, default: 'summary', aliases: [:f] option :exclude_suspended, type: :boolean, default: false, aliases: [:x] desc 'crawl [START]', 'Crawl all known peers, optionally beginning at START' @@ -69,8 +69,6 @@ module Mastodon The --concurrency (-c) option controls the number of threads performing HTTP requests at the same time. More threads means the crawl may complete faster. - The --silent (-s) option controls progress output. - The --format (-f) option controls how the data is displayed at the end. By default (`summary`), a summary of the statistics is returned. The other options are `domains`, which returns a newline-delimited list of all discovered peers, @@ -87,6 +85,7 @@ module Mastodon start_at = Time.now.to_f seed = start ? [start] : Account.remote.domains blocked_domains = Regexp.new('\\.?' + DomainBlock.where(severity: 1).pluck(:domain).join('|') + '$') + progress = create_progress_bar pool = Concurrent::ThreadPoolExecutor.new(min_threads: 0, max_threads: options[:concurrency], idletime: 10, auto_terminate: true, max_queue: 0) @@ -95,7 +94,6 @@ module Mastodon next if options[:exclude_suspended] && domain.match(blocked_domains) stats[domain] = nil - processed.increment begin Request.new(:get, "https://#{domain}/api/v1/instance").perform do |res| @@ -115,11 +113,11 @@ module Mastodon next unless res.code == 200 stats[domain]['activity'] = Oj.load(res.to_s) end - - say('.', :green, false) unless options[:silent] rescue StandardError failed.increment - say('.', :red, false) unless options[:silent] + ensure + processed.increment + progress.increment unless progress.finished? end end @@ -133,10 +131,9 @@ module Mastodon pool.shutdown pool.wait_for_termination(20) ensure + progress.finish pool.shutdown - say unless options[:silent] - case options[:format] when 'summary' stats_to_summary(stats, processed, failed, start_at) diff --git a/lib/mastodon/feeds_cli.rb b/lib/mastodon/feeds_cli.rb index fe11c3df4..ea7c90dff 100644 --- a/lib/mastodon/feeds_cli.rb +++ b/lib/mastodon/feeds_cli.rb @@ -6,55 +6,33 @@ require_relative 'cli_helper' module Mastodon class FeedsCLI < Thor + include CLIHelper + def self.exit_on_failure? true end option :all, type: :boolean, default: false - option :background, type: :boolean, default: false + option :concurrency, type: :numeric, default: 5, aliases: [:c] + option :verbose, type: :boolean, aliases: [:v] option :dry_run, type: :boolean, default: false - option :verbose, type: :boolean, default: false desc 'build [USERNAME]', 'Build home and list feeds for one or all users' long_desc <<-LONG_DESC Build home and list feeds that are stored in Redis from the database. With the --all option, all active users will be processed. Otherwise, a single user specified by USERNAME. - - With the --background option, regeneration will be queued into Sidekiq, - and the command will exit as soon as possible. - - With the --dry-run option, no work will be done. - - With the --verbose option, when accounts are processed sequentially in the - foreground, the IDs of the accounts will be printed. LONG_DESC def build(username = nil) dry_run = options[:dry_run] ? '(DRY RUN)' : '' if options[:all] || username.nil? - processed = 0 - queued = 0 - User.active.select(:id, :account_id).reorder(nil).find_in_batches do |users| - if options[:background] - RegenerationWorker.push_bulk(users.map(&:account_id)) unless options[:dry_run] - queued += users.size - else - users.each do |user| - RegenerationWorker.new.perform(user.account_id) unless options[:dry_run] - options[:verbose] ? say(user.account_id) : say('.', :green, false) - processed += 1 - end - end + processed, = parallelize_with_progress(Account.joins(:user).merge(User.active)) do |account| + PrecomputeFeedService.new.call(account) unless options[:dry_run] end - if options[:background] - say("Scheduled feed regeneration for #{queued} accounts #{dry_run}", :green, true) - else - say - say("Regenerated feeds for #{processed} accounts #{dry_run}", :green, true) - end + say("Regenerated feeds for #{processed} accounts #{dry_run}", :green, true) elsif username.present? account = Account.find_local(username) @@ -63,11 +41,7 @@ module Mastodon exit(1) end - if options[:background] - RegenerationWorker.perform_async(account.id) unless options[:dry_run] - else - RegenerationWorker.new.perform(account.id) unless options[:dry_run] - end + PrecomputeFeedService.new.call(account) unless options[:dry_run] say("OK #{dry_run}", :green, true) else diff --git a/lib/mastodon/media_cli.rb b/lib/mastodon/media_cli.rb index 6152d5a09..0659b6b65 100644 --- a/lib/mastodon/media_cli.rb +++ b/lib/mastodon/media_cli.rb @@ -7,14 +7,15 @@ require_relative 'cli_helper' module Mastodon class MediaCLI < Thor include ActionView::Helpers::NumberHelper + include CLIHelper def self.exit_on_failure? true end - option :days, type: :numeric, default: 7 - option :background, type: :boolean, default: false - option :verbose, type: :boolean, default: false + option :days, type: :numeric, default: 7, aliases: [:d] + option :concurrency, type: :numeric, default: 5, aliases: [:c] + option :verbose, type: :boolean, default: false, aliases: [:v] option :dry_run, type: :boolean, default: false desc 'remove', 'Remove remote media files' long_desc <<-DESC @@ -22,49 +23,25 @@ module Mastodon The --days option specifies how old media attachments have to be before they are removed. It defaults to 7 days. - - With the --background option, instead of deleting the files sequentially, - they will be queued into Sidekiq and the command will exit as soon as - possible. In Sidekiq they will be processed with higher concurrency, but - it may impact other operations of the Mastodon server, and it may overload - the underlying file storage. - - With the --dry-run option, no work will be done. - - With the --verbose option, when media attachments are processed sequentially in the - foreground, the IDs of the media attachments will be printed. DESC def remove - time_ago = options[:days].days.ago - queued = 0 - processed = 0 - size = 0 - dry_run = options[:dry_run] ? '(DRY RUN)' : '' + time_ago = options[:days].days.ago + dry_run = options[:dry_run] ? '(DRY RUN)' : '' - if options[:background] - MediaAttachment.where.not(remote_url: '').where.not(file_file_name: nil).where('created_at < ?', time_ago).select(:id, :file_file_size).reorder(nil).find_in_batches do |media_attachments| - queued += media_attachments.size - size += media_attachments.reduce(0) { |sum, m| sum + (m.file_file_size || 0) } - Maintenance::UncacheMediaWorker.push_bulk(media_attachments.map(&:id)) unless options[:dry_run] - end - else - MediaAttachment.where.not(remote_url: '').where.not(file_file_name: nil).where('created_at < ?', time_ago).reorder(nil).find_in_batches do |media_attachments| - media_attachments.each do |m| - size += m.file_file_size || 0 - Maintenance::UncacheMediaWorker.new.perform(m) unless options[:dry_run] - options[:verbose] ? say(m.id) : say('.', :green, false) - processed += 1 - end + processed, aggregate = parallelize_with_progress(MediaAttachment.cached.where.not(remote_url: '').where('created_at < ?', time_ago)) do |media_attachment| + next if media_attachment.file.blank? + + size = media_attachment.file_file_size + + unless options[:dry_run] + media_attachment.file.destroy + media_attachment.save end + + size end - say - - if options[:background] - say("Scheduled the deletion of #{queued} media attachments (approx. #{number_to_human_size(size)}) #{dry_run}", :green, true) - else - say("Removed #{processed} media attachments (approx. #{number_to_human_size(size)}) #{dry_run}", :green, true) - end + say("Removed #{processed} media attachments (approx. #{number_to_human_size(aggregate)}) #{dry_run}", :green, true) end end end diff --git a/lib/mastodon/preview_cards_cli.rb b/lib/mastodon/preview_cards_cli.rb index 465fe7d0b..cf4407250 100644 --- a/lib/mastodon/preview_cards_cli.rb +++ b/lib/mastodon/preview_cards_cli.rb @@ -8,87 +8,52 @@ require_relative 'cli_helper' module Mastodon class PreviewCardsCLI < Thor include ActionView::Helpers::NumberHelper + include CLIHelper def self.exit_on_failure? true end option :days, type: :numeric, default: 180 - option :background, type: :boolean, default: false - option :verbose, type: :boolean, default: false + option :concurrency, type: :numeric, default: 5, aliases: [:c] + option :verbose, type: :boolean, aliases: [:v] option :dry_run, type: :boolean, default: false option :link, type: :boolean, default: false desc 'remove', 'Remove preview cards' long_desc <<-DESC - Removes locally thumbnails for previews. + Removes local thumbnails for preview cards. The --days option specifies how old preview cards have to be before - they are removed. It defaults to 180 days. + they are removed. It defaults to 180 days. Since preview cards will + not be re-fetched unless the link is re-posted after 2 weeks from + last time, it is not recommended to delete preview cards within the + last 14 days. - With the --background option, instead of deleting the files sequentially, - they will be queued into Sidekiq and the command will exit as soon as - possible. In Sidekiq they will be processed with higher concurrency, but - it may impact other operations of the Mastodon server, and it may overload - the underlying file storage. - - With the --dry-run option, no work will be done. - - With the --verbose option, when preview cards are processed sequentially in the - foreground, the IDs of the preview cards will be printed. - - With the --link option, delete only link-type preview cards. + With the --link option, only link-type preview cards will be deleted, + leaving video and photo cards untouched. DESC def remove - prompt = TTY::Prompt.new - time_ago = options[:days].days.ago - queued = 0 - processed = 0 - size = 0 - dry_run = options[:dry_run] ? '(DRY RUN)' : '' - link = options[:link] ? 'link-type ' : '' - scope = PreviewCard.where.not(image_file_name: nil) - scope = scope.where.not(image_file_name: '') - scope = scope.where(type: :link) if options[:link] - scope = scope.where('updated_at < ?', time_ago) + time_ago = options[:days].days.ago + dry_run = options[:dry_run] ? ' (DRY RUN)' : '' + link = options[:link] ? 'link-type ' : '' + scope = PreviewCard.cached + scope = scope.where(type: :link) if options[:link] + scope = scope.where('updated_at < ?', time_ago) - if time_ago > 2.weeks.ago - prompt.say "\n" - prompt.say('The preview cards less than the past two weeks will not be re-acquired even when needed.') - prompt.say "\n" + processed, aggregate = parallelize_with_progress(scope) do |preview_card| + next if preview_card.image.blank? - unless prompt.yes?('Are you sure you want to delete the preview cards?', default: false) - prompt.say "\n" - prompt.warn 'Nothing execute. Bye!' - prompt.say "\n" - exit(1) - end - end + size = preview_card.image_file_size - if options[:background] - scope.select(:id, :image_file_size).reorder(nil).find_in_batches do |preview_cards| - queued += preview_cards.size - size += preview_cards.reduce(0) { |sum, p| sum + (p.image_file_size || 0) } - Maintenance::UncachePreviewWorker.push_bulk(preview_cards.map(&:id)) unless options[:dry_run] + unless options[:dry_run] + preview_card.image.destroy + preview_card.save end - else - scope.select(:id, :image_file_size).reorder(nil).find_in_batches do |preview_cards| - preview_cards.each do |p| - size += p.image_file_size || 0 - Maintenance::UncachePreviewWorker.new.perform(p.id) unless options[:dry_run] - options[:verbose] ? say(p.id) : say('.', :green, false) - processed += 1 - end - end + size end - say - - if options[:background] - say("Scheduled the deletion of #{queued} #{link}preview cards (approx. #{number_to_human_size(size)}) #{dry_run}", :green, true) - else - say("Removed #{processed} #{link}preview cards (approx. #{number_to_human_size(size)}) #{dry_run}", :green, true) - end + say("Removed #{processed} #{link}preview cards (approx. #{number_to_human_size(aggregate)})#{dry_run}", :green, true) end end end From 031ca25014e0ba88d3dcc3086947b41449a672e2 Mon Sep 17 00:00:00 2001 From: Eugen Rochko Date: Tue, 10 Sep 2019 15:29:12 +0200 Subject: [PATCH 055/134] Add retry for failed media downloads and `tootctl media refresh` (#11775) --- app/lib/activitypub/activity/create.rb | 21 +++++----- app/models/concerns/remotable.rb | 12 +++--- app/models/media_attachment.rb | 2 +- app/workers/redownload_media_worker.rb | 19 +++++++++ lib/mastodon/media_cli.rb | 54 ++++++++++++++++++++++++++ 5 files changed, 92 insertions(+), 16 deletions(-) create mode 100644 app/workers/redownload_media_worker.rb diff --git a/app/lib/activitypub/activity/create.rb b/app/lib/activitypub/activity/create.rb index 000b77df5..dea7fd43c 100644 --- a/app/lib/activitypub/activity/create.rb +++ b/app/lib/activitypub/activity/create.rb @@ -189,22 +189,25 @@ class ActivityPub::Activity::Create < ActivityPub::Activity media_attachments = [] as_array(@object['attachment']).each do |attachment| - next if attachment['url'].blank? + next if attachment['url'].blank? || media_attachments.size >= 4 - href = Addressable::URI.parse(attachment['url']).normalize.to_s - media_attachment = MediaAttachment.create(account: @account, remote_url: href, description: attachment['name'].presence, focus: attachment['focalPoint'], blurhash: supported_blurhash?(attachment['blurhash']) ? attachment['blurhash'] : nil) - media_attachments << media_attachment + begin + href = Addressable::URI.parse(attachment['url']).normalize.to_s + media_attachment = MediaAttachment.create(account: @account, remote_url: href, description: attachment['name'].presence, focus: attachment['focalPoint'], blurhash: supported_blurhash?(attachment['blurhash']) ? attachment['blurhash'] : nil) + media_attachments << media_attachment - next if unsupported_media_type?(attachment['mediaType']) || skip_download? + next if unsupported_media_type?(attachment['mediaType']) || skip_download? - media_attachment.file_remote_url = href - media_attachment.save + media_attachment.file_remote_url = href + media_attachment.save + rescue Mastodon::UnexpectedResponseError, HTTP::TimeoutError, HTTP::ConnectionError, OpenSSL::SSL::SSLError + RedownloadMediaWorker.perform_in(rand(30..600).seconds, media_attachment.id) + end end media_attachments rescue Addressable::URI::InvalidURIError => e - Rails.logger.debug e - + Rails.logger.debug "Invalid URL in attachment: #{e}" media_attachments end diff --git a/app/models/concerns/remotable.rb b/app/models/concerns/remotable.rb index 9372a963b..082302619 100644 --- a/app/models/concerns/remotable.rb +++ b/app/models/concerns/remotable.rb @@ -4,7 +4,7 @@ module Remotable extend ActiveSupport::Concern class_methods do - def remotable_attachment(attachment_name, limit) + def remotable_attachment(attachment_name, limit, suppress_errors: true) attribute_name = "#{attachment_name}_remote_url".to_sym method_name = "#{attribute_name}=".to_sym alt_method_name = "reset_#{attachment_name}!".to_sym @@ -22,7 +22,7 @@ module Remotable begin Request.new(:get, url).perform do |response| - next if response.code != 200 + raise Mastodon::UnexpectedResponseError, response unless (200...300).cover?(response.code) content_type = parse_content_type(response.headers.get('content-type').last) extname = detect_extname_from_content_type(content_type) @@ -41,11 +41,11 @@ module Remotable self[attribute_name] = url if has_attribute?(attribute_name) end - rescue HTTP::TimeoutError, HTTP::ConnectionError, OpenSSL::SSL::SSLError, Paperclip::Errors::NotIdentifiedByImageMagickError, Addressable::URI::InvalidURIError, Mastodon::HostValidationError, Mastodon::LengthValidationError => e + rescue Mastodon::UnexpectedResponseError, HTTP::TimeoutError, HTTP::ConnectionError, OpenSSL::SSL::SSLError => e + Rails.logger.debug "Error fetching remote #{attachment_name}: #{e}" + raise e unless suppress_errors + rescue Paperclip::Errors::NotIdentifiedByImageMagickError, Addressable::URI::InvalidURIError, Mastodon::HostValidationError, Mastodon::LengthValidationError, Paperclip::Error, Mastodon::DimensionsValidationError => e Rails.logger.debug "Error fetching remote #{attachment_name}: #{e}" - nil - rescue Paperclip::Error, Mastodon::DimensionsValidationError => e - Rails.logger.debug "Error processing remote #{attachment_name}: #{e}" nil end end diff --git a/app/models/media_attachment.rb b/app/models/media_attachment.rb index b58025015..a2b73f150 100644 --- a/app/models/media_attachment.rb +++ b/app/models/media_attachment.rb @@ -118,7 +118,7 @@ class MediaAttachment < ApplicationRecord validates_attachment_content_type :file, content_type: IMAGE_MIME_TYPES + VIDEO_MIME_TYPES + AUDIO_MIME_TYPES validates_attachment_size :file, less_than: IMAGE_LIMIT, unless: :larger_media_format? validates_attachment_size :file, less_than: VIDEO_LIMIT, if: :larger_media_format? - remotable_attachment :file, VIDEO_LIMIT + remotable_attachment :file, VIDEO_LIMIT, suppress_errors: false include Attachmentable diff --git a/app/workers/redownload_media_worker.rb b/app/workers/redownload_media_worker.rb new file mode 100644 index 000000000..98e995918 --- /dev/null +++ b/app/workers/redownload_media_worker.rb @@ -0,0 +1,19 @@ +# frozen_string_literal: true + +class RedownloadMediaWorker + include Sidekiq::Worker + include ExponentialBackoff + + sidekiq_options queue: 'pull', retry: 3 + + def perform(id) + media_attachment = MediaAttachment.find(id) + + return if media_attachment.remote_url.blank? + + media_attachment.reset_file! + media_attachment.save + rescue ActiveRecord::RecordNotFound + true + end +end diff --git a/lib/mastodon/media_cli.rb b/lib/mastodon/media_cli.rb index 0659b6b65..ec2f36c30 100644 --- a/lib/mastodon/media_cli.rb +++ b/lib/mastodon/media_cli.rb @@ -43,5 +43,59 @@ module Mastodon say("Removed #{processed} media attachments (approx. #{number_to_human_size(aggregate)}) #{dry_run}", :green, true) end + + option :account, type: :string + option :domain, type: :string + option :status, type: :numeric + option :concurrency, type: :numeric, default: 5, aliases: [:c] + option :verbose, type: :boolean, default: false, aliases: [:v] + option :dry_run, type: :boolean, default: false + desc 'refresh', 'Fetch remote media files' + long_desc <<-DESC + Re-downloads media attachments from other servers. You must specify the + source of media attachments with one of the following options: + + Use the --status option to download attachments from a specific status, + using the status local numeric ID. + + Use the --account option to download attachments from a specific account, + using username@domain handle of the account. + + Use the --domain option to download attachments from a specific domain. + DESC + def refresh + dry_run = options[:dry_run] ? ' (DRY RUN)' : '' + + if options[:status] + scope = MediaAttachment.where(status_id: options[:status]) + elsif options[:account] + username, domain = username.split('@') + account = Account.find_remote(username, domain) + + if account.nil? + say('No such account', :red) + exit(1) + end + + scope = MediaAttachment.where(account_id: account.id) + elsif options[:domain] + scope = MediaAttachment.joins(:account).merge(Account.by_domain_and_subdomains(options[:domain])) + else + exit(1) + end + + processed, aggregate = parallelize_with_progress(scope) do |media_attachment| + next if media_attachment.remote_url.blank? + + unless options[:dry_run] + media_attachment.reset_file! + media_attachment.save + end + + media_attachment.file_file_size + end + + say("Downloaded #{processed} media attachments (approx. #{number_to_human_size(aggregate)})#{dry_run}", :green, true) + end end end From 2b2b03a7da124a49112e1ce91d80681316065008 Mon Sep 17 00:00:00 2001 From: ThibG Date: Tue, 10 Sep 2019 20:55:23 +0200 Subject: [PATCH 056/134] Fix duplicate HTML ids in /about (#11803) Fixes #11329 --- app/views/about/_login.html.haml | 2 +- app/views/about/_registration.html.haml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/app/views/about/_login.html.haml b/app/views/about/_login.html.haml index d286f0d3c..fa58f04d7 100644 --- a/app/views/about/_login.html.haml +++ b/app/views/about/_login.html.haml @@ -1,4 +1,4 @@ -= simple_form_for(new_user, url: user_session_path) do |f| += simple_form_for(new_user, url: user_session_path, namespace: 'login') do |f| .fields-group - if use_seamless_external_login? = f.input :email, placeholder: t('simple_form.labels.defaults.username_or_email'), input_html: { 'aria-label' => t('simple_form.labels.defaults.username_or_email') }, hint: false diff --git a/app/views/about/_registration.html.haml b/app/views/about/_registration.html.haml index ff32ec8c4..1333c68c4 100644 --- a/app/views/about/_registration.html.haml +++ b/app/views/about/_registration.html.haml @@ -1,4 +1,4 @@ -= simple_form_for(new_user, url: user_registration_path) do |f| += simple_form_for(new_user, url: user_registration_path, namespace: 'registration') do |f| .simple_form__overlay-area %p.lead= t('about.federation_hint_html', instance: content_tag(:strong, site_hostname)) From 17389c63c848e06b646a971c04ec055f371b92cb Mon Sep 17 00:00:00 2001 From: ThibG Date: Tue, 10 Sep 2019 20:56:07 +0200 Subject: [PATCH 057/134] Change /admin/custom_emoji to honor the auto_play_gif setting (#11801) Fixes #9535 --- app/helpers/application_helper.rb | 8 ++++++-- app/views/admin/custom_emojis/_custom_emoji.html.haml | 2 +- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/app/helpers/application_helper.rb b/app/helpers/application_helper.rb index 23cbb1d93..defd97609 100644 --- a/app/helpers/application_helper.rb +++ b/app/helpers/application_helper.rb @@ -77,8 +77,12 @@ module ApplicationHelper content_tag(:i, nil, attributes.merge(class: class_names.join(' '))) end - def custom_emoji_tag(custom_emoji) - image_tag(custom_emoji.image.url, class: 'emojione', alt: ":#{custom_emoji.shortcode}:") + def custom_emoji_tag(custom_emoji, animate = true) + if animate + image_tag(custom_emoji.image.url, class: 'emojione', alt: ":#{custom_emoji.shortcode}:") + else + image_tag(custom_emoji.image.url(:static), class: 'emojione custom-emoji', alt: ":#{custom_emoji.shortcode}", 'data-original' => full_asset_url(custom_emoji.image.url), 'data-static' => full_asset_url(custom_emoji.image.url(:static))) + end end def opengraph(property, content) diff --git a/app/views/admin/custom_emojis/_custom_emoji.html.haml b/app/views/admin/custom_emojis/_custom_emoji.html.haml index 9e06a3b42..2103b0fa7 100644 --- a/app/views/admin/custom_emojis/_custom_emoji.html.haml +++ b/app/views/admin/custom_emojis/_custom_emoji.html.haml @@ -3,7 +3,7 @@ = f.check_box :custom_emoji_ids, { multiple: true, include_hidden: false }, custom_emoji.id .batch-table__row__content.batch-table__row__content--with-image .batch-table__row__content__image - = custom_emoji_tag(custom_emoji) + = custom_emoji_tag(custom_emoji, animate = current_account&.user&.setting_auto_play_gif) .batch-table__row__content__text %samp= ":#{custom_emoji.shortcode}:" From 4faaa5b25e54f863fdf3a68edc5ca664e5a84e4c Mon Sep 17 00:00:00 2001 From: ThibG Date: Tue, 10 Sep 2019 20:56:42 +0200 Subject: [PATCH 058/134] Add updated relationship to follow request API responses (#11800) Fixes #11747 --- app/controllers/api/v1/follow_requests_controller.rb | 8 ++++++-- .../api/v1/follow_requests_controller_spec.rb | 12 ++++++++++++ 2 files changed, 18 insertions(+), 2 deletions(-) diff --git a/app/controllers/api/v1/follow_requests_controller.rb b/app/controllers/api/v1/follow_requests_controller.rb index e6888154e..0ee6e531f 100644 --- a/app/controllers/api/v1/follow_requests_controller.rb +++ b/app/controllers/api/v1/follow_requests_controller.rb @@ -14,12 +14,12 @@ class Api::V1::FollowRequestsController < Api::BaseController def authorize AuthorizeFollowService.new.call(account, current_account) NotifyService.new.call(current_account, Follow.find_by(account: account, target_account: current_account)) - render_empty + render json: account, serializer: REST::RelationshipSerializer, relationships: relationships end def reject RejectFollowService.new.call(account, current_account) - render_empty + render json: account, serializer: REST::RelationshipSerializer, relationships: relationships end private @@ -28,6 +28,10 @@ class Api::V1::FollowRequestsController < Api::BaseController Account.find(params[:id]) end + def relationships(**options) + AccountRelationshipsPresenter.new([params[:id]], current_user.account_id, options) + end + def load_accounts default_accounts.merge(paginated_follow_requests).to_a end diff --git a/spec/controllers/api/v1/follow_requests_controller_spec.rb b/spec/controllers/api/v1/follow_requests_controller_spec.rb index 87292d9ce..ae92a9627 100644 --- a/spec/controllers/api/v1/follow_requests_controller_spec.rb +++ b/spec/controllers/api/v1/follow_requests_controller_spec.rb @@ -38,6 +38,12 @@ RSpec.describe Api::V1::FollowRequestsController, type: :controller do it 'allows follower to follow' do expect(follower.following?(user.account)).to be true end + + it 'returns JSON with followed_by=true' do + json = body_as_json + + expect(json[:followed_by]).to be true + end end describe 'POST #reject' do @@ -54,5 +60,11 @@ RSpec.describe Api::V1::FollowRequestsController, type: :controller do it 'removes follow request' do expect(FollowRequest.where(target_account: user.account, account: follower).count).to eq 0 end + + it 'returns JSON with followed_by=false' do + json = body_as_json + + expect(json[:followed_by]).to be false + end end end From 4fe127664b0ae22a528b4a4467ab2de92e3da3ef Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tao=20Bror=20Bojl=C3=A9n?= Date: Wed, 11 Sep 2019 07:44:58 +0100 Subject: [PATCH 059/134] add admin setting for default search engine indexing (fix #11750) (#11804) --- app/lib/settings/scoped_settings.rb | 1 + app/models/form/admin_settings.rb | 2 ++ app/views/admin/settings/edit.html.haml | 3 +++ config/locales/en.yml | 3 +++ spec/controllers/application_controller_spec.rb | 1 + 5 files changed, 10 insertions(+) diff --git a/app/lib/settings/scoped_settings.rb b/app/lib/settings/scoped_settings.rb index 3653ab114..9ca39510a 100644 --- a/app/lib/settings/scoped_settings.rb +++ b/app/lib/settings/scoped_settings.rb @@ -4,6 +4,7 @@ module Settings class ScopedSettings DEFAULTING_TO_UNSCOPED = %w( theme + noindex ).freeze def initialize(object) diff --git a/app/models/form/admin_settings.rb b/app/models/form/admin_settings.rb index 6bc3ca9f5..24196e182 100644 --- a/app/models/form/admin_settings.rb +++ b/app/models/form/admin_settings.rb @@ -32,6 +32,7 @@ class Form::AdminSettings trends show_domain_blocks show_domain_blocks_rationale + noindex ).freeze BOOLEAN_KEYS = %i( @@ -45,6 +46,7 @@ class Form::AdminSettings profile_directory spam_check_enabled trends + noindex ).freeze UPLOAD_KEYS = %i( diff --git a/app/views/admin/settings/edit.html.haml b/app/views/admin/settings/edit.html.haml index 28880c087..752386b3c 100644 --- a/app/views/admin/settings/edit.html.haml +++ b/app/views/admin/settings/edit.html.haml @@ -71,6 +71,9 @@ .fields-group = f.input :trends, as: :boolean, wrapper: :with_label, label: t('admin.settings.trends.title'), hint: t('admin.settings.trends.desc_html') + .fields-group + = f.input :noindex, as: :boolean, wrapper: :with_label, label: t('admin.settings.default_noindex.title'), hint: t('admin.settings.default_noindex.desc_html') + .fields-group = f.input :spam_check_enabled, as: :boolean, wrapper: :with_label, label: t('admin.settings.spam_check_enabled.title'), hint: t('admin.settings.spam_check_enabled.desc_html') diff --git a/config/locales/en.yml b/config/locales/en.yml index 52cb4a269..0a5ca31c1 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -427,6 +427,9 @@ en: custom_css: desc_html: Modify the look with CSS loaded on every page title: Custom CSS + default_noindex: + desc_html: Affects all users who have not changed this setting themselves + title: Opt users out of search engine indexing by default domain_blocks: all: To everyone disabled: To no one diff --git a/spec/controllers/application_controller_spec.rb b/spec/controllers/application_controller_spec.rb index 1811500df..da4a794cd 100644 --- a/spec/controllers/application_controller_spec.rb +++ b/spec/controllers/application_controller_spec.rb @@ -110,6 +110,7 @@ describe ApplicationController, type: :controller do sign_in current_user allow(Setting).to receive(:[]).with('theme').and_return 'contrast' + allow(Setting).to receive(:[]).with('noindex').and_return false expect(controller.view_context.current_theme).to eq 'contrast' end From c5d37f18cb3f4d6212fb8f3e1c4e1e027f677ec5 Mon Sep 17 00:00:00 2001 From: Eugen Rochko Date: Wed, 11 Sep 2019 16:32:44 +0200 Subject: [PATCH 060/134] Change deletes to preserve soft-deleted statuses in unresolved reports (#11805) Change all account actions except "none" to resolve all unresolved reports Refactor `SuspendAccountService` to be more readable --- app/controllers/admin/accounts_controller.rb | 2 +- .../admin/report_notes_controller.rb | 9 ++- .../api/v1/admin/accounts_controller.rb | 2 +- app/lib/activitypub/activity/delete.rb | 3 +- app/models/account.rb | 1 + app/models/admin/account_action.rb | 24 +++++-- app/models/form/account_batch.rb | 2 +- app/models/form/status_batch.rb | 2 +- app/models/report.rb | 1 + app/models/status.rb | 4 ++ app/models/user.rb | 4 ++ app/services/block_domain_service.rb | 2 +- app/services/remove_status_service.rb | 7 ++- app/services/suspend_account_service.rb | 62 ++++++++++++++----- app/services/unallow_domain_service.rb | 2 +- app/workers/admin/suspension_worker.rb | 2 +- lib/mastodon/accounts_cli.rb | 4 +- lib/mastodon/domains_cli.rb | 2 +- .../reported_statuses_controller_spec.rb | 2 +- .../admin/statuses_controller_spec.rb | 2 +- spec/models/form/status_batch_spec.rb | 4 +- 21 files changed, 98 insertions(+), 45 deletions(-) diff --git a/app/controllers/admin/accounts_controller.rb b/app/controllers/admin/accounts_controller.rb index 2fa1dfe5f..68b6352f8 100644 --- a/app/controllers/admin/accounts_controller.rb +++ b/app/controllers/admin/accounts_controller.rb @@ -41,7 +41,7 @@ module Admin def reject authorize @account.user, :reject? - SuspendAccountService.new.call(@account, including_user: true, destroy: true, skip_distribution: true) + SuspendAccountService.new.call(@account, reserve_email: false, reserve_username: false) redirect_to admin_pending_accounts_path end diff --git a/app/controllers/admin/report_notes_controller.rb b/app/controllers/admin/report_notes_controller.rb index bcb3f2026..b816c5b5d 100644 --- a/app/controllers/admin/report_notes_controller.rb +++ b/app/controllers/admin/report_notes_controller.rb @@ -5,10 +5,10 @@ module Admin before_action :set_report_note, only: [:destroy] def create - authorize ReportNote, :create? + authorize :report_note, :create? @report_note = current_account.report_notes.new(resource_params) - @report = @report_note.report + @report = @report_note.report if @report_note.save if params[:create_and_resolve] @@ -26,9 +26,8 @@ module Admin redirect_to admin_report_path(@report), notice: I18n.t('admin.report_notes.created_msg') else - @report_notes = @report.notes.latest - @report_history = @report.history - @form = Form::StatusBatch.new + @report_notes = (@report.notes.latest + @report.history + @report.target_account.targeted_account_warnings.latest.custom).sort_by(&:created_at) + @form = Form::StatusBatch.new render template: 'admin/reports/show' end diff --git a/app/controllers/api/v1/admin/accounts_controller.rb b/app/controllers/api/v1/admin/accounts_controller.rb index c306180ca..c35ea5ab2 100644 --- a/app/controllers/api/v1/admin/accounts_controller.rb +++ b/app/controllers/api/v1/admin/accounts_controller.rb @@ -58,7 +58,7 @@ class Api::V1::Admin::AccountsController < Api::BaseController def reject authorize @account.user, :reject? - SuspendAccountService.new.call(@account, including_user: true, destroy: true, skip_distribution: true) + SuspendAccountService.new.call(@account, reserve_email: false, reserve_username: false) render json: @account, serializer: REST::Admin::AccountSerializer end diff --git a/app/lib/activitypub/activity/delete.rb b/app/lib/activitypub/activity/delete.rb index 345060462..dc9ff580c 100644 --- a/app/lib/activitypub/activity/delete.rb +++ b/app/lib/activitypub/activity/delete.rb @@ -13,8 +13,7 @@ class ActivityPub::Activity::Delete < ActivityPub::Activity def delete_person lock_or_return("delete_in_progress:#{@account.id}") do - SuspendAccountService.new.call(@account) - @account.destroy! + SuspendAccountService.new.call(@account, reserve_username: false) end end diff --git a/app/models/account.rb b/app/models/account.rb index 8c9388b95..55fe53fae 100644 --- a/app/models/account.rb +++ b/app/models/account.rb @@ -115,6 +115,7 @@ class Account < ApplicationRecord :approved?, :pending?, :disabled?, + :unconfirmed_or_pending?, :role, :admin?, :moderator?, diff --git a/app/models/admin/account_action.rb b/app/models/admin/account_action.rb index c7da8b52c..b30a82369 100644 --- a/app/models/admin/account_action.rb +++ b/app/models/admin/account_action.rb @@ -83,19 +83,23 @@ class Admin::AccountAction # A log entry is only interesting if the warning contains # custom text from someone. Otherwise it's just noise. + log_action(:create, warning) if warning.text.present? end def process_reports! - return if report_id.blank? + # If we're doing "mark as resolved" on a single report, + # then we want to keep other reports open in case they + # contain new actionable information. + # + # Otherwise, we will mark all unresolved reports about + # the account as resolved. - authorize(report, :update?) + reports.each { |report| authorize(report, :update?) } - if type == 'none' + reports.each do |report| log_action(:resolve, report) report.resolve!(current_account) - else - Report.where(target_account: target_account).unresolved.update_all(action_taken: true, action_taken_by_account_id: current_account.id) end end @@ -141,6 +145,16 @@ class Admin::AccountAction @report.status_ids if @report && include_statuses end + def reports + @reports ||= begin + if type == 'none' && with_report? + [report] + else + Report.where(target_account: target_account).unresolved + end + end + end + def warning_preset @warning_preset ||= AccountWarningPreset.find(warning_preset_id) if warning_preset_id.present? end diff --git a/app/models/form/account_batch.rb b/app/models/form/account_batch.rb index f1b7a4566..0b285fde9 100644 --- a/app/models/form/account_batch.rb +++ b/app/models/form/account_batch.rb @@ -69,6 +69,6 @@ class Form::AccountBatch records = accounts.includes(:user) records.each { |account| authorize(account.user, :reject?) } - .each { |account| SuspendAccountService.new.call(account, including_user: true, destroy: true, skip_distribution: true) } + .each { |account| SuspendAccountService.new.call(account, reserve_email: false, reserve_username: false) } end end diff --git a/app/models/form/status_batch.rb b/app/models/form/status_batch.rb index e09cc2594..c4943a7ea 100644 --- a/app/models/form/status_batch.rb +++ b/app/models/form/status_batch.rb @@ -35,7 +35,7 @@ class Form::StatusBatch def delete_statuses Status.where(id: status_ids).reorder(nil).find_each do |status| status.discard - RemovalWorker.perform_async(status.id, redraft: false) + RemovalWorker.perform_async(status.id, immediate: true) Tombstone.find_or_create_by(uri: status.uri, account: status.account, by_moderator: true) log_action :destroy, status end diff --git a/app/models/report.rb b/app/models/report.rb index 1e707ff1c..fb2e040ee 100644 --- a/app/models/report.rb +++ b/app/models/report.rb @@ -59,6 +59,7 @@ class Report < ApplicationRecord end def resolve!(acting_account) + RemovalWorker.push_bulk(Status.with_discarded.discarded.where(id: status_ids).pluck(:id)) { |status_id| [status_id, { immediate: true }] } update!(action_taken: true, action_taken_by_account_id: acting_account.id) end diff --git a/app/models/status.rb b/app/models/status.rb index 9cfaddcec..471bb03b4 100644 --- a/app/models/status.rb +++ b/app/models/status.rb @@ -214,6 +214,10 @@ class Status < ApplicationRecord !sensitive? && with_media? end + def reported? + @reported ||= Report.where(target_account: account).unresolved.where('? = ANY(status_ids)', id).exists? + end + def emojis return @emojis if defined?(@emojis) diff --git a/app/models/user.rb b/app/models/user.rb index 95f1d8fc5..78b82a68f 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -171,6 +171,10 @@ class User < ApplicationRecord confirmed? && approved? && !disabled? && !account.suspended? end + def unconfirmed_or_pending? + !(confirmed? && approved?) + end + def inactive_message !approved? ? :pending : super end diff --git a/app/services/block_domain_service.rb b/app/services/block_domain_service.rb index 0ec6be503..ae461abf2 100644 --- a/app/services/block_domain_service.rb +++ b/app/services/block_domain_service.rb @@ -53,7 +53,7 @@ class BlockDomainService < BaseService def suspend_accounts! blocked_domain_accounts.without_suspended.reorder(nil).find_each do |account| - SuspendAccountService.new.call(account, suspended_at: @domain_block.created_at) + SuspendAccountService.new.call(account, reserve_username: true, suspended_at: @domain_block.created_at) end end diff --git a/app/services/remove_status_service.rb b/app/services/remove_status_service.rb index 685c1d4bf..f9352ed3d 100644 --- a/app/services/remove_status_service.rb +++ b/app/services/remove_status_service.rb @@ -8,7 +8,8 @@ class RemoveStatusService < BaseService # @param [Status] status # @param [Hash] options # @option [Boolean] :redraft - # @options [Boolean] :original_removed + # @option [Boolean] :immediate + # @option [Boolean] :original_removed def call(status, **options) @payload = Oj.dump(event: :delete, payload: status.id.to_s) @status = status @@ -31,7 +32,7 @@ class RemoveStatusService < BaseService remove_from_spam_check remove_media - @status.destroy! + @status.destroy! if @options[:immediate] || !@status.reported? else raise Mastodon::RaceConditionError end @@ -150,7 +151,7 @@ class RemoveStatusService < BaseService end def remove_media - return if @options[:redraft] + return if @options[:redraft] || (!@options[:immediate] && @status.reported?) @status.media_attachments.destroy_all end diff --git a/app/services/suspend_account_service.rb b/app/services/suspend_account_service.rb index 85da7e921..ecc893931 100644 --- a/app/services/suspend_account_service.rb +++ b/app/services/suspend_account_service.rb @@ -15,7 +15,6 @@ class SuspendAccountService < BaseService favourites follow_requests list_accounts - media_attachments mute_relationships muted_by_relationships notifications @@ -32,14 +31,26 @@ class SuspendAccountService < BaseService targeted_reports ).freeze - # Suspend an account and remove as much of its data as possible + # Suspend or remove an account and remove as much of its data + # as possible. If it's a local account and it has not been confirmed + # or never been approved, then side effects are skipped and both + # the user and account records are removed fully. Otherwise, + # it is controlled by options. # @param [Account] # @param [Hash] options - # @option [Boolean] :including_user Remove the user record as well - # @option [Boolean] :destroy Remove the account record instead of suspending + # @option [Boolean] :reserve_email Keep user record. Only applicable for local accounts + # @option [Boolean] :reserve_username Keep account record + # @option [Boolean] :skip_side_effects Side effects are ActivityPub and streaming API payloads + # @option [Time] :suspended_at Only applicable when :reserve_username is true def call(account, **options) @account = account - @options = options + @options = { reserve_username: true, reserve_email: true }.merge(options) + + if @account.local? && @account.user_unconfirmed_or_pending? + @options[:reserve_email] = false + @options[:reserve_username] = false + @options[:skip_side_effects] = true + end reject_follows! purge_user! @@ -60,27 +71,39 @@ class SuspendAccountService < BaseService def purge_user! return if !@account.local? || @account.user.nil? - if @options[:including_user] - @options[:destroy] = true if !@account.user_confirmed? || @account.user_pending? - @account.user.destroy - else + if @options[:reserve_email] @account.user.disable! @account.user.invites.where(uses: 0).destroy_all + else + @account.user.destroy end end def purge_content! - distribute_delete_actor! if @account.local? && !@options[:skip_distribution] + distribute_delete_actor! if @account.local? && !@options[:skip_side_effects] @account.statuses.reorder(nil).find_in_batches do |statuses| - BatchedRemoveStatusService.new.call(statuses, skip_side_effects: @options[:destroy]) + statuses.reject! { |status| reported_status_ids.include?(status.id) } if @options[:reserve_username] + BatchedRemoveStatusService.new.call(statuses, skip_side_effects: @options[:skip_side_effects]) + end + + @account.media_attachments.reorder(nil).find_each do |media_attachment| + next if @options[:reserve_username] && reported_status_ids.include?(media_attachment.status_id) + + media_attachment.destroy + end + + @account.polls.reorder(nil).find_each do |poll| + next if @options[:reserve_username] && reported_status_ids.include?(poll.status_id) + + poll.destroy end associations_for_destruction.each do |association_name| destroy_all(@account.public_send(association_name)) end - @account.destroy if @options[:destroy] + @account.destroy unless @options[:reserve_username] end def purge_profile! @@ -88,11 +111,13 @@ class SuspendAccountService < BaseService # there is no point wasting time updating # its values first - return if @options[:destroy] + return unless @options[:reserve_username] @account.silenced_at = nil @account.suspended_at = @options[:suspended_at] || Time.now.utc @account.locked = false + @account.memorial = false + @account.discoverable = false @account.display_name = '' @account.note = '' @account.fields = [] @@ -100,6 +125,7 @@ class SuspendAccountService < BaseService @account.followers_count = 0 @account.following_count = 0 @account.moved_to_account = nil + @account.trust_level = :untrusted @account.avatar.destroy @account.header.destroy @account.save! @@ -135,11 +161,15 @@ class SuspendAccountService < BaseService Account.inboxes - delivery_inboxes end + def reported_status_ids + @reported_status_ids ||= Report.where(target_account: @account).unresolved.pluck(:status_ids).flatten.uniq + end + def associations_for_destruction - if @options[:destroy] - ASSOCIATIONS_ON_SUSPEND + ASSOCIATIONS_ON_DESTROY - else + if @options[:reserve_username] ASSOCIATIONS_ON_SUSPEND + else + ASSOCIATIONS_ON_SUSPEND + ASSOCIATIONS_ON_DESTROY end end end diff --git a/app/services/unallow_domain_service.rb b/app/services/unallow_domain_service.rb index d4387c1a1..bd1ad328d 100644 --- a/app/services/unallow_domain_service.rb +++ b/app/services/unallow_domain_service.rb @@ -3,7 +3,7 @@ class UnallowDomainService < BaseService def call(domain_allow) Account.where(domain: domain_allow.domain).find_each do |account| - SuspendAccountService.new.call(account, destroy: true) + SuspendAccountService.new.call(account, reserve_username: false) end domain_allow.destroy diff --git a/app/workers/admin/suspension_worker.rb b/app/workers/admin/suspension_worker.rb index ae8b24d8c..83c815efd 100644 --- a/app/workers/admin/suspension_worker.rb +++ b/app/workers/admin/suspension_worker.rb @@ -6,6 +6,6 @@ class Admin::SuspensionWorker sidekiq_options queue: 'pull' def perform(account_id, remove_user = false) - SuspendAccountService.new.call(Account.find(account_id), including_user: remove_user) + SuspendAccountService.new.call(Account.find(account_id), reserve_username: true, reserve_email: !remove_user) end end diff --git a/lib/mastodon/accounts_cli.rb b/lib/mastodon/accounts_cli.rb index b16bf2e38..a09a6ab04 100644 --- a/lib/mastodon/accounts_cli.rb +++ b/lib/mastodon/accounts_cli.rb @@ -185,7 +185,7 @@ module Mastodon end say("Deleting user with #{account.statuses_count} statuses, this might take a while...") - SuspendAccountService.new.call(account, including_user: true) + SuspendAccountService.new.call(account, reserve_email: false) say('OK', :green) end @@ -239,7 +239,7 @@ module Mastodon end if [404, 410].include?(code) - SuspendAccountService.new.call(account, destroy: true) unless options[:dry_run] + SuspendAccountService.new.call(account, reserve_username: false) unless options[:dry_run] 1 else # Touch account even during dry run to avoid getting the account into the window again diff --git a/lib/mastodon/domains_cli.rb b/lib/mastodon/domains_cli.rb index c612c2d72..8e52de1c3 100644 --- a/lib/mastodon/domains_cli.rb +++ b/lib/mastodon/domains_cli.rb @@ -42,7 +42,7 @@ module Mastodon end processed, = parallelize_with_progress(scope) do |account| - SuspendAccountService.new.call(account, destroy: true) unless options[:dry_run] + SuspendAccountService.new.call(account, reserve_username: false, skip_side_effects: true) unless options[:dry_run] end DomainBlock.where(domain: domain).destroy_all unless options[:dry_run] diff --git a/spec/controllers/admin/reported_statuses_controller_spec.rb b/spec/controllers/admin/reported_statuses_controller_spec.rb index bd146b795..2a1598123 100644 --- a/spec/controllers/admin/reported_statuses_controller_spec.rb +++ b/spec/controllers/admin/reported_statuses_controller_spec.rb @@ -47,7 +47,7 @@ describe Admin::ReportedStatusesController do it 'removes a status' do allow(RemovalWorker).to receive(:perform_async) subject.call - expect(RemovalWorker).to have_received(:perform_async).with(status_ids.first, redraft: false) + expect(RemovalWorker).to have_received(:perform_async).with(status_ids.first, immediate: true) end end diff --git a/spec/controllers/admin/statuses_controller_spec.rb b/spec/controllers/admin/statuses_controller_spec.rb index 6b06343ef..d9690d83f 100644 --- a/spec/controllers/admin/statuses_controller_spec.rb +++ b/spec/controllers/admin/statuses_controller_spec.rb @@ -65,7 +65,7 @@ describe Admin::StatusesController do it 'removes a status' do allow(RemovalWorker).to receive(:perform_async) subject.call - expect(RemovalWorker).to have_received(:perform_async).with(status_ids.first, redraft: false) + expect(RemovalWorker).to have_received(:perform_async).with(status_ids.first, immediate: true) end end diff --git a/spec/models/form/status_batch_spec.rb b/spec/models/form/status_batch_spec.rb index f9c58c90f..68d84a737 100644 --- a/spec/models/form/status_batch_spec.rb +++ b/spec/models/form/status_batch_spec.rb @@ -41,12 +41,12 @@ describe Form::StatusBatch do it 'call RemovalWorker' do form.save - expect(RemovalWorker).to have_received(:perform_async).with(status.id, redraft: false) + expect(RemovalWorker).to have_received(:perform_async).with(status.id, immediate: true) end it 'do not call RemovalWorker' do form.save - expect(RemovalWorker).not_to have_received(:perform_async).with(another_status.id, redraft: false) + expect(RemovalWorker).not_to have_received(:perform_async).with(another_status.id, immediate: true) end end end From 3a3b40e0c36902b66526303af8d5fdecb8bab5c2 Mon Sep 17 00:00:00 2001 From: Eugen Rochko Date: Thu, 12 Sep 2019 01:51:01 +0200 Subject: [PATCH 061/134] Fix nil error in warning e-mail template (#11812) --- app/views/user_mailer/warning.html.haml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/views/user_mailer/warning.html.haml b/app/views/user_mailer/warning.html.haml index 89dc2a75d..5a2911ecb 100644 --- a/app/views/user_mailer/warning.html.haml +++ b/app/views/user_mailer/warning.html.haml @@ -58,7 +58,7 @@ %table.content-section{ cellspacing: 0, cellpadding: 0 } %tbody %tr - %td.content-cell{ class: @statuses.empty? ? '' : 'content-start' } + %td.content-cell{ class: @statuses.nil? || @statuses.empty? ? '' : 'content-start' } %table.column{ cellspacing: 0, cellpadding: 0 } %tbody %tr From 16cdaa1110878f84a542f0f9a6b323ba800f4e81 Mon Sep 17 00:00:00 2001 From: Eugen Rochko Date: Thu, 12 Sep 2019 01:51:12 +0200 Subject: [PATCH 062/134] Fix uncaught errors in media proxy controller (#11811) --- app/controllers/media_proxy_controller.rb | 2 ++ 1 file changed, 2 insertions(+) diff --git a/app/controllers/media_proxy_controller.rb b/app/controllers/media_proxy_controller.rb index 558cd6e30..47544f21c 100644 --- a/app/controllers/media_proxy_controller.rb +++ b/app/controllers/media_proxy_controller.rb @@ -8,6 +8,8 @@ class MediaProxyController < ApplicationController before_action :authenticate_user!, if: :whitelist_mode? rescue_from ActiveRecord::RecordInvalid, with: :not_found + rescue_from Mastodon::UnexpectedResponseError, with: :not_found + rescue_from HTTP::TimeoutError, HTTP::ConnectionError, OpenSSL::SSL::SSLError, with: :internal_server_error def show RedisLock.acquire(lock_options) do |lock| From 9361981388ed372b0502aec7d74fee9cacb4cf86 Mon Sep 17 00:00:00 2001 From: Eugen Rochko Date: Thu, 12 Sep 2019 04:58:33 +0200 Subject: [PATCH 063/134] Add missing locale file for ga and add rake task to check for it (#11813) * Add missing locale file for ga and add rake task to check for it * Update lib/tasks/repo.rake Co-Authored-By: Yamagishi Kazutoshi * Fix check-i18n build --- .circleci/config.yml | 2 ++ app/javascript/mastodon/locales/ga.json | 1 + lib/tasks/repo.rake | 15 +++++++++++++++ 3 files changed, 18 insertions(+) create mode 100644 app/javascript/mastodon/locales/ga.json diff --git a/.circleci/config.yml b/.circleci/config.yml index 8ab08ebae..ff8eb4859 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -173,9 +173,11 @@ jobs: <<: *defaults steps: - *attach_workspace + - *install_system_dependencies - run: bundle exec i18n-tasks check-normalized - run: bundle exec i18n-tasks unused -l en - run: bundle exec i18n-tasks check-consistent-interpolations + - run: bundle exec rake repo:check_locales_files workflows: version: 2 diff --git a/app/javascript/mastodon/locales/ga.json b/app/javascript/mastodon/locales/ga.json new file mode 100644 index 000000000..0967ef424 --- /dev/null +++ b/app/javascript/mastodon/locales/ga.json @@ -0,0 +1 @@ +{} diff --git a/lib/tasks/repo.rake b/lib/tasks/repo.rake index 8ceec3085..d1de17b7c 100644 --- a/lib/tasks/repo.rake +++ b/lib/tasks/repo.rake @@ -76,4 +76,19 @@ namespace :repo do tmp.unlink end end + + task check_locales_files: :environment do + pastel = Pastel.new + + missing_yaml_files = I18n.available_locales.reject { |locale| File.exist?(Rails.root.join('config', 'locales', "#{locale}.yml")) } + missing_json_files = I18n.available_locales.reject { |locale| File.exist?(Rails.root.join('app', 'javascript', 'mastodon', 'locales', "#{locale}.json")) } + + if missing_json_files.empty? && missing_yaml_files.empty? + puts pastel.green('OK') + else + puts pastel.red("Missing YAML files: #{pastel.bold(missing_yaml_files.join(', '))}") unless missing_yaml_files.empty? + puts pastel.red("Missing JSON files: #{pastel.bold(missing_json_files.join(', '))}") unless missing_json_files.empty? + exit(1) + end + end end From 50755a47b4f0999f8c49501ff4fa4c2ef676fa0e Mon Sep 17 00:00:00 2001 From: Eugen Rochko Date: Thu, 12 Sep 2019 20:14:59 +0200 Subject: [PATCH 064/134] Fix scroll position resetting when opening media modals in web UI (#11815) --- app/javascript/mastodon/containers/mastodon.js | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/app/javascript/mastodon/containers/mastodon.js b/app/javascript/mastodon/containers/mastodon.js index 542b68282..3ac58cf7c 100644 --- a/app/javascript/mastodon/containers/mastodon.js +++ b/app/javascript/mastodon/containers/mastodon.js @@ -12,6 +12,8 @@ import { hydrateStore } from '../actions/store'; import { connectUserStream } from '../actions/streaming'; import { IntlProvider, addLocaleData } from 'react-intl'; import { getLocale } from '../locales'; +import { previewState as previewMediaState } from 'mastodon/features/ui/components/media_modal'; +import { previewState as previewVideoState } from 'mastodon/features/ui/components/video_modal'; import initialState from '../initial_state'; import ErrorBoundary from '../components/error_boundary'; @@ -35,6 +37,10 @@ class MastodonMount extends React.PureComponent { showIntroduction: PropTypes.bool, }; + shouldUpdateScroll (_, { location }) { + return location.state !== previewMediaState && location.state !== previewVideoState; + } + render () { const { showIntroduction } = this.props; @@ -44,7 +50,7 @@ class MastodonMount extends React.PureComponent { return ( - + From bc869501f5cf98a99b18f6d1bcab3b51db04008d Mon Sep 17 00:00:00 2001 From: Eugen Rochko Date: Fri, 13 Sep 2019 16:00:19 +0200 Subject: [PATCH 065/134] Fix name of Portuguese language not including Portugal (#11820) Fix #11602 --- app/helpers/settings_helper.rb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/helpers/settings_helper.rb b/app/helpers/settings_helper.rb index 92bc222ea..0cfde7edc 100644 --- a/app/helpers/settings_helper.rb +++ b/app/helpers/settings_helper.rb @@ -42,8 +42,8 @@ module SettingsHelper no: 'Norsk', oc: 'Occitan', pl: 'Polski', - pt: 'Português', - 'pt-BR': 'Português do Brasil', + pt: 'Português (Portugal)', + 'pt-BR': 'Português (Brasil)', ro: 'Română', ru: 'Русский', sk: 'Slovenčina', From b6381bdc7dcfe5713b99e2aae0491115350c7724 Mon Sep 17 00:00:00 2001 From: Eugen Rochko Date: Fri, 13 Sep 2019 16:00:34 +0200 Subject: [PATCH 066/134] Change max length of media descriptions from 420 to 1500 characters (#11819) Fix #11658 --- .../mastodon/features/ui/components/focal_point_modal.js | 2 +- app/models/media_attachment.rb | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/app/javascript/mastodon/features/ui/components/focal_point_modal.js b/app/javascript/mastodon/features/ui/components/focal_point_modal.js index 735e445e8..d13138a76 100644 --- a/app/javascript/mastodon/features/ui/components/focal_point_modal.js +++ b/app/javascript/mastodon/features/ui/components/focal_point_modal.js @@ -223,7 +223,7 @@ class FocalPointModal extends ImmutablePureComponent {
- +
-
From a31b89dd717af0ec70f8d7d909515a1f4b5137f5 Mon Sep 17 00:00:00 2001 From: Eugen Rochko Date: Sat, 14 Sep 2019 10:36:10 +0200 Subject: [PATCH 078/134] Revert "Bump webpush from 0.3.8 to 1.0.0 (#11614)" (#11840) This reverts commit 9045f5e3f8aabcdff908058764882b7165a03925. --- Gemfile.lock | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Gemfile.lock b/Gemfile.lock index 6e931c611..1eaf63cac 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -321,7 +321,7 @@ GEM multi_json (~> 1.12) rdf (~> 3.0) jsonapi-renderer (0.2.2) - jwt (2.2.1) + jwt (2.1.0) kaminari (1.1.1) activesupport (>= 4.1.0) kaminari-actionview (= 1.1.1) @@ -654,7 +654,7 @@ GEM activesupport (>= 4.2) rack-proxy (>= 0.6.1) railties (>= 4.2) - webpush (1.0.0) + webpush (0.3.8) hkdf (~> 0.2) jwt (~> 2.0) websocket-driver (0.7.0) From e41527f505161ebd2cc687d1ac57d5c56c56e84f Mon Sep 17 00:00:00 2001 From: Eugen Rochko Date: Sat, 14 Sep 2019 11:40:13 +0200 Subject: [PATCH 079/134] Update Crowdin configuration file --- crowdin.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/crowdin.yml b/crowdin.yml index f94417f2e..88a24d621 100644 --- a/crowdin.yml +++ b/crowdin.yml @@ -1,4 +1,4 @@ -commit_message: "[ci skip]" +commit_message: '[ci skip]' files: - source: /app/javascript/mastodon/locales/en.json translation: /app/javascript/mastodon/locales/%two_letters_code%.json From 1511638975de077b6b8d5397a830239bb317a016 Mon Sep 17 00:00:00 2001 From: mayaeh Date: Sun, 15 Sep 2019 22:48:00 +0900 Subject: [PATCH 080/134] Change the hashtag link from WebUI to public page (#11845) --- app/views/admin/tags/show.html.haml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/views/admin/tags/show.html.haml b/app/views/admin/tags/show.html.haml index d54a43c1e..1d970d637 100644 --- a/app/views/admin/tags/show.html.haml +++ b/app/views/admin/tags/show.html.haml @@ -3,7 +3,7 @@ .dashboard__counters %div - = link_to web_url("timelines/tag/#{@tag.name}") do + = link_to tag_url(@tag), target: '_blank', rel: 'noopener' do .dashboard__counters__num= number_with_delimiter @accounts_today .dashboard__counters__label= t 'admin.tags.accounts_today' %div From c707ef49d9b13932f4d98c127ec3148a5cdc3479 Mon Sep 17 00:00:00 2001 From: Eugen Rochko Date: Sun, 15 Sep 2019 21:08:39 +0200 Subject: [PATCH 081/134] Fix 2FA challenge and password challenge for non-database users (#11831) * Fix 2FA challenge not appearing for non-database users Fix #11685 * Fix account deletion not working when using external login Fix #11691 --- app/controllers/auth/sessions_controller.rb | 61 ++++++++----------- .../settings/deletes_controller.rb | 25 ++++++-- app/models/form/delete_confirmation.rb | 2 +- app/views/settings/deletes/show.html.haml | 5 +- config/initializers/devise.rb | 7 ++- config/locales/en.yml | 3 +- .../auth/sessions_controller_spec.rb | 24 +++----- 7 files changed, 66 insertions(+), 61 deletions(-) diff --git a/app/controllers/auth/sessions_controller.rb b/app/controllers/auth/sessions_controller.rb index 7e6dbf19e..3e93b2e68 100644 --- a/app/controllers/auth/sessions_controller.rb +++ b/app/controllers/auth/sessions_controller.rb @@ -8,8 +8,6 @@ class Auth::SessionsController < Devise::SessionsController skip_before_action :require_no_authentication, only: [:create] skip_before_action :require_functional! - prepend_before_action :authenticate_with_two_factor, if: :two_factor_enabled?, only: [:create] - before_action :set_instance_presenter, only: [:new] before_action :set_body_classes @@ -22,9 +20,22 @@ class Auth::SessionsController < Devise::SessionsController end def create - super do |resource| - remember_me(resource) - flash.delete(:notice) + self.resource = begin + if user_params[:email].blank? && session[:otp_user_id].present? + User.find(session[:otp_user_id]) + else + warden.authenticate!(auth_options) + end + end + + if resource.otp_required_for_login? + if user_params[:otp_attempt].present? && session[:otp_user_id].present? + authenticate_with_two_factor_via_otp(resource) + else + prompt_for_two_factor(resource) + end + else + authenticate_and_respond(resource) end end @@ -37,18 +48,6 @@ class Auth::SessionsController < Devise::SessionsController protected - def find_user - if session[:otp_user_id] - User.find(session[:otp_user_id]) - elsif user_params[:email] - if use_seamless_external_login? && Devise.check_at_sign && user_params[:email].index('@').nil? - User.joins(:account).find_by(accounts: { username: user_params[:email] }) - else - User.find_for_authentication(email: user_params[:email]) - end - end - end - def user_params params.require(:user).permit(:email, :password, :otp_attempt) end @@ -71,32 +70,17 @@ class Auth::SessionsController < Devise::SessionsController super end - def two_factor_enabled? - find_user.try(:otp_required_for_login?) - end - def valid_otp_attempt?(user) user.validate_and_consume_otp!(user_params[:otp_attempt]) || user.invalidate_otp_backup_code!(user_params[:otp_attempt]) - rescue OpenSSL::Cipher::CipherError => _error + rescue OpenSSL::Cipher::CipherError false end - def authenticate_with_two_factor - user = self.resource = find_user - - if user_params[:otp_attempt].present? && session[:otp_user_id] - authenticate_with_two_factor_via_otp(user) - elsif user&.valid_password?(user_params[:password]) - prompt_for_two_factor(user) - end - end - def authenticate_with_two_factor_via_otp(user) if valid_otp_attempt?(user) session.delete(:otp_user_id) - remember_me(user) - sign_in(user) + authenticate_and_respond(user) else flash.now[:alert] = I18n.t('users.invalid_otp_token') prompt_for_two_factor(user) @@ -108,6 +92,13 @@ class Auth::SessionsController < Devise::SessionsController render :two_factor end + def authenticate_and_respond(user) + sign_in(user) + remember_me(user) + + respond_with user, location: after_sign_in_path_for(user) + end + private def set_instance_presenter @@ -120,9 +111,11 @@ class Auth::SessionsController < Devise::SessionsController def home_paths(resource) paths = [about_path] + if single_user_mode? && resource.is_a?(User) paths << short_account_path(username: resource.account) end + paths end diff --git a/app/controllers/settings/deletes_controller.rb b/app/controllers/settings/deletes_controller.rb index 97fe4d328..15a59c999 100644 --- a/app/controllers/settings/deletes_controller.rb +++ b/app/controllers/settings/deletes_controller.rb @@ -14,12 +14,11 @@ class Settings::DeletesController < Settings::BaseController end def destroy - if current_user.valid_password?(delete_params[:password]) - Admin::SuspensionWorker.perform_async(current_user.account_id, true) - sign_out + if challenge_passed? + destroy_account! redirect_to new_user_session_path, notice: I18n.t('deletes.success_msg') else - redirect_to settings_delete_path, alert: I18n.t('deletes.bad_password_msg') + redirect_to settings_delete_path, alert: I18n.t('deletes.challenge_not_passed') end end @@ -29,11 +28,25 @@ class Settings::DeletesController < Settings::BaseController redirect_to root_path unless Setting.open_deletion end - def delete_params - params.require(:form_delete_confirmation).permit(:password) + def resource_params + params.require(:form_delete_confirmation).permit(:password, :username) end def require_not_suspended! forbidden if current_account.suspended? end + + def challenge_passed? + if current_user.encrypted_password.blank? + current_account.username == resource_params[:username] + else + current_user.valid_password?(resource_params[:password]) + end + end + + def destroy_account! + current_account.suspend! + Admin::SuspensionWorker.perform_async(current_user.account_id, true) + sign_out + end end diff --git a/app/models/form/delete_confirmation.rb b/app/models/form/delete_confirmation.rb index 0884a09b8..99d04b331 100644 --- a/app/models/form/delete_confirmation.rb +++ b/app/models/form/delete_confirmation.rb @@ -3,5 +3,5 @@ class Form::DeleteConfirmation include ActiveModel::Model - attr_accessor :password + attr_accessor :password, :username end diff --git a/app/views/settings/deletes/show.html.haml b/app/views/settings/deletes/show.html.haml index 6e2ff31c5..08792e0af 100644 --- a/app/views/settings/deletes/show.html.haml +++ b/app/views/settings/deletes/show.html.haml @@ -20,7 +20,10 @@ %hr.spacer/ - = f.input :password, wrapper: :with_block_label, input_html: { :autocomplete => 'off' }, hint: t('deletes.confirm_password') + - if current_user.encrypted_password.present? + = f.input :password, wrapper: :with_block_label, input_html: { :autocomplete => 'off' }, hint: t('deletes.confirm_password') + - else + = f.input :username, wrapper: :with_block_label, input_html: { :autocomplete => 'off' }, hint: t('deletes.confirm_username') .actions = f.button :button, t('deletes.proceed'), type: :submit, class: 'negative' diff --git a/config/initializers/devise.rb b/config/initializers/devise.rb index cd9bacf68..311583820 100644 --- a/config/initializers/devise.rb +++ b/config/initializers/devise.rb @@ -71,10 +71,13 @@ end Devise.setup do |config| config.warden do |manager| + manager.default_strategies(scope: :user).unshift :database_authenticatable manager.default_strategies(scope: :user).unshift :ldap_authenticatable if Devise.ldap_authentication manager.default_strategies(scope: :user).unshift :pam_authenticatable if Devise.pam_authentication - manager.default_strategies(scope: :user).unshift :two_factor_authenticatable - manager.default_strategies(scope: :user).unshift :two_factor_backupable + + # We handle 2FA in our own sessions controller so this gets in the way + manager.default_strategies(scope: :user).delete :two_factor_backupable + manager.default_strategies(scope: :user).delete :two_factor_authenticatable end # The secret key used by Devise. Devise uses this key to generate diff --git a/config/locales/en.yml b/config/locales/en.yml index 0a5ca31c1..8c9fe89f8 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -632,8 +632,9 @@ en: x_months: "%{count}mo" x_seconds: "%{count}s" deletes: - bad_password_msg: The password you entered was incorrect + challenge_not_passed: The information you entered was not correct confirm_password: Enter your current password to verify your identity + confirm_username: Enter your username to confirm the procedure proceed: Delete account success_msg: Your account was successfully deleted warning: diff --git a/spec/controllers/auth/sessions_controller_spec.rb b/spec/controllers/auth/sessions_controller_spec.rb index 87ef4f2bb..7ed5edde0 100644 --- a/spec/controllers/auth/sessions_controller_spec.rb +++ b/spec/controllers/auth/sessions_controller_spec.rb @@ -5,11 +5,11 @@ require 'rails_helper' RSpec.describe Auth::SessionsController, type: :controller do render_views - describe 'GET #new' do - before do - request.env['devise.mapping'] = Devise.mappings[:user] - end + before do + request.env['devise.mapping'] = Devise.mappings[:user] + end + describe 'GET #new' do it 'returns http success' do get :new expect(response).to have_http_status(200) @@ -19,10 +19,6 @@ RSpec.describe Auth::SessionsController, type: :controller do describe 'DELETE #destroy' do let(:user) { Fabricate(:user) } - before do - request.env['devise.mapping'] = Devise.mappings[:user] - end - context 'with a regular user' do it 'redirects to home after sign out' do sign_in(user, scope: :user) @@ -51,10 +47,6 @@ RSpec.describe Auth::SessionsController, type: :controller do end describe 'POST #create' do - before do - request.env['devise.mapping'] = Devise.mappings[:user] - end - context 'using PAM authentication', if: ENV['PAM_ENABLED'] == 'true' do context 'using a valid password' do before do @@ -191,11 +183,11 @@ RSpec.describe Auth::SessionsController, type: :controller do end context 'using two-factor authentication' do - let(:user) do - Fabricate(:user, email: 'x@y.com', password: 'abcdefgh', - otp_required_for_login: true, otp_secret: User.generate_otp_secret(32)) + let!(:user) do + Fabricate(:user, email: 'x@y.com', password: 'abcdefgh', otp_required_for_login: true, otp_secret: User.generate_otp_secret(32)) end - let(:recovery_codes) do + + let!(:recovery_codes) do codes = user.generate_otp_backup_codes! user.save return codes From 08ba494578b428e4a37e059723f98d46e3a8dca8 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Mon, 16 Sep 2019 19:15:21 +0900 Subject: [PATCH 082/134] Bump eslint-plugin-import from 2.18.0 to 2.18.2 (#11849) Bumps [eslint-plugin-import](https://github.com/benmosher/eslint-plugin-import) from 2.18.0 to 2.18.2. - [Release notes](https://github.com/benmosher/eslint-plugin-import/releases) - [Changelog](https://github.com/benmosher/eslint-plugin-import/blob/master/CHANGELOG.md) - [Commits](https://github.com/benmosher/eslint-plugin-import/compare/v2.18.0...v2.18.2) Signed-off-by: dependabot-preview[bot] --- package.json | 2 +- yarn.lock | 10 +++++----- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/package.json b/package.json index b92fed544..506a2f7ce 100644 --- a/package.json +++ b/package.json @@ -174,7 +174,7 @@ "enzyme": "^3.10.0", "enzyme-adapter-react-16": "^1.14.0", "eslint": "^6.1.0", - "eslint-plugin-import": "~2.18.0", + "eslint-plugin-import": "~2.18.2", "eslint-plugin-jsx-a11y": "~6.2.3", "eslint-plugin-promise": "~4.2.1", "eslint-plugin-react": "~7.14.3", diff --git a/yarn.lock b/yarn.lock index 2a4cf6af0..98c9e36d3 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3841,10 +3841,10 @@ eslint-module-utils@^2.4.0: debug "^2.6.8" pkg-dir "^2.0.0" -eslint-plugin-import@~2.18.0: - version "2.18.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.18.0.tgz#7a5ba8d32622fb35eb9c8db195c2090bd18a3678" - integrity sha512-PZpAEC4gj/6DEMMoU2Df01C5c50r7zdGIN52Yfi7CvvWaYssG7Jt5R9nFG5gmqodxNOz9vQS87xk6Izdtpdrig== +eslint-plugin-import@~2.18.2: + version "2.18.2" + resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.18.2.tgz#02f1180b90b077b33d447a17a2326ceb400aceb6" + integrity sha512-5ohpsHAiUBRNaBWAF08izwUGlbrJoJJ+W9/TBwsGoR1MnlgfwMIKrFeSjWbt6moabiXW9xNvtFz+97KHRfI4HQ== dependencies: array-includes "^3.0.3" contains-path "^0.1.0" @@ -3853,8 +3853,8 @@ eslint-plugin-import@~2.18.0: eslint-import-resolver-node "^0.3.2" eslint-module-utils "^2.4.0" has "^1.0.3" - lodash "^4.17.11" minimatch "^3.0.4" + object.values "^1.1.0" read-pkg-up "^2.0.0" resolve "^1.11.0" From b2acbb62f6d6f82d469f0da415896774d34651ee Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Mon, 16 Sep 2019 19:16:02 +0900 Subject: [PATCH 083/134] Bump es6-symbol from 3.1.1 to 3.1.2 (#11851) Bumps [es6-symbol](https://github.com/medikoo/es6-symbol) from 3.1.1 to 3.1.2. - [Release notes](https://github.com/medikoo/es6-symbol/releases) - [Changelog](https://github.com/medikoo/es6-symbol/blob/master/CHANGELOG.md) - [Commits](https://github.com/medikoo/es6-symbol/compare/v3.1.1...v3.1.2) Signed-off-by: dependabot-preview[bot] --- package.json | 2 +- yarn.lock | 45 +++++++++++++++++++++++++-------------------- 2 files changed, 26 insertions(+), 21 deletions(-) diff --git a/package.json b/package.json index 506a2f7ce..a47b3cd0f 100644 --- a/package.json +++ b/package.json @@ -91,7 +91,7 @@ "detect-passive-events": "^1.0.2", "dotenv": "^8.0.0", "emoji-mart": "Gargron/emoji-mart#build", - "es6-symbol": "^3.1.1", + "es6-symbol": "^3.1.2", "escape-html": "^1.0.3", "exif-js": "^2.3.0", "express": "^4.17.1", diff --git a/yarn.lock b/yarn.lock index 98c9e36d3..c908004c7 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3181,12 +3181,13 @@ cyclist@~0.2.2: resolved "https://registry.yarnpkg.com/cyclist/-/cyclist-0.2.2.tgz#1b33792e11e914a2fd6d6ed6447464444e5fa640" integrity sha1-GzN5LhHpFKL9bW7WRHRkRE5fpkA= -d@1: - version "1.0.0" - resolved "https://registry.yarnpkg.com/d/-/d-1.0.0.tgz#754bb5bfe55451da69a58b94d45f4c5b0462d58f" - integrity sha1-dUu1v+VUUdpppYuU1F9MWwRi1Y8= +d@1, d@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/d/-/d-1.0.1.tgz#8698095372d58dbee346ffd0c7093f99f8f9eb5a" + integrity sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA== dependencies: - es5-ext "^0.10.9" + es5-ext "^0.10.50" + type "^1.0.1" damerau-levenshtein@^1.0.4: version "1.0.4" @@ -3725,24 +3726,15 @@ es-to-primitive@^1.1.1, es-to-primitive@^1.2.0: is-date-object "^1.0.1" is-symbol "^1.0.2" -es5-ext@^0.10.14: - version "0.10.50" - resolved "https://registry.yarnpkg.com/es5-ext/-/es5-ext-0.10.50.tgz#6d0e23a0abdb27018e5ac4fd09b412bc5517a778" - integrity sha512-KMzZTPBkeQV/JcSQhI5/z6d9VWJ3EnQ194USTUwIYZ2ZbpN8+SGXQKt1h68EX44+qt+Fzr8DO17vnxrw7c3agw== +es5-ext@^0.10.14, es5-ext@^0.10.35, es5-ext@^0.10.50, es5-ext@^0.10.51, es5-ext@~0.10.14: + version "0.10.51" + resolved "https://registry.yarnpkg.com/es5-ext/-/es5-ext-0.10.51.tgz#ed2d7d9d48a12df86e0299287e93a09ff478842f" + integrity sha512-oRpWzM2WcLHVKpnrcyB7OW8j/s67Ba04JCm0WnNv3RiABSvs7mrQlutB8DBv793gKcp0XENR8Il8WxGTlZ73gQ== dependencies: es6-iterator "~2.0.3" es6-symbol "~3.1.1" next-tick "^1.0.0" -es5-ext@^0.10.35, es5-ext@^0.10.9, es5-ext@~0.10.14: - version "0.10.46" - resolved "https://registry.yarnpkg.com/es5-ext/-/es5-ext-0.10.46.tgz#efd99f67c5a7ec789baa3daa7f79870388f7f572" - integrity sha512-24XxRvJXNFwEMpJb3nOkiRJKRoupmjYmOPVlI65Qy2SrtxwOTB+g6ODjBKOtwEHbYrhWRty9xxOWLNdClT2djw== - dependencies: - es6-iterator "~2.0.3" - es6-symbol "~3.1.1" - next-tick "1" - es6-iterator@^2.0.1, es6-iterator@~2.0.1, es6-iterator@~2.0.3: version "2.0.3" resolved "https://registry.yarnpkg.com/es6-iterator/-/es6-iterator-2.0.3.tgz#a7de889141a05a94b0854403b2d0a0fbfa98f3b7" @@ -3775,7 +3767,7 @@ es6-set@~0.1.5: es6-symbol "3.1.1" event-emitter "~0.3.5" -es6-symbol@3.1.1, es6-symbol@^3.1.1, es6-symbol@~3.1.1: +es6-symbol@3.1.1: version "3.1.1" resolved "https://registry.yarnpkg.com/es6-symbol/-/es6-symbol-3.1.1.tgz#bf00ef4fdab6ba1b46ecb7b629b4c7ed5715cc77" integrity sha1-vwDvT9q2uhtG7Le2KbTH7VcVzHc= @@ -3783,6 +3775,14 @@ es6-symbol@3.1.1, es6-symbol@^3.1.1, es6-symbol@~3.1.1: d "1" es5-ext "~0.10.14" +es6-symbol@^3.1.1, es6-symbol@^3.1.2, es6-symbol@~3.1.1: + version "3.1.2" + resolved "https://registry.yarnpkg.com/es6-symbol/-/es6-symbol-3.1.2.tgz#859fdd34f32e905ff06d752e7171ddd4444a7ed1" + integrity sha512-/ZypxQsArlv+KHpGvng52/Iz8by3EQPxhmbuz8yFG89N/caTFBSbcXONDw0aMjy827gQg26XAjP4uXFvnfINmQ== + dependencies: + d "^1.0.1" + es5-ext "^0.10.51" + es6-weak-map@^2.0.1: version "2.0.2" resolved "https://registry.yarnpkg.com/es6-weak-map/-/es6-weak-map-2.0.2.tgz#5e3ab32251ffd1538a1f8e5ffa1357772f92d96f" @@ -7031,7 +7031,7 @@ neo-async@^2.5.0, neo-async@^2.6.0: resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.1.tgz#ac27ada66167fa8849a6addd837f6b189ad2081c" integrity sha512-iyam8fBuCUpWeKPGpaNMetEocMt364qkCsfL9JuhjXX6dRnguRVOfk2GZaDpPjcOKiiXCPINZC1GczQ7iTq3Zw== -next-tick@1, next-tick@^1.0.0: +next-tick@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/next-tick/-/next-tick-1.0.0.tgz#ca86d1fe8828169b0120208e3dc8424b9db8342c" integrity sha1-yobR/ogoFpsBICCOPchCS524NCw= @@ -10342,6 +10342,11 @@ type-is@~1.6.17, type-is@~1.6.18: media-typer "0.3.0" mime-types "~2.1.24" +type@^1.0.1: + version "1.0.3" + resolved "https://registry.yarnpkg.com/type/-/type-1.0.3.tgz#16f5d39f27a2d28d86e48f8981859e9d3296c179" + integrity sha512-51IMtNfVcee8+9GJvj0spSuFcZHe9vSib6Xtgsny1Km9ugyz2mbS08I3rsUIRYgJohFRFU1160sgRodYz378Hg== + typedarray@^0.0.6: version "0.0.6" resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" From 73fa0a7b13648867538cf91362629a618e083a29 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Mon, 16 Sep 2019 14:25:37 +0200 Subject: [PATCH 084/134] Bump puma from 4.1.0 to 4.1.1 (#11855) Bumps [puma](https://github.com/puma/puma) from 4.1.0 to 4.1.1. - [Release notes](https://github.com/puma/puma/releases) - [Changelog](https://github.com/puma/puma/blob/master/History.md) - [Commits](https://github.com/puma/puma/compare/v4.1.0...v4.1.1) Signed-off-by: dependabot-preview[bot] --- Gemfile.lock | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Gemfile.lock b/Gemfile.lock index 1eaf63cac..9314702b9 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -379,7 +379,7 @@ GEM net-scp (2.0.0) net-ssh (>= 2.6.5, < 6.0.0) net-ssh (5.2.0) - nio4r (2.4.0) + nio4r (2.5.1) nokogiri (1.10.4) mini_portile2 (~> 2.4.0) nokogumbo (2.0.1) @@ -445,7 +445,7 @@ GEM pry-rails (0.3.9) pry (>= 0.10.4) public_suffix (4.0.1) - puma (4.1.0) + puma (4.1.1) nio4r (~> 2.0) pundit (2.1.0) activesupport (>= 3.0.0) From b7420b8643b4028796d1bbd9443241f997957eb4 Mon Sep 17 00:00:00 2001 From: Takeshi Umeda Date: Mon, 16 Sep 2019 21:26:16 +0900 Subject: [PATCH 085/134] Change dashboard to short number notation (#11847) * Add short numeric notation to the dashboard * Fix i18n * Fix to embed units in code * Remove settings and always use short notation * Remove misplaced test lines * Fit to other pages --- app/views/admin/dashboard/index.html.haml | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/app/views/admin/dashboard/index.html.haml b/app/views/admin/dashboard/index.html.haml index f044d9f86..be1052ae4 100644 --- a/app/views/admin/dashboard/index.html.haml +++ b/app/views/admin/dashboard/index.html.haml @@ -4,35 +4,35 @@ .dashboard__counters %div = link_to admin_accounts_url(local: 1, recent: 1) do - .dashboard__counters__num= number_with_delimiter @users_count + .dashboard__counters__num= number_to_human @users_count, strip_insignificant_zeros: true .dashboard__counters__label= t 'admin.dashboard.total_users' %div %div - .dashboard__counters__num= number_with_delimiter @registrations_week + .dashboard__counters__num= number_to_human @registrations_week, strip_insignificant_zeros: true .dashboard__counters__label= t 'admin.dashboard.week_users_new' %div %div - .dashboard__counters__num= number_with_delimiter @logins_week + .dashboard__counters__num= number_to_human @logins_week, strip_insignificant_zeros: true .dashboard__counters__label= t 'admin.dashboard.week_users_active' %div = link_to admin_pending_accounts_path do - .dashboard__counters__num= number_with_delimiter @pending_users_count + .dashboard__counters__num= number_to_human @pending_users_count, strip_insignificant_zeros: true .dashboard__counters__label= t 'admin.dashboard.pending_users' %div = link_to admin_reports_url do - .dashboard__counters__num= number_with_delimiter @reports_count + .dashboard__counters__num= number_to_human @reports_count, strip_insignificant_zeros: true .dashboard__counters__label= t 'admin.dashboard.open_reports' %div = link_to admin_tags_path(review: 'pending_review') do - .dashboard__counters__num= number_with_delimiter @pending_tags_count + .dashboard__counters__num= number_to_human @pending_tags_count, strip_insignificant_zeros: true .dashboard__counters__label= t 'admin.dashboard.pending_tags' %div %div - .dashboard__counters__num= number_with_delimiter @interactions_week + .dashboard__counters__num= number_to_human @interactions_week, strip_insignificant_zeros: true .dashboard__counters__label= t 'admin.dashboard.week_interactions' %div = link_to sidekiq_url do - .dashboard__counters__num= number_with_delimiter @queue_backlog + .dashboard__counters__num= number_to_human @queue_backlog, strip_insignificant_zeros: true .dashboard__counters__label= t 'admin.dashboard.backlog' .dashboard__widgets From ef0d22f232723be035e95bde13310d02bf1c127b Mon Sep 17 00:00:00 2001 From: mayaeh Date: Mon, 16 Sep 2019 21:27:29 +0900 Subject: [PATCH 086/134] Add search and sort functions to hashtag admin UI (#11829) * Add search and sort functions to hashtag admin UI * Move scope processing from tags_controller to tag_filter * Fix based on method naming conventions * Fixed not to get 500 errors for invalid requests --- app/controllers/admin/tags_controller.rb | 15 ++------ app/helpers/admin/filter_helper.rb | 2 +- app/models/tag.rb | 1 + app/models/tag_filter.rb | 44 ++++++++++++++++++++++++ app/views/admin/tags/index.html.haml | 32 +++++++++++++---- config/locales/en.yml | 4 +++ config/locales/simple_form.en.yml | 2 ++ 7 files changed, 81 insertions(+), 19 deletions(-) create mode 100644 app/models/tag_filter.rb diff --git a/app/controllers/admin/tags_controller.rb b/app/controllers/admin/tags_controller.rb index 376ebe44d..65341bbfb 100644 --- a/app/controllers/admin/tags_controller.rb +++ b/app/controllers/admin/tags_controller.rb @@ -2,7 +2,6 @@ module Admin class TagsController < BaseController - before_action :set_tags, only: :index before_action :set_tag, except: [:index, :batch, :approve_all, :reject_all] before_action :set_usage_by_domain, except: [:index, :batch, :approve_all, :reject_all] before_action :set_counters, except: [:index, :batch, :approve_all, :reject_all] @@ -10,6 +9,7 @@ module Admin def index authorize :tag, :index? + @tags = filtered_tags.page(params[:page]) @form = Form::TagBatch.new end @@ -48,10 +48,6 @@ module Admin private - def set_tags - @tags = filtered_tags.page(params[:page]) - end - def set_tag @tag = Tag.find(params[:id]) end @@ -73,16 +69,11 @@ module Admin end def filtered_tags - scope = Tag - scope = scope.discoverable if filter_params[:context] == 'directory' - scope = scope.unreviewed if filter_params[:review] == 'unreviewed' - scope = scope.reviewed.order(reviewed_at: :desc) if filter_params[:review] == 'reviewed' - scope = scope.pending_review.order(requested_review_at: :desc) if filter_params[:review] == 'pending_review' - scope.order(max_score: :desc) + TagFilter.new(filter_params).results end def filter_params - params.slice(:context, :review, :page).permit(:context, :review, :page) + params.slice(:directory, :reviewed, :unreviewed, :pending_review, :page, :popular, :active, :name).permit(:directory, :reviewed, :unreviewed, :pending_review, :page, :popular, :active, :name) end def tag_params diff --git a/app/helpers/admin/filter_helper.rb b/app/helpers/admin/filter_helper.rb index 506429e10..8af1683e7 100644 --- a/app/helpers/admin/filter_helper.rb +++ b/app/helpers/admin/filter_helper.rb @@ -5,7 +5,7 @@ module Admin::FilterHelper REPORT_FILTERS = %i(resolved account_id target_account_id).freeze INVITE_FILTER = %i(available expired).freeze CUSTOM_EMOJI_FILTERS = %i(local remote by_domain shortcode).freeze - TAGS_FILTERS = %i(context review).freeze + TAGS_FILTERS = %i(directory reviewed unreviewed pending_review popular active name).freeze INSTANCES_FILTERS = %i(limited by_domain).freeze FOLLOWERS_FILTERS = %i(relationship status by_domain activity order).freeze diff --git a/app/models/tag.rb b/app/models/tag.rb index a6aed0d68..4e77c404d 100644 --- a/app/models/tag.rb +++ b/app/models/tag.rb @@ -39,6 +39,7 @@ class Tag < ApplicationRecord scope :listable, -> { where(listable: [true, nil]) } scope :discoverable, -> { listable.joins(:account_tag_stat).where(AccountTagStat.arel_table[:accounts_count].gt(0)).order(Arel.sql('account_tag_stats.accounts_count desc')) } scope :most_used, ->(account) { joins(:statuses).where(statuses: { account: account }).group(:id).order(Arel.sql('count(*) desc')) } + scope :matches_name, ->(value) { where(arel_table[:name].matches("#{value}%")) } delegate :accounts_count, :accounts_count=, diff --git a/app/models/tag_filter.rb b/app/models/tag_filter.rb new file mode 100644 index 000000000..8921e186b --- /dev/null +++ b/app/models/tag_filter.rb @@ -0,0 +1,44 @@ +# frozen_string_literal: true + +class TagFilter + attr_reader :params + + def initialize(params) + @params = params + end + + def results + scope = Tag.unscoped + + params.each do |key, value| + next if key.to_s == 'page' + + scope.merge!(scope_for(key, value.to_s.strip)) if value.present? + end + + scope.order(id: :desc) + end + + private + + def scope_for(key, value) + case key.to_s + when 'directory' + Tag.discoverable + when 'reviewed' + Tag.reviewed.order(reviewed_at: :desc) + when 'unreviewed' + Tag.unreviewed + when 'pending_review' + Tag.pending_review.order(requested_review_at: :desc) + when 'popular' + Tag.order('max_score DESC NULLS LAST') + when 'active' + Tag.order('last_status_at DESC NULLS LAST') + when 'name' + Tag.matches_name(value) + else + raise "Unknown filter: #{key}" + end + end +end diff --git a/app/views/admin/tags/index.html.haml b/app/views/admin/tags/index.html.haml index 324d13d3e..cea1b71b5 100644 --- a/app/views/admin/tags/index.html.haml +++ b/app/views/admin/tags/index.html.haml @@ -8,16 +8,36 @@ .filter-subset %strong= t('admin.tags.context') %ul - %li= filter_link_to t('generic.all'), context: nil - %li= filter_link_to t('admin.tags.directory'), context: 'directory' + %li= filter_link_to t('generic.all'), directory: nil + %li= filter_link_to t('admin.tags.directory'), directory: '1' .filter-subset %strong= t('admin.tags.review') %ul - %li= filter_link_to t('generic.all'), review: nil - %li= filter_link_to t('admin.tags.unreviewed'), review: 'unreviewed' - %li= filter_link_to t('admin.tags.reviewed'), review: 'reviewed' - %li= filter_link_to safe_join([t('admin.accounts.moderation.pending'), "(#{Tag.pending_review.count})"], ' '), review: 'pending_review' + %li= filter_link_to t('generic.all'), reviewed: nil, unreviewed: nil, pending_review: nil + %li= filter_link_to t('admin.tags.unreviewed'), unreviewed: '1', reviewed: nil, pending_review: nil + %li= filter_link_to t('admin.tags.reviewed'), reviewed: '1', unreviewed: nil, pending_review: nil + %li= filter_link_to safe_join([t('admin.accounts.moderation.pending'), "(#{Tag.pending_review.count})"], ' '), pending_review: '1', reviewed: nil, unreviewed: nil + + .filter-subset + %strong= t('generic.order_by') + %ul + %li= filter_link_to t('admin.tags.most_recent'), popular: nil, active: nil + %li= filter_link_to t('admin.tags.most_popular'), popular: '1', active: nil + %li= filter_link_to t('admin.tags.last_active'), active: '1', popular: nil + += form_tag admin_tags_url, method: 'GET', class: 'simple_form' do + .fields-group + - Admin::FilterHelper::TAGS_FILTERS.each do |key| + = hidden_field_tag key, params[key] if params[key].present? + + - %i(name).each do |key| + .input.string.optional + = text_field_tag key, params[key], class: 'string optional', placeholder: I18n.t("admin.tags.#{key}") + + .actions + %button= t('admin.accounts.search') + = link_to t('admin.accounts.reset'), admin_tags_path, class: 'button negative' %hr.spacer/ diff --git a/config/locales/en.yml b/config/locales/en.yml index 8c9fe89f8..f05fdd48b 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -521,6 +521,10 @@ en: context: Context directory: In directory in_directory: "%{count} in directory" + last_active: Last active + most_popular: Most popular + most_recent: Most recent + name: Hashtag review: Review status reviewed: Reviewed title: Hashtags diff --git a/config/locales/simple_form.en.yml b/config/locales/simple_form.en.yml index 2e5982de9..c542377a9 100644 --- a/config/locales/simple_form.en.yml +++ b/config/locales/simple_form.en.yml @@ -131,6 +131,8 @@ en: must_be_follower: Block notifications from non-followers must_be_following: Block notifications from people you don't follow must_be_following_dm: Block direct messages from people you don't follow + invite: + comment: Comment invite_request: text: Why do you want to join? notification_emails: From b0148d4c050bd914a02b8f764333152906061506 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Mon, 16 Sep 2019 14:29:29 +0200 Subject: [PATCH 087/134] Bump faker from 2.2.2 to 2.3.0 (#11858) Bumps [faker](https://github.com/faker-ruby/faker) from 2.2.2 to 2.3.0. - [Release notes](https://github.com/faker-ruby/faker/releases) - [Changelog](https://github.com/faker-ruby/faker/blob/master/CHANGELOG.md) - [Commits](https://github.com/faker-ruby/faker/compare/v2.2.2...v2.3.0) Signed-off-by: dependabot-preview[bot] --- Gemfile | 2 +- Gemfile.lock | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Gemfile b/Gemfile index af0e8e2fc..1215fcb16 100644 --- a/Gemfile +++ b/Gemfile @@ -115,7 +115,7 @@ end group :test do gem 'capybara', '~> 3.28' gem 'climate_control', '~> 0.2' - gem 'faker', '~> 2.2' + gem 'faker', '~> 2.3' gem 'microformats', '~> 4.1' gem 'rails-controller-testing', '~> 1.0' gem 'rspec-sidekiq', '~> 3.0' diff --git a/Gemfile.lock b/Gemfile.lock index 9314702b9..a09be9602 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -231,7 +231,7 @@ GEM tzinfo excon (0.62.0) fabrication (2.20.2) - faker (2.2.2) + faker (2.3.0) i18n (~> 1.6.0) faraday (0.15.0) multipart-post (>= 1.2, < 3) @@ -700,7 +700,7 @@ DEPENDENCIES doorkeeper (~> 5.1) dotenv-rails (~> 2.7) fabrication (~> 2.20) - faker (~> 2.2) + faker (~> 2.3) fast_blank (~> 1.0) fastimage fog-core (<= 2.1.0) From c4907c9d997f5e59c60a2f4ce388d4828246555a Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Mon, 16 Sep 2019 14:29:44 +0200 Subject: [PATCH 088/134] Bump tzinfo-data from 1.2019.2 to 1.2019.3 (#11857) Bumps [tzinfo-data](https://github.com/tzinfo/tzinfo-data) from 1.2019.2 to 1.2019.3. - [Release notes](https://github.com/tzinfo/tzinfo-data/releases) - [Commits](https://github.com/tzinfo/tzinfo-data/compare/v1.2019.2...v1.2019.3) Signed-off-by: dependabot-preview[bot] --- Gemfile.lock | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Gemfile.lock b/Gemfile.lock index a09be9602..7b795cc82 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -637,7 +637,7 @@ GEM unf (~> 0.1.0) tzinfo (1.2.5) thread_safe (~> 0.1) - tzinfo-data (1.2019.2) + tzinfo-data (1.2019.3) tzinfo (>= 1.0.0) unf (0.1.4) unf_ext From 1882ca673d46515f87cb9f6c232129335b6f9ff9 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Mon, 16 Sep 2019 14:30:29 +0200 Subject: [PATCH 089/134] Bump webmock from 3.7.1 to 3.7.3 (#11853) Bumps [webmock](https://github.com/bblimke/webmock) from 3.7.1 to 3.7.3. - [Release notes](https://github.com/bblimke/webmock/releases) - [Changelog](https://github.com/bblimke/webmock/blob/master/CHANGELOG.md) - [Commits](https://github.com/bblimke/webmock/compare/v3.7.1...v3.7.3) Signed-off-by: dependabot-preview[bot] --- Gemfile.lock | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Gemfile.lock b/Gemfile.lock index 7b795cc82..637630870 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -646,7 +646,7 @@ GEM uniform_notifier (1.12.1) warden (1.2.8) rack (>= 2.0.6) - webmock (3.7.1) + webmock (3.7.3) addressable (>= 2.3.6) crack (>= 0.3.2) hashdiff (>= 0.4.0, < 2.0.0) From 524187b65344f6bcedb9bc188df7b6032540ac48 Mon Sep 17 00:00:00 2001 From: ThibG Date: Mon, 16 Sep 2019 14:32:26 +0200 Subject: [PATCH 090/134] Fix expiring polls not being displayed as such in the WebUI (#11835) * Fix expiring polls not being displayed as such in the WebUI * Reset expiration state and timer when a poll changes * Refactor timer logic in `_setupTimer`, only set expiration if props have changed * Refactor and do not use deprecated React lifecycles --- app/javascript/mastodon/components/poll.js | 40 +++++++++++++++++++--- 1 file changed, 35 insertions(+), 5 deletions(-) diff --git a/app/javascript/mastodon/components/poll.js b/app/javascript/mastodon/components/poll.js index 690f9ae5a..373f710d3 100644 --- a/app/javascript/mastodon/components/poll.js +++ b/app/javascript/mastodon/components/poll.js @@ -32,8 +32,38 @@ class Poll extends ImmutablePureComponent { state = { selected: {}, + expired: null, }; + static getDerivedStateFromProps (props, state) { + const { poll, intl } = props; + const expired = poll.get('expired') || (new Date(poll.get('expires_at'))).getTime() < intl.now(); + return (expired === state.expired) ? null : { expired }; + } + + componentDidMount () { + this._setupTimer(); + } + + componentDidUpdate () { + this._setupTimer(); + } + + componentWillUnmount () { + clearTimeout(this._timer); + } + + _setupTimer () { + const { poll, intl } = this.props; + clearTimeout(this._timer); + if (!this.state.expired) { + const delay = (new Date(poll.get('expires_at'))).getTime() - intl.now(); + this._timer = setTimeout(() => { + this.setState({ expired: true }); + }, delay); + } + } + handleOptionChange = e => { const { target: { value } } = e; @@ -68,12 +98,11 @@ class Poll extends ImmutablePureComponent { this.props.dispatch(fetchPoll(this.props.poll.get('id'))); }; - renderOption (option, optionIndex) { + renderOption (option, optionIndex, showResults) { const { poll, disabled } = this.props; const percent = poll.get('votes_count') === 0 ? 0 : (option.get('votes_count') / poll.get('votes_count')) * 100; const leading = poll.get('options').filterNot(other => other.get('title') === option.get('title')).every(other => option.get('votes_count') > other.get('votes_count')); const active = !!this.state.selected[`${optionIndex}`]; - const showResults = poll.get('voted') || poll.get('expired'); let titleEmojified = option.get('title_emojified'); if (!titleEmojified) { @@ -112,19 +141,20 @@ class Poll extends ImmutablePureComponent { render () { const { poll, intl } = this.props; + const { expired } = this.state; if (!poll) { return null; } - const timeRemaining = poll.get('expired') ? intl.formatMessage(messages.closed) : ; - const showResults = poll.get('voted') || poll.get('expired'); + const timeRemaining = expired ? intl.formatMessage(messages.closed) : ; + const showResults = poll.get('voted') || expired; const disabled = this.props.disabled || Object.entries(this.state.selected).every(item => !item); return (
    - {poll.get('options').map((option, i) => this.renderOption(option, i))} + {poll.get('options').map((option, i) => this.renderOption(option, i, showResults))}
From 692fe477b4dded6a2f6f48685eef329ded4484ec Mon Sep 17 00:00:00 2001 From: Eugen Rochko Date: Mon, 16 Sep 2019 15:11:01 +0200 Subject: [PATCH 091/134] New Crowdin translations (#11799) * New translations doorkeeper.en.yml (Hungarian) [ci skip] * New translations doorkeeper.en.yml (Ido) [ci skip] * New translations doorkeeper.en.yml (Indonesian) [ci skip] * New translations doorkeeper.en.yml (Italian) [ci skip] * New translations doorkeeper.en.yml (Japanese) [ci skip] * New translations doorkeeper.en.yml (Kazakh) [ci skip] * New translations simple_form.en.yml (Asturian) [ci skip] * New translations simple_form.en.yml (Arabic) [ci skip] * New translations en.json (Portuguese) [ci skip] * New translations en.json (Japanese) [ci skip] * New translations en.json (Kazakh) [ci skip] * New translations en.json (Korean) [ci skip] * New translations en.json (Latvian) [ci skip] * New translations en.json (Lithuanian) [ci skip] * New translations en.json (Malay) [ci skip] * New translations en.json (Norwegian) [ci skip] * New translations en.json (Occitan) [ci skip] * New translations en.json (Persian) [ci skip] * New translations en.json (Polish) [ci skip] * New translations en.json (Portuguese, Brazilian) [ci skip] * New translations en.json (Indonesian) [ci skip] * New translations en.json (Romanian) [ci skip] * New translations en.json (Russian) [ci skip] * New translations en.json (Serbian (Cyrillic)) [ci skip] * New translations en.json (Serbian (Latin)) [ci skip] * New translations en.json (Slovak) [ci skip] * New translations en.json (Slovenian) [ci skip] * New translations en.json (Spanish) [ci skip] * New translations en.json (Swedish) [ci skip] * New translations en.json (Tamil) [ci skip] * New translations en.json (Telugu) [ci skip] * New translations en.json (Thai) [ci skip] * New translations en.json (Italian) [ci skip] * New translations en.json (Ido) [ci skip] * New translations en.json (Ukrainian) [ci skip] * New translations en.json (Chinese Traditional, Hong Kong) [ci skip] * New translations simple_form.en.yml (Czech) [ci skip] * New translations en.json (Albanian) [ci skip] * New translations en.json (Arabic) [ci skip] * New translations en.json (Armenian) [ci skip] * New translations en.json (Asturian) [ci skip] * New translations en.json (Basque) [ci skip] * New translations en.json (Bengali) [ci skip] * New translations en.json (Bulgarian) [ci skip] * New translations en.json (Catalan) [ci skip] * New translations en.json (Chinese Simplified) [ci skip] * New translations en.json (Chinese Traditional) [ci skip] * New translations en.json (Corsican) [ci skip] * New translations en.json (Hungarian) [ci skip] * New translations en.json (Croatian) [ci skip] * New translations en.json (Danish) [ci skip] * New translations en.json (Dutch) [ci skip] * New translations en.json (Esperanto) [ci skip] * New translations en.json (Finnish) [ci skip] * New translations en.json (French) [ci skip] * New translations en.json (Galician) [ci skip] * New translations en.json (Georgian) [ci skip] * New translations en.json (German) [ci skip] * New translations en.json (Greek) [ci skip] * New translations en.json (Hebrew) [ci skip] * New translations en.json (Turkish) [ci skip] * New translations en.json (Welsh) [ci skip] * New translations simple_form.en.yml (Albanian) [ci skip] * New translations en.yml (Russian) [ci skip] * New translations en.yml (Korean) [ci skip] * New translations en.yml (Latvian) [ci skip] * New translations en.yml (Lithuanian) [ci skip] * New translations en.yml (Malay) [ci skip] * New translations en.yml (Norwegian) [ci skip] * New translations en.yml (Occitan) [ci skip] * New translations en.yml (Persian) [ci skip] * New translations en.yml (Polish) [ci skip] * New translations en.yml (Portuguese) [ci skip] * New translations en.yml (Portuguese, Brazilian) [ci skip] * New translations en.yml (Romanian) [ci skip] * New translations en.yml (Serbian (Cyrillic)) [ci skip] * New translations en.yml (Japanese) [ci skip] * New translations en.yml (Serbian (Latin)) [ci skip] * New translations en.yml (Slovak) [ci skip] * New translations en.yml (Slovenian) [ci skip] * New translations en.yml (Spanish) [ci skip] * New translations en.yml (Swedish) [ci skip] * New translations en.yml (Tamil) [ci skip] * New translations en.yml (Telugu) [ci skip] * New translations en.yml (Thai) [ci skip] * New translations en.yml (Turkish) [ci skip] * New translations en.yml (Ukrainian) [ci skip] * New translations en.yml (Welsh) [ci skip] * New translations en.yml (Kazakh) [ci skip] * New translations en.yml (Italian) [ci skip] * New translations en.yml (Albanian) [ci skip] * New translations en.yml (Croatian) [ci skip] * New translations en.yml (Arabic) [ci skip] * New translations en.yml (Armenian) [ci skip] * New translations en.yml (Asturian) [ci skip] * New translations en.yml (Basque) [ci skip] * New translations en.yml (Bengali) [ci skip] * New translations en.yml (Bulgarian) [ci skip] * New translations en.yml (Catalan) [ci skip] * New translations en.yml (Chinese Simplified) [ci skip] * New translations en.yml (Chinese Traditional) [ci skip] * New translations en.yml (Chinese Traditional, Hong Kong) [ci skip] * New translations en.yml (Corsican) [ci skip] * New translations en.yml (Danish) [ci skip] * New translations en.yml (Indonesian) [ci skip] * New translations en.yml (Dutch) [ci skip] * New translations en.yml (Esperanto) [ci skip] * New translations en.yml (Finnish) [ci skip] * New translations en.yml (French) [ci skip] * New translations en.yml (Galician) [ci skip] * New translations en.yml (Georgian) [ci skip] * New translations en.yml (German) [ci skip] * New translations en.yml (Greek) [ci skip] * New translations en.yml (Hebrew) [ci skip] * New translations en.yml (Hungarian) [ci skip] * New translations en.yml (Ido) [ci skip] * New translations doorkeeper.en.yml (Estonian) [ci skip] * New translations en.json (Spanish) [ci skip] * New translations en.yml (Czech) [ci skip] * New translations en.json (Slovak) [ci skip] * New translations en.yml (Slovak) [ci skip] * New translations en.yml (Slovak) [ci skip] * New translations en.json (Russian) [ci skip] * New translations en.json (Russian) [ci skip] * New translations en.yml (Russian) [ci skip] * New translations simple_form.en.yml (Russian) [ci skip] * New translations en.yml (Corsican) [ci skip] * New translations en.json (Korean) [ci skip] * New translations en.json (Thai) [ci skip] * New translations en.yml (Thai) [ci skip] * New translations en.json (Spanish) [ci skip] * New translations en.yml (Spanish) [ci skip] * New translations simple_form.en.yml (Spanish) [ci skip] * New translations en.json (Spanish) [ci skip] * New translations en.yml (German) [ci skip] * New translations en.json (Norwegian Nynorsk) [ci skip] * New translations en.yml (Norwegian Nynorsk) [ci skip] * New translations simple_form.en.yml (Norwegian Nynorsk) [ci skip] * New translations activerecord.en.yml (Norwegian Nynorsk) [ci skip] * New translations devise.en.yml (Norwegian Nynorsk) [ci skip] * New translations doorkeeper.en.yml (Norwegian Nynorsk) [ci skip] * New translations en.json (Armenian) [ci skip] * New translations en.json (Breton) [ci skip] * New translations en.json (Bulgarian) [ci skip] * New translations doorkeeper.en.yml (Breton) [ci skip] * New translations devise.en.yml (Breton) [ci skip] * New translations simple_form.en.yml (Breton) [ci skip] * New translations en.yml (Breton) [ci skip] * New translations activerecord.en.yml (Breton) [ci skip] * New translations devise.en.yml (Asturian) [ci skip] * New translations en.json (Asturian) [ci skip] * New translations activerecord.en.yml (Asturian) [ci skip] * New translations devise.en.yml (Russian) [ci skip] * New translations activerecord.en.yml (Russian) [ci skip] * New translations simple_form.en.yml (Russian) [ci skip] * New translations devise.en.yml (Norwegian) [ci skip] * New translations activerecord.en.yml (Norwegian) [ci skip] * New translations en.json (Norwegian) [ci skip] * New translations en.json (Malay) [ci skip] * New translations en.json (Serbian (Cyrillic)) [ci skip] * New translations devise.en.yml (Serbian (Latin)) [ci skip] * New translations devise.en.yml (Ukrainian) [ci skip] * New translations activerecord.en.yml (Ukrainian) [ci skip] * New translations en.yml (Ukrainian) [ci skip] * New translations devise.en.yml (Slovak) [ci skip] * New translations activerecord.en.yml (Slovak) [ci skip] * New translations en.json (Slovak) [ci skip] * New translations activerecord.en.yml (Serbian (Latin)) [ci skip] * New translations en.json (Serbian (Latin)) [ci skip] * New translations devise.en.yml (Serbian (Cyrillic)) [ci skip] * New translations activerecord.en.yml (Serbian (Cyrillic)) [ci skip] * New translations activerecord.en.yml (Indonesian) [ci skip] * New translations devise.en.yml (Georgian) [ci skip] * New translations activerecord.en.yml (Georgian) [ci skip] * New translations en.json (Georgian) [ci skip] * New translations devise.en.yml (Croatian) [ci skip] * New translations en.json (Croatian) [ci skip] * New translations en.json (Hebrew) [ci skip] * New translations devise.en.yml (Chinese Traditional, Hong Kong) [ci skip] * New translations activerecord.en.yml (Chinese Traditional, Hong Kong) [ci skip] * New translations en.json (Chinese Traditional, Hong Kong) [ci skip] * New translations devise.en.yml (Bulgarian) [ci skip] * New translations activerecord.en.yml (Bulgarian) [ci skip] * New translations en.json (Lithuanian) [ci skip] * New translations en.json (Latvian) [ci skip] * New translations devise.en.yml (Indonesian) [ci skip] * New translations en.json (Indonesian) [ci skip] * New translations devise.en.yml (Ido) [ci skip] * New translations en.json (Ido) [ci skip] * New translations devise.en.yml (Hebrew) [ci skip] * New translations activerecord.en.yml (Hebrew) [ci skip] * New translations en.yml (Slovak) [ci skip] * New translations en.yml (Slovak) [ci skip] * New translations en.yml (French) [ci skip] * New translations en.json (Norwegian Nynorsk) [ci skip] * New translations en.json (Norwegian Nynorsk) [ci skip] * New translations en.json (Norwegian Nynorsk) [ci skip] * New translations en.json (Norwegian Nynorsk) [ci skip] * New translations en.json (Norwegian Nynorsk) [ci skip] * New translations en.json (Arabic) [ci skip] * New translations en.yml (Arabic) [ci skip] * New translations en.json (Norwegian Nynorsk) [ci skip] * New translations en.yml (Greek) [ci skip] * New translations en.yml (Hungarian) [ci skip] * New translations en.yml (Italian) [ci skip] * New translations en.yml (Japanese) [ci skip] * New translations en.yml (Kazakh) [ci skip] * New translations en.yml (Korean) [ci skip] * New translations en.yml (Dutch) [ci skip] * New translations en.yml (Esperanto) [ci skip] * New translations en.yml (Estonian) [ci skip] * New translations en.yml (German) [ci skip] * New translations en.yml (Finnish) [ci skip] * New translations en.yml (Galician) [ci skip] * New translations en.yml (Danish) [ci skip] * New translations en.yml (Swedish) [ci skip] * New translations en.yml (Spanish) [ci skip] * New translations en.yml (Welsh) [ci skip] * New translations en.yml (Occitan) [ci skip] * New translations en.yml (Portuguese) [ci skip] * New translations en.yml (Persian) [ci skip] * New translations en.yml (Polish) [ci skip] * New translations en.json (Portuguese) [ci skip] * New translations simple_form.en.yml (Portuguese) [ci skip] * New translations doorkeeper.en.yml (Portuguese) [ci skip] * New translations en.yml (Portuguese, Brazilian) [ci skip] * New translations en.yml (Romanian) [ci skip] * New translations en.yml (Slovenian) [ci skip] * New translations en.yml (Lithuanian) [ci skip] * New translations en.yml (Norwegian) [ci skip] * New translations en.yml (Asturian) [ci skip] * New translations en.yml (Chinese Traditional, Hong Kong) [ci skip] * New translations en.yml (Georgian) [ci skip] * New translations en.yml (Russian) [ci skip] * New translations en.yml (Chinese Simplified) [ci skip] * New translations en.yml (Catalan) [ci skip] * New translations en.yml (Chinese Traditional) [ci skip] * New translations en.yml (Corsican) [ci skip] * New translations en.yml (Czech) [ci skip] * New translations en.yml (Basque) [ci skip] * New translations en.yml (Serbian (Cyrillic)) [ci skip] * New translations en.yml (Serbian (Latin)) [ci skip] * New translations en.yml (Slovak) [ci skip] * New translations en.yml (Ukrainian) [ci skip] * New translations en.yml (French) [ci skip] * New translations en.yml (Arabic) [ci skip] * New translations en.yml (Albanian) [ci skip] * New translations en.yml (Danish) [ci skip] * i18n-tasks normalize * yarn manage:translations --- app/helpers/settings_helper.rb | 3 +- app/javascript/mastodon/locales/ar.json | 7 +- app/javascript/mastodon/locales/ast.json | 1 + app/javascript/mastodon/locales/bg.json | 1 + app/javascript/mastodon/locales/bn.json | 1 + app/javascript/mastodon/locales/br.json | 414 ++++++++++++++++++ app/javascript/mastodon/locales/ca.json | 1 + app/javascript/mastodon/locales/co.json | 1 + app/javascript/mastodon/locales/cs.json | 1 + app/javascript/mastodon/locales/cy.json | 1 + app/javascript/mastodon/locales/da.json | 1 + app/javascript/mastodon/locales/de.json | 1 + .../mastodon/locales/defaultMessages.json | 42 +- app/javascript/mastodon/locales/el.json | 1 + app/javascript/mastodon/locales/en.json | 3 + app/javascript/mastodon/locales/eo.json | 1 + app/javascript/mastodon/locales/es.json | 41 +- app/javascript/mastodon/locales/et.json | 1 + app/javascript/mastodon/locales/eu.json | 1 + app/javascript/mastodon/locales/fa.json | 1 + app/javascript/mastodon/locales/fi.json | 1 + app/javascript/mastodon/locales/fr.json | 1 + app/javascript/mastodon/locales/gl.json | 1 + app/javascript/mastodon/locales/he.json | 1 + app/javascript/mastodon/locales/hi.json | 1 + app/javascript/mastodon/locales/hr.json | 1 + app/javascript/mastodon/locales/hu.json | 1 + app/javascript/mastodon/locales/hy.json | 1 + app/javascript/mastodon/locales/id.json | 1 + app/javascript/mastodon/locales/io.json | 1 + app/javascript/mastodon/locales/it.json | 1 + app/javascript/mastodon/locales/ja.json | 1 + app/javascript/mastodon/locales/ka.json | 1 + app/javascript/mastodon/locales/kk.json | 1 + app/javascript/mastodon/locales/ko.json | 3 +- app/javascript/mastodon/locales/lt.json | 1 + app/javascript/mastodon/locales/lv.json | 1 + app/javascript/mastodon/locales/ms.json | 1 + app/javascript/mastodon/locales/nl.json | 1 + app/javascript/mastodon/locales/nn.json | 414 ++++++++++++++++++ app/javascript/mastodon/locales/no.json | 1 + app/javascript/mastodon/locales/oc.json | 1 + app/javascript/mastodon/locales/pl.json | 1 + app/javascript/mastodon/locales/pt-BR.json | 1 + .../mastodon/locales/{pt.json => pt-PT.json} | 1 + app/javascript/mastodon/locales/ro.json | 1 + app/javascript/mastodon/locales/ru.json | 7 +- app/javascript/mastodon/locales/sk.json | 1 + app/javascript/mastodon/locales/sl.json | 1 + app/javascript/mastodon/locales/sq.json | 1 + app/javascript/mastodon/locales/sr-Latn.json | 1 + app/javascript/mastodon/locales/sr.json | 1 + app/javascript/mastodon/locales/sv.json | 1 + app/javascript/mastodon/locales/ta.json | 1 + app/javascript/mastodon/locales/te.json | 1 + app/javascript/mastodon/locales/th.json | 11 +- app/javascript/mastodon/locales/tr.json | 1 + app/javascript/mastodon/locales/uk.json | 1 + .../{whitelist_pt.json => whitelist_br.json} | 0 .../mastodon/locales/whitelist_nn.json | 2 + .../mastodon/locales/whitelist_pt-PT.json | 2 + app/javascript/mastodon/locales/zh-CN.json | 1 + app/javascript/mastodon/locales/zh-HK.json | 1 + app/javascript/mastodon/locales/zh-TW.json | 1 + config/application.rb | 2 +- config/locales/activerecord.br.yml | 1 + config/locales/activerecord.nn.yml | 1 + config/locales/activerecord.pt.yml | 13 - config/locales/ar.yml | 4 +- config/locales/ast.yml | 1 - config/locales/br.yml | 20 + config/locales/ca.yml | 1 - config/locales/co.yml | 4 +- config/locales/cs.yml | 9 +- config/locales/cy.yml | 1 - config/locales/da.yml | 2 +- config/locales/de.yml | 8 +- config/locales/devise.br.yml | 1 + config/locales/devise.nn.yml | 1 + config/locales/devise.pt.yml | 83 ---- config/locales/doorkeeper.br.yml | 1 + config/locales/doorkeeper.nn.yml | 1 + ...doorkeeper.pt.yml => doorkeeper.pt-PT.yml} | 2 +- config/locales/el.yml | 1 - config/locales/eo.yml | 1 - config/locales/es.yml | 8 +- config/locales/et.yml | 1 - config/locales/eu.yml | 1 - config/locales/fa.yml | 1 - config/locales/fi.yml | 1 - config/locales/fr.yml | 3 +- config/locales/gl.yml | 1 - config/locales/hu.yml | 1 - config/locales/it.yml | 1 - config/locales/ja.yml | 1 - config/locales/ka.yml | 1 - config/locales/kk.yml | 1 - config/locales/ko.yml | 1 - config/locales/lt.yml | 1 - config/locales/nl.yml | 1 - config/locales/nn.yml | 20 + config/locales/no.yml | 1 - config/locales/oc.yml | 1 - config/locales/pl.yml | 1 - config/locales/pt-BR.yml | 1 - config/locales/{pt.yml => pt-PT.yml} | 3 +- config/locales/ro.yml | 1 - config/locales/ru.yml | 5 +- config/locales/simple_form.br.yml | 1 + config/locales/simple_form.es.yml | 12 + config/locales/simple_form.nn.yml | 1 + ...mple_form.pt.yml => simple_form.pt-PT.yml} | 2 +- config/locales/simple_form.ru.yml | 6 +- config/locales/sk.yml | 19 +- config/locales/sl.yml | 1 - config/locales/sq.yml | 1 - config/locales/sr-Latn.yml | 1 - config/locales/sr.yml | 1 - config/locales/sv.yml | 1 - config/locales/th.yml | 1 + config/locales/uk.yml | 1 - config/locales/zh-CN.yml | 1 - config/locales/zh-HK.yml | 1 - config/locales/zh-TW.yml | 1 - 124 files changed, 1063 insertions(+), 203 deletions(-) create mode 100644 app/javascript/mastodon/locales/br.json create mode 100644 app/javascript/mastodon/locales/nn.json rename app/javascript/mastodon/locales/{pt.json => pt-PT.json} (99%) rename app/javascript/mastodon/locales/{whitelist_pt.json => whitelist_br.json} (100%) create mode 100644 app/javascript/mastodon/locales/whitelist_nn.json create mode 100644 app/javascript/mastodon/locales/whitelist_pt-PT.json create mode 100644 config/locales/activerecord.br.yml create mode 100644 config/locales/activerecord.nn.yml delete mode 100644 config/locales/activerecord.pt.yml create mode 100644 config/locales/br.yml create mode 100644 config/locales/devise.br.yml create mode 100644 config/locales/devise.nn.yml delete mode 100644 config/locales/devise.pt.yml create mode 100644 config/locales/doorkeeper.br.yml create mode 100644 config/locales/doorkeeper.nn.yml rename config/locales/{doorkeeper.pt.yml => doorkeeper.pt-PT.yml} (99%) create mode 100644 config/locales/nn.yml rename config/locales/{pt.yml => pt-PT.yml} (99%) create mode 100644 config/locales/simple_form.br.yml create mode 100644 config/locales/simple_form.nn.yml rename config/locales/{simple_form.pt.yml => simple_form.pt-PT.yml} (99%) diff --git a/app/helpers/settings_helper.rb b/app/helpers/settings_helper.rb index 0cfde7edc..2b3fd1263 100644 --- a/app/helpers/settings_helper.rb +++ b/app/helpers/settings_helper.rb @@ -42,7 +42,8 @@ module SettingsHelper no: 'Norsk', oc: 'Occitan', pl: 'Polski', - pt: 'Português (Portugal)', + pt: 'Português', + 'pt-PT': 'Português (Portugal)', 'pt-BR': 'Português (Brasil)', ro: 'Română', ru: 'Русский', diff --git a/app/javascript/mastodon/locales/ar.json b/app/javascript/mastodon/locales/ar.json index 6424cd1a7..ce66a5d1c 100644 --- a/app/javascript/mastodon/locales/ar.json +++ b/app/javascript/mastodon/locales/ar.json @@ -63,6 +63,7 @@ "column.notifications": "الإخطارات", "column.pins": "التبويقات المثبتة", "column.public": "الخيط العام الموحد", + "column.status": "Toot", "column_back_button.label": "العودة", "column_header.hide_settings": "إخفاء الإعدادات", "column_header.moveLeft_settings": "نقل القائمة إلى اليسار", @@ -112,8 +113,8 @@ "confirmations.unfollow.message": "متأكد من أنك تريد إلغاء متابعة {name} ؟", "directory.federated": "From known fediverse", "directory.local": "From {domain} only", - "directory.new_arrivals": "New arrivals", - "directory.recently_active": "Recently active", + "directory.new_arrivals": "الوافدون الجُدد", + "directory.recently_active": "نشط مؤخرا", "embed.instructions": "يمكنكم إدماج هذا المنشور على موقعكم الإلكتروني عن طريق نسخ الشفرة أدناه.", "embed.preview": "هكذا ما سوف يبدو عليه:", "emoji_button.activity": "الأنشطة", @@ -368,7 +369,7 @@ "status.show_more": "أظهر المزيد", "status.show_more_all": "توسيع الكل", "status.show_thread": "الكشف عن المحادثة", - "status.uncached_media_warning": "Not available", + "status.uncached_media_warning": "غير متوفر", "status.unmute_conversation": "فك الكتم عن المحادثة", "status.unpin": "فك التدبيس من الملف الشخصي", "suggestions.dismiss": "إلغاء الاقتراح", diff --git a/app/javascript/mastodon/locales/ast.json b/app/javascript/mastodon/locales/ast.json index ef17d6d64..2ef693fcb 100644 --- a/app/javascript/mastodon/locales/ast.json +++ b/app/javascript/mastodon/locales/ast.json @@ -63,6 +63,7 @@ "column.notifications": "Avisos", "column.pins": "Toots fixaos", "column.public": "Llinia temporal federada", + "column.status": "Toot", "column_back_button.label": "Atrás", "column_header.hide_settings": "Hide settings", "column_header.moveLeft_settings": "Mover la columna a la esquierda", diff --git a/app/javascript/mastodon/locales/bg.json b/app/javascript/mastodon/locales/bg.json index b0954f199..309f04513 100644 --- a/app/javascript/mastodon/locales/bg.json +++ b/app/javascript/mastodon/locales/bg.json @@ -63,6 +63,7 @@ "column.notifications": "Известия", "column.pins": "Pinned toot", "column.public": "Публичен канал", + "column.status": "Toot", "column_back_button.label": "Назад", "column_header.hide_settings": "Hide settings", "column_header.moveLeft_settings": "Move column to the left", diff --git a/app/javascript/mastodon/locales/bn.json b/app/javascript/mastodon/locales/bn.json index 241b43573..e4984a118 100644 --- a/app/javascript/mastodon/locales/bn.json +++ b/app/javascript/mastodon/locales/bn.json @@ -63,6 +63,7 @@ "column.notifications": "প্রজ্ঞাপনগুলো", "column.pins": "পিন করা টুট", "column.public": "যুক্ত সময়রেখা", + "column.status": "Toot", "column_back_button.label": "পেছনে", "column_header.hide_settings": "সেটিংগুলো সরান", "column_header.moveLeft_settings": "কলমটা বামে সরান", diff --git a/app/javascript/mastodon/locales/br.json b/app/javascript/mastodon/locales/br.json new file mode 100644 index 000000000..2de037f16 --- /dev/null +++ b/app/javascript/mastodon/locales/br.json @@ -0,0 +1,414 @@ +{ + "account.add_or_remove_from_list": "Add or Remove from lists", + "account.badges.bot": "Bot", + "account.block": "Block @{name}", + "account.block_domain": "Hide everything from {domain}", + "account.blocked": "Blocked", + "account.cancel_follow_request": "Cancel follow request", + "account.direct": "Direct message @{name}", + "account.domain_blocked": "Domain hidden", + "account.edit_profile": "Edit profile", + "account.endorse": "Feature on profile", + "account.follow": "Follow", + "account.followers": "Followers", + "account.followers.empty": "No one follows this user yet.", + "account.follows": "Follows", + "account.follows.empty": "This user doesn't follow anyone yet.", + "account.follows_you": "Follows you", + "account.hide_reblogs": "Hide boosts from @{name}", + "account.last_status": "Last active", + "account.link_verified_on": "Ownership of this link was checked on {date}", + "account.locked_info": "This account privacy status is set to locked. The owner manually reviews who can follow them.", + "account.media": "Media", + "account.mention": "Mention @{name}", + "account.moved_to": "{name} has moved to:", + "account.mute": "Mute @{name}", + "account.mute_notifications": "Mute notifications from @{name}", + "account.muted": "Muted", + "account.never_active": "Never", + "account.posts": "Toots", + "account.posts_with_replies": "Toots and replies", + "account.report": "Report @{name}", + "account.requested": "Awaiting approval", + "account.share": "Share @{name}'s profile", + "account.show_reblogs": "Show boosts from @{name}", + "account.unblock": "Unblock @{name}", + "account.unblock_domain": "Unhide {domain}", + "account.unendorse": "Don't feature on profile", + "account.unfollow": "Unfollow", + "account.unmute": "Unmute @{name}", + "account.unmute_notifications": "Unmute notifications from @{name}", + "alert.rate_limited.message": "Please retry after {retry_time, time, medium}.", + "alert.rate_limited.title": "Rate limited", + "alert.unexpected.message": "An unexpected error occurred.", + "alert.unexpected.title": "Oops!", + "autosuggest_hashtag.per_week": "{count} per week", + "boost_modal.combo": "You can press {combo} to skip this next time", + "bundle_column_error.body": "Something went wrong while loading this component.", + "bundle_column_error.retry": "Try again", + "bundle_column_error.title": "Network error", + "bundle_modal_error.close": "Close", + "bundle_modal_error.message": "Something went wrong while loading this component.", + "bundle_modal_error.retry": "Try again", + "column.blocks": "Blocked users", + "column.community": "Local timeline", + "column.direct": "Direct messages", + "column.directory": "Browse profiles", + "column.domain_blocks": "Hidden domains", + "column.favourites": "Favourites", + "column.follow_requests": "Follow requests", + "column.home": "Home", + "column.lists": "Lists", + "column.mutes": "Muted users", + "column.notifications": "Notifications", + "column.pins": "Pinned toot", + "column.public": "Federated timeline", + "column.status": "Toot", + "column_back_button.label": "Back", + "column_header.hide_settings": "Hide settings", + "column_header.moveLeft_settings": "Move column to the left", + "column_header.moveRight_settings": "Move column to the right", + "column_header.pin": "Pin", + "column_header.show_settings": "Show settings", + "column_header.unpin": "Unpin", + "column_subheading.settings": "Settings", + "community.column_settings.media_only": "Media only", + "compose_form.direct_message_warning": "This toot will only be sent to all the mentioned users.", + "compose_form.direct_message_warning_learn_more": "Learn more", + "compose_form.hashtag_warning": "This toot won't be listed under any hashtag as it is unlisted. Only public toots can be searched by hashtag.", + "compose_form.lock_disclaimer": "Your account is not {locked}. Anyone can follow you to view your follower-only posts.", + "compose_form.lock_disclaimer.lock": "locked", + "compose_form.placeholder": "What is on your mind?", + "compose_form.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.publish": "Toot", + "compose_form.publish_loud": "{publish}!", + "compose_form.sensitive.hide": "Mark media as sensitive", + "compose_form.sensitive.marked": "Media is marked as sensitive", + "compose_form.sensitive.unmarked": "Media is not marked as sensitive", + "compose_form.spoiler.marked": "Text is hidden behind warning", + "compose_form.spoiler.unmarked": "Text is not hidden", + "compose_form.spoiler_placeholder": "Write your warning here", + "confirmation_modal.cancel": "Cancel", + "confirmations.block.block_and_report": "Block & Report", + "confirmations.block.confirm": "Block", + "confirmations.block.message": "Are you sure you want to block {name}?", + "confirmations.delete.confirm": "Delete", + "confirmations.delete.message": "Are you sure you want to delete this status?", + "confirmations.delete_list.confirm": "Delete", + "confirmations.delete_list.message": "Are you sure you want to permanently delete this list?", + "confirmations.domain_block.confirm": "Hide entire domain", + "confirmations.domain_block.message": "Are you really, really sure you want to block the entire {domain}? In most cases a few targeted blocks or mutes are sufficient and preferable. You will not see content from that domain in any public timelines or your notifications. Your followers from that domain will be removed.", + "confirmations.logout.confirm": "Log out", + "confirmations.logout.message": "Are you sure you want to log out?", + "confirmations.mute.confirm": "Mute", + "confirmations.mute.message": "Are you sure you want to mute {name}?", + "confirmations.redraft.confirm": "Delete & redraft", + "confirmations.redraft.message": "Are you sure you want to delete this status and re-draft it? Favourites and boosts will be lost, and replies to the original post will be orphaned.", + "confirmations.reply.confirm": "Reply", + "confirmations.reply.message": "Replying now will overwrite the message you are currently composing. Are you sure you want to proceed?", + "confirmations.unfollow.confirm": "Unfollow", + "confirmations.unfollow.message": "Are you sure you want to unfollow {name}?", + "directory.federated": "From known fediverse", + "directory.local": "From {domain} only", + "directory.new_arrivals": "New arrivals", + "directory.recently_active": "Recently active", + "embed.instructions": "Embed this status on your website by copying the code below.", + "embed.preview": "Here is what it will look like:", + "emoji_button.activity": "Activity", + "emoji_button.custom": "Custom", + "emoji_button.flags": "Flags", + "emoji_button.food": "Food & Drink", + "emoji_button.label": "Insert emoji", + "emoji_button.nature": "Nature", + "emoji_button.not_found": "No emojos!! (╯°□°)╯︵ ┻━┻", + "emoji_button.objects": "Objects", + "emoji_button.people": "People", + "emoji_button.recent": "Frequently used", + "emoji_button.search": "Search...", + "emoji_button.search_results": "Search results", + "emoji_button.symbols": "Symbols", + "emoji_button.travel": "Travel & Places", + "empty_column.account_timeline": "No toots here!", + "empty_column.account_unavailable": "Profile unavailable", + "empty_column.blocks": "You haven't blocked any users yet.", + "empty_column.community": "The local timeline is empty. Write something publicly to get the ball rolling!", + "empty_column.direct": "You don't have any direct messages yet. When you send or receive one, it will show up here.", + "empty_column.domain_blocks": "There are no hidden domains yet.", + "empty_column.favourited_statuses": "You don't have any favourite toots yet. When you favourite one, it will show up here.", + "empty_column.favourites": "No one has favourited this toot yet. When someone does, they will show up here.", + "empty_column.follow_requests": "You don't have any follow requests yet. When you receive one, it will show up here.", + "empty_column.hashtag": "There is nothing in this hashtag yet.", + "empty_column.home": "Your home timeline is empty! Visit {public} or use search to get started and meet other users.", + "empty_column.home.public_timeline": "the public timeline", + "empty_column.list": "There is nothing in this list yet. When members of this list post new statuses, they will appear here.", + "empty_column.lists": "You don't have any lists yet. When you create one, it will show up here.", + "empty_column.mutes": "You haven't muted any users yet.", + "empty_column.notifications": "You don't have any notifications yet. Interact with others to start the conversation.", + "empty_column.public": "There is nothing here! Write something publicly, or manually follow users from other servers to fill it up", + "follow_request.authorize": "Authorize", + "follow_request.reject": "Reject", + "getting_started.developers": "Developers", + "getting_started.directory": "Profile directory", + "getting_started.documentation": "Documentation", + "getting_started.heading": "Getting started", + "getting_started.invite": "Invite people", + "getting_started.open_source_notice": "Mastodon is open source software. You can contribute or report issues on GitHub at {github}.", + "getting_started.security": "Security", + "getting_started.terms": "Terms of service", + "hashtag.column_header.tag_mode.all": "and {additional}", + "hashtag.column_header.tag_mode.any": "or {additional}", + "hashtag.column_header.tag_mode.none": "without {additional}", + "hashtag.column_settings.select.no_options_message": "No suggestions found", + "hashtag.column_settings.select.placeholder": "Enter hashtags…", + "hashtag.column_settings.tag_mode.all": "All of these", + "hashtag.column_settings.tag_mode.any": "Any of these", + "hashtag.column_settings.tag_mode.none": "None of these", + "hashtag.column_settings.tag_toggle": "Include additional tags in this column", + "home.column_settings.basic": "Basic", + "home.column_settings.show_reblogs": "Show boosts", + "home.column_settings.show_replies": "Show replies", + "home.column_settings.update_live": "Update in real-time", + "intervals.full.days": "{number, plural, one {# day} other {# days}}", + "intervals.full.hours": "{number, plural, one {# hour} other {# hours}}", + "intervals.full.minutes": "{number, plural, one {# minute} other {# minutes}}", + "introduction.federation.action": "Next", + "introduction.federation.federated.headline": "Federated", + "introduction.federation.federated.text": "Public posts from other servers of the fediverse will appear in the federated timeline.", + "introduction.federation.home.headline": "Home", + "introduction.federation.home.text": "Posts from people you follow will appear in your home feed. You can follow anyone on any server!", + "introduction.federation.local.headline": "Local", + "introduction.federation.local.text": "Public posts from people on the same server as you will appear in the local timeline.", + "introduction.interactions.action": "Finish toot-orial!", + "introduction.interactions.favourite.headline": "Favourite", + "introduction.interactions.favourite.text": "You can save a toot for later, and let the author know that you liked it, by favouriting it.", + "introduction.interactions.reblog.headline": "Boost", + "introduction.interactions.reblog.text": "You can share other people's toots with your followers by boosting them.", + "introduction.interactions.reply.headline": "Reply", + "introduction.interactions.reply.text": "You can reply to other people's and your own toots, which will chain them together in a conversation.", + "introduction.welcome.action": "Let's go!", + "introduction.welcome.headline": "First steps", + "introduction.welcome.text": "Welcome to the fediverse! In a few moments, you'll be able to broadcast messages and talk to your friends across a wide variety of servers. But this server, {domain}, is special—it hosts your profile, so remember its name.", + "keyboard_shortcuts.back": "to navigate back", + "keyboard_shortcuts.blocked": "to open blocked users list", + "keyboard_shortcuts.boost": "to boost", + "keyboard_shortcuts.column": "to focus a status in one of the columns", + "keyboard_shortcuts.compose": "to focus the compose textarea", + "keyboard_shortcuts.description": "Description", + "keyboard_shortcuts.direct": "to open direct messages column", + "keyboard_shortcuts.down": "to move down in the list", + "keyboard_shortcuts.enter": "to open status", + "keyboard_shortcuts.favourite": "to favourite", + "keyboard_shortcuts.favourites": "to open favourites list", + "keyboard_shortcuts.federated": "to open federated timeline", + "keyboard_shortcuts.heading": "Keyboard Shortcuts", + "keyboard_shortcuts.home": "to open home timeline", + "keyboard_shortcuts.hotkey": "Hotkey", + "keyboard_shortcuts.legend": "to display this legend", + "keyboard_shortcuts.local": "to open local timeline", + "keyboard_shortcuts.mention": "to mention author", + "keyboard_shortcuts.muted": "to open muted users list", + "keyboard_shortcuts.my_profile": "to open your profile", + "keyboard_shortcuts.notifications": "to open notifications column", + "keyboard_shortcuts.pinned": "to open pinned toots list", + "keyboard_shortcuts.profile": "to open author's profile", + "keyboard_shortcuts.reply": "to reply", + "keyboard_shortcuts.requests": "to open follow requests list", + "keyboard_shortcuts.search": "to focus search", + "keyboard_shortcuts.start": "to open \"get started\" column", + "keyboard_shortcuts.toggle_hidden": "to show/hide text behind CW", + "keyboard_shortcuts.toggle_sensitivity": "to show/hide media", + "keyboard_shortcuts.toot": "to start a brand new toot", + "keyboard_shortcuts.unfocus": "to un-focus compose textarea/search", + "keyboard_shortcuts.up": "to move up in the list", + "lightbox.close": "Close", + "lightbox.next": "Next", + "lightbox.previous": "Previous", + "lightbox.view_context": "View context", + "lists.account.add": "Add to list", + "lists.account.remove": "Remove from list", + "lists.delete": "Delete list", + "lists.edit": "Edit list", + "lists.edit.submit": "Change title", + "lists.new.create": "Add list", + "lists.new.title_placeholder": "New list title", + "lists.search": "Search among people you follow", + "lists.subheading": "Your lists", + "load_pending": "{count, plural, one {# new item} other {# new items}}", + "loading_indicator.label": "Loading...", + "media_gallery.toggle_visible": "Toggle visibility", + "missing_indicator.label": "Not found", + "missing_indicator.sublabel": "This resource could not be found", + "mute_modal.hide_notifications": "Hide notifications from this user?", + "navigation_bar.apps": "Mobile apps", + "navigation_bar.blocks": "Blocked users", + "navigation_bar.community_timeline": "Local timeline", + "navigation_bar.compose": "Compose new toot", + "navigation_bar.direct": "Direct messages", + "navigation_bar.discover": "Discover", + "navigation_bar.domain_blocks": "Hidden domains", + "navigation_bar.edit_profile": "Edit profile", + "navigation_bar.favourites": "Favourites", + "navigation_bar.filters": "Muted words", + "navigation_bar.follow_requests": "Follow requests", + "navigation_bar.follows_and_followers": "Follows and followers", + "navigation_bar.info": "About this server", + "navigation_bar.keyboard_shortcuts": "Hotkeys", + "navigation_bar.lists": "Lists", + "navigation_bar.logout": "Logout", + "navigation_bar.mutes": "Muted users", + "navigation_bar.personal": "Personal", + "navigation_bar.pins": "Pinned toots", + "navigation_bar.preferences": "Preferences", + "navigation_bar.public_timeline": "Federated timeline", + "navigation_bar.security": "Security", + "notification.and_n_others": "and {count, plural, one {# other} other {# others}}", + "notification.favourite": "{name} favourited your status", + "notification.follow": "{name} followed you", + "notification.mention": "{name} mentioned you", + "notification.poll": "A poll you have voted in has ended", + "notification.reblog": "{name} boosted your status", + "notifications.clear": "Clear notifications", + "notifications.clear_confirmation": "Are you sure you want to permanently clear all your notifications?", + "notifications.column_settings.alert": "Desktop notifications", + "notifications.column_settings.favourite": "Favourites:", + "notifications.column_settings.filter_bar.advanced": "Display all categories", + "notifications.column_settings.filter_bar.category": "Quick filter bar", + "notifications.column_settings.filter_bar.show": "Show", + "notifications.column_settings.follow": "New followers:", + "notifications.column_settings.mention": "Mentions:", + "notifications.column_settings.poll": "Poll results:", + "notifications.column_settings.push": "Push notifications", + "notifications.column_settings.reblog": "Boosts:", + "notifications.column_settings.show": "Show in column", + "notifications.column_settings.sound": "Play sound", + "notifications.filter.all": "All", + "notifications.filter.boosts": "Boosts", + "notifications.filter.favourites": "Favourites", + "notifications.filter.follows": "Follows", + "notifications.filter.mentions": "Mentions", + "notifications.filter.polls": "Poll results", + "notifications.group": "{count} notifications", + "poll.closed": "Closed", + "poll.refresh": "Refresh", + "poll.total_votes": "{count, plural, one {# vote} other {# votes}}", + "poll.vote": "Vote", + "poll_button.add_poll": "Add a poll", + "poll_button.remove_poll": "Remove poll", + "privacy.change": "Adjust status privacy", + "privacy.direct.long": "Post to mentioned users only", + "privacy.direct.short": "Direct", + "privacy.private.long": "Post to followers only", + "privacy.private.short": "Followers-only", + "privacy.public.long": "Post to public timelines", + "privacy.public.short": "Public", + "privacy.unlisted.long": "Do not show in public timelines", + "privacy.unlisted.short": "Unlisted", + "regeneration_indicator.label": "Loading…", + "regeneration_indicator.sublabel": "Your home feed is being prepared!", + "relative_time.days": "{number}d", + "relative_time.hours": "{number}h", + "relative_time.just_now": "now", + "relative_time.minutes": "{number}m", + "relative_time.seconds": "{number}s", + "reply_indicator.cancel": "Cancel", + "report.forward": "Forward to {target}", + "report.forward_hint": "The account is from another server. Send an anonymized copy of the report there as well?", + "report.hint": "The report will be sent to your server moderators. You can provide an explanation of why you are reporting this account below:", + "report.placeholder": "Additional comments", + "report.submit": "Submit", + "report.target": "Report {target}", + "search.placeholder": "Search", + "search_popout.search_format": "Advanced search format", + "search_popout.tips.full_text": "Simple text returns statuses you have written, favourited, boosted, or have been mentioned in, as well as matching usernames, display names, and hashtags.", + "search_popout.tips.hashtag": "hashtag", + "search_popout.tips.status": "status", + "search_popout.tips.text": "Simple text returns matching display names, usernames and hashtags", + "search_popout.tips.user": "user", + "search_results.accounts": "People", + "search_results.hashtags": "Hashtags", + "search_results.statuses": "Toots", + "search_results.statuses_fts_disabled": "Searching toots by their content is not enabled on this Mastodon server.", + "search_results.total": "{count, number} {count, plural, one {result} other {results}}", + "status.admin_account": "Open moderation interface for @{name}", + "status.admin_status": "Open this status in the moderation interface", + "status.block": "Block @{name}", + "status.cancel_reblog_private": "Unboost", + "status.cannot_reblog": "This post cannot be boosted", + "status.copy": "Copy link to status", + "status.delete": "Delete", + "status.detailed_status": "Detailed conversation view", + "status.direct": "Direct message @{name}", + "status.embed": "Embed", + "status.favourite": "Favourite", + "status.filtered": "Filtered", + "status.load_more": "Load more", + "status.media_hidden": "Media hidden", + "status.mention": "Mention @{name}", + "status.more": "More", + "status.mute": "Mute @{name}", + "status.mute_conversation": "Mute conversation", + "status.open": "Expand this status", + "status.pin": "Pin on profile", + "status.pinned": "Pinned toot", + "status.read_more": "Read more", + "status.reblog": "Boost", + "status.reblog_private": "Boost to original audience", + "status.reblogged_by": "{name} boosted", + "status.reblogs.empty": "No one has boosted this toot yet. When someone does, they will show up here.", + "status.redraft": "Delete & re-draft", + "status.reply": "Reply", + "status.replyAll": "Reply to thread", + "status.report": "Report @{name}", + "status.sensitive_warning": "Sensitive content", + "status.share": "Share", + "status.show_less": "Show less", + "status.show_less_all": "Show less for all", + "status.show_more": "Show more", + "status.show_more_all": "Show more for all", + "status.show_thread": "Show thread", + "status.uncached_media_warning": "Not available", + "status.unmute_conversation": "Unmute conversation", + "status.unpin": "Unpin from profile", + "suggestions.dismiss": "Dismiss suggestion", + "suggestions.header": "You might be interested in…", + "tabs_bar.federated_timeline": "Federated", + "tabs_bar.home": "Home", + "tabs_bar.local_timeline": "Local", + "tabs_bar.notifications": "Notifications", + "tabs_bar.search": "Search", + "time_remaining.days": "{number, plural, one {# day} other {# days}} left", + "time_remaining.hours": "{number, plural, one {# hour} other {# hours}} left", + "time_remaining.minutes": "{number, plural, one {# minute} other {# minutes}} left", + "time_remaining.moments": "Moments remaining", + "time_remaining.seconds": "{number, plural, one {# second} other {# seconds}} left", + "trends.count_by_accounts": "{count} {rawCount, plural, one {person} other {people}} talking", + "trends.trending_now": "Trending now", + "ui.beforeunload": "Your draft will be lost if you leave Mastodon.", + "upload_area.title": "Drag & drop to upload", + "upload_button.label": "Add media ({formats})", + "upload_error.limit": "File upload limit exceeded.", + "upload_error.poll": "File upload not allowed with polls.", + "upload_form.description": "Describe for the visually impaired", + "upload_form.edit": "Edit", + "upload_form.undo": "Delete", + "upload_modal.analyzing_picture": "Analyzing picture…", + "upload_modal.apply": "Apply", + "upload_modal.description_placeholder": "A quick brown fox jumps over the lazy dog", + "upload_modal.detect_text": "Detect text from picture", + "upload_modal.edit_media": "Edit media", + "upload_modal.hint": "Click or drag the circle on the preview to choose the focal point which will always be in view on all thumbnails.", + "upload_modal.preview_label": "Preview ({ratio})", + "upload_progress.label": "Uploading...", + "video.close": "Close video", + "video.exit_fullscreen": "Exit full screen", + "video.expand": "Expand video", + "video.fullscreen": "Full screen", + "video.hide": "Hide video", + "video.mute": "Mute sound", + "video.pause": "Pause", + "video.play": "Play", + "video.unmute": "Unmute sound" +} diff --git a/app/javascript/mastodon/locales/ca.json b/app/javascript/mastodon/locales/ca.json index 4554500f5..77f84ac7d 100644 --- a/app/javascript/mastodon/locales/ca.json +++ b/app/javascript/mastodon/locales/ca.json @@ -63,6 +63,7 @@ "column.notifications": "Notificacions", "column.pins": "Toots fixats", "column.public": "Línia de temps federada", + "column.status": "Toot", "column_back_button.label": "Enrere", "column_header.hide_settings": "Amaga la configuració", "column_header.moveLeft_settings": "Mou la columna cap a l'esquerra", diff --git a/app/javascript/mastodon/locales/co.json b/app/javascript/mastodon/locales/co.json index b54857e36..d95f32b18 100644 --- a/app/javascript/mastodon/locales/co.json +++ b/app/javascript/mastodon/locales/co.json @@ -63,6 +63,7 @@ "column.notifications": "Nutificazione", "column.pins": "Statuti puntarulati", "column.public": "Linea pubblica glubale", + "column.status": "Toot", "column_back_button.label": "Ritornu", "column_header.hide_settings": "Piattà i parametri", "column_header.moveLeft_settings": "Spiazzà à manca", diff --git a/app/javascript/mastodon/locales/cs.json b/app/javascript/mastodon/locales/cs.json index b3d1e8157..8acf27cb3 100644 --- a/app/javascript/mastodon/locales/cs.json +++ b/app/javascript/mastodon/locales/cs.json @@ -63,6 +63,7 @@ "column.notifications": "Oznámení", "column.pins": "Připnuté tooty", "column.public": "Federovaná časová osa", + "column.status": "Toot", "column_back_button.label": "Zpět", "column_header.hide_settings": "Skrýt nastavení", "column_header.moveLeft_settings": "Posunout sloupec doleva", diff --git a/app/javascript/mastodon/locales/cy.json b/app/javascript/mastodon/locales/cy.json index bc65d601e..cdf2656d7 100644 --- a/app/javascript/mastodon/locales/cy.json +++ b/app/javascript/mastodon/locales/cy.json @@ -63,6 +63,7 @@ "column.notifications": "Hysbysiadau", "column.pins": "Tŵtiau wedi eu pinio", "column.public": "Ffrwd y ffederasiwn", + "column.status": "Toot", "column_back_button.label": "Nôl", "column_header.hide_settings": "Cuddio dewisiadau", "column_header.moveLeft_settings": "Symud y golofn i'r chwith", diff --git a/app/javascript/mastodon/locales/da.json b/app/javascript/mastodon/locales/da.json index dff8c3c05..14b0f7563 100644 --- a/app/javascript/mastodon/locales/da.json +++ b/app/javascript/mastodon/locales/da.json @@ -63,6 +63,7 @@ "column.notifications": "Notifikationer", "column.pins": "Fastgjorte trut", "column.public": "Fælles tidslinje", + "column.status": "Toot", "column_back_button.label": "Tilbage", "column_header.hide_settings": "Skjul indstillinger", "column_header.moveLeft_settings": "Flyt kolonne til venstre", diff --git a/app/javascript/mastodon/locales/de.json b/app/javascript/mastodon/locales/de.json index a9b777c03..845bc5156 100644 --- a/app/javascript/mastodon/locales/de.json +++ b/app/javascript/mastodon/locales/de.json @@ -63,6 +63,7 @@ "column.notifications": "Mitteilungen", "column.pins": "Angeheftete Beiträge", "column.public": "Föderierte Zeitleiste", + "column.status": "Toot", "column_back_button.label": "Zurück", "column_header.hide_settings": "Einstellungen verbergen", "column_header.moveLeft_settings": "Spalte nach links verschieben", diff --git a/app/javascript/mastodon/locales/defaultMessages.json b/app/javascript/mastodon/locales/defaultMessages.json index b3c25ebe6..db68f18c5 100644 --- a/app/javascript/mastodon/locales/defaultMessages.json +++ b/app/javascript/mastodon/locales/defaultMessages.json @@ -1129,6 +1129,15 @@ ], "path": "app/javascript/mastodon/features/compose/components/upload_form.json" }, + { + "descriptors": [ + { + "defaultMessage": "Uploading...", + "id": "upload_progress.label" + } + ], + "path": "app/javascript/mastodon/features/compose/components/upload_progress.json" + }, { "descriptors": [ { @@ -1155,19 +1164,6 @@ ], "path": "app/javascript/mastodon/features/compose/containers/navigation_container.json" }, - { - "descriptors": [ - { - "defaultMessage": "Are you sure you want to log out?", - "id": "confirmations.logout.message" - }, - { - "defaultMessage": "Log out", - "id": "confirmations.logout.confirm" - } - ], - "path": "app/javascript/mastodon/features/compose/containers/navigation_container.json" - }, { "descriptors": [ { @@ -1584,10 +1580,6 @@ }, { "descriptors": [ - { - "defaultMessage": "Basic", - "id": "home.column_settings.basic" - }, { "defaultMessage": "Show boosts", "id": "home.column_settings.show_reblogs" @@ -1969,6 +1961,14 @@ "defaultMessage": "Push notifications", "id": "notifications.column_settings.push" }, + { + "defaultMessage": "Basic", + "id": "home.column_settings.basic" + }, + { + "defaultMessage": "Update in real-time", + "id": "home.column_settings.update_live" + }, { "defaultMessage": "Quick filter bar", "id": "notifications.column_settings.filter_bar.category" @@ -2027,6 +2027,10 @@ }, { "descriptors": [ + { + "defaultMessage": "and {count, plural, one {# other} other {# others}}", + "id": "notification.and_n_others" + }, { "defaultMessage": "{name} followed you", "id": "notification.follow" @@ -2283,6 +2287,10 @@ "defaultMessage": "Block & Report", "id": "confirmations.block.block_and_report" }, + { + "defaultMessage": "Toot", + "id": "column.status" + }, { "defaultMessage": "Are you sure you want to block {name}?", "id": "confirmations.block.message" diff --git a/app/javascript/mastodon/locales/el.json b/app/javascript/mastodon/locales/el.json index 4c8a58778..bdd1da36c 100644 --- a/app/javascript/mastodon/locales/el.json +++ b/app/javascript/mastodon/locales/el.json @@ -63,6 +63,7 @@ "column.notifications": "Ειδοποιήσεις", "column.pins": "Καρφιτσωμένα τουτ", "column.public": "Ομοσπονδιακή ροή", + "column.status": "Toot", "column_back_button.label": "Πίσω", "column_header.hide_settings": "Απόκρυψη ρυθμίσεων", "column_header.moveLeft_settings": "Μεταφορά κολώνας αριστερά", diff --git a/app/javascript/mastodon/locales/en.json b/app/javascript/mastodon/locales/en.json index debc755c3..e959e5188 100644 --- a/app/javascript/mastodon/locales/en.json +++ b/app/javascript/mastodon/locales/en.json @@ -63,6 +63,7 @@ "column.notifications": "Notifications", "column.pins": "Pinned toots", "column.public": "Federated timeline", + "column.status": "Toot", "column_back_button.label": "Back", "column_header.hide_settings": "Hide settings", "column_header.moveLeft_settings": "Move column to the left", @@ -169,6 +170,7 @@ "home.column_settings.basic": "Basic", "home.column_settings.show_reblogs": "Show boosts", "home.column_settings.show_replies": "Show replies", + "home.column_settings.update_live": "Update in real-time", "intervals.full.days": "{number, plural, one {# day} other {# days}}", "intervals.full.hours": "{number, plural, one {# hour} other {# hours}}", "intervals.full.minutes": "{number, plural, one {# minute} other {# minutes}}", @@ -262,6 +264,7 @@ "navigation_bar.preferences": "Preferences", "navigation_bar.public_timeline": "Federated timeline", "navigation_bar.security": "Security", + "notification.and_n_others": "and {count, plural, one {# other} other {# others}}", "notification.favourite": "{name} favourited your status", "notification.follow": "{name} followed you", "notification.mention": "{name} mentioned you", diff --git a/app/javascript/mastodon/locales/eo.json b/app/javascript/mastodon/locales/eo.json index a04a70cce..31750050e 100644 --- a/app/javascript/mastodon/locales/eo.json +++ b/app/javascript/mastodon/locales/eo.json @@ -63,6 +63,7 @@ "column.notifications": "Sciigoj", "column.pins": "Alpinglitaj mesaĝoj", "column.public": "Fratara tempolinio", + "column.status": "Toot", "column_back_button.label": "Reveni", "column_header.hide_settings": "Kaŝi agordojn", "column_header.moveLeft_settings": "Movi kolumnon maldekstren", diff --git a/app/javascript/mastodon/locales/es.json b/app/javascript/mastodon/locales/es.json index 3b36571b1..a033f6e1f 100644 --- a/app/javascript/mastodon/locales/es.json +++ b/app/javascript/mastodon/locales/es.json @@ -4,7 +4,7 @@ "account.block": "Bloquear a @{name}", "account.block_domain": "Ocultar todo de {domain}", "account.blocked": "Bloqueado", - "account.cancel_follow_request": "Cancel follow request", + "account.cancel_follow_request": "Cancelar la solicitud de seguimiento", "account.direct": "Mensaje directo a @{name}", "account.domain_blocked": "Dominio oculto", "account.edit_profile": "Editar perfil", @@ -16,7 +16,7 @@ "account.follows.empty": "Este usuario todavía no sigue a nadie.", "account.follows_you": "Te sigue", "account.hide_reblogs": "Ocultar retoots de @{name}", - "account.last_status": "Last active", + "account.last_status": "Última actividad", "account.link_verified_on": "El proprietario de este link fue comprobado el {date}", "account.locked_info": "El estado de privacidad de esta cuenta està configurado como bloqueado. El proprietario debe revisar manualmente quien puede seguirle.", "account.media": "Multimedia", @@ -25,7 +25,7 @@ "account.mute": "Silenciar a @{name}", "account.mute_notifications": "Silenciar notificaciones de @{name}", "account.muted": "Silenciado", - "account.never_active": "Never", + "account.never_active": "Nunca", "account.posts": "Toots", "account.posts_with_replies": "Toots con respuestas", "account.report": "Reportar a @{name}", @@ -39,7 +39,7 @@ "account.unmute": "Dejar de silenciar a @{name}", "account.unmute_notifications": "Dejar de silenciar las notificaciones de @{name}", "alert.rate_limited.message": "Please retry after {retry_time, time, medium}.", - "alert.rate_limited.title": "Rate limited", + "alert.rate_limited.title": "Tarifa limitada", "alert.unexpected.message": "Hubo un error inesperado.", "alert.unexpected.title": "¡Ups!", "autosuggest_hashtag.per_week": "{count} per week", @@ -53,7 +53,7 @@ "column.blocks": "Usuarios bloqueados", "column.community": "Línea de tiempo local", "column.direct": "Mensajes directos", - "column.directory": "Browse profiles", + "column.directory": "Buscar perfiles", "column.domain_blocks": "Dominios ocultados", "column.favourites": "Favoritos", "column.follow_requests": "Solicitudes de seguimiento", @@ -63,6 +63,7 @@ "column.notifications": "Notificaciones", "column.pins": "Toots fijados", "column.public": "Línea de tiempo federada", + "column.status": "Toot", "column_back_button.label": "Atrás", "column_header.hide_settings": "Ocultar configuración", "column_header.moveLeft_settings": "Mover columna a la izquierda", @@ -100,8 +101,8 @@ "confirmations.delete_list.message": "¿Seguro que quieres borrar esta lista permanentemente?", "confirmations.domain_block.confirm": "Ocultar dominio entero", "confirmations.domain_block.message": "¿Seguro de que quieres bloquear al dominio {domain} entero? En general unos cuantos bloqueos y silenciados concretos es suficiente y preferible.", - "confirmations.logout.confirm": "Log out", - "confirmations.logout.message": "Are you sure you want to log out?", + "confirmations.logout.confirm": "Cerrar sesión", + "confirmations.logout.message": "¿Estás seguro de querer cerrar la sesión?", "confirmations.mute.confirm": "Silenciar", "confirmations.mute.message": "¿Estás seguro de que quieres silenciar a {name}?", "confirmations.redraft.confirm": "Borrar y volver a borrador", @@ -110,10 +111,10 @@ "confirmations.reply.message": "Responder sobrescribirá el mensaje que estás escribiendo. ¿Estás seguro de que deseas continuar?", "confirmations.unfollow.confirm": "Dejar de seguir", "confirmations.unfollow.message": "¿Estás seguro de que quieres dejar de seguir a {name}?", - "directory.federated": "From known fediverse", - "directory.local": "From {domain} only", - "directory.new_arrivals": "New arrivals", - "directory.recently_active": "Recently active", + "directory.federated": "Desde el fediverso conocido", + "directory.local": "Sólo de {domain}", + "directory.new_arrivals": "Recién llegados", + "directory.recently_active": "Recientemente activo", "embed.instructions": "Añade este toot a tu sitio web con el siguiente código.", "embed.preview": "Así es como se verá:", "emoji_button.activity": "Actividad", @@ -368,7 +369,7 @@ "status.show_more": "Mostrar más", "status.show_more_all": "Mostrar más para todo", "status.show_thread": "Ver hilo", - "status.uncached_media_warning": "Not available", + "status.uncached_media_warning": "No disponible", "status.unmute_conversation": "Dejar de silenciar conversación", "status.unpin": "Dejar de fijar", "suggestions.dismiss": "Descartar sugerencia", @@ -384,21 +385,21 @@ "time_remaining.moments": "Momentos restantes", "time_remaining.seconds": "{number, plural, one {# segundo restante} other {# segundos restantes}}", "trends.count_by_accounts": "{count} {rawCount, plural, one {persona} other {personas}} hablando", - "trends.trending_now": "Trending now", + "trends.trending_now": "Tendencia ahora", "ui.beforeunload": "Tu borrador se perderá si sales de Mastodon.", "upload_area.title": "Arrastra y suelta para subir", "upload_button.label": "Subir multimedia (JPEG, PNG, GIF, WebM, MP4, MOV)", "upload_error.limit": "Límite de subida de archivos excedido.", "upload_error.poll": "Subida de archivos no permitida con encuestas.", "upload_form.description": "Describir para los usuarios con dificultad visual", - "upload_form.edit": "Edit", + "upload_form.edit": "Editar", "upload_form.undo": "Borrar", - "upload_modal.analyzing_picture": "Analyzing picture…", - "upload_modal.apply": "Apply", - "upload_modal.description_placeholder": "A quick brown fox jumps over the lazy dog", - "upload_modal.detect_text": "Detect text from picture", - "upload_modal.edit_media": "Edit media", - "upload_modal.hint": "Click or drag the circle on the preview to choose the focal point which will always be in view on all thumbnails.", + "upload_modal.analyzing_picture": "Analizando imagen…", + "upload_modal.apply": "Aplicar", + "upload_modal.description_placeholder": "Un rápido zorro marrón salta sobre el perro perezoso", + "upload_modal.detect_text": "Detectar texto de la imagen", + "upload_modal.edit_media": "Editar multimedia", + "upload_modal.hint": "Haga clic o arrastre el círculo en la vista previa para elegir el punto focal que siempre estará a la vista en todas las miniaturas.", "upload_modal.preview_label": "Preview ({ratio})", "upload_progress.label": "Subiendo…", "video.close": "Cerrar video", diff --git a/app/javascript/mastodon/locales/et.json b/app/javascript/mastodon/locales/et.json index 63253a177..1d1dfd35a 100644 --- a/app/javascript/mastodon/locales/et.json +++ b/app/javascript/mastodon/locales/et.json @@ -63,6 +63,7 @@ "column.notifications": "Teated", "column.pins": "Kinnitatud upitused", "column.public": "Föderatiivne ajajoon", + "column.status": "Toot", "column_back_button.label": "Tagasi", "column_header.hide_settings": "Peida sätted", "column_header.moveLeft_settings": "Liiguta tulp vasakule", diff --git a/app/javascript/mastodon/locales/eu.json b/app/javascript/mastodon/locales/eu.json index e88bcfff1..f1fc17fdd 100644 --- a/app/javascript/mastodon/locales/eu.json +++ b/app/javascript/mastodon/locales/eu.json @@ -63,6 +63,7 @@ "column.notifications": "Jakinarazpenak", "column.pins": "Pinned toot", "column.public": "Federatutako denbora-lerroa", + "column.status": "Toot", "column_back_button.label": "Atzera", "column_header.hide_settings": "Ezkutatu ezarpenak", "column_header.moveLeft_settings": "Eraman zutabea ezkerrera", diff --git a/app/javascript/mastodon/locales/fa.json b/app/javascript/mastodon/locales/fa.json index 632698c46..9382ec5ee 100644 --- a/app/javascript/mastodon/locales/fa.json +++ b/app/javascript/mastodon/locales/fa.json @@ -63,6 +63,7 @@ "column.notifications": "اعلان‌ها", "column.pins": "نوشته‌های ثابت", "column.public": "نوشته‌های همه‌جا", + "column.status": "Toot", "column_back_button.label": "بازگشت", "column_header.hide_settings": "نهفتن تنظیمات", "column_header.moveLeft_settings": "انتقال ستون به راست", diff --git a/app/javascript/mastodon/locales/fi.json b/app/javascript/mastodon/locales/fi.json index 8f8e9fc58..01b5edad1 100644 --- a/app/javascript/mastodon/locales/fi.json +++ b/app/javascript/mastodon/locales/fi.json @@ -63,6 +63,7 @@ "column.notifications": "Ilmoitukset", "column.pins": "Kiinnitetty tuuttaus", "column.public": "Yleinen aikajana", + "column.status": "Toot", "column_back_button.label": "Takaisin", "column_header.hide_settings": "Piilota asetukset", "column_header.moveLeft_settings": "Siirrä saraketta vasemmalle", diff --git a/app/javascript/mastodon/locales/fr.json b/app/javascript/mastodon/locales/fr.json index 72158c413..7cfe9829a 100644 --- a/app/javascript/mastodon/locales/fr.json +++ b/app/javascript/mastodon/locales/fr.json @@ -63,6 +63,7 @@ "column.notifications": "Notifications", "column.pins": "Pouets épinglés", "column.public": "Fil public global", + "column.status": "Toot", "column_back_button.label": "Retour", "column_header.hide_settings": "Masquer les paramètres", "column_header.moveLeft_settings": "Déplacer la colonne vers la gauche", diff --git a/app/javascript/mastodon/locales/gl.json b/app/javascript/mastodon/locales/gl.json index 1bf37c898..3cc44f43e 100644 --- a/app/javascript/mastodon/locales/gl.json +++ b/app/javascript/mastodon/locales/gl.json @@ -63,6 +63,7 @@ "column.notifications": "Notificacións", "column.pins": "Mensaxes fixadas", "column.public": "Liña temporal federada", + "column.status": "Toot", "column_back_button.label": "Atrás", "column_header.hide_settings": "Agochar axustes", "column_header.moveLeft_settings": "Mover a columna hacia a esquerda", diff --git a/app/javascript/mastodon/locales/he.json b/app/javascript/mastodon/locales/he.json index fd7e40c53..b6cc3e6ce 100644 --- a/app/javascript/mastodon/locales/he.json +++ b/app/javascript/mastodon/locales/he.json @@ -63,6 +63,7 @@ "column.notifications": "התראות", "column.pins": "Pinned toot", "column.public": "בפרהסיה", + "column.status": "Toot", "column_back_button.label": "חזרה", "column_header.hide_settings": "הסתרת העדפות", "column_header.moveLeft_settings": "הזחת טור לשמאל", diff --git a/app/javascript/mastodon/locales/hi.json b/app/javascript/mastodon/locales/hi.json index 55b383d59..e2d1eb49d 100644 --- a/app/javascript/mastodon/locales/hi.json +++ b/app/javascript/mastodon/locales/hi.json @@ -63,6 +63,7 @@ "column.notifications": "Notifications", "column.pins": "Pinned toot", "column.public": "Federated timeline", + "column.status": "Toot", "column_back_button.label": "Back", "column_header.hide_settings": "Hide settings", "column_header.moveLeft_settings": "Move column to the left", diff --git a/app/javascript/mastodon/locales/hr.json b/app/javascript/mastodon/locales/hr.json index 8d7cb436c..6daabc694 100644 --- a/app/javascript/mastodon/locales/hr.json +++ b/app/javascript/mastodon/locales/hr.json @@ -63,6 +63,7 @@ "column.notifications": "Notifikacije", "column.pins": "Pinned toot", "column.public": "Federalni timeline", + "column.status": "Toot", "column_back_button.label": "Natrag", "column_header.hide_settings": "Hide settings", "column_header.moveLeft_settings": "Move column to the left", diff --git a/app/javascript/mastodon/locales/hu.json b/app/javascript/mastodon/locales/hu.json index 513f2a22a..f5a02065b 100644 --- a/app/javascript/mastodon/locales/hu.json +++ b/app/javascript/mastodon/locales/hu.json @@ -63,6 +63,7 @@ "column.notifications": "Értesítések", "column.pins": "Kitűzött tülkök", "column.public": "Nyilvános idővonal", + "column.status": "Toot", "column_back_button.label": "Vissza", "column_header.hide_settings": "Beállítások elrejtése", "column_header.moveLeft_settings": "Oszlop elmozdítása balra", diff --git a/app/javascript/mastodon/locales/hy.json b/app/javascript/mastodon/locales/hy.json index 1c3f1eec0..1484c76df 100644 --- a/app/javascript/mastodon/locales/hy.json +++ b/app/javascript/mastodon/locales/hy.json @@ -63,6 +63,7 @@ "column.notifications": "Ծանուցումներ", "column.pins": "Ամրացված թթեր", "column.public": "Դաշնային հոսք", + "column.status": "Toot", "column_back_button.label": "Ետ", "column_header.hide_settings": "Թաքցնել կարգավորումները", "column_header.moveLeft_settings": "Տեղաշարժել սյունը ձախ", diff --git a/app/javascript/mastodon/locales/id.json b/app/javascript/mastodon/locales/id.json index 5e1f318be..c9e48a1a6 100644 --- a/app/javascript/mastodon/locales/id.json +++ b/app/javascript/mastodon/locales/id.json @@ -63,6 +63,7 @@ "column.notifications": "Notifikasi", "column.pins": "Pinned toot", "column.public": "Linimasa gabungan", + "column.status": "Toot", "column_back_button.label": "Kembali", "column_header.hide_settings": "Sembunyikan pengaturan", "column_header.moveLeft_settings": "Pindahkan kolom ke kiri", diff --git a/app/javascript/mastodon/locales/io.json b/app/javascript/mastodon/locales/io.json index afbd970ec..6c1b7fa8b 100644 --- a/app/javascript/mastodon/locales/io.json +++ b/app/javascript/mastodon/locales/io.json @@ -63,6 +63,7 @@ "column.notifications": "Savigi", "column.pins": "Pinned toot", "column.public": "Federata tempolineo", + "column.status": "Toot", "column_back_button.label": "Retro", "column_header.hide_settings": "Hide settings", "column_header.moveLeft_settings": "Move column to the left", diff --git a/app/javascript/mastodon/locales/it.json b/app/javascript/mastodon/locales/it.json index caabf6ef3..dc43bcb5c 100644 --- a/app/javascript/mastodon/locales/it.json +++ b/app/javascript/mastodon/locales/it.json @@ -63,6 +63,7 @@ "column.notifications": "Notifiche", "column.pins": "Toot fissati in cima", "column.public": "Timeline federata", + "column.status": "Toot", "column_back_button.label": "Indietro", "column_header.hide_settings": "Nascondi impostazioni", "column_header.moveLeft_settings": "Sposta colonna a sinistra", diff --git a/app/javascript/mastodon/locales/ja.json b/app/javascript/mastodon/locales/ja.json index 1960dafba..4fb34e772 100644 --- a/app/javascript/mastodon/locales/ja.json +++ b/app/javascript/mastodon/locales/ja.json @@ -63,6 +63,7 @@ "column.notifications": "通知", "column.pins": "固定されたトゥート", "column.public": "連合タイムライン", + "column.status": "Toot", "column_back_button.label": "戻る", "column_header.hide_settings": "設定を隠す", "column_header.moveLeft_settings": "カラムを左に移動する", diff --git a/app/javascript/mastodon/locales/ka.json b/app/javascript/mastodon/locales/ka.json index d3018c0bf..e2a6ee6c6 100644 --- a/app/javascript/mastodon/locales/ka.json +++ b/app/javascript/mastodon/locales/ka.json @@ -63,6 +63,7 @@ "column.notifications": "შეტყობინებები", "column.pins": "აპინული ტუტები", "column.public": "ფედერალური თაიმლაინი", + "column.status": "Toot", "column_back_button.label": "უკან", "column_header.hide_settings": "პარამეტრების დამალვა", "column_header.moveLeft_settings": "სვეტის მარცხნივ გადატანა", diff --git a/app/javascript/mastodon/locales/kk.json b/app/javascript/mastodon/locales/kk.json index 5d671d907..a07302f0a 100644 --- a/app/javascript/mastodon/locales/kk.json +++ b/app/javascript/mastodon/locales/kk.json @@ -63,6 +63,7 @@ "column.notifications": "Ескертпелер", "column.pins": "Жабыстырылған жазбалар", "column.public": "Жаһандық желі", + "column.status": "Toot", "column_back_button.label": "Артқа", "column_header.hide_settings": "Баптауларды жасыр", "column_header.moveLeft_settings": "Бағананы солға жылжыту", diff --git a/app/javascript/mastodon/locales/ko.json b/app/javascript/mastodon/locales/ko.json index 50f7ca543..3ec9a8a16 100644 --- a/app/javascript/mastodon/locales/ko.json +++ b/app/javascript/mastodon/locales/ko.json @@ -63,6 +63,7 @@ "column.notifications": "알림", "column.pins": "고정된 툿", "column.public": "연합 타임라인", + "column.status": "Toot", "column_back_button.label": "돌아가기", "column_header.hide_settings": "설정 숨기기", "column_header.moveLeft_settings": "왼쪽으로 이동", @@ -292,7 +293,7 @@ "notifications.group": "{count} 개의 알림", "poll.closed": "마감됨", "poll.refresh": "새로고침", - "poll.total_votes": "{count} 명 참여", + "poll.total_votes": "{count} 표", "poll.vote": "투표", "poll_button.add_poll": "투표 추가", "poll_button.remove_poll": "투표 삭제", diff --git a/app/javascript/mastodon/locales/lt.json b/app/javascript/mastodon/locales/lt.json index 7d0776dff..2de037f16 100644 --- a/app/javascript/mastodon/locales/lt.json +++ b/app/javascript/mastodon/locales/lt.json @@ -63,6 +63,7 @@ "column.notifications": "Notifications", "column.pins": "Pinned toot", "column.public": "Federated timeline", + "column.status": "Toot", "column_back_button.label": "Back", "column_header.hide_settings": "Hide settings", "column_header.moveLeft_settings": "Move column to the left", diff --git a/app/javascript/mastodon/locales/lv.json b/app/javascript/mastodon/locales/lv.json index d9b125695..8d281c9d5 100644 --- a/app/javascript/mastodon/locales/lv.json +++ b/app/javascript/mastodon/locales/lv.json @@ -63,6 +63,7 @@ "column.notifications": "Paziņojumi", "column.pins": "Piespraustie ziņojumi", "column.public": "Federatīvā laika līnija", + "column.status": "Toot", "column_back_button.label": "Atpakaļ", "column_header.hide_settings": "Paslēpt iestatījumus", "column_header.moveLeft_settings": "Pārvietot kolonu pa kreisi", diff --git a/app/javascript/mastodon/locales/ms.json b/app/javascript/mastodon/locales/ms.json index b83d26a0a..9bd5eef72 100644 --- a/app/javascript/mastodon/locales/ms.json +++ b/app/javascript/mastodon/locales/ms.json @@ -63,6 +63,7 @@ "column.notifications": "Notifications", "column.pins": "Pinned toot", "column.public": "Federated timeline", + "column.status": "Toot", "column_back_button.label": "Back", "column_header.hide_settings": "Hide settings", "column_header.moveLeft_settings": "Move column to the left", diff --git a/app/javascript/mastodon/locales/nl.json b/app/javascript/mastodon/locales/nl.json index 439dccbb3..73e7b3905 100644 --- a/app/javascript/mastodon/locales/nl.json +++ b/app/javascript/mastodon/locales/nl.json @@ -63,6 +63,7 @@ "column.notifications": "Meldingen", "column.pins": "Vastgezette toots", "column.public": "Globale tijdlijn", + "column.status": "Toot", "column_back_button.label": "Terug", "column_header.hide_settings": "Instellingen verbergen", "column_header.moveLeft_settings": "Kolom naar links verplaatsen", diff --git a/app/javascript/mastodon/locales/nn.json b/app/javascript/mastodon/locales/nn.json new file mode 100644 index 000000000..dda402494 --- /dev/null +++ b/app/javascript/mastodon/locales/nn.json @@ -0,0 +1,414 @@ +{ + "account.add_or_remove_from_list": "Legg til eller ta vekk fra liste", + "account.badges.bot": "Robot", + "account.block": "Blokkér @{name}", + "account.block_domain": "Gøyme alt innhald for domenet {domain}", + "account.blocked": "Blokkert", + "account.cancel_follow_request": "Avslutt føljar-førespurnad", + "account.direct": "Direkte meld @{name}", + "account.domain_blocked": "Domenet er gøymt", + "account.edit_profile": "Rediger profil", + "account.endorse": "Framhev på profilen din", + "account.follow": "Følj", + "account.followers": "Føljare", + "account.followers.empty": "Er ikkje nokon som føljar denne brukaren ennå.", + "account.follows": "Føljingar", + "account.follows.empty": "Denne brukaren foljer ikkje nokon ennå.", + "account.follows_you": "Føljar deg", + "account.hide_reblogs": "Gøym robotar for @{name}", + "account.last_status": "Sist aktiv", + "account.link_verified_on": "Eigerskap for denne linken er sist sjekket den {date}", + "account.locked_info": "Brukarens privat-status er satt til lukka. Eigaren må manuelt døme kvem som kan følje honom.", + "account.media": "Media", + "account.mention": "Nemne @{name}", + "account.moved_to": "{name} har flytta til:", + "account.mute": "Målbind @{name}", + "account.mute_notifications": "Målbind notifikasjoner ifrå @{name}", + "account.muted": "Målbindt", + "account.never_active": "Aldri", + "account.posts": "Tutar", + "account.posts_with_replies": "Tutar og svar", + "account.report": "Rapporter @{name}", + "account.requested": "Venter på samtykke. Klikk for å avbryte føljar-førespurnad", + "account.share": "Del @{name} sin profil", + "account.show_reblogs": "Sjå framhevingar ifrå @{name}", + "account.unblock": "Avblokker @{name}", + "account.unblock_domain": "Vis {domain}", + "account.unendorse": "Ikkje framhev på profil", + "account.unfollow": "Avfølja", + "account.unmute": "Av-demp @{name}", + "account.unmute_notifications": "Av-demp notifikasjoner ifrå @{name}", + "alert.rate_limited.message": "Ver vennlig og prøv igjen {retry_time, time, medium}.", + "alert.rate_limited.title": "Bregrensa rate", + "alert.unexpected.message": "Eit uforventa problem har hendt.", + "alert.unexpected.title": "Oops!", + "autosuggest_hashtag.per_week": "{count} per veke", + "boost_modal.combo": "Du kan trykke {combo} for å hoppe over dette neste gong", + "bundle_column_error.body": "Noko gikk gale mens komponent ble nedlasta.", + "bundle_column_error.retry": "Prøv igjen", + "bundle_column_error.title": "Tenarmaskin feil", + "bundle_modal_error.close": "Lukk", + "bundle_modal_error.message": "Noko gikk gale mens komponent var i ferd med å bli nedlasta.", + "bundle_modal_error.retry": "Prøv igjen", + "column.blocks": "Blokka brukare", + "column.community": "Lokal samtid", + "column.direct": "Direkte meldingar", + "column.directory": "Sjå gjennom profiler", + "column.domain_blocks": "Gøymte domener", + "column.favourites": "Favorittar", + "column.follow_requests": "Føljarførespurnad", + "column.home": "Heim", + "column.lists": "Lister", + "column.mutes": "Målbindte brukare", + "column.notifications": "Varslinger", + "column.pins": "Festa tuter", + "column.public": "Federert samtid", + "column.status": "Toot", + "column_back_button.label": "Tilbake", + "column_header.hide_settings": "Skjul innstillingar", + "column_header.moveLeft_settings": "Flytt feltet til venstre", + "column_header.moveRight_settings": "Flytt feltet til høgre", + "column_header.pin": "Fest", + "column_header.show_settings": "Vis innstillingar", + "column_header.unpin": "Løys", + "column_subheading.settings": "Innstillingar", + "community.column_settings.media_only": "Kun medie", + "compose_form.direct_message_warning": "Denne tuten vil kun verte synleg for nemnde brukarar.", + "compose_form.direct_message_warning_learn_more": "Lær meir", + "compose_form.hashtag_warning": "This toot won't be listed under any hashtag as it is unlisted. Only public toots can be searched by hashtag.", + "compose_form.lock_disclaimer": "Your account is not {locked}. Anyone can follow you to view your follower-only posts.", + "compose_form.lock_disclaimer.lock": "locked", + "compose_form.placeholder": "What is on your mind?", + "compose_form.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.publish": "Toot", + "compose_form.publish_loud": "{publish}!", + "compose_form.sensitive.hide": "Mark media as sensitive", + "compose_form.sensitive.marked": "Media is marked as sensitive", + "compose_form.sensitive.unmarked": "Media is not marked as sensitive", + "compose_form.spoiler.marked": "Text is hidden behind warning", + "compose_form.spoiler.unmarked": "Text is not hidden", + "compose_form.spoiler_placeholder": "Write your warning here", + "confirmation_modal.cancel": "Cancel", + "confirmations.block.block_and_report": "Block & Report", + "confirmations.block.confirm": "Block", + "confirmations.block.message": "Are you sure you want to block {name}?", + "confirmations.delete.confirm": "Delete", + "confirmations.delete.message": "Are you sure you want to delete this status?", + "confirmations.delete_list.confirm": "Delete", + "confirmations.delete_list.message": "Are you sure you want to permanently delete this list?", + "confirmations.domain_block.confirm": "Hide entire domain", + "confirmations.domain_block.message": "Er du ordentleg, ordentleg sikker på at du vill blokkere heile {domain}? I dei tilfeller er det bedre med ein målretta blokkering eller demping av individuelle brukare.", + "confirmations.logout.confirm": "Logg ut", + "confirmations.logout.message": "Er du sikker på at du vill logge ut?", + "confirmations.mute.confirm": "Målbind", + "confirmations.mute.message": "Er du sikker på at d vill målbinde {name}?", + "confirmations.redraft.confirm": "Slett & gjennopprett", + "confirmations.redraft.message": "Er du sikker på at du vill slette statusen og gjennoprette den? Favoritter og framhevinger vill bli borte, og svar til den originale posten vill bli einstøing.", + "confirmations.reply.confirm": "Svar", + "confirmations.reply.message": "Replying now will overwrite the message you are currently composing. Are you sure you want to proceed?", + "confirmations.unfollow.confirm": "Unfollow", + "confirmations.unfollow.message": "Are you sure you want to unfollow {name}?", + "directory.federated": "From known fediverse", + "directory.local": "From {domain} only", + "directory.new_arrivals": "New arrivals", + "directory.recently_active": "Recently active", + "embed.instructions": "Embed this status on your website by copying the code below.", + "embed.preview": "Here is what it will look like:", + "emoji_button.activity": "Activity", + "emoji_button.custom": "Custom", + "emoji_button.flags": "Flags", + "emoji_button.food": "Food & Drink", + "emoji_button.label": "Insert emoji", + "emoji_button.nature": "Nature", + "emoji_button.not_found": "No emojos!! (╯°□°)╯︵ ┻━┻", + "emoji_button.objects": "Objects", + "emoji_button.people": "People", + "emoji_button.recent": "Frequently used", + "emoji_button.search": "Search...", + "emoji_button.search_results": "Search results", + "emoji_button.symbols": "Symbols", + "emoji_button.travel": "Travel & Places", + "empty_column.account_timeline": "No toots here!", + "empty_column.account_unavailable": "Profile unavailable", + "empty_column.blocks": "You haven't blocked any users yet.", + "empty_column.community": "The local timeline is empty. Write something publicly to get the ball rolling!", + "empty_column.direct": "You don't have any direct messages yet. When you send or receive one, it will show up here.", + "empty_column.domain_blocks": "There are no hidden domains yet.", + "empty_column.favourited_statuses": "You don't have any favourite toots yet. When you favourite one, it will show up here.", + "empty_column.favourites": "No one has favourited this toot yet. When someone does, they will show up here.", + "empty_column.follow_requests": "You don't have any follow requests yet. When you receive one, it will show up here.", + "empty_column.hashtag": "There is nothing in this hashtag yet.", + "empty_column.home": "Your home timeline is empty! Visit {public} or use search to get started and meet other users.", + "empty_column.home.public_timeline": "the public timeline", + "empty_column.list": "There is nothing in this list yet. When members of this list post new statuses, they will appear here.", + "empty_column.lists": "You don't have any lists yet. When you create one, it will show up here.", + "empty_column.mutes": "You haven't muted any users yet.", + "empty_column.notifications": "You don't have any notifications yet. Interact with others to start the conversation.", + "empty_column.public": "There is nothing here! Write something publicly, or manually follow users from other servers to fill it up", + "follow_request.authorize": "Authorize", + "follow_request.reject": "Reject", + "getting_started.developers": "Developers", + "getting_started.directory": "Profile directory", + "getting_started.documentation": "Documentation", + "getting_started.heading": "Getting started", + "getting_started.invite": "Invite people", + "getting_started.open_source_notice": "Mastodon is open source software. You can contribute or report issues on GitHub at {github}.", + "getting_started.security": "Security", + "getting_started.terms": "Terms of service", + "hashtag.column_header.tag_mode.all": "and {additional}", + "hashtag.column_header.tag_mode.any": "or {additional}", + "hashtag.column_header.tag_mode.none": "without {additional}", + "hashtag.column_settings.select.no_options_message": "No suggestions found", + "hashtag.column_settings.select.placeholder": "Enter hashtags…", + "hashtag.column_settings.tag_mode.all": "All of these", + "hashtag.column_settings.tag_mode.any": "Any of these", + "hashtag.column_settings.tag_mode.none": "None of these", + "hashtag.column_settings.tag_toggle": "Include additional tags in this column", + "home.column_settings.basic": "Basic", + "home.column_settings.show_reblogs": "Show boosts", + "home.column_settings.show_replies": "Show replies", + "home.column_settings.update_live": "Update in real-time", + "intervals.full.days": "{number, plural, one {# day} other {# days}}", + "intervals.full.hours": "{number, plural, one {# hour} other {# hours}}", + "intervals.full.minutes": "{number, plural, one {# minute} other {# minutes}}", + "introduction.federation.action": "Next", + "introduction.federation.federated.headline": "Federated", + "introduction.federation.federated.text": "Public posts from other servers of the fediverse will appear in the federated timeline.", + "introduction.federation.home.headline": "Home", + "introduction.federation.home.text": "Posts from people you follow will appear in your home feed. You can follow anyone on any server!", + "introduction.federation.local.headline": "Local", + "introduction.federation.local.text": "Public posts from people on the same server as you will appear in the local timeline.", + "introduction.interactions.action": "Finish toot-orial!", + "introduction.interactions.favourite.headline": "Favourite", + "introduction.interactions.favourite.text": "You can save a toot for later, and let the author know that you liked it, by favouriting it.", + "introduction.interactions.reblog.headline": "Boost", + "introduction.interactions.reblog.text": "You can share other people's toots with your followers by boosting them.", + "introduction.interactions.reply.headline": "Reply", + "introduction.interactions.reply.text": "You can reply to other people's and your own toots, which will chain them together in a conversation.", + "introduction.welcome.action": "Let's go!", + "introduction.welcome.headline": "First steps", + "introduction.welcome.text": "Welcome to the fediverse! In a few moments, you'll be able to broadcast messages and talk to your friends across a wide variety of servers. But this server, {domain}, is special—it hosts your profile, so remember its name.", + "keyboard_shortcuts.back": "to navigate back", + "keyboard_shortcuts.blocked": "to open blocked users list", + "keyboard_shortcuts.boost": "to boost", + "keyboard_shortcuts.column": "to focus a status in one of the columns", + "keyboard_shortcuts.compose": "to focus the compose textarea", + "keyboard_shortcuts.description": "Description", + "keyboard_shortcuts.direct": "to open direct messages column", + "keyboard_shortcuts.down": "to move down in the list", + "keyboard_shortcuts.enter": "to open status", + "keyboard_shortcuts.favourite": "to favourite", + "keyboard_shortcuts.favourites": "to open favourites list", + "keyboard_shortcuts.federated": "to open federated timeline", + "keyboard_shortcuts.heading": "Keyboard Shortcuts", + "keyboard_shortcuts.home": "to open home timeline", + "keyboard_shortcuts.hotkey": "Hotkey", + "keyboard_shortcuts.legend": "to display this legend", + "keyboard_shortcuts.local": "to open local timeline", + "keyboard_shortcuts.mention": "to mention author", + "keyboard_shortcuts.muted": "to open muted users list", + "keyboard_shortcuts.my_profile": "to open your profile", + "keyboard_shortcuts.notifications": "to open notifications column", + "keyboard_shortcuts.pinned": "to open pinned toots list", + "keyboard_shortcuts.profile": "to open author's profile", + "keyboard_shortcuts.reply": "to reply", + "keyboard_shortcuts.requests": "to open follow requests list", + "keyboard_shortcuts.search": "to focus search", + "keyboard_shortcuts.start": "to open \"get started\" column", + "keyboard_shortcuts.toggle_hidden": "to show/hide text behind CW", + "keyboard_shortcuts.toggle_sensitivity": "to show/hide media", + "keyboard_shortcuts.toot": "to start a brand new toot", + "keyboard_shortcuts.unfocus": "to un-focus compose textarea/search", + "keyboard_shortcuts.up": "to move up in the list", + "lightbox.close": "Close", + "lightbox.next": "Next", + "lightbox.previous": "Previous", + "lightbox.view_context": "View context", + "lists.account.add": "Add to list", + "lists.account.remove": "Remove from list", + "lists.delete": "Delete list", + "lists.edit": "Edit list", + "lists.edit.submit": "Change title", + "lists.new.create": "Add list", + "lists.new.title_placeholder": "New list title", + "lists.search": "Search among people you follow", + "lists.subheading": "Your lists", + "load_pending": "{count, plural, one {# new item} other {# new items}}", + "loading_indicator.label": "Loading...", + "media_gallery.toggle_visible": "Toggle visibility", + "missing_indicator.label": "Not found", + "missing_indicator.sublabel": "This resource could not be found", + "mute_modal.hide_notifications": "Hide notifications from this user?", + "navigation_bar.apps": "Mobile apps", + "navigation_bar.blocks": "Blocked users", + "navigation_bar.community_timeline": "Local timeline", + "navigation_bar.compose": "Compose new toot", + "navigation_bar.direct": "Direct messages", + "navigation_bar.discover": "Discover", + "navigation_bar.domain_blocks": "Hidden domains", + "navigation_bar.edit_profile": "Edit profile", + "navigation_bar.favourites": "Favourites", + "navigation_bar.filters": "Muted words", + "navigation_bar.follow_requests": "Follow requests", + "navigation_bar.follows_and_followers": "Follows and followers", + "navigation_bar.info": "About this server", + "navigation_bar.keyboard_shortcuts": "Hotkeys", + "navigation_bar.lists": "Lists", + "navigation_bar.logout": "Logout", + "navigation_bar.mutes": "Muted users", + "navigation_bar.personal": "Personal", + "navigation_bar.pins": "Pinned toots", + "navigation_bar.preferences": "Preferences", + "navigation_bar.public_timeline": "Federated timeline", + "navigation_bar.security": "Security", + "notification.and_n_others": "and {count, plural, one {# other} other {# others}}", + "notification.favourite": "{name} favourited your status", + "notification.follow": "{name} followed you", + "notification.mention": "{name} mentioned you", + "notification.poll": "A poll you have voted in has ended", + "notification.reblog": "{name} boosted your status", + "notifications.clear": "Clear notifications", + "notifications.clear_confirmation": "Are you sure you want to permanently clear all your notifications?", + "notifications.column_settings.alert": "Desktop notifications", + "notifications.column_settings.favourite": "Favourites:", + "notifications.column_settings.filter_bar.advanced": "Display all categories", + "notifications.column_settings.filter_bar.category": "Quick filter bar", + "notifications.column_settings.filter_bar.show": "Show", + "notifications.column_settings.follow": "New followers:", + "notifications.column_settings.mention": "Mentions:", + "notifications.column_settings.poll": "Poll results:", + "notifications.column_settings.push": "Push notifications", + "notifications.column_settings.reblog": "Boosts:", + "notifications.column_settings.show": "Show in column", + "notifications.column_settings.sound": "Play sound", + "notifications.filter.all": "All", + "notifications.filter.boosts": "Boosts", + "notifications.filter.favourites": "Favourites", + "notifications.filter.follows": "Follows", + "notifications.filter.mentions": "Mentions", + "notifications.filter.polls": "Poll results", + "notifications.group": "{count} notifications", + "poll.closed": "Closed", + "poll.refresh": "Refresh", + "poll.total_votes": "{count, plural, one {# vote} other {# votes}}", + "poll.vote": "Vote", + "poll_button.add_poll": "Add a poll", + "poll_button.remove_poll": "Remove poll", + "privacy.change": "Adjust status privacy", + "privacy.direct.long": "Post to mentioned users only", + "privacy.direct.short": "Direct", + "privacy.private.long": "Post to followers only", + "privacy.private.short": "Followers-only", + "privacy.public.long": "Post to public timelines", + "privacy.public.short": "Public", + "privacy.unlisted.long": "Do not show in public timelines", + "privacy.unlisted.short": "Unlisted", + "regeneration_indicator.label": "Loading…", + "regeneration_indicator.sublabel": "Your home feed is being prepared!", + "relative_time.days": "{number}d", + "relative_time.hours": "{number}h", + "relative_time.just_now": "now", + "relative_time.minutes": "{number}m", + "relative_time.seconds": "{number}s", + "reply_indicator.cancel": "Cancel", + "report.forward": "Forward to {target}", + "report.forward_hint": "The account is from another server. Send an anonymized copy of the report there as well?", + "report.hint": "The report will be sent to your server moderators. You can provide an explanation of why you are reporting this account below:", + "report.placeholder": "Additional comments", + "report.submit": "Submit", + "report.target": "Report {target}", + "search.placeholder": "Search", + "search_popout.search_format": "Advanced search format", + "search_popout.tips.full_text": "Simple text returns statuses you have written, favourited, boosted, or have been mentioned in, as well as matching usernames, display names, and hashtags.", + "search_popout.tips.hashtag": "hashtag", + "search_popout.tips.status": "status", + "search_popout.tips.text": "Simple text returns matching display names, usernames and hashtags", + "search_popout.tips.user": "user", + "search_results.accounts": "People", + "search_results.hashtags": "Hashtags", + "search_results.statuses": "Toots", + "search_results.statuses_fts_disabled": "Searching toots by their content is not enabled on this Mastodon server.", + "search_results.total": "{count, number} {count, plural, one {result} other {results}}", + "status.admin_account": "Open moderation interface for @{name}", + "status.admin_status": "Open this status in the moderation interface", + "status.block": "Block @{name}", + "status.cancel_reblog_private": "Unboost", + "status.cannot_reblog": "This post cannot be boosted", + "status.copy": "Copy link to status", + "status.delete": "Delete", + "status.detailed_status": "Detailed conversation view", + "status.direct": "Direct message @{name}", + "status.embed": "Embed", + "status.favourite": "Favourite", + "status.filtered": "Filtered", + "status.load_more": "Load more", + "status.media_hidden": "Media hidden", + "status.mention": "Mention @{name}", + "status.more": "More", + "status.mute": "Mute @{name}", + "status.mute_conversation": "Mute conversation", + "status.open": "Expand this status", + "status.pin": "Pin on profile", + "status.pinned": "Pinned toot", + "status.read_more": "Read more", + "status.reblog": "Boost", + "status.reblog_private": "Boost to original audience", + "status.reblogged_by": "{name} boosted", + "status.reblogs.empty": "No one has boosted this toot yet. When someone does, they will show up here.", + "status.redraft": "Delete & re-draft", + "status.reply": "Reply", + "status.replyAll": "Reply to thread", + "status.report": "Report @{name}", + "status.sensitive_warning": "Sensitive content", + "status.share": "Share", + "status.show_less": "Show less", + "status.show_less_all": "Show less for all", + "status.show_more": "Show more", + "status.show_more_all": "Show more for all", + "status.show_thread": "Show thread", + "status.uncached_media_warning": "Not available", + "status.unmute_conversation": "Unmute conversation", + "status.unpin": "Unpin from profile", + "suggestions.dismiss": "Dismiss suggestion", + "suggestions.header": "You might be interested in…", + "tabs_bar.federated_timeline": "Federated", + "tabs_bar.home": "Home", + "tabs_bar.local_timeline": "Local", + "tabs_bar.notifications": "Notifications", + "tabs_bar.search": "Search", + "time_remaining.days": "{number, plural, one {# day} other {# days}} left", + "time_remaining.hours": "{number, plural, one {# hour} other {# hours}} left", + "time_remaining.minutes": "{number, plural, one {# minute} other {# minutes}} left", + "time_remaining.moments": "Moments remaining", + "time_remaining.seconds": "{number, plural, one {# second} other {# seconds}} left", + "trends.count_by_accounts": "{count} {rawCount, plural, one {person} other {people}} talking", + "trends.trending_now": "Trending now", + "ui.beforeunload": "Your draft will be lost if you leave Mastodon.", + "upload_area.title": "Drag & drop to upload", + "upload_button.label": "Add media ({formats})", + "upload_error.limit": "File upload limit exceeded.", + "upload_error.poll": "File upload not allowed with polls.", + "upload_form.description": "Describe for the visually impaired", + "upload_form.edit": "Edit", + "upload_form.undo": "Delete", + "upload_modal.analyzing_picture": "Analyzing picture…", + "upload_modal.apply": "Apply", + "upload_modal.description_placeholder": "A quick brown fox jumps over the lazy dog", + "upload_modal.detect_text": "Detect text from picture", + "upload_modal.edit_media": "Edit media", + "upload_modal.hint": "Click or drag the circle on the preview to choose the focal point which will always be in view on all thumbnails.", + "upload_modal.preview_label": "Preview ({ratio})", + "upload_progress.label": "Uploading...", + "video.close": "Close video", + "video.exit_fullscreen": "Exit full screen", + "video.expand": "Expand video", + "video.fullscreen": "Full screen", + "video.hide": "Hide video", + "video.mute": "Mute sound", + "video.pause": "Pause", + "video.play": "Play", + "video.unmute": "Unmute sound" +} diff --git a/app/javascript/mastodon/locales/no.json b/app/javascript/mastodon/locales/no.json index 77ddad7e0..8fc722037 100644 --- a/app/javascript/mastodon/locales/no.json +++ b/app/javascript/mastodon/locales/no.json @@ -63,6 +63,7 @@ "column.notifications": "Varsler", "column.pins": "Pinned toot", "column.public": "Felles tidslinje", + "column.status": "Toot", "column_back_button.label": "Tilbake", "column_header.hide_settings": "Gjem innstillinger", "column_header.moveLeft_settings": "Flytt feltet til venstre", diff --git a/app/javascript/mastodon/locales/oc.json b/app/javascript/mastodon/locales/oc.json index 10501796d..d5abe89fb 100644 --- a/app/javascript/mastodon/locales/oc.json +++ b/app/javascript/mastodon/locales/oc.json @@ -63,6 +63,7 @@ "column.notifications": "Notificacions", "column.pins": "Tuts penjats", "column.public": "Flux public global", + "column.status": "Toot", "column_back_button.label": "Tornar", "column_header.hide_settings": "Amagar los paramètres", "column_header.moveLeft_settings": "Desplaçar la colomna a man drecha", diff --git a/app/javascript/mastodon/locales/pl.json b/app/javascript/mastodon/locales/pl.json index e6c82c4f3..62f75e3c2 100644 --- a/app/javascript/mastodon/locales/pl.json +++ b/app/javascript/mastodon/locales/pl.json @@ -63,6 +63,7 @@ "column.notifications": "Powiadomienia", "column.pins": "Przypięte wpisy", "column.public": "Globalna oś czasu", + "column.status": "Toot", "column_back_button.label": "Wróć", "column_header.hide_settings": "Ukryj ustawienia", "column_header.moveLeft_settings": "Przesuń kolumnę w lewo", diff --git a/app/javascript/mastodon/locales/pt-BR.json b/app/javascript/mastodon/locales/pt-BR.json index e11141f6c..debf9e6f6 100644 --- a/app/javascript/mastodon/locales/pt-BR.json +++ b/app/javascript/mastodon/locales/pt-BR.json @@ -63,6 +63,7 @@ "column.notifications": "Notificações", "column.pins": "Postagens fixadas", "column.public": "Global", + "column.status": "Toot", "column_back_button.label": "Voltar", "column_header.hide_settings": "Esconder configurações", "column_header.moveLeft_settings": "Mover coluna para a esquerda", diff --git a/app/javascript/mastodon/locales/pt.json b/app/javascript/mastodon/locales/pt-PT.json similarity index 99% rename from app/javascript/mastodon/locales/pt.json rename to app/javascript/mastodon/locales/pt-PT.json index 63a078c4e..feba8fd9a 100644 --- a/app/javascript/mastodon/locales/pt.json +++ b/app/javascript/mastodon/locales/pt-PT.json @@ -63,6 +63,7 @@ "column.notifications": "Notificações", "column.pins": "Publicações fixas", "column.public": "Cronologia federada", + "column.status": "Toot", "column_back_button.label": "Voltar", "column_header.hide_settings": "Esconder configurações", "column_header.moveLeft_settings": "Mover coluna para a esquerda", diff --git a/app/javascript/mastodon/locales/ro.json b/app/javascript/mastodon/locales/ro.json index 27e4addda..038b8ddd4 100644 --- a/app/javascript/mastodon/locales/ro.json +++ b/app/javascript/mastodon/locales/ro.json @@ -63,6 +63,7 @@ "column.notifications": "Notificări", "column.pins": "Postări fixate", "column.public": "Flux global", + "column.status": "Toot", "column_back_button.label": "Înapoi", "column_header.hide_settings": "Ascunde setările", "column_header.moveLeft_settings": "Mută coloana la stânga", diff --git a/app/javascript/mastodon/locales/ru.json b/app/javascript/mastodon/locales/ru.json index efbaa25a0..69bd5a422 100644 --- a/app/javascript/mastodon/locales/ru.json +++ b/app/javascript/mastodon/locales/ru.json @@ -63,6 +63,7 @@ "column.notifications": "Уведомления", "column.pins": "Закреплённый пост", "column.public": "Глобальная лента", + "column.status": "Toot", "column_back_button.label": "Назад", "column_header.hide_settings": "Скрыть настройки", "column_header.moveLeft_settings": "Передвинуть колонку влево", @@ -260,7 +261,7 @@ "navigation_bar.mutes": "Список скрытых пользователей", "navigation_bar.personal": "Личное", "navigation_bar.pins": "Закреплённые посты", - "navigation_bar.preferences": "Опции", + "navigation_bar.preferences": "Настройки", "navigation_bar.public_timeline": "Глобальная лента", "navigation_bar.security": "Безопасность", "notification.and_n_others": "and {count, plural, one {# other} other {# others}}", @@ -383,8 +384,8 @@ "time_remaining.minutes": "{number, plural, one {осталась # минута} few {осталось # минуты} many {осталось # минут} other {осталось # минут}}", "time_remaining.moments": "остались считанные мгновения", "time_remaining.seconds": "{number, plural, one {осталась # секунду} few {осталось # секунды} many {осталось # секунд} other {осталось # секунд}}", - "trends.count_by_accounts": "Популярно у {count} {rawCount, plural, one {человека} few {человек} many {человек} other {человек}}", - "trends.trending_now": "Trending now", + "trends.count_by_accounts": "{count} {rawCount, plural, one {человек говорит} few {человека говорят} other {человек говорят}} про это", + "trends.trending_now": "Самое актуальное", "ui.beforeunload": "Ваш черновик будет утерян, если вы покинете Mastodon.", "upload_area.title": "Перетащите сюда, чтобы загрузить", "upload_button.label": "Добавить медиаконтент", diff --git a/app/javascript/mastodon/locales/sk.json b/app/javascript/mastodon/locales/sk.json index 312f63301..89a472d89 100644 --- a/app/javascript/mastodon/locales/sk.json +++ b/app/javascript/mastodon/locales/sk.json @@ -63,6 +63,7 @@ "column.notifications": "Oboznámenia", "column.pins": "Pripnuté príspevky", "column.public": "Federovaná časová os", + "column.status": "Toot", "column_back_button.label": "Späť", "column_header.hide_settings": "Skryť nastavenia", "column_header.moveLeft_settings": "Presuň stĺpec doľava", diff --git a/app/javascript/mastodon/locales/sl.json b/app/javascript/mastodon/locales/sl.json index fa5d22fd1..d7d78c41c 100644 --- a/app/javascript/mastodon/locales/sl.json +++ b/app/javascript/mastodon/locales/sl.json @@ -63,6 +63,7 @@ "column.notifications": "Obvestila", "column.pins": "Pripeti tuti", "column.public": "Združena časovnica", + "column.status": "Toot", "column_back_button.label": "Nazaj", "column_header.hide_settings": "Skrij nastavitve", "column_header.moveLeft_settings": "Premakni stolpec na levo", diff --git a/app/javascript/mastodon/locales/sq.json b/app/javascript/mastodon/locales/sq.json index 12f66cafd..0f851051c 100644 --- a/app/javascript/mastodon/locales/sq.json +++ b/app/javascript/mastodon/locales/sq.json @@ -63,6 +63,7 @@ "column.notifications": "Njoftime", "column.pins": "Mesazhe të fiksuar", "column.public": "Rrjedhë kohore e federuar", + "column.status": "Toot", "column_back_button.label": "Mbrapsht", "column_header.hide_settings": "Fshihi rregullimet", "column_header.moveLeft_settings": "Shpjere shtyllën majtas", diff --git a/app/javascript/mastodon/locales/sr-Latn.json b/app/javascript/mastodon/locales/sr-Latn.json index 72ea3490f..fb6a365ce 100644 --- a/app/javascript/mastodon/locales/sr-Latn.json +++ b/app/javascript/mastodon/locales/sr-Latn.json @@ -63,6 +63,7 @@ "column.notifications": "Obaveštenja", "column.pins": "Prikačeni tutovi", "column.public": "Federisana lajna", + "column.status": "Toot", "column_back_button.label": "Nazad", "column_header.hide_settings": "Sakrij postavke", "column_header.moveLeft_settings": "Pomeri kolonu ulevo", diff --git a/app/javascript/mastodon/locales/sr.json b/app/javascript/mastodon/locales/sr.json index c77927ec1..064934f54 100644 --- a/app/javascript/mastodon/locales/sr.json +++ b/app/javascript/mastodon/locales/sr.json @@ -63,6 +63,7 @@ "column.notifications": "Обавештења", "column.pins": "Прикачене трубе", "column.public": "Здружена временска линија", + "column.status": "Toot", "column_back_button.label": "Назад", "column_header.hide_settings": "Сакриј поставке", "column_header.moveLeft_settings": "Помери колону улево", diff --git a/app/javascript/mastodon/locales/sv.json b/app/javascript/mastodon/locales/sv.json index 6783da15d..f666a4b6e 100644 --- a/app/javascript/mastodon/locales/sv.json +++ b/app/javascript/mastodon/locales/sv.json @@ -63,6 +63,7 @@ "column.notifications": "Meddelanden", "column.pins": "Nålade toots", "column.public": "Förenad tidslinje", + "column.status": "Toot", "column_back_button.label": "Tillbaka", "column_header.hide_settings": "Dölj inställningar", "column_header.moveLeft_settings": "Flytta kolumnen till vänster", diff --git a/app/javascript/mastodon/locales/ta.json b/app/javascript/mastodon/locales/ta.json index 3266102b1..3caf301d0 100644 --- a/app/javascript/mastodon/locales/ta.json +++ b/app/javascript/mastodon/locales/ta.json @@ -63,6 +63,7 @@ "column.notifications": "Notifications", "column.pins": "Pinned toot", "column.public": "கூட்டாட்சி காலக்கெடு", + "column.status": "Toot", "column_back_button.label": "ஆதரி", "column_header.hide_settings": "அமைப்புகளை மறை", "column_header.moveLeft_settings": "நெடுவரிசையை இடதுபுறமாக நகர்த்தவும்", diff --git a/app/javascript/mastodon/locales/te.json b/app/javascript/mastodon/locales/te.json index ee7293aa7..5827dbb3a 100644 --- a/app/javascript/mastodon/locales/te.json +++ b/app/javascript/mastodon/locales/te.json @@ -63,6 +63,7 @@ "column.notifications": "ప్రకటనలు", "column.pins": "Pinned toot", "column.public": "సమాఖ్య కాలక్రమం", + "column.status": "Toot", "column_back_button.label": "వెనక్కి", "column_header.hide_settings": "అమర్పులను దాచిపెట్టు", "column_header.moveLeft_settings": "నిలువు వరుసను ఎడమకి తరలించు", diff --git a/app/javascript/mastodon/locales/th.json b/app/javascript/mastodon/locales/th.json index 3ff56f947..33eb315f1 100644 --- a/app/javascript/mastodon/locales/th.json +++ b/app/javascript/mastodon/locales/th.json @@ -16,7 +16,7 @@ "account.follows.empty": "ผู้ใช้นี้ยังไม่ได้ติดตามใคร", "account.follows_you": "ติดตามคุณ", "account.hide_reblogs": "ซ่อนการดันจาก @{name}", - "account.last_status": "Last active", + "account.last_status": "ใช้งานล่าสุด", "account.link_verified_on": "ตรวจสอบความเป็นเจ้าของของลิงก์นี้เมื่อ {date}", "account.locked_info": "มีการตั้งสถานะความเป็นส่วนตัวของบัญชีนี้เป็นล็อคอยู่ เจ้าของตรวจทานผู้ที่สามารถติดตามเขาด้วยตนเอง", "account.media": "สื่อ", @@ -25,7 +25,7 @@ "account.mute": "ปิดเสียง @{name}", "account.mute_notifications": "ปิดเสียงการแจ้งเตือนจาก @{name}", "account.muted": "ปิดเสียงอยู่", - "account.never_active": "Never", + "account.never_active": "ไม่เลย", "account.posts": "โพสต์", "account.posts_with_replies": "โพสต์และการตอบกลับ", "account.report": "รายงาน @{name}", @@ -53,7 +53,7 @@ "column.blocks": "ผู้ใช้ที่ปิดกั้นอยู่", "column.community": "เส้นเวลาในเว็บ", "column.direct": "ข้อความโดยตรง", - "column.directory": "Browse profiles", + "column.directory": "เรียกดูโปรไฟล์", "column.domain_blocks": "โดเมนที่ซ่อนอยู่", "column.favourites": "รายการโปรด", "column.follow_requests": "คำขอติดตาม", @@ -63,6 +63,7 @@ "column.notifications": "การแจ้งเตือน", "column.pins": "โพสต์ที่ปักหมุด", "column.public": "เส้นเวลาที่ติดต่อกับภายนอก", + "column.status": "Toot", "column_back_button.label": "ย้อนกลับ", "column_header.hide_settings": "ซ่อนการตั้งค่า", "column_header.moveLeft_settings": "ย้ายคอลัมน์ไปทางซ้าย", @@ -100,8 +101,8 @@ "confirmations.delete_list.message": "คุณแน่ใจหรือไม่ว่าต้องการลบรายการนี้อย่างถาวร?", "confirmations.domain_block.confirm": "ซ่อนทั้งโดเมน", "confirmations.domain_block.message": "Are you really, really sure you want to block the entire {domain}? In most cases a few targeted blocks or mutes are sufficient and preferable.", - "confirmations.logout.confirm": "Log out", - "confirmations.logout.message": "Are you sure you want to log out?", + "confirmations.logout.confirm": "ออกจากระบบ", + "confirmations.logout.message": "คุณแน่ใจหรือไม่ว่าต้องการออกจากระบบ?", "confirmations.mute.confirm": "ปิดเสียง", "confirmations.mute.message": "คุณแน่ใจหรือไม่ว่าต้องการปิดเสียง {name}?", "confirmations.redraft.confirm": "ลบแล้วร่างใหม่", diff --git a/app/javascript/mastodon/locales/tr.json b/app/javascript/mastodon/locales/tr.json index ec9bd0f8f..2c4d820de 100644 --- a/app/javascript/mastodon/locales/tr.json +++ b/app/javascript/mastodon/locales/tr.json @@ -63,6 +63,7 @@ "column.notifications": "Bildirimler", "column.pins": "Sabitlenmiş gönderi", "column.public": "Federe zaman tüneli", + "column.status": "Toot", "column_back_button.label": "Geri", "column_header.hide_settings": "Ayarları gizle", "column_header.moveLeft_settings": "Sütunu sola taşı", diff --git a/app/javascript/mastodon/locales/uk.json b/app/javascript/mastodon/locales/uk.json index 605ebdc08..6ccb20fc6 100644 --- a/app/javascript/mastodon/locales/uk.json +++ b/app/javascript/mastodon/locales/uk.json @@ -63,6 +63,7 @@ "column.notifications": "Сповіщення", "column.pins": "Закріплені дмухи", "column.public": "Глобальна стрічка", + "column.status": "Toot", "column_back_button.label": "Назад", "column_header.hide_settings": "Приховати налаштування", "column_header.moveLeft_settings": "Змістити колонку вліво", diff --git a/app/javascript/mastodon/locales/whitelist_pt.json b/app/javascript/mastodon/locales/whitelist_br.json similarity index 100% rename from app/javascript/mastodon/locales/whitelist_pt.json rename to app/javascript/mastodon/locales/whitelist_br.json diff --git a/app/javascript/mastodon/locales/whitelist_nn.json b/app/javascript/mastodon/locales/whitelist_nn.json new file mode 100644 index 000000000..0d4f101c7 --- /dev/null +++ b/app/javascript/mastodon/locales/whitelist_nn.json @@ -0,0 +1,2 @@ +[ +] diff --git a/app/javascript/mastodon/locales/whitelist_pt-PT.json b/app/javascript/mastodon/locales/whitelist_pt-PT.json new file mode 100644 index 000000000..0d4f101c7 --- /dev/null +++ b/app/javascript/mastodon/locales/whitelist_pt-PT.json @@ -0,0 +1,2 @@ +[ +] diff --git a/app/javascript/mastodon/locales/zh-CN.json b/app/javascript/mastodon/locales/zh-CN.json index 8ab7046c1..2f0373d93 100644 --- a/app/javascript/mastodon/locales/zh-CN.json +++ b/app/javascript/mastodon/locales/zh-CN.json @@ -63,6 +63,7 @@ "column.notifications": "通知", "column.pins": "置顶嘟文", "column.public": "跨站公共时间轴", + "column.status": "Toot", "column_back_button.label": "返回", "column_header.hide_settings": "隐藏设置", "column_header.moveLeft_settings": "将此栏左移", diff --git a/app/javascript/mastodon/locales/zh-HK.json b/app/javascript/mastodon/locales/zh-HK.json index d63a9dd34..0a42aa47f 100644 --- a/app/javascript/mastodon/locales/zh-HK.json +++ b/app/javascript/mastodon/locales/zh-HK.json @@ -63,6 +63,7 @@ "column.notifications": "通知", "column.pins": "置頂文章", "column.public": "跨站時間軸", + "column.status": "Toot", "column_back_button.label": "返回", "column_header.hide_settings": "隱藏設定", "column_header.moveLeft_settings": "將欄左移", diff --git a/app/javascript/mastodon/locales/zh-TW.json b/app/javascript/mastodon/locales/zh-TW.json index d0b95da8c..82d7b6db5 100644 --- a/app/javascript/mastodon/locales/zh-TW.json +++ b/app/javascript/mastodon/locales/zh-TW.json @@ -63,6 +63,7 @@ "column.notifications": "通知", "column.pins": "釘選的嘟文", "column.public": "聯邦時間軸", + "column.status": "Toot", "column_back_button.label": "上一頁", "column_header.hide_settings": "隱藏設定", "column_header.moveLeft_settings": "將欄位向左移動", diff --git a/config/application.rb b/config/application.rb index f49deffbb..5fd37120d 100644 --- a/config/application.rb +++ b/config/application.rb @@ -76,7 +76,7 @@ module Mastodon :no, :oc, :pl, - :pt, + :'pt-PT', :'pt-BR', :ro, :ru, diff --git a/config/locales/activerecord.br.yml b/config/locales/activerecord.br.yml new file mode 100644 index 000000000..c7677c850 --- /dev/null +++ b/config/locales/activerecord.br.yml @@ -0,0 +1 @@ +br: diff --git a/config/locales/activerecord.nn.yml b/config/locales/activerecord.nn.yml new file mode 100644 index 000000000..777f4e600 --- /dev/null +++ b/config/locales/activerecord.nn.yml @@ -0,0 +1 @@ +nn: diff --git a/config/locales/activerecord.pt.yml b/config/locales/activerecord.pt.yml deleted file mode 100644 index 556fcfc4f..000000000 --- a/config/locales/activerecord.pt.yml +++ /dev/null @@ -1,13 +0,0 @@ ---- -pt: - activerecord: - errors: - models: - account: - attributes: - username: - invalid: apenas letras, números e underscores - status: - attributes: - reblog: - taken: do status já existe diff --git a/config/locales/ar.yml b/config/locales/ar.yml index 82d2485a7..45001e6fc 100644 --- a/config/locales/ar.yml +++ b/config/locales/ar.yml @@ -240,6 +240,7 @@ ar: copied_msg: تم إنشاء نسخة محلية للإيموجي بنجاح copy: نسخ copy_failed_msg: فشلت عملية إنشاء نسخة محلية لهذا الإيموجي + create_new_category: انشئ فئة جديدة created_msg: تم إنشاء الإيموجي بنجاح! delete: حذف destroyed_msg: تمت عملية تدمير الإيموجي بنجاح! @@ -256,6 +257,7 @@ ar: shortcode: الترميز المُصَغّر shortcode_hint: على الأقل حرفين، و فقط رموز أبجدية عددية و أسطر سفلية title: الإيموجي الخاصة + uncategorized: غير مصنّف unlisted: غير مدرج update_failed_msg: تعذرت عملية تحديث ذاك الإيموجي updated_msg: تم تحديث الإيموجي بنجاح! @@ -501,6 +503,7 @@ ar: in_directory: "%{count} في سجل حسابات المستخدمين" title: الوسوم trending_right_now: متداول اللحظة + unique_uses_today: "%{count} منشورات اليوم" unreviewed: غير مُراجَع updated_msg: تم تحديث إعدادات الوسوم بنجاح title: الإدارة @@ -595,7 +598,6 @@ ar: x_months: "%{count} شه" x_seconds: "%{count}ث" deletes: - bad_password_msg: إنّ الكلمة السرية التي أدخلتها غير صحيحة confirm_password: قم بإدخال كلمتك السرية الحالية للتحقق من هويتك proceed: حذف حساب success_msg: تم حذف حسابك بنجاح diff --git a/config/locales/ast.yml b/config/locales/ast.yml index e801d4b51..72b87a6ac 100644 --- a/config/locales/ast.yml +++ b/config/locales/ast.yml @@ -131,7 +131,6 @@ ast: half_a_minute: Púramente agora less_than_x_seconds: Púramente agora deletes: - bad_password_msg: "¡Bon intentu, crackers! Contraseña incorreuta" confirm_password: Introduz la contraseña pa verificar la to identidá errors: '400': The request you submitted was invalid or malformed. diff --git a/config/locales/br.yml b/config/locales/br.yml new file mode 100644 index 000000000..3710084e7 --- /dev/null +++ b/config/locales/br.yml @@ -0,0 +1,20 @@ +--- +br: + errors: + '400': The request you submitted was invalid or malformed. + '403': You don't have permission to view this page. + '404': The page you are looking for isn't here. + '406': This page is not available in the requested format. + '410': The page you were looking for doesn't exist here anymore. + '422': + '429': Throttled + '500': + '503': The page could not be served due to a temporary server failure. + invites: + expires_in: + '1800': 30 minutes + '21600': 6 hours + '3600': 1 hour + '43200': 12 hours + '604800': 1 week + '86400': 1 day diff --git a/config/locales/ca.yml b/config/locales/ca.yml index a23b6ddf4..bfd7c514d 100644 --- a/config/locales/ca.yml +++ b/config/locales/ca.yml @@ -620,7 +620,6 @@ ca: x_months: "%{count} mesos" x_seconds: "%{count} s" deletes: - bad_password_msg: Bon intent hackers! La contrasenya no és correcta confirm_password: Introdueix la contrasenya actual per a verificar la identitat proceed: Suprimeix el compte success_msg: El compte s'ha eliminat correctament diff --git a/config/locales/co.yml b/config/locales/co.yml index 8ecff0d59..e91b1361f 100644 --- a/config/locales/co.yml +++ b/config/locales/co.yml @@ -427,6 +427,9 @@ co: custom_css: desc_html: Mudificà l'apparenza cù CSS caricatu nant'à ogni pagina title: CSS persunalizatu + default_noindex: + desc_html: Tocca tutti quelli ch'ùn anu micca cambiatu stu parametru + title: Ritirà l'utilizatori di l'indicazione nant'à i mutori di ricerca domain_blocks: all: À tutti disabled: À nimu @@ -629,7 +632,6 @@ co: x_months: "%{count}Me" x_seconds: "%{count}s" deletes: - bad_password_msg: È nò! Sta chjave ùn hè curretta confirm_password: Entrate a vostra chjave d’accessu attuale per verificà a vostra identità proceed: Sguassà u contu success_msg: U vostru contu hè statu sguassatu diff --git a/config/locales/cs.yml b/config/locales/cs.yml index 46700be56..569eb35d2 100644 --- a/config/locales/cs.yml +++ b/config/locales/cs.yml @@ -233,10 +233,12 @@ cs: deleted_status: "(smazaný toot)" title: Záznam auditu custom_emojis: + assign_category: Přiřadit kategorii by_domain: Doména copied_msg: Místní kopie emoji byla úspěšně vytvořena copy: Kopírovat copy_failed_msg: Nebylo možné vytvořit místní kopii tohoto emoji + create_new_category: Vytvořit novou kategorii created_msg: Emoji úspěšně vytvořeno! delete: Smazat destroyed_msg: Emoji úspěšně zničeno! @@ -253,6 +255,7 @@ cs: shortcode: Zkratka shortcode_hint: Alespoň 2 znaky, pouze alfanumerické znaky a podtržítka title: Vlastní emoji + uncategorized: Nezařazená unlisted: Neuvedeno update_failed_msg: Nebylo možné aktualizovat toto emoji updated_msg: Emoji úspěšně aktualizováno! @@ -436,6 +439,9 @@ cs: custom_css: desc_html: Pozměnit vzhled pomocí šablony CSS načtené na každé stránce title: Vlastní CSS + default_noindex: + desc_html: Ovlivňuje všechny uživatele, kteří toto nastavení sami nezměnili + title: Odhlásit uživatele z indexování vyhledávačemi ve výchozím stavu domain_blocks: all: Všem disabled: Nikomu @@ -447,7 +453,7 @@ cs: desc_html: Zobrazuje se na hlavní stránce. Doporučuje se rozlišení alespoň 600x100 px. Pokud toto není nastaveno, bude zobrazena miniatura serveru title: Hlavní obrázek mascot: - desc_html: Zobrazuje se na hlavní stránce. Doporučuje se rozlišení alespoň 293x205 px. Pokud toto není nastaveno, bude zobrazen výchozí maskot + desc_html: Zobrazuje se na několika stránkách. Doporučuje se rozlišení alespoň 293x205 px. Pokud toto není nastaveno, bude zobrazen výchozí maskot title: Obrázek maskota peers_api_enabled: desc_html: Domény, na které tento server narazil ve fedivesmíru @@ -638,7 +644,6 @@ cs: x_months: "%{count} mesíců" x_seconds: "%{count} s" deletes: - bad_password_msg: Dobrý pokus, hackeři! Nesprávné heslo confirm_password: Zadejte svoje současné heslo pro ověření vaší identity proceed: Odstranit účet success_msg: Váš účet byl úspěšně odstraněn diff --git a/config/locales/cy.yml b/config/locales/cy.yml index a1d637f2e..a58ea2534 100644 --- a/config/locales/cy.yml +++ b/config/locales/cy.yml @@ -581,7 +581,6 @@ cy: x_months: "%{count}mis" x_seconds: "%{count}eiliad" deletes: - bad_password_msg: Go dda, hacwyr! Cyfrinair anghywir confirm_password: Mewnbynnwch eich cyfrinair presennol i gadarnhau mai chi sydd yno proceed: Dileu cyfrif success_msg: Llwyddwyd i ddileu eich cyfrif diff --git a/config/locales/da.yml b/config/locales/da.yml index 70397c77b..06a68f684 100644 --- a/config/locales/da.yml +++ b/config/locales/da.yml @@ -207,6 +207,7 @@ da: copied_msg: Succesfuldt oprettede en lokal kopi af humørikonet copy: Kopier copy_failed_msg: Kunne ikke oprette en lokal kopi af dette humørikon + create_new_category: Opret ny kategori created_msg: Humørikon succesfuldt oprettet! delete: Slet destroyed_msg: Emojo succesfuldt destrueret! @@ -514,7 +515,6 @@ da: over_x_years: "%{count}år" x_months: "%{count}md" deletes: - bad_password_msg: Godt forsøg, hackere! Forkert kodeord confirm_password: Indtast dit nuværende kodeord for at bekræfte din identitet proceed: Slet konto success_msg: Din konto er nu blevet slettet diff --git a/config/locales/de.yml b/config/locales/de.yml index 0af7be2f4..fb988668a 100644 --- a/config/locales/de.yml +++ b/config/locales/de.yml @@ -225,10 +225,12 @@ de: deleted_status: "(gelöschter Beitrag)" title: Überprüfungsprotokoll custom_emojis: + assign_category: Kategorie zuweisen by_domain: Domain copied_msg: Eine lokale Kopie des Emojis wurde erstellt copy: Kopieren copy_failed_msg: Es konnte keine lokale Kopie des Emojis erstellt werden + create_new_category: Neue Kategorie erstellen created_msg: Emoji erstellt! delete: Löschen destroyed_msg: Emoji gelöscht! @@ -245,6 +247,7 @@ de: shortcode: Kürzel shortcode_hint: Mindestens 2 Zeichen, nur Buchstaben, Ziffern und Unterstriche title: Eigene Emojis + uncategorized: Nicht kategorisiert unlisted: Ungelistet update_failed_msg: Konnte dieses Emoji nicht aktualisieren updated_msg: Emoji erfolgreich aktualisiert! @@ -424,6 +427,9 @@ de: custom_css: desc_html: Verändere das Aussehen mit CSS, dass auf jeder Seite geladen wird title: Benutzerdefiniertes CSS + default_noindex: + desc_html: Beeinflusst alle Benutzer, die diese Einstellung nicht selbst geändert haben + title: Benutzer aus Suchmaschinen-Indizierung standardmäßig herausnehmen domain_blocks: all: An alle disabled: An niemanden @@ -626,7 +632,6 @@ de: x_months: "%{count}mo" x_seconds: "%{count}s" deletes: - bad_password_msg: Falsches Passwort confirm_password: Gib dein derzeitiges Passwort ein, um deine Identität zu bestätigen proceed: Konto löschen success_msg: Dein Konto wurde erfolgreich gelöscht @@ -727,6 +732,7 @@ de: all: Alle changes_saved_msg: Änderungen gespeichert! copy: Kopieren + no_batch_actions_available: Keine Massenaktionen auf dieser Seite verfügbar order_by: Sortieren nach save_changes: Änderungen speichern validation_errors: diff --git a/config/locales/devise.br.yml b/config/locales/devise.br.yml new file mode 100644 index 000000000..c7677c850 --- /dev/null +++ b/config/locales/devise.br.yml @@ -0,0 +1 @@ +br: diff --git a/config/locales/devise.nn.yml b/config/locales/devise.nn.yml new file mode 100644 index 000000000..777f4e600 --- /dev/null +++ b/config/locales/devise.nn.yml @@ -0,0 +1 @@ +nn: diff --git a/config/locales/devise.pt.yml b/config/locales/devise.pt.yml deleted file mode 100644 index 9b44bbf00..000000000 --- a/config/locales/devise.pt.yml +++ /dev/null @@ -1,83 +0,0 @@ ---- -pt: - devise: - confirmations: - confirmed: O teu endereço de e-mail foi confirmado com sucesso. - send_instructions: Vais receber um email com as instruções para confirmar o teu endereço de email dentro de alguns minutos. Por favor, verifica a caixa de spam se não recebeste o e-mail. - send_paranoid_instructions: Se o teu endereço de email já existir na nossa base de dados, vais receber um email com as instruções de confirmação dentro de alguns minutos. Por favor, verifica a caixa de spam se não recebeste o e-mail. - failure: - already_authenticated: A tua sessão já está aberta. - inactive: A tua conta ainda não está ativada. - invalid: "%{authentication_keys} ou palavra-passe inválida." - last_attempt: Tens mais uma tentativa antes de a tua conta ficar bloqueada. - locked: A tua conta está bloqueada. - not_found_in_database: "%{authentication_keys} ou palavra-passe inválida." - 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. - unconfirmed: Tens de confirmar o teu endereço de email antes de continuar. - mailer: - confirmation_instructions: - action: Verificar o endereço de e-mail - action_with_app: Confirmar e regressar a %{app} - explanation: Criaste uma conta em %{host} com este endereço de e-mail. Estás a um clique de activá-la. Se não foste tu que fizeste este registo, por favor ignora esta mensagem. - extra_html: Por favor lê as regras da instância e os nossos termos de serviço. - subject: 'Mastodon: Instruções de confirmação %{instance}' - title: Verificar o endereço de e-mail - email_changed: - explanation: 'O e-mail associado à tua conta será alterado para:' - extra: Se não alteraste o teu e-mail é possível que alguém tenha conseguido aceder à tua conta. Por favor muda a tua palavra-passe imediatamente ou entra em contato com um administrador do servidor se ficaste sem acesso à tua conta. - subject: 'Mastodon: Email alterado' - title: Novo endereço de e-mail - password_change: - explanation: A palavra-passe da tua conta foi alterada. - extra: Se não alteraste a tua palavra-passe, é possível que alguém tenha conseguido aceder à tua conta. Por favor muda a tua palavra-passe imediatamente ou entra em contato com um administrador do servidor se ficaste sem acesso à tua conta. - subject: 'Mastodon: Nova palavra-passe' - title: Palavra-passe alterada - reconfirmation_instructions: - explanation: Confirma o teu novo endereço para alterar o e-mail. - extra: Se esta mudança não foi iniciada por ti, por favor ignora este e-mail. O endereço de e-mail para a tua conta do Mastodon não irá mudar enquanto não acederes ao link acima. - subject: 'Mastodon: Confirmação de e-mail %{instance}' - title: Validar o endereço de e-mail - reset_password_instructions: - action: Alterar palavra-passe - explanation: Pediste a alteração da palavra-passe da tua conta. - extra: Se não fizeste este pedido, por favor ignora este e-mail. A tua palavra-passe não irá mudar se não acederes ao link acima e criares uma nova. - subject: 'Mastodon: Instruções para alterar a palavra-passe' - title: Solicitar nova palavra-passe - unlock_instructions: - subject: 'Mastodon: Instruções para desbloquear a tua conta' - omniauth_callbacks: - failure: Não foi possível autenticar %{kind} porque "%{reason}". - success: Autenticado com sucesso na conta %{kind}. - passwords: - no_token: Não pode aceder a esta página se não vier através do link enviado por email para alteração da sua palavra-passe. Se usaste esse link para chegar aqui, por favor verifica que o endereço URL actual é o mesmo do que foi enviado no email. - send_instructions: Vais receber um email com instruções para alterar a palavra-passe dentro de algns minutos. - send_paranoid_instructions: Se o teu endereço de email existe na nossa base de dados, vais receber um link para recuperar a palavra-passe dentro de alguns minutos. - updated: A tua palavra-passe foi alterada. Estás agora autenticado na tua conta. - updated_not_active: A tua palavra-passe foi alterada. - registrations: - destroyed: Adeus! A tua conta foi cancelada. Esperamos ver-te em breve. - signed_up: Bem-vindo! A tua conta foi registada com sucesso. - signed_up_but_inactive: A tua conta foi registada. No entanto ainda não está activa. - signed_up_but_locked: A tua conta foi registada. No entanto está bloqueada. - signed_up_but_unconfirmed: Uma mensagem com um link de confirmação foi enviada para o teu email. Por favor segue esse link para activar a tua conta. - update_needs_confirmation: Alteraste o teu endereço de email ou palavra-passe, mas é necessário confirmar essa alteração. Por favor vai ao teu email e segue link que te enviámos. - updated: A tua conta foi actualizada com sucesso. - sessions: - already_signed_out: Sessão encerrada. - signed_in: Sessão iniciada. - signed_out: Sessão encerrada. - unlocks: - send_instructions: Vais receber um email com instruções para desbloquear a tua conta dentro de alguns minutos. - send_paranoid_instructions: Se a tua conta existe, vais receber um email com instruções a detalhar como a desbloquear dentro de alguns minutos. - unlocked: A sua conta foi desbloqueada. Por favor inica uma nova sessão para continuar. - errors: - messages: - already_confirmed: já confirmado, por favor tente iniciar sessão - confirmation_period_expired: tem de ser confirmado durante %{period}, por favor tenta outra vez - expired: expirou, por favor tente outra vez - not_found: não encontrado - not_locked: não estava bloqueada - not_saved: - one: '1 erro impediu este %{resource} de ser guardado:' - other: "%{count} erros impediram este %{resource} de ser guardado:" diff --git a/config/locales/doorkeeper.br.yml b/config/locales/doorkeeper.br.yml new file mode 100644 index 000000000..c7677c850 --- /dev/null +++ b/config/locales/doorkeeper.br.yml @@ -0,0 +1 @@ +br: diff --git a/config/locales/doorkeeper.nn.yml b/config/locales/doorkeeper.nn.yml new file mode 100644 index 000000000..777f4e600 --- /dev/null +++ b/config/locales/doorkeeper.nn.yml @@ -0,0 +1 @@ +nn: diff --git a/config/locales/doorkeeper.pt.yml b/config/locales/doorkeeper.pt-PT.yml similarity index 99% rename from config/locales/doorkeeper.pt.yml rename to config/locales/doorkeeper.pt-PT.yml index f21e84d17..42068e0a0 100644 --- a/config/locales/doorkeeper.pt.yml +++ b/config/locales/doorkeeper.pt-PT.yml @@ -1,5 +1,5 @@ --- -pt: +pt-PT: activerecord: attributes: doorkeeper/application: diff --git a/config/locales/el.yml b/config/locales/el.yml index 43fec340a..acc97d37e 100644 --- a/config/locales/el.yml +++ b/config/locales/el.yml @@ -626,7 +626,6 @@ el: x_months: "%{count}μ" x_seconds: "%{count}δ" deletes: - bad_password_msg: Καλή προσπάθεια χάκερς! Λάθος συνθηματικό confirm_password: Γράψε το τρέχον συνθηματικό σου για να πιστοποιήσεις την ταυτότητά σου proceed: Διαγραφή λογαριασμού success_msg: Ο λογαριασμός σου διαγράφηκε με επιτυχία diff --git a/config/locales/eo.yml b/config/locales/eo.yml index 5785f9b20..b5b8656a4 100644 --- a/config/locales/eo.yml +++ b/config/locales/eo.yml @@ -597,7 +597,6 @@ eo: x_months: "%{count}mo" x_seconds: "%{count}s" deletes: - bad_password_msg: Malĝusta pasvorto confirm_password: Enmetu vian nunan pasvorton por konfirmi vian identecon proceed: Forigi konton success_msg: Via konto estis sukcese forigita diff --git a/config/locales/es.yml b/config/locales/es.yml index 184f0da0e..892d82e9c 100644 --- a/config/locales/es.yml +++ b/config/locales/es.yml @@ -56,6 +56,7 @@ es: media: Multimedia moved_html: "%{name} se ha trasladado a %{new_profile_link}:" network_hidden: Esta información no está disponible + never_active: Nunca nothing_here: "¡No hay nada aquí!" people_followed_by: Usuarios a quien %{name} sigue people_who_follow: Usuarios que siguen a %{name} @@ -222,6 +223,7 @@ es: deleted_status: "(estado borrado)" title: Log de auditoría custom_emojis: + assign_category: Asignar categoría by_domain: Dominio copied_msg: Copia local del emoji creada con éxito copy: Copiar @@ -242,6 +244,7 @@ es: shortcode: Código de atajo shortcode_hint: Al menos 2 caracteres, solo caracteres alfanuméricos y guiones bajos title: Emojis personalizados + uncategorized: Sin clasificar unlisted: Sin listar update_failed_msg: No se pudo actualizar ese emoji updated_msg: "¡Emoji actualizado con éxito!" @@ -489,6 +492,7 @@ es: delete: Eliminar nsfw_off: Marcar contenido como no sensible nsfw_on: Marcar contenido como sensible + deleted: Eliminado failed_to_execute: Falló al ejecutar media: title: Multimedia @@ -609,7 +613,6 @@ es: x_months: "%{count}m" x_seconds: "%{count}s" deletes: - bad_password_msg: "¡Buen intento, hackers! Contraseña incorrecta" confirm_password: Ingresa tu contraseña actual para demostrar tu identidad proceed: Eliminar cuenta success_msg: Tu cuenta se eliminó con éxito @@ -617,6 +620,8 @@ es: directory: Directorio de perfiles explanation: Descubre usuarios según sus intereses explore_mastodon: Explorar %{title} + domain_blocks: + domain: Dominio domain_validator: invalid_domain: no es un nombre de dominio válido errors: @@ -676,6 +681,7 @@ es: developers: Desarrolladores more: Mas… resources: Recursos + trending_now: Tendencia ahora generic: all: Todos changes_saved_msg: "¡Cambios guardados con éxito!" diff --git a/config/locales/et.yml b/config/locales/et.yml index d02eb24ba..7d0771983 100644 --- a/config/locales/et.yml +++ b/config/locales/et.yml @@ -585,7 +585,6 @@ et: x_months: "%{count}k" x_seconds: "%{count}s" deletes: - bad_password_msg: Hea proov, häkkerid! Vale salasõna confirm_password: Sisesta oma praegune salasõna, et kinnitada oma identiteet proceed: Kustuta konto success_msg: Konto kustutamine õnnestus diff --git a/config/locales/eu.yml b/config/locales/eu.yml index 56271f3c3..2a4d61296 100644 --- a/config/locales/eu.yml +++ b/config/locales/eu.yml @@ -611,7 +611,6 @@ eu: x_months: "%{count} hilabete" x_seconds: "%{count}s" deletes: - bad_password_msg: Saiakera ona hacker! Pasahitz okerra confirm_password: Sartu zure oraingo pasahitza zure identitatea baieztatzeko proceed: Ezabatu kontua success_msg: Zure kontua ongi ezabatu da diff --git a/config/locales/fa.yml b/config/locales/fa.yml index 0b4d046f3..7f316c784 100644 --- a/config/locales/fa.yml +++ b/config/locales/fa.yml @@ -620,7 +620,6 @@ fa: x_months: "%{count} ماه" x_seconds: "%{count} ثانیه" deletes: - bad_password_msg: هکر گرامی، رمزی که وارد کردید اشتباه است ؛) confirm_password: رمز فعلی خود را وارد کنید تا معلوم شود که خود شمایید proceed: پاک‌کردن حساب success_msg: حساب شما با موفقیت پاک شد diff --git a/config/locales/fi.yml b/config/locales/fi.yml index 5a3a8ad60..3d8fdce3a 100644 --- a/config/locales/fi.yml +++ b/config/locales/fi.yml @@ -393,7 +393,6 @@ fi: x_months: "%{count} kk" x_seconds: "%{count} s" deletes: - bad_password_msg: Hyvä yritys, hakkerit! Väärä salasana confirm_password: Tunnistaudu syöttämällä nykyinen salasanasi proceed: Poista tili success_msg: Tilin poisto onnistui diff --git a/config/locales/fr.yml b/config/locales/fr.yml index 58b160751..15d6359b4 100644 --- a/config/locales/fr.yml +++ b/config/locales/fr.yml @@ -626,7 +626,6 @@ fr: x_months: "%{count} mois" x_seconds: "%{count} s" deletes: - bad_password_msg: Bien essayé ! Mot de passe incorrect confirm_password: Entrez votre mot de passe pour vérifier votre identité proceed: Supprimer compte success_msg: Votre compte a été supprimé avec succès @@ -1079,7 +1078,7 @@ fr:

Dans le cas où nous déciderions de changer notre politique de confidentialité, nous posterons les modifications sur cette page.

-

Ce document est publié sous lincence CC-BY-SA. Il a été mis à jours pour la dernière fois le 7 mars 2018.

+

Ce document est publié sous licence CC-BY-SA. Il a été mis à jour pour la dernière fois le 7 mars 2018.

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

title: "%{instance} Conditions d’utilisation et politique de confidentialité" diff --git a/config/locales/gl.yml b/config/locales/gl.yml index 0c515a2ec..20f535ad5 100644 --- a/config/locales/gl.yml +++ b/config/locales/gl.yml @@ -629,7 +629,6 @@ gl: x_months: "%{count}mes" x_seconds: "%{count}s" deletes: - bad_password_msg: Bo intento, hackers! Contrasinal incorrecto confirm_password: Introduza o seu contrasinal para verificar a súa identidade proceed: Eliminar conta success_msg: A súa conta eliminouse correctamente diff --git a/config/locales/hu.yml b/config/locales/hu.yml index 7aa75434c..5d9097d09 100644 --- a/config/locales/hu.yml +++ b/config/locales/hu.yml @@ -611,7 +611,6 @@ hu: x_months: "%{count}h" x_seconds: "%{count}mp" deletes: - bad_password_msg: Haha, hekker! Helytelen jelszó confirm_password: Személyazonosságod megerősítéséhez írd be a jelenlegi jelszavad proceed: Felhasználói fiók törlése success_msg: Felhasználói fiókod sikeresen töröltük diff --git a/config/locales/it.yml b/config/locales/it.yml index f62d309df..7b3eede09 100644 --- a/config/locales/it.yml +++ b/config/locales/it.yml @@ -617,7 +617,6 @@ it: x_months: "%{count} mesi" x_seconds: "%{count} secondi" deletes: - bad_password_msg: Ci avete provato, hacker! Password errata confirm_password: Inserisci la tua password attuale per verificare la tua identità proceed: Cancella l'account success_msg: Il tuo account è stato cancellato diff --git a/config/locales/ja.yml b/config/locales/ja.yml index d4c6058bf..cfaee9a38 100644 --- a/config/locales/ja.yml +++ b/config/locales/ja.yml @@ -616,7 +616,6 @@ ja: x_months: "%{count}月" x_seconds: "%{count}秒" deletes: - bad_password_msg: パスワードが違います confirm_password: 本人確認のため、現在のパスワードを入力してください proceed: アカウントを削除する success_msg: アカウントは正常に削除されました diff --git a/config/locales/ka.yml b/config/locales/ka.yml index b9b9b664f..93cc8ec5a 100644 --- a/config/locales/ka.yml +++ b/config/locales/ka.yml @@ -434,7 +434,6 @@ ka: x_months: "%{count}თვე" x_seconds: "%{count}წმ" deletes: - bad_password_msg: კარგად სცადეთ, ჰაკერებო! არასწორი პაროლი confirm_password: იდენტობის დასამოწმებლად შეიყვანეთ მიმდინარე პაროლი proceed: ანგარიშის გაუქმება success_msg: თქვენი ანგარიში წარმატებით გაუქმდა diff --git a/config/locales/kk.yml b/config/locales/kk.yml index 736816425..3658b2293 100644 --- a/config/locales/kk.yml +++ b/config/locales/kk.yml @@ -510,7 +510,6 @@ kk: x_months: "%{count}ай" x_seconds: "%{count}сек" deletes: - bad_password_msg: Болмады ма, хакер бала? Құпиясөз қате confirm_password: Қазіргі құпиясөзіңізді жазыңыз proceed: Аккаунт өшіру success_msg: Аккаунтыңыз сәтті өшірілді diff --git a/config/locales/ko.yml b/config/locales/ko.yml index 1c4170d8a..fc9fa7b80 100644 --- a/config/locales/ko.yml +++ b/config/locales/ko.yml @@ -618,7 +618,6 @@ ko: x_months: "%{count}월" x_seconds: "%{count}초" deletes: - bad_password_msg: 비밀번호가 올바르지 않습니다 confirm_password: 본인 확인을 위해 현재 사용 중인 암호를 입력해 주십시오 proceed: 계정 삭제 success_msg: 계정이 성공적으로 삭제되었습니다 diff --git a/config/locales/lt.yml b/config/locales/lt.yml index a5dd5cbf5..7aed705cb 100644 --- a/config/locales/lt.yml +++ b/config/locales/lt.yml @@ -490,7 +490,6 @@ lt: x_months: "%{count}mėn" x_seconds: "%{count}sek" deletes: - bad_password_msg: Geras bandymas, programišiau! Neteisingas slaptažodis confirm_password: Kad patvirtintumėte savo tapatybę, įveskite dabartini slaptažodį proceed: Ištrinti paskyrą success_msg: Jūsų paskyra sėkmingai ištrinta diff --git a/config/locales/nl.yml b/config/locales/nl.yml index 25e6c6591..9298e0ae0 100644 --- a/config/locales/nl.yml +++ b/config/locales/nl.yml @@ -600,7 +600,6 @@ nl: x_months: "%{count}ma" x_seconds: "%{count}s" deletes: - bad_password_msg: Goed geprobeerd hackers! Ongeldig wachtwoord confirm_password: Voer jouw huidige wachtwoord in om jouw identiteit te bevestigen proceed: Account verwijderen success_msg: Jouw account is succesvol verwijderd diff --git a/config/locales/nn.yml b/config/locales/nn.yml new file mode 100644 index 000000000..a1b61d6e7 --- /dev/null +++ b/config/locales/nn.yml @@ -0,0 +1,20 @@ +--- +nn: + errors: + '400': The request you submitted was invalid or malformed. + '403': You don't have permission to view this page. + '404': The page you are looking for isn't here. + '406': This page is not available in the requested format. + '410': The page you were looking for doesn't exist here anymore. + '422': + '429': Throttled + '500': + '503': The page could not be served due to a temporary server failure. + invites: + expires_in: + '1800': 30 minutes + '21600': 6 hours + '3600': 1 hour + '43200': 12 hours + '604800': 1 week + '86400': 1 day diff --git a/config/locales/no.yml b/config/locales/no.yml index 4cf080be9..1d675aef6 100644 --- a/config/locales/no.yml +++ b/config/locales/no.yml @@ -326,7 +326,6 @@ x_months: "%{count} mnd" x_seconds: "%{count} sek" deletes: - bad_password_msg: Godt forsøk, hacker! Feil passord confirm_password: Skriv inn ditt passord for å verifisere din identitet proceed: Slett konto success_msg: Din konto ble slettet diff --git a/config/locales/oc.yml b/config/locales/oc.yml index 65e381b3a..2884380b8 100644 --- a/config/locales/oc.yml +++ b/config/locales/oc.yml @@ -580,7 +580,6 @@ oc: x_months: "%{count} meses" x_seconds: "%{count}s" deletes: - bad_password_msg: Ben ensajat pirata ! Senhal incorrècte confirm_password: Picatz vòstre senhal actual per verificar vòstra identitat proceed: Suprimir lo compte success_msg: Compte ben suprimit diff --git a/config/locales/pl.yml b/config/locales/pl.yml index 0671979fe..23d0c8a98 100644 --- a/config/locales/pl.yml +++ b/config/locales/pl.yml @@ -569,7 +569,6 @@ pl: x_months: "%{count} miesięcy" x_seconds: "%{count}s" deletes: - bad_password_msg: Niezła próba, hakerze! Wprowadzono nieprawidłowe hasło confirm_password: Wprowadź aktualne hasło, aby potwierdzić tożsamość proceed: Usuń konto success_msg: Twoje konto zostało pomyślnie usunięte diff --git a/config/locales/pt-BR.yml b/config/locales/pt-BR.yml index af4d117e0..9896f888a 100644 --- a/config/locales/pt-BR.yml +++ b/config/locales/pt-BR.yml @@ -526,7 +526,6 @@ pt-BR: x_months: "%{count} meses" x_seconds: "%{count} segundos" deletes: - bad_password_msg: Boa tentativa, hackers! Senha incorreta confirm_password: Insira a sua senha atual para verificar a sua identidade proceed: Excluir conta success_msg: A sua conta foi excluída com sucesso diff --git a/config/locales/pt.yml b/config/locales/pt-PT.yml similarity index 99% rename from config/locales/pt.yml rename to config/locales/pt-PT.yml index eeb158f6c..25ee57085 100644 --- a/config/locales/pt.yml +++ b/config/locales/pt-PT.yml @@ -1,5 +1,5 @@ --- -pt: +pt-PT: about: about_hashtag_html: Estes são toots públicos marcados com #%{hashtag}. Podes interagir com eles se tiveres uma conta Mastodon. about_mastodon_html: Mastodon é uma rede social baseada em protocolos abertos da web e software livre e gratuito. É descentralizado como e-mail. @@ -499,7 +499,6 @@ pt: x_months: "%{count} meses" x_seconds: "%{count} segundos" deletes: - bad_password_msg: Boa tentativa, hackers! Palavra-passe incorreta confirm_password: Introduz a palavra-passe atual para verificar a tua identidade proceed: Eliminar conta success_msg: A tua conta foi eliminada com sucesso diff --git a/config/locales/ro.yml b/config/locales/ro.yml index d04d0015f..7deab6021 100644 --- a/config/locales/ro.yml +++ b/config/locales/ro.yml @@ -43,7 +43,6 @@ ro: x_days: "%{count}z" x_months: "%{count}l" deletes: - bad_password_msg: Bună încercare, hackere! Parolă incorectă confirm_password: Introdu parola curentă pentru a-ți verifica identitatea proceed: Șterge contul success_msg: Contul tău a fost șterg. Nu mai poate fi recuperat :D diff --git a/config/locales/ru.yml b/config/locales/ru.yml index d1ed8d1de..0c1202118 100644 --- a/config/locales/ru.yml +++ b/config/locales/ru.yml @@ -273,7 +273,7 @@ ru: space: Использовано места title: Панель управления total_users: всего пользователей - trends: Тренды + trends: Актуальное week_interactions: взаимодействий на этой неделе week_users_active: активно на этой неделе week_users_new: пользователей на этой неделе @@ -517,6 +517,8 @@ ru: subject: Новая жалоба, узел %{instance} (#%{id}) appearance: advanced_web_interface: Многоколоночный интерфейс + confirmation_dialogs: Окна подтверждений + discovery: Обзор sensitive_content: Чувствительное содержимое application_mailer: notification_preferences: Изменить настройки e-mail @@ -583,7 +585,6 @@ ru: x_months: "%{count}мес" x_seconds: "%{count}сек" deletes: - bad_password_msg: Не вышло, хакеры! Неверный пароль confirm_password: Введите текущий пароль для подтверждения Вашей личности proceed: Удалить аккаунт success_msg: Ваш аккаунт был успешно удален diff --git a/config/locales/simple_form.br.yml b/config/locales/simple_form.br.yml new file mode 100644 index 000000000..c7677c850 --- /dev/null +++ b/config/locales/simple_form.br.yml @@ -0,0 +1 @@ +br: diff --git a/config/locales/simple_form.es.yml b/config/locales/simple_form.es.yml index 35cebcad8..898d200d2 100644 --- a/config/locales/simple_form.es.yml +++ b/config/locales/simple_form.es.yml @@ -5,6 +5,7 @@ es: account_warning_preset: text: Puede usar sintaxis de toots, como URLs, hashtags y menciones admin_account_action: + include_statuses: El usuario verá qué toots han causado la acción de moderación o advertencia send_email_notification: El usuario recibirá una explicación de lo que sucedió con respecto a su cuenta text_html: Opcional. Puede usar sintaxis de toots. Puede añadir configuraciones predefinidas de advertencia para ahorrar tiempo type_html: Elige qué hacer con %{acct} @@ -15,6 +16,7 @@ es: bot: Esta cuenta ejecuta principalmente acciones automatizadas y podría no ser monitorizada context: Uno o múltiples contextos en los que debe aplicarse el filtro digest: Solo enviado tras un largo periodo de inactividad y solo si has recibido mensajes personales durante tu ausencia + discoverable: El directorio del perfil es otra forma en la que su cuenta puede llegar a un público más amplio email: Se le enviará un correo de confirmación fields: Puedes tener hasta 4 elementos mostrándose como una tabla en tu perfil header: PNG, GIF o JPG. Máximo %{size}. Será escalado a %{dimensions}px @@ -47,6 +49,8 @@ es: text: Esto nos ayudará a revisar su aplicación sessions: otp: 'Introduce el código de autenticación de dos factores geberado por tu aplicación de teléfono o usa uno de tus códigos de recuperación:' + tag: + name: Sólo se puede cambiar el cajón de las letras, por ejemplo, para que sea más legible user: chosen_languages: Cuando se marca, solo se mostrarán los toots en los idiomas seleccionados en los timelines públicos labels: @@ -57,6 +61,7 @@ es: account_warning_preset: text: Texto predefinido admin_account_action: + include_statuses: Incluir en el correo electrónico a los toots denunciados send_email_notification: Notificar al usuario por correo electrónico text: Aviso personalizado type: Acción @@ -111,6 +116,7 @@ es: setting_show_application: Mostrar aplicación usada para publicar toots setting_system_font_ui: Utilizar la tipografía por defecto del sistema setting_theme: Tema del sitio + setting_trends: Mostrar las tendencias de hoy setting_unfollow_modal: Mostrar diálogo de confirmación antes de dejar de seguir a alguien setting_use_blurhash: Mostrar gradientes coloridos para contenido multimedia oculto setting_use_pending_items: Modo lento @@ -136,6 +142,12 @@ es: pending_account: Enviar correo electrónico cuando una nueva cuenta necesita revisión reblog: Enviar correo electrónico cuando alguien comparta su publicación report: Enviar un correo cuando se envía un nuevo informe + trending_tag: Enviar correo electrónico cuando una etiqueta no revisada está de tendencia + tag: + listable: Permitir que esta etiqueta aparezca en las búsquedas y en el directorio del perfil + name: Etiqueta + trendable: Permitir que esta etiqueta aparezca bajo tendencias + usable: Permitir a los toots usar esta etiqueta 'no': 'No' recommended: Recomendado required: diff --git a/config/locales/simple_form.nn.yml b/config/locales/simple_form.nn.yml new file mode 100644 index 000000000..777f4e600 --- /dev/null +++ b/config/locales/simple_form.nn.yml @@ -0,0 +1 @@ +nn: diff --git a/config/locales/simple_form.pt.yml b/config/locales/simple_form.pt-PT.yml similarity index 99% rename from config/locales/simple_form.pt.yml rename to config/locales/simple_form.pt-PT.yml index 9f9d0fdc2..0ac31f8c2 100644 --- a/config/locales/simple_form.pt.yml +++ b/config/locales/simple_form.pt-PT.yml @@ -1,5 +1,5 @@ --- -pt: +pt-PT: simple_form: hints: account_warning_preset: diff --git a/config/locales/simple_form.ru.yml b/config/locales/simple_form.ru.yml index c4560100a..ab5eb855e 100644 --- a/config/locales/simple_form.ru.yml +++ b/config/locales/simple_form.ru.yml @@ -97,11 +97,11 @@ ru: setting_advanced_layout: Включить многоколоночный интерфейс setting_aggregate_reblogs: Группировать продвижения в лентах setting_auto_play_gif: Автоматически проигрывать анимированные GIF - setting_boost_modal: Показывать диалог подтверждения перед продвижением + setting_boost_modal: Всегда спрашивать перед продвижением setting_default_language: Язык отправляемых статусов setting_default_privacy: Видимость постов setting_default_sensitive: Всегда отмечать медиаконтент как чувствительный - setting_delete_modal: Показывать диалог подтверждения перед удалением + setting_delete_modal: Всегда спрашивать перед удалении поста setting_display_media: Отображение медиафайлов setting_display_media_default: По умолчанию setting_display_media_hide_all: Скрывать все @@ -114,7 +114,7 @@ ru: setting_system_font_ui: Использовать шрифт системы по умолчанию setting_theme: Тема сайта setting_trends: Показывать сегодняшние тренды - setting_unfollow_modal: Показывать диалог подтверждения перед тем, как отписаться от аккаунта + setting_unfollow_modal: Всегда спрашивать перед отпиской от аккаунта setting_use_blurhash: Показать цветные градиенты для скрытых медиа setting_use_pending_items: Медленный режим severity: Строгость diff --git a/config/locales/sk.yml b/config/locales/sk.yml index 980e4613e..e6a30f0c3 100644 --- a/config/locales/sk.yml +++ b/config/locales/sk.yml @@ -20,7 +20,7 @@ sk: extended_description_html: |

Pravidlá

Žiadne zatiaľ uvedené nie sú

- federation_hint_html: S účtom na %{instance} budeš môcť následovať ľúdí na hociakom Mastodon serveri, ale aj inde. + federation_hint_html: S účtom na %{instance} budeš môcť následovať ľúdí na hociakom Mastodon serveri, ale aj na iných serveroch. generic_description: "%{domain} je jeden server v sieti" get_apps: Vyskúšaj aplikácie hosted_on: Mastodon hostovaný na %{domain} @@ -28,7 +28,7 @@ sk: Tento účet je virtuálnym aktérom, ktorý predstavuje samotný server a nie žiadného jedného užívateľa. Je využívaný pre potreby federovania a nemal by byť blokovaný, pokiaľ nechceš zablokovať celý server, čo ide lepšie dosiahnúť cez blokovanie domény. learn_more: Zisti viac - privacy_policy: Ustanovenia o súkromí + privacy_policy: Zásady súkromia see_whats_happening: Pozoruj, čo sa deje server_stats: 'Serverové štatistiky:' source_code: Zdrojový kód @@ -233,10 +233,12 @@ sk: deleted_status: "(zmazaný príspevok)" title: Kontrólny záznam custom_emojis: + assign_category: Priraď kategóriu by_domain: Doména copied_msg: Miestna kópia emoji bola úspešne vytvorená copy: Kopíruj copy_failed_msg: Nebolo možné vytvoriť miestnu kópiu tohto emoji + create_new_category: Vytvor novú kategóriu created_msg: Emoji úspešne vytvorené! delete: Zmaž destroyed_msg: Emoji úspešne zničené! @@ -253,6 +255,7 @@ sk: shortcode: Skratka shortcode_hint: Aspoň 2 znaky, povolené sú alfanumerické, alebo podčiarkovník title: Vlastné emoji + uncategorized: Nezaradené unlisted: Nie je na zozname update_failed_msg: Nebolo možné aktualizovať toto emoji updated_msg: Emoji bolo úspešne aktualizované! @@ -580,6 +583,7 @@ sk: description: prefix_invited_by_user: "@%{name} ťa pozýva na tento Mastodon server!" prefix_sign_up: Zaregistruj sa na Mastodone už dnes! + suffix: S pomocou účtu budeš môcť následovať ľudí, posielať príspevky, a vymienať si správy s užívateľmi na hociakom Mastodon serveri, ale aj na iných serveroch! didnt_get_confirmation: Neobdržal/a si kroky na potvrdenie? forgot_password: Zabudnuté heslo? invalid_reset_password_token: Token na obnovu hesla vypršal. Prosím vypítaj si nový. @@ -630,13 +634,15 @@ sk: x_months: "%{count}mesiace" x_seconds: "%{count}sek" deletes: - bad_password_msg: Dobrý pokus, hakeri! Nesprávne heslo confirm_password: Napíšte svoje terajšie heslo pre overenie vašej identity proceed: Vymaž účet success_msg: Tvoj účet bol úspešne vymazaný warning: before: 'Predtým, než budeš pokračovať, prosím pozorne si prečítaj tieto poznámky:' caches: Obsah, ktorý bol predčítaný inými servermi môže zanechať pozostatky + data_removal: Tvoje príspevky a iné dáta budú natrvalo odstránené + more_details_html: Pre viac podrobností, pozri zásady súkromia. + username_available: Tvoje užívateľské meno bude znova dostupné username_unavailable: Tvoja prezývka ostane neprístupná directories: directory: Katalóg profilov @@ -660,10 +666,10 @@ sk: domain_validator: invalid_domain: nieje správny tvar domény errors: - '400': The request you submitted was invalid or malformed. + '400': Požiadavka, ktorú si odoslal/a, bola buď nesprávna, alebo znehodnotená. '403': Nemáš povolenie pre zobrazenie tejto stránky. '404': Stránka ktorú hľadáš nieje tu. - '406': This page is not available in the requested format. + '406': Táto stránka nie je dostupná v požadovanom formáte. '410': Stránka ktorú si tu hľadal/a sa tu už viac nenachádza. '422': content: Bezpečtnostné overenie zlyhalo. Blokuješ cookies? @@ -672,7 +678,7 @@ sk: '500': content: Ospravedlňujem sa. Niečo sa pokazilo na našom konci. title: Táto stránka nieje v poriadku - '503': The page could not be served due to a temporary server failure. + '503': Táto stránka nemôže byť načítaná, kvôli dočasnému výpadku servera. noscript_html: Aby bolo možné používať Mastodon web aplikáciu, povoľ prosím JavaScript. Alebo skús jednu z aplikácii dostupných pre vašu platformu. existing_username_validator: not_found: nepodarilo sa nájsť miestného užívateľa s takouto prezývkou @@ -721,6 +727,7 @@ sk: all: Všetko changes_saved_msg: Zmeny boli úspešne uložené! copy: Kopíruj + no_batch_actions_available: Na tejto stránke niesú k dispozícii žiadne hromadné akcie order_by: Zoraď podľa save_changes: Ulož zmeny validation_errors: diff --git a/config/locales/sl.yml b/config/locales/sl.yml index 02507923b..47b835646 100644 --- a/config/locales/sl.yml +++ b/config/locales/sl.yml @@ -591,7 +591,6 @@ sl: x_months: "%{count}mo" x_seconds: "%{count}s" deletes: - bad_password_msg: Lep poskus, hekerji! napačno geslo confirm_password: Vnesite svoje trenutno geslo, da potrdite svojo identiteto proceed: Izbriši račun success_msg: Vaš račun je bil uspešno izbrisan diff --git a/config/locales/sq.yml b/config/locales/sq.yml index 68754ea24..4e5f37294 100644 --- a/config/locales/sq.yml +++ b/config/locales/sq.yml @@ -490,7 +490,6 @@ sq: over_x_years: "%{count}v" x_months: "%{count}mj" deletes: - bad_password_msg: Provë e bukur, trimosha! Fjalëkalim i pasaktë confirm_password: Jepni fjalëkalimin tuaj të tanishëm që të verifikohet identiteti juaj proceed: Fshini llogarinë success_msg: Llogaria juaj u fshi me sukses diff --git a/config/locales/sr-Latn.yml b/config/locales/sr-Latn.yml index c4a319964..5c06242cc 100644 --- a/config/locales/sr-Latn.yml +++ b/config/locales/sr-Latn.yml @@ -314,7 +314,6 @@ sr-Latn: over_x_years: "%{count}god" x_months: "%{count}mesec" deletes: - bad_password_msg: Dobar pokušaj, hakeri! Neispravna lozinka confirm_password: Unesite trenutnu lozinku da bismo proverili Vaš identitet proceed: Obriši nalog success_msg: Vaš nalog je uspešno obrisan diff --git a/config/locales/sr.yml b/config/locales/sr.yml index 992311201..772c04d64 100644 --- a/config/locales/sr.yml +++ b/config/locales/sr.yml @@ -510,7 +510,6 @@ sr: x_days: "%{count}д" x_months: "%{count}месец" deletes: - bad_password_msg: Добар покушај, хакери! Неисправна лозинка confirm_password: Унесите тренутну лозинку да бисмо проверили Ваш идентитет proceed: Обриши налог success_msg: Ваш налог је успешно обрисан diff --git a/config/locales/sv.yml b/config/locales/sv.yml index 029704671..a71ea9e18 100644 --- a/config/locales/sv.yml +++ b/config/locales/sv.yml @@ -377,7 +377,6 @@ sv: x_months: "%{count}mån" x_seconds: "%{count}sek" deletes: - bad_password_msg: Bra försök, hackare! Fel lösenord confirm_password: Ange ditt lösenord för att verifiera din identitet proceed: Ta bort konto success_msg: Ditt konto har tagits bort diff --git a/config/locales/th.yml b/config/locales/th.yml index f27c06617..97ef41460 100644 --- a/config/locales/th.yml +++ b/config/locales/th.yml @@ -48,6 +48,7 @@ th: media: สื่อ moved_html: "%{name} ได้ย้ายไปยัง %{new_profile_link}:" network_hidden: ไม่มีข้อมูลนี้ + never_active: ไม่เลย nothing_here: ไม่มีสิ่งใดที่นี่! people_followed_by: ผู้คนที่ %{name} ติดตาม people_who_follow: ผู้คนที่ติดตาม %{name} diff --git a/config/locales/uk.yml b/config/locales/uk.yml index 564b21db1..5edbbd194 100644 --- a/config/locales/uk.yml +++ b/config/locales/uk.yml @@ -633,7 +633,6 @@ uk: x_months: "%{count}міс" x_seconds: "%{count}сек" deletes: - bad_password_msg: Гарна спроба, гакери! Неправильний пароль confirm_password: Введіть актуальний пароль, щоб перевірити що ви це ви proceed: Видалити обліковий запис success_msg: Ваш обліковий запис було успішно видалено diff --git a/config/locales/zh-CN.yml b/config/locales/zh-CN.yml index d2549bcb4..9c6fd27e8 100644 --- a/config/locales/zh-CN.yml +++ b/config/locales/zh-CN.yml @@ -586,7 +586,6 @@ zh-CN: x_months: "%{count}个月" x_seconds: "%{count}秒" deletes: - bad_password_msg: 想得美,黑客!密码输入错误 confirm_password: 输入你当前的密码来验证身份 proceed: 删除帐户 success_msg: 你的帐户已经成功删除 diff --git a/config/locales/zh-HK.yml b/config/locales/zh-HK.yml index 75202fa68..2c59b3f07 100644 --- a/config/locales/zh-HK.yml +++ b/config/locales/zh-HK.yml @@ -391,7 +391,6 @@ zh-HK: x_months: "%{count}個月" x_seconds: "%{count}秒" deletes: - bad_password_msg: 想得美,黑客!密碼輸入錯誤 confirm_password: 輸入你現在的密碼來驗證身份 proceed: 刪除帳戶 success_msg: 你的帳戶已經成功刪除 diff --git a/config/locales/zh-TW.yml b/config/locales/zh-TW.yml index 95f7d7f9a..8bdbf87aa 100644 --- a/config/locales/zh-TW.yml +++ b/config/locales/zh-TW.yml @@ -465,7 +465,6 @@ zh-TW: x_months: "%{count}個月" x_seconds: "%{count}秒" deletes: - bad_password_msg: 想得美,駭客! 密碼輸入錯誤 confirm_password: 輸入你現在的密碼來驗證身份 proceed: 刪除帳戶 success_msg: 你的帳戶已經成功刪除 From 5eff29b28c226e443ea5484ed50c8020a43fbc6b Mon Sep 17 00:00:00 2001 From: Eugen Rochko Date: Mon, 16 Sep 2019 15:44:52 +0200 Subject: [PATCH 092/134] Fix pre-review confirmation e-mail saying you can't login (#11860) Fix #11419 --- config/locales/devise.en.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/config/locales/devise.en.yml b/config/locales/devise.en.yml index 2930733c0..5defa6624 100644 --- a/config/locales/devise.en.yml +++ b/config/locales/devise.en.yml @@ -21,7 +21,7 @@ en: action: Verify email address action_with_app: Confirm and return to %{app} explanation: You have created an account on %{host} with this email address. You are one click away from activating it. If this wasn't you, please ignore this email. - explanation_when_pending: You applied for an invite to %{host} with this email address. Once you confirm your e-mail address, we will review your application. You can't login until then. If your application is rejected, your data will be removed, so no further action will be required from you. If this wasn't you, please ignore this email. + explanation_when_pending: You applied for an invite to %{host} with this email address. Once you confirm your e-mail address, we will review your application. You can login to change your details or delete your account, but you cannot access most of the functions until your account is approved. If your application is rejected, your data will be removed, so no further action will be required from you. If this wasn't you, please ignore this email. extra_html: Please also check out the rules of the server and our terms of service. subject: 'Mastodon: Confirmation instructions for %{instance}' title: Verify email address From f1098675782944fe1dabec71cd58d3d091da06a0 Mon Sep 17 00:00:00 2001 From: ThibG Date: Mon, 16 Sep 2019 15:45:06 +0200 Subject: [PATCH 093/134] =?UTF-8?q?Fix=20=E2=80=9Cslow=20mode=E2=80=9D=20i?= =?UTF-8?q?ssues=20(#11859)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Fix weird scroll-jumping behavior with pending items * Treat pending items as unread items * Fix scroll position being altered because of the “X new items” button --- app/javascript/mastodon/components/scrollable_list.js | 10 +++++++++- .../mastodon/features/community_timeline/index.js | 2 +- .../mastodon/features/notifications/index.js | 2 +- app/javascript/mastodon/reducers/notifications.js | 4 ++-- app/javascript/mastodon/reducers/timelines.js | 4 ++-- 5 files changed, 15 insertions(+), 7 deletions(-) diff --git a/app/javascript/mastodon/components/scrollable_list.js b/app/javascript/mastodon/components/scrollable_list.js index 0bf817923..253646ed0 100644 --- a/app/javascript/mastodon/components/scrollable_list.js +++ b/app/javascript/mastodon/components/scrollable_list.js @@ -172,8 +172,9 @@ export default class ScrollableList extends PureComponent { const someItemInserted = React.Children.count(prevProps.children) > 0 && React.Children.count(prevProps.children) < React.Children.count(this.props.children) && this.getFirstChildKey(prevProps) !== this.getFirstChildKey(this.props); + const pendingChanged = (prevProps.numPending > 0) !== (this.props.numPending > 0); - if (someItemInserted && (this.getScrollTop() > 0 || this.mouseMovedRecently)) { + if (pendingChanged || someItemInserted && (this.getScrollTop() > 0 || this.mouseMovedRecently)) { return this.getScrollHeight() - this.getScrollTop(); } else { return null; @@ -261,6 +262,13 @@ export default class ScrollableList extends PureComponent { handleLoadPending = e => { e.preventDefault(); this.props.onLoadPending(); + // Prevent the weird scroll-jumping behavior, as we explicitly don't want to + // scroll to top, and we know the scroll height is going to change + this.scrollToTopOnMouseIdle = false; + this.lastScrollWasSynthetic = false; + this.clearMouseIdleTimer(); + this.mouseIdleTimer = setTimeout(this.handleMouseIdle, MOUSE_IDLE_DELAY); + this.mouseMovedRecently = true; } render () { diff --git a/app/javascript/mastodon/features/community_timeline/index.js b/app/javascript/mastodon/features/community_timeline/index.js index f95fa4970..cb93f9c22 100644 --- a/app/javascript/mastodon/features/community_timeline/index.js +++ b/app/javascript/mastodon/features/community_timeline/index.js @@ -20,7 +20,7 @@ const mapStateToProps = (state, { onlyMedia, columnId }) => { const index = columns.findIndex(c => c.get('uuid') === uuid); return { - hasUnread: state.getIn(['timelines', `community${onlyMedia ? ':media' : ''}`, 'unread']) > 0, + hasUnread: state.getIn(['timelines', `community${onlyMedia ? ':media' : ''}`, 'unread']) > 0 || state.getIn(['timelines', `community${onlyMedia ? ':media' : ''}`, 'pendingItems']).size > 0, onlyMedia: (columnId && index >= 0) ? columns.get(index).getIn(['params', 'other', 'onlyMedia']) : state.getIn(['settings', 'community', 'other', 'onlyMedia']), }; }; diff --git a/app/javascript/mastodon/features/notifications/index.js b/app/javascript/mastodon/features/notifications/index.js index f2b239afe..7e5de0613 100644 --- a/app/javascript/mastodon/features/notifications/index.js +++ b/app/javascript/mastodon/features/notifications/index.js @@ -39,7 +39,7 @@ const mapStateToProps = state => ({ showFilterBar: state.getIn(['settings', 'notifications', 'quickFilter', 'show']), notifications: getNotifications(state), isLoading: state.getIn(['notifications', 'isLoading'], true), - isUnread: state.getIn(['notifications', 'unread']) > 0, + isUnread: state.getIn(['notifications', 'unread']) > 0 || state.getIn(['notifications', 'pendingItems']).size > 0, hasMore: state.getIn(['notifications', 'hasMore']), numPending: state.getIn(['notifications', 'pendingItems'], ImmutableList()).size, }); diff --git a/app/javascript/mastodon/reducers/notifications.js b/app/javascript/mastodon/reducers/notifications.js index 049c70cb4..69bd47940 100644 --- a/app/javascript/mastodon/reducers/notifications.js +++ b/app/javascript/mastodon/reducers/notifications.js @@ -36,7 +36,7 @@ const notificationToMap = notification => ImmutableMap({ const normalizeNotification = (state, notification, usePendingItems) => { if (usePendingItems) { - return state.update('pendingItems', list => list.unshift(notificationToMap(notification))); + return state.update('pendingItems', list => list.unshift(notificationToMap(notification))).update('unread', unread => unread + 1); } const top = state.get('top'); @@ -91,7 +91,7 @@ const filterNotifications = (state, accountIds) => { const updateTop = (state, top) => { if (top) { - state = state.set('unread', 0); + state = state.set('unread', state.get('pendingItems').size); } return state.set('top', top); diff --git a/app/javascript/mastodon/reducers/timelines.js b/app/javascript/mastodon/reducers/timelines.js index 0b036f5fe..db45d4d40 100644 --- a/app/javascript/mastodon/reducers/timelines.js +++ b/app/javascript/mastodon/reducers/timelines.js @@ -65,7 +65,7 @@ const updateTimeline = (state, timeline, status, usePendingItems) => { return state; } - return state.update(timeline, initialTimeline, map => map.update('pendingItems', list => list.unshift(status.get('id')))); + return state.update(timeline, initialTimeline, map => map.update('pendingItems', list => list.unshift(status.get('id'))).update('unread', unread => unread + 1)); } const top = state.getIn([timeline, 'top']); @@ -128,7 +128,7 @@ const filterTimeline = (timeline, state, relationship, statuses) => { const updateTop = (state, timeline, top) => { return state.update(timeline, initialTimeline, map => map.withMutations(mMap => { - if (top) mMap.set('unread', 0); + if (top) mMap.set('unread', mMap.get('pendingItems').size); mMap.set('top', top); })); }; From d41494226dbe9f3c3cf3b98a376d47b8c836c948 Mon Sep 17 00:00:00 2001 From: ThibG Date: Mon, 16 Sep 2019 16:12:18 +0200 Subject: [PATCH 094/134] Fix poll options checkboxes/radio buttons not being vertically centered (#11833) --- app/javascript/styles/mastodon/polls.scss | 3 +++ 1 file changed, 3 insertions(+) diff --git a/app/javascript/styles/mastodon/polls.scss b/app/javascript/styles/mastodon/polls.scss index 8b131dffd..e80220f27 100644 --- a/app/javascript/styles/mastodon/polls.scss +++ b/app/javascript/styles/mastodon/polls.scss @@ -79,6 +79,9 @@ top: -1px; border-radius: 50%; vertical-align: middle; + margin-top: auto; + margin-bottom: auto; + flex: 0 0 18px; &.checkbox { border-radius: 4px; From 576377a3822bffecd363583c787f03128c0a8247 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Mon, 16 Sep 2019 16:12:30 +0200 Subject: [PATCH 095/134] Bump capybara from 3.28.0 to 3.29.0 (#11854) Bumps [capybara](https://github.com/teamcapybara/capybara) from 3.28.0 to 3.29.0. - [Release notes](https://github.com/teamcapybara/capybara/releases) - [Changelog](https://github.com/teamcapybara/capybara/blob/master/History.md) - [Commits](https://github.com/teamcapybara/capybara/compare/3.28.0...3.29.0) Signed-off-by: dependabot-preview[bot] --- Gemfile | 2 +- Gemfile.lock | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Gemfile b/Gemfile index 1215fcb16..25cf52f73 100644 --- a/Gemfile +++ b/Gemfile @@ -113,7 +113,7 @@ group :production, :test do end group :test do - gem 'capybara', '~> 3.28' + gem 'capybara', '~> 3.29' gem 'climate_control', '~> 0.2' gem 'faker', '~> 2.3' gem 'microformats', '~> 4.1' diff --git a/Gemfile.lock b/Gemfile.lock index 637630870..47bb5a28b 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -150,7 +150,7 @@ GEM sshkit (~> 1.3) capistrano-yarn (2.0.2) capistrano (~> 3.0) - capybara (3.28.0) + capybara (3.29.0) addressable mini_mime (>= 0.1.3) nokogiri (~> 1.8) @@ -685,7 +685,7 @@ DEPENDENCIES capistrano-rails (~> 1.4) capistrano-rbenv (~> 2.1) capistrano-yarn (~> 2.0) - capybara (~> 3.28) + capybara (~> 3.29) charlock_holmes (~> 0.7.6) chewy (~> 5.0) cld3 (~> 3.2.4) From d256901f60b121172ae3a3a7167f9c64d947cf99 Mon Sep 17 00:00:00 2001 From: ThibG Date: Mon, 16 Sep 2019 19:39:44 +0200 Subject: [PATCH 096/134] Change timelines to add new items to pending items when scrolled down (#11867) --- app/javascript/mastodon/reducers/notifications.js | 8 +++++--- app/javascript/mastodon/reducers/timelines.js | 6 ++++-- 2 files changed, 9 insertions(+), 5 deletions(-) diff --git a/app/javascript/mastodon/reducers/notifications.js b/app/javascript/mastodon/reducers/notifications.js index 69bd47940..811550a8a 100644 --- a/app/javascript/mastodon/reducers/notifications.js +++ b/app/javascript/mastodon/reducers/notifications.js @@ -35,12 +35,12 @@ const notificationToMap = notification => ImmutableMap({ }); const normalizeNotification = (state, notification, usePendingItems) => { - if (usePendingItems) { + const top = state.get('top'); + + if (usePendingItems || !top || !state.get('pendingItems').isEmpty()) { return state.update('pendingItems', list => list.unshift(notificationToMap(notification))).update('unread', unread => unread + 1); } - const top = state.get('top'); - if (!top) { state = state.update('unread', unread => unread + 1); } @@ -63,6 +63,8 @@ const expandNormalizedNotifications = (state, notifications, next, usePendingIte return state.withMutations(mutable => { if (!items.isEmpty()) { + usePendingItems = usePendingItems || !mutable.get('top') || !mutable.get('pendingItems').isEmpty(); + mutable.update(usePendingItems ? 'pendingItems' : 'items', list => { const lastIndex = 1 + list.findLastIndex( item => item !== null && (compareId(item.get('id'), items.last().get('id')) > 0 || item.get('id') === items.last().get('id')) diff --git a/app/javascript/mastodon/reducers/timelines.js b/app/javascript/mastodon/reducers/timelines.js index db45d4d40..19c57ceaf 100644 --- a/app/javascript/mastodon/reducers/timelines.js +++ b/app/javascript/mastodon/reducers/timelines.js @@ -40,6 +40,7 @@ const expandNormalizedTimeline = (state, timeline, statuses, next, isPartial, is if (timeline.endsWith(':pinned')) { mMap.set('items', statuses.map(status => status.get('id'))); } else if (!statuses.isEmpty()) { + usePendingItems = usePendingItems || !mMap.get('top') || !mMap.get('pendingItems').isEmpty(); mMap.update(usePendingItems ? 'pendingItems' : 'items', ImmutableList(), oldIds => { const newIds = statuses.map(status => status.get('id')); @@ -60,7 +61,9 @@ const expandNormalizedTimeline = (state, timeline, statuses, next, isPartial, is }; const updateTimeline = (state, timeline, status, usePendingItems) => { - if (usePendingItems) { + const top = state.getIn([timeline, 'top']); + + if (usePendingItems || !top || !state.getIn([timeline, 'pendingItems']).isEmpty()) { if (state.getIn([timeline, 'pendingItems'], ImmutableList()).includes(status.get('id')) || state.getIn([timeline, 'items'], ImmutableList()).includes(status.get('id'))) { return state; } @@ -68,7 +71,6 @@ const updateTimeline = (state, timeline, status, usePendingItems) => { return state.update(timeline, initialTimeline, map => map.update('pendingItems', list => list.unshift(status.get('id'))).update('unread', unread => unread + 1)); } - const top = state.getIn([timeline, 'top']); const ids = state.getIn([timeline, 'items'], ImmutableList()); const includesId = ids.includes(status.get('id')); const unread = state.getIn([timeline, 'unread'], 0); From bdeff5ae1585a8087ec2d02cd8cb07af319c3d58 Mon Sep 17 00:00:00 2001 From: Eugen Rochko Date: Mon, 16 Sep 2019 20:42:19 +0200 Subject: [PATCH 097/134] Fix web UI allowing uploads past status limit via drag & drop (#11863) Fix #11659 --- app/javascript/mastodon/features/ui/index.js | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/app/javascript/mastodon/features/ui/index.js b/app/javascript/mastodon/features/ui/index.js index 63c5622b6..f5e48ed31 100644 --- a/app/javascript/mastodon/features/ui/index.js +++ b/app/javascript/mastodon/features/ui/index.js @@ -66,6 +66,7 @@ const mapStateToProps = state => ({ isComposing: state.getIn(['compose', 'is_composing']), hasComposingText: state.getIn(['compose', 'text']).trim().length !== 0, hasMediaAttachments: state.getIn(['compose', 'media_attachments']).size > 0, + canUploadMore: !state.getIn(['compose', 'media_attachments']).some(x => ['audio', 'video'].includes(x.get('type'))) && state.getIn(['compose', 'media_attachments']).size < 4, dropdownMenuIsOpen: state.getIn(['dropdown_menu', 'openId']) !== null, }); @@ -232,6 +233,7 @@ class UI extends React.PureComponent { isComposing: PropTypes.bool, hasComposingText: PropTypes.bool, hasMediaAttachments: PropTypes.bool, + canUploadMore: PropTypes.bool, location: PropTypes.object, intl: PropTypes.object.isRequired, dropdownMenuIsOpen: PropTypes.bool, @@ -278,13 +280,14 @@ class UI extends React.PureComponent { this.dragTargets.push(e.target); } - if (e.dataTransfer && Array.from(e.dataTransfer.types).includes('Files')) { + if (e.dataTransfer && Array.from(e.dataTransfer.types).includes('Files') && this.props.canUploadMore) { this.setState({ draggingOver: true }); } } handleDragOver = (e) => { if (this.dataTransferIsText(e.dataTransfer)) return false; + e.preventDefault(); e.stopPropagation(); @@ -299,12 +302,13 @@ class UI extends React.PureComponent { handleDrop = (e) => { if (this.dataTransferIsText(e.dataTransfer)) return; + e.preventDefault(); this.setState({ draggingOver: false }); this.dragTargets = []; - if (e.dataTransfer && e.dataTransfer.files.length >= 1) { + if (e.dataTransfer && e.dataTransfer.files.length >= 1 && this.props.canUploadMore) { this.props.dispatch(uploadCompose(e.dataTransfer.files)); } } From 3d14b8f28f96eb4da352f615ee5b9c06ecdcc269 Mon Sep 17 00:00:00 2001 From: Eugen Rochko Date: Mon, 16 Sep 2019 20:42:29 +0200 Subject: [PATCH 098/134] Fix SSO login not using existing account when e-mail is verified (#11862) Fix #11472 --- app/models/concerns/omniauthable.rb | 30 ++++++++++++++++------------- 1 file changed, 17 insertions(+), 13 deletions(-) diff --git a/app/models/concerns/omniauthable.rb b/app/models/concerns/omniauthable.rb index b9c124841..960784222 100644 --- a/app/models/concerns/omniauthable.rb +++ b/app/models/concerns/omniauthable.rb @@ -4,7 +4,7 @@ module Omniauthable extend ActiveSupport::Concern TEMP_EMAIL_PREFIX = 'change@me' - TEMP_EMAIL_REGEX = /\Achange@me/ + TEMP_EMAIL_REGEX = /\A#{TEMP_EMAIL_PREFIX}/.freeze included do devise :omniauthable @@ -28,8 +28,8 @@ module Omniauthable # 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) if user.nil? + user = signed_in_resource || identity.user + user ||= create_for_oauth(auth) if identity.user.nil? identity.user = user @@ -45,7 +45,18 @@ module Omniauthable # exists, we assign a temporary email and ask the user to verify it on # the next step via Auth::SetupController.show - user = User.new(user_params_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 || assume_verified + email = auth.info.verified_email || auth.info.email + email = nil unless email_is_verified + + user = User.find_by(email: email) if email_is_verified + + return user unless user.nil? + + user = User.new(user_params_from_auth(email, auth)) + user.account.avatar_remote_url = auth.info.image if auth.info.image =~ /\A#{URI.regexp(%w(http https))}\z/ user.skip_confirmation! user.save! @@ -54,14 +65,7 @@ module Omniauthable private - def user_params_from_auth(auth) - strategy = Devise.omniauth_configs[auth.provider.to_sym].strategy - assume_verified = strategy.try(:security).try(:assume_email_is_verified) - email_is_verified = auth.info.verified || auth.info.verified_email || assume_verified - email = auth.info.verified_email || auth.info.email - email = email_is_verified && !User.exists?(email: auth.info.email) && email - display_name = auth.info.full_name || [auth.info.first_name, auth.info.last_name].join(' ') - + def user_params_from_auth(email, auth) { email: email || "#{TEMP_EMAIL_PREFIX}-#{auth.uid}-#{auth.provider}.com", password: Devise.friendly_token[0, 20], @@ -69,7 +73,7 @@ module Omniauthable external: true, account_attributes: { username: ensure_unique_username(auth.uid), - display_name: display_name, + display_name: auth.info.full_name || [auth.info.first_name, auth.info.last_name].join(' '), }, } end From c21386cff5ff6d86d8887e4a5dde1cf910ab84a0 Mon Sep 17 00:00:00 2001 From: abcang Date: Tue, 17 Sep 2019 15:44:25 +0900 Subject: [PATCH 099/134] Improve IP cleanup query (#11871) --- app/workers/scheduler/ip_cleanup_scheduler.rb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/workers/scheduler/ip_cleanup_scheduler.rb b/app/workers/scheduler/ip_cleanup_scheduler.rb index 42620332e..4f44078d8 100644 --- a/app/workers/scheduler/ip_cleanup_scheduler.rb +++ b/app/workers/scheduler/ip_cleanup_scheduler.rb @@ -9,7 +9,7 @@ class Scheduler::IpCleanupScheduler def perform time_ago = RETENTION_PERIOD.ago - SessionActivation.where('updated_at < ?', time_ago).destroy_all - User.where('last_sign_in_at < ?', time_ago).update_all(last_sign_in_ip: nil) + SessionActivation.where('updated_at < ?', time_ago).in_batches.destroy_all + User.where('last_sign_in_at < ?', time_ago).where.not(last_sign_in_ip: nil).in_batches.update_all(last_sign_in_ip: nil) end end From 38dc51b2d68e3e03f429419f7318e868fa24c49d Mon Sep 17 00:00:00 2001 From: Eugen Rochko Date: Tue, 17 Sep 2019 08:44:45 +0200 Subject: [PATCH 100/134] Fix Move handler queuing jobs that will fail if account is suspended (#11864) Don't put Move handler on cooldown if it didn't run. Skip unmerging from timelines to save unnecessary work. --- app/lib/activitypub/activity/move.rb | 11 +++++++++-- app/services/unfollow_service.rb | 11 +++++++++-- app/workers/unfollow_follow_worker.rb | 2 +- 3 files changed, 19 insertions(+), 5 deletions(-) diff --git a/app/lib/activitypub/activity/move.rb b/app/lib/activitypub/activity/move.rb index d7a5f595c..6c6a2b967 100644 --- a/app/lib/activitypub/activity/move.rb +++ b/app/lib/activitypub/activity/move.rb @@ -10,10 +10,13 @@ class ActivityPub::Activity::Move < ActivityPub::Activity target_account = ActivityPub::FetchRemoteAccountService.new.call(target_uri) - return if target_account.nil? || !target_account.also_known_as.include?(origin_account.uri) + if target_account.nil? || target_account.suspended? || !target_account.also_known_as.include?(origin_account.uri) + unmark_as_processing! + return + end # In case for some reason we didn't have a redirect for the profile already, set it - origin_account.update(moved_to_account: target_account) if origin_account.moved_to_account_id.nil? + origin_account.update(moved_to_account: target_account) # Initiate a re-follow for each follower origin_account.followers.local.select(:id).find_in_batches do |follower_accounts| @@ -40,4 +43,8 @@ class ActivityPub::Activity::Move < ActivityPub::Activity def mark_as_processing! redis.setex("move_in_progress:#{@account.id}", PROCESSING_COOLDOWN, true) end + + def unmark_as_processing! + redis.del("move_in_progress:#{@account.id}") + end end diff --git a/app/services/unfollow_service.rb b/app/services/unfollow_service.rb index b7033d7eb..151f3674f 100644 --- a/app/services/unfollow_service.rb +++ b/app/services/unfollow_service.rb @@ -6,9 +6,12 @@ class UnfollowService < BaseService # Unfollow and notify the remote user # @param [Account] source_account Where to unfollow from # @param [Account] target_account Which to unfollow - def call(source_account, target_account) + # @param [Hash] options + # @option [Boolean] :skip_unmerge + def call(source_account, target_account, options = {}) @source_account = source_account @target_account = target_account + @options = options unfollow! || undo_follow_request! end @@ -21,9 +24,11 @@ class UnfollowService < BaseService return unless follow follow.destroy! + create_notification(follow) if !@target_account.local? && @target_account.activitypub? create_reject_notification(follow) if @target_account.local? && !@source_account.local? && @source_account.activitypub? - UnmergeWorker.perform_async(@target_account.id, @source_account.id) + UnmergeWorker.perform_async(@target_account.id, @source_account.id) unless @options[:skip_unmerge] + follow end @@ -33,7 +38,9 @@ class UnfollowService < BaseService return unless follow_request follow_request.destroy! + create_notification(follow_request) unless @target_account.local? + follow_request end diff --git a/app/workers/unfollow_follow_worker.rb b/app/workers/unfollow_follow_worker.rb index 50d3bf034..95549e107 100644 --- a/app/workers/unfollow_follow_worker.rb +++ b/app/workers/unfollow_follow_worker.rb @@ -11,7 +11,7 @@ class UnfollowFollowWorker new_target_account = Account.find(new_target_account_id) FollowService.new.call(follower_account, new_target_account) - UnfollowService.new.call(follower_account, old_target_account) + UnfollowService.new.call(follower_account, old_target_account, skip_unmerge: true) rescue ActiveRecord::RecordNotFound, Mastodon::NotPermittedError true end From 0e5b9e3ba0ddc8061ad57f71924fdbfb981f42a0 Mon Sep 17 00:00:00 2001 From: mayaeh Date: Tue, 17 Sep 2019 17:06:43 +0900 Subject: [PATCH 101/134] Fix the sample account icon of Profile directory to local only (#11872) --- app/models/tag.rb | 2 +- app/presenters/instance_presenter.rb | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/app/models/tag.rb b/app/models/tag.rb index 4e77c404d..b52b9bc9f 100644 --- a/app/models/tag.rb +++ b/app/models/tag.rb @@ -20,7 +20,7 @@ class Tag < ApplicationRecord has_and_belongs_to_many :statuses has_and_belongs_to_many :accounts - has_and_belongs_to_many :sample_accounts, -> { searchable.discoverable.popular.limit(3) }, class_name: 'Account' + has_and_belongs_to_many :sample_accounts, -> { local.discoverable.popular.limit(3) }, class_name: 'Account' has_many :featured_tags, dependent: :destroy, inverse_of: :tag has_one :account_tag_stat, dependent: :destroy diff --git a/app/presenters/instance_presenter.rb b/app/presenters/instance_presenter.rb index f3a73209a..becc92c2d 100644 --- a/app/presenters/instance_presenter.rb +++ b/app/presenters/instance_presenter.rb @@ -33,7 +33,7 @@ class InstancePresenter end def sample_accounts - Rails.cache.fetch('sample_accounts', expires_in: 12.hours) { Account.discoverable.popular.limit(3) } + Rails.cache.fetch('sample_accounts', expires_in: 12.hours) { Account.local.discoverable.popular.limit(3) } end def version_number From b671b912113b8705729a44424946bb31ae445df5 Mon Sep 17 00:00:00 2001 From: Eugen Rochko Date: Tue, 17 Sep 2019 14:58:02 +0200 Subject: [PATCH 102/134] Fix webfinger response not returning 410 when account is suspended (#11869) --- .../well_known/webfinger_controller.rb | 24 +++++++++++++++---- 1 file changed, 20 insertions(+), 4 deletions(-) diff --git a/app/controllers/well_known/webfinger_controller.rb b/app/controllers/well_known/webfinger_controller.rb index d60bf98ab..480e58f3f 100644 --- a/app/controllers/well_known/webfinger_controller.rb +++ b/app/controllers/well_known/webfinger_controller.rb @@ -5,18 +5,22 @@ module WellKnown include RoutingHelper before_action { response.headers['Vary'] = 'Accept' } + before_action :set_account + before_action :check_account_suspension + + rescue_from ActiveRecord::RecordNotFound, ActionController::ParameterMissing, with: :not_found def show - @account = Account.find_local!(username_from_resource) - expires_in 3.days, public: true render json: @account, serializer: WebfingerSerializer, content_type: 'application/jrd+json' - rescue ActiveRecord::RecordNotFound, ActionController::ParameterMissing - head 404 end private + def set_account + @account = Account.find_local!(username_from_resource) + end + def username_from_resource resource_user = resource_param username, domain = resource_user.split('@') @@ -28,5 +32,17 @@ module WellKnown def resource_param params.require(:resource) end + + def check_account_suspension + expires_in(3.minutes, public: true) && gone if @account.suspended? + end + + def not_found + head 404 + end + + def gone + head 410 + end end end From 75c6ad500d7038b96f4942d0297a15b85152f3a0 Mon Sep 17 00:00:00 2001 From: mayaeh Date: Tue, 17 Sep 2019 23:59:16 +0900 Subject: [PATCH 103/134] Fixed not being able to display review pending hashtags in the admin UI. (#11875) --- app/views/admin/dashboard/index.html.haml | 2 +- app/views/admin/tags/index.html.haml | 2 +- app/views/admin_mailer/new_trending_tag.text.erb | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/app/views/admin/dashboard/index.html.haml b/app/views/admin/dashboard/index.html.haml index be1052ae4..514637c4f 100644 --- a/app/views/admin/dashboard/index.html.haml +++ b/app/views/admin/dashboard/index.html.haml @@ -23,7 +23,7 @@ .dashboard__counters__num= number_to_human @reports_count, strip_insignificant_zeros: true .dashboard__counters__label= t 'admin.dashboard.open_reports' %div - = link_to admin_tags_path(review: 'pending_review') do + = link_to admin_tags_path(pending_review: '1') do .dashboard__counters__num= number_to_human @pending_tags_count, strip_insignificant_zeros: true .dashboard__counters__label= t 'admin.dashboard.pending_tags' %div diff --git a/app/views/admin/tags/index.html.haml b/app/views/admin/tags/index.html.haml index cea1b71b5..c767c9d18 100644 --- a/app/views/admin/tags/index.html.haml +++ b/app/views/admin/tags/index.html.haml @@ -66,7 +66,7 @@ = paginate @tags -- if params[:review] == 'pending_review' +- if params[:pending_review] == '1' %hr.spacer/ %div{ style: 'overflow: hidden' } diff --git a/app/views/admin_mailer/new_trending_tag.text.erb b/app/views/admin_mailer/new_trending_tag.text.erb index f3087df37..e4bfdc591 100644 --- a/app/views/admin_mailer/new_trending_tag.text.erb +++ b/app/views/admin_mailer/new_trending_tag.text.erb @@ -2,4 +2,4 @@ <%= raw t('admin_mailer.new_trending_tag.body', name: @tag.name) %> -<%= raw t('application_mailer.view')%> <%= admin_tags_url(review: 'pending_review') %> +<%= raw t('application_mailer.view')%> <%= admin_tags_url(pending_review: '1') %> From 3919571c3958f7808a7830b7d19d1605fc7c0ef9 Mon Sep 17 00:00:00 2001 From: "han@highemelry" Date: Wed, 18 Sep 2019 06:20:48 +0900 Subject: [PATCH 104/134] Fix audit log error when custom emoji is copied from remote server (#11876) --- app/models/custom_emoji.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/models/custom_emoji.rb b/app/models/custom_emoji.rb index edb1bec75..0dacaf654 100644 --- a/app/models/custom_emoji.rb +++ b/app/models/custom_emoji.rb @@ -63,7 +63,7 @@ class CustomEmoji < ApplicationRecord def copy! copy = self.class.find_or_initialize_by(domain: nil, shortcode: shortcode) copy.image = image - copy.save! + copy.tap(&:save!) end class << self From a4b60e9ba4874b9ab427bec41d8b2cd252ec4782 Mon Sep 17 00:00:00 2001 From: Eugen Rochko Date: Wed, 18 Sep 2019 02:48:40 +0200 Subject: [PATCH 105/134] Fix TOTP codes not being filtered from logs during enabling/disabling (#11877) Not a serious issue because they are meaningless past single use --- .../two_factor_authentication/confirmations_controller.rb | 4 ++-- .../settings/two_factor_authentications_controller.rb | 6 +++--- app/models/form/two_factor_confirmation.rb | 2 +- .../two_factor_authentication/confirmations/new.html.haml | 2 +- .../settings/two_factor_authentications/show.html.haml | 2 +- .../confirmations_controller_spec.rb | 6 +++--- .../settings/two_factor_authentications_controller_spec.rb | 4 ++-- 7 files changed, 13 insertions(+), 13 deletions(-) diff --git a/app/controllers/settings/two_factor_authentication/confirmations_controller.rb b/app/controllers/settings/two_factor_authentication/confirmations_controller.rb index 3145e092d..46c90bf74 100644 --- a/app/controllers/settings/two_factor_authentication/confirmations_controller.rb +++ b/app/controllers/settings/two_factor_authentication/confirmations_controller.rb @@ -15,7 +15,7 @@ module Settings end def create - if current_user.validate_and_consume_otp!(confirmation_params[:code]) + if current_user.validate_and_consume_otp!(confirmation_params[:otp_attempt]) flash.now[:notice] = I18n.t('two_factor_authentication.enabled_success') current_user.otp_required_for_login = true @@ -33,7 +33,7 @@ module Settings private def confirmation_params - params.require(:form_two_factor_confirmation).permit(:code) + params.require(:form_two_factor_confirmation).permit(:otp_attempt) end def prepare_two_factor_form diff --git a/app/controllers/settings/two_factor_authentications_controller.rb b/app/controllers/settings/two_factor_authentications_controller.rb index 6904076e4..c93b17577 100644 --- a/app/controllers/settings/two_factor_authentications_controller.rb +++ b/app/controllers/settings/two_factor_authentications_controller.rb @@ -34,7 +34,7 @@ module Settings private def confirmation_params - params.require(:form_two_factor_confirmation).permit(:code) + params.require(:form_two_factor_confirmation).permit(:otp_attempt) end def verify_otp_required @@ -42,8 +42,8 @@ module Settings end def acceptable_code? - current_user.validate_and_consume_otp!(confirmation_params[:code]) || - current_user.invalidate_otp_backup_code!(confirmation_params[:code]) + current_user.validate_and_consume_otp!(confirmation_params[:otp_attempt]) || + current_user.invalidate_otp_backup_code!(confirmation_params[:otp_attempt]) end end end diff --git a/app/models/form/two_factor_confirmation.rb b/app/models/form/two_factor_confirmation.rb index b8cf76d05..27ada6533 100644 --- a/app/models/form/two_factor_confirmation.rb +++ b/app/models/form/two_factor_confirmation.rb @@ -3,5 +3,5 @@ class Form::TwoFactorConfirmation include ActiveModel::Model - attr_accessor :code + attr_accessor :otp_attempt end diff --git a/app/views/settings/two_factor_authentication/confirmations/new.html.haml b/app/views/settings/two_factor_authentication/confirmations/new.html.haml index e64155299..86cf1f695 100644 --- a/app/views/settings/two_factor_authentication/confirmations/new.html.haml +++ b/app/views/settings/two_factor_authentication/confirmations/new.html.haml @@ -12,7 +12,7 @@ %samp.qr-alternative__code= current_user.otp_secret.scan(/.{4}/).join(' ') .fields-group - = f.input :code, wrapper: :with_label, hint: t('two_factor_authentication.code_hint'), label: t('simple_form.labels.defaults.otp_attempt'), input_html: { :autocomplete => 'off' }, required: true + = f.input :otp_attempt, wrapper: :with_label, hint: t('two_factor_authentication.code_hint'), label: t('simple_form.labels.defaults.otp_attempt'), input_html: { :autocomplete => 'off' }, required: true .actions = f.button :button, t('two_factor_authentication.enable'), type: :submit diff --git a/app/views/settings/two_factor_authentications/show.html.haml b/app/views/settings/two_factor_authentications/show.html.haml index 259bcd1ef..93509e022 100644 --- a/app/views/settings/two_factor_authentications/show.html.haml +++ b/app/views/settings/two_factor_authentications/show.html.haml @@ -10,7 +10,7 @@ %hr/ = simple_form_for @confirmation, url: settings_two_factor_authentication_path, method: :delete do |f| - = f.input :code, wrapper: :with_label, hint: t('two_factor_authentication.code_hint'), label: t('simple_form.labels.defaults.otp_attempt'), input_html: { :autocomplete => 'off' }, required: true + = f.input :otp_attempt, wrapper: :with_label, hint: t('two_factor_authentication.code_hint'), label: t('simple_form.labels.defaults.otp_attempt'), input_html: { :autocomplete => 'off' }, required: true .actions = f.button :button, t('two_factor_authentication.disable'), type: :submit diff --git a/spec/controllers/settings/two_factor_authentication/confirmations_controller_spec.rb b/spec/controllers/settings/two_factor_authentication/confirmations_controller_spec.rb index 2222a7559..2e5a9325c 100644 --- a/spec/controllers/settings/two_factor_authentication/confirmations_controller_spec.rb +++ b/spec/controllers/settings/two_factor_authentication/confirmations_controller_spec.rb @@ -68,7 +68,7 @@ describe Settings::TwoFactorAuthentication::ConfirmationsController do true end - post :create, params: { form_two_factor_confirmation: { code: '123456' } } + post :create, params: { form_two_factor_confirmation: { otp_attempt: '123456' } } expect(assigns(:recovery_codes)).to eq otp_backup_codes expect(flash[:notice]).to eq 'Two-factor authentication successfully enabled' @@ -85,7 +85,7 @@ describe Settings::TwoFactorAuthentication::ConfirmationsController do false end - post :create, params: { form_two_factor_confirmation: { code: '123456' } } + post :create, params: { form_two_factor_confirmation: { otp_attempt: '123456' } } end it 'renders the new view' do @@ -99,7 +99,7 @@ describe Settings::TwoFactorAuthentication::ConfirmationsController do context 'when not signed in' do it 'redirects if not signed in' do - post :create, params: { form_two_factor_confirmation: { code: '123456' } } + post :create, params: { form_two_factor_confirmation: { otp_attempt: '123456' } } expect(response).to redirect_to('/auth/sign_in') end end diff --git a/spec/controllers/settings/two_factor_authentications_controller_spec.rb b/spec/controllers/settings/two_factor_authentications_controller_spec.rb index f7c628756..922231ded 100644 --- a/spec/controllers/settings/two_factor_authentications_controller_spec.rb +++ b/spec/controllers/settings/two_factor_authentications_controller_spec.rb @@ -91,7 +91,7 @@ describe Settings::TwoFactorAuthenticationsController do true end - post :destroy, params: { form_two_factor_confirmation: { code: '123456' } } + post :destroy, params: { form_two_factor_confirmation: { otp_attempt: '123456' } } expect(response).to redirect_to(settings_two_factor_authentication_path) user.reload @@ -105,7 +105,7 @@ describe Settings::TwoFactorAuthenticationsController do false end - post :destroy, params: { form_two_factor_confirmation: { code: '057772' } } + post :destroy, params: { form_two_factor_confirmation: { otp_attempt: '057772' } } user.reload expect(user.otp_required_for_login).to eq(true) From 0627252b30d9f420d51bb4787c539550d68a717a Mon Sep 17 00:00:00 2001 From: Yamagishi Kazutoshi Date: Wed, 18 Sep 2019 11:02:21 +0900 Subject: [PATCH 106/134] Check existence of timeline state in community timeline (#11880) --- app/javascript/mastodon/features/community_timeline/index.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/app/javascript/mastodon/features/community_timeline/index.js b/app/javascript/mastodon/features/community_timeline/index.js index cb93f9c22..30153cc15 100644 --- a/app/javascript/mastodon/features/community_timeline/index.js +++ b/app/javascript/mastodon/features/community_timeline/index.js @@ -18,9 +18,10 @@ const mapStateToProps = (state, { onlyMedia, columnId }) => { const uuid = columnId; const columns = state.getIn(['settings', 'columns']); const index = columns.findIndex(c => c.get('uuid') === uuid); + const timelineState = state.getIn(['timelines', `community${onlyMedia ? ':media' : ''}`]); return { - hasUnread: state.getIn(['timelines', `community${onlyMedia ? ':media' : ''}`, 'unread']) > 0 || state.getIn(['timelines', `community${onlyMedia ? ':media' : ''}`, 'pendingItems']).size > 0, + hasUnread: !!timelineState && (timelineState.get('unread') > 0 || timelineState.get('pendingItems').size > 0), onlyMedia: (columnId && index >= 0) ? columns.get(index).getIn(['params', 'other', 'onlyMedia']) : state.getIn(['settings', 'community', 'other', 'onlyMedia']), }; }; From 0e6390753d4a93af7e705f7cca5946e232298fc5 Mon Sep 17 00:00:00 2001 From: abcang Date: Wed, 18 Sep 2019 17:58:08 +0900 Subject: [PATCH 107/134] Add users remember_token index (#11881) --- db/migrate/20190917213523_add_remember_token_index.rb | 9 +++++++++ db/schema.rb | 3 ++- 2 files changed, 11 insertions(+), 1 deletion(-) create mode 100644 db/migrate/20190917213523_add_remember_token_index.rb diff --git a/db/migrate/20190917213523_add_remember_token_index.rb b/db/migrate/20190917213523_add_remember_token_index.rb new file mode 100644 index 000000000..c5b41ce64 --- /dev/null +++ b/db/migrate/20190917213523_add_remember_token_index.rb @@ -0,0 +1,9 @@ +# frozen_string_literal: true + +class AddRememberTokenIndex < ActiveRecord::Migration[5.2] + disable_ddl_transaction! + + def change + add_index :users, :remember_token, algorithm: :concurrently, unique: true + end +end diff --git a/db/schema.rb b/db/schema.rb index 834dddd7b..749f79dee 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -10,7 +10,7 @@ # # It's strongly recommended that you check this file into your version control system. -ActiveRecord::Schema.define(version: 2019_09_04_222339) do +ActiveRecord::Schema.define(version: 2019_09_17_213523) do # These are extensions that must be enabled in order to support this database enable_extension "plpgsql" @@ -743,6 +743,7 @@ ActiveRecord::Schema.define(version: 2019_09_04_222339) do t.index ["confirmation_token"], name: "index_users_on_confirmation_token", unique: true t.index ["created_by_application_id"], name: "index_users_on_created_by_application_id" t.index ["email"], name: "index_users_on_email", unique: true + t.index ["remember_token"], name: "index_users_on_remember_token", unique: true t.index ["reset_password_token"], name: "index_users_on_reset_password_token", unique: true end From 577706987d2e09e598130d37fb9a52cd4a6510ea Mon Sep 17 00:00:00 2001 From: ThibG Date: Wed, 18 Sep 2019 11:27:10 +0200 Subject: [PATCH 108/134] =?UTF-8?q?Fix=20=E2=80=9Cload=20more=E2=80=9D=20a?= =?UTF-8?q?dding=20older=20toots/notifications=20to=20pending=20items=20(#?= =?UTF-8?q?11883)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/javascript/mastodon/actions/notifications.js | 5 +++-- app/javascript/mastodon/reducers/notifications.js | 6 +++--- app/javascript/mastodon/reducers/timelines.js | 2 +- 3 files changed, 7 insertions(+), 6 deletions(-) diff --git a/app/javascript/mastodon/actions/notifications.js b/app/javascript/mastodon/actions/notifications.js index d92d972bc..ea76255e3 100644 --- a/app/javascript/mastodon/actions/notifications.js +++ b/app/javascript/mastodon/actions/notifications.js @@ -151,7 +151,7 @@ export function expandNotifications({ maxId } = {}, done = noOp) { dispatch(importFetchedAccounts(response.data.map(item => item.account))); dispatch(importFetchedStatuses(response.data.map(item => item.status).filter(status => !!status))); - dispatch(expandNotificationsSuccess(response.data, next ? next.uri : null, isLoadingMore, isLoadingRecent && preferPendingItems)); + dispatch(expandNotificationsSuccess(response.data, next ? next.uri : null, isLoadingMore, isLoadingRecent, isLoadingRecent && preferPendingItems)); fetchRelatedRelationships(dispatch, response.data); done(); }).catch(error => { @@ -168,11 +168,12 @@ export function expandNotificationsRequest(isLoadingMore) { }; }; -export function expandNotificationsSuccess(notifications, next, isLoadingMore, usePendingItems) { +export function expandNotificationsSuccess(notifications, next, isLoadingMore, isLoadingRecent, usePendingItems) { return { type: NOTIFICATIONS_EXPAND_SUCCESS, notifications, next, + isLoadingRecent: isLoadingRecent, usePendingItems, skipLoading: !isLoadingMore, }; diff --git a/app/javascript/mastodon/reducers/notifications.js b/app/javascript/mastodon/reducers/notifications.js index 811550a8a..45d3a5c51 100644 --- a/app/javascript/mastodon/reducers/notifications.js +++ b/app/javascript/mastodon/reducers/notifications.js @@ -54,7 +54,7 @@ const normalizeNotification = (state, notification, usePendingItems) => { }); }; -const expandNormalizedNotifications = (state, notifications, next, usePendingItems) => { +const expandNormalizedNotifications = (state, notifications, next, isLoadingRecent, usePendingItems) => { let items = ImmutableList(); notifications.forEach((n, i) => { @@ -63,7 +63,7 @@ const expandNormalizedNotifications = (state, notifications, next, usePendingIte return state.withMutations(mutable => { if (!items.isEmpty()) { - usePendingItems = usePendingItems || !mutable.get('top') || !mutable.get('pendingItems').isEmpty(); + usePendingItems = isLoadingRecent && (usePendingItems || !mutable.get('top') || !mutable.get('pendingItems').isEmpty()); mutable.update(usePendingItems ? 'pendingItems' : 'items', list => { const lastIndex = 1 + list.findLastIndex( @@ -119,7 +119,7 @@ export default function notifications(state = initialState, action) { case NOTIFICATIONS_UPDATE: return normalizeNotification(state, action.notification, action.usePendingItems); case NOTIFICATIONS_EXPAND_SUCCESS: - return expandNormalizedNotifications(state, action.notifications, action.next, action.usePendingItems); + return expandNormalizedNotifications(state, action.notifications, action.next, action.isLoadingRecent, action.usePendingItems); case ACCOUNT_BLOCK_SUCCESS: return filterNotifications(state, [action.relationship.id]); case ACCOUNT_MUTE_SUCCESS: diff --git a/app/javascript/mastodon/reducers/timelines.js b/app/javascript/mastodon/reducers/timelines.js index 19c57ceaf..f3ed2fc59 100644 --- a/app/javascript/mastodon/reducers/timelines.js +++ b/app/javascript/mastodon/reducers/timelines.js @@ -40,7 +40,7 @@ const expandNormalizedTimeline = (state, timeline, statuses, next, isPartial, is if (timeline.endsWith(':pinned')) { mMap.set('items', statuses.map(status => status.get('id'))); } else if (!statuses.isEmpty()) { - usePendingItems = usePendingItems || !mMap.get('top') || !mMap.get('pendingItems').isEmpty(); + usePendingItems = isLoadingRecent && (usePendingItems || !mMap.get('top') || !mMap.get('pendingItems').isEmpty()); mMap.update(usePendingItems ? 'pendingItems' : 'items', ImmutableList(), oldIds => { const newIds = statuses.map(status => status.get('id')); From 4f6af87906175d9ea802ef0c6f050388eac890fa Mon Sep 17 00:00:00 2001 From: Eugen Rochko Date: Wed, 18 Sep 2019 12:53:13 +0200 Subject: [PATCH 109/134] Change spam check to apply to local accounts and add a threshold (#11806) Instead of detecting spam on first duplicate message, add a threshold of 5 such messages to reduce false positives --- app/lib/activitypub/activity/create.rb | 10 +----- app/lib/spam_check.rb | 46 +++++++++++++++++++----- app/services/process_mentions_service.rb | 5 +++ spec/lib/spam_check_spec.rb | 34 +++++++++++------- 4 files changed, 66 insertions(+), 29 deletions(-) diff --git a/app/lib/activitypub/activity/create.rb b/app/lib/activitypub/activity/create.rb index dea7fd43c..e69193b71 100644 --- a/app/lib/activitypub/activity/create.rb +++ b/app/lib/activitypub/activity/create.rb @@ -408,15 +408,7 @@ class ActivityPub::Activity::Create < ActivityPub::Activity end def check_for_spam - spam_check = SpamCheck.new(@status) - - return if spam_check.skip? - - if spam_check.spam? - spam_check.flag! - else - spam_check.remember! - end + SpamCheck.perform(@status) end def forward_for_reply diff --git a/app/lib/spam_check.rb b/app/lib/spam_check.rb index 0cf1b8790..441697364 100644 --- a/app/lib/spam_check.rb +++ b/app/lib/spam_check.rb @@ -4,9 +4,25 @@ class SpamCheck include Redisable include ActionView::Helpers::TextHelper + # Threshold over which two Nilsimsa values are considered + # to refer to the same text NILSIMSA_COMPARE_THRESHOLD = 95 - NILSIMSA_MIN_SIZE = 10 - EXPIRE_SET_AFTER = 1.week.seconds + + # Nilsimsa doesn't work well on small inputs, so below + # this size, we check only for exact matches with MD5 + NILSIMSA_MIN_SIZE = 10 + + # How long to keep the trail of digests between updates, + # there is no reason to store it forever + EXPIRE_SET_AFTER = 1.week.seconds + + # How many digests to keep in an account's trail. If it's + # too small, spam could rotate around different message templates + MAX_TRAIL_SIZE = 10 + + # How many detected duplicates to allow through before + # considering the message as spam + THRESHOLD = 5 def initialize(status) @account = status.account @@ -21,9 +37,9 @@ class SpamCheck if insufficient_data? false elsif nilsimsa? - any_other_digest?('nilsimsa') { |_, other_digest| nilsimsa_compare_value(digest, other_digest) >= NILSIMSA_COMPARE_THRESHOLD } + digests_over_threshold?('nilsimsa') { |_, other_digest| nilsimsa_compare_value(digest, other_digest) >= NILSIMSA_COMPARE_THRESHOLD } else - any_other_digest?('md5') { |_, other_digest| other_digest == digest } + digests_over_threshold?('md5') { |_, other_digest| other_digest == digest } end end @@ -38,7 +54,7 @@ class SpamCheck # get the correct status ID back, we have to save it in the string value redis.zadd(redis_key, @status.id, digest_with_algorithm) - redis.zremrangebyrank(redis_key, '0', '-10') + redis.zremrangebyrank(redis_key, 0, -(MAX_TRAIL_SIZE + 1)) redis.expire(redis_key, EXPIRE_SET_AFTER) end @@ -78,6 +94,20 @@ class SpamCheck end end + class << self + def perform(status) + spam_check = new(status) + + return if spam_check.skip? + + if spam_check.spam? + spam_check.flag! + else + spam_check.remember! + end + end + end + private def disabled? @@ -149,14 +179,14 @@ class SpamCheck redis.zrange(redis_key, 0, -1) end - def any_other_digest?(filter_algorithm) - other_digests.any? do |record| + def digests_over_threshold?(filter_algorithm) + other_digests.select do |record| algorithm, other_digest, status_id = record.split(':') next unless algorithm == filter_algorithm yield algorithm, other_digest, status_id - end + end.size >= THRESHOLD end def matching_status_ids diff --git a/app/services/process_mentions_service.rb b/app/services/process_mentions_service.rb index 90dca9740..2f7a9e985 100644 --- a/app/services/process_mentions_service.rb +++ b/app/services/process_mentions_service.rb @@ -33,6 +33,7 @@ class ProcessMentionsService < BaseService end status.save! + check_for_spam(status) mentions.each { |mention| create_notification(mention) } end @@ -61,4 +62,8 @@ class ProcessMentionsService < BaseService def resolve_account_service ResolveAccountService.new end + + def check_for_spam(status) + SpamCheck.perform(status) + end end diff --git a/spec/lib/spam_check_spec.rb b/spec/lib/spam_check_spec.rb index 9e0989216..4cae46111 100644 --- a/spec/lib/spam_check_spec.rb +++ b/spec/lib/spam_check_spec.rb @@ -86,23 +86,33 @@ RSpec.describe SpamCheck do end it 'returns true for duplicate statuses to the same recipient' do - status1 = status_with_html('@alice Hello') - described_class.new(status1).remember! + described_class::THRESHOLD.times do + status1 = status_with_html('@alice Hello') + described_class.new(status1).remember! + end + status2 = status_with_html('@alice Hello') expect(described_class.new(status2).spam?).to be true end it 'returns true for duplicate statuses to different recipients' do - status1 = status_with_html('@alice Hello') - described_class.new(status1).remember! + described_class::THRESHOLD.times do + status1 = status_with_html('@alice Hello') + described_class.new(status1).remember! + end + status2 = status_with_html('@bob Hello') expect(described_class.new(status2).spam?).to be true end it 'returns true for nearly identical statuses with random numbers' do source_text = 'Sodium, atomic number 11, was first isolated by Humphry Davy in 1807. A chemical component of salt, he named it Na in honor of the saltiest region on earth, North America.' - status1 = status_with_html('@alice ' + source_text + ' 1234') - described_class.new(status1).remember! + + described_class::THRESHOLD.times do + status1 = status_with_html('@alice ' + source_text + ' 1234') + described_class.new(status1).remember! + end + status2 = status_with_html('@bob ' + source_text + ' 9568') expect(described_class.new(status2).spam?).to be true end @@ -140,9 +150,9 @@ RSpec.describe SpamCheck do let(:redis_key) { spam_check.send(:redis_key) } it 'remembers' do - expect do - spam_check.remember! - end.to change { Redis.current.exists(redis_key) }.from(false).to(true) + expect(Redis.current.exists(redis_key)).to be true + spam_check.remember! + expect(Redis.current.exists(redis_key)).to be true end end @@ -156,9 +166,9 @@ RSpec.describe SpamCheck do end it 'resets' do - expect do - spam_check.reset! - end.to change { Redis.current.exists(redis_key) }.from(true).to(false) + expect(Redis.current.exists(redis_key)).to be true + spam_check.reset! + expect(Redis.current.exists(redis_key)).to be false end end From d0c2c5278391b82ba7fa2f230bf237805ff61a0c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?nzws=E2=9C=A8?= Date: Wed, 18 Sep 2019 22:41:50 +0900 Subject: [PATCH 110/134] Fix eslint error of import/no-extraneous-dependencies (#11884) * Fix eslint error of import/no-extraneous-dependencies - Add history dependency * refactoring code --- app/javascript/packs/public.js | 4 ++-- package.json | 1 + yarn.lock | 32 ++++++++++++++++++++++++++++++++ 3 files changed, 35 insertions(+), 2 deletions(-) diff --git a/app/javascript/packs/public.js b/app/javascript/packs/public.js index c5cd7129f..97ee4dfa2 100644 --- a/app/javascript/packs/public.js +++ b/app/javascript/packs/public.js @@ -31,10 +31,10 @@ function main() { const React = require('react'); const ReactDOM = require('react-dom'); const Rellax = require('rellax'); - const createHistory = require('history').createBrowserHistory; + const { createBrowserHistory } = require('history'); const scrollToDetailedStatus = () => { - const history = createHistory(); + const history = createBrowserHistory(); const detailedStatuses = document.querySelectorAll('.public-layout .detailed-status'); const location = history.location; diff --git a/package.json b/package.json index a47b3cd0f..24d5fcf9c 100644 --- a/package.json +++ b/package.json @@ -98,6 +98,7 @@ "file-loader": "^4.2.0", "font-awesome": "^4.7.0", "glob": "^7.1.1", + "history": "^4.10.1", "http-link-header": "^1.0.2", "immutable": "^3.8.2", "imports-loader": "^0.8.0", diff --git a/yarn.lock b/yarn.lock index c908004c7..9c85ea741 100644 --- a/yarn.lock +++ b/yarn.lock @@ -4926,6 +4926,18 @@ hex-color-regex@^1.1.0: resolved "https://registry.yarnpkg.com/hex-color-regex/-/hex-color-regex-1.1.0.tgz#4c06fccb4602fe2602b3c93df82d7e7dbf1a8a8e" integrity sha512-l9sfDFsuqtOqKDsQdqrMRk0U85RZc0RtOR9yPI7mRVOa4FsR/BVnZ0shmQRM96Ji99kYZP/7hn1cedc1+ApsTQ== +history@^4.10.1: + version "4.10.1" + resolved "https://registry.yarnpkg.com/history/-/history-4.10.1.tgz#33371a65e3a83b267434e2b3f3b1b4c58aad4cf3" + integrity sha512-36nwAD620w12kuzPAsyINPWJqlNbij+hpK1k9XRloDtym8mxzGYl2c17LnV6IAGB2Dmg4tEa7G7DlawS0+qjew== + dependencies: + "@babel/runtime" "^7.1.2" + loose-envify "^1.2.0" + resolve-pathname "^3.0.0" + tiny-invariant "^1.0.2" + tiny-warning "^1.0.0" + value-equal "^1.0.1" + history@^4.7.2: version "4.7.2" resolved "https://registry.yarnpkg.com/history/-/history-4.7.2.tgz#22b5c7f31633c5b8021c7f4a8a954ac139ee8d5b" @@ -9166,6 +9178,11 @@ resolve-pathname@^2.2.0: resolved "https://registry.yarnpkg.com/resolve-pathname/-/resolve-pathname-2.2.0.tgz#7e9ae21ed815fd63ab189adeee64dc831eefa879" integrity sha512-bAFz9ld18RzJfddgrO2e/0S2O81710++chRMUxHjXOYKF6jTAMrUNZrEZ1PvV0zlhfjidm08iRPdTLPno1FuRg== +resolve-pathname@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/resolve-pathname/-/resolve-pathname-3.0.0.tgz#99d02224d3cf263689becbb393bc560313025dcd" + integrity sha512-C7rARubxI8bXFNB/hqcp/4iUeIXJhJZvFPFPiSPRnhU5UPxzMFIl+2E6yY6c4k9giDJAhtV+enfA+G89N6Csng== + resolve-url@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a" @@ -10201,11 +10218,21 @@ timsort@^0.3.0: resolved "https://registry.yarnpkg.com/timsort/-/timsort-0.3.0.tgz#405411a8e7e6339fe64db9a234de11dc31e02bd4" integrity sha1-QFQRqOfmM5/mTbmiNN4R3DHgK9Q= +tiny-invariant@^1.0.2: + version "1.0.6" + resolved "https://registry.yarnpkg.com/tiny-invariant/-/tiny-invariant-1.0.6.tgz#b3f9b38835e36a41c843a3b0907a5a7b3755de73" + integrity sha512-FOyLWWVjG+aC0UqG76V53yAWdXfH8bO6FNmyZOuUrzDzK8DI3/JRY25UD7+g49JWM1LXwymsKERB+DzI0dTEQA== + tiny-queue@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/tiny-queue/-/tiny-queue-0.2.1.tgz#25a67f2c6e253b2ca941977b5ef7442ef97a6046" integrity sha1-JaZ/LG4lOyypQZd7XvdELvl6YEY= +tiny-warning@^1.0.0: + version "1.0.3" + resolved "https://registry.yarnpkg.com/tiny-warning/-/tiny-warning-1.0.3.tgz#94a30db453df4c643d0fd566060d60a875d84754" + integrity sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA== + tmp@^0.0.33: version "0.0.33" resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.33.tgz#6d34335889768d21b2bcda0aa277ced3b1bfadf9" @@ -10550,6 +10577,11 @@ value-equal@^0.4.0: resolved "https://registry.yarnpkg.com/value-equal/-/value-equal-0.4.0.tgz#c5bdd2f54ee093c04839d71ce2e4758a6890abc7" integrity sha512-x+cYdNnaA3CxvMaTX0INdTCN8m8aF2uY9BvEqmxuYp8bL09cs/kWVQPVGcA35fMktdOsP69IgU7wFj/61dJHEw== +value-equal@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/value-equal/-/value-equal-1.0.1.tgz#1e0b794c734c5c0cade179c437d356d931a34d6c" + integrity sha512-NOJ6JZCAWr0zlxZt+xqCHNTEKOsrks2HQd4MqhP1qy4z1SkbEP467eNx6TgDKXMvUOb+OENfJCZwM+16n7fRfw== + vary@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" From e1066cd4319a220d5be16e51ffaf5236a2f6e866 Mon Sep 17 00:00:00 2001 From: Eugen Rochko Date: Wed, 18 Sep 2019 16:37:27 +0200 Subject: [PATCH 111/134] Add password challenge to 2FA settings, e-mail notifications (#11878) Fix #3961 --- .../two_factor_authentications_controller.rb | 1 + app/controllers/auth/challenges_controller.rb | 22 ++++ app/controllers/auth/sessions_controller.rb | 1 + .../concerns/challengable_concern.rb | 65 ++++++++++ .../confirmations_controller.rb | 5 + .../recovery_codes_controller.rb | 6 + .../two_factor_authentications_controller.rb | 4 + app/javascript/styles/mastodon/admin.scss | 43 ++++--- app/javascript/styles/mastodon/forms.scss | 4 + app/mailers/user_mailer.rb | 33 +++++ app/models/form/challenge.rb | 8 ++ app/models/user.rb | 9 +- app/views/auth/challenges/new.html.haml | 15 +++ app/views/auth/shared/_links.html.haml | 2 +- .../two_factor_authentications/show.html.haml | 38 +++--- .../user_mailer/two_factor_disabled.html.haml | 43 +++++++ .../user_mailer/two_factor_disabled.text.erb | 7 ++ .../user_mailer/two_factor_enabled.html.haml | 43 +++++++ .../user_mailer/two_factor_enabled.text.erb | 7 ++ ...wo_factor_recovery_codes_changed.html.haml | 43 +++++++ ...two_factor_recovery_codes_changed.text.erb | 7 ++ config/locales/devise.en.yml | 12 ++ config/locales/en.yml | 5 + config/locales/simple_form.en.yml | 2 + config/routes.rb | 1 + .../auth/challenges_controller_spec.rb | 46 +++++++ .../auth/sessions_controller_spec.rb | 2 +- .../concerns/challengable_concern_spec.rb | 114 ++++++++++++++++++ .../confirmations_controller_spec.rb | 10 +- .../recovery_codes_controller_spec.rb | 2 +- ..._factor_authentications_controller_spec.rb | 2 +- spec/mailers/previews/user_mailer_preview.rb | 15 +++ 32 files changed, 567 insertions(+), 50 deletions(-) create mode 100644 app/controllers/auth/challenges_controller.rb create mode 100644 app/controllers/concerns/challengable_concern.rb create mode 100644 app/models/form/challenge.rb create mode 100644 app/views/auth/challenges/new.html.haml create mode 100644 app/views/user_mailer/two_factor_disabled.html.haml create mode 100644 app/views/user_mailer/two_factor_disabled.text.erb create mode 100644 app/views/user_mailer/two_factor_enabled.html.haml create mode 100644 app/views/user_mailer/two_factor_enabled.text.erb create mode 100644 app/views/user_mailer/two_factor_recovery_codes_changed.html.haml create mode 100644 app/views/user_mailer/two_factor_recovery_codes_changed.text.erb create mode 100644 spec/controllers/auth/challenges_controller_spec.rb create mode 100644 spec/controllers/concerns/challengable_concern_spec.rb diff --git a/app/controllers/admin/two_factor_authentications_controller.rb b/app/controllers/admin/two_factor_authentications_controller.rb index 2577a4b17..0652c3a7a 100644 --- a/app/controllers/admin/two_factor_authentications_controller.rb +++ b/app/controllers/admin/two_factor_authentications_controller.rb @@ -8,6 +8,7 @@ module Admin authorize @user, :disable_2fa? @user.disable_two_factor! log_action :disable_2fa, @user + UserMailer.two_factor_disabled(@user).deliver_later! redirect_to admin_accounts_path end diff --git a/app/controllers/auth/challenges_controller.rb b/app/controllers/auth/challenges_controller.rb new file mode 100644 index 000000000..060944240 --- /dev/null +++ b/app/controllers/auth/challenges_controller.rb @@ -0,0 +1,22 @@ +# frozen_string_literal: true + +class Auth::ChallengesController < ApplicationController + include ChallengableConcern + + layout 'auth' + + before_action :authenticate_user! + + skip_before_action :require_functional! + + def create + if challenge_passed? + session[:challenge_passed_at] = Time.now.utc + redirect_to challenge_params[:return_to] + else + @challenge = Form::Challenge.new(return_to: challenge_params[:return_to]) + flash.now[:alert] = I18n.t('challenge.invalid_password') + render_challenge + end + end +end diff --git a/app/controllers/auth/sessions_controller.rb b/app/controllers/auth/sessions_controller.rb index 3e93b2e68..b3113bbef 100644 --- a/app/controllers/auth/sessions_controller.rb +++ b/app/controllers/auth/sessions_controller.rb @@ -42,6 +42,7 @@ class Auth::SessionsController < Devise::SessionsController def destroy tmp_stored_location = stored_location_for(:user) super + session.delete(:challenge_passed_at) flash.delete(:notice) store_location_for(:user, tmp_stored_location) if continue_after? end diff --git a/app/controllers/concerns/challengable_concern.rb b/app/controllers/concerns/challengable_concern.rb new file mode 100644 index 000000000..b29d90b3c --- /dev/null +++ b/app/controllers/concerns/challengable_concern.rb @@ -0,0 +1,65 @@ +# frozen_string_literal: true + +# This concern is inspired by "sudo mode" on GitHub. It +# is a way to re-authenticate a user before allowing them +# to see or perform an action. +# +# Add `before_action :require_challenge!` to actions you +# want to protect. +# +# The user will be shown a page to enter the challenge (which +# is either the password, or just the username when no +# password exists). Upon passing, there is a grace period +# during which no challenge will be asked from the user. +# +# Accessing challenge-protected resources during the grace +# period will refresh the grace period. +module ChallengableConcern + extend ActiveSupport::Concern + + CHALLENGE_TIMEOUT = 1.hour.freeze + + def require_challenge! + return if skip_challenge? + + if challenge_passed_recently? + session[:challenge_passed_at] = Time.now.utc + return + end + + @challenge = Form::Challenge.new(return_to: request.url) + + if params.key?(:form_challenge) + if challenge_passed? + session[:challenge_passed_at] = Time.now.utc + return + else + flash.now[:alert] = I18n.t('challenge.invalid_password') + render_challenge + end + else + render_challenge + end + end + + def render_challenge + @body_classes = 'lighter' + render template: 'auth/challenges/new', layout: 'auth' + end + + def challenge_passed? + current_user.valid_password?(challenge_params[:current_password]) + end + + def skip_challenge? + current_user.encrypted_password.blank? + end + + def challenge_passed_recently? + session[:challenge_passed_at].present? && session[:challenge_passed_at] >= CHALLENGE_TIMEOUT.ago + end + + def challenge_params + params.require(:form_challenge).permit(:current_password, :return_to) + end +end diff --git a/app/controllers/settings/two_factor_authentication/confirmations_controller.rb b/app/controllers/settings/two_factor_authentication/confirmations_controller.rb index 46c90bf74..ef4df3339 100644 --- a/app/controllers/settings/two_factor_authentication/confirmations_controller.rb +++ b/app/controllers/settings/two_factor_authentication/confirmations_controller.rb @@ -3,9 +3,12 @@ module Settings module TwoFactorAuthentication class ConfirmationsController < BaseController + include ChallengableConcern + layout 'admin' before_action :authenticate_user! + before_action :require_challenge! before_action :ensure_otp_secret skip_before_action :require_functional! @@ -22,6 +25,8 @@ module Settings @recovery_codes = current_user.generate_otp_backup_codes! current_user.save! + UserMailer.two_factor_enabled(current_user).deliver_later! + render 'settings/two_factor_authentication/recovery_codes/index' else flash.now[:alert] = I18n.t('two_factor_authentication.wrong_code') diff --git a/app/controllers/settings/two_factor_authentication/recovery_codes_controller.rb b/app/controllers/settings/two_factor_authentication/recovery_codes_controller.rb index 09a759860..0c4f5bff7 100644 --- a/app/controllers/settings/two_factor_authentication/recovery_codes_controller.rb +++ b/app/controllers/settings/two_factor_authentication/recovery_codes_controller.rb @@ -3,16 +3,22 @@ module Settings module TwoFactorAuthentication class RecoveryCodesController < BaseController + include ChallengableConcern + layout 'admin' before_action :authenticate_user! + before_action :require_challenge!, on: :create skip_before_action :require_functional! def create @recovery_codes = current_user.generate_otp_backup_codes! current_user.save! + + UserMailer.two_factor_recovery_codes_changed(current_user).deliver_later! flash.now[:notice] = I18n.t('two_factor_authentication.recovery_codes_regenerated') + render :index end end diff --git a/app/controllers/settings/two_factor_authentications_controller.rb b/app/controllers/settings/two_factor_authentications_controller.rb index c93b17577..9118a7933 100644 --- a/app/controllers/settings/two_factor_authentications_controller.rb +++ b/app/controllers/settings/two_factor_authentications_controller.rb @@ -2,10 +2,13 @@ module Settings class TwoFactorAuthenticationsController < BaseController + include ChallengableConcern + layout 'admin' before_action :authenticate_user! before_action :verify_otp_required, only: [:create] + before_action :require_challenge!, only: [:create] skip_before_action :require_functional! @@ -23,6 +26,7 @@ module Settings if acceptable_code? current_user.otp_required_for_login = false current_user.save! + UserMailer.two_factor_disabled(current_user).deliver_later! redirect_to settings_two_factor_authentication_path else flash.now[:alert] = I18n.t('two_factor_authentication.wrong_code') diff --git a/app/javascript/styles/mastodon/admin.scss b/app/javascript/styles/mastodon/admin.scss index 5d4fe4ef8..074eee2cd 100644 --- a/app/javascript/styles/mastodon/admin.scss +++ b/app/javascript/styles/mastodon/admin.scss @@ -233,32 +233,35 @@ hr.spacer { height: 1px; } -.muted-hint { - color: $darker-text-color; +body, +.admin-wrapper .content { + .muted-hint { + color: $darker-text-color; - a { - color: $highlight-text-color; + a { + color: $highlight-text-color; + } } -} -.positive-hint { - color: $valid-value-color; - font-weight: 500; -} + .positive-hint { + color: $valid-value-color; + font-weight: 500; + } -.negative-hint { - color: $error-value-color; - font-weight: 500; -} + .negative-hint { + color: $error-value-color; + font-weight: 500; + } -.neutral-hint { - color: $dark-text-color; - font-weight: 500; -} + .neutral-hint { + color: $dark-text-color; + font-weight: 500; + } -.warning-hint { - color: $gold-star; - font-weight: 500; + .warning-hint { + color: $gold-star; + font-weight: 500; + } } .filters { diff --git a/app/javascript/styles/mastodon/forms.scss b/app/javascript/styles/mastodon/forms.scss index 16352340b..80ef8797d 100644 --- a/app/javascript/styles/mastodon/forms.scss +++ b/app/javascript/styles/mastodon/forms.scss @@ -254,6 +254,10 @@ code { &-6 { max-width: 50%; } + + .actions { + margin-top: 27px; + } } .fields-group:last-child, diff --git a/app/mailers/user_mailer.rb b/app/mailers/user_mailer.rb index b41004acc..6b81f6873 100644 --- a/app/mailers/user_mailer.rb +++ b/app/mailers/user_mailer.rb @@ -57,6 +57,39 @@ class UserMailer < Devise::Mailer end end + def two_factor_enabled(user, **) + @resource = user + @instance = Rails.configuration.x.local_domain + + return if @resource.disabled? + + I18n.with_locale(@resource.locale || I18n.default_locale) do + mail to: @resource.email, subject: I18n.t('devise.mailer.two_factor_enabled.subject') + end + end + + def two_factor_disabled(user, **) + @resource = user + @instance = Rails.configuration.x.local_domain + + return if @resource.disabled? + + I18n.with_locale(@resource.locale || I18n.default_locale) do + mail to: @resource.email, subject: I18n.t('devise.mailer.two_factor_disabled.subject') + end + end + + def two_factor_recovery_codes_changed(user, **) + @resource = user + @instance = Rails.configuration.x.local_domain + + return if @resource.disabled? + + I18n.with_locale(@resource.locale || I18n.default_locale) do + mail to: @resource.email, subject: I18n.t('devise.mailer.two_factor_recovery_codes_changed.subject') + end + end + def welcome(user) @resource = user @instance = Rails.configuration.x.local_domain diff --git a/app/models/form/challenge.rb b/app/models/form/challenge.rb new file mode 100644 index 000000000..40c99649c --- /dev/null +++ b/app/models/form/challenge.rb @@ -0,0 +1,8 @@ +# frozen_string_literal: true + +class Form::Challenge + include ActiveModel::Model + + attr_accessor :current_password, :current_username, + :return_to +end diff --git a/app/models/user.rb b/app/models/user.rb index 78b82a68f..b48455802 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -264,17 +264,20 @@ class User < ApplicationRecord end def password_required? - return false if Devise.pam_authentication || Devise.ldap_authentication + return false if external? + super end def send_reset_password_instructions - return false if encrypted_password.blank? && (Devise.pam_authentication || Devise.ldap_authentication) + return false if encrypted_password.blank? + super end def reset_password!(new_password, new_password_confirmation) - return false if encrypted_password.blank? && (Devise.pam_authentication || Devise.ldap_authentication) + return false if encrypted_password.blank? + super end diff --git a/app/views/auth/challenges/new.html.haml b/app/views/auth/challenges/new.html.haml new file mode 100644 index 000000000..9aef2c35d --- /dev/null +++ b/app/views/auth/challenges/new.html.haml @@ -0,0 +1,15 @@ +- content_for :page_title do + = t('challenge.prompt') + += simple_form_for @challenge, url: request.get? ? auth_challenge_path : '' do |f| + = f.input :return_to, as: :hidden + + .field-group + = f.input :current_password, wrapper: :with_block_label, input_html: { :autocomplete => 'off', :autofocus => true }, label: t('challenge.prompt'), required: true + + .actions + = f.button :button, t('challenge.confirm'), type: :submit + + %p.hint.subtle-hint= t('challenge.hint_html') + +.form-footer= render 'auth/shared/links' diff --git a/app/views/auth/shared/_links.html.haml b/app/views/auth/shared/_links.html.haml index e6c3f7cca..66ed5b93f 100644 --- a/app/views/auth/shared/_links.html.haml +++ b/app/views/auth/shared/_links.html.haml @@ -11,7 +11,7 @@ - if controller_name != 'passwords' && controller_name != 'registrations' %li= link_to t('auth.forgot_password'), new_user_password_path - - if controller_name != 'confirmations' + - if controller_name != 'confirmations' && (!user_signed_in? || !current_user.confirmed? || current_user.unconfirmed_email.present?) %li= link_to t('auth.didnt_get_confirmation'), new_user_confirmation_path - if user_signed_in? && controller_name != 'setup' diff --git a/app/views/settings/two_factor_authentications/show.html.haml b/app/views/settings/two_factor_authentications/show.html.haml index 93509e022..f1eecd000 100644 --- a/app/views/settings/two_factor_authentications/show.html.haml +++ b/app/views/settings/two_factor_authentications/show.html.haml @@ -2,33 +2,35 @@ = t('settings.two_factor_authentication') - if current_user.otp_required_for_login - %p.positive-hint - = fa_icon 'check' - = ' ' - = t 'two_factor_authentication.enabled' + %p.hint + %span.positive-hint + = fa_icon 'check' + = ' ' + = t 'two_factor_authentication.enabled' - %hr/ + %hr.spacer/ = simple_form_for @confirmation, url: settings_two_factor_authentication_path, method: :delete do |f| - = f.input :otp_attempt, wrapper: :with_label, hint: t('two_factor_authentication.code_hint'), label: t('simple_form.labels.defaults.otp_attempt'), input_html: { :autocomplete => 'off' }, required: true + .fields-group + = f.input :otp_attempt, wrapper: :with_block_label, hint: t('two_factor_authentication.code_hint'), label: t('simple_form.labels.defaults.otp_attempt'), input_html: { :autocomplete => 'off' }, required: true .actions - = f.button :button, t('two_factor_authentication.disable'), type: :submit + = f.button :button, t('two_factor_authentication.disable'), type: :submit, class: 'negative' - %hr/ + %hr.spacer/ - %h6= t('two_factor_authentication.recovery_codes') - %p.muted-hint - = t('two_factor_authentication.lost_recovery_codes') - = link_to t('two_factor_authentication.generate_recovery_codes'), - settings_two_factor_authentication_recovery_codes_path, - data: { method: :post } + %h3= t('two_factor_authentication.recovery_codes') + %p.muted-hint= t('two_factor_authentication.lost_recovery_codes') + + %hr.spacer/ + + .simple_form + = link_to t('two_factor_authentication.generate_recovery_codes'), settings_two_factor_authentication_recovery_codes_path, data: { method: :post }, class: 'block-button' - else .simple_form %p.hint= t('two_factor_authentication.description_html') - = link_to t('two_factor_authentication.setup'), - settings_two_factor_authentication_path, - data: { method: :post }, - class: 'block-button' + %hr.spacer/ + + = link_to t('two_factor_authentication.setup'), settings_two_factor_authentication_path, data: { method: :post }, class: 'block-button' diff --git a/app/views/user_mailer/two_factor_disabled.html.haml b/app/views/user_mailer/two_factor_disabled.html.haml new file mode 100644 index 000000000..651c6f940 --- /dev/null +++ b/app/views/user_mailer/two_factor_disabled.html.haml @@ -0,0 +1,43 @@ +%table.email-table{ cellspacing: 0, cellpadding: 0 } + %tbody + %tr + %td.email-body + .email-container + %table.content-section{ cellspacing: 0, cellpadding: 0 } + %tbody + %tr + %td.content-cell.hero + .email-row + .col-6 + %table.column{ cellspacing: 0, cellpadding: 0 } + %tbody + %tr + %td.column-cell.text-center.padded + %table.hero-icon.alert-icon{ align: 'center', cellspacing: 0, cellpadding: 0 } + %tbody + %tr + %td + = image_tag full_pack_url('media/images/mailer/icon_lock_open.png'), alt: '' + + %h1= t 'devise.mailer.two_factor_disabled.title' + %p.lead= t 'devise.mailer.two_factor_disabled.explanation' + +%table.email-table{ cellspacing: 0, cellpadding: 0 } + %tbody + %tr + %td.email-body + .email-container + %table.content-section{ cellspacing: 0, cellpadding: 0 } + %tbody + %tr + %td.content-cell.content-start + %table.column{ cellspacing: 0, cellpadding: 0 } + %tbody + %tr + %td.column-cell.button-cell + %table.button{ align: 'center', cellspacing: 0, cellpadding: 0 } + %tbody + %tr + %td.button-primary + = link_to edit_user_registration_url do + %span= t('settings.account_settings') diff --git a/app/views/user_mailer/two_factor_disabled.text.erb b/app/views/user_mailer/two_factor_disabled.text.erb new file mode 100644 index 000000000..73be1ddc2 --- /dev/null +++ b/app/views/user_mailer/two_factor_disabled.text.erb @@ -0,0 +1,7 @@ +<%= t 'devise.mailer.two_factor_disabled.title' %> + +=== + +<%= t 'devise.mailer.two_factor_disabled.explanation' %> + +=> <%= edit_user_registration_url %> diff --git a/app/views/user_mailer/two_factor_enabled.html.haml b/app/views/user_mailer/two_factor_enabled.html.haml new file mode 100644 index 000000000..fc31bd979 --- /dev/null +++ b/app/views/user_mailer/two_factor_enabled.html.haml @@ -0,0 +1,43 @@ +%table.email-table{ cellspacing: 0, cellpadding: 0 } + %tbody + %tr + %td.email-body + .email-container + %table.content-section{ cellspacing: 0, cellpadding: 0 } + %tbody + %tr + %td.content-cell.hero + .email-row + .col-6 + %table.column{ cellspacing: 0, cellpadding: 0 } + %tbody + %tr + %td.column-cell.text-center.padded + %table.hero-icon{ align: 'center', cellspacing: 0, cellpadding: 0 } + %tbody + %tr + %td + = image_tag full_pack_url('media/images/mailer/icon_lock_open.png'), alt: '' + + %h1= t 'devise.mailer.two_factor_enabled.title' + %p.lead= t 'devise.mailer.two_factor_enabled.explanation' + +%table.email-table{ cellspacing: 0, cellpadding: 0 } + %tbody + %tr + %td.email-body + .email-container + %table.content-section{ cellspacing: 0, cellpadding: 0 } + %tbody + %tr + %td.content-cell.content-start + %table.column{ cellspacing: 0, cellpadding: 0 } + %tbody + %tr + %td.column-cell.button-cell + %table.button{ align: 'center', cellspacing: 0, cellpadding: 0 } + %tbody + %tr + %td.button-primary + = link_to edit_user_registration_url do + %span= t('settings.account_settings') diff --git a/app/views/user_mailer/two_factor_enabled.text.erb b/app/views/user_mailer/two_factor_enabled.text.erb new file mode 100644 index 000000000..4319dddbf --- /dev/null +++ b/app/views/user_mailer/two_factor_enabled.text.erb @@ -0,0 +1,7 @@ +<%= t 'devise.mailer.two_factor_enabled.title' %> + +=== + +<%= t 'devise.mailer.two_factor_enabled.explanation' %> + +=> <%= edit_user_registration_url %> diff --git a/app/views/user_mailer/two_factor_recovery_codes_changed.html.haml b/app/views/user_mailer/two_factor_recovery_codes_changed.html.haml new file mode 100644 index 000000000..833708868 --- /dev/null +++ b/app/views/user_mailer/two_factor_recovery_codes_changed.html.haml @@ -0,0 +1,43 @@ +%table.email-table{ cellspacing: 0, cellpadding: 0 } + %tbody + %tr + %td.email-body + .email-container + %table.content-section{ cellspacing: 0, cellpadding: 0 } + %tbody + %tr + %td.content-cell.hero + .email-row + .col-6 + %table.column{ cellspacing: 0, cellpadding: 0 } + %tbody + %tr + %td.column-cell.text-center.padded + %table.hero-icon.alert-icon{ align: 'center', cellspacing: 0, cellpadding: 0 } + %tbody + %tr + %td + = image_tag full_pack_url('media/images/mailer/icon_lock_open.png'), alt: '' + + %h1= t 'devise.mailer.two_factor_recovery_codes_changed.title' + %p.lead= t 'devise.mailer.two_factor_recovery_codes_changed.explanation' + +%table.email-table{ cellspacing: 0, cellpadding: 0 } + %tbody + %tr + %td.email-body + .email-container + %table.content-section{ cellspacing: 0, cellpadding: 0 } + %tbody + %tr + %td.content-cell.content-start + %table.column{ cellspacing: 0, cellpadding: 0 } + %tbody + %tr + %td.column-cell.button-cell + %table.button{ align: 'center', cellspacing: 0, cellpadding: 0 } + %tbody + %tr + %td.button-primary + = link_to edit_user_registration_url do + %span= t('settings.account_settings') diff --git a/app/views/user_mailer/two_factor_recovery_codes_changed.text.erb b/app/views/user_mailer/two_factor_recovery_codes_changed.text.erb new file mode 100644 index 000000000..6ed12fc08 --- /dev/null +++ b/app/views/user_mailer/two_factor_recovery_codes_changed.text.erb @@ -0,0 +1,7 @@ +<%= t 'devise.mailer.two_factor_recovery_codes_changed.title' %> + +=== + +<%= t 'devise.mailer.two_factor_recovery_codes_changed.explanation' %> + +=> <%= edit_user_registration_url %> diff --git a/config/locales/devise.en.yml b/config/locales/devise.en.yml index 5defa6624..726d2426a 100644 --- a/config/locales/devise.en.yml +++ b/config/locales/devise.en.yml @@ -46,6 +46,18 @@ en: extra: If you didn't request this, please ignore this email. Your password won't change until you access the link above and create a new one. subject: 'Mastodon: Reset password instructions' title: Password reset + two_factor_disabled: + explanation: Two-factor authentication for your account has been disabled. Login is now possible using only e-mail address and password. + subject: 'Mastodon: Two-factor authentication disabled' + title: 2FA disabled + two_factor_enabled: + explanation: Two-factor authentication has been enabled for your account. A token generated by the paired TOTP app will be required for login. + subject: 'Mastodon: Two-factor authentication enabled' + 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' + title: 2FA recovery codes changed unlock_instructions: subject: 'Mastodon: Unlock instructions' omniauth_callbacks: diff --git a/config/locales/en.yml b/config/locales/en.yml index f05fdd48b..da06b0e51 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -621,6 +621,11 @@ en: return: Show the user's profile web: Go to web title: Follow %{acct} + challenge: + confirm: Continue + hint_html: "Tip: We won't ask you for your password again for the next hour." + invalid_password: Invalid password + prompt: Confirm password to continue datetime: distance_in_words: about_x_hours: "%{count}h" diff --git a/config/locales/simple_form.en.yml b/config/locales/simple_form.en.yml index c542377a9..c9ffcfc13 100644 --- a/config/locales/simple_form.en.yml +++ b/config/locales/simple_form.en.yml @@ -43,6 +43,8 @@ en: domain: This domain will be able to fetch data from this server and incoming data from it will be processed and stored featured_tag: name: 'You might want to use one of these:' + form_challenge: + current_password: You are entering a secure area imports: data: CSV file exported from another Mastodon server invite_request: diff --git a/config/routes.rb b/config/routes.rb index a4dee2842..9ad1ea65d 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -41,6 +41,7 @@ Rails.application.routes.draw do namespace :auth do resource :setup, only: [:show, :update], controller: :setup + resource :challenge, only: [:create], controller: :challenges end end diff --git a/spec/controllers/auth/challenges_controller_spec.rb b/spec/controllers/auth/challenges_controller_spec.rb new file mode 100644 index 000000000..2a6ca301e --- /dev/null +++ b/spec/controllers/auth/challenges_controller_spec.rb @@ -0,0 +1,46 @@ +# frozen_string_literal: true + +require 'rails_helper' + +describe Auth::ChallengesController, type: :controller do + render_views + + let(:password) { 'foobar12345' } + let(:user) { Fabricate(:user, password: password) } + + before do + sign_in user + end + + describe 'POST #create' do + let(:return_to) { edit_user_registration_path } + + context 'with correct password' do + before { post :create, params: { form_challenge: { return_to: return_to, current_password: password } } } + + it 'redirects back' do + expect(response).to redirect_to(return_to) + end + + it 'sets session' do + expect(session[:challenge_passed_at]).to_not be_nil + end + end + + context 'with incorrect password' do + before { post :create, params: { form_challenge: { return_to: return_to, current_password: 'hhfggjjd562' } } } + + it 'renders challenge' do + expect(response).to render_template('auth/challenges/new') + end + + it 'displays error' do + expect(response.body).to include 'Invalid password' + end + + it 'does not set session' do + expect(session[:challenge_passed_at]).to be_nil + end + end + end +end diff --git a/spec/controllers/auth/sessions_controller_spec.rb b/spec/controllers/auth/sessions_controller_spec.rb index 7ed5edde0..1950c173a 100644 --- a/spec/controllers/auth/sessions_controller_spec.rb +++ b/spec/controllers/auth/sessions_controller_spec.rb @@ -80,7 +80,7 @@ RSpec.describe Auth::SessionsController, type: :controller do let(:user) do account = Fabricate.build(:account, username: 'pam_user1') account.save!(validate: false) - user = Fabricate(:user, email: 'pam@example.com', password: nil, account: account) + user = Fabricate(:user, email: 'pam@example.com', password: nil, account: account, external: true) user end diff --git a/spec/controllers/concerns/challengable_concern_spec.rb b/spec/controllers/concerns/challengable_concern_spec.rb new file mode 100644 index 000000000..4db3b740d --- /dev/null +++ b/spec/controllers/concerns/challengable_concern_spec.rb @@ -0,0 +1,114 @@ +# frozen_string_literal: true + +require 'rails_helper' + +RSpec.describe ChallengableConcern, type: :controller do + controller(ApplicationController) do + include ChallengableConcern + + before_action :require_challenge! + + def foo + render plain: 'foo' + end + + def bar + render plain: 'bar' + end + end + + before do + routes.draw do + get 'foo' => 'anonymous#foo' + post 'bar' => 'anonymous#bar' + end + end + + context 'with a no-password user' do + let(:user) { Fabricate(:user, external: true, password: nil) } + + before do + sign_in user + end + + context 'for GET requests' do + before { get :foo } + + it 'does not ask for password' do + expect(response.body).to eq 'foo' + end + end + + context 'for POST requests' do + before { post :bar } + + it 'does not ask for password' do + expect(response.body).to eq 'bar' + end + end + end + + context 'with recent challenge in session' do + let(:password) { 'foobar12345' } + let(:user) { Fabricate(:user, password: password) } + + before do + sign_in user + end + + context 'for GET requests' do + before { get :foo, session: { challenge_passed_at: Time.now.utc } } + + it 'does not ask for password' do + expect(response.body).to eq 'foo' + end + end + + context 'for POST requests' do + before { post :bar, session: { challenge_passed_at: Time.now.utc } } + + it 'does not ask for password' do + expect(response.body).to eq 'bar' + end + end + end + + context 'with a password user' do + let(:password) { 'foobar12345' } + let(:user) { Fabricate(:user, password: password) } + + before do + sign_in user + end + + context 'for GET requests' do + before { get :foo } + + it 'renders challenge' do + expect(response).to render_template('auth/challenges/new') + end + + # See Auth::ChallengesControllerSpec + end + + context 'for POST requests' do + before { post :bar } + + it 'renders challenge' do + expect(response).to render_template('auth/challenges/new') + end + + it 'accepts correct password' do + post :bar, params: { form_challenge: { current_password: password } } + expect(response.body).to eq 'bar' + expect(session[:challenge_passed_at]).to_not be_nil + end + + it 'rejects wrong password' do + post :bar, params: { form_challenge: { current_password: 'dddfff888123' } } + expect(response.body).to render_template('auth/challenges/new') + expect(session[:challenge_passed_at]).to be_nil + end + end + end +end diff --git a/spec/controllers/settings/two_factor_authentication/confirmations_controller_spec.rb b/spec/controllers/settings/two_factor_authentication/confirmations_controller_spec.rb index 2e5a9325c..336f13127 100644 --- a/spec/controllers/settings/two_factor_authentication/confirmations_controller_spec.rb +++ b/spec/controllers/settings/two_factor_authentication/confirmations_controller_spec.rb @@ -24,7 +24,7 @@ describe Settings::TwoFactorAuthentication::ConfirmationsController do context 'when signed in' do subject do sign_in user, scope: :user - get :new + get :new, session: { challenge_passed_at: Time.now.utc } end include_examples 'renders :new' @@ -37,7 +37,7 @@ describe Settings::TwoFactorAuthentication::ConfirmationsController do it 'redirects if user do not have otp_secret' do sign_in user_without_otp_secret, scope: :user - get :new + get :new, session: { challenge_passed_at: Time.now.utc } expect(response).to redirect_to('/settings/two_factor_authentication') end end @@ -50,7 +50,7 @@ describe Settings::TwoFactorAuthentication::ConfirmationsController do describe 'when form_two_factor_confirmation parameter is not provided' do it 'raises ActionController::ParameterMissing' do - post :create, params: {} + post :create, params: {}, session: { challenge_passed_at: Time.now.utc } expect(response).to have_http_status(400) end end @@ -68,7 +68,7 @@ describe Settings::TwoFactorAuthentication::ConfirmationsController do true end - post :create, params: { form_two_factor_confirmation: { otp_attempt: '123456' } } + post :create, params: { form_two_factor_confirmation: { otp_attempt: '123456' } }, session: { challenge_passed_at: Time.now.utc } expect(assigns(:recovery_codes)).to eq otp_backup_codes expect(flash[:notice]).to eq 'Two-factor authentication successfully enabled' @@ -85,7 +85,7 @@ describe Settings::TwoFactorAuthentication::ConfirmationsController do false end - post :create, params: { form_two_factor_confirmation: { otp_attempt: '123456' } } + post :create, params: { form_two_factor_confirmation: { otp_attempt: '123456' } }, session: { challenge_passed_at: Time.now.utc } end it 'renders the new view' do diff --git a/spec/controllers/settings/two_factor_authentication/recovery_codes_controller_spec.rb b/spec/controllers/settings/two_factor_authentication/recovery_codes_controller_spec.rb index c04760e53..630cec428 100644 --- a/spec/controllers/settings/two_factor_authentication/recovery_codes_controller_spec.rb +++ b/spec/controllers/settings/two_factor_authentication/recovery_codes_controller_spec.rb @@ -15,7 +15,7 @@ describe Settings::TwoFactorAuthentication::RecoveryCodesController do end sign_in user, scope: :user - post :create + post :create, session: { challenge_passed_at: Time.now.utc } expect(assigns(:recovery_codes)).to eq otp_backup_codes expect(flash[:notice]).to eq 'Recovery codes successfully regenerated' diff --git a/spec/controllers/settings/two_factor_authentications_controller_spec.rb b/spec/controllers/settings/two_factor_authentications_controller_spec.rb index 922231ded..9df9763fd 100644 --- a/spec/controllers/settings/two_factor_authentications_controller_spec.rb +++ b/spec/controllers/settings/two_factor_authentications_controller_spec.rb @@ -58,7 +58,7 @@ describe Settings::TwoFactorAuthenticationsController do describe 'when creation succeeds' do it 'updates user secret' do before = user.otp_secret - post :create + post :create, session: { challenge_passed_at: Time.now.utc } expect(user.reload.otp_secret).not_to eq(before) expect(response).to redirect_to(new_settings_two_factor_authentication_confirmation_path) diff --git a/spec/mailers/previews/user_mailer_preview.rb b/spec/mailers/previews/user_mailer_preview.rb index ead3b3baa..464f177d0 100644 --- a/spec/mailers/previews/user_mailer_preview.rb +++ b/spec/mailers/previews/user_mailer_preview.rb @@ -18,6 +18,21 @@ class UserMailerPreview < ActionMailer::Preview UserMailer.password_change(User.first) end + # Preview this email at http://localhost:3000/rails/mailers/user_mailer/two_factor_disabled + def two_factor_disabled + UserMailer.two_factor_disabled(User.first) + end + + # Preview this email at http://localhost:3000/rails/mailers/user_mailer/two_factor_enabled + def two_factor_enabled + UserMailer.two_factor_enabled(User.first) + end + + # Preview this email at http://localhost:3000/rails/mailers/user_mailer/two_factor_recovery_codes_changed + def two_factor_recovery_codes_changed + UserMailer.two_factor_recovery_codes_changed(User.first) + end + # Preview this email at http://localhost:3000/rails/mailers/user_mailer/reconfirmation_instructions def reconfirmation_instructions user = User.first From d930eb88b671fa6e5573fe7342bcdda87501bdb7 Mon Sep 17 00:00:00 2001 From: Eugen Rochko Date: Thu, 19 Sep 2019 11:09:05 +0200 Subject: [PATCH 112/134] Add table of contents to about page (#11885) Move public domain blocks information to about page --- app/controllers/about_controller.rb | 43 ++--- app/javascript/styles/mastodon/about.scss | 150 ++++++++---------- .../styles/mastodon/containers.scss | 62 ++++++++ app/javascript/styles/mastodon/widgets.scss | 83 +++++++--- app/lib/toc_generator.rb | 69 ++++++++ app/models/domain_block.rb | 1 + app/views/about/blocks.html.haml | 48 ------ app/views/about/more.html.haml | 59 +++++-- config/locales/en.yml | 27 +--- config/routes.rb | 1 - 10 files changed, 328 insertions(+), 215 deletions(-) create mode 100644 app/lib/toc_generator.rb delete mode 100644 app/views/about/blocks.html.haml diff --git a/app/controllers/about_controller.rb b/app/controllers/about_controller.rb index 5e942e5c0..abd1ec0cb 100644 --- a/app/controllers/about_controller.rb +++ b/app/controllers/about_controller.rb @@ -3,9 +3,7 @@ class AboutController < ApplicationController layout 'public' - before_action :require_open_federation!, only: [:show, :more, :blocks] - before_action :check_blocklist_enabled, only: [:blocks] - before_action :authenticate_user!, only: [:blocks], if: :blocklist_account_required? + before_action :require_open_federation!, only: [:show, :more] before_action :set_body_classes, only: :show before_action :set_instance_presenter before_action :set_expires_in, only: [:show, :more, :terms] @@ -16,15 +14,20 @@ class AboutController < ApplicationController def more flash.now[:notice] = I18n.t('about.instance_actor_flash') if params[:instance_actor] + + toc_generator = TOCGenerator.new(@instance_presenter.site_extended_description) + + @contents = toc_generator.html + @table_of_contents = toc_generator.toc + @blocks = DomainBlock.with_user_facing_limitations.by_severity if display_blocks? end def terms; end - def blocks - @show_rationale = Setting.show_domain_blocks_rationale == 'all' - @show_rationale |= Setting.show_domain_blocks_rationale == 'users' && !current_user.nil? && current_user.functional? - @blocks = DomainBlock.with_user_facing_limitations.order('(CASE severity WHEN 0 THEN 1 WHEN 1 THEN 2 WHEN 2 THEN 0 END), reject_media, domain').to_a - end + helper_method :display_blocks? + helper_method :display_blocks_rationale? + helper_method :public_fetch_mode? + helper_method :new_user private @@ -32,28 +35,14 @@ class AboutController < ApplicationController not_found if whitelist_mode? end - def check_blocklist_enabled - not_found if Setting.show_domain_blocks == 'disabled' + def display_blocks? + Setting.show_domain_blocks == 'all' || (Setting.show_domain_blocks == 'users' && user_signed_in?) end - def blocklist_account_required? - Setting.show_domain_blocks == 'users' + def display_blocks_rationale? + Setting.show_domain_blocks_rationale == 'all' || (Setting.show_domain_blocks_rationale == 'users' && user_signed_in?) end - def block_severity_text(block) - if block.severity == 'suspend' - I18n.t('domain_blocks.suspension') - else - limitations = [] - limitations << I18n.t('domain_blocks.media_block') if block.reject_media? - limitations << I18n.t('domain_blocks.silence') if block.severity == 'silence' - limitations.join(', ') - end - end - - helper_method :block_severity_text - helper_method :public_fetch_mode? - def new_user User.new.tap do |user| user.build_account @@ -61,8 +50,6 @@ class AboutController < ApplicationController end end - helper_method :new_user - def set_instance_presenter @instance_presenter = InstancePresenter.new end diff --git a/app/javascript/styles/mastodon/about.scss b/app/javascript/styles/mastodon/about.scss index 61637ce96..c056ef85d 100644 --- a/app/javascript/styles/mastodon/about.scss +++ b/app/javascript/styles/mastodon/about.scss @@ -17,117 +17,86 @@ $small-breakpoint: 960px; .rich-formatting { font-family: $font-sans-serif, sans-serif; - font-size: 16px; + font-size: 14px; font-weight: 400; - font-size: 16px; - line-height: 30px; + line-height: 1.7; + word-wrap: break-word; color: $darker-text-color; - padding-right: 10px; a { color: $highlight-text-color; text-decoration: underline; + + &:hover, + &:focus, + &:active { + text-decoration: none; + } } p, li { - font-family: $font-sans-serif, sans-serif; - font-size: 16px; - font-weight: 400; - font-size: 16px; - line-height: 30px; - margin-bottom: 12px; color: $darker-text-color; + } - a { - color: $highlight-text-color; - text-decoration: underline; - } + p { + margin-top: 0; + margin-bottom: .85em; &:last-child { margin-bottom: 0; } } - strong, - em { + strong { font-weight: 700; - color: lighten($darker-text-color, 10%); + color: $secondary-text-color; + } + + em { + font-style: italic; + color: $secondary-text-color; + } + + code { + font-size: 0.85em; + background: darken($ui-base-color, 8%); + border-radius: 4px; + padding: 0.2em 0.3em; + } + + h1, + h2, + h3, + h4, + h5, + h6 { + font-family: $font-display, sans-serif; + margin-top: 1.275em; + margin-bottom: .85em; + font-weight: 500; + color: $secondary-text-color; } h1 { - font-family: $font-display, sans-serif; - font-size: 26px; - line-height: 30px; - font-weight: 500; - margin-bottom: 20px; - color: $secondary-text-color; - - small { - font-family: $font-sans-serif, sans-serif; - display: block; - font-size: 18px; - font-weight: 400; - color: lighten($darker-text-color, 10%); - } + font-size: 2em; } h2 { - font-family: $font-display, sans-serif; - font-size: 22px; - line-height: 26px; - font-weight: 500; - margin-bottom: 20px; - color: $secondary-text-color; + font-size: 1.75em; } h3 { - font-family: $font-display, sans-serif; - font-size: 18px; - line-height: 24px; - font-weight: 500; - margin-bottom: 20px; - color: $secondary-text-color; + font-size: 1.5em; } h4 { - font-family: $font-display, sans-serif; - font-size: 16px; - line-height: 24px; - font-weight: 500; - margin-bottom: 20px; - color: $secondary-text-color; - } - - h5 { - font-family: $font-display, sans-serif; - font-size: 14px; - line-height: 24px; - font-weight: 500; - margin-bottom: 20px; - color: $secondary-text-color; + font-size: 1.25em; } + h5, h6 { - font-family: $font-display, sans-serif; - font-size: 12px; - line-height: 24px; - font-weight: 500; - margin-bottom: 20px; - color: $secondary-text-color; - } - - ul, - ol { - margin-left: 20px; - - &[type='a'] { - list-style-type: lower-alpha; - } - - &[type='i'] { - list-style-type: lower-roman; - } + font-size: 1em; } ul { @@ -138,23 +107,38 @@ $small-breakpoint: 960px; list-style: decimal; } - li > ol, - li > ul { - margin-top: 6px; + ul, + ol { + margin: 0; + padding: 0; + padding-left: 2em; + margin-bottom: 0.85em; + + &[type='a'] { + list-style-type: lower-alpha; + } + + &[type='i'] { + list-style-type: lower-roman; + } } hr { width: 100%; height: 0; border: 0; - border-bottom: 1px solid rgba($ui-base-lighter-color, .6); - margin: 20px 0; + border-bottom: 1px solid lighten($ui-base-color, 4%); + margin: 1.7em 0; &.spacer { height: 1px; border: 0; } } + + & > :first-child { + margin-top: 0; + } } .information-board { @@ -416,7 +400,7 @@ $small-breakpoint: 960px; } &__call-to-action { - background: darken($ui-base-color, 4%); + background: $ui-base-color; border-radius: 4px; padding: 25px 40px; overflow: hidden; diff --git a/app/javascript/styles/mastodon/containers.scss b/app/javascript/styles/mastodon/containers.scss index aa45c0174..24bbf8211 100644 --- a/app/javascript/styles/mastodon/containers.scss +++ b/app/javascript/styles/mastodon/containers.scss @@ -141,6 +141,63 @@ grid-row: 3; } + @media screen and (max-width: $no-gap-breakpoint) { + grid-gap: 0; + grid-template-columns: minmax(0, 100%); + + .column-0 { + grid-column: 1; + } + + .column-1 { + grid-column: 1; + grid-row: 3; + } + + .column-2 { + grid-column: 1; + grid-row: 2; + } + + .column-3 { + grid-column: 1; + grid-row: 4; + } + } +} + +.grid-4 { + display: grid; + grid-gap: 10px; + grid-template-columns: 1fr 1fr 1fr 1fr; + grid-auto-columns: 25%; + grid-auto-rows: max-content; + + .column-0 { + grid-column: 1 / 5; + grid-row: 1; + } + + .column-1 { + grid-column: 1 / 4; + grid-row: 2; + } + + .column-2 { + grid-column: 4; + grid-row: 2; + } + + .column-3 { + grid-column: 2 / 5; + grid-row: 3; + } + + .column-4 { + grid-column: 1; + grid-row: 3; + } + .landing-page__call-to-action { min-height: 100%; } @@ -189,6 +246,11 @@ } .column-3 { + grid-column: 1; + grid-row: 5; + } + + .column-4 { grid-column: 1; grid-row: 4; } diff --git a/app/javascript/styles/mastodon/widgets.scss b/app/javascript/styles/mastodon/widgets.scss index 04beb869c..ca050a8d9 100644 --- a/app/javascript/styles/mastodon/widgets.scss +++ b/app/javascript/styles/mastodon/widgets.scss @@ -128,41 +128,43 @@ margin-bottom: 10px; } -.contact-widget, -.landing-page__information.contact-widget { - box-sizing: border-box; - padding: 20px; - min-height: 100%; - border-radius: 4px; - background: $ui-base-color; - box-shadow: 0 0 15px rgba($base-shadow-color, 0.2); -} - .contact-widget { + min-height: 100%; font-size: 15px; color: $darker-text-color; line-height: 20px; word-wrap: break-word; font-weight: 400; + padding: 0; - strong { - font-weight: 500; + h4 { + padding: 10px; + text-transform: uppercase; + font-weight: 700; + font-size: 13px; + color: $darker-text-color; } - p { - margin-bottom: 10px; - - &:last-child { - margin-bottom: 0; - } + .account { + border-bottom: 0; + padding: 10px 0; + padding-top: 5px; } - &__mail { - margin-top: 10px; + & > a { + display: inline-block; + padding: 10px; + padding-top: 0; + color: $darker-text-color; + text-decoration: none; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; - a { - color: $primary-text-color; - text-decoration: none; + &:hover, + &:focus, + &:active { + text-decoration: underline; } } } @@ -562,3 +564,38 @@ $fluid-breakpoint: $maximum-width + 20px; } } } + +.table-of-contents { + background: darken($ui-base-color, 4%); + min-height: 100%; + font-size: 14px; + border-radius: 4px; + + li a { + display: block; + font-weight: 500; + padding: 15px; + overflow: hidden; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + text-decoration: none; + color: $primary-text-color; + border-bottom: 1px solid lighten($ui-base-color, 4%); + + &:hover, + &:focus, + &:active { + text-decoration: underline; + } + } + + li:last-child a { + border-bottom: 0; + } + + li ul { + padding-left: 20px; + border-bottom: 1px solid lighten($ui-base-color, 4%); + } +} diff --git a/app/lib/toc_generator.rb b/app/lib/toc_generator.rb new file mode 100644 index 000000000..c6e179557 --- /dev/null +++ b/app/lib/toc_generator.rb @@ -0,0 +1,69 @@ +# frozen_string_literal: true + +class TOCGenerator + TARGET_ELEMENTS = %w(h1 h2 h3 h4 h5 h6).freeze + LISTED_ELEMENTS = %w(h2 h3).freeze + + class Section + attr_accessor :depth, :title, :children, :anchor + + def initialize(depth, title, anchor) + @depth = depth + @title = title + @children = [] + @anchor = anchor + end + + delegate :<<, to: :children + end + + def initialize(source_html) + @source_html = source_html + @processed = false + @target_html = '' + @headers = [] + @slugs = Hash.new { |h, k| h[k] = 0 } + end + + def html + parse_and_transform unless @processed + @target_html + end + + def toc + parse_and_transform unless @processed + @headers + end + + private + + def parse_and_transform + return if @source_html.blank? + + parsed_html = Nokogiri::HTML.fragment(@source_html) + + parsed_html.traverse do |node| + next unless TARGET_ELEMENTS.include?(node.name) + + anchor = node.text.parameterize + @slugs[anchor] += 1 + anchor = "#{anchor}-#{@slugs[anchor]}" if @slugs[anchor] > 1 + + node['id'] = anchor + + next unless LISTED_ELEMENTS.include?(node.name) + + depth = node.name[1..-1] + latest_section = @headers.last + + if latest_section.nil? || latest_section.depth >= depth + @headers << Section.new(depth, node.text, anchor) + else + latest_section << Section.new(depth, node.text, anchor) + end + end + + @target_html = parsed_html.to_s + @processed = true + end +end diff --git a/app/models/domain_block.rb b/app/models/domain_block.rb index 4383cbd05..4e865b850 100644 --- a/app/models/domain_block.rb +++ b/app/models/domain_block.rb @@ -26,6 +26,7 @@ class DomainBlock < ApplicationRecord scope :matches_domain, ->(value) { where(arel_table[:domain].matches("%#{value}%")) } scope :with_user_facing_limitations, -> { where(severity: [:silence, :suspend]).or(where(reject_media: true)) } + scope :by_severity, -> { order(Arel.sql('(CASE severity WHEN 0 THEN 1 WHEN 1 THEN 2 WHEN 2 THEN 0 END), reject_media, domain')) } class << self def suspend?(domain) diff --git a/app/views/about/blocks.html.haml b/app/views/about/blocks.html.haml deleted file mode 100644 index a81a4d1eb..000000000 --- a/app/views/about/blocks.html.haml +++ /dev/null @@ -1,48 +0,0 @@ -- content_for :page_title do - = t('domain_blocks.title', instance: site_hostname) - -.grid - .column-0 - .box-widget.rich-formatting - %h2= t('domain_blocks.blocked_domains') - %p= t('domain_blocks.description', instance: site_hostname) - .table-wrapper - %table.blocks-table - %thead - %tr - %th= t('domain_blocks.domain') - %th.severity-column= t('domain_blocks.severity') - - if @show_rationale - %th.button-column - %tbody - - if @blocks.empty? - %tr - %td{ colspan: @show_rationale ? 3 : 2 }= t('domain_blocks.no_domain_blocks') - - else - - @blocks.each_with_index do |block, i| - %tr{ class: i % 2 == 0 ? 'even': nil } - %td{ title: block.domain }= block.domain - %td= block_severity_text(block) - - if @show_rationale - %td - - if block.public_comment.present? - %button.icon-button{ title: t('domain_blocks.show_rationale'), 'aria-label' => t('domain_blocks.show_rationale') } - = fa_icon 'chevron-down fw', 'aria-hidden' => true - - if @show_rationale - - if block.public_comment.present? - %tr.rationale.hidden - %td{ colspan: 3 }= block.public_comment.presence - %h2= t('domain_blocks.severity_legend.title') - - if @blocks.any? { |block| block.reject_media? } - %h3= t('domain_blocks.media_block') - %p= t('domain_blocks.severity_legend.media_block') - - if @blocks.any? { |block| block.severity == 'silence' } - %h3= t('domain_blocks.silence') - %p= t('domain_blocks.severity_legend.silence') - - if @blocks.any? { |block| block.severity == 'suspend' } - %h3= t('domain_blocks.suspension') - %p= t('domain_blocks.severity_legend.suspension') - - if public_fetch_mode? - %p= t('domain_blocks.severity_legend.suspension_disclaimer') - .column-1 - = render 'application/sidebar' diff --git a/app/views/about/more.html.haml b/app/views/about/more.html.haml index 21431ef8e..4b3035ee8 100644 --- a/app/views/about/more.html.haml +++ b/app/views/about/more.html.haml @@ -5,7 +5,7 @@ = javascript_pack_tag 'public', integrity: true, crossorigin: 'anonymous' = render partial: 'shared/og' -.grid-3 +.grid-4 .column-0 .public-account-header.public-account-header--no-bar .public-account-header__image @@ -28,22 +28,57 @@ = image_tag @instance_presenter.mascot&.file&.url || asset_pack_path('media/images/elephant_ui_plane.svg'), alt: '' .column-2 - .landing-page__information.contact-widget - %p - %strong= t 'about.administered_by' + .contact-widget + %h4= t 'about.administered_by' = account_link_to(@instance_presenter.contact_account) - if @instance_presenter.site_contact_email.present? - %p.contact-widget__mail - %strong - = succeed ':' do - = t 'about.contact' - %br/ - = mail_to @instance_presenter.site_contact_email, nil, title: @instance_presenter.site_contact_email + %h4 + = succeed ':' do + = t 'about.contact' + + = mail_to @instance_presenter.site_contact_email, nil, title: @instance_presenter.site_contact_email .column-3 = render 'application/flashes' - .box-widget - .rich-formatting= @instance_presenter.site_extended_description.html_safe.presence || t('about.extended_description_html') + - if @contents.blank? && (!display_blocks? || @blocks&.empty?) + = nothing_here + - else + .box-widget + .rich-formatting + = @contents.html_safe + + - if display_blocks? && !@blocks.empty? + %h2#unavailable-content= t('about.unavailable_content') + + %p= t('about.unavailable_content_html') + + - @blocks.each do |domain_block| + %p + %strong= "#{domain_block.domain}:" + + - if domain_block.suspend? + = t('about.unavailable_content_description.suspended') + - else + = t('about.unavailable_content_description.silenced') if domain_block.silence? + = t('about.unavailable_content_description.rejecting_media') if domain_block.reject_media? + + - if display_blocks_rationale? + %strong= t('about.unavailable_content_description.reason') + = domain_block.public_comment + + .column-4 + %ul.table-of-contents + - @table_of_contents.each do |item| + %li + = link_to item.title, "##{item.anchor}" + + - unless item.children.empty? + %ul + - item.children.each do |sub_item| + %li= link_to sub_item.title, "##{sub_item.anchor}" + + - if display_blocks? && !@blocks.empty? + %li= link_to t('about.unavailable_content'), '#unavailable-content' diff --git a/config/locales/en.yml b/config/locales/en.yml index da06b0e51..dabb679e7 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -17,9 +17,6 @@ en: contact_unavailable: N/A discover_users: Discover users documentation: Documentation - extended_description_html: | -

A good place for rules

-

The extended description has not been set up yet.

federation_hint_html: With an account on %{instance} you'll be able to follow people on any Mastodon server and beyond. generic_description: "%{domain} is one server in the network" get_apps: Try a mobile app @@ -38,6 +35,13 @@ en: status_count_before: Who authored tagline: Follow friends and discover new ones terms: Terms of service + unavailable_content: Unavailable content + unavailable_content_description: + reason: 'Reason:' + rejecting_media: Media files from this server will not be processed and and no thumbnails will be displayed, requiring manual click-through to the other server. + silenced: Posts from this server will not show up anywhere except your home feed if you follow the author. + suspended: You won't be able to follow anyone from this server, and no data from it will be processed or stored, and no data exchanged. + unavailable_content_html: Mastodon generally allows you to view content from and interact with users from any other server in the fediverse. These are the exceptions that have been made on this particular server. user_count_after: one: user other: users @@ -661,23 +665,6 @@ en: directory: Profile directory explanation: Discover users based on their interests explore_mastodon: Explore %{title} - domain_blocks: - blocked_domains: List of limited and blocked domains - description: This is the list of servers that %{instance} limits or reject federation with. - domain: Domain - media_block: Media block - no_domain_blocks: "(No domain blocks)" - severity: Severity - severity_legend: - media_block: Media files coming from the server are neither fetched, stored, or displayed to the user. - silence: Accounts from silenced servers can be found, followed and interacted with, but their toots will not appear in the public timelines, and notifications from them will not reach local users who are not following them. - suspension: No content from suspended servers is stored or displayed, nor is any content sent to them. Interactions from suspended servers are ignored. - suspension_disclaimer: Suspended servers may occasionally retrieve public content from this server. - title: Severities - show_rationale: Show rationale - silence: Silence - suspension: Suspension - title: "%{instance} List of blocked instances" domain_validator: invalid_domain: is not a valid domain name errors: diff --git a/config/routes.rb b/config/routes.rb index 9ad1ea65d..dcfa079a0 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -441,7 +441,6 @@ Rails.application.routes.draw do get '/about', to: 'about#show' get '/about/more', to: 'about#more' - get '/about/blocks', to: 'about#blocks' get '/terms', to: 'about#terms' match '/', via: [:post, :put, :patch, :delete], to: 'application#raise_not_found', format: false From 5ded2de3a08d606057314cc094a4585fb0784e72 Mon Sep 17 00:00:00 2001 From: tsia Date: Thu, 19 Sep 2019 13:24:50 +0200 Subject: [PATCH 113/134] fix rss enclosure length (#11889) --- app/serializers/rss/account_serializer.rb | 2 +- app/serializers/rss/tag_serializer.rb | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/app/serializers/rss/account_serializer.rb b/app/serializers/rss/account_serializer.rb index 680d9de6f..e39b2b372 100644 --- a/app/serializers/rss/account_serializer.rb +++ b/app/serializers/rss/account_serializer.rb @@ -25,7 +25,7 @@ class RSS::AccountSerializer .description(status.spoiler_text.presence || Formatter.instance.format(status, inline_poll_options: true).to_str) status.media_attachments.each do |media| - item.enclosure(full_asset_url(media.file.url(:original, false)), media.file.content_type, length: media.file.size) + item.enclosure(full_asset_url(media.file.url(:original, false)), media.file.content_type, media.file.size) end end end diff --git a/app/serializers/rss/tag_serializer.rb b/app/serializers/rss/tag_serializer.rb index e8562ee87..6737fb2c9 100644 --- a/app/serializers/rss/tag_serializer.rb +++ b/app/serializers/rss/tag_serializer.rb @@ -23,7 +23,7 @@ class RSS::TagSerializer .description(status.spoiler_text.presence || Formatter.instance.format(status).to_str) status.media_attachments.each do |media| - item.enclosure(full_asset_url(media.file.url(:original, false)), media.file.content_type, length: media.file.size) + item.enclosure(full_asset_url(media.file.url(:original, false)), media.file.content_type, media.file.size) end end end From 92c2498554005e3811b790a88b2ff54cf294d678 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Fri, 20 Sep 2019 02:19:12 +0900 Subject: [PATCH 114/134] Bump doorkeeper from 5.1.0 to 5.2.0 (#11856) Bumps [doorkeeper](https://github.com/doorkeeper-gem/doorkeeper) from 5.1.0 to 5.2.0. - [Release notes](https://github.com/doorkeeper-gem/doorkeeper/releases) - [Changelog](https://github.com/doorkeeper-gem/doorkeeper/blob/master/CHANGELOG.md) - [Commits](https://github.com/doorkeeper-gem/doorkeeper/compare/v5.1.0...v5.2.0) Signed-off-by: dependabot-preview[bot] --- Gemfile | 2 +- Gemfile.lock | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Gemfile b/Gemfile index 25cf52f73..081cdd04e 100644 --- a/Gemfile +++ b/Gemfile @@ -44,7 +44,7 @@ gem 'omniauth-saml', '~> 1.10' gem 'omniauth', '~> 1.9' gem 'discard', '~> 1.1' -gem 'doorkeeper', '~> 5.1' +gem 'doorkeeper', '~> 5.2' gem 'fast_blank', '~> 1.0' gem 'fastimage' gem 'goldfinger', '~> 2.1' diff --git a/Gemfile.lock b/Gemfile.lock index 47bb5a28b..4545872f0 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -209,7 +209,7 @@ GEM docile (1.3.2) domain_name (0.5.20180417) unf (>= 0.0.5, < 1.0.0) - doorkeeper (5.1.0) + doorkeeper (5.2.0) railties (>= 5) dotenv (2.7.5) dotenv-rails (2.7.5) @@ -697,7 +697,7 @@ DEPENDENCIES devise-two-factor (~> 3.1) devise_pam_authenticatable2 (~> 9.2) discard (~> 1.1) - doorkeeper (~> 5.1) + doorkeeper (~> 5.2) dotenv-rails (~> 2.7) fabrication (~> 2.20) faker (~> 2.3) From 71b760f68091773b47083ffe3393094855e4c9a3 Mon Sep 17 00:00:00 2001 From: Yamagishi Kazutoshi Date: Fri, 20 Sep 2019 02:58:14 +0900 Subject: [PATCH 115/134] Rename package name to @tootsuite/mastodon (#11892) --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 24d5fcf9c..7c378eb39 100644 --- a/package.json +++ b/package.json @@ -1,5 +1,5 @@ { - "name": "mastodon", + "name": "@tootsuite/mastodon", "license": "AGPL-3.0-or-later", "engines": { "node": ">=8.12 <13" From 129bc871a0dc9e49900692a0b88d8d5700d9752a Mon Sep 17 00:00:00 2001 From: Eugen Rochko Date: Thu, 19 Sep 2019 19:58:26 +0200 Subject: [PATCH 116/134] Fix thread column showing pin button (#11891) Fix #11467 --- app/javascript/mastodon/components/column_header.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/javascript/mastodon/components/column_header.js b/app/javascript/mastodon/components/column_header.js index 8a26742b5..0038995c8 100644 --- a/app/javascript/mastodon/components/column_header.js +++ b/app/javascript/mastodon/components/column_header.js @@ -120,7 +120,7 @@ class ColumnHeader extends React.PureComponent {
); - } else if (multiColumn) { + } else if (multiColumn && this.props.onPin) { pinButton = ; } @@ -142,7 +142,7 @@ class ColumnHeader extends React.PureComponent { collapsedContent.push(pinButton); } - if (children || multiColumn) { + if (children || (multiColumn && this.props.onPin)) { collapseButton = ; } From b6df9c10671cd7bf48de3dbd7a94a92fb0a148ec Mon Sep 17 00:00:00 2001 From: Eugen Rochko Date: Thu, 19 Sep 2019 19:58:40 +0200 Subject: [PATCH 117/134] Fix placeholder colors for inputs not being explicitly defined (#11890) Fix #11841 --- app/javascript/styles/mastodon/_mixins.scss | 18 ------- .../styles/mastodon/components.scss | 48 +++++++++++++++++++ app/javascript/styles/mastodon/forms.scss | 4 ++ 3 files changed, 52 insertions(+), 18 deletions(-) diff --git a/app/javascript/styles/mastodon/_mixins.scss b/app/javascript/styles/mastodon/_mixins.scss index faaffb30f..68cad0fde 100644 --- a/app/javascript/styles/mastodon/_mixins.scss +++ b/app/javascript/styles/mastodon/_mixins.scss @@ -22,24 +22,6 @@ color: $darker-text-color; font-size: 14px; margin: 0; - - &::-moz-focus-inner { - border: 0; - } - - &::-moz-focus-inner, - &:focus, - &:active { - outline: 0 !important; - } - - &:focus { - background: lighten($ui-base-color, 4%); - } - - @media screen and (max-width: 600px) { - font-size: 16px; - } } @mixin search-popout { diff --git a/app/javascript/styles/mastodon/components.scss b/app/javascript/styles/mastodon/components.scss index ef48d2438..8893848ae 100644 --- a/app/javascript/styles/mastodon/components.scss +++ b/app/javascript/styles/mastodon/components.scss @@ -421,6 +421,10 @@ border: 0; outline: 0; + &::placeholder { + color: $dark-text-color; + } + &:focus { outline: 0; } @@ -3533,6 +3537,28 @@ a.status-card.compact:hover { .column-select { &__control { @include search-input; + + &::placeholder { + color: lighten($darker-text-color, 4%); + } + + &::-moz-focus-inner { + border: 0; + } + + &::-moz-focus-inner, + &:focus, + &:active { + outline: 0 !important; + } + + &:focus { + background: lighten($ui-base-color, 4%); + } + + @media screen and (max-width: 600px) { + font-size: 16px; + } } &__placeholder { @@ -4046,6 +4072,28 @@ a.status-card.compact:hover { padding-right: 30px; line-height: 18px; font-size: 16px; + + &::placeholder { + color: lighten($darker-text-color, 4%); + } + + &::-moz-focus-inner { + border: 0; + } + + &::-moz-focus-inner, + &:focus, + &:active { + outline: 0 !important; + } + + &:focus { + background: lighten($ui-base-color, 4%); + } + + @media screen and (max-width: 600px) { + font-size: 16px; + } } .search__icon { diff --git a/app/javascript/styles/mastodon/forms.scss b/app/javascript/styles/mastodon/forms.scss index 80ef8797d..b729d912e 100644 --- a/app/javascript/styles/mastodon/forms.scss +++ b/app/javascript/styles/mastodon/forms.scss @@ -338,6 +338,10 @@ code { border-radius: 4px; padding: 10px; + &::placeholder { + color: lighten($darker-text-color, 4%); + } + &:invalid { box-shadow: none; } From 3ed94dcc1acf73f1d0d1ab43567b88ee953f57c9 Mon Sep 17 00:00:00 2001 From: Eugen Rochko Date: Thu, 19 Sep 2019 20:58:19 +0200 Subject: [PATCH 118/134] Add account migration UI (#11846) Fix #10736 - Change data export to be available for non-functional accounts - Change non-functional accounts to include redirecting accounts --- .../concerns/export_controller_concern.rb | 7 ++ .../settings/aliases_controller.rb | 42 ++++++++++ .../settings/exports_controller.rb | 7 ++ .../settings/migrations_controller.rb | 48 ++++++++--- app/helpers/settings_helper.rb | 8 ++ app/models/account_alias.rb | 41 +++++++++ app/models/account_migration.rb | 74 ++++++++++++++++ app/models/concerns/account_associations.rb | 2 + app/models/form/migration.rb | 25 ------ app/models/remote_follow.rb | 2 +- app/models/user.rb | 2 +- .../activitypub/move_serializer.rb | 26 ++++++ .../auth/registrations/_status.html.haml | 30 ++++--- app/views/auth/registrations/edit.html.haml | 2 +- app/views/settings/aliases/index.html.haml | 29 +++++++ app/views/settings/exports/show.html.haml | 4 + app/views/settings/migrations/show.html.haml | 84 +++++++++++++++++-- app/views/settings/profiles/show.html.haml | 5 ++ .../activitypub/move_distribution_worker.rb | 32 +++++++ config/locales/en.yml | 38 ++++++++- config/locales/simple_form.en.yml | 10 +++ config/navigation.rb | 8 +- config/routes.rb | 8 +- ...0190914202517_create_account_migrations.rb | 12 +++ .../20190915194355_create_account_aliases.rb | 11 +++ db/schema.rb | 23 +++++ .../settings/migrations_controller_spec.rb | 14 ++-- spec/fabricators/account_alias_fabricator.rb | 5 ++ .../account_migration_fabricator.rb | 6 ++ spec/models/account_alias_spec.rb | 5 ++ spec/models/account_migration_spec.rb | 5 ++ 31 files changed, 542 insertions(+), 73 deletions(-) create mode 100644 app/controllers/settings/aliases_controller.rb create mode 100644 app/models/account_alias.rb create mode 100644 app/models/account_migration.rb delete mode 100644 app/models/form/migration.rb create mode 100644 app/serializers/activitypub/move_serializer.rb create mode 100644 app/views/settings/aliases/index.html.haml create mode 100644 app/workers/activitypub/move_distribution_worker.rb create mode 100644 db/migrate/20190914202517_create_account_migrations.rb create mode 100644 db/migrate/20190915194355_create_account_aliases.rb create mode 100644 spec/fabricators/account_alias_fabricator.rb create mode 100644 spec/fabricators/account_migration_fabricator.rb create mode 100644 spec/models/account_alias_spec.rb create mode 100644 spec/models/account_migration_spec.rb diff --git a/app/controllers/concerns/export_controller_concern.rb b/app/controllers/concerns/export_controller_concern.rb index e20b71a30..bfe990c82 100644 --- a/app/controllers/concerns/export_controller_concern.rb +++ b/app/controllers/concerns/export_controller_concern.rb @@ -5,7 +5,10 @@ module ExportControllerConcern included do before_action :authenticate_user! + before_action :require_not_suspended! before_action :load_export + + skip_before_action :require_functional! end private @@ -27,4 +30,8 @@ module ExportControllerConcern def export_filename "#{controller_name}.csv" end + + def require_not_suspended! + forbidden if current_account.suspended? + end end diff --git a/app/controllers/settings/aliases_controller.rb b/app/controllers/settings/aliases_controller.rb new file mode 100644 index 000000000..2b675f065 --- /dev/null +++ b/app/controllers/settings/aliases_controller.rb @@ -0,0 +1,42 @@ +# frozen_string_literal: true + +class Settings::AliasesController < Settings::BaseController + layout 'admin' + + before_action :authenticate_user! + before_action :set_aliases, except: :destroy + before_action :set_alias, only: :destroy + + def index + @alias = current_account.aliases.build + end + + def create + @alias = current_account.aliases.build(resource_params) + + if @alias.save + redirect_to settings_aliases_path, notice: I18n.t('aliases.created_msg') + else + render :show + end + end + + def destroy + @alias.destroy! + redirect_to settings_aliases_path, notice: I18n.t('aliases.deleted_msg') + end + + private + + def resource_params + params.require(:account_alias).permit(:acct) + end + + def set_alias + @alias = current_account.aliases.find(params[:id]) + end + + def set_aliases + @aliases = current_account.aliases.order(id: :desc).reject(&:new_record?) + end +end diff --git a/app/controllers/settings/exports_controller.rb b/app/controllers/settings/exports_controller.rb index 3012fbf77..0e93d07a9 100644 --- a/app/controllers/settings/exports_controller.rb +++ b/app/controllers/settings/exports_controller.rb @@ -6,6 +6,9 @@ class Settings::ExportsController < Settings::BaseController layout 'admin' before_action :authenticate_user! + before_action :require_not_suspended! + + skip_before_action :require_functional! def show @export = Export.new(current_account) @@ -34,4 +37,8 @@ class Settings::ExportsController < Settings::BaseController def lock_options { redis: Redis.current, key: "backup:#{current_user.id}" } end + + def require_not_suspended! + forbidden if current_account.suspended? + end end diff --git a/app/controllers/settings/migrations_controller.rb b/app/controllers/settings/migrations_controller.rb index 59eb48779..90092c692 100644 --- a/app/controllers/settings/migrations_controller.rb +++ b/app/controllers/settings/migrations_controller.rb @@ -4,31 +4,59 @@ class Settings::MigrationsController < Settings::BaseController layout 'admin' before_action :authenticate_user! + before_action :require_not_suspended! + before_action :set_migrations + before_action :set_cooldown + + skip_before_action :require_functional! def show - @migration = Form::Migration.new(account: current_account.moved_to_account) + @migration = current_account.migrations.build end - def update - @migration = Form::Migration.new(resource_params) + def create + @migration = current_account.migrations.build(resource_params) - if @migration.valid? && migration_account_changed? - current_account.update!(moved_to_account: @migration.account) + if @migration.save_with_challenge(current_user) + current_account.update!(moved_to_account: @migration.target_account) ActivityPub::UpdateDistributionWorker.perform_async(current_account.id) - redirect_to settings_migration_path, notice: I18n.t('migrations.updated_msg') + ActivityPub::MoveDistributionWorker.perform_async(@migration.id) + redirect_to settings_migration_path, notice: I18n.t('migrations.moved_msg', acct: current_account.moved_to_account.acct) else render :show end end + def cancel + if current_account.moved_to_account_id.present? + current_account.update!(moved_to_account: nil) + ActivityPub::UpdateDistributionWorker.perform_async(current_account.id) + end + + redirect_to settings_migration_path, notice: I18n.t('migrations.cancelled_msg') + end + + helper_method :on_cooldown? + private def resource_params - params.require(:migration).permit(:acct) + params.require(:account_migration).permit(:acct, :current_password, :current_username) end - def migration_account_changed? - current_account.moved_to_account_id != @migration.account&.id && - current_account.id != @migration.account&.id + def set_migrations + @migrations = current_account.migrations.includes(:target_account).order(id: :desc).reject(&:new_record?) + end + + def set_cooldown + @cooldown = current_account.migrations.within_cooldown.first + end + + def on_cooldown? + @cooldown.present? + end + + def require_not_suspended! + forbidden if current_account.suspended? end end diff --git a/app/helpers/settings_helper.rb b/app/helpers/settings_helper.rb index 2b3fd1263..ecc73baf5 100644 --- a/app/helpers/settings_helper.rb +++ b/app/helpers/settings_helper.rb @@ -87,4 +87,12 @@ module SettingsHelper 'desktop' end end + + def compact_account_link_to(account) + return if account.nil? + + link_to ActivityPub::TagManager.instance.url_for(account), class: 'name-tag', title: account.acct do + safe_join([image_tag(account.avatar.url, width: 15, height: 15, alt: display_name(account), class: 'avatar'), content_tag(:span, account.acct, class: 'username')], ' ') + end + end end diff --git a/app/models/account_alias.rb b/app/models/account_alias.rb new file mode 100644 index 000000000..e9a0dd79e --- /dev/null +++ b/app/models/account_alias.rb @@ -0,0 +1,41 @@ +# frozen_string_literal: true + +# == Schema Information +# +# Table name: account_aliases +# +# id :bigint(8) not null, primary key +# account_id :bigint(8) +# acct :string default(""), not null +# uri :string default(""), not null +# created_at :datetime not null +# updated_at :datetime not null +# + +class AccountAlias < ApplicationRecord + belongs_to :account + + validates :acct, presence: true, domain: { acct: true } + validates :uri, presence: true + + before_validation :set_uri + after_create :add_to_account + after_destroy :remove_from_account + + private + + def set_uri + target_account = ResolveAccountService.new.call(acct) + self.uri = ActivityPub::TagManager.instance.uri_for(target_account) unless target_account.nil? + rescue Goldfinger::Error, HTTP::Error, OpenSSL::SSL::SSLError, Mastodon::Error + # Validation will take care of it + end + + def add_to_account + account.update(also_known_as: account.also_known_as + [uri]) + end + + def remove_from_account + account.update(also_known_as: account.also_known_as.reject { |x| x == uri }) + end +end diff --git a/app/models/account_migration.rb b/app/models/account_migration.rb new file mode 100644 index 000000000..15830bffb --- /dev/null +++ b/app/models/account_migration.rb @@ -0,0 +1,74 @@ +# frozen_string_literal: true + +# == Schema Information +# +# Table name: account_migrations +# +# id :bigint(8) not null, primary key +# account_id :bigint(8) +# acct :string default(""), not null +# followers_count :bigint(8) default(0), not null +# target_account_id :bigint(8) +# created_at :datetime not null +# updated_at :datetime not null +# + +class AccountMigration < ApplicationRecord + COOLDOWN_PERIOD = 30.days.freeze + + belongs_to :account + belongs_to :target_account, class_name: 'Account' + + before_validation :set_target_account + before_validation :set_followers_count + + validates :acct, presence: true, domain: { acct: true } + validate :validate_migration_cooldown + validate :validate_target_account + + scope :within_cooldown, ->(now = Time.now.utc) { where(arel_table[:created_at].gteq(now - COOLDOWN_PERIOD)) } + + attr_accessor :current_password, :current_username + + def save_with_challenge(current_user) + if current_user.encrypted_password.present? + errors.add(:current_password, :invalid) unless current_user.valid_password?(current_password) + else + errors.add(:current_username, :invalid) unless account.username == current_username + end + + return false unless errors.empty? + + save + end + + def cooldown_at + created_at + COOLDOWN_PERIOD + end + + private + + def set_target_account + self.target_account = ResolveAccountService.new.call(acct) + rescue Goldfinger::Error, HTTP::Error, OpenSSL::SSL::SSLError, Mastodon::Error + # Validation will take care of it + end + + def set_followers_count + self.followers_count = account.followers_count + end + + def validate_target_account + if target_account.nil? + errors.add(:acct, I18n.t('migrations.errors.not_found')) + else + errors.add(:acct, I18n.t('migrations.errors.missing_also_known_as')) unless target_account.also_known_as.include?(ActivityPub::TagManager.instance.uri_for(account)) + errors.add(:acct, I18n.t('migrations.errors.already_moved')) if account.moved_to_account_id.present? && account.moved_to_account_id == target_account.id + errors.add(:acct, I18n.t('migrations.errors.move_to_self')) if account.id == target_account.id + end + end + + def validate_migration_cooldown + errors.add(:base, I18n.t('migrations.errors.on_cooldown')) if account.migrations.within_cooldown.exists? + end +end diff --git a/app/models/concerns/account_associations.rb b/app/models/concerns/account_associations.rb index 1db7771c7..c9cc5c610 100644 --- a/app/models/concerns/account_associations.rb +++ b/app/models/concerns/account_associations.rb @@ -52,6 +52,8 @@ module AccountAssociations # Account migrations belongs_to :moved_to_account, class_name: 'Account', optional: true + has_many :migrations, class_name: 'AccountMigration', dependent: :destroy, inverse_of: :account + has_many :aliases, class_name: 'AccountAlias', dependent: :destroy, inverse_of: :account # Hashtags has_and_belongs_to_many :tags diff --git a/app/models/form/migration.rb b/app/models/form/migration.rb deleted file mode 100644 index c2a8655e1..000000000 --- a/app/models/form/migration.rb +++ /dev/null @@ -1,25 +0,0 @@ -# frozen_string_literal: true - -class Form::Migration - include ActiveModel::Validations - - attr_accessor :acct, :account - - def initialize(attrs = {}) - @account = attrs[:account] - @acct = attrs[:account].acct unless @account.nil? - @acct = attrs[:acct].gsub(/\A@/, '').strip unless attrs[:acct].nil? - end - - def valid? - return false unless super - set_account - errors.empty? - end - - private - - def set_account - self.account = (ResolveAccountService.new.call(acct) if account.nil? && acct.present?) - end -end diff --git a/app/models/remote_follow.rb b/app/models/remote_follow.rb index 52dd3f67b..5ea535287 100644 --- a/app/models/remote_follow.rb +++ b/app/models/remote_follow.rb @@ -49,7 +49,7 @@ class RemoteFollow end def fetch_template! - return missing_resource if acct.blank? + return missing_resource_error if acct.blank? _, domain = acct.split('@') diff --git a/app/models/user.rb b/app/models/user.rb index b48455802..9a19a53b3 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -168,7 +168,7 @@ class User < ApplicationRecord end def functional? - confirmed? && approved? && !disabled? && !account.suspended? + confirmed? && approved? && !disabled? && !account.suspended? && account.moved_to_account_id.nil? end def unconfirmed_or_pending? diff --git a/app/serializers/activitypub/move_serializer.rb b/app/serializers/activitypub/move_serializer.rb new file mode 100644 index 000000000..5675875fa --- /dev/null +++ b/app/serializers/activitypub/move_serializer.rb @@ -0,0 +1,26 @@ +# frozen_string_literal: true + +class ActivityPub::MoveSerializer < ActivityPub::Serializer + attributes :id, :type, :target, :actor + attribute :virtual_object, key: :object + + def id + [ActivityPub::TagManager.instance.uri_for(object.account), '#moves/', object.id].join + end + + def type + 'Move' + end + + def target + ActivityPub::TagManager.instance.uri_for(object.target_account) + end + + def virtual_object + ActivityPub::TagManager.instance.uri_for(object.account) + end + + def actor + ActivityPub::TagManager.instance.uri_for(object.account) + end +end diff --git a/app/views/auth/registrations/_status.html.haml b/app/views/auth/registrations/_status.html.haml index b38a83d67..47112dae0 100644 --- a/app/views/auth/registrations/_status.html.haml +++ b/app/views/auth/registrations/_status.html.haml @@ -1,16 +1,22 @@ %h3= t('auth.status.account_status') -- if @user.account.suspended? - %span.negative-hint= t('user_mailer.warning.explanation.suspend') -- elsif @user.disabled? - %span.negative-hint= t('user_mailer.warning.explanation.disable') -- elsif @user.account.silenced? - %span.warning-hint= t('user_mailer.warning.explanation.silence') -- elsif !@user.confirmed? - %span.warning-hint= t('auth.status.confirming') -- elsif !@user.approved? - %span.warning-hint= t('auth.status.pending') -- else - %span.positive-hint= t('auth.status.functional') +.simple_form + %p.hint + - if @user.account.suspended? + %span.negative-hint= t('user_mailer.warning.explanation.suspend') + - elsif @user.disabled? + %span.negative-hint= t('user_mailer.warning.explanation.disable') + - elsif @user.account.silenced? + %span.warning-hint= t('user_mailer.warning.explanation.silence') + - elsif !@user.confirmed? + %span.warning-hint= t('auth.status.confirming') + = link_to t('auth.didnt_get_confirmation'), new_user_confirmation_path + - elsif !@user.approved? + %span.warning-hint= t('auth.status.pending') + - elsif @user.account.moved_to_account_id.present? + %span.positive-hint= t('auth.status.redirecting_to', acct: @user.account.moved_to_account.acct) + = link_to t('migrations.cancel'), settings_migration_path + - else + %span.positive-hint= t('auth.status.functional') %hr.spacer/ diff --git a/app/views/auth/registrations/edit.html.haml b/app/views/auth/registrations/edit.html.haml index 710ee5c68..885171c58 100644 --- a/app/views/auth/registrations/edit.html.haml +++ b/app/views/auth/registrations/edit.html.haml @@ -13,7 +13,7 @@ .fields-row__column.fields-group.fields-row__column-6 = f.input :email, wrapper: :with_label, input_html: { 'aria-label' => t('simple_form.labels.defaults.email') }, required: true, disabled: current_account.suspended? .fields-row__column.fields-group.fields-row__column-6 - = f.input :current_password, wrapper: :with_label, input_html: { 'aria-label' => t('simple_form.labels.defaults.current_password'), :autocomplete => 'off' }, required: true, disabled: current_account.suspended? + = f.input :current_password, wrapper: :with_label, input_html: { 'aria-label' => t('simple_form.labels.defaults.current_password'), :autocomplete => 'off' }, required: true, disabled: current_account.suspended?, hint: false .fields-row .fields-row__column.fields-group.fields-row__column-6 diff --git a/app/views/settings/aliases/index.html.haml b/app/views/settings/aliases/index.html.haml new file mode 100644 index 000000000..5b6986368 --- /dev/null +++ b/app/views/settings/aliases/index.html.haml @@ -0,0 +1,29 @@ +- content_for :page_title do + = t('settings.aliases') + += simple_form_for @alias, url: settings_aliases_path do |f| + = render 'shared/error_messages', object: @alias + + %p.hint= t('aliases.hint_html') + + %hr.spacer/ + + .fields-group + = f.input :acct, wrapper: :with_block_label, input_html: { autocapitalize: 'none', autocorrect: 'off' } + + .actions + = f.button :button, t('aliases.add_new'), type: :submit, class: 'button' + +%hr.spacer/ + +.table-wrapper + %table.table.inline-table + %thead + %tr + %th= t('simple_form.labels.account_alias.acct') + %th + %tbody + - @aliases.each do |account_alias| + %tr + %td= account_alias.acct + %td= table_link_to 'trash', t('aliases.remove'), settings_alias_path(account_alias), data: { method: :delete } diff --git a/app/views/settings/exports/show.html.haml b/app/views/settings/exports/show.html.haml index b13cea976..76ff76bd9 100644 --- a/app/views/settings/exports/show.html.haml +++ b/app/views/settings/exports/show.html.haml @@ -37,12 +37,16 @@ %td= number_with_delimiter @export.total_domain_blocks %td= table_link_to 'download', t('exports.csv'), settings_exports_domain_blocks_path(format: :csv) +%hr.spacer/ + %p.muted-hint= t('exports.archive_takeout.hint_html') - if policy(:backup).create? %p= link_to t('exports.archive_takeout.request'), settings_export_path, class: 'button', method: :post - unless @backups.empty? + %hr.spacer/ + .table-wrapper %table.table %thead diff --git a/app/views/settings/migrations/show.html.haml b/app/views/settings/migrations/show.html.haml index c69061d50..1e5c47726 100644 --- a/app/views/settings/migrations/show.html.haml +++ b/app/views/settings/migrations/show.html.haml @@ -1,17 +1,85 @@ - content_for :page_title do = t('settings.migrate') -= simple_form_for @migration, as: :migration, url: settings_migration_path, html: { method: :put } do |f| - - if @migration.account - %p.hint= t('migrations.currently_redirecting') +.simple_form + - if current_account.moved_to_account.present? + .fields-row + .fields-row__column.fields-group.fields-row__column-6 + = render 'application/card', account: current_account.moved_to_account + .fields-row__column.fields-group.fields-row__column-6 + %p.hint + %span.positive-hint= t('migrations.redirecting_to', acct: current_account.moved_to_account.acct) - .fields-group - = render partial: 'application/card', locals: { account: @migration.account } + %p.hint= t('migrations.cancel_explanation') + + %p.hint= link_to t('migrations.cancel'), cancel_settings_migration_path, data: { method: :post } + - else + %p.hint + %span.positive-hint= t('migrations.not_redirecting') + +%hr.spacer/ + +%h3= t 'migrations.proceed_with_move' + += simple_form_for @migration, url: settings_migration_path do |f| + - if on_cooldown? + %span.warning-hint= t('migrations.on_cooldown', count: ((@cooldown.cooldown_at - Time.now.utc) / 1.day.seconds).ceil) + - else + %p.hint= t('migrations.warning.before') + + %ul.hint + %li.warning-hint= t('migrations.warning.followers') + %li.warning-hint= t('migrations.warning.other_data') + %li.warning-hint= t('migrations.warning.backreference_required') + %li.warning-hint= t('migrations.warning.cooldown') + %li.warning-hint= t('migrations.warning.disabled_account') + + %hr.spacer/ = render 'shared/error_messages', object: @migration - .fields-group - = f.input :acct, placeholder: t('migrations.acct') + .fields-row + .fields-row__column.fields-group.fields-row__column-6 + = f.input :acct, wrapper: :with_block_label, input_html: { autocapitalize: 'none', autocorrect: 'off' }, disabled: on_cooldown? + + .fields-row__column.fields-group.fields-row__column-6 + - if current_user.encrypted_password.present? + = f.input :current_password, wrapper: :with_block_label, input_html: { :autocomplete => 'off' }, required: true, disabled: on_cooldown? + - else + = f.input :current_username, wrapper: :with_block_label, input_html: { :autocomplete => 'off' }, required: true, disabled: on_cooldown? .actions - = f.button :button, t('migrations.proceed'), type: :submit, class: 'negative' + = f.button :button, t('migrations.proceed_with_move'), type: :submit, class: 'button button--destructive', disabled: on_cooldown? + +- unless @migrations.empty? + %hr.spacer/ + + %h3= t 'migrations.past_migrations' + + %hr.spacer/ + + .table-wrapper + %table.table.inline-table + %thead + %tr + %th= t('migrations.acct') + %th= t('migrations.followers_count') + %th + %tbody + - @migrations.each do |migration| + %tr + %td + - if migration.target_account.present? + = compact_account_link_to migration.target_account + - else + = migration.acct + + %td= number_with_delimiter migration.followers_count + + %td + %time.time-ago{ datetime: migration.created_at.iso8601, title: l(migration.created_at) }= l(migration.created_at) + +%hr.spacer/ + +%h3= t 'migrations.incoming_migrations' +%p.muted-hint= t('migrations.incoming_migrations_html', path: settings_aliases_path) diff --git a/app/views/settings/profiles/show.html.haml b/app/views/settings/profiles/show.html.haml index f042011d6..6929f54f3 100644 --- a/app/views/settings/profiles/show.html.haml +++ b/app/views/settings/profiles/show.html.haml @@ -60,6 +60,11 @@ %h6= t('auth.migrate_account') %p.muted-hint= t('auth.migrate_account_html', path: settings_migration_path) +%hr.spacer/ + +%h6= t 'migrations.incoming_migrations' +%p.muted-hint= t('migrations.incoming_migrations_html', path: settings_aliases_path) + - if open_deletion? %hr.spacer/ diff --git a/app/workers/activitypub/move_distribution_worker.rb b/app/workers/activitypub/move_distribution_worker.rb new file mode 100644 index 000000000..396d5258f --- /dev/null +++ b/app/workers/activitypub/move_distribution_worker.rb @@ -0,0 +1,32 @@ +# frozen_string_literal: true + +class ActivityPub::MoveDistributionWorker + include Sidekiq::Worker + include Payloadable + + sidekiq_options queue: 'push' + + def perform(migration_id) + @migration = AccountMigration.find(migration_id) + + ActivityPub::DeliveryWorker.push_bulk(inboxes) do |inbox_url| + [signed_payload, @account.id, inbox_url] + end + + ActivityPub::DeliveryWorker.push_bulk(Relay.enabled.pluck(:inbox_url)) do |inbox_url| + [signed_payload, @account.id, inbox_url] + end + rescue ActiveRecord::RecordNotFound + true + end + + private + + def inboxes + @inboxes ||= @migration.account.followers.inboxes + end + + def signed_payload + @signed_payload ||= Oj.dump(serialize_payload(@migration, ActivityPub::MoveSerializer, signer: @account)) + end +end diff --git a/config/locales/en.yml b/config/locales/en.yml index dabb679e7..c29c7f871 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -554,6 +554,12 @@ en: new_trending_tag: body: 'The hashtag #%{name} is trending today, but has not been previously reviewed. It will not be displayed publicly unless you allow it to, or just save the form as it is to never hear about it again.' subject: New hashtag up for review on %{instance} (#%{name}) + aliases: + add_new: Create alias + created_msg: Successfully created a new alias. You can now initiate the move from the old account. + deleted_msg: Successfully remove the alias. Moving from that account to this one will no longer be possible. + hint_html: If you want to move from another account to this one, here you can create an alias, which is required before you can proceed with moving followers from the old account to this one. This action by itself is harmless and reversible. The account migration is initiated from the old account. + remove: Unlink alias appearance: advanced_web_interface: Advanced web interface advanced_web_interface_hint: 'If you want to make use of your entire screen width, the advanced web interface allows you to configure many different columns to see as much information at the same time as you want: Home, notifications, federated timeline, any number of lists and hashtags.' @@ -613,6 +619,7 @@ en: confirming: Waiting for e-mail confirmation to be completed. functional: Your account is fully operational. pending: Your application is pending review by our staff. This may take some time. You will receive an e-mail if your application is approved. + redirecting_to: Your account is inactive because it is currently redirecting to %{acct}. trouble_logging_in: Trouble logging in? authorize_follow: already_following: You are already following this account @@ -801,10 +808,32 @@ en: images_and_video: Cannot attach a video to a status that already contains images too_many: Cannot attach more than 4 files migrations: - acct: username@domain of the new account - currently_redirecting: 'Your profile is set to redirect to:' - proceed: Save - updated_msg: Your account migration setting successfully updated! + acct: Moved to + cancel: Cancel redirect + cancel_explanation: Cancelling the redirect will re-activate your current account, but will not bring back followers that have been moved to that account. + cancelled_msg: Successfully cancelled the redirect. + errors: + already_moved: is the same account you have already moved to + missing_also_known_as: is not back-referencing this account + move_to_self: cannot be current account + not_found: could not be found + on_cooldown: You are on cooldown + followers_count: Followers at time of move + incoming_migrations: Moving from a different account + incoming_migrations_html: To move from another account to this one, first you need to create an account alias. + moved_msg: Your account is now redirecting to %{acct} and your followers are being moved over. + not_redirecting: Your account is not redirecting to any other account currently. + on_cooldown: You have recently migrated your account. This function will become available again in %{count} days. + past_migrations: Past migrations + proceed_with_move: Move followers + redirecting_to: Your account is redirecting to %{acct}. + warning: + backreference_required: The new account must first be configured to back-reference this one + before: 'Before proceeding, please read these notes carefully:' + cooldown: After moving there is a cooldown period during which you will not be able to move again + disabled_account: Your current account will not be fully usable afterwards. However, you will have access to data export as well as re-activation. + followers: This action will move all followers from the current account to the new account + other_data: No other data will be moved automatically moderation: title: Moderation notification_mailer: @@ -950,6 +979,7 @@ en: settings: account: Account account_settings: Account settings + aliases: Account aliases appearance: Appearance authorized_apps: Authorized apps back: Back to Mastodon diff --git a/config/locales/simple_form.en.yml b/config/locales/simple_form.en.yml index c9ffcfc13..3d909e999 100644 --- a/config/locales/simple_form.en.yml +++ b/config/locales/simple_form.en.yml @@ -2,6 +2,10 @@ en: simple_form: hints: + account_alias: + acct: Specify the username@domain of the account you want to move from + account_migration: + acct: Specify the username@domain of the account you want to move to account_warning_preset: text: You can use toot syntax, such as URLs, hashtags and mentions admin_account_action: @@ -15,6 +19,8 @@ en: avatar: PNG, GIF or JPG. At most %{size}. Will be downscaled to %{dimensions}px bot: This account mainly performs automated actions and might not be monitored context: One or multiple contexts where the filter should apply + current_password: For security purposes please enter the password of the current account + current_username: To confirm, please enter the username of the current account digest: Only sent after a long period of inactivity and only if you have received any personal messages in your absence discoverable: The profile directory is another way by which your account can reach a wider audience email: You will be sent a confirmation e-mail @@ -60,6 +66,10 @@ en: fields: name: Label value: Content + account_alias: + acct: Handle of the old account + account_migration: + acct: Handle of the new account account_warning_preset: text: Preset text admin_account_action: diff --git a/config/navigation.rb b/config/navigation.rb index 38668bbf7..32c299143 100644 --- a/config/navigation.rb +++ b/config/navigation.rb @@ -5,7 +5,7 @@ SimpleNavigation::Configuration.run do |navigation| n.item :web, safe_join([fa_icon('chevron-left fw'), t('settings.back')]), root_url n.item :profile, safe_join([fa_icon('user fw'), t('settings.profile')]), settings_profile_url, if: -> { current_user.functional? } do |s| - s.item :profile, safe_join([fa_icon('pencil fw'), t('settings.appearance')]), settings_profile_url, highlights_on: %r{/settings/profile|/settings/migration} + s.item :profile, safe_join([fa_icon('pencil fw'), t('settings.appearance')]), settings_profile_url s.item :featured_tags, safe_join([fa_icon('hashtag fw'), t('settings.featured_tags')]), settings_featured_tags_url s.item :identity_proofs, safe_join([fa_icon('key fw'), t('settings.identity_proofs')]), settings_identity_proofs_path, highlights_on: %r{/settings/identity_proofs*}, if: proc { current_account.identity_proofs.exists? } end @@ -20,13 +20,13 @@ SimpleNavigation::Configuration.run do |navigation| n.item :filters, safe_join([fa_icon('filter fw'), t('filters.index.title')]), filters_path, highlights_on: %r{/filters}, if: -> { current_user.functional? } n.item :security, safe_join([fa_icon('lock fw'), t('settings.account')]), edit_user_registration_url do |s| - s.item :password, safe_join([fa_icon('lock fw'), t('settings.account_settings')]), edit_user_registration_url, highlights_on: %r{/auth/edit|/settings/delete} + s.item :password, safe_join([fa_icon('lock fw'), t('settings.account_settings')]), edit_user_registration_url, highlights_on: %r{/auth/edit|/settings/delete|/settings/migration|/settings/aliases} s.item :two_factor_authentication, safe_join([fa_icon('mobile fw'), t('settings.two_factor_authentication')]), settings_two_factor_authentication_url, highlights_on: %r{/settings/two_factor_authentication} s.item :authorized_apps, safe_join([fa_icon('list fw'), t('settings.authorized_apps')]), oauth_authorized_applications_url end - n.item :data, safe_join([fa_icon('cloud-download fw'), t('settings.import_and_export')]), settings_export_url, if: -> { current_user.functional? } do |s| - s.item :import, safe_join([fa_icon('cloud-upload fw'), t('settings.import')]), settings_import_url + n.item :data, safe_join([fa_icon('cloud-download fw'), t('settings.import_and_export')]), settings_export_url do |s| + s.item :import, safe_join([fa_icon('cloud-upload fw'), t('settings.import')]), settings_import_url, if: -> { current_user.functional? } s.item :export, safe_join([fa_icon('cloud-download fw'), t('settings.export')]), settings_export_url end diff --git a/config/routes.rb b/config/routes.rb index dcfa079a0..37e0cbdee 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -134,8 +134,14 @@ Rails.application.routes.draw do end resource :delete, only: [:show, :destroy] - resource :migration, only: [:show, :update] + resource :migration, only: [:show, :create] do + collection do + post :cancel + end + end + + resources :aliases, only: [:index, :create, :destroy] resources :sessions, only: [:destroy] resources :featured_tags, only: [:index, :create, :destroy] end diff --git a/db/migrate/20190914202517_create_account_migrations.rb b/db/migrate/20190914202517_create_account_migrations.rb new file mode 100644 index 000000000..cb9d71c09 --- /dev/null +++ b/db/migrate/20190914202517_create_account_migrations.rb @@ -0,0 +1,12 @@ +class CreateAccountMigrations < ActiveRecord::Migration[5.2] + def change + create_table :account_migrations do |t| + t.belongs_to :account, foreign_key: { on_delete: :cascade } + t.string :acct, null: false, default: '' + t.bigint :followers_count, null: false, default: 0 + t.belongs_to :target_account, foreign_key: { to_table: :accounts, on_delete: :nullify } + + t.timestamps + end + end +end diff --git a/db/migrate/20190915194355_create_account_aliases.rb b/db/migrate/20190915194355_create_account_aliases.rb new file mode 100644 index 000000000..32ce031d9 --- /dev/null +++ b/db/migrate/20190915194355_create_account_aliases.rb @@ -0,0 +1,11 @@ +class CreateAccountAliases < ActiveRecord::Migration[5.2] + def change + create_table :account_aliases do |t| + t.belongs_to :account, foreign_key: { on_delete: :cascade } + t.string :acct, null: false, default: '' + t.string :uri, null: false, default: '' + + t.timestamps + end + end +end diff --git a/db/schema.rb b/db/schema.rb index 749f79dee..fabeb16f3 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -15,6 +15,15 @@ ActiveRecord::Schema.define(version: 2019_09_17_213523) do # These are extensions that must be enabled in order to support this database enable_extension "plpgsql" + create_table "account_aliases", force: :cascade do |t| + t.bigint "account_id" + t.string "acct", default: "", null: false + t.string "uri", default: "", null: false + t.datetime "created_at", null: false + t.datetime "updated_at", null: false + t.index ["account_id"], name: "index_account_aliases_on_account_id" + end + create_table "account_conversations", force: :cascade do |t| t.bigint "account_id" t.bigint "conversation_id" @@ -49,6 +58,17 @@ ActiveRecord::Schema.define(version: 2019_09_17_213523) do t.index ["account_id"], name: "index_account_identity_proofs_on_account_id" end + create_table "account_migrations", force: :cascade do |t| + t.bigint "account_id" + t.string "acct", default: "", null: false + t.bigint "followers_count", default: 0, null: false + t.bigint "target_account_id" + t.datetime "created_at", null: false + t.datetime "updated_at", null: false + t.index ["account_id"], name: "index_account_migrations_on_account_id" + t.index ["target_account_id"], name: "index_account_migrations_on_target_account_id" + end + create_table "account_moderation_notes", force: :cascade do |t| t.text "content", null: false t.bigint "account_id", null: false @@ -768,10 +788,13 @@ ActiveRecord::Schema.define(version: 2019_09_17_213523) do t.index ["user_id"], name: "index_web_settings_on_user_id", unique: true end + add_foreign_key "account_aliases", "accounts", on_delete: :cascade add_foreign_key "account_conversations", "accounts", on_delete: :cascade add_foreign_key "account_conversations", "conversations", on_delete: :cascade add_foreign_key "account_domain_blocks", "accounts", name: "fk_206c6029bd", on_delete: :cascade add_foreign_key "account_identity_proofs", "accounts", on_delete: :cascade + add_foreign_key "account_migrations", "accounts", column: "target_account_id", on_delete: :nullify + add_foreign_key "account_migrations", "accounts", on_delete: :cascade add_foreign_key "account_moderation_notes", "accounts" add_foreign_key "account_moderation_notes", "accounts", column: "target_account_id" add_foreign_key "account_pins", "accounts", column: "target_account_id", on_delete: :cascade diff --git a/spec/controllers/settings/migrations_controller_spec.rb b/spec/controllers/settings/migrations_controller_spec.rb index 4d814a45e..36e4ba86e 100644 --- a/spec/controllers/settings/migrations_controller_spec.rb +++ b/spec/controllers/settings/migrations_controller_spec.rb @@ -21,6 +21,7 @@ describe Settings::MigrationsController do let(:user) { Fabricate(:user, account: account) } let(:account) { Fabricate(:account, moved_to_account: moved_to_account) } + before { sign_in user, scope: :user } context 'when user does not have moved to account' do @@ -32,7 +33,7 @@ describe Settings::MigrationsController do end end - context 'when user does not have moved to account' do + context 'when user has a moved to account' do let(:moved_to_account) { Fabricate(:account) } it 'renders show page' do @@ -43,21 +44,22 @@ describe Settings::MigrationsController do end end - describe 'PUT #update' do + describe 'POST #create' do context 'when user is not sign in' do - subject { put :update } + subject { post :create } it_behaves_like 'authenticate user' end context 'when user is sign in' do - subject { put :update, params: { migration: { acct: acct } } } + subject { post :create, params: { account_migration: { acct: acct, current_password: '12345678' } } } + + let(:user) { Fabricate(:user, password: '12345678') } - let(:user) { Fabricate(:user) } before { sign_in user, scope: :user } context 'when migration account is changed' do - let(:acct) { Fabricate(:account) } + let(:acct) { Fabricate(:account, also_known_as: [ActivityPub::TagManager.instance.uri_for(user.account)]) } it 'updates moved to account' do is_expected.to redirect_to settings_migration_path diff --git a/spec/fabricators/account_alias_fabricator.rb b/spec/fabricators/account_alias_fabricator.rb new file mode 100644 index 000000000..94dde9bb8 --- /dev/null +++ b/spec/fabricators/account_alias_fabricator.rb @@ -0,0 +1,5 @@ +Fabricator(:account_alias) do + account + acct 'test@example.com' + uri 'https://example.com/users/test' +end diff --git a/spec/fabricators/account_migration_fabricator.rb b/spec/fabricators/account_migration_fabricator.rb new file mode 100644 index 000000000..3b3fc2077 --- /dev/null +++ b/spec/fabricators/account_migration_fabricator.rb @@ -0,0 +1,6 @@ +Fabricator(:account_migration) do + account + target_account + followers_count 1234 + acct 'test@example.com' +end diff --git a/spec/models/account_alias_spec.rb b/spec/models/account_alias_spec.rb new file mode 100644 index 000000000..27ec215aa --- /dev/null +++ b/spec/models/account_alias_spec.rb @@ -0,0 +1,5 @@ +require 'rails_helper' + +RSpec.describe AccountAlias, type: :model do + +end diff --git a/spec/models/account_migration_spec.rb b/spec/models/account_migration_spec.rb new file mode 100644 index 000000000..8461b4b28 --- /dev/null +++ b/spec/models/account_migration_spec.rb @@ -0,0 +1,5 @@ +require 'rails_helper' + +RSpec.describe AccountMigration, type: :model do + +end From 37ccafec8fe8bf5588794257744554be61a3f22e Mon Sep 17 00:00:00 2001 From: Eugen Rochko Date: Fri, 20 Sep 2019 10:51:52 +0200 Subject: [PATCH 119/134] Fix left side of single column layout being cropped on smaller screens (#11894) Fix #11476 --- 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 8893848ae..17c94e23c 100644 --- a/app/javascript/styles/mastodon/components.scss +++ b/app/javascript/styles/mastodon/components.scss @@ -1893,6 +1893,7 @@ a.account__display-name { pointer-events: none; display: flex; justify-content: flex-end; + min-width: 285px; &--start { justify-content: flex-start; @@ -1910,6 +1911,7 @@ a.account__display-name { box-sizing: border-box; width: 100%; max-width: 600px; + flex: 0 0 auto; display: flex; flex-direction: column; From b9a8b38844278f26b9d1d1d53256e0781ba3575a Mon Sep 17 00:00:00 2001 From: Eugen Rochko Date: Fri, 20 Sep 2019 10:52:14 +0200 Subject: [PATCH 120/134] Fix page body not being scrollable in admin layout (#11893) Hide navigation behind hamburger icon on small screens in admin layout --- app/javascript/packs/public.js | 10 ++ app/javascript/styles/mastodon/admin.scss | 138 +++++++++++++++++---- app/javascript/styles/mastodon/basics.scss | 3 - app/views/layouts/admin.html.haml | 20 ++- 4 files changed, 142 insertions(+), 29 deletions(-) diff --git a/app/javascript/packs/public.js b/app/javascript/packs/public.js index 97ee4dfa2..ed713f335 100644 --- a/app/javascript/packs/public.js +++ b/app/javascript/packs/public.js @@ -247,6 +247,16 @@ function main() { input.readonly = oldReadOnly; }); + + delegate(document, '.sidebar__toggle__icon', 'click', () => { + const target = document.querySelector('.sidebar ul'); + + if (target.style.display === 'block') { + target.style.display = 'none'; + } else { + target.style.display = 'block'; + } + }); } loadPolyfills().then(main).catch(error => { diff --git a/app/javascript/styles/mastodon/admin.scss b/app/javascript/styles/mastodon/admin.scss index 074eee2cd..dde1d69ba 100644 --- a/app/javascript/styles/mastodon/admin.scss +++ b/app/javascript/styles/mastodon/admin.scss @@ -5,21 +5,66 @@ $content-width: 840px; .admin-wrapper { display: flex; justify-content: center; - height: 100%; + width: 100%; + min-height: 100vh; .sidebar-wrapper { - flex: 1 1 $sidebar-width; - height: 100%; - background: $ui-base-color; - display: flex; - justify-content: flex-end; + min-height: 100vh; + overflow: hidden; + pointer-events: none; + flex: 1 1 auto; + + &__inner { + display: flex; + justify-content: flex-end; + background: $ui-base-color; + height: 100%; + } } .sidebar { width: $sidebar-width; - height: 100%; padding: 0; - overflow-y: auto; + pointer-events: auto; + + &__toggle { + display: none; + background: lighten($ui-base-color, 8%); + height: 48px; + + &__logo { + flex: 1 1 auto; + + a { + display: inline-block; + padding: 15px; + } + + svg { + fill: $primary-text-color; + height: 20px; + position: relative; + bottom: -2px; + } + } + + &__icon { + display: block; + color: $darker-text-color; + text-decoration: none; + flex: 0 0 auto; + font-size: 20px; + padding: 15px; + } + + a { + &:hover, + &:focus, + &:active { + background: lighten($ui-base-color, 12%); + } + } + } .logo { display: block; @@ -52,6 +97,9 @@ $content-width: 840px; transition: all 200ms linear; transition-property: color, background-color; border-radius: 4px 0 0 4px; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; i.fa { margin-right: 5px; @@ -99,12 +147,30 @@ $content-width: 840px; } .content-wrapper { - flex: 2 1 $content-width; - overflow: auto; + box-sizing: border-box; + width: 100%; + max-width: $content-width; + flex: 1 1 auto; + } + + @media screen and (max-width: $content-width + $sidebar-width) { + .sidebar-wrapper--empty { + display: none; + } + + .sidebar-wrapper { + width: $sidebar-width; + flex: 0 0 auto; + } + } + + @media screen and (max-width: $no-columns-breakpoint) { + .sidebar-wrapper { + width: 100%; + } } .content { - max-width: $content-width; padding: 20px 15px; padding-top: 60px; padding-left: 25px; @@ -123,6 +189,12 @@ $content-width: 840px; padding-bottom: 40px; border-bottom: 1px solid lighten($ui-base-color, 8%); margin-bottom: 40px; + + @media screen and (max-width: $no-columns-breakpoint) { + border-bottom: 0; + padding-bottom: 0; + font-weight: 700; + } } h3 { @@ -147,7 +219,7 @@ $content-width: 840px; font-size: 16px; color: $secondary-text-color; line-height: 28px; - font-weight: 400; + font-weight: 500; } .fields-group h6 { @@ -176,7 +248,7 @@ $content-width: 840px; & > p { font-size: 14px; - line-height: 18px; + line-height: 21px; color: $secondary-text-color; margin-bottom: 20px; @@ -208,20 +280,42 @@ $content-width: 840px; @media screen and (max-width: $no-columns-breakpoint) { display: block; - overflow-y: auto; - -webkit-overflow-scrolling: touch; - .sidebar-wrapper, - .content-wrapper { - flex: 0 0 auto; - height: auto; - overflow: initial; + .sidebar-wrapper { + min-height: 0; } .sidebar { width: 100%; padding: 0; height: auto; + + &__toggle { + display: flex; + } + + & > ul { + display: none; + } + + ul a, + ul ul a { + border-radius: 0; + border-bottom: 1px solid lighten($ui-base-color, 4%); + transition: none; + + &:hover { + transition: none; + } + } + + ul ul { + border-radius: 0; + } + + ul .simple-navigation-active-leaf a { + border-bottom-color: $ui-highlight-color; + } } } } @@ -270,10 +364,10 @@ body, .filter-subset { flex: 0 0 auto; - margin: 0 40px 10px 0; + margin: 0 40px 20px 0; &:last-child { - margin-bottom: 20px; + margin-bottom: 30px; } ul { diff --git a/app/javascript/styles/mastodon/basics.scss b/app/javascript/styles/mastodon/basics.scss index f9332caa3..1f3ef7da2 100644 --- a/app/javascript/styles/mastodon/basics.scss +++ b/app/javascript/styles/mastodon/basics.scss @@ -86,9 +86,6 @@ body { &.admin { background: darken($ui-base-color, 4%); - position: fixed; - width: 100%; - height: 100%; padding: 0; } diff --git a/app/views/layouts/admin.html.haml b/app/views/layouts/admin.html.haml index 083f2fac7..57bda45e2 100644 --- a/app/views/layouts/admin.html.haml +++ b/app/views/layouts/admin.html.haml @@ -4,11 +4,21 @@ - content_for :content do .admin-wrapper .sidebar-wrapper - .sidebar - = link_to root_path do - = image_pack_tag 'logo.svg', class: 'logo', alt: 'Mastodon' + .sidebar-wrapper__inner + .sidebar + = link_to root_path do + = image_pack_tag 'logo.svg', class: 'logo', alt: 'Mastodon' + + .sidebar__toggle + .sidebar__toggle__logo + = link_to root_path do + = svg_logo_full + + = link_to '#', class: 'sidebar__toggle__icon' do + = fa_icon 'bars' + + = render_navigation - = render_navigation .content-wrapper .content %h2= yield :page_title @@ -17,4 +27,6 @@ = yield + .sidebar-wrapper.sidebar-wrapper--empty + = render template: 'layouts/application' From 73a5ef03b2ea175a24c33257638f46f71d22b95a Mon Sep 17 00:00:00 2001 From: Yamagishi Kazutoshi Date: Sat, 21 Sep 2019 00:13:45 +0900 Subject: [PATCH 121/134] Respect original ID with ToC (#11895) --- app/lib/toc_generator.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/lib/toc_generator.rb b/app/lib/toc_generator.rb index c6e179557..351675a5c 100644 --- a/app/lib/toc_generator.rb +++ b/app/lib/toc_generator.rb @@ -45,7 +45,7 @@ class TOCGenerator parsed_html.traverse do |node| next unless TARGET_ELEMENTS.include?(node.name) - anchor = node.text.parameterize + anchor = node['id'] || node.text.parameterize @slugs[anchor] += 1 anchor = "#{anchor}-#{@slugs[anchor]}" if @slugs[anchor] > 1 From 450639a406217bf4aaad5a37d874f384cec06164 Mon Sep 17 00:00:00 2001 From: Eugen Rochko Date: Fri, 20 Sep 2019 21:22:16 +0200 Subject: [PATCH 122/134] Fix hashtag batch actions being unavailable on pending review page (#11897) Regression from #11829 --- app/views/admin/tags/index.html.haml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/views/admin/tags/index.html.haml b/app/views/admin/tags/index.html.haml index c767c9d18..498b93083 100644 --- a/app/views/admin/tags/index.html.haml +++ b/app/views/admin/tags/index.html.haml @@ -51,7 +51,7 @@ %label.batch-table__toolbar__select.batch-checkbox-all = check_box_tag :batch_checkbox_all, nil, false .batch-table__toolbar__actions - - if params[:review] == 'pending_review' + - if params[:pending_review] == '1' = f.button safe_join([fa_icon('check'), t('admin.accounts.approve')]), name: :approve, class: 'table-action-link', type: :submit, data: { confirm: t('admin.reports.are_you_sure') } = f.button safe_join([fa_icon('times'), t('admin.accounts.reject')]), name: :reject, class: 'table-action-link', type: :submit, data: { confirm: t('admin.reports.are_you_sure') } From 3c8372fa81c77bb470be150f1fb56136317e4cfe Mon Sep 17 00:00:00 2001 From: Eugen Rochko Date: Fri, 20 Sep 2019 22:59:29 +0200 Subject: [PATCH 123/134] Bump version to 2.9.3 (#11899) --- CHANGELOG.md | 59 +++++++++++++++++++++++++++++++++++++++++ lib/mastodon/version.rb | 2 +- 2 files changed, 60 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 539fec531..a17fbf8f0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,65 @@ Changelog All notable changes to this project will be documented in this file. +## [2.9.3] - 2019-08-10 +### Added + +- Add GIF and WebP support for custom emojis ([Gargron](https://github.com/tootsuite/mastodon/pull/11519)) +- Add logout link to dropdown menu in web UI ([koyuawsmbrtn](https://github.com/tootsuite/mastodon/pull/11353)) +- Add indication that text search is unavailable in web UI ([ThibG](https://github.com/tootsuite/mastodon/pull/11112), [ThibG](https://github.com/tootsuite/mastodon/pull/11202)) +- Add `suffix` to `Mastodon::Version` to help forks ([clarfon](https://github.com/tootsuite/mastodon/pull/11407)) +- Add on-hover animation to animated custom emoji in web UI ([ThibG](https://github.com/tootsuite/mastodon/pull/11348), [ThibG](https://github.com/tootsuite/mastodon/pull/11404), [ThibG](https://github.com/tootsuite/mastodon/pull/11522)) +- Add custom emoji support in profile metadata labels ([ThibG](https://github.com/tootsuite/mastodon/pull/11350)) + +### Changed + +- Change default interface of web and streaming from 0.0.0.0 to 127.0.0.1 ([Gargron](https://github.com/tootsuite/mastodon/pull/11302), [zunda](https://github.com/tootsuite/mastodon/pull/11378), [Gargron](https://github.com/tootsuite/mastodon/pull/11351), [zunda](https://github.com/tootsuite/mastodon/pull/11326)) +- Change the retry limit of web push notifications ([highemerly](https://github.com/tootsuite/mastodon/pull/11292)) +- Change ActivityPub deliveries to not retry HTTP 501 errors ([Gargron](https://github.com/tootsuite/mastodon/pull/11233)) +- Change language detection to include hashtags as words ([Gargron](https://github.com/tootsuite/mastodon/pull/11341)) +- Change terms and privacy policy pages to always be accessible ([Gargron](https://github.com/tootsuite/mastodon/pull/11334)) +- Change robots tag to include `noarchive` when user opts out of indexing ([Kjwon15](https://github.com/tootsuite/mastodon/pull/11421)) + +### Fixed + +- Fix account domain block not clearing out notifications ([Gargron](https://github.com/tootsuite/mastodon/pull/11393)) +- Fix incorrect locale sometimes being detected for browser ([Gargron](https://github.com/tootsuite/mastodon/pull/8657)) +- Fix crash when saving invalid domain name ([Gargron](https://github.com/tootsuite/mastodon/pull/11528)) +- Fix pinned statuses REST API returning pagination headers ([Gargron](https://github.com/tootsuite/mastodon/pull/11526)) +- Fix "cancel follow request" button having unreadable text in web UI ([Gargron](https://github.com/tootsuite/mastodon/pull/11521)) +- Fix image uploads being blank when canvas read access is blocked ([ThibG](https://github.com/tootsuite/mastodon/pull/11499)) +- Fix avatars not being animated on hover when not logged in ([ThibG](https://github.com/tootsuite/mastodon/pull/11349)) +- Fix overzealous sanitization of HTML lists ([ThibG](https://github.com/tootsuite/mastodon/pull/11354)) +- Fix block crashing when a follow request exists ([ThibG](https://github.com/tootsuite/mastodon/pull/11288)) +- Fix backup service crashing when an attachment is missing ([ThibG](https://github.com/tootsuite/mastodon/pull/11241)) +- Fix account moderation action always sending e-mail notification ([Gargron](https://github.com/tootsuite/mastodon/pull/11242)) +- Fix swiping columns on mobile sometimes failing in web UI ([ThibG](https://github.com/tootsuite/mastodon/pull/11200)) +- Fix wrong actor URI being serialized into poll updates ([ThibG](https://github.com/tootsuite/mastodon/pull/11194)) +- Fix statsd UDP sockets not being cleaned up in Sidekiq ([Gargron](https://github.com/tootsuite/mastodon/pull/11230)) +- Fix expiration date of filters being set to "never" when editing them ([ThibG](https://github.com/tootsuite/mastodon/pull/11204)) +- Fix support for MP4 files that are actually M4V files ([Gargron](https://github.com/tootsuite/mastodon/pull/11210)) +- Fix `alerts` not being typecast correctly in push subscription in REST API ([Gargron](https://github.com/tootsuite/mastodon/pull/11343)) +- Fix some notices staying on unrelated pages ([ThibG](https://github.com/tootsuite/mastodon/pull/11364)) +- Fix unboosting sometimes preventing a boost from reappearing on feed ([ThibG](https://github.com/tootsuite/mastodon/pull/11405), [Gargron](https://github.com/tootsuite/mastodon/pull/11450)) +- Fix only one middle dot being recognized in hashtags ([Gargron](https://github.com/tootsuite/mastodon/pull/11345), [ThibG](https://github.com/tootsuite/mastodon/pull/11363)) +- Fix unnecessary SQL query performed on unauthenticated requests ([Gargron](https://github.com/tootsuite/mastodon/pull/11179)) +- Fix incorrect timestamp displayed on featured tags ([Kjwon15](https://github.com/tootsuite/mastodon/pull/11477)) +- Fix privacy dropdown active state when dropdown is placed on top of it ([ThibG](https://github.com/tootsuite/mastodon/pull/11495)) +- Fix filters not being applied to poll options ([ThibG](https://github.com/tootsuite/mastodon/pull/11174)) +- Fix keyboard navigation on various dropdowns ([ThibG](https://github.com/tootsuite/mastodon/pull/11511), [ThibG](https://github.com/tootsuite/mastodon/pull/11492), [ThibG](https://github.com/tootsuite/mastodon/pull/11491)) +- Fix keyboard navigation in modals ([ThibG](https://github.com/tootsuite/mastodon/pull/11493)) +- Fix image conversation being non-deterministic due to timestamps ([Gargron](https://github.com/tootsuite/mastodon/pull/11408)) +- Fix web UI performance ([ThibG](https://github.com/tootsuite/mastodon/pull/11211), [ThibG](https://github.com/tootsuite/mastodon/pull/11234)) +- Fix scrolling to compose form when not necessary in web UI ([ThibG](https://github.com/tootsuite/mastodon/pull/11246), [ThibG](https://github.com/tootsuite/mastodon/pull/11182)) +- Fix save button being enabled when list title is empty in web UI ([ThibG](https://github.com/tootsuite/mastodon/pull/11475)) +- Fix poll expiration not being pre-filled on delete & redraft in web UI ([ThibG](https://github.com/tootsuite/mastodon/pull/11203)) +- Fix content warning sometimes being set when not requested in web UI ([ThibG](https://github.com/tootsuite/mastodon/pull/11206)) + +### Security + +- Fix invites not being disabled upon account suspension ([ThibG](https://github.com/tootsuite/mastodon/pull/11412)) +- Fix blocked domains still being able to fill database with account records ([Gargron](https://github.com/tootsuite/mastodon/pull/11219)) + ## [2.9.2] - 2019-06-22 ### Added diff --git a/lib/mastodon/version.rb b/lib/mastodon/version.rb index 3db57ceaa..99d709c98 100644 --- a/lib/mastodon/version.rb +++ b/lib/mastodon/version.rb @@ -13,7 +13,7 @@ module Mastodon end def patch - 2 + 3 end def flags From 1caa823d0654b86f8e69446bad8a3adee276d12a Mon Sep 17 00:00:00 2001 From: Eugen Rochko Date: Fri, 20 Sep 2019 23:05:23 +0200 Subject: [PATCH 124/134] New Crowdin translations (#11861) * New translations devise.en.yml (Esperanto) [ci skip] * New translations devise.en.yml (Danish) [ci skip] * New translations devise.en.yml (Asturian) [ci skip] * New translations devise.en.yml (Norwegian) [ci skip] * New translations en.json (Breton) [ci skip] * New translations devise.en.yml (Bulgarian) [ci skip] * New translations devise.en.yml (Chinese Traditional, Hong Kong) [ci skip] * New translations devise.en.yml (Croatian) [ci skip] * New translations devise.en.yml (Georgian) [ci skip] * New translations devise.en.yml (Hebrew) [ci skip] * New translations devise.en.yml (Ido) [ci skip] * New translations devise.en.yml (Indonesian) [ci skip] * New translations devise.en.yml (Russian) [ci skip] * New translations devise.en.yml (Czech) [ci skip] * New translations devise.en.yml (Serbian (Cyrillic)) [ci skip] * New translations devise.en.yml (Serbian (Latin)) [ci skip] * New translations devise.en.yml (Slovak) [ci skip] * New translations devise.en.yml (Ukrainian) [ci skip] * New translations devise.en.yml (Albanian) [ci skip] * New translations devise.en.yml (Arabic) [ci skip] * New translations devise.en.yml (Basque) [ci skip] * New translations devise.en.yml (Bengali) [ci skip] * New translations devise.en.yml (Catalan) [ci skip] * New translations devise.en.yml (Chinese Simplified) [ci skip] * New translations devise.en.yml (Chinese Traditional) [ci skip] * New translations devise.en.yml (Corsican) [ci skip] * New translations devise.en.yml (Welsh) [ci skip] * New translations en.json (Breton) [ci skip] * New translations en.json (Czech) [ci skip] * New translations en.yml (Czech) [ci skip] * New translations en.json (Breton) [ci skip] * New translations en.yml (Czech) [ci skip] * New translations simple_form.en.yml (Czech) [ci skip] * New translations en.json (Breton) [ci skip] * New translations en.json (Breton) [ci skip] * New translations en.json (German) [ci skip] * New translations en.yml (German) [ci skip] * New translations simple_form.en.yml (German) [ci skip] * New translations en.json (Corsican) [ci skip] * New translations en.yml (Corsican) [ci skip] * New translations simple_form.en.yml (Corsican) [ci skip] * New translations en.yml (Corsican) [ci skip] * New translations en.json (French) [ci skip] * New translations simple_form.en.yml (French) [ci skip] * New translations en.json (Korean) [ci skip] * New translations en.yml (Korean) [ci skip] * New translations simple_form.en.yml (Korean) [ci skip] * New translations en.json (Greek) [ci skip] * New translations en.yml (Greek) [ci skip] * New translations en.yml (Greek) [ci skip] * New translations simple_form.en.yml (Greek) [ci skip] * New translations activerecord.en.yml (Breton) [ci skip] * New translations activerecord.en.yml (Breton) [ci skip] * New translations devise.en.yml (Breton) [ci skip] * New translations devise.en.yml (Breton) [ci skip] * New translations devise.en.yml (Breton) [ci skip] * New translations devise.en.yml (Breton) [ci skip] * New translations simple_form.en.yml (Dutch) [ci skip] * New translations simple_form.en.yml (Esperanto) [ci skip] * New translations simple_form.en.yml (Estonian) [ci skip] * New translations simple_form.en.yml (Finnish) [ci skip] * New translations simple_form.en.yml (Danish) [ci skip] * New translations simple_form.en.yml (Chinese Simplified) [ci skip] * New translations simple_form.en.yml (Catalan) [ci skip] * New translations simple_form.en.yml (Chinese Traditional) [ci skip] * New translations simple_form.en.yml (Galician) [ci skip] * New translations simple_form.en.yml (Basque) [ci skip] * New translations simple_form.en.yml (Hungarian) [ci skip] * New translations simple_form.en.yml (Italian) [ci skip] * New translations simple_form.en.yml (Japanese) [ci skip] * New translations simple_form.en.yml (Ido) [ci skip] * New translations simple_form.en.yml (Indonesian) [ci skip] * New translations simple_form.en.yml (Croatian) [ci skip] * New translations simple_form.en.yml (Chinese Traditional, Hong Kong) [ci skip] * New translations simple_form.en.yml (Hebrew) [ci skip] * New translations simple_form.en.yml (Georgian) [ci skip] * New translations simple_form.en.yml (Arabic) [ci skip] * New translations simple_form.en.yml (Albanian) [ci skip] * New translations simple_form.en.yml (Asturian) [ci skip] * New translations simple_form.en.yml (Bulgarian) [ci skip] * New translations simple_form.en.yml (Thai) [ci skip] * New translations simple_form.en.yml (Swedish) [ci skip] * New translations simple_form.en.yml (Turkish) [ci skip] * New translations simple_form.en.yml (Spanish) [ci skip] * New translations simple_form.en.yml (Welsh) [ci skip] * New translations simple_form.en.yml (Norwegian) [ci skip] * New translations simple_form.en.yml (Russian) [ci skip] * New translations simple_form.en.yml (Serbian (Cyrillic)) [ci skip] * New translations simple_form.en.yml (Serbian (Latin)) [ci skip] * New translations en.json (Slovak) [ci skip] * New translations en.yml (Slovak) [ci skip] * New translations simple_form.en.yml (Slovak) [ci skip] * New translations simple_form.en.yml (Ukrainian) [ci skip] * New translations simple_form.en.yml (Portuguese) [ci skip] * New translations simple_form.en.yml (Slovenian) [ci skip] * New translations simple_form.en.yml (Romanian) [ci skip] * New translations simple_form.en.yml (Portuguese, Brazilian) [ci skip] * New translations simple_form.en.yml (Polish) [ci skip] * New translations simple_form.en.yml (Persian) [ci skip] * New translations simple_form.en.yml (Occitan) [ci skip] * New translations devise.en.yml (Slovak) [ci skip] * New translations en.yml (Czech) [ci skip] * New translations simple_form.en.yml (Czech) [ci skip] * New translations devise.en.yml (Czech) [ci skip] * New translations devise.en.yml (Occitan) [ci skip] * New translations en.json (Occitan) [ci skip] * New translations devise.en.yml (Occitan) [ci skip] * New translations en.json (Occitan) [ci skip] * New translations en.yml (Corsican) [ci skip] * New translations simple_form.en.yml (Corsican) [ci skip] * New translations devise.en.yml (Corsican) [ci skip] * New translations devise.en.yml (Corsican) [ci skip] * New translations en.yml (Albanian) [ci skip] * New translations en.yml (Basque) [ci skip] * New translations en.yml (Arabic) [ci skip] * New translations en.yml (Bengali) [ci skip] * New translations en.yml (Asturian) [ci skip] * New translations en.yml (Korean) [ci skip] * New translations en.yml (Kazakh) [ci skip] * New translations en.yml (Japanese) [ci skip] * New translations en.yml (Finnish) [ci skip] * New translations en.yml (Galician) [ci skip] * New translations en.yml (German) [ci skip] * New translations en.yml (Greek) [ci skip] * New translations en.yml (Hungarian) [ci skip] * New translations en.yml (Italian) [ci skip] * New translations en.yml (Telugu) [ci skip] * New translations en.yml (Swedish) [ci skip] * New translations en.yml (Thai) [ci skip] * New translations en.yml (Turkish) [ci skip] * New translations en.yml (Welsh) [ci skip] * New translations en.yml (Spanish) [ci skip] * New translations en.yml (Occitan) [ci skip] * New translations en.yml (Persian) [ci skip] * New translations en.yml (Polish) [ci skip] * New translations en.yml (Portuguese) [ci skip] * New translations en.yml (Portuguese, Brazilian) [ci skip] * New translations en.yml (Slovenian) [ci skip] * New translations en.yml (Estonian) [ci skip] * New translations en.yml (Indonesian) [ci skip] * New translations en.yml (Lithuanian) [ci skip] * New translations en.yml (Malay) [ci skip] * New translations en.yml (Norwegian) [ci skip] * New translations en.yml (Russian) [ci skip] * New translations en.yml (Chinese Traditional, Hong Kong) [ci skip] * New translations en.yml (Georgian) [ci skip] * New translations en.yml (Hebrew) [ci skip] * New translations en.yml (Corsican) [ci skip] * New translations en.yml (Czech) [ci skip] * New translations en.yml (Danish) [ci skip] * New translations en.yml (Dutch) [ci skip] * New translations en.yml (Esperanto) [ci skip] * New translations en.yml (Chinese Traditional) [ci skip] * New translations en.yml (Serbian (Cyrillic)) [ci skip] * New translations en.yml (Serbian (Latin)) [ci skip] * New translations en.json (Slovak) [ci skip] * New translations en.yml (Slovak) [ci skip] * New translations en.yml (Ukrainian) [ci skip] * New translations en.yml (French) [ci skip] * New translations en.yml (Catalan) [ci skip] * New translations en.yml (Chinese Simplified) [ci skip] * New translations devise.en.yml (Greek) [ci skip] * New translations en.yml (German) [ci skip] * New translations devise.en.yml (German) [ci skip] * New translations en.yml (German) [ci skip] * New translations simple_form.en.yml (German) [ci skip] * New translations en.yml (Czech) [ci skip] * New translations en.yml (Czech) [ci skip] * New translations en.yml (Chinese Simplified) [ci skip] * New translations en.yml (Chinese Traditional) [ci skip] * New translations en.yml (Corsican) [ci skip] * New translations en.yml (Czech) [ci skip] * New translations en.yml (Danish) [ci skip] * New translations en.yml (Albanian) [ci skip] * New translations en.yml (Basque) [ci skip] * New translations en.yml (Catalan) [ci skip] * New translations en.yml (Galician) [ci skip] * New translations en.yml (German) [ci skip] * New translations en.yml (Greek) [ci skip] * New translations en.yml (Hungarian) [ci skip] * New translations en.yml (Dutch) [ci skip] * New translations en.yml (Esperanto) [ci skip] * New translations en.yml (Estonian) [ci skip] * New translations en.yml (Finnish) [ci skip] * New translations en.yml (Arabic) [ci skip] * New translations en.yml (Georgian) [ci skip] * New translations en.yml (French) [ci skip] * New translations en.yml (Asturian) [ci skip] * New translations en.yml (Chinese Traditional, Hong Kong) [ci skip] * New translations en.yml (Turkish) [ci skip] * New translations en.yml (Welsh) [ci skip] * New translations en.yml (Portuguese, Brazilian) [ci skip] * New translations en.yml (Portuguese) [ci skip] * New translations en.yml (Thai) [ci skip] * New translations en.yml (Polish) [ci skip] * New translations en.yml (Persian) [ci skip] * New translations en.yml (Slovenian) [ci skip] * New translations en.yml (Spanish) [ci skip] * New translations en.yml (Swedish) [ci skip] * New translations en.yml (Occitan) [ci skip] * New translations en.yml (Norwegian) [ci skip] * New translations en.yml (Russian) [ci skip] * New translations en.yml (Serbian (Cyrillic)) [ci skip] * New translations en.yml (Serbian (Latin)) [ci skip] * New translations en.yml (Slovak) [ci skip] * New translations en.yml (Ukrainian) [ci skip] * New translations en.yml (Japanese) [ci skip] * New translations en.yml (Korean) [ci skip] * New translations en.yml (Kazakh) [ci skip] * New translations en.yml (Italian) [ci skip] * New translations en.yml (Lithuanian) [ci skip] * New translations en.yml (German) [ci skip] * New translations en.yml (German) [ci skip] * New translations simple_form.en.yml (German) [ci skip] * New translations en.json (Bulgarian) [ci skip] * New translations en.yml (Slovak) [ci skip] * New translations en.yml (Czech) [ci skip] * New translations en.yml (Czech) [ci skip] * New translations en.yml (Czech) [ci skip] * New translations simple_form.en.yml (Czech) [ci skip] * New translations simple_form.en.yml (Czech) [ci skip] * New translations en.json (Dutch) [ci skip] * New translations en.json (Dutch) [ci skip] * New translations en.json (Dutch) [ci skip] * New translations en.json (Dutch) [ci skip] * New translations en.json (Dutch) [ci skip] * New translations en.json (Dutch) [ci skip] * New translations en.yml (Dutch) [ci skip] * New translations devise.en.yml (Dutch) [ci skip] * New translations en.yml (Dutch) [ci skip] * New translations en.json (Galician) [ci skip] * New translations en.yml (Galician) [ci skip] * New translations devise.en.yml (Galician) [ci skip] * New translations en.yml (Galician) [ci skip] * New translations en.yml (Galician) [ci skip] * New translations simple_form.en.yml (Galician) [ci skip] * New translations en.yml (Dutch) [ci skip] * New translations en.yml (Dutch) [ci skip] * New translations en.yml (Dutch) [ci skip] * New translations en.yml (Dutch) [ci skip] * New translations en.yml (Dutch) [ci skip] * New translations devise.en.yml (Dutch) [ci skip] * New translations en.yml (Dutch) [ci skip] * New translations devise.en.yml (Dutch) [ci skip] * New translations en.yml (Dutch) [ci skip] * New translations en.yml (Dutch) [ci skip] * New translations en.yml (Dutch) [ci skip] * New translations en.yml (Dutch) [ci skip] * i18n-tasks normalize * yarn manage:translations --- app/javascript/mastodon/locales/ar.json | 4 + app/javascript/mastodon/locales/ast.json | 4 + app/javascript/mastodon/locales/bg.json | 18 +- app/javascript/mastodon/locales/bn.json | 4 + app/javascript/mastodon/locales/br.json | 94 ++-- app/javascript/mastodon/locales/ca.json | 4 + app/javascript/mastodon/locales/co.json | 10 +- app/javascript/mastodon/locales/cs.json | 8 +- app/javascript/mastodon/locales/cy.json | 4 + app/javascript/mastodon/locales/da.json | 4 + app/javascript/mastodon/locales/de.json | 10 +- .../mastodon/locales/defaultMessages.json | 50 +++ app/javascript/mastodon/locales/el.json | 10 +- app/javascript/mastodon/locales/en.json | 4 + app/javascript/mastodon/locales/eo.json | 4 + app/javascript/mastodon/locales/es.json | 4 + app/javascript/mastodon/locales/et.json | 4 + app/javascript/mastodon/locales/eu.json | 4 + app/javascript/mastodon/locales/fa.json | 4 + app/javascript/mastodon/locales/fi.json | 4 + app/javascript/mastodon/locales/fr.json | 10 +- app/javascript/mastodon/locales/ga.json | 419 +++++++++++++++++- app/javascript/mastodon/locales/gl.json | 8 +- app/javascript/mastodon/locales/he.json | 4 + app/javascript/mastodon/locales/hi.json | 4 + app/javascript/mastodon/locales/hr.json | 4 + app/javascript/mastodon/locales/hu.json | 4 + app/javascript/mastodon/locales/hy.json | 4 + app/javascript/mastodon/locales/id.json | 4 + app/javascript/mastodon/locales/io.json | 4 + app/javascript/mastodon/locales/it.json | 4 + app/javascript/mastodon/locales/ja.json | 4 + app/javascript/mastodon/locales/ka.json | 4 + app/javascript/mastodon/locales/kk.json | 4 + app/javascript/mastodon/locales/ko.json | 10 +- app/javascript/mastodon/locales/lt.json | 4 + app/javascript/mastodon/locales/lv.json | 4 + app/javascript/mastodon/locales/ms.json | 4 + app/javascript/mastodon/locales/nl.json | 32 +- app/javascript/mastodon/locales/nn.json | 14 +- app/javascript/mastodon/locales/no.json | 4 + app/javascript/mastodon/locales/oc.json | 54 +-- app/javascript/mastodon/locales/pl.json | 4 + app/javascript/mastodon/locales/pt-BR.json | 4 + app/javascript/mastodon/locales/pt-PT.json | 4 + app/javascript/mastodon/locales/ro.json | 4 + app/javascript/mastodon/locales/ru.json | 4 + app/javascript/mastodon/locales/sk.json | 10 +- app/javascript/mastodon/locales/sl.json | 4 + app/javascript/mastodon/locales/sq.json | 4 + app/javascript/mastodon/locales/sr-Latn.json | 4 + app/javascript/mastodon/locales/sr.json | 4 + app/javascript/mastodon/locales/sv.json | 4 + app/javascript/mastodon/locales/ta.json | 4 + app/javascript/mastodon/locales/te.json | 4 + app/javascript/mastodon/locales/th.json | 4 + app/javascript/mastodon/locales/tr.json | 4 + app/javascript/mastodon/locales/uk.json | 4 + .../mastodon/locales/whitelist_ga.json | 2 + app/javascript/mastodon/locales/zh-CN.json | 4 + app/javascript/mastodon/locales/zh-HK.json | 4 + app/javascript/mastodon/locales/zh-TW.json | 4 + config/locales/activerecord.br.yml | 12 + config/locales/ar.yml | 11 - config/locales/ast.yml | 4 - config/locales/bn.yml | 3 - config/locales/ca.yml | 23 - config/locales/co.yml | 34 +- config/locales/cs.yml | 78 ++-- config/locales/cy.yml | 6 - config/locales/da.yml | 8 - config/locales/de.yml | 74 +++- config/locales/devise.br.yml | 32 ++ config/locales/devise.co.yml | 12 + config/locales/devise.cs.yml | 12 + config/locales/devise.de.yml | 12 + config/locales/devise.el.yml | 4 + config/locales/devise.gl.yml | 12 + config/locales/devise.nl.yml | 12 + config/locales/devise.oc.yml | 12 + config/locales/devise.pt-PT.yml | 83 ++++ config/locales/devise.sk.yml | 2 +- config/locales/el.yml | 36 +- config/locales/eo.yml | 10 - config/locales/es.yml | 8 - config/locales/et.yml | 6 - config/locales/eu.yml | 10 - config/locales/fa.yml | 8 - config/locales/fi.yml | 6 - config/locales/fr.yml | 23 - config/locales/gl.yml | 77 +++- config/locales/he.yml | 3 - config/locales/hu.yml | 6 - config/locales/id.yml | 3 - config/locales/it.yml | 23 - config/locales/ja.yml | 23 - config/locales/ka.yml | 6 - config/locales/kk.yml | 6 - config/locales/ko.yml | 51 ++- config/locales/lt.yml | 6 - config/locales/ms.yml | 3 - config/locales/nl.yml | 68 ++- config/locales/no.yml | 6 - config/locales/oc.yml | 6 - config/locales/pl.yml | 6 - config/locales/pt-BR.yml | 6 - config/locales/pt-PT.yml | 6 - config/locales/ru.yml | 8 - config/locales/simple_form.co.yml | 4 + config/locales/simple_form.cs.yml | 16 +- config/locales/simple_form.de.yml | 14 + config/locales/simple_form.el.yml | 2 + config/locales/simple_form.fr.yml | 2 + config/locales/simple_form.gl.yml | 14 + config/locales/simple_form.ko.yml | 2 + config/locales/sk.yml | 40 +- config/locales/sl.yml | 6 - config/locales/sq.yml | 6 - config/locales/sr-Latn.yml | 6 - config/locales/sr.yml | 6 - config/locales/sv.yml | 6 - config/locales/te.yml | 3 - config/locales/th.yml | 4 - config/locales/tr.yml | 15 - config/locales/uk.yml | 17 - config/locales/zh-CN.yml | 10 - config/locales/zh-HK.yml | 6 - config/locales/zh-TW.yml | 6 - 128 files changed, 1361 insertions(+), 633 deletions(-) create mode 100644 app/javascript/mastodon/locales/whitelist_ga.json create mode 100644 config/locales/devise.pt-PT.yml diff --git a/app/javascript/mastodon/locales/ar.json b/app/javascript/mastodon/locales/ar.json index ce66a5d1c..01c56b4a0 100644 --- a/app/javascript/mastodon/locales/ar.json +++ b/app/javascript/mastodon/locales/ar.json @@ -111,6 +111,10 @@ "confirmations.reply.message": "الرد في الحين سوف يُعيد كتابة الرسالة التي أنت بصدد كتابتها. متأكد من أنك تريد المواصلة؟", "confirmations.unfollow.confirm": "إلغاء المتابعة", "confirmations.unfollow.message": "متأكد من أنك تريد إلغاء متابعة {name} ؟", + "conversation.delete": "Delete conversation", + "conversation.mark_as_read": "Mark as read", + "conversation.open": "View conversation", + "conversation.with": "With {names}", "directory.federated": "From known fediverse", "directory.local": "From {domain} only", "directory.new_arrivals": "الوافدون الجُدد", diff --git a/app/javascript/mastodon/locales/ast.json b/app/javascript/mastodon/locales/ast.json index 2ef693fcb..c636e313b 100644 --- a/app/javascript/mastodon/locales/ast.json +++ b/app/javascript/mastodon/locales/ast.json @@ -111,6 +111,10 @@ "confirmations.reply.message": "Replying now will overwrite the message you are currently composing. Are you sure you want to proceed?", "confirmations.unfollow.confirm": "Unfollow", "confirmations.unfollow.message": "¿De xuru que quies dexar de siguir a {name}?", + "conversation.delete": "Delete conversation", + "conversation.mark_as_read": "Mark as read", + "conversation.open": "View conversation", + "conversation.with": "With {names}", "directory.federated": "From known fediverse", "directory.local": "From {domain} only", "directory.new_arrivals": "New arrivals", diff --git a/app/javascript/mastodon/locales/bg.json b/app/javascript/mastodon/locales/bg.json index 309f04513..10f493b26 100644 --- a/app/javascript/mastodon/locales/bg.json +++ b/app/javascript/mastodon/locales/bg.json @@ -1,12 +1,12 @@ { - "account.add_or_remove_from_list": "Add or Remove from lists", - "account.badges.bot": "Bot", + "account.add_or_remove_from_list": "Добави или премахни от списъците", + "account.badges.bot": "бот", "account.block": "Блокирай", - "account.block_domain": "Hide everything from {domain}", - "account.blocked": "Blocked", + "account.block_domain": "скрий всичко от (домейн)", + "account.blocked": "Блокирани", "account.cancel_follow_request": "Cancel follow request", "account.direct": "Direct Message @{name}", - "account.domain_blocked": "Domain hidden", + "account.domain_blocked": "Скрит домейн", "account.edit_profile": "Редактирай профила си", "account.endorse": "Feature on profile", "account.follow": "Последвай", @@ -45,7 +45,7 @@ "autosuggest_hashtag.per_week": "{count} per week", "boost_modal.combo": "You can press {combo} to skip this next time", "bundle_column_error.body": "Something went wrong while loading this component.", - "bundle_column_error.retry": "Try again", + "bundle_column_error.retry": "Опитай отново", "bundle_column_error.title": "Network error", "bundle_modal_error.close": "Close", "bundle_modal_error.message": "Something went wrong while loading this component.", @@ -58,7 +58,7 @@ "column.favourites": "Favourites", "column.follow_requests": "Follow requests", "column.home": "Начало", - "column.lists": "Lists", + "column.lists": "Списъци", "column.mutes": "Muted users", "column.notifications": "Известия", "column.pins": "Pinned toot", @@ -111,6 +111,10 @@ "confirmations.reply.message": "Replying now will overwrite the message you are currently composing. Are you sure you want to proceed?", "confirmations.unfollow.confirm": "Unfollow", "confirmations.unfollow.message": "Are you sure you want to unfollow {name}?", + "conversation.delete": "Delete conversation", + "conversation.mark_as_read": "Mark as read", + "conversation.open": "View conversation", + "conversation.with": "With {names}", "directory.federated": "From known fediverse", "directory.local": "From {domain} only", "directory.new_arrivals": "New arrivals", diff --git a/app/javascript/mastodon/locales/bn.json b/app/javascript/mastodon/locales/bn.json index e4984a118..8d67a93da 100644 --- a/app/javascript/mastodon/locales/bn.json +++ b/app/javascript/mastodon/locales/bn.json @@ -111,6 +111,10 @@ "confirmations.reply.message": "এখন মতামত লিখতে গেলে আপনার এখন যেটা লিখছেন সেটা মুছে যাবে। আপনি নি নিশ্চিত এটা করতে চান ?", "confirmations.unfollow.confirm": "অনুসরণ করা বাতিল করতে", "confirmations.unfollow.message": "আপনি কি নিশ্চিত {name} কে আর অনুসরণ করতে চান না ?", + "conversation.delete": "Delete conversation", + "conversation.mark_as_read": "Mark as read", + "conversation.open": "View conversation", + "conversation.with": "With {names}", "directory.federated": "From known fediverse", "directory.local": "From {domain} only", "directory.new_arrivals": "New arrivals", diff --git a/app/javascript/mastodon/locales/br.json b/app/javascript/mastodon/locales/br.json index 2de037f16..4104534af 100644 --- a/app/javascript/mastodon/locales/br.json +++ b/app/javascript/mastodon/locales/br.json @@ -1,60 +1,60 @@ { - "account.add_or_remove_from_list": "Add or Remove from lists", - "account.badges.bot": "Bot", - "account.block": "Block @{name}", - "account.block_domain": "Hide everything from {domain}", - "account.blocked": "Blocked", - "account.cancel_follow_request": "Cancel follow request", - "account.direct": "Direct message @{name}", - "account.domain_blocked": "Domain hidden", - "account.edit_profile": "Edit profile", - "account.endorse": "Feature on profile", - "account.follow": "Follow", - "account.followers": "Followers", - "account.followers.empty": "No one follows this user yet.", - "account.follows": "Follows", + "account.add_or_remove_from_list": "Ouzhpenn pe lemel ag ar listennadoù", + "account.badges.bot": "Robot", + "account.block": "Stankañ @{name}", + "account.block_domain": "Kuzh kement tra a {domain}", + "account.blocked": "Stanket", + "account.cancel_follow_request": "Nullañ ar pedad heuliañ", + "account.direct": "Kas ur c'hemennad da @{name}", + "account.domain_blocked": "Domani kuzhet", + "account.edit_profile": "Aozañ ar profil", + "account.endorse": "Lakaat war-wel war ar profil", + "account.follow": "Heuliañ", + "account.followers": "Heilour·ezed·ion", + "account.followers.empty": "Den na heul an implijour-mañ c'hoazh.", + "account.follows": "Koumanantoù", "account.follows.empty": "This user doesn't follow anyone yet.", - "account.follows_you": "Follows you", - "account.hide_reblogs": "Hide boosts from @{name}", - "account.last_status": "Last active", + "account.follows_you": "Ho heul", + "account.hide_reblogs": "Kuzh toudoù skignet gant @{name}", + "account.last_status": "Oberiantiz zivezhañ", "account.link_verified_on": "Ownership of this link was checked on {date}", "account.locked_info": "This account privacy status is set to locked. The owner manually reviews who can follow them.", "account.media": "Media", - "account.mention": "Mention @{name}", - "account.moved_to": "{name} has moved to:", - "account.mute": "Mute @{name}", - "account.mute_notifications": "Mute notifications from @{name}", - "account.muted": "Muted", - "account.never_active": "Never", - "account.posts": "Toots", - "account.posts_with_replies": "Toots and replies", - "account.report": "Report @{name}", + "account.mention": "Menegiñ @{name}", + "account.moved_to": "Dilojet en·he deus {name} da:", + "account.mute": "Kuzhat @{name}", + "account.mute_notifications": "Kuzh kemennoù a @{name}", + "account.muted": "Kuzhet", + "account.never_active": "Birviken", + "account.posts": "Toudoù", + "account.posts_with_replies": "Toudoù ha respontoù", + "account.report": "Disklêriañ @{name}", "account.requested": "Awaiting approval", - "account.share": "Share @{name}'s profile", - "account.show_reblogs": "Show boosts from @{name}", - "account.unblock": "Unblock @{name}", - "account.unblock_domain": "Unhide {domain}", + "account.share": "Skignañ profil @{name}", + "account.show_reblogs": "Diskouez toudoù a @{name}", + "account.unblock": "Distankañ @{name}", + "account.unblock_domain": "Diguzh {domain}", "account.unendorse": "Don't feature on profile", - "account.unfollow": "Unfollow", - "account.unmute": "Unmute @{name}", - "account.unmute_notifications": "Unmute notifications from @{name}", + "account.unfollow": "Diheuliañ", + "account.unmute": "Diguzhat @{name}", + "account.unmute_notifications": "Diguzhat kemennoù a @{name}", "alert.rate_limited.message": "Please retry after {retry_time, time, medium}.", "alert.rate_limited.title": "Rate limited", - "alert.unexpected.message": "An unexpected error occurred.", - "alert.unexpected.title": "Oops!", - "autosuggest_hashtag.per_week": "{count} per week", + "alert.unexpected.message": "Ur fazi dic'hortozet zo degouezhet.", + "alert.unexpected.title": "C'hem !", + "autosuggest_hashtag.per_week": "{count} bep sizhun", "boost_modal.combo": "You can press {combo} to skip this next time", "bundle_column_error.body": "Something went wrong while loading this component.", - "bundle_column_error.retry": "Try again", - "bundle_column_error.title": "Network error", - "bundle_modal_error.close": "Close", + "bundle_column_error.retry": "Klask endro", + "bundle_column_error.title": "Fazi rouedad", + "bundle_modal_error.close": "Serriñ", "bundle_modal_error.message": "Something went wrong while loading this component.", - "bundle_modal_error.retry": "Try again", - "column.blocks": "Blocked users", - "column.community": "Local timeline", - "column.direct": "Direct messages", - "column.directory": "Browse profiles", - "column.domain_blocks": "Hidden domains", + "bundle_modal_error.retry": "Klask endro", + "column.blocks": "Implijour·ezed·ion stanket", + "column.community": "Red-amzer lec'hel", + "column.direct": "Kemennadoù prevez", + "column.directory": "Mont a-dreuz ar profiloù", + "column.domain_blocks": "Domani kuzhet", "column.favourites": "Favourites", "column.follow_requests": "Follow requests", "column.home": "Home", @@ -111,6 +111,10 @@ "confirmations.reply.message": "Replying now will overwrite the message you are currently composing. Are you sure you want to proceed?", "confirmations.unfollow.confirm": "Unfollow", "confirmations.unfollow.message": "Are you sure you want to unfollow {name}?", + "conversation.delete": "Delete conversation", + "conversation.mark_as_read": "Mark as read", + "conversation.open": "View conversation", + "conversation.with": "With {names}", "directory.federated": "From known fediverse", "directory.local": "From {domain} only", "directory.new_arrivals": "New arrivals", diff --git a/app/javascript/mastodon/locales/ca.json b/app/javascript/mastodon/locales/ca.json index 77f84ac7d..b3afb0d5b 100644 --- a/app/javascript/mastodon/locales/ca.json +++ b/app/javascript/mastodon/locales/ca.json @@ -111,6 +111,10 @@ "confirmations.reply.message": "Responen ara es sobreescriurà el missatge que estàs editant. Estàs segur que vols continuar?", "confirmations.unfollow.confirm": "Deixa de seguir", "confirmations.unfollow.message": "Estàs segur que vols deixar de seguir {name}?", + "conversation.delete": "Delete conversation", + "conversation.mark_as_read": "Mark as read", + "conversation.open": "View conversation", + "conversation.with": "With {names}", "directory.federated": "From known fediverse", "directory.local": "From {domain} only", "directory.new_arrivals": "New arrivals", diff --git a/app/javascript/mastodon/locales/co.json b/app/javascript/mastodon/locales/co.json index d95f32b18..85685dccd 100644 --- a/app/javascript/mastodon/locales/co.json +++ b/app/javascript/mastodon/locales/co.json @@ -63,7 +63,7 @@ "column.notifications": "Nutificazione", "column.pins": "Statuti puntarulati", "column.public": "Linea pubblica glubale", - "column.status": "Toot", + "column.status": "Statutu", "column_back_button.label": "Ritornu", "column_header.hide_settings": "Piattà i parametri", "column_header.moveLeft_settings": "Spiazzà à manca", @@ -111,6 +111,10 @@ "confirmations.reply.message": "Risponde avà sguasserà u missaghju chì scrivite. Site sicuru·a chì vulete cuntinuà?", "confirmations.unfollow.confirm": "Disabbunassi", "confirmations.unfollow.message": "Site sicuru·a ch'ùn vulete più siguità @{name}?", + "conversation.delete": "Delete conversation", + "conversation.mark_as_read": "Mark as read", + "conversation.open": "View conversation", + "conversation.with": "With {names}", "directory.federated": "Da u fediverse cunisciutu", "directory.local": "Solu da {domain}", "directory.new_arrivals": "Ultimi arrivi", @@ -170,7 +174,7 @@ "home.column_settings.basic": "Bàsichi", "home.column_settings.show_reblogs": "Vede e spartere", "home.column_settings.show_replies": "Vede e risposte", - "home.column_settings.update_live": "Update in real-time", + "home.column_settings.update_live": "Attualizà in tempu reale", "intervals.full.days": "{number, plural, one {# ghjornu} other {# ghjorni}}", "intervals.full.hours": "{number, plural, one {# ora} other {# ore}}", "intervals.full.minutes": "{number, plural, one {# minuta} other {# minute}}", @@ -264,7 +268,7 @@ "navigation_bar.preferences": "Preferenze", "navigation_bar.public_timeline": "Linea pubblica glubale", "navigation_bar.security": "Sicurità", - "notification.and_n_others": "and {count, plural, one {# other} other {# others}}", + "notification.and_n_others": "è {count, plural, one {# altru} other {# altri}}", "notification.favourite": "{name} hà aghjuntu u vostru statutu à i so favuriti", "notification.follow": "{name} v'hà seguitatu", "notification.mention": "{name} v'hà mintuvatu", diff --git a/app/javascript/mastodon/locales/cs.json b/app/javascript/mastodon/locales/cs.json index 8acf27cb3..586ca5fd5 100644 --- a/app/javascript/mastodon/locales/cs.json +++ b/app/javascript/mastodon/locales/cs.json @@ -111,6 +111,10 @@ "confirmations.reply.message": "Odpovězením nyní přepíšete zprávu, kterou aktuálně píšete. Jste si jistý/á, že chcete pokračovat?", "confirmations.unfollow.confirm": "Přestat sledovat", "confirmations.unfollow.message": "jste si jistý/á, že chcete přestat sledovat uživatele {name}?", + "conversation.delete": "Delete conversation", + "conversation.mark_as_read": "Mark as read", + "conversation.open": "View conversation", + "conversation.with": "With {names}", "directory.federated": "Ze známého fedivesmíru", "directory.local": "Pouze z {domain}", "directory.new_arrivals": "Nově příchozí", @@ -170,7 +174,7 @@ "home.column_settings.basic": "Základní", "home.column_settings.show_reblogs": "Zobrazit boosty", "home.column_settings.show_replies": "Zobrazit odpovědi", - "home.column_settings.update_live": "Update in real-time", + "home.column_settings.update_live": "Aktualizovat v reálném čase", "intervals.full.days": "{number, plural, one {# den} few {# dny} many {# dne} other {# dní}}", "intervals.full.hours": "{number, plural, one {# hodina} few {# hodiny} many {# hodiny} other {# hodin}}", "intervals.full.minutes": "{number, plural, one {# minuta} few {# minuty} many {# minuty} other {# minut}}", @@ -264,7 +268,7 @@ "navigation_bar.preferences": "Předvolby", "navigation_bar.public_timeline": "Federovaná časová osa", "navigation_bar.security": "Zabezpečení", - "notification.and_n_others": "and {count, plural, one {# other} other {# others}}", + "notification.and_n_others": "a {count, plural, one {# další} few {# další} many {# dalších} other {# dalších}}", "notification.favourite": "{name} si oblíbil/a váš toot", "notification.follow": "{name} vás začal/a sledovat", "notification.mention": "{name} vás zmínil/a", diff --git a/app/javascript/mastodon/locales/cy.json b/app/javascript/mastodon/locales/cy.json index cdf2656d7..c06f0fd66 100644 --- a/app/javascript/mastodon/locales/cy.json +++ b/app/javascript/mastodon/locales/cy.json @@ -111,6 +111,10 @@ "confirmations.reply.message": "Bydd ateb nawr yn cymryd lle y neges yr ydych yn cyfansoddi ar hyn o bryd. Ydych chi'n sicr yr ydych am barhau?", "confirmations.unfollow.confirm": "Dad-ddilynwch", "confirmations.unfollow.message": "Ydych chi'n sicr eich bod am ddad-ddilyn {name}?", + "conversation.delete": "Delete conversation", + "conversation.mark_as_read": "Mark as read", + "conversation.open": "View conversation", + "conversation.with": "With {names}", "directory.federated": "From known fediverse", "directory.local": "From {domain} only", "directory.new_arrivals": "New arrivals", diff --git a/app/javascript/mastodon/locales/da.json b/app/javascript/mastodon/locales/da.json index 14b0f7563..aef26dbf0 100644 --- a/app/javascript/mastodon/locales/da.json +++ b/app/javascript/mastodon/locales/da.json @@ -111,6 +111,10 @@ "confirmations.reply.message": "Hvis du svarer nu vil du overskrive den besked du er ved at skrive. Er du sikker på, du vil fortsætte?", "confirmations.unfollow.confirm": "Følg ikke længere", "confirmations.unfollow.message": "Er du sikker på, du ikke længere vil følge {name}?", + "conversation.delete": "Delete conversation", + "conversation.mark_as_read": "Mark as read", + "conversation.open": "View conversation", + "conversation.with": "With {names}", "directory.federated": "Fra kendt fedivers", "directory.local": "Kun fra {domain}", "directory.new_arrivals": "Nye ankomster", diff --git a/app/javascript/mastodon/locales/de.json b/app/javascript/mastodon/locales/de.json index 845bc5156..566332293 100644 --- a/app/javascript/mastodon/locales/de.json +++ b/app/javascript/mastodon/locales/de.json @@ -63,7 +63,7 @@ "column.notifications": "Mitteilungen", "column.pins": "Angeheftete Beiträge", "column.public": "Föderierte Zeitleiste", - "column.status": "Toot", + "column.status": "Beitrag", "column_back_button.label": "Zurück", "column_header.hide_settings": "Einstellungen verbergen", "column_header.moveLeft_settings": "Spalte nach links verschieben", @@ -111,6 +111,10 @@ "confirmations.reply.message": "Wenn du jetzt antwortest wird es die gesamte Nachricht verwerfen, die du gerade schreibst. Möchtest du wirklich fortfahren?", "confirmations.unfollow.confirm": "Entfolgen", "confirmations.unfollow.message": "Bist du dir sicher, dass du {name} entfolgen möchtest?", + "conversation.delete": "Delete conversation", + "conversation.mark_as_read": "Mark as read", + "conversation.open": "View conversation", + "conversation.with": "With {names}", "directory.federated": "Aus dem Fediverse", "directory.local": "Nur von {domain}", "directory.new_arrivals": "Neue Benutzer", @@ -170,7 +174,7 @@ "home.column_settings.basic": "Einfach", "home.column_settings.show_reblogs": "Geteilte Beiträge anzeigen", "home.column_settings.show_replies": "Antworten anzeigen", - "home.column_settings.update_live": "Update in real-time", + "home.column_settings.update_live": "In Echtzeit aktualisieren", "intervals.full.days": "{number, plural, one {# Tag} other {# Tage}}", "intervals.full.hours": "{number, plural, one {# Stunde} other {# Stunden}}", "intervals.full.minutes": "{number, plural, one {# Minute} other {# Minuten}}", @@ -264,7 +268,7 @@ "navigation_bar.preferences": "Einstellungen", "navigation_bar.public_timeline": "Föderierte Zeitleiste", "navigation_bar.security": "Sicherheit", - "notification.and_n_others": "and {count, plural, one {# other} other {# others}}", + "notification.and_n_others": "und {count, plural, one {# andere Person} other {# andere Personen}}", "notification.favourite": "{name} hat deinen Beitrag favorisiert", "notification.follow": "{name} folgt dir", "notification.mention": "{name} hat dich erwähnt", diff --git a/app/javascript/mastodon/locales/defaultMessages.json b/app/javascript/mastodon/locales/defaultMessages.json index db68f18c5..887952190 100644 --- a/app/javascript/mastodon/locales/defaultMessages.json +++ b/app/javascript/mastodon/locales/defaultMessages.json @@ -1264,6 +1264,56 @@ ], "path": "app/javascript/mastodon/features/compose/index.json" }, + { + "descriptors": [ + { + "defaultMessage": "More", + "id": "status.more" + }, + { + "defaultMessage": "View conversation", + "id": "conversation.open" + }, + { + "defaultMessage": "Reply", + "id": "status.reply" + }, + { + "defaultMessage": "Mark as read", + "id": "conversation.mark_as_read" + }, + { + "defaultMessage": "Delete conversation", + "id": "conversation.delete" + }, + { + "defaultMessage": "Mute conversation", + "id": "status.mute_conversation" + }, + { + "defaultMessage": "Unmute conversation", + "id": "status.unmute_conversation" + }, + { + "defaultMessage": "With {names}", + "id": "conversation.with" + } + ], + "path": "app/javascript/mastodon/features/direct_timeline/components/conversation.json" + }, + { + "descriptors": [ + { + "defaultMessage": "Reply", + "id": "confirmations.reply.confirm" + }, + { + "defaultMessage": "Replying now will overwrite the message you are currently composing. Are you sure you want to proceed?", + "id": "confirmations.reply.message" + } + ], + "path": "app/javascript/mastodon/features/direct_timeline/containers/conversation_container.json" + }, { "descriptors": [ { diff --git a/app/javascript/mastodon/locales/el.json b/app/javascript/mastodon/locales/el.json index bdd1da36c..ffbdefaeb 100644 --- a/app/javascript/mastodon/locales/el.json +++ b/app/javascript/mastodon/locales/el.json @@ -63,7 +63,7 @@ "column.notifications": "Ειδοποιήσεις", "column.pins": "Καρφιτσωμένα τουτ", "column.public": "Ομοσπονδιακή ροή", - "column.status": "Toot", + "column.status": "Τουτ", "column_back_button.label": "Πίσω", "column_header.hide_settings": "Απόκρυψη ρυθμίσεων", "column_header.moveLeft_settings": "Μεταφορά κολώνας αριστερά", @@ -111,6 +111,10 @@ "confirmations.reply.message": "Απαντώντας τώρα θα αντικαταστήσεις το κείμενο που ήδη γράφεις. Σίγουρα θέλεις να συνεχίσεις;", "confirmations.unfollow.confirm": "Διακοπή παρακολούθησης", "confirmations.unfollow.message": "Σίγουρα θες να πάψεις να ακολουθείς τον/την {name};", + "conversation.delete": "Delete conversation", + "conversation.mark_as_read": "Mark as read", + "conversation.open": "View conversation", + "conversation.with": "With {names}", "directory.federated": "Από το γνωστό fediverse", "directory.local": "Μόνο από {domain}", "directory.new_arrivals": "Νέες αφίξεις", @@ -170,7 +174,7 @@ "home.column_settings.basic": "Βασικές ρυθμίσεις", "home.column_settings.show_reblogs": "Εμφάνιση προωθήσεων", "home.column_settings.show_replies": "Εμφάνιση απαντήσεων", - "home.column_settings.update_live": "Update in real-time", + "home.column_settings.update_live": "Ενημέρωση σε πραγματικό χρόνο", "intervals.full.days": "{number, plural, one {# μέρα} other {# μέρες}}", "intervals.full.hours": "{number, plural, one {# ώρα} other {# ώρες}}", "intervals.full.minutes": "{number, plural, one {# λεπτό} other {# λεπτά}}", @@ -264,7 +268,7 @@ "navigation_bar.preferences": "Προτιμήσεις", "navigation_bar.public_timeline": "Ομοσπονδιακή ροή", "navigation_bar.security": "Ασφάλεια", - "notification.and_n_others": "and {count, plural, one {# other} other {# others}}", + "notification.and_n_others": "και {count, plural, one {# άλλη} other {# άλλες}}", "notification.favourite": "Ο/Η {name} σημείωσε ως αγαπημένη την κατάστασή σου", "notification.follow": "Ο/Η {name} σε ακολούθησε", "notification.mention": "Ο/Η {name} σε ανέφερε", diff --git a/app/javascript/mastodon/locales/en.json b/app/javascript/mastodon/locales/en.json index e959e5188..0b9511800 100644 --- a/app/javascript/mastodon/locales/en.json +++ b/app/javascript/mastodon/locales/en.json @@ -111,6 +111,10 @@ "confirmations.reply.message": "Replying now will overwrite the message you are currently composing. Are you sure you want to proceed?", "confirmations.unfollow.confirm": "Unfollow", "confirmations.unfollow.message": "Are you sure you want to unfollow {name}?", + "conversation.delete": "Delete conversation", + "conversation.mark_as_read": "Mark as read", + "conversation.open": "View conversation", + "conversation.with": "With {names}", "directory.federated": "From known fediverse", "directory.local": "From {domain} only", "directory.new_arrivals": "New arrivals", diff --git a/app/javascript/mastodon/locales/eo.json b/app/javascript/mastodon/locales/eo.json index 31750050e..2d7fcd19b 100644 --- a/app/javascript/mastodon/locales/eo.json +++ b/app/javascript/mastodon/locales/eo.json @@ -111,6 +111,10 @@ "confirmations.reply.message": "Respondi nun anstataŭigos la mesaĝon, kiun vi nun skribas. Ĉu vi certas, ke vi volas daŭrigi?", "confirmations.unfollow.confirm": "Ne plu sekvi", "confirmations.unfollow.message": "Ĉu vi certas, ke vi volas ĉesi sekvi {name}?", + "conversation.delete": "Delete conversation", + "conversation.mark_as_read": "Mark as read", + "conversation.open": "View conversation", + "conversation.with": "With {names}", "directory.federated": "El konata fediverso", "directory.local": "Nur de {domain}", "directory.new_arrivals": "Novaj veniĝoj", diff --git a/app/javascript/mastodon/locales/es.json b/app/javascript/mastodon/locales/es.json index a033f6e1f..33ee26337 100644 --- a/app/javascript/mastodon/locales/es.json +++ b/app/javascript/mastodon/locales/es.json @@ -111,6 +111,10 @@ "confirmations.reply.message": "Responder sobrescribirá el mensaje que estás escribiendo. ¿Estás seguro de que deseas continuar?", "confirmations.unfollow.confirm": "Dejar de seguir", "confirmations.unfollow.message": "¿Estás seguro de que quieres dejar de seguir a {name}?", + "conversation.delete": "Delete conversation", + "conversation.mark_as_read": "Mark as read", + "conversation.open": "View conversation", + "conversation.with": "With {names}", "directory.federated": "Desde el fediverso conocido", "directory.local": "Sólo de {domain}", "directory.new_arrivals": "Recién llegados", diff --git a/app/javascript/mastodon/locales/et.json b/app/javascript/mastodon/locales/et.json index 1d1dfd35a..7a7f6bec2 100644 --- a/app/javascript/mastodon/locales/et.json +++ b/app/javascript/mastodon/locales/et.json @@ -111,6 +111,10 @@ "confirmations.reply.message": "Kohene vastamine kirjutab üle sõnumi, mida hetkel koostad. Oled kindel, et soovid jätkata?", "confirmations.unfollow.confirm": "Ära jälgi", "confirmations.unfollow.message": "Oled kindel, et ei soovi jälgida {name}?", + "conversation.delete": "Delete conversation", + "conversation.mark_as_read": "Mark as read", + "conversation.open": "View conversation", + "conversation.with": "With {names}", "directory.federated": "From known fediverse", "directory.local": "From {domain} only", "directory.new_arrivals": "New arrivals", diff --git a/app/javascript/mastodon/locales/eu.json b/app/javascript/mastodon/locales/eu.json index f1fc17fdd..5ec03c3ba 100644 --- a/app/javascript/mastodon/locales/eu.json +++ b/app/javascript/mastodon/locales/eu.json @@ -111,6 +111,10 @@ "confirmations.reply.message": "Orain erantzuteak idazten ari zaren mezua gainidatziko du. Ziur jarraitu nahi duzula?", "confirmations.unfollow.confirm": "Utzi jarraitzeari", "confirmations.unfollow.message": "Ziur {name} jarraitzeari utzi nahi diozula?", + "conversation.delete": "Delete conversation", + "conversation.mark_as_read": "Mark as read", + "conversation.open": "View conversation", + "conversation.with": "With {names}", "directory.federated": "Fedibertso ezagunekoak", "directory.local": "{domain} domeinukoak soilik", "directory.new_arrivals": "Iritsi berriak", diff --git a/app/javascript/mastodon/locales/fa.json b/app/javascript/mastodon/locales/fa.json index 9382ec5ee..c4bcf21ef 100644 --- a/app/javascript/mastodon/locales/fa.json +++ b/app/javascript/mastodon/locales/fa.json @@ -111,6 +111,10 @@ "confirmations.reply.message": "اگر الان پاسخ دهید، چیزی که در حال نوشتنش بودید پاک خواهد شد. آیا همین را می‌خواهید؟", "confirmations.unfollow.confirm": "لغو پیگیری", "confirmations.unfollow.message": "آیا واقعاً می‌خواهید به پیگیری از {name} پایان دهید؟", + "conversation.delete": "Delete conversation", + "conversation.mark_as_read": "Mark as read", + "conversation.open": "View conversation", + "conversation.with": "With {names}", "directory.federated": "From known fediverse", "directory.local": "From {domain} only", "directory.new_arrivals": "New arrivals", diff --git a/app/javascript/mastodon/locales/fi.json b/app/javascript/mastodon/locales/fi.json index 01b5edad1..ff11915c3 100644 --- a/app/javascript/mastodon/locales/fi.json +++ b/app/javascript/mastodon/locales/fi.json @@ -111,6 +111,10 @@ "confirmations.reply.message": "Jos vastaat nyt, vastaus korvaa tällä hetkellä työstämäsi viestin. Oletko varma, että haluat jatkaa?", "confirmations.unfollow.confirm": "Lakkaa seuraamasta", "confirmations.unfollow.message": "Haluatko varmasti lakata seuraamasta käyttäjää {name}?", + "conversation.delete": "Delete conversation", + "conversation.mark_as_read": "Mark as read", + "conversation.open": "View conversation", + "conversation.with": "With {names}", "directory.federated": "From known fediverse", "directory.local": "From {domain} only", "directory.new_arrivals": "New arrivals", diff --git a/app/javascript/mastodon/locales/fr.json b/app/javascript/mastodon/locales/fr.json index 7cfe9829a..59c9ce800 100644 --- a/app/javascript/mastodon/locales/fr.json +++ b/app/javascript/mastodon/locales/fr.json @@ -63,7 +63,7 @@ "column.notifications": "Notifications", "column.pins": "Pouets épinglés", "column.public": "Fil public global", - "column.status": "Toot", + "column.status": "Pouet", "column_back_button.label": "Retour", "column_header.hide_settings": "Masquer les paramètres", "column_header.moveLeft_settings": "Déplacer la colonne vers la gauche", @@ -111,6 +111,10 @@ "confirmations.reply.message": "Répondre maintenant écrasera le message que vous êtes en train de composer. Voulez-vous vraiment continuer ?", "confirmations.unfollow.confirm": "Ne plus suivre", "confirmations.unfollow.message": "Voulez-vous arrêter de suivre {name} ?", + "conversation.delete": "Delete conversation", + "conversation.mark_as_read": "Mark as read", + "conversation.open": "View conversation", + "conversation.with": "With {names}", "directory.federated": "De la fédiverse connue", "directory.local": "De {domain} seulement", "directory.new_arrivals": "Nouveaux arrivants", @@ -170,7 +174,7 @@ "home.column_settings.basic": "Basique", "home.column_settings.show_reblogs": "Afficher les partages", "home.column_settings.show_replies": "Afficher les réponses", - "home.column_settings.update_live": "Update in real-time", + "home.column_settings.update_live": "Mettre à jour en temps réel", "intervals.full.days": "{number, plural, one {# jour} other {# jours}}", "intervals.full.hours": "{number, plural, one {# heure} other {# heures}}", "intervals.full.minutes": "{number, plural, one {# minute} other {# minutes}}", @@ -264,7 +268,7 @@ "navigation_bar.preferences": "Préférences", "navigation_bar.public_timeline": "Fil public global", "navigation_bar.security": "Sécurité", - "notification.and_n_others": "and {count, plural, one {# other} other {# others}}", + "notification.and_n_others": "et {count, plural, one {# autre} other {# autres}}", "notification.favourite": "{name} a ajouté à ses favoris :", "notification.follow": "{name} vous suit", "notification.mention": "{name} vous a mentionné :", diff --git a/app/javascript/mastodon/locales/ga.json b/app/javascript/mastodon/locales/ga.json index 0967ef424..560fa3bca 100644 --- a/app/javascript/mastodon/locales/ga.json +++ b/app/javascript/mastodon/locales/ga.json @@ -1 +1,418 @@ -{} +{ + "account.add_or_remove_from_list": "Add or Remove from lists", + "account.badges.bot": "Bot", + "account.block": "Block @{name}", + "account.block_domain": "Hide everything from {domain}", + "account.blocked": "Blocked", + "account.cancel_follow_request": "Cancel follow request", + "account.direct": "Direct message @{name}", + "account.domain_blocked": "Domain hidden", + "account.edit_profile": "Edit profile", + "account.endorse": "Feature on profile", + "account.follow": "Follow", + "account.followers": "Followers", + "account.followers.empty": "No one follows this user yet.", + "account.follows": "Follows", + "account.follows.empty": "This user doesn't follow anyone yet.", + "account.follows_you": "Follows you", + "account.hide_reblogs": "Hide boosts from @{name}", + "account.last_status": "Last active", + "account.link_verified_on": "Ownership of this link was checked on {date}", + "account.locked_info": "This account privacy status is set to locked. The owner manually reviews who can follow them.", + "account.media": "Media", + "account.mention": "Mention @{name}", + "account.moved_to": "{name} has moved to:", + "account.mute": "Mute @{name}", + "account.mute_notifications": "Mute notifications from @{name}", + "account.muted": "Muted", + "account.never_active": "Never", + "account.posts": "Toots", + "account.posts_with_replies": "Toots and replies", + "account.report": "Report @{name}", + "account.requested": "Awaiting approval", + "account.share": "Share @{name}'s profile", + "account.show_reblogs": "Show boosts from @{name}", + "account.unblock": "Unblock @{name}", + "account.unblock_domain": "Unhide {domain}", + "account.unendorse": "Don't feature on profile", + "account.unfollow": "Unfollow", + "account.unmute": "Unmute @{name}", + "account.unmute_notifications": "Unmute notifications from @{name}", + "alert.rate_limited.message": "Please retry after {retry_time, time, medium}.", + "alert.rate_limited.title": "Rate limited", + "alert.unexpected.message": "An unexpected error occurred.", + "alert.unexpected.title": "Oops!", + "autosuggest_hashtag.per_week": "{count} per week", + "boost_modal.combo": "You can press {combo} to skip this next time", + "bundle_column_error.body": "Something went wrong while loading this component.", + "bundle_column_error.retry": "Try again", + "bundle_column_error.title": "Network error", + "bundle_modal_error.close": "Close", + "bundle_modal_error.message": "Something went wrong while loading this component.", + "bundle_modal_error.retry": "Try again", + "column.blocks": "Blocked users", + "column.community": "Local timeline", + "column.direct": "Direct messages", + "column.directory": "Browse profiles", + "column.domain_blocks": "Hidden domains", + "column.favourites": "Favourites", + "column.follow_requests": "Follow requests", + "column.home": "Home", + "column.lists": "Lists", + "column.mutes": "Muted users", + "column.notifications": "Notifications", + "column.pins": "Pinned toot", + "column.public": "Federated timeline", + "column.status": "Toot", + "column_back_button.label": "Back", + "column_header.hide_settings": "Hide settings", + "column_header.moveLeft_settings": "Move column to the left", + "column_header.moveRight_settings": "Move column to the right", + "column_header.pin": "Pin", + "column_header.show_settings": "Show settings", + "column_header.unpin": "Unpin", + "column_subheading.settings": "Settings", + "community.column_settings.media_only": "Media only", + "compose_form.direct_message_warning": "This toot will only be sent to all the mentioned users.", + "compose_form.direct_message_warning_learn_more": "Learn more", + "compose_form.hashtag_warning": "This toot won't be listed under any hashtag as it is unlisted. Only public toots can be searched by hashtag.", + "compose_form.lock_disclaimer": "Your account is not {locked}. Anyone can follow you to view your follower-only posts.", + "compose_form.lock_disclaimer.lock": "locked", + "compose_form.placeholder": "What is on your mind?", + "compose_form.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.publish": "Toot", + "compose_form.publish_loud": "{publish}!", + "compose_form.sensitive.hide": "Mark media as sensitive", + "compose_form.sensitive.marked": "Media is marked as sensitive", + "compose_form.sensitive.unmarked": "Media is not marked as sensitive", + "compose_form.spoiler.marked": "Text is hidden behind warning", + "compose_form.spoiler.unmarked": "Text is not hidden", + "compose_form.spoiler_placeholder": "Write your warning here", + "confirmation_modal.cancel": "Cancel", + "confirmations.block.block_and_report": "Block & Report", + "confirmations.block.confirm": "Block", + "confirmations.block.message": "Are you sure you want to block {name}?", + "confirmations.delete.confirm": "Delete", + "confirmations.delete.message": "Are you sure you want to delete this status?", + "confirmations.delete_list.confirm": "Delete", + "confirmations.delete_list.message": "Are you sure you want to permanently delete this list?", + "confirmations.domain_block.confirm": "Hide entire domain", + "confirmations.domain_block.message": "Are you really, really sure you want to block the entire {domain}? In most cases a few targeted blocks or mutes are sufficient and preferable. You will not see content from that domain in any public timelines or your notifications. Your followers from that domain will be removed.", + "confirmations.logout.confirm": "Log out", + "confirmations.logout.message": "Are you sure you want to log out?", + "confirmations.mute.confirm": "Mute", + "confirmations.mute.message": "Are you sure you want to mute {name}?", + "confirmations.redraft.confirm": "Delete & redraft", + "confirmations.redraft.message": "Are you sure you want to delete this status and re-draft it? Favourites and boosts will be lost, and replies to the original post will be orphaned.", + "confirmations.reply.confirm": "Reply", + "confirmations.reply.message": "Replying now will overwrite the message you are currently composing. Are you sure you want to proceed?", + "confirmations.unfollow.confirm": "Unfollow", + "confirmations.unfollow.message": "Are you sure you want to unfollow {name}?", + "conversation.delete": "Delete conversation", + "conversation.mark_as_read": "Mark as read", + "conversation.open": "View conversation", + "conversation.with": "With {names}", + "directory.federated": "From known fediverse", + "directory.local": "From {domain} only", + "directory.new_arrivals": "New arrivals", + "directory.recently_active": "Recently active", + "embed.instructions": "Embed this status on your website by copying the code below.", + "embed.preview": "Here is what it will look like:", + "emoji_button.activity": "Activity", + "emoji_button.custom": "Custom", + "emoji_button.flags": "Flags", + "emoji_button.food": "Food & Drink", + "emoji_button.label": "Insert emoji", + "emoji_button.nature": "Nature", + "emoji_button.not_found": "No emojos!! (╯°□°)╯︵ ┻━┻", + "emoji_button.objects": "Objects", + "emoji_button.people": "People", + "emoji_button.recent": "Frequently used", + "emoji_button.search": "Search...", + "emoji_button.search_results": "Search results", + "emoji_button.symbols": "Symbols", + "emoji_button.travel": "Travel & Places", + "empty_column.account_timeline": "No toots here!", + "empty_column.account_unavailable": "Profile unavailable", + "empty_column.blocks": "You haven't blocked any users yet.", + "empty_column.community": "The local timeline is empty. Write something publicly to get the ball rolling!", + "empty_column.direct": "You don't have any direct messages yet. When you send or receive one, it will show up here.", + "empty_column.domain_blocks": "There are no hidden domains yet.", + "empty_column.favourited_statuses": "You don't have any favourite toots yet. When you favourite one, it will show up here.", + "empty_column.favourites": "No one has favourited this toot yet. When someone does, they will show up here.", + "empty_column.follow_requests": "You don't have any follow requests yet. When you receive one, it will show up here.", + "empty_column.hashtag": "There is nothing in this hashtag yet.", + "empty_column.home": "Your home timeline is empty! Visit {public} or use search to get started and meet other users.", + "empty_column.home.public_timeline": "the public timeline", + "empty_column.list": "There is nothing in this list yet. When members of this list post new statuses, they will appear here.", + "empty_column.lists": "You don't have any lists yet. When you create one, it will show up here.", + "empty_column.mutes": "You haven't muted any users yet.", + "empty_column.notifications": "You don't have any notifications yet. Interact with others to start the conversation.", + "empty_column.public": "There is nothing here! Write something publicly, or manually follow users from other servers to fill it up", + "follow_request.authorize": "Authorize", + "follow_request.reject": "Reject", + "getting_started.developers": "Developers", + "getting_started.directory": "Profile directory", + "getting_started.documentation": "Documentation", + "getting_started.heading": "Getting started", + "getting_started.invite": "Invite people", + "getting_started.open_source_notice": "Mastodon is open source software. You can contribute or report issues on GitHub at {github}.", + "getting_started.security": "Security", + "getting_started.terms": "Terms of service", + "hashtag.column_header.tag_mode.all": "and {additional}", + "hashtag.column_header.tag_mode.any": "or {additional}", + "hashtag.column_header.tag_mode.none": "without {additional}", + "hashtag.column_settings.select.no_options_message": "No suggestions found", + "hashtag.column_settings.select.placeholder": "Enter hashtags…", + "hashtag.column_settings.tag_mode.all": "All of these", + "hashtag.column_settings.tag_mode.any": "Any of these", + "hashtag.column_settings.tag_mode.none": "None of these", + "hashtag.column_settings.tag_toggle": "Include additional tags in this column", + "home.column_settings.basic": "Basic", + "home.column_settings.show_reblogs": "Show boosts", + "home.column_settings.show_replies": "Show replies", + "home.column_settings.update_live": "Update in real-time", + "intervals.full.days": "{number, plural, one {# day} other {# days}}", + "intervals.full.hours": "{number, plural, one {# hour} other {# hours}}", + "intervals.full.minutes": "{number, plural, one {# minute} other {# minutes}}", + "introduction.federation.action": "Next", + "introduction.federation.federated.headline": "Federated", + "introduction.federation.federated.text": "Public posts from other servers of the fediverse will appear in the federated timeline.", + "introduction.federation.home.headline": "Home", + "introduction.federation.home.text": "Posts from people you follow will appear in your home feed. You can follow anyone on any server!", + "introduction.federation.local.headline": "Local", + "introduction.federation.local.text": "Public posts from people on the same server as you will appear in the local timeline.", + "introduction.interactions.action": "Finish toot-orial!", + "introduction.interactions.favourite.headline": "Favourite", + "introduction.interactions.favourite.text": "You can save a toot for later, and let the author know that you liked it, by favouriting it.", + "introduction.interactions.reblog.headline": "Boost", + "introduction.interactions.reblog.text": "You can share other people's toots with your followers by boosting them.", + "introduction.interactions.reply.headline": "Reply", + "introduction.interactions.reply.text": "You can reply to other people's and your own toots, which will chain them together in a conversation.", + "introduction.welcome.action": "Let's go!", + "introduction.welcome.headline": "First steps", + "introduction.welcome.text": "Welcome to the fediverse! In a few moments, you'll be able to broadcast messages and talk to your friends across a wide variety of servers. But this server, {domain}, is special—it hosts your profile, so remember its name.", + "keyboard_shortcuts.back": "to navigate back", + "keyboard_shortcuts.blocked": "to open blocked users list", + "keyboard_shortcuts.boost": "to boost", + "keyboard_shortcuts.column": "to focus a status in one of the columns", + "keyboard_shortcuts.compose": "to focus the compose textarea", + "keyboard_shortcuts.description": "Description", + "keyboard_shortcuts.direct": "to open direct messages column", + "keyboard_shortcuts.down": "to move down in the list", + "keyboard_shortcuts.enter": "to open status", + "keyboard_shortcuts.favourite": "to favourite", + "keyboard_shortcuts.favourites": "to open favourites list", + "keyboard_shortcuts.federated": "to open federated timeline", + "keyboard_shortcuts.heading": "Keyboard Shortcuts", + "keyboard_shortcuts.home": "to open home timeline", + "keyboard_shortcuts.hotkey": "Hotkey", + "keyboard_shortcuts.legend": "to display this legend", + "keyboard_shortcuts.local": "to open local timeline", + "keyboard_shortcuts.mention": "to mention author", + "keyboard_shortcuts.muted": "to open muted users list", + "keyboard_shortcuts.my_profile": "to open your profile", + "keyboard_shortcuts.notifications": "to open notifications column", + "keyboard_shortcuts.pinned": "to open pinned toots list", + "keyboard_shortcuts.profile": "to open author's profile", + "keyboard_shortcuts.reply": "to reply", + "keyboard_shortcuts.requests": "to open follow requests list", + "keyboard_shortcuts.search": "to focus search", + "keyboard_shortcuts.start": "to open \"get started\" column", + "keyboard_shortcuts.toggle_hidden": "to show/hide text behind CW", + "keyboard_shortcuts.toggle_sensitivity": "to show/hide media", + "keyboard_shortcuts.toot": "to start a brand new toot", + "keyboard_shortcuts.unfocus": "to un-focus compose textarea/search", + "keyboard_shortcuts.up": "to move up in the list", + "lightbox.close": "Close", + "lightbox.next": "Next", + "lightbox.previous": "Previous", + "lightbox.view_context": "View context", + "lists.account.add": "Add to list", + "lists.account.remove": "Remove from list", + "lists.delete": "Delete list", + "lists.edit": "Edit list", + "lists.edit.submit": "Change title", + "lists.new.create": "Add list", + "lists.new.title_placeholder": "New list title", + "lists.search": "Search among people you follow", + "lists.subheading": "Your lists", + "load_pending": "{count, plural, one {# new item} other {# new items}}", + "loading_indicator.label": "Loading...", + "media_gallery.toggle_visible": "Toggle visibility", + "missing_indicator.label": "Not found", + "missing_indicator.sublabel": "This resource could not be found", + "mute_modal.hide_notifications": "Hide notifications from this user?", + "navigation_bar.apps": "Mobile apps", + "navigation_bar.blocks": "Blocked users", + "navigation_bar.community_timeline": "Local timeline", + "navigation_bar.compose": "Compose new toot", + "navigation_bar.direct": "Direct messages", + "navigation_bar.discover": "Discover", + "navigation_bar.domain_blocks": "Hidden domains", + "navigation_bar.edit_profile": "Edit profile", + "navigation_bar.favourites": "Favourites", + "navigation_bar.filters": "Muted words", + "navigation_bar.follow_requests": "Follow requests", + "navigation_bar.follows_and_followers": "Follows and followers", + "navigation_bar.info": "About this server", + "navigation_bar.keyboard_shortcuts": "Hotkeys", + "navigation_bar.lists": "Lists", + "navigation_bar.logout": "Logout", + "navigation_bar.mutes": "Muted users", + "navigation_bar.personal": "Personal", + "navigation_bar.pins": "Pinned toots", + "navigation_bar.preferences": "Preferences", + "navigation_bar.public_timeline": "Federated timeline", + "navigation_bar.security": "Security", + "notification.and_n_others": "and {count, plural, one {# other} other {# others}}", + "notification.favourite": "{name} favourited your status", + "notification.follow": "{name} followed you", + "notification.mention": "{name} mentioned you", + "notification.poll": "A poll you have voted in has ended", + "notification.reblog": "{name} boosted your status", + "notifications.clear": "Clear notifications", + "notifications.clear_confirmation": "Are you sure you want to permanently clear all your notifications?", + "notifications.column_settings.alert": "Desktop notifications", + "notifications.column_settings.favourite": "Favourites:", + "notifications.column_settings.filter_bar.advanced": "Display all categories", + "notifications.column_settings.filter_bar.category": "Quick filter bar", + "notifications.column_settings.filter_bar.show": "Show", + "notifications.column_settings.follow": "New followers:", + "notifications.column_settings.mention": "Mentions:", + "notifications.column_settings.poll": "Poll results:", + "notifications.column_settings.push": "Push notifications", + "notifications.column_settings.reblog": "Boosts:", + "notifications.column_settings.show": "Show in column", + "notifications.column_settings.sound": "Play sound", + "notifications.filter.all": "All", + "notifications.filter.boosts": "Boosts", + "notifications.filter.favourites": "Favourites", + "notifications.filter.follows": "Follows", + "notifications.filter.mentions": "Mentions", + "notifications.filter.polls": "Poll results", + "notifications.group": "{count} notifications", + "poll.closed": "Closed", + "poll.refresh": "Refresh", + "poll.total_votes": "{count, plural, one {# vote} other {# votes}}", + "poll.vote": "Vote", + "poll_button.add_poll": "Add a poll", + "poll_button.remove_poll": "Remove poll", + "privacy.change": "Adjust status privacy", + "privacy.direct.long": "Post to mentioned users only", + "privacy.direct.short": "Direct", + "privacy.private.long": "Post to followers only", + "privacy.private.short": "Followers-only", + "privacy.public.long": "Post to public timelines", + "privacy.public.short": "Public", + "privacy.unlisted.long": "Do not show in public timelines", + "privacy.unlisted.short": "Unlisted", + "regeneration_indicator.label": "Loading…", + "regeneration_indicator.sublabel": "Your home feed is being prepared!", + "relative_time.days": "{number}d", + "relative_time.hours": "{number}h", + "relative_time.just_now": "now", + "relative_time.minutes": "{number}m", + "relative_time.seconds": "{number}s", + "reply_indicator.cancel": "Cancel", + "report.forward": "Forward to {target}", + "report.forward_hint": "The account is from another server. Send an anonymized copy of the report there as well?", + "report.hint": "The report will be sent to your server moderators. You can provide an explanation of why you are reporting this account below:", + "report.placeholder": "Additional comments", + "report.submit": "Submit", + "report.target": "Report {target}", + "search.placeholder": "Search", + "search_popout.search_format": "Advanced search format", + "search_popout.tips.full_text": "Simple text returns statuses you have written, favourited, boosted, or have been mentioned in, as well as matching usernames, display names, and hashtags.", + "search_popout.tips.hashtag": "hashtag", + "search_popout.tips.status": "status", + "search_popout.tips.text": "Simple text returns matching display names, usernames and hashtags", + "search_popout.tips.user": "user", + "search_results.accounts": "People", + "search_results.hashtags": "Hashtags", + "search_results.statuses": "Toots", + "search_results.statuses_fts_disabled": "Searching toots by their content is not enabled on this Mastodon server.", + "search_results.total": "{count, number} {count, plural, one {result} other {results}}", + "status.admin_account": "Open moderation interface for @{name}", + "status.admin_status": "Open this status in the moderation interface", + "status.block": "Block @{name}", + "status.cancel_reblog_private": "Unboost", + "status.cannot_reblog": "This post cannot be boosted", + "status.copy": "Copy link to status", + "status.delete": "Delete", + "status.detailed_status": "Detailed conversation view", + "status.direct": "Direct message @{name}", + "status.embed": "Embed", + "status.favourite": "Favourite", + "status.filtered": "Filtered", + "status.load_more": "Load more", + "status.media_hidden": "Media hidden", + "status.mention": "Mention @{name}", + "status.more": "More", + "status.mute": "Mute @{name}", + "status.mute_conversation": "Mute conversation", + "status.open": "Expand this status", + "status.pin": "Pin on profile", + "status.pinned": "Pinned toot", + "status.read_more": "Read more", + "status.reblog": "Boost", + "status.reblog_private": "Boost to original audience", + "status.reblogged_by": "{name} boosted", + "status.reblogs.empty": "No one has boosted this toot yet. When someone does, they will show up here.", + "status.redraft": "Delete & re-draft", + "status.reply": "Reply", + "status.replyAll": "Reply to thread", + "status.report": "Report @{name}", + "status.sensitive_warning": "Sensitive content", + "status.share": "Share", + "status.show_less": "Show less", + "status.show_less_all": "Show less for all", + "status.show_more": "Show more", + "status.show_more_all": "Show more for all", + "status.show_thread": "Show thread", + "status.uncached_media_warning": "Not available", + "status.unmute_conversation": "Unmute conversation", + "status.unpin": "Unpin from profile", + "suggestions.dismiss": "Dismiss suggestion", + "suggestions.header": "You might be interested in…", + "tabs_bar.federated_timeline": "Federated", + "tabs_bar.home": "Home", + "tabs_bar.local_timeline": "Local", + "tabs_bar.notifications": "Notifications", + "tabs_bar.search": "Search", + "time_remaining.days": "{number, plural, one {# day} other {# days}} left", + "time_remaining.hours": "{number, plural, one {# hour} other {# hours}} left", + "time_remaining.minutes": "{number, plural, one {# minute} other {# minutes}} left", + "time_remaining.moments": "Moments remaining", + "time_remaining.seconds": "{number, plural, one {# second} other {# seconds}} left", + "trends.count_by_accounts": "{count} {rawCount, plural, one {person} other {people}} talking", + "trends.trending_now": "Trending now", + "ui.beforeunload": "Your draft will be lost if you leave Mastodon.", + "upload_area.title": "Drag & drop to upload", + "upload_button.label": "Add media ({formats})", + "upload_error.limit": "File upload limit exceeded.", + "upload_error.poll": "File upload not allowed with polls.", + "upload_form.description": "Describe for the visually impaired", + "upload_form.edit": "Edit", + "upload_form.undo": "Delete", + "upload_modal.analyzing_picture": "Analyzing picture…", + "upload_modal.apply": "Apply", + "upload_modal.description_placeholder": "A quick brown fox jumps over the lazy dog", + "upload_modal.detect_text": "Detect text from picture", + "upload_modal.edit_media": "Edit media", + "upload_modal.hint": "Click or drag the circle on the preview to choose the focal point which will always be in view on all thumbnails.", + "upload_modal.preview_label": "Preview ({ratio})", + "upload_progress.label": "Uploading...", + "video.close": "Close video", + "video.exit_fullscreen": "Exit full screen", + "video.expand": "Expand video", + "video.fullscreen": "Full screen", + "video.hide": "Hide video", + "video.mute": "Mute sound", + "video.pause": "Pause", + "video.play": "Play", + "video.unmute": "Unmute sound" +} diff --git a/app/javascript/mastodon/locales/gl.json b/app/javascript/mastodon/locales/gl.json index 3cc44f43e..be1b23870 100644 --- a/app/javascript/mastodon/locales/gl.json +++ b/app/javascript/mastodon/locales/gl.json @@ -111,6 +111,10 @@ "confirmations.reply.message": "Respostando agora sobreescribirá a mensaxe que está a compoñer. Segura de querer proceder?", "confirmations.unfollow.confirm": "Deixar de seguir", "confirmations.unfollow.message": "Quere deixar de seguir a {name}?", + "conversation.delete": "Delete conversation", + "conversation.mark_as_read": "Mark as read", + "conversation.open": "View conversation", + "conversation.with": "With {names}", "directory.federated": "Desde o fediverso coñecido", "directory.local": "Só desde {domain}", "directory.new_arrivals": "Novas achegas", @@ -170,7 +174,7 @@ "home.column_settings.basic": "Básico", "home.column_settings.show_reblogs": "Mostrar repeticións", "home.column_settings.show_replies": "Mostrar respostas", - "home.column_settings.update_live": "Update in real-time", + "home.column_settings.update_live": "Actualizar en tempo real", "intervals.full.days": "{number, plural,one {# día} other {# días}}", "intervals.full.hours": "{number, plural, one {# hora} other {# horas}}", "intervals.full.minutes": "{number, plural, one {# minuto} other {# minutos}}", @@ -264,7 +268,7 @@ "navigation_bar.preferences": "Preferencias", "navigation_bar.public_timeline": "Liña temporal federada", "navigation_bar.security": "Seguridade", - "notification.and_n_others": "and {count, plural, one {# other} other {# others}}", + "notification.and_n_others": "e {count, plural, one {# outro} other {# outros}}", "notification.favourite": "{name} marcou como favorito o seu estado", "notification.follow": "{name} está a seguila", "notification.mention": "{name} mencionoute", diff --git a/app/javascript/mastodon/locales/he.json b/app/javascript/mastodon/locales/he.json index b6cc3e6ce..7d1ec33aa 100644 --- a/app/javascript/mastodon/locales/he.json +++ b/app/javascript/mastodon/locales/he.json @@ -111,6 +111,10 @@ "confirmations.reply.message": "Replying now will overwrite the message you are currently composing. Are you sure you want to proceed?", "confirmations.unfollow.confirm": "להפסיק מעקב", "confirmations.unfollow.message": "להפסיק מעקב אחרי {name}?", + "conversation.delete": "Delete conversation", + "conversation.mark_as_read": "Mark as read", + "conversation.open": "View conversation", + "conversation.with": "With {names}", "directory.federated": "From known fediverse", "directory.local": "From {domain} only", "directory.new_arrivals": "New arrivals", diff --git a/app/javascript/mastodon/locales/hi.json b/app/javascript/mastodon/locales/hi.json index e2d1eb49d..79b918f9d 100644 --- a/app/javascript/mastodon/locales/hi.json +++ b/app/javascript/mastodon/locales/hi.json @@ -111,6 +111,10 @@ "confirmations.reply.message": "Replying now will overwrite the message you are currently composing. Are you sure you want to proceed?", "confirmations.unfollow.confirm": "Unfollow", "confirmations.unfollow.message": "Are you sure you want to unfollow {name}?", + "conversation.delete": "Delete conversation", + "conversation.mark_as_read": "Mark as read", + "conversation.open": "View conversation", + "conversation.with": "With {names}", "directory.federated": "From known fediverse", "directory.local": "From {domain} only", "directory.new_arrivals": "New arrivals", diff --git a/app/javascript/mastodon/locales/hr.json b/app/javascript/mastodon/locales/hr.json index 6daabc694..9a95995e3 100644 --- a/app/javascript/mastodon/locales/hr.json +++ b/app/javascript/mastodon/locales/hr.json @@ -111,6 +111,10 @@ "confirmations.reply.message": "Replying now will overwrite the message you are currently composing. Are you sure you want to proceed?", "confirmations.unfollow.confirm": "Unfollow", "confirmations.unfollow.message": "Are you sure you want to unfollow {name}?", + "conversation.delete": "Delete conversation", + "conversation.mark_as_read": "Mark as read", + "conversation.open": "View conversation", + "conversation.with": "With {names}", "directory.federated": "From known fediverse", "directory.local": "From {domain} only", "directory.new_arrivals": "New arrivals", diff --git a/app/javascript/mastodon/locales/hu.json b/app/javascript/mastodon/locales/hu.json index f5a02065b..2ab06c6e7 100644 --- a/app/javascript/mastodon/locales/hu.json +++ b/app/javascript/mastodon/locales/hu.json @@ -111,6 +111,10 @@ "confirmations.reply.message": "Ha most válaszolsz, ez felülírja a most szerkesztés alatt álló üzenetet. Mégis ezt szeretnéd?", "confirmations.unfollow.confirm": "Követés visszavonása", "confirmations.unfollow.message": "Biztos, hogy vissza szeretnéd vonni {name} követését?", + "conversation.delete": "Delete conversation", + "conversation.mark_as_read": "Mark as read", + "conversation.open": "View conversation", + "conversation.with": "With {names}", "directory.federated": "From known fediverse", "directory.local": "From {domain} only", "directory.new_arrivals": "New arrivals", diff --git a/app/javascript/mastodon/locales/hy.json b/app/javascript/mastodon/locales/hy.json index 1484c76df..52588f089 100644 --- a/app/javascript/mastodon/locales/hy.json +++ b/app/javascript/mastodon/locales/hy.json @@ -111,6 +111,10 @@ "confirmations.reply.message": "Replying now will overwrite the message you are currently composing. Are you sure you want to proceed?", "confirmations.unfollow.confirm": "Ապահետեւել", "confirmations.unfollow.message": "Վստա՞հ ես, որ ուզում ես այլեւս չհետեւել {name}֊ին։", + "conversation.delete": "Delete conversation", + "conversation.mark_as_read": "Mark as read", + "conversation.open": "View conversation", + "conversation.with": "With {names}", "directory.federated": "From known fediverse", "directory.local": "From {domain} only", "directory.new_arrivals": "New arrivals", diff --git a/app/javascript/mastodon/locales/id.json b/app/javascript/mastodon/locales/id.json index c9e48a1a6..23cca64f7 100644 --- a/app/javascript/mastodon/locales/id.json +++ b/app/javascript/mastodon/locales/id.json @@ -111,6 +111,10 @@ "confirmations.reply.message": "Membalas sekarang akan menimpa pesan yang sedang Anda buat. Anda yakin ingin melanjutkan?", "confirmations.unfollow.confirm": "Berhenti mengikuti", "confirmations.unfollow.message": "Apakah anda ingin berhenti mengikuti {name}?", + "conversation.delete": "Delete conversation", + "conversation.mark_as_read": "Mark as read", + "conversation.open": "View conversation", + "conversation.with": "With {names}", "directory.federated": "From known fediverse", "directory.local": "From {domain} only", "directory.new_arrivals": "New arrivals", diff --git a/app/javascript/mastodon/locales/io.json b/app/javascript/mastodon/locales/io.json index 6c1b7fa8b..a38730c60 100644 --- a/app/javascript/mastodon/locales/io.json +++ b/app/javascript/mastodon/locales/io.json @@ -111,6 +111,10 @@ "confirmations.reply.message": "Replying now will overwrite the message you are currently composing. Are you sure you want to proceed?", "confirmations.unfollow.confirm": "Unfollow", "confirmations.unfollow.message": "Are you sure you want to unfollow {name}?", + "conversation.delete": "Delete conversation", + "conversation.mark_as_read": "Mark as read", + "conversation.open": "View conversation", + "conversation.with": "With {names}", "directory.federated": "From known fediverse", "directory.local": "From {domain} only", "directory.new_arrivals": "New arrivals", diff --git a/app/javascript/mastodon/locales/it.json b/app/javascript/mastodon/locales/it.json index dc43bcb5c..d21dd88b1 100644 --- a/app/javascript/mastodon/locales/it.json +++ b/app/javascript/mastodon/locales/it.json @@ -111,6 +111,10 @@ "confirmations.reply.message": "Se rispondi ora, il messaggio che stai componendo sarà sovrascritto. Sei sicuro di voler continuare?", "confirmations.unfollow.confirm": "Smetti di seguire", "confirmations.unfollow.message": "Sei sicuro che non vuoi più seguire {name}?", + "conversation.delete": "Delete conversation", + "conversation.mark_as_read": "Mark as read", + "conversation.open": "View conversation", + "conversation.with": "With {names}", "directory.federated": "From known fediverse", "directory.local": "From {domain} only", "directory.new_arrivals": "New arrivals", diff --git a/app/javascript/mastodon/locales/ja.json b/app/javascript/mastodon/locales/ja.json index 4fb34e772..e665a9f18 100644 --- a/app/javascript/mastodon/locales/ja.json +++ b/app/javascript/mastodon/locales/ja.json @@ -111,6 +111,10 @@ "confirmations.reply.message": "今返信すると現在作成中のメッセージが上書きされます。本当に実行しますか?", "confirmations.unfollow.confirm": "フォロー解除", "confirmations.unfollow.message": "本当に{name}さんのフォローを解除しますか?", + "conversation.delete": "Delete conversation", + "conversation.mark_as_read": "Mark as read", + "conversation.open": "View conversation", + "conversation.with": "With {names}", "directory.federated": "既知の連合全体", "directory.local": "{domain} のみ", "directory.new_arrivals": "新着順", diff --git a/app/javascript/mastodon/locales/ka.json b/app/javascript/mastodon/locales/ka.json index e2a6ee6c6..d70cf0ed2 100644 --- a/app/javascript/mastodon/locales/ka.json +++ b/app/javascript/mastodon/locales/ka.json @@ -111,6 +111,10 @@ "confirmations.reply.message": "Replying now will overwrite the message you are currently composing. Are you sure you want to proceed?", "confirmations.unfollow.confirm": "ნუღარ მიჰყვები", "confirmations.unfollow.message": "დარწმუნებული ხართ, აღარ გსურთ მიჰყვებოდეთ {name}-ს?", + "conversation.delete": "Delete conversation", + "conversation.mark_as_read": "Mark as read", + "conversation.open": "View conversation", + "conversation.with": "With {names}", "directory.federated": "From known fediverse", "directory.local": "From {domain} only", "directory.new_arrivals": "New arrivals", diff --git a/app/javascript/mastodon/locales/kk.json b/app/javascript/mastodon/locales/kk.json index a07302f0a..e38aac621 100644 --- a/app/javascript/mastodon/locales/kk.json +++ b/app/javascript/mastodon/locales/kk.json @@ -111,6 +111,10 @@ "confirmations.reply.message": "Жауабыңыз жазып жатқан жазбаңыздың үстіне кетеді. Жалғастырамыз ба?", "confirmations.unfollow.confirm": "Оқымау", "confirmations.unfollow.message": "\"{name} атты қолданушыға енді жазылғыңыз келмей ме?", + "conversation.delete": "Delete conversation", + "conversation.mark_as_read": "Mark as read", + "conversation.open": "View conversation", + "conversation.with": "With {names}", "directory.federated": "From known fediverse", "directory.local": "From {domain} only", "directory.new_arrivals": "New arrivals", diff --git a/app/javascript/mastodon/locales/ko.json b/app/javascript/mastodon/locales/ko.json index 3ec9a8a16..6f0596927 100644 --- a/app/javascript/mastodon/locales/ko.json +++ b/app/javascript/mastodon/locales/ko.json @@ -63,7 +63,7 @@ "column.notifications": "알림", "column.pins": "고정된 툿", "column.public": "연합 타임라인", - "column.status": "Toot", + "column.status": "툿", "column_back_button.label": "돌아가기", "column_header.hide_settings": "설정 숨기기", "column_header.moveLeft_settings": "왼쪽으로 이동", @@ -111,6 +111,10 @@ "confirmations.reply.message": "답글을 달기 위해 현재 작성 중인 메시지가 덮어 씌워집니다. 진행하시겠습니까?", "confirmations.unfollow.confirm": "언팔로우", "confirmations.unfollow.message": "정말로 {name}를 언팔로우하시겠습니까?", + "conversation.delete": "Delete conversation", + "conversation.mark_as_read": "Mark as read", + "conversation.open": "View conversation", + "conversation.with": "With {names}", "directory.federated": "알려진 연합우주로부터", "directory.local": "{domain}에서만", "directory.new_arrivals": "새로운 사람들", @@ -170,7 +174,7 @@ "home.column_settings.basic": "기본 설정", "home.column_settings.show_reblogs": "부스트 표시", "home.column_settings.show_replies": "답글 표시", - "home.column_settings.update_live": "Update in real-time", + "home.column_settings.update_live": "실시간 갱신", "intervals.full.days": "{number} 일", "intervals.full.hours": "{number} 시간", "intervals.full.minutes": "{number} 분", @@ -264,7 +268,7 @@ "navigation_bar.preferences": "사용자 설정", "navigation_bar.public_timeline": "연합 타임라인", "navigation_bar.security": "보안", - "notification.and_n_others": "and {count, plural, one {# other} other {# others}}", + "notification.and_n_others": "그리고 {count}개의 기타 항목", "notification.favourite": "{name}님이 즐겨찾기 했습니다", "notification.follow": "{name}님이 나를 팔로우 했습니다", "notification.mention": "{name}님이 답글을 보냈습니다", diff --git a/app/javascript/mastodon/locales/lt.json b/app/javascript/mastodon/locales/lt.json index 2de037f16..560fa3bca 100644 --- a/app/javascript/mastodon/locales/lt.json +++ b/app/javascript/mastodon/locales/lt.json @@ -111,6 +111,10 @@ "confirmations.reply.message": "Replying now will overwrite the message you are currently composing. Are you sure you want to proceed?", "confirmations.unfollow.confirm": "Unfollow", "confirmations.unfollow.message": "Are you sure you want to unfollow {name}?", + "conversation.delete": "Delete conversation", + "conversation.mark_as_read": "Mark as read", + "conversation.open": "View conversation", + "conversation.with": "With {names}", "directory.federated": "From known fediverse", "directory.local": "From {domain} only", "directory.new_arrivals": "New arrivals", diff --git a/app/javascript/mastodon/locales/lv.json b/app/javascript/mastodon/locales/lv.json index 8d281c9d5..031f758e6 100644 --- a/app/javascript/mastodon/locales/lv.json +++ b/app/javascript/mastodon/locales/lv.json @@ -111,6 +111,10 @@ "confirmations.reply.message": "Atbildot tagad tava ziņa ko šobrīd raksti tiks pārrakstīta. Vai tiešām vēlies turpināt?", "confirmations.unfollow.confirm": "Nesekot", "confirmations.unfollow.message": "Vai tiešam vairs nevēlies sekot lietotājam {name}?", + "conversation.delete": "Delete conversation", + "conversation.mark_as_read": "Mark as read", + "conversation.open": "View conversation", + "conversation.with": "With {names}", "directory.federated": "From known fediverse", "directory.local": "From {domain} only", "directory.new_arrivals": "New arrivals", diff --git a/app/javascript/mastodon/locales/ms.json b/app/javascript/mastodon/locales/ms.json index 9bd5eef72..e2bf6e1d2 100644 --- a/app/javascript/mastodon/locales/ms.json +++ b/app/javascript/mastodon/locales/ms.json @@ -111,6 +111,10 @@ "confirmations.reply.message": "Replying now will overwrite the message you are currently composing. Are you sure you want to proceed?", "confirmations.unfollow.confirm": "Unfollow", "confirmations.unfollow.message": "Are you sure you want to unfollow {name}?", + "conversation.delete": "Delete conversation", + "conversation.mark_as_read": "Mark as read", + "conversation.open": "View conversation", + "conversation.with": "With {names}", "directory.federated": "From known fediverse", "directory.local": "From {domain} only", "directory.new_arrivals": "New arrivals", diff --git a/app/javascript/mastodon/locales/nl.json b/app/javascript/mastodon/locales/nl.json index 73e7b3905..cd09acfb4 100644 --- a/app/javascript/mastodon/locales/nl.json +++ b/app/javascript/mastodon/locales/nl.json @@ -16,7 +16,7 @@ "account.follows.empty": "Deze gebruiker volgt nog niemand.", "account.follows_you": "Volgt jou", "account.hide_reblogs": "Verberg boosts van @{name}", - "account.last_status": "Last active", + "account.last_status": "Laatst actief", "account.link_verified_on": "Eigendom van deze link is gecontroleerd op {date}", "account.locked_info": "De privacystatus van dit account is op besloten gezet. De eigenaar bepaalt handmatig wie hen kan volgen.", "account.media": "Media", @@ -25,7 +25,7 @@ "account.mute": "Negeer @{name}", "account.mute_notifications": "Negeer meldingen van @{name}", "account.muted": "Genegeerd", - "account.never_active": "Never", + "account.never_active": "Nooit", "account.posts": "Toots", "account.posts_with_replies": "Toots en reacties", "account.report": "Rapporteer @{name}", @@ -38,8 +38,8 @@ "account.unfollow": "Ontvolgen", "account.unmute": "@{name} niet langer negeren", "account.unmute_notifications": "@{name} meldingen niet langer negeren", - "alert.rate_limited.message": "Please retry after {retry_time, time, medium}.", - "alert.rate_limited.title": "Rate limited", + "alert.rate_limited.message": "Probeer het nog een keer na {retry_time, time, medium}.", + "alert.rate_limited.title": "Beperkt te gebruiken", "alert.unexpected.message": "Er deed zich een onverwachte fout voor", "alert.unexpected.title": "Oeps!", "autosuggest_hashtag.per_week": "{count} per week", @@ -53,7 +53,7 @@ "column.blocks": "Geblokkeerde gebruikers", "column.community": "Lokale tijdlijn", "column.direct": "Directe berichten", - "column.directory": "Browse profiles", + "column.directory": "Gebruikersgids", "column.domain_blocks": "Genegeerde servers", "column.favourites": "Favorieten", "column.follow_requests": "Volgverzoeken", @@ -101,8 +101,8 @@ "confirmations.delete_list.message": "Weet je zeker dat je deze lijst definitief wilt verwijderen?", "confirmations.domain_block.confirm": "Verberg alles van deze server", "confirmations.domain_block.message": "Weet je het echt heel erg zeker dat je alles van {domain} wilt negeren? In de meeste gevallen is het blokkeren of negeren van een paar specifieke personen voldoende en beter. Je zult geen toots van deze server op openbare tijdlijnen zien of in jouw meldingen. Jouw volgers van deze server worden verwijderd.", - "confirmations.logout.confirm": "Log out", - "confirmations.logout.message": "Are you sure you want to log out?", + "confirmations.logout.confirm": "Uitloggen", + "confirmations.logout.message": "Weet je zeker dat je wilt uitloggen?", "confirmations.mute.confirm": "Negeren", "confirmations.mute.message": "Weet je het zeker dat je {name} wilt negeren?", "confirmations.redraft.confirm": "Verwijderen en herschrijven", @@ -111,10 +111,14 @@ "confirmations.reply.message": "Door nu te reageren overschrijf je de toot die je op dit moment aan het schrijven bent. Weet je zeker dat je verder wil gaan?", "confirmations.unfollow.confirm": "Ontvolgen", "confirmations.unfollow.message": "Weet je het zeker dat je {name} wilt ontvolgen?", - "directory.federated": "From known fediverse", - "directory.local": "From {domain} only", - "directory.new_arrivals": "New arrivals", - "directory.recently_active": "Recently active", + "conversation.delete": "Delete conversation", + "conversation.mark_as_read": "Mark as read", + "conversation.open": "View conversation", + "conversation.with": "With {names}", + "directory.federated": "Fediverse (wat bekend is)", + "directory.local": "Alleen {domain}", + "directory.new_arrivals": "Nieuwe accounts", + "directory.recently_active": "Onlangs actief", "embed.instructions": "Embed deze toot op jouw website, door de onderstaande code te kopiëren.", "embed.preview": "Zo komt het eruit te zien:", "emoji_button.activity": "Activiteiten", @@ -170,7 +174,7 @@ "home.column_settings.basic": "Algemeen", "home.column_settings.show_reblogs": "Boosts tonen", "home.column_settings.show_replies": "Reacties tonen", - "home.column_settings.update_live": "Update in real-time", + "home.column_settings.update_live": "In realtime bijwerken", "intervals.full.days": "{number, plural, one {# dag} other {# dagen}}", "intervals.full.hours": "{number, plural, one {# uur} other {# uur}}", "intervals.full.minutes": "{number, plural, one {# minuut} other {# minuten}}", @@ -264,7 +268,7 @@ "navigation_bar.preferences": "Instellingen", "navigation_bar.public_timeline": "Globale tijdlijn", "navigation_bar.security": "Beveiliging", - "notification.and_n_others": "and {count, plural, one {# other} other {# others}}", + "notification.and_n_others": "en {count, plural, one {# meer} other {# meer}}", "notification.favourite": "{name} voegde jouw toot als favoriet toe", "notification.follow": "{name} volgt jou nu", "notification.mention": "{name} vermeldde jou", @@ -369,7 +373,7 @@ "status.show_more": "Meer tonen", "status.show_more_all": "Alles meer tonen", "status.show_thread": "Gesprek tonen", - "status.uncached_media_warning": "Not available", + "status.uncached_media_warning": "Niet beschikbaar", "status.unmute_conversation": "Gesprek niet langer negeren", "status.unpin": "Van profielpagina losmaken", "suggestions.dismiss": "Voorstel verwerpen", diff --git a/app/javascript/mastodon/locales/nn.json b/app/javascript/mastodon/locales/nn.json index dda402494..a98fd9522 100644 --- a/app/javascript/mastodon/locales/nn.json +++ b/app/javascript/mastodon/locales/nn.json @@ -77,11 +77,11 @@ "compose_form.direct_message_warning_learn_more": "Lær meir", "compose_form.hashtag_warning": "This toot won't be listed under any hashtag as it is unlisted. Only public toots can be searched by hashtag.", "compose_form.lock_disclaimer": "Your account is not {locked}. Anyone can follow you to view your follower-only posts.", - "compose_form.lock_disclaimer.lock": "locked", - "compose_form.placeholder": "What is on your mind?", - "compose_form.poll.add_option": "Add a choice", - "compose_form.poll.duration": "Poll duration", - "compose_form.poll.option_placeholder": "Choice {number}", + "compose_form.lock_disclaimer.lock": "låst", + "compose_form.placeholder": "Kva har du på hjartet?", + "compose_form.poll.add_option": "Legg til eit punkt", + "compose_form.poll.duration": "Varigheit for spørring", + "compose_form.poll.option_placeholder": "Val {number}", "compose_form.poll.remove_option": "Remove this choice", "compose_form.publish": "Toot", "compose_form.publish_loud": "{publish}!", @@ -111,6 +111,10 @@ "confirmations.reply.message": "Replying now will overwrite the message you are currently composing. Are you sure you want to proceed?", "confirmations.unfollow.confirm": "Unfollow", "confirmations.unfollow.message": "Are you sure you want to unfollow {name}?", + "conversation.delete": "Delete conversation", + "conversation.mark_as_read": "Mark as read", + "conversation.open": "View conversation", + "conversation.with": "With {names}", "directory.federated": "From known fediverse", "directory.local": "From {domain} only", "directory.new_arrivals": "New arrivals", diff --git a/app/javascript/mastodon/locales/no.json b/app/javascript/mastodon/locales/no.json index 8fc722037..82794684b 100644 --- a/app/javascript/mastodon/locales/no.json +++ b/app/javascript/mastodon/locales/no.json @@ -111,6 +111,10 @@ "confirmations.reply.message": "Replying now will overwrite the message you are currently composing. Are you sure you want to proceed?", "confirmations.unfollow.confirm": "Slutt å følge", "confirmations.unfollow.message": "Er du sikker på at du vil slutte å følge {name}?", + "conversation.delete": "Delete conversation", + "conversation.mark_as_read": "Mark as read", + "conversation.open": "View conversation", + "conversation.with": "With {names}", "directory.federated": "From known fediverse", "directory.local": "From {domain} only", "directory.new_arrivals": "New arrivals", diff --git a/app/javascript/mastodon/locales/oc.json b/app/javascript/mastodon/locales/oc.json index d5abe89fb..38f3f82c1 100644 --- a/app/javascript/mastodon/locales/oc.json +++ b/app/javascript/mastodon/locales/oc.json @@ -4,7 +4,7 @@ "account.block": "Blocar @{name}", "account.block_domain": "Tot amagar del domeni {domain}", "account.blocked": "Blocat", - "account.cancel_follow_request": "Cancel follow request", + "account.cancel_follow_request": "Anullar la demanda de seguiment", "account.direct": "Escriure un MP a @{name}", "account.domain_blocked": "Domeni amagat", "account.edit_profile": "Modificar lo perfil", @@ -16,7 +16,7 @@ "account.follows.empty": "Aqueste utilizaire sèc pas degun pel moment.", "account.follows_you": "Vos sèc", "account.hide_reblogs": "Rescondre los partatges de @{name}", - "account.last_status": "Last active", + "account.last_status": "Darrièra activitat", "account.link_verified_on": "La proprietat d’aqueste ligam foguèt verificada lo {date}", "account.locked_info": "L’estatut de privacitat del compte es configurat sus clavat. Lo proprietari causís qual pòt sègre son compte.", "account.media": "Mèdias", @@ -25,7 +25,7 @@ "account.mute": "Rescondre @{name}", "account.mute_notifications": "Rescondre las notificacions de @{name}", "account.muted": "Mes en silenci", - "account.never_active": "Never", + "account.never_active": "Jamai", "account.posts": "Tuts", "account.posts_with_replies": "Tuts e responsas", "account.report": "Senhalar @{name}", @@ -38,11 +38,11 @@ "account.unfollow": "Quitar de sègre", "account.unmute": "Quitar de rescondre @{name}", "account.unmute_notifications": "Mostrar las notificacions de @{name}", - "alert.rate_limited.message": "Please retry after {retry_time, time, medium}.", - "alert.rate_limited.title": "Rate limited", + "alert.rate_limited.message": "Mercés de tornar ensajar aprèp {retry_time, time, medium}.", + "alert.rate_limited.title": "Taus limitat", "alert.unexpected.message": "Una error s’es producha.", "alert.unexpected.title": "Ops !", - "autosuggest_hashtag.per_week": "{count} per week", + "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.body": "Quicòm a fach mèuca pendent lo cargament d’aqueste compausant.", "bundle_column_error.retry": "Tornar ensajar", @@ -53,7 +53,7 @@ "column.blocks": "Personas blocadas", "column.community": "Flux public local", "column.direct": "Messatges dirèctes", - "column.directory": "Browse profiles", + "column.directory": "Percórrer los perfils", "column.domain_blocks": "Domenis resconduts", "column.favourites": "Favorits", "column.follow_requests": "Demandas d’abonament", @@ -63,7 +63,7 @@ "column.notifications": "Notificacions", "column.pins": "Tuts penjats", "column.public": "Flux public global", - "column.status": "Toot", + "column.status": "Tut", "column_back_button.label": "Tornar", "column_header.hide_settings": "Amagar los paramètres", "column_header.moveLeft_settings": "Desplaçar la colomna a man drecha", @@ -101,8 +101,8 @@ "confirmations.delete_list.message": "Volètz vertadièrament suprimir aquesta lista per totjorn ?", "confirmations.domain_block.confirm": "Amagar tot lo domeni", "confirmations.domain_block.message": "Volètz vertadièrament blocar complètament {domain} ? De còps cal pas que blocar o rescondre unas personas solament.\nVeiretz pas cap de contengut d’aquel domeni dins cap de flux public o dins vòstras notificacions. Vòstres seguidors d’aquel domeni seràn levats.", - "confirmations.logout.confirm": "Log out", - "confirmations.logout.message": "Are you sure you want to log out?", + "confirmations.logout.confirm": "Desconnexion", + "confirmations.logout.message": "Volètz vertadièrament vos desconnectar ?", "confirmations.mute.confirm": "Rescondre", "confirmations.mute.message": "Volètz vertadièrament rescondre {name} ?", "confirmations.redraft.confirm": "Escafar & tornar formular", @@ -111,10 +111,14 @@ "confirmations.reply.message": "Respondre remplaçarà lo messatge que sètz a escriure. Volètz vertadièrament contunhar ?", "confirmations.unfollow.confirm": "Quitar de sègre", "confirmations.unfollow.message": "Volètz vertadièrament quitar de sègre {name} ?", - "directory.federated": "From known fediverse", - "directory.local": "From {domain} only", - "directory.new_arrivals": "New arrivals", - "directory.recently_active": "Recently active", + "conversation.delete": "Delete conversation", + "conversation.mark_as_read": "Mark as read", + "conversation.open": "View conversation", + "conversation.with": "With {names}", + "directory.federated": "Del fediverse conegut", + "directory.local": "Solament de {domain}", + "directory.new_arrivals": "Nòus-venguts", + "directory.recently_active": "Actius fa res", "embed.instructions": "Embarcar aqueste estatut per lo far veire sus un site Internet en copiar lo còdi çai-jos.", "embed.preview": "Semblarà aquò :", "emoji_button.activity": "Activitats", @@ -170,7 +174,7 @@ "home.column_settings.basic": "Basic", "home.column_settings.show_reblogs": "Mostrar los partatges", "home.column_settings.show_replies": "Mostrar las responsas", - "home.column_settings.update_live": "Update in real-time", + "home.column_settings.update_live": "Actualizacion en dirècte", "intervals.full.days": "{number, plural, one {# jorn} other {# jorns}}", "intervals.full.hours": "{number, plural, one {# ora} other {# oras}}", "intervals.full.minutes": "{number, plural, one {# minuta} other {# minutas}}", @@ -264,7 +268,7 @@ "navigation_bar.preferences": "Preferéncias", "navigation_bar.public_timeline": "Flux public global", "navigation_bar.security": "Seguretat", - "notification.and_n_others": "and {count, plural, one {# other} other {# others}}", + "notification.and_n_others": "e {count, plural, un {# autre} other {# autres}}", "notification.favourite": "{name} a ajustat a sos favorits", "notification.follow": "{name} vos sèc", "notification.mention": "{name} vos a mencionat", @@ -369,7 +373,7 @@ "status.show_more": "Desplegar", "status.show_more_all": "Los desplegar totes", "status.show_thread": "Mostrar lo fil", - "status.uncached_media_warning": "Not available", + "status.uncached_media_warning": "Pas disponible", "status.unmute_conversation": "Tornar mostrar la conversacion", "status.unpin": "Tirar del perfil", "suggestions.dismiss": "Regetar la suggestion", @@ -385,22 +389,22 @@ "time_remaining.moments": "Moments restants", "time_remaining.seconds": "demòra{number, plural, one { # segonda} other {n # segondas}}", "trends.count_by_accounts": "{count} {rawCount, plural, one {person} ne charra other {people}} ne charran", - "trends.trending_now": "Trending now", + "trends.trending_now": "Tendéncia del moment", "ui.beforeunload": "Vòstre brolhon serà perdut se quitatz Mastodon.", "upload_area.title": "Lisatz e depausatz per mandar", "upload_button.label": "Ajustar un mèdia (JPEG, PNG, GIF, WebM, MP4, MOV)", "upload_error.limit": "Talha maximum pels mandadís subrepassada.", "upload_error.poll": "Lo mandadís de fichièr es pas autorizat pels sondatges.", "upload_form.description": "Descripcion pels mal vesents", - "upload_form.edit": "Edit", + "upload_form.edit": "Modificar", "upload_form.undo": "Suprimir", - "upload_modal.analyzing_picture": "Analyzing picture…", - "upload_modal.apply": "Apply", - "upload_modal.description_placeholder": "A quick brown fox jumps over the lazy dog", - "upload_modal.detect_text": "Detect text from picture", - "upload_modal.edit_media": "Edit media", + "upload_modal.analyzing_picture": "Analisi de l’imatge…", + "upload_modal.apply": "Aplicar", + "upload_modal.description_placeholder": "Lo dròlle bilingüe manja un yaourt de ròcs exagonals e kiwis verds farà un an mai", + "upload_modal.detect_text": "Detectar lo tèxt de l’imatge", + "upload_modal.edit_media": "Modificar lo mèdia", "upload_modal.hint": "Click or drag the circle on the preview to choose the focal point which will always be in view on all thumbnails.", - "upload_modal.preview_label": "Preview ({ratio})", + "upload_modal.preview_label": "Apercebut ({ratio})", "upload_progress.label": "Mandadís…", "video.close": "Tampar la vidèo", "video.exit_fullscreen": "Sortir plen ecran", diff --git a/app/javascript/mastodon/locales/pl.json b/app/javascript/mastodon/locales/pl.json index 62f75e3c2..9aca1d27f 100644 --- a/app/javascript/mastodon/locales/pl.json +++ b/app/javascript/mastodon/locales/pl.json @@ -111,6 +111,10 @@ "confirmations.reply.message": "W ten sposób utracisz wpis który obecnie tworzysz. Czy na pewno chcesz to zrobić?", "confirmations.unfollow.confirm": "Przestań śledzić", "confirmations.unfollow.message": "Czy na pewno zamierzasz przestać śledzić {name}?", + "conversation.delete": "Delete conversation", + "conversation.mark_as_read": "Mark as read", + "conversation.open": "View conversation", + "conversation.with": "With {names}", "directory.federated": "From known fediverse", "directory.local": "From {domain} only", "directory.new_arrivals": "New arrivals", diff --git a/app/javascript/mastodon/locales/pt-BR.json b/app/javascript/mastodon/locales/pt-BR.json index debf9e6f6..1ee44c283 100644 --- a/app/javascript/mastodon/locales/pt-BR.json +++ b/app/javascript/mastodon/locales/pt-BR.json @@ -111,6 +111,10 @@ "confirmations.reply.message": "Responder agora vai sobrescrever a mensagem que você está compondo. Você tem certeza que quer continuar?", "confirmations.unfollow.confirm": "Deixar de seguir", "confirmations.unfollow.message": "Você tem certeza de que quer deixar de seguir {name}?", + "conversation.delete": "Delete conversation", + "conversation.mark_as_read": "Mark as read", + "conversation.open": "View conversation", + "conversation.with": "With {names}", "directory.federated": "From known fediverse", "directory.local": "From {domain} only", "directory.new_arrivals": "New arrivals", diff --git a/app/javascript/mastodon/locales/pt-PT.json b/app/javascript/mastodon/locales/pt-PT.json index feba8fd9a..4b1e11aa4 100644 --- a/app/javascript/mastodon/locales/pt-PT.json +++ b/app/javascript/mastodon/locales/pt-PT.json @@ -111,6 +111,10 @@ "confirmations.reply.message": "Responder agora irá reescrever a mensagem que estás a compor actualmente. Tens a certeza que queres continuar?", "confirmations.unfollow.confirm": "Deixar de seguir", "confirmations.unfollow.message": "De certeza que queres deixar de seguir {name}?", + "conversation.delete": "Delete conversation", + "conversation.mark_as_read": "Mark as read", + "conversation.open": "View conversation", + "conversation.with": "With {names}", "directory.federated": "From known fediverse", "directory.local": "From {domain} only", "directory.new_arrivals": "New arrivals", diff --git a/app/javascript/mastodon/locales/ro.json b/app/javascript/mastodon/locales/ro.json index 038b8ddd4..6f5c57250 100644 --- a/app/javascript/mastodon/locales/ro.json +++ b/app/javascript/mastodon/locales/ro.json @@ -111,6 +111,10 @@ "confirmations.reply.message": "Răspunzând la asta acum, mesajul pe care îl compui în prezent se va șterge. Ești sigur că vrei să continui?", "confirmations.unfollow.confirm": "Nu mai urmări", "confirmations.unfollow.message": "Ești sigur că nu mai vrei să îl urmărești pe {name}?", + "conversation.delete": "Delete conversation", + "conversation.mark_as_read": "Mark as read", + "conversation.open": "View conversation", + "conversation.with": "With {names}", "directory.federated": "From known fediverse", "directory.local": "From {domain} only", "directory.new_arrivals": "New arrivals", diff --git a/app/javascript/mastodon/locales/ru.json b/app/javascript/mastodon/locales/ru.json index 69bd5a422..eb2d91725 100644 --- a/app/javascript/mastodon/locales/ru.json +++ b/app/javascript/mastodon/locales/ru.json @@ -111,6 +111,10 @@ "confirmations.reply.message": "При ответе текст набираемого сообщения будет перезаписан. Продолжить?", "confirmations.unfollow.confirm": "Отписаться", "confirmations.unfollow.message": "Вы уверены, что хотите отписаться от {name}?", + "conversation.delete": "Delete conversation", + "conversation.mark_as_read": "Mark as read", + "conversation.open": "View conversation", + "conversation.with": "With {names}", "directory.federated": "From known fediverse", "directory.local": "From {domain} only", "directory.new_arrivals": "New arrivals", diff --git a/app/javascript/mastodon/locales/sk.json b/app/javascript/mastodon/locales/sk.json index 89a472d89..1e944768f 100644 --- a/app/javascript/mastodon/locales/sk.json +++ b/app/javascript/mastodon/locales/sk.json @@ -63,7 +63,7 @@ "column.notifications": "Oboznámenia", "column.pins": "Pripnuté príspevky", "column.public": "Federovaná časová os", - "column.status": "Toot", + "column.status": "Príspevok", "column_back_button.label": "Späť", "column_header.hide_settings": "Skryť nastavenia", "column_header.moveLeft_settings": "Presuň stĺpec doľava", @@ -111,6 +111,10 @@ "confirmations.reply.message": "Odpovedaním akurát teraz prepíšeš správu, ktorú máš práve rozpísanú. Si si istý/á, že chceš pokračovať?", "confirmations.unfollow.confirm": "Nesleduj", "confirmations.unfollow.message": "Naozaj chceš prestať sledovať {name}?", + "conversation.delete": "Delete conversation", + "conversation.mark_as_read": "Mark as read", + "conversation.open": "View conversation", + "conversation.with": "With {names}", "directory.federated": "Zo známého fedivesmíru", "directory.local": "Iba z {domain}", "directory.new_arrivals": "Nové príchody", @@ -170,7 +174,7 @@ "home.column_settings.basic": "Základné", "home.column_settings.show_reblogs": "Zobraziť povýšené", "home.column_settings.show_replies": "Ukázať odpovede", - "home.column_settings.update_live": "Update in real-time", + "home.column_settings.update_live": "Aktualizuj v reálnom čase", "intervals.full.days": "{number, plural, one {# deň} few {# dní} many {# dní} other {# dní}}", "intervals.full.hours": "{number, plural, one {# hodina} few {# hodín} many {# hodín} other {# hodín}}", "intervals.full.minutes": "{number, plural, one {# minúta} few {# minút} many {# minút} other {# minút}}", @@ -264,7 +268,7 @@ "navigation_bar.preferences": "Voľby", "navigation_bar.public_timeline": "Federovaná časová os", "navigation_bar.security": "Zabezbečenie", - "notification.and_n_others": "and {count, plural, one {# other} other {# others}}", + "notification.and_n_others": "a {count, plural,one {# ostatné} other {# ostatných}}", "notification.favourite": "{name} si obľúbil/a tvoj príspevok", "notification.follow": "{name} ťa začal/a následovať", "notification.mention": "{name} ťa spomenul/a", diff --git a/app/javascript/mastodon/locales/sl.json b/app/javascript/mastodon/locales/sl.json index d7d78c41c..9999dcd8b 100644 --- a/app/javascript/mastodon/locales/sl.json +++ b/app/javascript/mastodon/locales/sl.json @@ -111,6 +111,10 @@ "confirmations.reply.message": "Odgovarjanje bo prepisalo sporočilo, ki ga trenutno sestavljate. Ali ste prepričani, da želite nadaljevati?", "confirmations.unfollow.confirm": "Prenehaj slediti", "confirmations.unfollow.message": "Ali ste prepričani, da ne želite več slediti {name}?", + "conversation.delete": "Delete conversation", + "conversation.mark_as_read": "Mark as read", + "conversation.open": "View conversation", + "conversation.with": "With {names}", "directory.federated": "From known fediverse", "directory.local": "From {domain} only", "directory.new_arrivals": "New arrivals", diff --git a/app/javascript/mastodon/locales/sq.json b/app/javascript/mastodon/locales/sq.json index 0f851051c..9fe768173 100644 --- a/app/javascript/mastodon/locales/sq.json +++ b/app/javascript/mastodon/locales/sq.json @@ -111,6 +111,10 @@ "confirmations.reply.message": "Përgjigja tani do të shkaktojë mbishkrimin e mesazhit që po hartoni. Jeni i sigurt se doni të vazhdohet më tej?", "confirmations.unfollow.confirm": "Resht së ndjekuri", "confirmations.unfollow.message": "Jeni i sigurt se doni të mos ndiqet më {name}?", + "conversation.delete": "Delete conversation", + "conversation.mark_as_read": "Mark as read", + "conversation.open": "View conversation", + "conversation.with": "With {names}", "directory.federated": "From known fediverse", "directory.local": "From {domain} only", "directory.new_arrivals": "New arrivals", diff --git a/app/javascript/mastodon/locales/sr-Latn.json b/app/javascript/mastodon/locales/sr-Latn.json index fb6a365ce..5232265e3 100644 --- a/app/javascript/mastodon/locales/sr-Latn.json +++ b/app/javascript/mastodon/locales/sr-Latn.json @@ -111,6 +111,10 @@ "confirmations.reply.message": "Replying now will overwrite the message you are currently composing. Are you sure you want to proceed?", "confirmations.unfollow.confirm": "Otprati", "confirmations.unfollow.message": "Da li ste sigurni da želite da otpratite korisnika {name}?", + "conversation.delete": "Delete conversation", + "conversation.mark_as_read": "Mark as read", + "conversation.open": "View conversation", + "conversation.with": "With {names}", "directory.federated": "From known fediverse", "directory.local": "From {domain} only", "directory.new_arrivals": "New arrivals", diff --git a/app/javascript/mastodon/locales/sr.json b/app/javascript/mastodon/locales/sr.json index 064934f54..cc8d9d89c 100644 --- a/app/javascript/mastodon/locales/sr.json +++ b/app/javascript/mastodon/locales/sr.json @@ -111,6 +111,10 @@ "confirmations.reply.message": "Replying now will overwrite the message you are currently composing. Are you sure you want to proceed?", "confirmations.unfollow.confirm": "Отпрати", "confirmations.unfollow.message": "Да ли сте сигурни да желите да отпратите корисника {name}?", + "conversation.delete": "Delete conversation", + "conversation.mark_as_read": "Mark as read", + "conversation.open": "View conversation", + "conversation.with": "With {names}", "directory.federated": "From known fediverse", "directory.local": "From {domain} only", "directory.new_arrivals": "New arrivals", diff --git a/app/javascript/mastodon/locales/sv.json b/app/javascript/mastodon/locales/sv.json index f666a4b6e..3c3c62f3a 100644 --- a/app/javascript/mastodon/locales/sv.json +++ b/app/javascript/mastodon/locales/sv.json @@ -111,6 +111,10 @@ "confirmations.reply.message": "Om du svarar nu kommer det att ersätta meddelandet du håller på att skriva. Är du säker på att du vill fortsätta?", "confirmations.unfollow.confirm": "Sluta följa", "confirmations.unfollow.message": "Är du säker på att du vill sluta följa {name}?", + "conversation.delete": "Delete conversation", + "conversation.mark_as_read": "Mark as read", + "conversation.open": "View conversation", + "conversation.with": "With {names}", "directory.federated": "From known fediverse", "directory.local": "From {domain} only", "directory.new_arrivals": "New arrivals", diff --git a/app/javascript/mastodon/locales/ta.json b/app/javascript/mastodon/locales/ta.json index 3caf301d0..fb51b46b4 100644 --- a/app/javascript/mastodon/locales/ta.json +++ b/app/javascript/mastodon/locales/ta.json @@ -111,6 +111,10 @@ "confirmations.reply.message": "இப்போது பதில், தற்போது நீங்கள் உருவாக்கும் செய்தி மேலெழுதப்படும். நீங்கள் தொடர விரும்புகிறீர்களா?", "confirmations.unfollow.confirm": "பின்தொடராட்", "confirmations.unfollow.message": "நிச்சயமாக நீங்கள் பின்தொடர விரும்புகிறீர்களா {name}?", + "conversation.delete": "Delete conversation", + "conversation.mark_as_read": "Mark as read", + "conversation.open": "View conversation", + "conversation.with": "With {names}", "directory.federated": "From known fediverse", "directory.local": "From {domain} only", "directory.new_arrivals": "New arrivals", diff --git a/app/javascript/mastodon/locales/te.json b/app/javascript/mastodon/locales/te.json index 5827dbb3a..5af35a04d 100644 --- a/app/javascript/mastodon/locales/te.json +++ b/app/javascript/mastodon/locales/te.json @@ -111,6 +111,10 @@ "confirmations.reply.message": "ఇప్పుడే ప్రత్యుత్తరం ఇస్తే మీరు ప్రస్తుతం వ్రాస్తున్న సందేశం తిరగరాయబడుతుంది. మీరు ఖచ్చితంగా కొనసాగించాలనుకుంటున్నారా?", "confirmations.unfollow.confirm": "అనుసరించవద్దు", "confirmations.unfollow.message": "{name}ను మీరు ఖచ్చితంగా అనుసరించవద్దనుకుంటున్నారా?", + "conversation.delete": "Delete conversation", + "conversation.mark_as_read": "Mark as read", + "conversation.open": "View conversation", + "conversation.with": "With {names}", "directory.federated": "From known fediverse", "directory.local": "From {domain} only", "directory.new_arrivals": "New arrivals", diff --git a/app/javascript/mastodon/locales/th.json b/app/javascript/mastodon/locales/th.json index 33eb315f1..d7a4da197 100644 --- a/app/javascript/mastodon/locales/th.json +++ b/app/javascript/mastodon/locales/th.json @@ -111,6 +111,10 @@ "confirmations.reply.message": "การตอบกลับตอนนี้จะเขียนทับข้อความที่คุณกำลังเขียน คุณแน่ใจหรือไม่ว่าต้องการดำเนินการต่อ?", "confirmations.unfollow.confirm": "เลิกติดตาม", "confirmations.unfollow.message": "คุณแน่ใจหรือไม่ว่าต้องการเลิกติดตาม {name}?", + "conversation.delete": "Delete conversation", + "conversation.mark_as_read": "Mark as read", + "conversation.open": "View conversation", + "conversation.with": "With {names}", "directory.federated": "From known fediverse", "directory.local": "From {domain} only", "directory.new_arrivals": "New arrivals", diff --git a/app/javascript/mastodon/locales/tr.json b/app/javascript/mastodon/locales/tr.json index 2c4d820de..772b55ee1 100644 --- a/app/javascript/mastodon/locales/tr.json +++ b/app/javascript/mastodon/locales/tr.json @@ -111,6 +111,10 @@ "confirmations.reply.message": "Şimdi yanıtlarken o an oluşturduğunuz mesajın üzerine yazılır. Devam etmek istediğinize emin misiniz?", "confirmations.unfollow.confirm": "Takibi kaldır", "confirmations.unfollow.message": "{name}'yi takipten çıkarmak istediğinizden emin misiniz?", + "conversation.delete": "Delete conversation", + "conversation.mark_as_read": "Mark as read", + "conversation.open": "View conversation", + "conversation.with": "With {names}", "directory.federated": "From known fediverse", "directory.local": "Yalnızca {domain} adresinden", "directory.new_arrivals": "Yeni gelenler", diff --git a/app/javascript/mastodon/locales/uk.json b/app/javascript/mastodon/locales/uk.json index 6ccb20fc6..515ffdd83 100644 --- a/app/javascript/mastodon/locales/uk.json +++ b/app/javascript/mastodon/locales/uk.json @@ -111,6 +111,10 @@ "confirmations.reply.message": "Поточна відповідь перезапише повідомлення, яке ви зараз пишете. Ви впевнені, що хочете продовжити?", "confirmations.unfollow.confirm": "Відписатися", "confirmations.unfollow.message": "Ви впевнені, що хочете відписатися від {name}?", + "conversation.delete": "Delete conversation", + "conversation.mark_as_read": "Mark as read", + "conversation.open": "View conversation", + "conversation.with": "With {names}", "directory.federated": "З відомого федесвіту", "directory.local": "Тільки з домену {domain}", "directory.new_arrivals": "Нові надходження", diff --git a/app/javascript/mastodon/locales/whitelist_ga.json b/app/javascript/mastodon/locales/whitelist_ga.json new file mode 100644 index 000000000..0d4f101c7 --- /dev/null +++ b/app/javascript/mastodon/locales/whitelist_ga.json @@ -0,0 +1,2 @@ +[ +] diff --git a/app/javascript/mastodon/locales/zh-CN.json b/app/javascript/mastodon/locales/zh-CN.json index 2f0373d93..28f35313c 100644 --- a/app/javascript/mastodon/locales/zh-CN.json +++ b/app/javascript/mastodon/locales/zh-CN.json @@ -111,6 +111,10 @@ "confirmations.reply.message": "回复此消息将会覆盖当前正在编辑的信息。确定继续吗?", "confirmations.unfollow.confirm": "取消关注", "confirmations.unfollow.message": "你确定要取消关注 {name} 吗?", + "conversation.delete": "Delete conversation", + "conversation.mark_as_read": "Mark as read", + "conversation.open": "View conversation", + "conversation.with": "With {names}", "directory.federated": "From known fediverse", "directory.local": "From {domain} only", "directory.new_arrivals": "New arrivals", diff --git a/app/javascript/mastodon/locales/zh-HK.json b/app/javascript/mastodon/locales/zh-HK.json index 0a42aa47f..845c2c956 100644 --- a/app/javascript/mastodon/locales/zh-HK.json +++ b/app/javascript/mastodon/locales/zh-HK.json @@ -111,6 +111,10 @@ "confirmations.reply.message": "Replying now will overwrite the message you are currently composing. Are you sure you want to proceed?", "confirmations.unfollow.confirm": "取消關注", "confirmations.unfollow.message": "真的不要繼續關注 {name} 了嗎?", + "conversation.delete": "Delete conversation", + "conversation.mark_as_read": "Mark as read", + "conversation.open": "View conversation", + "conversation.with": "With {names}", "directory.federated": "From known fediverse", "directory.local": "From {domain} only", "directory.new_arrivals": "New arrivals", diff --git a/app/javascript/mastodon/locales/zh-TW.json b/app/javascript/mastodon/locales/zh-TW.json index 82d7b6db5..8cb601786 100644 --- a/app/javascript/mastodon/locales/zh-TW.json +++ b/app/javascript/mastodon/locales/zh-TW.json @@ -111,6 +111,10 @@ "confirmations.reply.message": "現在回覆將蓋掉您目前正在撰寫的訊息。是否仍要回覆?", "confirmations.unfollow.confirm": "取消關注", "confirmations.unfollow.message": "真的要取消關注 {name} 嗎?", + "conversation.delete": "Delete conversation", + "conversation.mark_as_read": "Mark as read", + "conversation.open": "View conversation", + "conversation.with": "With {names}", "directory.federated": "From known fediverse", "directory.local": "From {domain} only", "directory.new_arrivals": "New arrivals", diff --git a/config/locales/activerecord.br.yml b/config/locales/activerecord.br.yml index c7677c850..77fc4f2a1 100644 --- a/config/locales/activerecord.br.yml +++ b/config/locales/activerecord.br.yml @@ -1 +1,13 @@ +--- br: + activerecord: + attributes: + poll: + expires_at: Deiziad termen + options: Dibaboù + errors: + models: + account: + attributes: + username: + invalid: nemet lizherennoù, niverennoù ha isbarrennigoù diff --git a/config/locales/ar.yml b/config/locales/ar.yml index 45001e6fc..e47bc6871 100644 --- a/config/locales/ar.yml +++ b/config/locales/ar.yml @@ -17,9 +17,6 @@ ar: contact_unavailable: غير متوفر discover_users: اكتشف مستخدِمين documentation: الدليل - extended_description_html: | -

مكان جيد للقواعد

-

لم يتم بعد إدخال الوصف الطويل.

federation_hint_html: بواسطة حساب في %{instance} ستتمكن من تتبع أناس في أي خادم ماستدون وأكثر. generic_description: "%{domain} هو سيرفر من بين سيرفرات الشبكة" get_apps: جرّب تطبيقا على الموبايل @@ -605,11 +602,6 @@ ar: directory: سِجلّ الحسابات explanation: استكشف مستخدِمين آخرين حسب المواضيع التي تهمهم explore_mastodon: استكشف %{title} - domain_blocks: - domain: النطاق - severity: القوّة - silence: اكتم - suspension: علّقه domain_validator: invalid_domain: ليس بإسم نطاق صالح errors: @@ -741,9 +733,6 @@ ar: too_many: لا يمكن إرفاق أكثر من 4 ملفات migrations: acct: username@domain للحساب الجديد - currently_redirecting: 'تم تحويل رابط ملفك الشخصي إلى:' - proceed: حفظ - updated_msg: تم تحديث إعدادات ترحيل حسابك بنجاح! moderation: title: الإشراف notification_mailer: diff --git a/config/locales/ast.yml b/config/locales/ast.yml index 72b87a6ac..ed8aef235 100644 --- a/config/locales/ast.yml +++ b/config/locales/ast.yml @@ -8,9 +8,6 @@ ast: contact_missing: Nun s'afitó contact_unavailable: N/D documentation: Documentación - extended_description_html: | -

Un llugar bonu pa les regles

-

Entá nun se configuró la descripción estendida.

hosted_on: Mastodon ta agospiáu en %{domain} learn_more: Deprendi más source_code: Códigu fonte @@ -199,7 +196,6 @@ ast: too_many: Nun puen axuntase más de 4 ficheros migrations: acct: nome_usuariu@dominiu de la cuenta nueva - proceed: Guardar notification_mailer: digest: body: Equí hai un resume de los mensaxes que nun viesti dende la última visita'l %{since} diff --git a/config/locales/bn.yml b/config/locales/bn.yml index 5f05fe30e..1da7aac53 100644 --- a/config/locales/bn.yml +++ b/config/locales/bn.yml @@ -17,9 +17,6 @@ bn: contact_unavailable: প্রযোজ্য নয় discover_users: ব্যবহারকারীদের দেখুন documentation: ব্যবহারবিলি - extended_description_html: | -

নিয়মের জন্য উপযুক্ত জায়গা

-

বিস্তারিত বিবরণ এখনো যুক্ত করা হয়নি

federation_hint_html: "%{instance}তে একটা নিবন্ধন থাকলে আপনি যেকোনো মাস্টাডন বা এধরণের অন্যান্য সার্ভারের মানুষের সাথে যুক্ত হতে পারবেন ।" generic_description: নেটওয়ার্কের ভেতরে %{domain} একটি সার্ভার get_apps: মোবাইল এপ্প একটা ব্যবহার করতে পারেন diff --git a/config/locales/ca.yml b/config/locales/ca.yml index bfd7c514d..eb2bfc96d 100644 --- a/config/locales/ca.yml +++ b/config/locales/ca.yml @@ -17,9 +17,6 @@ ca: contact_unavailable: N/D discover_users: Descobreix usuaris documentation: Documentació - extended_description_html: | -

Un bon lloc per les regles

-

Encara no s'ha configurat la descripció ampliada.

federation_hint_html: Amb un compte de %{instance} podràs seguir persones de qualsevol servidor Mastodon i altres. generic_description: "%{domain} és un servidor a la xarxa" get_apps: Prova una aplicació mòbil @@ -627,23 +624,6 @@ ca: directory: Directori de perfils explanation: Descobreix usuaris segons els seus interessos explore_mastodon: Explora %{title} - domain_blocks: - blocked_domains: Llistat dels dominis limitats i bloquejats - description: Aquesta és la llista de servidors que %{instance} limita o en rebutja la federació. - domain: Domini - media_block: Bloqueig multimèdia - no_domain_blocks: "(Sense bloquejos de domini)" - severity: Severitat - severity_legend: - media_block: Els fitxers multimèdia procedents del servidor no es poden recuperar, emmagatzemar ni mostrar a l'usuari. - silence: Es poden trobar comptes de servidors silenciats, seguits i amb interacció, però els seus tuts no apareixeran en les línies de temps públiques i les seves notificacions no arribaran als usuaris locals que no els segueixen. - suspension: No s’emmagatzema ni es mostra contingut de servidors en suspens, ni se’ls envia cap contingut. S'ignoren les interaccions dels servidors suspesos. - suspension_disclaimer: Els servidors suspesos poden ocasionalment recuperar contingut públic d’aquest servidor. - title: Severitats - show_rationale: Mostra el raonament - silence: Silenci - suspension: Suspensió - title: "%{instance} Llistat de les instàncies bloquejades" domain_validator: invalid_domain: no es un nom de domini vàlid errors: @@ -780,9 +760,6 @@ ca: too_many: No es poden adjuntar més de 4 fitxers migrations: acct: usuari@domini del nou compte - currently_redirecting: 'El teu perfil està configurat com a redirecció a:' - proceed: Desa - updated_msg: La configuració de la migració del compte s'ha actualitzat correctament! moderation: title: Moderació notification_mailer: diff --git a/config/locales/co.yml b/config/locales/co.yml index e91b1361f..ac558e64e 100644 --- a/config/locales/co.yml +++ b/config/locales/co.yml @@ -17,9 +17,6 @@ co: contact_unavailable: Micca dispunibule discover_users: Scopre utilizatori documentation: Ducumentazione - extended_description_html: | -

Una bona piazza per e regule

-

A descrizzione stesa ùn hè micca stata riempiuta.

federation_hint_html: Cù un contu nant'à %{instance} puderete siguità ghjente da tutti i servori Mastodon è ancu più d'altri. generic_description: "%{domain} hè un servore di a rete" get_apps: Pruvà un'applicazione di telefuninu @@ -521,6 +518,10 @@ co: context: Cuntestu directory: In l'annuariu in_directory: "%{count} in l'annuariu" + last_active: Ultima attività + most_popular: Più pupulari + most_recent: Più ricente + name: Hashtag review: Statutu di verificazione reviewed: Verificatu title: Hashtag @@ -617,6 +618,11 @@ co: return: Vede u prufile di l’utilizatore web: Andà à l’interfaccia web title: Siguità %{acct} + challenge: + confirm: Cuntinuvà + hint_html: "Astuzia: Ùn avemu micca da dumandavvi stu codice per l'ore chì vene." + invalid_password: Chjave d'accessu micca curretta + prompt: Cunfirmà a chjave d'accessu per cuntinuvà datetime: distance_in_words: about_x_hours: "%{count}o" @@ -632,7 +638,9 @@ co: x_months: "%{count}Me" x_seconds: "%{count}s" deletes: + challenge_not_passed: L'infurmazione entrata ùn era micca curretta confirm_password: Entrate a vostra chjave d’accessu attuale per verificà a vostra identità + confirm_username: Entrà u vostru cugnome per cunfirmà a prucedura proceed: Sguassà u contu success_msg: U vostru contu hè statu sguassatu warning: @@ -650,23 +658,6 @@ co: directory: Annuariu di i prufili explanation: Scopre utilizatori à partesi di i so centri d'interessu explore_mastodon: Scopre à %{title} - domain_blocks: - blocked_domains: Lista di dumini bluccati è limitati - description: Quessa ghjè a lista di i servori limitati da o cù quelli %{instance} righjetta a federazione. - domain: Duminiu - media_block: Blucchime di media - no_domain_blocks: "(Nisun blucchime di duminiu)" - severity: Severità - severity_legend: - media_block: I fugliali media chì venenu sa stu servore ùn saranu mai ricuperati, cunservati, o affissati à l'utilizatore. - silence: I conti nant'à i servori silenzati ponu esse trovi, siguitati è spartuti/favurizati, mà i statuti ùn saranu micca in e linee pubbliche, è l'utilizatori lucali ch'ùn sò micca abbunati à sti conti ùn anu micca da riceve e so nutificazione. - suspension: U cuntinutu da i servori suspesi ùn hè mai cunservatu o affissatu, è u cuntinutu di stu servore ùn li hè micca mandatu. L'interazzione da sti servori suspesi sò ignurate. - suspension_disclaimer: I servori suspesi ponu ognitantu ricuperà i cuntinuti pubblichi da stu servore. - title: Severità - show_rationale: Vede ragiò - silence: Silenziu - suspension: Suspensione - title: Lista di servori bluccati da %{instance} domain_validator: invalid_domain: ùn hè micca un nome di duminiu currettu errors: @@ -804,9 +795,6 @@ co: too_many: Ùn si pò micca aghjunghje più di 4 fugliali migrations: acct: cugnome@duminiu di u novu contu - currently_redirecting: 'U vostru prufile riindiriza tuttu versu à:' - proceed: Salvà - updated_msg: I paramettri di migrazione sò stati messi à ghjornu! moderation: title: Muderazione notification_mailer: diff --git a/config/locales/cs.yml b/config/locales/cs.yml index 569eb35d2..add1c78d5 100644 --- a/config/locales/cs.yml +++ b/config/locales/cs.yml @@ -17,9 +17,6 @@ cs: contact_unavailable: Neuvedeno discover_users: Objevujte uživatele documentation: Dokumentace - extended_description_html: | -

Dobré místo pro pravidla

-

Rozšířený popis ještě nebyl nastaven.

federation_hint_html: S účtem na %{instance} můžete sledovat lidi na jakémkoliv serveru Mastodon a jiných službách. generic_description: "%{domain} je jedním ze serverů v síti" get_apps: Vyzkoušejte mobilní aplikaci @@ -40,6 +37,13 @@ cs: status_count_before: Kteří napsali tagline: Sledujte své přátele a objevujte nové terms: Podmínky používání + unavailable_content: Nedostupný obsah + unavailable_content_description: + reason: 'Důvod:' + rejecting_media: Mediální soubory z tohoto serveru nebudou zpracovány a nebudou zobrazeny žádné náhledy. Pro prohlédnutí médií bude třeba manuálně přejít na druhý server. + silenced: Příspěvky z tohoto severu nebudou zobrazeni nikde kromě vašeho domovského proudu, v případě, že sledujete autora. + suspended: Nebudete moci sledovat nikoho z tohoto serveru, žádná data z něj nebudou zpracována či uložena a žádná data nebudou vyměněna mezi servery. + unavailable_content_html: Mastodon vám obvykle dovoluje prohlížet si obsah a komunikovat s uživateli z jakéhokoliv dalšího serveru ve fedivesmíru. Tohle jsou výjimky, které byly zavedeny na tomto konkrétním serveru. user_count_after: few: uživatelé many: uživatelů @@ -533,6 +537,10 @@ cs: context: Kontext directory: V adresáři in_directory: "%{count} v adresáři" + last_active: Naposledy aktivní + most_popular: Nejpopulárnější + most_recent: Nejnovější + name: Hashtag review: Stav schválení reviewed: Schválen title: Hashtagy @@ -558,6 +566,12 @@ cs: new_trending_tag: body: 'Hashtag #%{name} je dnes populární, nebyl však dříve schválen. Nebude zobrazen veřejně, pokud to nedovolíte. Můžete také pouze uložit formulář tak, jak je, a nikdy o něm opět neslyšet.' subject: Nový hashtag ke schválení na %{instance} (#%{name}) + aliases: + add_new: Vytvořit alias + created_msg: Nový alias byl úspěšně vytvořen. Nyní můžete zahájit přesun ze starého účtu. + deleted_msg: Alias byl úspěšně odstraněn. Přesun z tamtoho účtu na tento již nebude možný. + hint_html: Chcete-li se přesunout z jiného účtu na tento, můžete si zde vytvořit alias, který je vyžadován předtím, než můžete pokračovat přesunem sledujících ze starého účtu na tento. Tato akce sama o sobě je neškodná a vratná. Přesun účtu se zahajuje ze starého účtu. + remove: Odpojit alias appearance: advanced_web_interface: Pokročilé webové rozhraní advanced_web_interface_hint: 'Chcete-li využít celé šířky vaší obrazovky, dovolí vám pokročilé webové rozhraní nastavit si mnoho různých sloupců, takže můžete vidět ve stejnou chvíli tolik informací, kolik chcete: domovskou časovou osu, oznámení, federovanou časovou osu a libovolný počet seznamů a hashtagů.' @@ -617,6 +631,7 @@ cs: confirming: Čekám na dokončení potvrzení e-mailu. functional: Váš účet je zcela funkční. pending: Váš požadavek čeká na schválení naším personálem. To může nějakou dobu trvat. Pokud bude váš požadavek schválen, obdržíte e-mail. + redirecting_to: Váš účet je neaktivní, protože právě přesměrovává na účet %{acct}. trouble_logging_in: Problémy s přihlašováním? authorize_follow: already_following: Tento účet již sledujete @@ -629,6 +644,11 @@ cs: return: Zobrazit profil uživatele web: Přejít na web title: Sledovat uživatele %{acct} + challenge: + confirm: Pokračovat + hint_html: "Tip: Po dobu hodiny vás nebudeme znovu žádat o heslo." + invalid_password: Neplatné heslo + prompt: Pokračujte potvrzením hesla datetime: distance_in_words: about_x_hours: "%{count} hod" @@ -644,7 +664,9 @@ cs: x_months: "%{count} mesíců" x_seconds: "%{count} s" deletes: + challenge_not_passed: Informace, které jste zadal/a, nejsou správné confirm_password: Zadejte svoje současné heslo pro ověření vaší identity + confirm_username: Zadáním svého uživatelského jména potvrdíte proces proceed: Odstranit účet success_msg: Váš účet byl úspěšně odstraněn warning: @@ -662,23 +684,6 @@ cs: directory: Adresář profilů explanation: Objevujte uživatele podle jejich zájmů explore_mastodon: Prozkoumejte %{title} - domain_blocks: - blocked_domains: Seznam omezených a blokovaných domén - description: Tohle je seznam serverů, které server %{instance} omezuje nebo odmítá federaci. - domain: Doména - media_block: Blokace médií - no_domain_blocks: "(Žádné blokované domény)" - severity: Přísnost - severity_legend: - media_block: Mediální soubory přicházející ze serveru nejsou stahovány, ukládány ani zobrazovány uživatelům. - silence: Účty z utišených serverů lze nalézt, sledovat a interagovat s nimi, ale jejich tooty nebudou zobrazovány na veřejných časových osách a oznámení od nich se nedostanou k místním uživatelům, kteří je nesledují. - suspension: Z pozastavených serverů se neukládá ani nezobrazuje žádný obsah, ani se naně žádný obsah neposílá. Interakce z pozastavených serverů jsou ignorovány. - suspension_disclaimer: Pozastavené servery mohou občas stahovat veřejný obsah z tohoto serveru. - title: Přísnosti - show_rationale: Zobrazit odůvodnění - silence: Utišení - suspension: Pozastavení - title: "%{instance} Seznam blokovaných serverů" domain_validator: invalid_domain: není platné doménové jméno errors: @@ -819,10 +824,32 @@ cs: images_and_video: K tootu, který již obsahuje obrázky, nelze připojit video too_many: Nelze připojit více než 4 soubory migrations: - acct: přezdívka@doména nového účtu - currently_redirecting: 'Váš profil má nastaveno přesměrování na:' - proceed: Uložit - updated_msg: Vaše nastavení přesunutí účtu bylo úspěšně aktualizováno! + acct: Přesunuto na + cancel: Zrušit přesměrování + cancel_explanation: Zrušením přesměrování znovu aktivujete svůj aktuální účet, ale nevrátí se vám sledující, kteří byli přesměrováni na druhý účet. + cancelled_msg: Přesměrování bylo úspěšně zrušeno. + errors: + already_moved: je stejný účet, na který jste se již přesunul/a + missing_also_known_as: neodkazuje na tento účet + move_to_self: nemůže být aktuální účet + not_found: nemohl být nalezen + on_cooldown: Probíhá období odpočinku + followers_count: Sledující v době přesunu + incoming_migrations: Přesun z jiného účtu + incoming_migrations_html: Chcete-li se přesunout z jiného účtu na tento, potřebujete si nejprve vytvořit alias účtu. + moved_msg: Váš účet nyní přesměrovává na účet %{acct} a vaši sledující se na něj přesouvají. + not_redirecting: Váš účet aktuálně nepřesměrovává na žádný jiný účet. + on_cooldown: Nedávno jste přesunul/a svůj účet. Tato funkce bude opět dostupná za %{count} dní. + past_migrations: Předchozí přesuny + proceed_with_move: Přesunout sledující + redirecting_to: Váš účet přesměrovává na účet %{acct}. + warning: + backreference_required: Nový účet musí být nejprve nastaven, aby odkazoval zpátky na tento + before: 'Před pokračováním si prosím pečlivě přečtěte tyto poznámky:' + cooldown: Po přesunu nastane období odpočinku, kdy se nebudete moci opět přesunout + disabled_account: Váš aktuální účet nebude poté zcela použitelný. Budete však mít přístup k datovým exportům a budete ho moci znovu aktivovat. + followers: Touto akcí přesunete všechny sledující z aktuálního účtu na nový účet + other_data: Žádná další data nebudou přesunuta automaticky moderation: title: Moderování notification_mailer: @@ -971,6 +998,7 @@ cs: settings: account: Účet account_settings: Nastavení účtu + aliases: Aliasy účtů appearance: Vzhled authorized_apps: Autorizované aplikace back: Zpět na Mastodon @@ -982,7 +1010,7 @@ cs: identity_proofs: Důkazy identity import: Import import_and_export: Import a export - migrate: Přesunutí účtu + migrate: Přesun účtu notifications: Oznámení preferences: Předvolby profile: Profil diff --git a/config/locales/cy.yml b/config/locales/cy.yml index a58ea2534..ece0a34a3 100644 --- a/config/locales/cy.yml +++ b/config/locales/cy.yml @@ -17,9 +17,6 @@ cy: contact_unavailable: Ddim yn berthnasol discover_users: Darganfod defnyddwyr documentation: Dogfennaeth - extended_description_html: | -

Lle da ar gyfer rheolau

-

Nid yw'r disgrifiad estynedig wedi ei osod eto.

federation_hint_html: Gyda cyfrif ar %{instance}, gallwch dilyn pobl ar unrhyw gweinydd Mastodon, a thu hwnt. generic_description: Mae %{domain} yn un gweinydd yn y rhwydwaith get_apps: Rhowch gynnig ar ap dyfeis symudol @@ -728,9 +725,6 @@ cy: too_many: Ni ellir ychwanegu mwy na 4 dogfen migrations: acct: enwdefnyddiwr@parth y cyfrif newydd - currently_redirecting: 'Mae eich proffil wedi ei osod i ailgyfeirio i:' - proceed: Cadw - updated_msg: Diweddarwyd gosodiad mudo eich cyfrif yn llwyddiannus! moderation: title: Goruwchwyliad notification_mailer: diff --git a/config/locales/da.yml b/config/locales/da.yml index 06a68f684..85a5bbefd 100644 --- a/config/locales/da.yml +++ b/config/locales/da.yml @@ -14,9 +14,6 @@ da: contact_unavailable: Ikke tilgængeligt discover_users: Opdag brugere documentation: Dokumentation - extended_description_html: | -

Et godt sted for regler

-

Den udvidede beskrivelse er endnu ikke blevet opsat.

generic_description: "%{domain} er en server i netværket" get_apps: Prøv en mobil app hosted_on: Mostodon hostet på %{domain} @@ -524,8 +521,6 @@ da: directories: directory: Profilliste explore_mastodon: Uforsk %{title} - domain_blocks: - domain: Domæne errors: '400': The request you submitted was invalid or malformed. '403': Du har ikke tilladelse til at se denne side. @@ -633,9 +628,6 @@ da: too_many: Kan ikke vedhæfte mere en 4 filer migrations: acct: username@domain af den nye konto - currently_redirecting: 'Din profil er sat til at henvise til:' - proceed: Gem - updated_msg: Dine konti migrærings indstillinger blev opdateret! moderation: title: Moderatering notification_mailer: diff --git a/config/locales/de.yml b/config/locales/de.yml index fb988668a..785face33 100644 --- a/config/locales/de.yml +++ b/config/locales/de.yml @@ -17,9 +17,6 @@ de: contact_unavailable: Nicht verfügbar discover_users: Benutzer_innen entdecken documentation: Dokumentation - extended_description_html: | -

Ein hervorragender Ort für Regeln

-

Die erweiterte Beschreibung wurde von dem Administrator noch nicht eingestellt.

federation_hint_html: Mit einem Konto auf %{instance} wirst du in der Lage sein Nutzer_innen auf beliebigen Mastodon-Servern und darüber hinaus zu folgen. generic_description: "%{domain} ist ein Server im Fediversum" get_apps: Versuche eine mobile App @@ -38,6 +35,13 @@ de: status_count_before: mit tagline: Finde deine Freunde und entdecke neue terms: Nutzungsbedingungen + unavailable_content: Nicht verfügbarer Inhalt + unavailable_content_description: + reason: 'Grund:' + rejecting_media: Mediendateien dieses Servers werden nicht verarbeitet und keine Thumbnails werden angezeigt, was manuelles anklicken auf den anderen Server erfordert. + silenced: Beiträge von diesem Server werden nirgends angezeigt, außer in deiner Startseite, wenn du der Person folgst, die den Beitrag verfasst hat. + suspended: Du kannst niemanden von diesem Server folgen, und keine Daten werden verarbeitet oder gespeichert und keine Daten ausgetauscht. + unavailable_content_html: Mastodon erlaubt es dir generell, mit Inhalten zu interagieren, diese anzuzeigen und mit anderen Nutzern im Fediversum über Server hinweg zu interagieren. Dies sind die Ausnahmen, die auf diesem bestimmten Server gemacht wurden. user_count_after: one: Profil other: Profile @@ -521,6 +525,10 @@ de: context: Kontext directory: Im Verzeichnis in_directory: "%{count} im Verzeichnis" + last_active: Zuletzt aktiv + most_popular: Am beliebtesten + most_recent: Neuste + name: Hashtag review: Prüfstatus reviewed: Überprüft title: Hashtags @@ -546,6 +554,12 @@ de: new_trending_tag: body: 'Der Hashtag #%{name} ist heute am trenden, aber wurde vorher noch nicht überprüft. Er wird nicht öffentlich angezeigt, es sei denn du erlaubst es oder speicherst das Formular ab und vergisst es.' subject: Neuer Hashtag zur Überprüfung auf %{instance} verfügbar (#%{name}) + aliases: + add_new: Alias erstellen + created_msg: Ein neuer Alias wurde erfolgreich erstellt. Du kannst nun den Wechsel vom alten Konto starten. + deleted_msg: Der Alias wurde erfolgreich entfernt. Aus diesem Konto zu diesem zu verschieben ist nicht mehr möglich. + hint_html: Wenn du von einem Konto zu einem anderem Konto wechseln möchtest, dann kannst du einen Alias erstellen, welcher benötigt wird bevor du deine Folger_innen vom altem Account zu diesen migrierst. Die Aktion alleine ist harmlos und wi­der­ruf­lich. Die Kontenmigration wird vom altem Konto aus eingeleitet. + remove: Alle Aliase aufheben appearance: advanced_web_interface: Fortgeschrittene Benutzeroberfläche advanced_web_interface_hint: Wenn du mehr aus deiner Bildschirmbreite herausholen möchtest, erlaubt dir die fortgeschrittene Benutzeroberfläche viele unterschiedliche Spalten auf einmal zu sehen, wie z.B. deine Startseite, Benachrichtigungen, das gesamte bekannte Netz, deine Listen und beliebige Hashtags. @@ -605,6 +619,7 @@ de: confirming: Warte auf die Bestätigung der E-Mail. functional: Dein Konto ist voll funktionsfähig. pending: Deine Bewerbung wird von unseren Mitarbeitern noch überprüft. Dies kann einige Zeit dauern. Du erhältst eine E-Mail, wenn deine Bewerbung genehmigt wurde. + redirecting_to: Dein Konto ist inaktiv, da es derzeit zu %{acct} umgeleitet wird. trouble_logging_in: Schwierigkeiten beim Anmelden? authorize_follow: already_following: Du folgst diesem Konto bereits @@ -617,6 +632,11 @@ de: return: Zeige das Profil web: In der Benutzeroberfläche öffnen title: "%{acct} folgen" + challenge: + confirm: Fortfahren + hint_html: "Hinweis: Wir werden dich für die nächste Stunde nicht erneut nach deinem Passwort fragen." + invalid_password: Ungültiges Passwort + prompt: Gib dein Passwort ein um fortzufahren datetime: distance_in_words: about_x_hours: "%{count}h" @@ -632,7 +652,9 @@ de: x_months: "%{count}mo" x_seconds: "%{count}s" deletes: + challenge_not_passed: Die eingegebenen Informationen waren nicht korrekt confirm_password: Gib dein derzeitiges Passwort ein, um deine Identität zu bestätigen + confirm_username: Gib deinen Benutzernamen ein, um das Verfahren zu bestätigen proceed: Konto löschen success_msg: Dein Konto wurde erfolgreich gelöscht warning: @@ -650,23 +672,6 @@ de: directory: Profilverzeichnis explanation: Entdecke Benutzer_innen basierend auf deren Interessen explore_mastodon: Entdecke %{title} - domain_blocks: - blocked_domains: Liste der begrenzten und blockierten Domains - description: Dies ist die Liste der Server, die %{instance} limitiert oder dessen Föderation ablehnt. - domain: Domain - media_block: Medienblockade - no_domain_blocks: "(Keine Domain-Blockaden)" - severity: Schweregrad - severity_legend: - media_block: Mediendateien, die vom Server stammen, werden weder vom Benutzer abgerufen, gespeichert noch angezeigt. - silence: Konten von stummgeschalteten Servern können gefunden und gefolgt werden und man kann mit ihnen interagieren, aber ihre Beiträge werden nicht in der öffentlichen Zeitleiste erscheinen und Benachrichtigungen von ihnen werden nicht zu lokalen Benutzern gesendet, die sie nicht folgen. - suspension: Keine Inhalte von gesperrten Servern werden gespeichert oder angezeigt, und es werden auch keine Inhalte an sie gesendet. Die Interaktionen von gesperrten Servern werden ignoriert. - suspension_disclaimer: Gesperrte Server können gelegentlich öffentliche Inhalte von diesem Server abrufen. - title: Schweregrade - show_rationale: Rationale anzeigen - silence: Stummschalten - suspension: Sperre - title: "%{instance} Liste der blockierten Instanzen" domain_validator: invalid_domain: ist kein gültiger Domain-Name errors: @@ -804,9 +809,31 @@ de: too_many: Es können nicht mehr als 4 Dateien angehängt werden migrations: acct: benutzername@domain des neuen Kontos - currently_redirecting: 'Deine Profilweiterleitung wurde gesetzt auf:' - proceed: Speichern - updated_msg: Deine Konto-Migrationseinstellungen wurden erfolgreich aktualisiert! + cancel: Umleitung abbrechen + cancel_explanation: Das Abbrechen der Umleitung wird dein aktuelles Konto erneut aktivieren, aber keine Folger_innen, die auf dieses Konto verschoben wurden, zurückholen. + cancelled_msg: Die Umleitung wurde erfolgreich abgebrochen. + errors: + already_moved: ist das gleiche Konto, zu dem du bereits umgezogen bist + missing_also_known_as: referenziert nicht zurück auf dieses Konto + move_to_self: darf nicht das aktuelles Konto sein + not_found: kann nicht gefunden werden + on_cooldown: Die Abklingzeit läuft gerade + followers_count: Folger_innen zur Zeit des Verschiebens + incoming_migrations: Ziehe von einem anderen Konto um + incoming_migrations_html: Um von einem anderen Konto zu diesem zu wechseln, musst du zuerst einen Kontoalias erstellen. + moved_msg: Dein Konto wird jetzt zu %{acct} weitergeleitet und deine Folger_innen werden verschoben. + not_redirecting: Dein Konto wird derzeit nicht auf ein anderes Konto weitergeleitet. + on_cooldown: Du hast dein Konto vor kurzem migriert. Diese Funktion wird in %{count} Tagen wieder verfügbar sein. + past_migrations: Vorherige Migrationen + proceed_with_move: Folger_innen verschieben + redirecting_to: Dein Konto wird zu %{acct} weitergeleitet. + warning: + backreference_required: Das neue Konto muss zuerst so konfiguriert werden, dass es auf das alte Konto referenziert + before: 'Bevor du fortfährst, lese bitte diese Hinweise sorgfältig durch:' + cooldown: Nach dem Migrieren wird es eine Abklingzeit geben, in der du das Konto nicht noch einmal migrieren kannst + disabled_account: Dein aktuelles Konto wird nachher nicht vollständig nutzbar sein. Du hast jedoch Zugriff auf den Datenexport sowie die Reaktivierung. + followers: Diese Aktion wird alle Folger_innen vom aktuellen Konto auf das neue Konto verschieben + other_data: Keine anderen Daten werden automatisch verschoben moderation: title: Moderation notification_mailer: @@ -951,6 +978,7 @@ de: settings: account: Konto account_settings: Konto & Sicherheit + aliases: Kontoaliase appearance: Aussehen authorized_apps: Autorisierte Anwendungen back: Zurück zu Mastodon diff --git a/config/locales/devise.br.yml b/config/locales/devise.br.yml index c7677c850..3fe043754 100644 --- a/config/locales/devise.br.yml +++ b/config/locales/devise.br.yml @@ -1 +1,33 @@ +--- br: + devise: + failure: + inactive: N'eo ket gweredekaet ho kont c'hoazh. + invalid: "%{authentication_keys} pe ger-tremen diwiriek." + last_attempt: Un esae a chom deoc'h a-raok ma vefe prennet ho kont. + locked: Prennet eo ho kont. + not_found_in_database: "%{authentication_keys} pe ger-tremen diwiriek." + pending: O vezañ asantet eo ho kont. + mailer: + confirmation_instructions: + action: Gwiriekaat ar chomlec'h postel + action_with_app: Kadarnaat ha distroiñ da %{app} + title: Gwiriekaat ar chomlec'h postel + email_changed: + subject: 'Mastodoñ : Postel kemmet' + title: Chomlec'h postel nevez + password_change: + explanation: Kemmet eo bet ger-tremen ho kont. + subject: 'Mastodoñ : Ger-tremen kemmet' + title: Ger-tremen kemmet + reconfirmation_instructions: + explanation: Kadarnait ar chomlec'h nevez evit cheñch ho postel. + subject: 'Mastodoñ : Kadarnait ar postel evit %{instance}' + title: Gwiriekaat ar chomlec'h postel + reset_password_instructions: + action: Cheñch ar ger-tremen + explanation: Goulennet ho peus ur ger-tremen nevez evit ho kont. + passwords: + updated_not_active: Kemmet eo bet ho ker-tremen ent reizh. + registrations: + signed_up: Donemat ! Kevreet oc'h. diff --git a/config/locales/devise.co.yml b/config/locales/devise.co.yml index 16481737f..c9511d14d 100644 --- a/config/locales/devise.co.yml +++ b/config/locales/devise.co.yml @@ -46,6 +46,18 @@ co: extra: S’ellu ùn era micca voi, ignurate stu missaghju. A chjave d’accessu ùn cambiarà micca s’è voi ùn cliccate micca u ligame. subject: 'Mastodon: Cambià a chjave d’accessu' title: Cambià a chjave + two_factor_disabled: + explanation: L'autentificazione à dui fattori per u vostru contu hè stata disattivata. A cunnessione hè avà pussibule cù l'usu solu di u vostru e-mail è di a chjave d'accessu. + subject: 'Mastodon: Autentificazione à dui fattori disattivata' + title: A2F disattivata + two_factor_enabled: + explanation: L'autentificazione à dui fattori hè stata attivata per u vostru contu. Un codice, o fiscia, generata da l'applicazione TOTP assuciata sarà dumandata per cunnettavvi. + subject: 'Mastodon: Autentificazione à dui fattori attivata' + title: A2F attivata + two_factor_recovery_codes_changed: + explanation: I codici di ricuperazione pricidenti ùn sò più validi è un novu inseme di codici hè statu creatu. + subject: 'Mastodon: Rigenerazione di i codici à dui fattori di ricuperazione' + title: Cambiamentu di i codici di ricuperazione d'A2F unlock_instructions: subject: 'Mastodon: Riapre u contu' omniauth_callbacks: diff --git a/config/locales/devise.cs.yml b/config/locales/devise.cs.yml index 94c41ed98..d1b9fc09c 100644 --- a/config/locales/devise.cs.yml +++ b/config/locales/devise.cs.yml @@ -46,6 +46,18 @@ cs: extra: Pokud jste tohle nevyžádal/a, prosím ignorujte tento e-mail. Vaše heslo nebude změněno, dokud nepřejdete na výše uvedenou adresu a nevytvoříte si nové. subject: 'Mastodon: Instrukce pro obnovení hesla' title: Obnovení hesla + two_factor_disabled: + explanation: Dvoufázové ověřování bylo pr váš účet zakázáno. Přihlašování je nyní možné pouze pomocí e-mailové adresy a hesla. + subject: 'Mastodon: Dvoufázové ověřování zakázáno' + title: 2FA zakázáno + two_factor_enabled: + explanation: Dvoufázové ověřování bylo pr váš účet povoleno. Pro přihlášení bude vyžadován token vygenerovaný spárovanou TOTP aplikací. + subject: 'Mastodon: Dvoufázové ověřování povoleno' + title: 2FA povoleno + two_factor_recovery_codes_changed: + explanation: Předchozí záložní kódy byly zrušeny a byly vygenerovány nové. + subject: 'Mastodon: Dvoufázové záložní kódy znovu vygenerovány' + title: Záložní kódy pro 2FA změněny unlock_instructions: subject: 'Mastodon: Instrukce pro odemčení účtu' omniauth_callbacks: diff --git a/config/locales/devise.de.yml b/config/locales/devise.de.yml index bd573dc3e..372090515 100644 --- a/config/locales/devise.de.yml +++ b/config/locales/devise.de.yml @@ -46,6 +46,18 @@ de: extra: Wenn du diese Anfrage nicht gestellt hast, solltest du diese E-Mail ignorieren. Dein Passwort wird sich nicht ändern solange du den obigen Link anklickst und ein neues erstellst. subject: 'Mastodon: Passwort zurücksetzen' title: Passwort zurücksetzen + two_factor_disabled: + explanation: Zwei-Faktor-Authentifizierung für dein Konto wurde deaktiviert. Login ist jetzt nur mit E-Mail-Adresse und Passwort möglich. + subject: 'Mastodon: Zwei‐Faktor‐Authentifizierung deaktiviert' + title: 2FA deaktiviert + two_factor_enabled: + explanation: Zwei-Faktor-Authentifizierung wurde für dein Konto aktiviert. Ein Token, der von der gepaarten TOTP-App generiert wird, wird für den Login benötigt. + subject: 'Mastodon: Zwei‐Faktor‐Authentifizierung aktiviert' + title: 2FA aktiviert + two_factor_recovery_codes_changed: + explanation: Die vorherigen Wiederherstellungscodes wurden ungültig gemacht und es wurden neue generiert. + subject: 'Mastodon: Zwei-Faktor-Wiederherstellungscodes neu generiert' + title: 2FA Wiederherstellungscodes geändert unlock_instructions: subject: 'Mastodon: Konto entsperren' omniauth_callbacks: diff --git a/config/locales/devise.el.yml b/config/locales/devise.el.yml index 0b5c68636..75f68c281 100644 --- a/config/locales/devise.el.yml +++ b/config/locales/devise.el.yml @@ -46,6 +46,10 @@ el: extra: Αν δεν ζήτησες εσύ αυτή την αλλαγή, παρακαλούμε αγνόησε αυτό το email. Το συνθηματικό σου δεν θα αλλάξει μέχρι να επισκεφτείς τον παραπάνω σύνδεσμο και να δημιουργήσεις ένα καινούριο. subject: 'Mastodon: Οδηγίες επαναφοράς συνθηματικού' title: Επαναφορά συνθηματικού + two_factor_disabled: + explanation: Ο έλεγχος ταυτότητας δυο παραγόντων (2FA) έχει απενεργοποιηθεί για το λογαριασμό σου. Η σύνδεση γίνεται απλά με το email και το συνθηματικό. + subject: 'Mastodon: Απενεργοποιήθηκε ο έλεγχος ταυτότητας δύο παραγόντων' + title: Απενεργοποιημένο 2FA unlock_instructions: subject: 'Mastodon: Οδηγίες ξεκλειδώματος' omniauth_callbacks: diff --git a/config/locales/devise.gl.yml b/config/locales/devise.gl.yml index 60a935a8a..0ce335576 100644 --- a/config/locales/devise.gl.yml +++ b/config/locales/devise.gl.yml @@ -46,6 +46,18 @@ gl: extra: Si non fixo esta solicitude, por favor ignore este correo. O seu contrasinal non cambiará ate que acceda a ligazón superior e cree unha nova. subject: 'Mastodon: Instruccións para restablecer o contrasinal' title: Restablecer contrasinal + two_factor_disabled: + explanation: Desactivouse o segundo factor de autenticación para túa conta. Agora xa podes conectarte utilizando só o correo-e e contrasinal. + subject: 'Mastodon: Autenticación con dobre factor desactivada' + title: 2FA desactivada + two_factor_enabled: + explanation: A autenticación con dobre factor foi activada para a túa conta. Pedirase o testemuño xerado pola aplicación TOTP emparellada. + subject: 'Mastodon: Activouse o dobre factor de autenticación' + title: 2FA activado + two_factor_recovery_codes_changed: + explanation: Os códigos de recuperación anteriores quedan anulados e os novos foron creados. + subject: 'Mastodon: Código de recuperación do dobre factor rexenerados' + title: Códigos de recuperación 2FA cambiados unlock_instructions: subject: 'Mastodon: Instruccións para desbloquear' omniauth_callbacks: diff --git a/config/locales/devise.nl.yml b/config/locales/devise.nl.yml index 51a95403f..3ab4d9f11 100644 --- a/config/locales/devise.nl.yml +++ b/config/locales/devise.nl.yml @@ -46,6 +46,18 @@ nl: extra: Wanneer jij dit niet hebt aangevraagd, mag je deze e-mail negeren. Jouw wachtwoord wordt pas gewijzigd nadat je de link hierboven hebt aangeklikt en een nieuw wachtwoord aanmaakt. subject: 'Mastodon: Wachtwoord opnieuw instellen' title: Wachtwoord opnieuw instellen + two_factor_disabled: + explanation: Tweestapsverificatie voor jouw account is uitgeschakeld. Je kunt nu alleen inloggen met een e-mailadres en wachtwoord. + subject: 'Mastodon: Tweestapsverificatie uitgeschakeld' + title: Tweestapsverificatie uitgeschakeld + two_factor_enabled: + explanation: Tweestapsverificatie voor jouw account is ingeschakeld. Om te kunnen aanmelden is een door een tweestapsverificatie-app genereerde aanmeldcode nodig. + subject: 'Mastodon: Tweestapsverificatie ingeschakeld' + title: Tweestapsverificatie ingeschakeld + two_factor_recovery_codes_changed: + explanation: De vorige herstelcodes zijn ongeldig gemaakt en nieuwe zijn aangemaakt. + subject: 'Mastodon: Tweestaps-herstelcodes zijn opnieuw aangemaakt' + title: Herstelcodes tweestapsverificatie veranderd unlock_instructions: subject: 'Mastodon: Instructies om opschorten account ongedaan te maken' omniauth_callbacks: diff --git a/config/locales/devise.oc.yml b/config/locales/devise.oc.yml index 42be33f6b..0fb259429 100644 --- a/config/locales/devise.oc.yml +++ b/config/locales/devise.oc.yml @@ -46,6 +46,18 @@ oc: extra: S’avètz pas res demandat, fasquètz pas cas a aqueste corrièl. Vòstre senhal cambiarà pas se clicatz pas lo ligam e que ne causissètz pas un novèl. subject: Mastodon : consignas per reïnicializar lo senhal title: Reïnicializacion del senhal + two_factor_disabled: + explanation: L’autentificacion dos factors per vòstre compte es estada desactivada. La connexion es ara possibla solament amb l’adreça electronica e lo senhal. + subject: 'Mastodon : autentificacion dos factors desactivada' + title: 2FA desactivat + two_factor_enabled: + explanation: L’autentificacion dos factors es estada activada per vòstre compte. La connexion demandarà un geton generat per l’aplicacion TOTP associada. + subject: 'Mastodon : autentificacion dos factor activada' + title: 2FA activat + two_factor_recovery_codes_changed: + explanation: Los còdis de recuperacion precedents son ara invalids e de nòus son estats generats. + subject: 'Mastodon : còdis de recuperacion dos factors regenerats' + title: Còdis 2FA de recuperacion cambiats unlock_instructions: subject: Mastodon : consignas de desblocatge omniauth_callbacks: diff --git a/config/locales/devise.pt-PT.yml b/config/locales/devise.pt-PT.yml new file mode 100644 index 000000000..7d3f8fc55 --- /dev/null +++ b/config/locales/devise.pt-PT.yml @@ -0,0 +1,83 @@ +--- +pt-PT: + devise: + confirmations: + confirmed: O teu endereço de e-mail foi confirmado com sucesso. + send_instructions: Vais receber um email com as instruções para confirmar o teu endereço de email dentro de alguns minutos. Por favor, verifica a caixa de spam se não recebeste o e-mail. + send_paranoid_instructions: Se o teu endereço de email já existir na nossa base de dados, vais receber um email com as instruções de confirmação dentro de alguns minutos. Por favor, verifica a caixa de spam se não recebeste o e-mail. + failure: + already_authenticated: A tua sessão já está aberta. + inactive: A tua conta ainda não está ativada. + invalid: "%{authentication_keys} ou palavra-passe inválida." + last_attempt: Tens mais uma tentativa antes de a tua conta ficar bloqueada. + locked: A tua conta está bloqueada. + not_found_in_database: "%{authentication_keys} ou palavra-passe inválida." + 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. + unconfirmed: Tens de confirmar o teu endereço de email antes de continuar. + mailer: + confirmation_instructions: + action: Verificar o endereço de e-mail + action_with_app: Confirmar e regressar a %{app} + explanation: Criaste uma conta em %{host} com este endereço de e-mail. Estás a um clique de activá-la. Se não foste tu que fizeste este registo, por favor ignora esta mensagem. + extra_html: Por favor lê as regras da instância e os nossos termos de serviço. + subject: 'Mastodon: Instruções de confirmação %{instance}' + title: Verificar o endereço de e-mail + email_changed: + explanation: 'O e-mail associado à tua conta será alterado para:' + extra: Se não alteraste o teu e-mail é possível que alguém tenha conseguido aceder à tua conta. Por favor muda a tua palavra-passe imediatamente ou entra em contato com um administrador do servidor se ficaste sem acesso à tua conta. + subject: 'Mastodon: Email alterado' + title: Novo endereço de e-mail + password_change: + explanation: A palavra-passe da tua conta foi alterada. + extra: Se não alteraste a tua palavra-passe, é possível que alguém tenha conseguido aceder à tua conta. Por favor muda a tua palavra-passe imediatamente ou entra em contato com um administrador do servidor se ficaste sem acesso à tua conta. + subject: 'Mastodon: Nova palavra-passe' + title: Palavra-passe alterada + reconfirmation_instructions: + explanation: Confirma o teu novo endereço para alterar o e-mail. + extra: Se esta mudança não foi iniciada por ti, por favor ignora este e-mail. O endereço de e-mail para a tua conta do Mastodon não irá mudar enquanto não acederes ao link acima. + subject: 'Mastodon: Confirmação de e-mail %{instance}' + title: Validar o endereço de e-mail + reset_password_instructions: + action: Alterar palavra-passe + explanation: Pediste a alteração da palavra-passe da tua conta. + extra: Se não fizeste este pedido, por favor ignora este e-mail. A tua palavra-passe não irá mudar se não acederes ao link acima e criares uma nova. + subject: 'Mastodon: Instruções para alterar a palavra-passe' + title: Solicitar nova palavra-passe + unlock_instructions: + subject: 'Mastodon: Instruções para desbloquear a tua conta' + omniauth_callbacks: + failure: Não foi possível autenticar %{kind} porque "%{reason}". + success: Autenticado com sucesso na conta %{kind}. + passwords: + no_token: Não pode aceder a esta página se não vier através do link enviado por email para alteração da sua palavra-passe. Se usaste esse link para chegar aqui, por favor verifica que o endereço URL actual é o mesmo do que foi enviado no email. + send_instructions: Vais receber um email com instruções para alterar a palavra-passe dentro de algns minutos. + send_paranoid_instructions: Se o teu endereço de email existe na nossa base de dados, vais receber um link para recuperar a palavra-passe dentro de alguns minutos. + updated: A tua palavra-passe foi alterada. Estás agora autenticado na tua conta. + updated_not_active: A tua palavra-passe foi alterada. + registrations: + destroyed: Adeus! A tua conta foi cancelada. Esperamos ver-te em breve. + signed_up: Bem-vindo! A tua conta foi registada com sucesso. + signed_up_but_inactive: A tua conta foi registada. No entanto ainda não está activa. + signed_up_but_locked: A tua conta foi registada. No entanto está bloqueada. + signed_up_but_unconfirmed: Uma mensagem com um link de confirmação foi enviada para o teu email. Por favor segue esse link para activar a tua conta. + update_needs_confirmation: Alteraste o teu endereço de email ou palavra-passe, mas é necessário confirmar essa alteração. Por favor vai ao teu email e segue link que te enviámos. + updated: A tua conta foi actualizada com sucesso. + sessions: + already_signed_out: Sessão encerrada. + signed_in: Sessão iniciada. + signed_out: Sessão encerrada. + unlocks: + send_instructions: Vais receber um email com instruções para desbloquear a tua conta dentro de alguns minutos. + send_paranoid_instructions: Se a tua conta existe, vais receber um email com instruções a detalhar como a desbloquear dentro de alguns minutos. + unlocked: A sua conta foi desbloqueada. Por favor inica uma nova sessão para continuar. + errors: + messages: + already_confirmed: já confirmado, por favor tente iniciar sessão + confirmation_period_expired: tem de ser confirmado durante %{period}, por favor tenta outra vez + expired: expirou, por favor tente outra vez + not_found: não encontrado + not_locked: não estava bloqueada + not_saved: + one: '1 erro impediu este %{resource} de ser guardado:' + other: "%{count} erros impediram este %{resource} de ser guardado:" diff --git a/config/locales/devise.sk.yml b/config/locales/devise.sk.yml index 4837390db..759d4874b 100644 --- a/config/locales/devise.sk.yml +++ b/config/locales/devise.sk.yml @@ -37,7 +37,7 @@ sk: reconfirmation_instructions: explanation: Potvrď novú emailovú adresu na ktorú chceš zmeniť svoj email. extra: Pokiaľ si túto akciu nevyžiadal/a, prosím ignoruj tento email. Emailová adresa pre tvoj Mastodon účet totiž nebude zmenená pokiaľ nepostúpiš na adresu uvedenú vyššie. - subject: 'Mastodon: Potvrďenie emailu pre %{instance}' + subject: 'Mastodon: Potvrď email pre %{instance}' title: Over emailovú adresu reset_password_instructions: action: Zmeň svoje heslo diff --git a/config/locales/el.yml b/config/locales/el.yml index acc97d37e..03974fa17 100644 --- a/config/locales/el.yml +++ b/config/locales/el.yml @@ -17,9 +17,6 @@ el: contact_unavailable: Μ/Δ discover_users: Ανακάλυψε χρήστες documentation: Τεκμηρίωση - extended_description_html: | -

Ένα καλό σημείο για κανόνες

-

Η αναλυτική περιγραφή δεν έχει ακόμα οριστεί

federation_hint_html: Με ένα λογαριασμό στο %{instance} θα μπορείς να ακολουθείς ανθρώπους σε οποιοδήποτε κόμβο στο Mastodon αλλά και αλλού. generic_description: "%{domain} είναι ένας εξυπηρετητής στο δίκτυο" get_apps: Δοκίμασε μια εφαρμογή κινητού @@ -225,10 +222,12 @@ el: deleted_status: "(διαγραμμένη δημοσίευση)" title: Αρχείο ελέγχου custom_emojis: + assign_category: Κατηγορία by_domain: Τομέας copied_msg: Επιτυχής δημιουργία τοπικού αντίγραφου του emoji copy: Αντιγραφή copy_failed_msg: Αδυναμία δημιουργίας τοπικού αντίγραφου αυτού του emoji + create_new_category: Νέα κατηγορία created_msg: Επιτυχής δημιουργία του emoji! delete: Διαγραφή destroyed_msg: Επιτυχής καταστροφή του emojo! @@ -245,6 +244,7 @@ el: shortcode: Σύντομος κωδικός shortcode_hint: Τουλάχιστον 2 χαρακτήρες, μόνο αλφαριθμητικοί και κάτω παύλες title: Προσαρμοσμένα emoji + uncategorized: Χωρίς κατηγορία unlisted: Μη καταχωρημένα update_failed_msg: Αδυναμία ενημέρωσης του emoji updated_msg: Επιτυχής ενημέρωση του emoji! @@ -424,6 +424,9 @@ el: custom_css: desc_html: Τροποποίηση της εμφάνισης μέσω CSS που φορτώνεται σε κάθε σελίδα title: Προσαρμοσμένο CSS + default_noindex: + desc_html: Επηρεάζει όσους χρήστες δεν έχουν αλλάξει αυτή τη ρύθμιση + title: Εξαίρεση χρηστών από τις μηχανές αναζήτησης domain_blocks: all: Για όλους disabled: Για κανέναν @@ -515,6 +518,10 @@ el: context: Συνάφεια directory: Στον κατάλογο in_directory: "%{count} στον κατάλογο" + last_active: Τελευταία δραστηριότητα + most_popular: Δημοφιλέστερες + most_recent: Πιο πρόσφατες + name: Ταμπέλα review: Κατάσταση έγκρισης reviewed: Εγκεκριμένες title: Ταμπέλες @@ -626,7 +633,9 @@ el: x_months: "%{count}μ" x_seconds: "%{count}δ" deletes: + challenge_not_passed: Τα στοιχεία δεν ήταν σωστά confirm_password: Γράψε το τρέχον συνθηματικό σου για να πιστοποιήσεις την ταυτότητά σου + confirm_username: Γράψε το όνομα χρήστη σου για επιβεβαίωση proceed: Διαγραφή λογαριασμού success_msg: Ο λογαριασμός σου διαγράφηκε με επιτυχία warning: @@ -644,23 +653,6 @@ el: directory: Κατάλογος λογαριασμών explanation: Βρες χρήστες βάσει των ενδιαφερόντων τους explore_mastodon: Εξερεύνησε το %{title} - domain_blocks: - blocked_domains: Λίστα περιορισμένων και αποκλεισμένων τομέων - description: Αυτή είναι η λίστα των διακομιστών που ο %{instance} περιορίζει ή απορρίπτει τη σύνδεση μαζί τους. - domain: Τομέας - media_block: Αποκλεισμός πολυμέσων - no_domain_blocks: "(Χωρίς αποκλεισμό πολυμέσων)" - severity: Αυστηρότητα - severity_legend: - media_block: Τα αρχεία πολυμέσων από αυτό τον διακομιστή δεν ανακτώνται, δεν αποθηκεύονται και δεν προβάλλονται στο χρήστη. - silence: Οι λογαριασμοί από διακομιστές που έχουν αποσιωπηθεί μπορούν να βρεθούν, να ακολουθηθούν και να δεχτούν αλληλεπιδράσεις αλλά τα τουτ τους δε θα εμφανίζονται στις δημόσιες ροές και οι ειδοποιήσεις τους δε θα παραδίδονται στους τοπικούς χρήστες που δεν τους ακολουθούν. - suspension: Κανένα περιεχόμενο ανασταλμένων διακομιστών δεν αποθηκεύεται και δεν εμφανίζεται, ούτε αποστέλλεται σε αυτούς. Οι ενέργειες από τους ανασταλμένους διακομιστές αγνοούνται. - suspension_disclaimer: Οι ανασταλμενοι διακομιστές μπορεί περιστασιακά να ανακτήσουν δημόσιο περιεχόμενο από αυτό τον διακομιστή. - title: Αυστηρότητες - show_rationale: Εμφάνιση αιτιολογίας - silence: Αποσιώπηση - suspension: Αναστολή - title: "%{instance} Λίστα αποκλεισμένων κόμβων" domain_validator: invalid_domain: δεν είναι έγκυρο όνομα τομέα errors: @@ -726,6 +718,7 @@ el: all: Όλα changes_saved_msg: Οι αλλαγές αποθηκεύτηκαν! copy: Αντιγραφή + no_batch_actions_available: Δεν υπάρχουν ομαδικές ενέργειες σε αυτή τη σελίδα order_by: Ταξινόμηση κατά save_changes: Αποθήκευσε τις αλλαγές validation_errors: @@ -797,9 +790,6 @@ el: too_many: Δεν γίνεται να προσθέσεις περισσότερα από 4 αρχεία migrations: acct: ΌνομαΧρήστη@Τομέας του νέου λογαριασμού - currently_redirecting: 'Το προφίλ σου έχει ρυθμιστεί να ανακατευθύνει στο:' - proceed: Αποθήκευση - updated_msg: Οι ρυθμίσεις μετακόμισης του λογαριασμού σου ενημερώθηκαν! moderation: title: Συντονισμός notification_mailer: diff --git a/config/locales/eo.yml b/config/locales/eo.yml index b5b8656a4..620016830 100644 --- a/config/locales/eo.yml +++ b/config/locales/eo.yml @@ -17,9 +17,6 @@ eo: contact_unavailable: Ne disponebla discover_users: Malkovri uzantojn documentation: Dokumentado - extended_description_html: | -

Bona loko por reguloj

-

La detala priskribo ne estis elektita.

federation_hint_html: Per konto ĉe %{instance}, vi povos sekvi homojn ĉe iu ajn Mastodon nodo kaj preter. generic_description: "%{domain} estas unu servilo en la reto" get_apps: Provu telefonan aplikaĵon @@ -604,10 +601,6 @@ eo: directory: Profilujo explanation: Malkovru uzantojn per iliaj interesoj explore_mastodon: Esplori %{title} - domain_blocks: - domain: Domajno - no_domain_blocks: "(Nenio domajna blokado)" - silence: Silenta domain_validator: invalid_domain: ne estas valida domajna nomo errors: @@ -745,9 +738,6 @@ eo: too_many: Aldoni pli ol 4 dosierojn ne eblas migrations: acct: uzantnomo@domajno de la nova konto - currently_redirecting: 'Via profilo alidirektos al:' - proceed: Konservi - updated_msg: Via agordo pri konta migrado estis sukcese ĝisdatigita! moderation: title: Kontrolado notification_mailer: diff --git a/config/locales/es.yml b/config/locales/es.yml index 892d82e9c..3703f92ff 100644 --- a/config/locales/es.yml +++ b/config/locales/es.yml @@ -17,9 +17,6 @@ es: contact_unavailable: N/A discover_users: Descubrir usuarios documentation: Documentación - extended_description_html: | -

Un buen lugar para las reglas

-

La descripción extendida no se ha colocado aún.

federation_hint_html: Con una cuenta en %{instance} usted podrá seguir a las personas en cualquier servidor de Mastodon y más allá. generic_description: "%{domain} es un servidor en la red" get_apps: Probar una aplicación móvil @@ -620,8 +617,6 @@ es: directory: Directorio de perfiles explanation: Descubre usuarios según sus intereses explore_mastodon: Explorar %{title} - domain_blocks: - domain: Dominio domain_validator: invalid_domain: no es un nombre de dominio válido errors: @@ -757,9 +752,6 @@ es: too_many: No se pueden adjuntar más de 4 archivos migrations: acct: username@domain de la nueva cuenta - currently_redirecting: 'Tu perfil está redireccionado a:' - proceed: Guardar - updated_msg: "¡La configuración de migración de tu cuenta ha sido actualizada con éxito!" moderation: title: Moderación notification_mailer: diff --git a/config/locales/et.yml b/config/locales/et.yml index 7d0771983..0a66d49f4 100644 --- a/config/locales/et.yml +++ b/config/locales/et.yml @@ -17,9 +17,6 @@ et: contact_unavailable: Pole saadaval discover_users: Avasta kasutajaid documentation: Dokumentatsioon - extended_description_html: | -

Hea koht reeglite jaoks

-

Laiendatud kirjeldus pole veel üles seadistatud.

federation_hint_html: Kui Teil on kasutaja %{instance}-is, saate Te jälgida inimesi üks kõik millisel Mastodoni serveril ja kaugemalgi. generic_description: "%{domain} on ainult üks server terves võrgus" get_apps: Proovi mobiilirakendusi @@ -724,9 +721,6 @@ et: too_many: Ei saa lisada rohkem, kui 4 faili migrations: acct: uue konto kasutajanimi@domeen - currently_redirecting: 'Teie profiil on sätestatud suunama ümber:' - proceed: Salvesta - updated_msg: Teie konto migreerumissätete uuendamine õnnestus! moderation: title: Moderatsioon notification_mailer: diff --git a/config/locales/eu.yml b/config/locales/eu.yml index 2a4d61296..a3061b99e 100644 --- a/config/locales/eu.yml +++ b/config/locales/eu.yml @@ -17,9 +17,6 @@ eu: contact_unavailable: E/E discover_users: Aurkitu erabiltzaileak documentation: Dokumentazioa - extended_description_html: | -

Arauentzako toki egoki bat

-

Azalpen luzea ez da ezarri oraindik.

federation_hint_html: "%{instance} instantzian kontu bat izanda edozein Mastodon zerbitzariko jendea jarraitu ahal izango duzu, eta harago ere." generic_description: "%{domain} sareko zerbitzari bat da" get_apps: Probatu mugikorrerako aplikazio bat @@ -618,10 +615,6 @@ eu: directory: Profilen direktorioa explanation: Deskubritu erabiltzaileak interesen arabera explore_mastodon: Esploratu %{title} - domain_blocks: - domain: Domeinua - severity: Larritasuna - silence: Isilarazi domain_validator: invalid_domain: ez da domeinu izen baliogarria errors: @@ -757,9 +750,6 @@ eu: too_many: Ezin dira 4 fitxategi baino gehiago erantsi migrations: acct: Kontu berriaren erabiltzaile@domeinua - currently_redirecting: 'Zure profila hona birbideratzeko ezarri da:' - proceed: Gorde - updated_msg: Kontuaren migrazio-ezarpenak ongi eguneratu dira! moderation: title: Moderazioa notification_mailer: diff --git a/config/locales/fa.yml b/config/locales/fa.yml index 7f316c784..739334164 100644 --- a/config/locales/fa.yml +++ b/config/locales/fa.yml @@ -17,9 +17,6 @@ fa: contact_unavailable: موجود نیست discover_users: یافتن کاربران documentation: مستندات - extended_description_html: | -

جای خوبی برای قانون‌ها

-

توضیحات تکمیلی نوشته نشده است.

federation_hint_html: با داشتن حساب روی %{instance} می‌توانید کاربران همهٔ سرورهای دیگر ماستدون (و سایر شبکه‌های سازگار با آن) را پی بگیرید. generic_description: "%{domain} یک سرور روی شبکه است" get_apps: یک اپ موبایل را امتحان کنید @@ -627,8 +624,6 @@ fa: directory: فهرست گزیدهٔ کاربران explanation: کاربران این سرور را بر اساس علاقه‌مندی‌هایشان پیدا کنید explore_mastodon: گشت و گذار در %{title} - domain_blocks: - blocked_domains: فهرست دامین‌های محدود یا مسدود errors: '400': The request you submitted was invalid or malformed. '403': شما اجازهٔ دیدن این صفحه را ندارید. @@ -761,9 +756,6 @@ fa: too_many: نمی‌توان بیشتر از ۴ تصویر بارگذاری کرد migrations: acct: username@domain حساب تازه - currently_redirecting: 'نمایهٔ شما منتقل می‌شود به:' - proceed: ذخیره - updated_msg: تنظیمات نقل مکان حساب شما با موفقیت به‌روز شد! moderation: title: مدیریت کاربران notification_mailer: diff --git a/config/locales/fi.yml b/config/locales/fi.yml index 3d8fdce3a..2f8fd3497 100644 --- a/config/locales/fi.yml +++ b/config/locales/fi.yml @@ -10,9 +10,6 @@ fi: contact_missing: Ei asetettu contact_unavailable: Ei saatavilla documentation: Dokumentaatio - extended_description_html: | -

Hyvä paikka säännöille

-

Pidempää kuvausta ei ole vielä laadittu.

generic_description: "%{domain} on yksi verkostoon kuuluvista palvelimista" hosted_on: Mastodon palvelimella %{domain} learn_more: Lisätietoja @@ -468,9 +465,6 @@ fi: too_many: Tiedostoja voi liittää enintään 4 migrations: acct: uuden tilin käyttäjätunnus@verkkotunnus - currently_redirecting: 'Profiiliisi on asetettu uudelleenohjaus:' - proceed: Tallenna - updated_msg: Tilinsiirtoasetusten päivitys onnistui! moderation: title: Moderointi notification_mailer: diff --git a/config/locales/fr.yml b/config/locales/fr.yml index 15d6359b4..be146d997 100644 --- a/config/locales/fr.yml +++ b/config/locales/fr.yml @@ -17,9 +17,6 @@ fr: contact_unavailable: Non disponible discover_users: Découvrez des utilisateur·rice·s documentation: Documentation - extended_description_html: | -

Un bon endroit pour les règles

-

La description étendue n’a pas été remplie.

federation_hint_html: Avec un compte sur %{instance}, vous pourrez suivre les gens sur n’importe quel serveur Mastodon et au-delà. generic_description: "%{domain} est seulement un serveur du réseau" get_apps: Essayez une application mobile @@ -637,23 +634,6 @@ fr: directory: Annuaire des profils explanation: Découvrir des utilisateurs en se basant sur leurs centres d’intérêt explore_mastodon: Explorer %{title} - domain_blocks: - blocked_domains: Liste des domaines limités et bloqués - description: Ceci est la liste des serveurs envers qui %{instance} limite ou rejette la fédération. - domain: Domaine - media_block: Bloqueur de média - no_domain_blocks: "(Aucun bloqueur de domaine)" - severity: Sévérité - severity_legend: - media_block: Les fichiers de média provenant du serveur ne sont ni récupérés, ni stockés, ni affichés à l’utilisateur·rice. - silence: Les comptes des serveurs masqués peuvent être trouvés, suivis et interagis avec, mais leurs Toots n'apparaîtront pas dans les fil d'actualité publiques, et les notifications de ceux-ci ne parviendront pas aux utilisateurs locaux qui ne les suivent pas. - suspension: Aucun contenu des serveurs suspendus n'est stocké ou affiché, ni ne leur est communiqué. Les interactions des serveurs suspendus sont ignorées. - suspension_disclaimer: Les serveurs suspendus peuvent parfois récupérer du contenu public de ce serveur. - title: Séverités - show_rationale: Voir le raisonnement - silence: Masquer - suspension: Suspendre - title: "%{instance} Liste des instances bloquées" domain_validator: invalid_domain: n’est pas un nom de domaine valide errors: @@ -790,9 +770,6 @@ fr: too_many: Impossible de joindre plus de 4 fichiers migrations: acct: profil@domaine du nouveau compte - currently_redirecting: 'Votre profil va être redirigé vers :' - proceed: Enregistrer - updated_msg: Les paramètres de votre migration de compte ont été mis à jour avec succès ! moderation: title: Modération notification_mailer: diff --git a/config/locales/gl.yml b/config/locales/gl.yml index 20f535ad5..3924eeedc 100644 --- a/config/locales/gl.yml +++ b/config/locales/gl.yml @@ -17,9 +17,6 @@ gl: contact_unavailable: N/A discover_users: Descubra usuarias documentation: Documentación - extended_description_html: | -

Un bo lugar para regras

-

A descrición extendida aínda non se proporcionou.

federation_hint_html: Con unha conta en %{instance} poderá seguir a outras persoas en calquera dos servidores Mastodon e incluso máis. generic_description: "%{domain} é un servidor na rede" get_apps: Probe cunha app móbil @@ -38,6 +35,13 @@ gl: status_count_before: Que publicaron tagline: Siga as amizades e faga outras novas terms: Termos do servizo + unavailable_content: Contido non dispoñible + unavailable_content_description: + reason: 'Razón:' + rejecting_media: Os ficheiros de medios de este servidor non se procesarán e non se mostrarán miniaturas, precisando solicitarse manualmente ao outro servidor. + silenced: As publicacións desde este servidor non se mostrarán en ningún lugar excepto no Inicio se segues ao autor. + suspended: Non poderás seguir a ninguén desde este servidor, e non se procesarán nin se gardarán datos que procedan del, e non se intercambiarán datos. + unavailable_content_html: Normalmente Mastodon permíteche ver contidos de outros servidores do fediverso e interactuar coas súas usuarias. Estas son as excepcións que se estableceron en este servidor particular. user_count_after: one: usuaria other: usuarias @@ -427,6 +431,9 @@ gl: custom_css: desc_html: Modificar o aspecto con CSS cargado en cada páxina title: CSS persoalizado + default_noindex: + desc_html: Aféctalle a todas as usuarias que non cambiaron os axustes elas mesmas + title: Por omisión exclúe as usuarias do indexado por servidores de busca domain_blocks: all: Para todas disabled: Para ninguén @@ -518,6 +525,10 @@ gl: context: Contexto directory: No directorio in_directory: "%{count} no directorio" + last_active: Úlimo activo + most_popular: Máis popular + most_recent: Máis recente + name: Etiqueta review: Estado de revisión reviewed: Revisado title: Etiquetas @@ -543,6 +554,12 @@ gl: new_trending_tag: body: 'A etiqueta #%{name} é tendencia hoxe, pero non foi previamente revisada. Non se mostrará publicamente a menos que vostede o permita, ou garde o formulario para facer que non se lle consulte de novo.' subject: Unha nova etiqueta que revisar en %{instance} (#%{name}) + aliases: + add_new: Crear alcume + created_msg: Creou un novo alcume correctamente. Pode iniciar o movemento desde a conta antiga. + deleted_msg: Eliminou correctamente o alias. Xa non será posible mover desde esa conta a esta. + hint_html: Se quere mudarse desde outra conta a esta nova, aquí pode crear un alcume, que é requerido antes de poder proceder a mover os seguidores da conta antiga a esta nova. Esta acción por si mesma é inocua e reversible. A migración da conta iníciase desde a conta antiga. + remove: Desligar alcume appearance: advanced_web_interface: Interface web avanzada advanced_web_interface_hint: Se quere utilizar todo o ancho da súa pantalla, a interface web avanzada permítelle configurar diferentes columnas para ver tanta información como desexe. Inicio, notificacións, liña temporal federada, calquera número de listas e etiquetas. @@ -602,6 +619,7 @@ gl: confirming: Agardando a confirmación do correo enviado. functional: A súa conta está totalmente operativa. pending: A súa aplicación está pendente de revisión. Poderíanos levar algún tempo. Recibirá un correo se a aplicación está aprobada. + redirecting_to: A túa conta está inactiva porque está redirixida a %{acct}. trouble_logging_in: Problemas para conectar? authorize_follow: already_following: Xa está a seguir esta conta @@ -614,6 +632,11 @@ gl: return: Mostrar o perfil da usuaria web: Ir a web title: Seguir %{acct} + challenge: + confirm: Continuar + hint_html: "Nota: Non che pediremos o contrasinal na seguinte hora." + invalid_password: Contrasinal incorrecto + prompt: Confirma o contrasinal para continuar datetime: distance_in_words: about_x_hours: "%{count}h" @@ -629,7 +652,9 @@ gl: x_months: "%{count}mes" x_seconds: "%{count}s" deletes: + challenge_not_passed: A información introducida non é correcta confirm_password: Introduza o seu contrasinal para verificar a súa identidade + confirm_username: Introduce o nome de usuaria para confirmar o procedemento proceed: Eliminar conta success_msg: A súa conta eliminouse correctamente warning: @@ -647,23 +672,6 @@ gl: directory: Directorio de perfil explanation: Descubra usuarias según o seu interese explore_mastodon: Explorar %{title} - domain_blocks: - blocked_domains: Lista de dominios limitados e bloqueados - description: Esta é a lista dos servidores cos que %{instance} limita ou rexeita federar. - domain: Dominio - media_block: Bloqueo de medios - no_domain_blocks: "(Sen bloqueo de medios)" - severity: Rigurosidade - severity_legend: - media_block: Os ficheiros de medios procedentes do servidor non se obterán, gardarán nin mostrarán as usuarias. - silence: As contas de servidores silenciados pódense atopar, seguir e interactuar con elas, pero os seus toots non aparecerán na liña temporal púbica, as notificacións procedentes deles non chegarán as usuarias que non as están a seguir. - suspension: Non se mostra nin garda ningún contido de servidores suspendidos, tampouco se lles envía contido. As interaccións con servidores suspendidos son ignoradas. - suspension_disclaimer: Os servidores suspendidos poderían obter ocasionalmente contido público de este servidor. - title: Rigurosidades - show_rationale: Mostrar razón - silence: Silenciar - suspension: Suspensión - title: "%{instance} Lista de instancias bloqueadas" domain_validator: invalid_domain: non é un nome de dominio válido errors: @@ -801,9 +809,31 @@ gl: too_many: Non pode anexar máis de 4 ficheiros migrations: acct: nomeusuaria@dominio da nova conta - currently_redirecting: 'O seu perfil está listo para redirixir a:' - proceed: Gardar - updated_msg: O axuste de migración da conta actualizouse correctamente! + cancel: Cancelar a redirección + cancel_explanation: Ao cancelar a redirección reactivarás a conta actual, pero non poderás traer de volta os seguidores que se moveron a esa conta. + cancelled_msg: Cancelouse a redirección. + errors: + already_moved: é a mesma conta a que xa te moveches + missing_also_known_as: non está referenciando hacia esta conta + move_to_self: non pode ser a conta actual + not_found: non se atopou + on_cooldown: Estas no período de calma + followers_count: Seguidoras no momento da migración + incoming_migrations: Movendo desde unha conta diferente + incoming_migrations_html: Para migrar doutra conta cara esta, primeiro debes crear un alias da conta. + moved_msg: A túa conta está redirixindo agora a %{acct} e os teus seguidores movéronse alí. + not_redirecting: Neste momento a túa conta non está redirixindo cara a ningunha outra. + on_cooldown: Migraches recentemente a conta. Esta función estará dispoñible de novo en %{count} días. + past_migrations: Migracións pasadas + proceed_with_move: Mover seguidoras + redirecting_to: A conta está redirixindo cara a %{acct}. + warning: + backreference_required: Tes que configurar primeiro a nova conta para referenciar hacia esta + before: 'Antes de seguir, por favor lé estas notas con atención:' + cooldown: Tras a migración existe un período de calma durante o cal non poderás voltar a migrar de novo + disabled_account: Tras o cambio a túa conta actual non será totalmente usable, pero terás acceso a exportar os datos e tamén a reactivación. + followers: Esta acción moverá todas as túas seguidoras desde a conta actual a nova conta + other_data: Non se moverán outros datos de xeito automático moderation: title: Moderación notification_mailer: @@ -948,6 +978,7 @@ gl: settings: account: Conta account_settings: Axustes da conta + aliases: Alcumes da conta appearance: Aparencia authorized_apps: Apps autorizadas back: Voltar a Mastodon diff --git a/config/locales/he.yml b/config/locales/he.yml index 62c04a8e8..f7b121777 100644 --- a/config/locales/he.yml +++ b/config/locales/he.yml @@ -9,9 +9,6 @@ he: contact_missing: ללא הגדרה contact_unavailable: לא רלוונטי/חסר documentation: תיעוד - extended_description_html: | -

מקום טוב לכללים

-

התיאור המורחב טרם הוגדר.

generic_description: "%{domain} הוא שרת אחד בתוך הרשת" hosted_on: מסטודון שיושב בכתובת %{domain} learn_more: מידע נוסף diff --git a/config/locales/hu.yml b/config/locales/hu.yml index 5d9097d09..9670079d6 100644 --- a/config/locales/hu.yml +++ b/config/locales/hu.yml @@ -17,9 +17,6 @@ hu: contact_unavailable: N/A discover_users: Találj meg másokat documentation: Dokumentáció - extended_description_html: | -

Ez itt a szabályzat helye

-

Még nem állítottál be bővebb leírást.

federation_hint_html: Egy %{instance} fiókkal bármely más Mastodon szerveren vagy a föderációban lévő felhasználót követni tudsz. generic_description: "%{domain} csak egy a számtalan szerver közül a föderációban" get_apps: Próbálj ki egy mobil appot @@ -752,9 +749,6 @@ hu: too_many: Maximum négy fájlt csatolhatsz a tülkhöz migrations: acct: Az új fiók felhasznalonev@domain formátumban - currently_redirecting: 'A profilod az alábbi fiókra van átirányítva:' - proceed: Mentés - updated_msg: Fiókod átirányítási beállításait sikeresen mentettük! moderation: title: Moderáció notification_mailer: diff --git a/config/locales/id.yml b/config/locales/id.yml index 81a8ffd1f..bd47d05f8 100644 --- a/config/locales/id.yml +++ b/config/locales/id.yml @@ -10,9 +10,6 @@ id: contact_missing: Belum diset contact_unavailable: Tidak Tersedia documentation: Dokumentasi - extended_description_html: | -

Tempat yang baik untuk peraturan

-

Deskripsi lainnya belum diset.

generic_description: "%{domain} adalah satu server dalam jaringan" hosted_on: Mastodon dihosting di %{domain} learn_more: Pelajari selengkapnya diff --git a/config/locales/it.yml b/config/locales/it.yml index 7b3eede09..968160910 100644 --- a/config/locales/it.yml +++ b/config/locales/it.yml @@ -17,9 +17,6 @@ it: contact_unavailable: N/D discover_users: Scopri utenti documentation: Documentazione - extended_description_html: | -

Un buon posto per le regole

-

La descrizione estesa non è ancora stata preparata.

federation_hint_html: Con un account su %{instance} sarai in grado di seguire persone su qualsiasi server Mastodon e oltre. generic_description: "%{domain} è un server nella rete" get_apps: Prova un'app per smartphone @@ -624,23 +621,6 @@ it: directory: Directory dei profili explanation: Scopri utenti in base ai loro interessi explore_mastodon: Esplora %{title} - domain_blocks: - blocked_domains: Elenco dei domini limitati e bloccati - description: Questo è l'elenco dei server con cui %{instance} limita o rifiuta la federazione. - domain: Dominio - media_block: Blocco dei media - no_domain_blocks: "(Nessun blocco di dominio)" - severity: Gravità - severity_legend: - media_block: I file multimediali provenienti dal server non sono recuperati, memorizzati o visualizzati all'utente. - silence: Gli account di server silenziati possono essere trovati e seguiti, e gli utenti possono interagire con essi, ma i loro toot non appariranno nelle timeline pubbliche e le relative notifiche non raggiungeranno gli utenti locali che non li seguono. - suspension: Nessun contenuto dai server sospesi è memorizzato o visualizzato, e nessun contenuto gli viene inviato. Le interazioni dai server sospesi sono ignorate. - suspension_disclaimer: I server sospesi possono talvolta recuperare contenuti pubblici da questo server. - title: Gravità - show_rationale: Mostra motivazione - silence: Silenzia - suspension: Sospensione - title: "%{instance} Elenco delle istanze bloccate" domain_validator: invalid_domain: non è un nome di dominio valido errors: @@ -777,9 +757,6 @@ it: too_many: Impossibile allegare più di 4 file migrations: acct: utente@dominio del nuovo account - currently_redirecting: 'Il tuo profilo sarà ridirezionato a:' - proceed: Salva - updated_msg: L'impostazione per la migrazione dell'account è sta aggiornata! moderation: title: Moderazione notification_mailer: diff --git a/config/locales/ja.yml b/config/locales/ja.yml index cfaee9a38..1c63a706f 100644 --- a/config/locales/ja.yml +++ b/config/locales/ja.yml @@ -17,9 +17,6 @@ ja: contact_unavailable: N/A discover_users: ユーザーを見つける documentation: ドキュメント - extended_description_html: | -

ルールを書くのに適した場所

-

詳細説明が設定されていません。

federation_hint_html: "%{instance} のアカウントひとつでどんなMastodon互換サーバーのユーザーでもフォローできるでしょう。" generic_description: "%{domain} は、Mastodon サーバーの一つです" get_apps: モバイルアプリを試す @@ -623,23 +620,6 @@ ja: directory: ディレクトリ explanation: 関心を軸にユーザーを発見しよう explore_mastodon: "%{title}を探索" - domain_blocks: - blocked_domains: ドメインブロックリスト - description: "%{instance} が連合を制限または拒否しているサーバーのリストです。" - domain: ドメイン - media_block: メディアを拒否 - no_domain_blocks: "(ドメインブロックなし)" - severity: 重大性 - severity_legend: - media_block: サーバーから送信されるメディアファイルは取得も保存もされず、またユーザーには表示されません。 - silence: サイレンスされたサーバーのアカウントは検索やフォロー、交流することができますが、トゥートは公開タイムラインに表示されません。またフォローしていないユーザーには通知が届きません。 - suspension: 停止されたサーバーからのコンテンツは保存も表示もされず、また送信もされません。停止されたサーバーからの交流は拒否されます。 - suspension_disclaimer: 停止されたサーバーでもこのサーバーから公開コンテンツを取得することがあります。 - title: 重大性 - show_rationale: コメントを表示 - silence: サイレンス - suspension: 停止 - title: "%{instance} のドメインブロックリスト" domain_validator: invalid_domain: は無効なドメイン名です errors: @@ -774,9 +754,6 @@ ja: too_many: 追加できるファイルは4つまでです migrations: acct: 引っ越し先の ユーザー名@ドメイン - currently_redirecting: 'あなたのプロフィールは引っ越し先が設定されています:' - proceed: 保存 - updated_msg: アカウントの引っ越し設定を更新しました! moderation: title: モデレーション notification_mailer: diff --git a/config/locales/ka.yml b/config/locales/ka.yml index 93cc8ec5a..c921fa56f 100644 --- a/config/locales/ka.yml +++ b/config/locales/ka.yml @@ -11,9 +11,6 @@ ka: contact_missing: არაა დაყენებული contact_unavailable: მიუწ. documentation: დოკუმენტაცია - extended_description_html: | -

კარგი ადგილი წესებისთვის

-

განვრცობილი აღწერილობა ჯერ არ შექმნილა.

generic_description: "%{domain} ერთი სერვერია ქსელში" hosted_on: მასტოდონს მასპინძლობს %{domain} learn_more: გაიგე მეტი @@ -531,9 +528,6 @@ ka: too_many: თან ვერ დაურთავთ 4 ფაილზე მეტს migrations: acct: username@domain ახალი ანგარიშის - currently_redirecting: 'თქვენი პროფილი გამართულია მოახდინოს გადამისამართება მისამართზე:' - proceed: შენახვა - updated_msg: თქვენი ანგარიშის მიგრაციის პარამეტრები წარმატეებით დამახსოვრდა! moderation: title: მოდერაცია notification_mailer: diff --git a/config/locales/kk.yml b/config/locales/kk.yml index 3658b2293..84cbdd294 100644 --- a/config/locales/kk.yml +++ b/config/locales/kk.yml @@ -10,9 +10,6 @@ kk: contact_missing: Бапталмаған contact_unavailable: Белгісіз documentation: Құжаттама - extended_description_html: | -

Ережелерге арналған жақсы орын

-

Әлі ештеңе жазылмапты

generic_description: "%{domain} желідегі серверлердің бірі" hosted_on: Mastodon орнатылған %{domain} доменінде learn_more: Көбірек білу @@ -624,9 +621,6 @@ kk: too_many: 4 файлдан артық қосылмайды migrations: acct: жаңа аккаунт үшін username@domain - currently_redirecting: 'Профиліңіз көшіріледі:' - proceed: Сақтау - updated_msg: Аккаунт көшіруіңіз сәтті аяқталды! moderation: title: Модерация notification_mailer: diff --git a/config/locales/ko.yml b/config/locales/ko.yml index fc9fa7b80..c95189dc5 100644 --- a/config/locales/ko.yml +++ b/config/locales/ko.yml @@ -17,9 +17,6 @@ ko: contact_unavailable: 없음 discover_users: 유저 발견하기 documentation: 문서 - extended_description_html: | -

룰을 작성하는 장소

-

아직 설명이 작성되지 않았습니다.

federation_hint_html: "%{instance}에 계정을 만드는 것으로 모든 마스토돈 서버, 그리고 호환 되는 모든 서버의 사용자를 팔로우 할 수 있습니다." generic_description: "%{domain} 은 네트워크에 있는 한 서버입니다" get_apps: 모바일 앱 사용해 보기 @@ -221,10 +218,12 @@ ko: deleted_status: "(삭제됨)" title: 감사 기록 custom_emojis: + assign_category: 분류 지정 by_domain: 도메인 copied_msg: 성공적으로 에모지의 로컬 복사본을 생성했습니다 copy: 복사 copy_failed_msg: 에모지의 로컬 복사본을 만드는 데 실패하였습니다 + create_new_category: 분류 생성 created_msg: 에모지가 성공적으로 생성되었습니다! delete: 삭제 destroyed_msg: 에모지가 성공적으로 삭제되었습니다! @@ -241,6 +240,7 @@ ko: shortcode: 짧은 코드 shortcode_hint: 최소 2글자, 영문자, 숫자, _만 사용 가능 title: 커스텀 에모지 + uncategorized: 분류되지 않음 unlisted: 목록에 없음 update_failed_msg: 에모지를 업데이트 할 수 없습니다 updated_msg: 에모지가 성공적으로 업데이트 되었습니다! @@ -420,6 +420,9 @@ ko: custom_css: desc_html: 모든 페이지에 적용할 CSS title: 커스텀 CSS + default_noindex: + desc_html: 이 설정을 바꾸지 않은 모든 유저들에게 적용 됩니다 + title: 유저들이 기본적으로 검색엔진에 인덱싱 되지 않도록 합니다 domain_blocks: all: 모두에게 disabled: 아무에게도 안 함 @@ -511,6 +514,10 @@ ko: context: 문맥 directory: 디렉토리에 있음 in_directory: 디렉토리에 %{count}개 있음 + last_active: 최근 활동 + most_popular: 최고 인기 + most_recent: 최신 + name: 해시태그 review: 심사 상태 reviewed: 심사 됨 title: 해시태그 @@ -565,6 +572,10 @@ ko: checkbox_agreement_without_rules_html: 이용 약관에 동의합니다 delete_account: 계정 삭제 delete_account_html: 계정을 삭제하고 싶은 경우, 여기서 삭제할 수 있습니다. 삭제 전 확인 화면이 표시됩니다. + description: + prefix_invited_by_user: "@%{name} 님이 당신을 이 마스토돈 서버로 초대했습니다!" + prefix_sign_up: 마스토돈에 가입하세요! + suffix: 계정 하나로 사람들을 팔로우 하고, 게시물을 작성하며 마스토돈을 포함한 다른 어떤 서버의 유저와도 메시지를 주고 받을 수 있습니다! didnt_get_confirmation: 확인 메일을 받지 못하셨습니까? forgot_password: 비밀번호를 잊어버리셨습니까? invalid_reset_password_token: 암호 리셋 토큰이 올바르지 못하거나 기간이 만료되었습니다. 다시 요청해주세요. @@ -618,30 +629,26 @@ ko: x_months: "%{count}월" x_seconds: "%{count}초" deletes: + challenge_not_passed: 입력한 정보가 올바르지 않습니다 confirm_password: 본인 확인을 위해 현재 사용 중인 암호를 입력해 주십시오 + confirm_username: 절차를 진행하려면 당신의 사용자명을 입력하세요 proceed: 계정 삭제 success_msg: 계정이 성공적으로 삭제되었습니다 + warning: + before: '진행하기 전, 주의사항을 꼼꼼히 읽어보세요:' + caches: 다른 서버에 캐싱 된 정보들은 남아있을 수 있습니다 + data_removal: 당신의 게시물과 다른 정보들은 영구적으로 삭제 됩니다 + email_change_html: 계정을 지우지 않고도 이메일 주소를 수정할 수 있습니다 + email_contact_html: 아직 도착하지 않았다면, %{email}에 메일을 보내 도움을 요청할 수 있습니다 + email_reconfirmation_html: 아직 확인 메일이 도착하지 않은 경우, 다시 요청할 수 있습니다 + irreversible: 계정을 복구하거나 다시 사용할 수 없게 됩니다 + more_details_html: 더 자세한 정보는, 개인정보 정책을 참고하세요. + username_available: 당신의 계정명은 다시 사용할 수 있게 됩니다 + username_unavailable: 당신의 계정명은 앞으로 사용할 수 없습니다 directories: directory: 프로필 디렉토리 explanation: 관심사에 대한 유저들을 발견합니다 explore_mastodon: "%{title} 탐사하기" - domain_blocks: - blocked_domains: 제한 되거나 차단 된 도메인 목록 - description: 이것은 %{instance}가 제한하거나 연합을 거부한 서버들의 목록입니다. - domain: 도메인 - media_block: 미디어 차단 - no_domain_blocks: "(도메인 차단 없음)" - severity: 심각도 - severity_legend: - media_block: 이 서버의 미디어는 불러오거나, 저장 되거나, 유저에게 보여지지 않습니다. - silence: 침묵 된 서버의 계정은 발견 되고, 팔로우 하고, 그들과 상호작용 할 수 있습니다, 그러나 그들의 툿은 툿 공개 타임라인에 나타나지 않으며 그들에게서 오는 알림은 그들을 팔로우 하지 않는 로컬 유저에게는 전달되지 않습니다. - suspension: 정지 된 서버의 어떤 콘텐츠도 저장 되거나 보여지거나 하지 않고 어떤 콘텐츠도 그 서버로 전달 되지 않습니다. 정지 된 서버에서의 상호작용은 무시됩니다. - suspension_disclaimer: 정지 된 서버는 때때로 이 서버의 공개 콘텐츠를 받아 갈 수도 잇습니다. - title: 심각도 - show_rationale: 사유 보여주기 - silence: 침묵 - suspension: 정지 - title: "%{instance}의 차단한 인스턴스 목록" domain_validator: invalid_domain: 올바른 도메인 네임이 아닙니다 errors: @@ -707,6 +714,7 @@ ko: all: 모두 changes_saved_msg: 정상적으로 변경되었습니다! copy: 복사 + no_batch_actions_available: 이 페이지에서 수행할 수 있는 일괄작업이 없습니다 order_by: 순서 save_changes: 변경 사항을 저장 validation_errors: @@ -776,9 +784,6 @@ ko: too_many: 최대 4개까지 첨부할 수 있습니다 migrations: acct: 새 계정의 username@domain - currently_redirecting: '당신의 프로파일은 여기로 리디렉션 됩니다:' - proceed: 저장 - updated_msg: 계정 이동 설정이 저장되었습니다! moderation: title: 모더레이션 notification_mailer: diff --git a/config/locales/lt.yml b/config/locales/lt.yml index 7aed705cb..e1471eed0 100644 --- a/config/locales/lt.yml +++ b/config/locales/lt.yml @@ -9,9 +9,6 @@ lt: contact: Kontaktai contact_missing: Nenustatyta documentation: Dokumentacija - extended_description_html: | -

Taisyklės

-

Ilgas aprašymas dar nėra sudartyas

generic_description: "%{domain} yra vienas serveris tinkle" hosted_on: Mastodon palaikomas naudojantis %{domain} talpinimu learn_more: Daugiau @@ -597,9 +594,6 @@ lt: too_many: Negalima pridėti daugiau nei 4 failų migrations: acct: slapyvardis@domenas naujam vartotojui - currently_redirecting: 'Jūsų profilis nustatytas nukreipimui į:' - proceed: Išsaugoti - updated_msg: Jūsų paskyros migracijos nustatymai sėkmingai pakeisti! moderation: title: Moderacija notification_mailer: diff --git a/config/locales/ms.yml b/config/locales/ms.yml index 4573d53dd..b77a1fd92 100644 --- a/config/locales/ms.yml +++ b/config/locales/ms.yml @@ -10,9 +10,6 @@ ms: contact_missing: Tidak ditetapkan contact_unavailable: Tidak tersedia documentation: Pendokumenan - extended_description_html: | -

Tempat sesuai untuk peraturan

-

Kenyataan penuh masih belum ditetapkan.

generic_description: "%{domain} ialah salah sebuah pelayan dalam rangkaian Mastodon" hosted_on: Mastodon dihoskan di %{domain} learn_more: Ketahui lebih lanjut diff --git a/config/locales/nl.yml b/config/locales/nl.yml index 9298e0ae0..1878a95a2 100644 --- a/config/locales/nl.yml +++ b/config/locales/nl.yml @@ -17,13 +17,13 @@ nl: contact_unavailable: n.v.t discover_users: Gebruikers ontdekken documentation: Documentatie - extended_description_html: | -

Een goede plek voor richtlijnen

-

De uitgebreide omschrijving is nog niet ingevuld.

federation_hint_html: Met een account op %{instance} ben je in staat om mensen die zich op andere Mastodonservers (en op andere plekken) bevinden te volgen. generic_description: "%{domain} is een server in het Mastodonnetwerk" get_apps: Mobiele apps hosted_on: Mastodon op %{domain} + instance_actor_flash: 'Dit account is een virtuel actor die wordt gebruikt om de server zelf te vertegenwoordigen en is geen individuele gebruiker. Het wordt voor federatiedoeleinden gebruikt en moet niet worden geblokkeerd, tenzij je de hele server wil blokkeren. In zo''n geval dien je echter een domeinblokkade te gebruiken. + +' learn_more: Meer leren privacy_policy: Privacybeleid see_whats_happening: Kijk wat er aan de hand is @@ -35,6 +35,11 @@ nl: status_count_before: Zij schreven tagline: Vrienden volgen en nieuwe ontdekken terms: Gebruiksvoorwaarden + unavailable_content: Niet beschikbare inhoud + unavailable_content_description: + reason: 'Reden:' + rejecting_media: Mediabestanden van deze server worden niet verwerkt en er worden geen thumbnails getoond. Je moet handmatig naar deze server doorklikken om de mediabestanden te kunnen bekijken. + silenced: Toots van deze server worden nergens weergegeven, behalve op jouw eigen starttijdlijn wanneer je het account volgt. user_count_after: one: gebruiker other: gebruikers @@ -53,6 +58,7 @@ nl: media: Media moved_html: "%{name} is verhuisd naar %{new_profile_link}:" network_hidden: Deze informatie is niet beschikbaar + never_active: Nooit nothing_here: Hier is niets! people_followed_by: Mensen die %{name} volgen people_who_follow: Mensen die %{name} volgen @@ -219,10 +225,12 @@ nl: deleted_status: "(verwijderde toot}" title: Auditlog custom_emojis: + assign_category: Categorie toewijzen by_domain: Domein copied_msg: Lokale kopie van emoji maken geslaagd copy: Kopiëren copy_failed_msg: Kan geen lokale kopie van deze emoji maken + create_new_category: Nieuwe categorie toevoegen created_msg: Aanmaken van emoji geslaagd! delete: Verwijderen destroyed_msg: Verwijderen van emoji geslaagd! @@ -239,6 +247,7 @@ nl: shortcode: Verkorte code shortcode_hint: Tenminste 2 tekens (alleen alfanumeriek en underscores) title: Lokale emoji’s + uncategorized: Niet gecategoriseerd unlisted: Niet weergegeven update_failed_msg: Deze emoji kon niet worden bijgewerkt updated_msg: Bijwerken van emoji is geslaagd! @@ -475,6 +484,8 @@ nl: desc_html: Je kan hier jouw eigen privacybeleid, gebruiksvoorwaarden en ander juridisch jargon kwijt. Je kan HTML gebruiken title: Aangepaste gebruiksvoorwaarden site_title: Naam Mastodonserver + spam_check_enabled: + title: Automatische spambestrijding thumbnail: desc_html: Gebruikt als voorvertoning voor OpenGraph en de API. 1200x630px aanbevolen title: Thumbnail Mastodonserver @@ -501,13 +512,19 @@ nl: tags: accounts_today: Aantal unieke keren vandaag gebruikt accounts_week: Aantal unieke keren deze week gebruikt + breakdown: Uitsplitsing van het gebruik van vandaag naar bron context: Context directory: In de gebruikersgids in_directory: "%{count} keer in de gebruikersgids" + last_active: Laatst actief + most_popular: Meest populair + most_recent: Meest recent + name: Hashtag review: Status beoordelen reviewed: Beoordeeld title: Hashtags trending_right_now: Op dit moment trending + unique_uses_today: "%{count} toots vandaag" unreviewed: Niet beoordeeld title: Beheer warning_presets: @@ -585,6 +602,10 @@ nl: return: Profiel van deze gebruiker tonen web: Ga naar de webapp title: Volg %{acct} + challenge: + confirm: Doorgaan + invalid_password: Ongeldig wachtwoord + prompt: Bevestig wachtwoord om door te gaan datetime: distance_in_words: about_x_hours: "%{count}u" @@ -600,23 +621,15 @@ nl: x_months: "%{count}ma" x_seconds: "%{count}s" deletes: + challenge_not_passed: De informatie die u hebt ingevoerd is ongeldig confirm_password: Voer jouw huidige wachtwoord in om jouw identiteit te bevestigen + confirm_username: Voer uw gebruikersnaam in om de procedure te bevestigen proceed: Account verwijderen success_msg: Jouw account is succesvol verwijderd directories: directory: Gebruikersgids explanation: Ontdek gebruikers aan de hand van hun interesses explore_mastodon: "%{title} verkennen" - domain_blocks: - domain: Domein - media_block: Mediabestanden weigeren - no_domain_blocks: "(geen domeinblokkades)" - severity: Zwaarte - severity_legend: - media_block: Mediabestanden die van deze server komen worden niet opgehaald, opgeslagen en aan de gebruiker getoond. - title: Zwaartes - show_rationale: Motivering tonen - silence: Negeren errors: '400': The request you submitted was invalid or malformed. '403': Jij hebt geen toestemming om deze pagina te bekijken. @@ -749,10 +762,30 @@ nl: images_and_video: Een video kan niet aan een toot met afbeeldingen worden gekoppeld too_many: Er kunnen niet meer dan 4 afbeeldingen toegevoegd worden migrations: - acct: gebruikersnaam@domein van het nieuwe account - currently_redirecting: 'Jouw profiel wordt nu doorverwezen naar:' - proceed: Opslaan - updated_msg: Jouw accountmigratie-instelling is succesvol bijgewerkt! + acct: Verhuisd naar + cancelled_msg: De doorverwijzing is succesvol geannuleerd. + errors: + already_moved: is hetzelfde account waarnaar je al naar toe bent verhuisd + missing_also_known_as: verwijst niet terug naar dit account + move_to_self: kan niet het huidige account zijn + not_found: kon niet worden gevonden + on_cooldown: Jouw laatste migratie is nog te kort geleden + followers_count: Volgers op het moment van verhuizing + incoming_migrations: Verhuizen vanaf een ander account + incoming_migrations_html: Om te vanaf een ander account naar dit account te verhuizen, moet je eerst een accountalias aanmaken. + moved_msg: Jouw account wordt nu naar %{acct} doorverwezen en jouw volgers worden verhuisd. + not_redirecting: Jouw account wordt momenteel niet naar een ander account doorverwezen. + on_cooldown: Je hebt recentelijk jouw account verhuisd. Deze mogelijkheid is weer beschikbaar over %{count} dagen. + past_migrations: Vorige migraties + proceed_with_move: Volgers verhuizen + redirecting_to: Jouw account wordt nu naar %{acct} doorverwezen. + warning: + backreference_required: Het nieuwe account moet eerst worden ingesteld om naar dit account te kunnen terugverwijzen + before: 'Lees eerst goed deze tekst, alvorens verder te gaan:' + cooldown: Na de verhuizing kun je tijdelijk niet opnieuw verhuizen + disabled_account: Jouw huidige account is hierna niet meer volledig bruikbaar. Je hebt echter wel toegang tot het exporteren van je gegevens en tot het opnieuw activeren van je account. + followers: Deze actie verhuisd alle volgers vanaf het huidige account naar het nieuwe account + other_data: Geen andere gegevens worden automatisch verhuisd moderation: title: Moderatie notification_mailer: @@ -897,6 +930,7 @@ nl: settings: account: Account account_settings: Accountinstellingen + aliases: Accountaliassen appearance: Uiterlijk authorized_apps: Geautoriseerde apps back: Terug naar Mastodon diff --git a/config/locales/no.yml b/config/locales/no.yml index 1d675aef6..c6b9605b3 100644 --- a/config/locales/no.yml +++ b/config/locales/no.yml @@ -7,9 +7,6 @@ contact: Kontakt contact_missing: Ikke innstilt contact_unavailable: Ikke tilgjengelig - extended_description_html: | -

En god plassering for regler

-

En utvidet beskrivelse er ikke satt opp ennå.

generic_description: "%{domain} er en tjener i nettverket" hosted_on: Mastodon driftet på %{domain} learn_more: Lær mer @@ -394,9 +391,6 @@ too_many: Kan ikke legge ved mer enn 4 filer migrations: acct: brukernavn@domene til den nye kontoen - currently_redirecting: 'Din profil er omdirigert til:' - proceed: Lagre - updated_msg: Dine innstillinger for kontomigrering er oppdatert! moderation: title: Moderasjon notification_mailer: diff --git a/config/locales/oc.yml b/config/locales/oc.yml index 2884380b8..2d11d3399 100644 --- a/config/locales/oc.yml +++ b/config/locales/oc.yml @@ -17,9 +17,6 @@ oc: contact_unavailable: Pas disponible discover_users: Descobrissètz de nòvas personas documentation: Documentacion - extended_description_html: | -

Una bona plaça per las règlas

-

La descripcion longa es pas estada causida pel moment.

federation_hint_html: Amb un compte sus %{instance} poiretz sègre de personas de qualque siasque servidor Mastodon e encara mai. generic_description: "%{domain} es un dels servidors del malhum" get_apps: Ensajatz una aplicacion mobil @@ -719,9 +716,6 @@ oc: too_many: Se pòt pas ajustar mai de 4 fichièrs migrations: acct: nomutilizaire@domeni del nòu compte - currently_redirecting: 'Vòstre perfil es parametrat per mandar a :' - proceed: Enregistrar - updated_msg: Vòstre paramètre de migracion es ben estat mes a jorn ! moderation: title: Moderacion notification_mailer: diff --git a/config/locales/pl.yml b/config/locales/pl.yml index 23d0c8a98..46b911694 100644 --- a/config/locales/pl.yml +++ b/config/locales/pl.yml @@ -17,9 +17,6 @@ pl: contact_unavailable: Nie dotyczy discover_users: Odkrywaj użytkowników documentation: Dokumentacja - extended_description_html: | -

Dobre miejsce na zasady użytkowania

-

Nie ustawiono jeszcze szczegółowego opisu

federation_hint_html: Z kontem na %{instance}, możesz śledzić użytkowników każdego serwera Mastodona i nie tylko. generic_description: "%{domain} jest jednym z serwerów sieci" get_apps: Spróbuj aplikacji mobilnej @@ -712,9 +709,6 @@ pl: too_many: Nie możesz załączyć więcej niż 4 plików migrations: acct: nazwa@domena nowego konta - currently_redirecting: 'Obecnie Twoje konto przekierowuje do:' - proceed: Zapisz - updated_msg: Pomyślnie zaktualizowano ustawienia migracji Twojego konta! moderation: title: Moderacja notification_mailer: diff --git a/config/locales/pt-BR.yml b/config/locales/pt-BR.yml index 9896f888a..ac7e70908 100644 --- a/config/locales/pt-BR.yml +++ b/config/locales/pt-BR.yml @@ -16,9 +16,6 @@ pt-BR: contact_unavailable: Não disponível discover_users: Descubra usuários documentation: Documentação - extended_description_html: | -

Um bom lugar para regras

-

A descrição da instância ainda não foi feita.

federation_hint_html: Com uma conta em %{instance} você vai poder seguir pessoas em qualquer servidor Mastodon ou outros do fediverso. generic_description: "%{domain} é um servidor na rede" get_apps: Experimente um aplicativo @@ -664,9 +661,6 @@ pt-BR: too_many: Não é possível anexar mais de 4 imagens migrations: acct: username@domain da nova conta - currently_redirecting: 'Seu perfil está configurado para redirecionar para:' - proceed: Salvar - updated_msg: As configurações de migração da sua conta foram atualizadas com sucesso! moderation: title: Moderação notification_mailer: diff --git a/config/locales/pt-PT.yml b/config/locales/pt-PT.yml index 25ee57085..ecca3b845 100644 --- a/config/locales/pt-PT.yml +++ b/config/locales/pt-PT.yml @@ -10,9 +10,6 @@ pt-PT: contact_missing: Não configurado contact_unavailable: n.d. documentation: Documentação - extended_description_html: | -

Um bom lugar para regras

-

A descrição estendida ainda não foi configurada.

generic_description: "%{domain} é um servidor na rede" hosted_on: Mastodon em %{domain} learn_more: Saber mais @@ -612,9 +609,6 @@ pt-PT: too_many: Não é possível anexar mais de 4 arquivos migrations: acct: username@domain da nova conta - currently_redirecting: 'O teu perfil está configurado para redirecionar para:' - proceed: Salvar - updated_msg: As configurações de migração da tua conta foram atualizadas com sucesso! moderation: title: Moderação notification_mailer: diff --git a/config/locales/ru.yml b/config/locales/ru.yml index 0c1202118..3b10925ac 100644 --- a/config/locales/ru.yml +++ b/config/locales/ru.yml @@ -17,9 +17,6 @@ ru: contact_unavailable: неизв. discover_users: Находите пользователей documentation: Документация - extended_description_html: | -

Хорошее место для правил

-

Расширенное описание еще не настроено.

federation_hint_html: С учётной записью на %{instance} вы сможете подписываться на людей с любого сервера Mastodon и не только. generic_description: "%{domain} - один из серверов сети" get_apps: Попробуйте мобильное приложение @@ -592,8 +589,6 @@ ru: directory: Каталог профилей explanation: Находите пользователей по интересам explore_mastodon: Изучайте %{title} - domain_blocks: - domain: Домен errors: '400': The request you submitted was invalid or malformed. '403': У Вас нет доступа к просмотру этой страницы. @@ -730,9 +725,6 @@ ru: too_many: Нельзя добавить более 4 файлов migrations: acct: имя@домен нового аккаунта - currently_redirecting: 'Ваш профиль будет перенаправлен на:' - proceed: Сохранить - updated_msg: Настройки миграции вашего аккаунта обновлены! moderation: title: Модерация notification_mailer: diff --git a/config/locales/simple_form.co.yml b/config/locales/simple_form.co.yml index eeb5a913a..fbf6813a4 100644 --- a/config/locales/simple_form.co.yml +++ b/config/locales/simple_form.co.yml @@ -43,6 +43,8 @@ co: domain: Stu duminiu puderà ricuperà i dati di stu servore è i dati ch'affaccanu da quallà saranu trattati è cunservati featured_tag: name: 'Pudete vulè utilizà unu di quelli:' + form_challenge: + current_password: Entrate in in una zona sicurizata imports: data: Un fugliale CSV da un’altru servore di Mastodon invite_request: @@ -131,6 +133,8 @@ co: must_be_follower: Piattà e nutificazione di quelli·e ch’ùn vi seguitanu must_be_following: Piattà e nutificazione di quelli·e ch’ùn seguitate must_be_following_dm: Bluccà e missaghji diretti di quelli·e ch’ùn seguitate + invite: + comment: Cummentariu invite_request: text: Perchè vulete ghjunghje? notification_emails: diff --git a/config/locales/simple_form.cs.yml b/config/locales/simple_form.cs.yml index b6b61747f..047d59c69 100644 --- a/config/locales/simple_form.cs.yml +++ b/config/locales/simple_form.cs.yml @@ -2,6 +2,10 @@ cs: simple_form: hints: + account_alias: + acct: Zadejte přezdívku@doménu účtu, ze kterého se chcete přesunout + account_migration: + acct: Zadejte přezdívku@doménu účtu, na který se chcete přesunout account_warning_preset: text: Můžete používat syntaxi tootů, jako například URL, hashtagy a zmínky admin_account_action: @@ -15,6 +19,8 @@ cs: avatar: PNG, GIF či JPG. Maximálně %{size}. Bude zmenšen na %{dimensions} px bot: Tento účet provádí hlavně automatizované akce a nemusí být spravován context: Jeden či více kontextů, ve kterých má být filtr uplatněn + current_password: Z bezpečnostních důvodů prosím zadejte heslo aktuálního účtu + current_username: Prosím potvrďte zadáním uživatelského jména aktuálního účtu digest: Odesíláno pouze po dlouhé době nečinnosti a pouze, pokud jste při své nepřítomnosti obdržel/a osobní zprávy discoverable: Adresář profilů je další způsob, díky kterému se může váš účet dostat k širšímu publiku email: Bude vám poslán potvrzovací e-mail @@ -36,13 +42,15 @@ cs: setting_noindex: Ovlivňuje váš veřejný profil a stránky tootů setting_show_application: Aplikace, kterou používáte k psaní tootů, bude zobrazena v detailním zobrazení vašich tootů setting_use_blurhash: Gradienty jsou založeny na barvách skryté grafiky, ale zakrývají jakékoliv detaily - setting_use_pending_items: Skrýt aktualizace časový osy a načíst je kliknutím namísto automatického rolování proudu + setting_use_pending_items: Skrýt aktualizace časové osy a načíst je kliknutím namísto automatického rolování proudu username: Vaše uživatelské jméno bude na %{domain} unikátní whole_word: Je-li klíčové slovo či fráze pouze alfanumerická, bude aplikována pouze, pokud se shoduje s celým slovem domain_allow: domain: Tato doména bude moci stahovat data z tohoto serveru a příchozí data z ní budou zpracována a uložena featured_tag: name: 'Nejspíš budete chtít použít jeden z těchto:' + form_challenge: + current_password: Vstupujete do zabezpečeného prostoru imports: data: Soubor CSV exportovaný z jiného serveru Mastodon invite_request: @@ -58,6 +66,10 @@ cs: fields: name: Označení value: Obsah + account_alias: + acct: Adresa starého účtu + account_migration: + acct: Adresa nového účtu account_warning_preset: text: Text předlohy admin_account_action: @@ -131,6 +143,8 @@ cs: must_be_follower: Blokovat oznámení od lidí, kteří vás nesledují must_be_following: Blokovat oznámení od lidí, které nesledujete must_be_following_dm: Blokovat přímé zprávy od lidí, které nesledujete + invite: + comment: Komentář invite_request: text: Proč se chcete připojit? notification_emails: diff --git a/config/locales/simple_form.de.yml b/config/locales/simple_form.de.yml index ac153805e..2ce286973 100644 --- a/config/locales/simple_form.de.yml +++ b/config/locales/simple_form.de.yml @@ -2,6 +2,10 @@ de: simple_form: hints: + account_alias: + acct: Gib den benutzernamen@domain des Kontos an, von dem du umziehen möchtest + account_migration: + acct: Gib den benutzernamen@domain des Kontos an, zu dem du umziehen möchtest account_warning_preset: text: Du kannst Beitragssyntax benutzen, wie z.B. URLs, Hashtags und Erwähnungen admin_account_action: @@ -15,6 +19,8 @@ de: avatar: PNG, GIF oder JPG. Maximal %{size}. Wird auf %{dimensions} px herunterskaliert bot: Dieses Konto führt lediglich automatisierte Aktionen durch und wird möglicherweise nicht überwacht context: Ein oder mehrere Kontexte, wo der Filter aktiv werden soll + current_password: Aus Sicherheitsgründen gib bitte das Passwort des aktuellen Kontos ein + current_username: Um das zu bestätigen, gib den Benutzernamen des aktuellen Kontos ein digest: Wenn du eine lange Zeit inaktiv bist, wird dir eine Zusammenfassung von Erwähnungen zugeschickt, die du in deiner Abwesenheit empfangen hast discoverable: Das Profilverzeichnis ist eine andere Möglichkeit, mit der dein Konto ein größeres Publikum erreichen kann email: Du wirst eine Bestätigungs-E-Mail erhalten @@ -43,6 +49,8 @@ de: domain: Diese Domain kann Daten von diesem Server abrufen und eingehende Daten werden verarbeitet und gespeichert featured_tag: name: 'Du möchtest vielleicht einen von diesen benutzen:' + form_challenge: + current_password: Du betrittst einen sicheren Bereich imports: data: CSV-Datei, die aus einem anderen Mastodon-Server exportiert wurde invite_request: @@ -58,6 +66,10 @@ de: fields: name: Bezeichnung value: Inhalt + account_alias: + acct: Adresse des alten Kontos + account_migration: + acct: Adresse des neuen Kontos account_warning_preset: text: Vorlagentext admin_account_action: @@ -131,6 +143,8 @@ de: must_be_follower: Benachrichtigungen von Profilen blockieren, die mir nicht folgen must_be_following: Benachrichtigungen von Profilen blockieren, denen ich nicht folge must_be_following_dm: Private Nachrichten von Profilen, denen ich nicht folge, blockieren + invite: + comment: Kommentar invite_request: text: Warum möchtest du beitreten? notification_emails: diff --git a/config/locales/simple_form.el.yml b/config/locales/simple_form.el.yml index 4eb0ce710..7ff5fbf77 100644 --- a/config/locales/simple_form.el.yml +++ b/config/locales/simple_form.el.yml @@ -131,6 +131,8 @@ el: must_be_follower: Μπλόκαρε τις ειδοποιήσεις από όσους δεν ακολουθείς must_be_following: Μπλόκαρε τις ειδοποιήσεις που προέρχονται από άτομα που δεν τα ακολουθείς must_be_following_dm: Μπλόκαρε τα προσωπικά μηνύματα από όσους δεν ακολουθείς + invite: + comment: Σχόλια invite_request: text: Γιατί θέλεις να συμμετάσχεις; notification_emails: diff --git a/config/locales/simple_form.fr.yml b/config/locales/simple_form.fr.yml index a92c20f10..9f2f15b07 100644 --- a/config/locales/simple_form.fr.yml +++ b/config/locales/simple_form.fr.yml @@ -131,6 +131,8 @@ fr: must_be_follower: Masquer les notifications des personnes qui ne vous suivent pas must_be_following: Masquer les notifications des personnes que vous ne suivez pas must_be_following_dm: Bloquer les messages directs des personnes que vous ne suivez pas + invite: + comment: Commentaire invite_request: text: Pourquoi voulez-vous vous inscrire ? notification_emails: diff --git a/config/locales/simple_form.gl.yml b/config/locales/simple_form.gl.yml index adb06bc2c..61308bf48 100644 --- a/config/locales/simple_form.gl.yml +++ b/config/locales/simple_form.gl.yml @@ -2,6 +2,10 @@ gl: simple_form: hints: + account_alias: + acct: Indica o usuaria@servidor da conta desde a cal queres migrar + account_migration: + acct: Indica o usuaria@servidor da conta a cal queres migrar account_warning_preset: text: Pódeslle dar formato ao toot, como URLs, etiquetas e mencións admin_account_action: @@ -15,6 +19,8 @@ gl: avatar: PNG, GIF ou JPG. Máximo %{size}. Será reducida a %{dimensions}px bot: Esta conta realiza principalmente accións automatizadas e podería non estar monitorizada context: Un ou varios contextos onde se debería aplicar o filtro + current_password: Por razóns de seguridade, introduce o contrasinal da conta actual + current_username: Para confirmar, introduce o nome de usuaria da conta actual digest: Enviar só tras un longo período de inactividade e só si recibeu algunha mensaxe persoal na súa ausencia discoverable: O directorio de perfil é outro xeito para que a túa conta alcance unha maior audiencia email: Enviaráselle un correo-e de confirmación @@ -43,6 +49,8 @@ gl: domain: Este dominio estará en disposición de obter datos desde este servidor e datos de entrada a el poderán ser procesados e gardados featured_tag: name: 'Podería utilizar algunha de estas:' + form_challenge: + current_password: Estás entrando nun área segura imports: data: Ficheiro CSV exportado desde outro servidor Mastodon invite_request: @@ -58,6 +66,10 @@ gl: fields: name: Etiqueta value: Contido + account_alias: + acct: Xestina a conta antiga + account_migration: + acct: Xestiona a nova conta account_warning_preset: text: Texto preestablecido admin_account_action: @@ -131,6 +143,8 @@ gl: must_be_follower: Bloquear as notificacións de non-seguidoras must_be_following: Bloquea as notificacións de personas que non segue must_be_following_dm: Bloquea as mensaxes directas de personas que non segue + invite: + comment: Comentar invite_request: text: Por que quere unirse? notification_emails: diff --git a/config/locales/simple_form.ko.yml b/config/locales/simple_form.ko.yml index 118bf50d4..a6db9e006 100644 --- a/config/locales/simple_form.ko.yml +++ b/config/locales/simple_form.ko.yml @@ -131,6 +131,8 @@ ko: must_be_follower: 나를 팔로우 하지 않는 사람에게서 온 알림을 차단 must_be_following: 내가 팔로우 하지 않는 사람에게서 온 알림을 차단 must_be_following_dm: 내가 팔로우 하지 않은 사람에게서 오는 다이렉트메시지를 차단 + invite: + comment: 주석 invite_request: text: 가입하려는 이유가 무엇인가요? notification_emails: diff --git a/config/locales/sk.yml b/config/locales/sk.yml index e6a30f0c3..01f5bf750 100644 --- a/config/locales/sk.yml +++ b/config/locales/sk.yml @@ -17,9 +17,6 @@ sk: contact_unavailable: Neuvedený/á discover_users: Objavuj užívateľov documentation: Dokumentácia - extended_description_html: | -

Pravidlá

-

Žiadne zatiaľ uvedené nie sú

federation_hint_html: S účtom na %{instance} budeš môcť následovať ľúdí na hociakom Mastodon serveri, ale aj na iných serveroch. generic_description: "%{domain} je jeden server v sieti" get_apps: Vyskúšaj aplikácie @@ -40,6 +37,9 @@ sk: status_count_before: Ktorí napísali tagline: Následuj kamarátov, a objavuj nových terms: Podmienky užitia + unavailable_content: Nedostupný obsah + unavailable_content_description: + reason: 'Dôvod:' user_count_after: few: užívateľov many: užívatelia @@ -527,6 +527,10 @@ sk: context: Súvis directory: V zozname in_directory: "%{count} v zozname" + last_active: Naposledy aktívny + most_popular: Najpopulárnejšie + most_recent: Najnovšie + name: Haštag review: Prehodnoť stav reviewed: Zhodnotené title: Haštagy @@ -551,6 +555,8 @@ sk: subject: Nové hlásenie pre %{instance} (#%{id}) new_trending_tag: subject: Nový haštag očakáva preverenie na %{instance} (#%{name}) + aliases: + add_new: Vytvor alias appearance: advanced_web_interface: Pokročilé webové rozhranie advanced_web_interface_hint: 'Ak chceš využiť celkovú šírku tvojej obrazovky, pokročilé webové rozhranie ti umožňuje nastaviť mnoho rôznych stĺpcov, aby si videl/a toľko informácií naraz, koľko chceš: Domov, oboznámenia, federovanú časovú os, a ľubovolný počet zoznamov, či haštagov.' @@ -619,6 +625,10 @@ sk: return: Ukáž užívateľov profil web: Prejdi do siete title: Následuj %{acct} + challenge: + confirm: Pokračuj + invalid_password: Nesprávne heslo + prompt: Pre pokračovanie potvrď svoje heslo datetime: distance_in_words: about_x_hours: "%{count}hod" @@ -648,21 +658,6 @@ sk: directory: Katalóg profilov explanation: Pátraj po užívateľoch podľa ich záujmov explore_mastodon: Prebádaj %{title} - domain_blocks: - blocked_domains: Zoznam obmedzovaných a blokovaných domén - description: Toto je zoznam serverov, ktorých federáciu %{instance} obmedzuje, alebo nepríjma. - domain: Doména - media_block: Blokovanie médií - no_domain_blocks: "(Žiadne domény niesú blokované)" - severity: Závažnosť - severity_legend: - media_block: Mediálne súbory zo servera niesú ani zachytávané, ani ukladané, či zobrazované užívateľovi. - suspension_disclaimer: Vylúčené servery sa môžu občas dostať k verejnému obsahu tohto servera. - title: Závažnosti - show_rationale: Ukáž zdôvodnenie - silence: Stíš - suspension: Vylúčenie - title: Zoznam instancií, ktoré blokuje %{instance} domain_validator: invalid_domain: nieje správny tvar domény errors: @@ -805,9 +800,12 @@ sk: too_many: Nemôžeš priložiť viac ako 4 súbory migrations: acct: prezývka@doména nového účtu - currently_redirecting: 'Tvoj profil má nastavené presmerovanie na:' - proceed: Uložiť - updated_msg: Tvoje nastavenia pre presmerovanie účtu boli úspešne aktualizované! + cancel: Zruš presmerovanie + errors: + move_to_self: nemôže to byť tvoj súčasný účet + not_found: nebolo možné nájsť + past_migrations: Predošlé presuny + proceed_with_move: Presuň sledovateľov moderation: title: Moderovanie notification_mailer: diff --git a/config/locales/sl.yml b/config/locales/sl.yml index 47b835646..63eed6409 100644 --- a/config/locales/sl.yml +++ b/config/locales/sl.yml @@ -17,9 +17,6 @@ sl: contact_unavailable: Ni na voljo discover_users: Odkrijte uporabnike documentation: Dokumentacija - extended_description_html: | -

Dober prostor za pravila

-

Razširjen opis še ni bil nastavljen.

federation_hint_html: Z računom na %{instance} boste lahko spremljali ljudi na kateremkoli Mastodon strežniku. generic_description: "%{domain} je en strežnik v omrežju" get_apps: Poskusite mobilno aplikacijo @@ -734,9 +731,6 @@ sl: too_many: Ni možno priložiti več kot 4 datoteke migrations: acct: username@domain novega računa - currently_redirecting: 'Vaš profil je preusmerjen na:' - proceed: Shrani - updated_msg: Nastavitev selitve računa je bila uspešno posodobljena! moderation: title: Moderiranje notification_mailer: diff --git a/config/locales/sq.yml b/config/locales/sq.yml index 4e5f37294..af180e281 100644 --- a/config/locales/sq.yml +++ b/config/locales/sq.yml @@ -9,9 +9,6 @@ sq: contact: Kontakt contact_missing: I parregulluar documentation: Dokumentim - extended_description_html: | -

Një vend i mirë për rregulla

-

Përshkrimi i zgjeruar s’është sajuar ende.

generic_description: "%{domain} është një shërbyes te rrjeti" hosted_on: Mastodon i strehuar në %{domain} learn_more: Mësoni më tepër @@ -602,9 +599,6 @@ sq: too_many: S’mund të bashkëngjiten më shumë se 4 kartela migrations: acct: emërpërdoruesi@përkatësi e llogarisë së re - currently_redirecting: 'Profili juaj është caktuar të ridrejtojë te:' - proceed: Ruaje - updated_msg: Rregullimi juaj për migrim llogarish u përditësua me sukses! moderation: title: Moderim notification_mailer: diff --git a/config/locales/sr-Latn.yml b/config/locales/sr-Latn.yml index 5c06242cc..44bae34d0 100644 --- a/config/locales/sr-Latn.yml +++ b/config/locales/sr-Latn.yml @@ -6,9 +6,6 @@ sr-Latn: about_this: O instanci contact: Kontakt contact_missing: Nije postavljeno - extended_description_html: | -

Dobro mesto za pravila

-

Prošireni opis koji još nije postavljen.

generic_description: "%{domain} je server na mreži" hosted_on: Mastodont hostovan na %{domain} learn_more: Saznajte više @@ -381,9 +378,6 @@ sr-Latn: too_many: Ne može se prikačiti više od 4 fajla migrations: acct: korisnik@domen novog naloga - currently_redirecting: 'Profil Vam je podešen da preusmerava na :' - proceed: Sačuvaj - updated_msg: Prebacivanje postavki Vašeg naloga uspešno izmenjeno! moderation: title: Moderacija notification_mailer: diff --git a/config/locales/sr.yml b/config/locales/sr.yml index 772c04d64..4a5d551ef 100644 --- a/config/locales/sr.yml +++ b/config/locales/sr.yml @@ -9,9 +9,6 @@ sr: contact: Контакт contact_missing: Није постављено documentation: Документација - extended_description_html: | -

Добро место за правила

-

Проширени опис који још није постављен.

generic_description: "%{domain} је сервер на мрежи" hosted_on: Мастодонт хостован на %{domain} learn_more: Сазнајте више @@ -614,9 +611,6 @@ sr: too_many: Не може се прикачити више од 4 фајла migrations: acct: корисник@домен новог налога - currently_redirecting: 'Профил Вам је подешен да преусмерава на :' - proceed: Сачувај - updated_msg: Пребацивање поставки Вашег налога успешно измењено! moderation: title: Модерација notification_mailer: diff --git a/config/locales/sv.yml b/config/locales/sv.yml index a71ea9e18..740aad00d 100644 --- a/config/locales/sv.yml +++ b/config/locales/sv.yml @@ -8,9 +8,6 @@ sv: api: API contact: Kontakt contact_missing: Inte inställd - extended_description_html: | -

En bra plats för regler

-

Den utökade beskrivningen har inte konfigurerats ännu.

generic_description: "%{domain} är en server i nätverket" hosted_on: Mastodon värd på %{domain} learn_more: Lär dig mer @@ -454,9 +451,6 @@ sv: too_many: Det går inte att bifoga mer än 4 filer migrations: acct: användarnamn@domän av det nya kontot - currently_redirecting: 'Din profil är satt att omdirigeras till:' - proceed: Spara - updated_msg: Dina kontoflyttsinställning har uppdaterats! moderation: title: Moderera notification_mailer: diff --git a/config/locales/te.yml b/config/locales/te.yml index 560a295a6..ec4846554 100644 --- a/config/locales/te.yml +++ b/config/locales/te.yml @@ -10,9 +10,6 @@ te: contact_missing: ఇంకా సెట్ చేయలేదు contact_unavailable: వర్తించదు documentation: పత్రీకరణ - extended_description_html: | -

నియమాలకు ఒక మంచి ప్రదేశం

-

మరింత విశదీకరణ ఇంకా సెట్ చేయబడలేదు.

generic_description: "%{domain} అనేది నెట్వర్కులోని ఒక సర్వరు" hosted_on: మాస్టొడాన్ %{domain} లో హోస్టు చేయబడింది learn_more: మరింత తెలుసుకోండి diff --git a/config/locales/th.yml b/config/locales/th.yml index 97ef41460..e1056d0c2 100644 --- a/config/locales/th.yml +++ b/config/locales/th.yml @@ -17,9 +17,6 @@ th: contact_unavailable: ไม่มี discover_users: ค้นพบผู้ใช้ documentation: เอกสารประกอบ - extended_description_html: | -

สถานที่ที่ดีสำหรับกฎ

-

ยังไม่ได้ตั้งคำอธิบายเพิ่มเติม

federation_hint_html: เมื่อคุณมีบัญชีที่ %{instance} แล้ว คุณสามารถติดตามผู้คนบนเซิร์ฟเวอร์ Mastodon เซิร์ฟเวอร์ใดก็ได้ generic_description: "%{domain} เป็นเซิร์ฟเวอร์หนึ่งในเครือข่าย" get_apps: ลองแอปสำหรับมือถือ @@ -515,7 +512,6 @@ th: too_many: ไม่สามารถแนบมากกว่า 4 ไฟล์ migrations: acct: username@domain ของบัญชีใหม่ - proceed: บันทึก moderation: title: การควบคุม notification_mailer: diff --git a/config/locales/tr.yml b/config/locales/tr.yml index 550b1cc49..b6817999e 100644 --- a/config/locales/tr.yml +++ b/config/locales/tr.yml @@ -17,9 +17,6 @@ tr: contact_unavailable: Yok discover_users: Kullanıcıları keşfet documentation: Belgeler - extended_description_html: | -

Kural için iyi bir yer

-

Genişletilmiş açıklama henüz ayarlanmamış.

federation_hint_html: "%{instance} hesabınızla, herhangi bir Mastodon sunucusundaki ve haricindeki kişileri takip edebilirsiniz." generic_description: "%{domain} ağdaki bir sunucudur" get_apps: Bir mobil uygulamayı deneyin @@ -444,14 +441,6 @@ tr: directory: Profil dizini explanation: Kullanıcıları ilgi alanlarına göre keşfedin explore_mastodon: "%{title} keşfet" - domain_blocks: - blocked_domains: Sınırlı ve engellenen alanların listesi - description: Bu, %{instance} öğesinin sınırladığı veya federasyonu reddettiği sunucuların listesidir. - domain: Alan adı - severity_legend: - media_block: Sunucudan gelen medya dosyaları alınmaz, saklanmaz veya kullanıcıya gösterilmez. - silence: Susturulmuş sunuculardaki hesaplar bulunabilir, takip edilebilinir ve onlarla etkileşime girilebilinir, ancak gönderileri genel zaman çizelgelerinde görünmez ve onlardan gelen bildirimler onları takip etmeyen yerel kullanıcılara ulaşmaz. - show_rationale: Gerekçeyi göster domain_validator: invalid_domain: geçerli bir alan adı değil errors: @@ -540,10 +529,6 @@ tr: validations: images_and_video: Halihazırda görsel içeren bir gönderiye video ekleyemezsiniz too_many: 4'ten fazla dosya ekleyemezsiniz - migrations: - currently_redirecting: 'Profiliniz yönlendirmek üzere ayarlandı:' - proceed: Kaydet - updated_msg: Hesap taşıma ayarınız başarıyla güncellendi! moderation: title: Yönetim notification_mailer: diff --git a/config/locales/uk.yml b/config/locales/uk.yml index 5edbbd194..ade86d604 100644 --- a/config/locales/uk.yml +++ b/config/locales/uk.yml @@ -17,9 +17,6 @@ uk: contact_unavailable: Недоступно discover_users: Знайдіть цікавих користувачів documentation: Документація - extended_description_html: | -

Гарне місце для правил

-

Детальний опис ще не налаштований.

federation_hint_html: З обліковим записом на %{instance} ви зможете слідкувати за людьми на будь-якому сервері Mastodon та поза ним. generic_description: "%{domain} є одним сервером у мережі" get_apps: Спробуйте мобільний додаток @@ -651,17 +648,6 @@ uk: directory: Каталог профілів explanation: Шукайте користувачів за їх інтересами explore_mastodon: Досліджуйте %{title} - domain_blocks: - blocked_domains: Обмежені та заблоковані домени - description: Перелік серверів, з якими %{instance} не хоче або не буде вступати до федеративних відносин. - domain: Домен - no_domain_blocks: "(Немає заблокованих доменів)" - severity_legend: - media_block: Файли медіа з цього сервера не отримуються, не зберігаються та не відображаються. - suspension: Інформація з призупинених серверів не зберігається та не відображається. Ніякі дані не надсилаються до них, взаємодії ігноруються. - suspension_disclaimer: Призупинені сервери можуть інколи отримувати публічні дані з цього сервера. - show_rationale: Обґрунтування - title: "%{instance} Перелік заблокованих серверів" domain_validator: invalid_domain: не є допустимим ім'ям домену errors: @@ -797,9 +783,6 @@ uk: too_many: Не можна додати більше 4 файлів migrations: acct: username@domain нового облікового запису - currently_redirecting: 'Ваш профіль налаштований перенаправляти до:' - proceed: Зберегти - updated_msg: Налаштування переїзду вашого облікового запису успішно оновлені! moderation: title: Модерація notification_mailer: diff --git a/config/locales/zh-CN.yml b/config/locales/zh-CN.yml index 9c6fd27e8..89506e223 100644 --- a/config/locales/zh-CN.yml +++ b/config/locales/zh-CN.yml @@ -17,9 +17,6 @@ zh-CN: contact_unavailable: 未公开 discover_users: 发现用户 documentation: 文档 - extended_description_html: | -

这里可以写一些规定

-

本站尚未设置详细介绍。

federation_hint_html: 在%{instance} 上拥有账户后,你可以关注任何 Mastodon 服务器或其他服务器上的人。 generic_description: "%{domain} 是这个庞大网络中的一台服务器" get_apps: 尝试移动应用 @@ -593,10 +590,6 @@ zh-CN: directory: 用户目录 explanation: 根据兴趣发现用户 explore_mastodon: 探索 %{title} - domain_blocks: - silence: 隐藏 - suspension: 屏蔽 - title: "%{instance} 已屏蔽实例列表" domain_validator: invalid_domain: 不是一个有效的域名 errors: @@ -730,9 +723,6 @@ zh-CN: too_many: 最多只能添加 4 张图片 migrations: acct: 新帐户的 用户名@域名 - currently_redirecting: 目前你的个人资料页显示的新帐户是: - proceed: 保存 - updated_msg: 帐户迁移设置更新成功! moderation: title: 运营 notification_mailer: diff --git a/config/locales/zh-HK.yml b/config/locales/zh-HK.yml index 2c59b3f07..6f77f52c3 100644 --- a/config/locales/zh-HK.yml +++ b/config/locales/zh-HK.yml @@ -8,9 +8,6 @@ zh-HK: contact: 聯絡 contact_missing: 未設定 contact_unavailable: 未公開 - extended_description_html: | -

這裡可以寫一些網站規則

-

本站未有詳細介紹

generic_description: "%{domain} 是 Mastodon 網絡中其中一個服務站" hosted_on: 在 %{domain} 運作的 Mastodon 服務站 learn_more: 了解更多 @@ -465,9 +462,6 @@ zh-HK: too_many: 不可以加入超過 4 個檔案 migrations: acct: 新帳戶的 用戶名@域名 - currently_redirecting: 目前你的個人資料頁顯示的新帳戶是: - proceed: 保存 - updated_msg: 帳戶遷移設置更新成功! moderation: title: 營運 notification_mailer: diff --git a/config/locales/zh-TW.yml b/config/locales/zh-TW.yml index 8bdbf87aa..7750d596b 100644 --- a/config/locales/zh-TW.yml +++ b/config/locales/zh-TW.yml @@ -16,9 +16,6 @@ zh-TW: contact_unavailable: 未公開 discover_users: 探索使用者 documentation: 文件 - extended_description_html: | -

這裡可以寫一些網站規則

-

本站點未有詳細介紹

generic_description: "%{domain} 是 Mastodon 網路中其中一個站點" get_apps: 嘗試行動應用程式 hosted_on: 在 %{domain} 運作的 Mastodon 站點 @@ -535,9 +532,6 @@ zh-TW: too_many: 無法加入超過 4 個檔案 migrations: acct: 新帳戶的 使用者名稱@站點網域 - currently_redirecting: 目前你的個人資料頁顯示的新帳戶是: - proceed: 儲存 - updated_msg: 帳戶搬遷設定更新成功! moderation: title: 營運 notification_mailer: From e35636a0d16f3154970d71a305574e59fa2ad393 Mon Sep 17 00:00:00 2001 From: Takeshi Umeda Date: Sat, 21 Sep 2019 09:59:37 +0900 Subject: [PATCH 125/134] Fixed an error in the aliases template of the aliases controller (#11902) --- app/controllers/settings/aliases_controller.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/controllers/settings/aliases_controller.rb b/app/controllers/settings/aliases_controller.rb index 2b675f065..da0a4a9fa 100644 --- a/app/controllers/settings/aliases_controller.rb +++ b/app/controllers/settings/aliases_controller.rb @@ -17,7 +17,7 @@ class Settings::AliasesController < Settings::BaseController if @alias.save redirect_to settings_aliases_path, notice: I18n.t('aliases.created_msg') else - render :show + render :index end end From f497d14b19ce150ee19e6478c9018833e28c7d52 Mon Sep 17 00:00:00 2001 From: Takeshi Umeda Date: Sat, 21 Sep 2019 16:11:21 +0900 Subject: [PATCH 126/134] Addition of update activity distribution by alias, minor correction (#11905) * Addition of update activity distribution by alias, minor correction * Distribute Update activity after adding alias * Add uniqueness verification to alias uri * accept acct starting with @ * fix double-quoted to single-quoted --- app/controllers/settings/aliases_controller.rb | 1 + app/models/account_alias.rb | 6 ++++++ 2 files changed, 7 insertions(+) diff --git a/app/controllers/settings/aliases_controller.rb b/app/controllers/settings/aliases_controller.rb index da0a4a9fa..b7c9a409d 100644 --- a/app/controllers/settings/aliases_controller.rb +++ b/app/controllers/settings/aliases_controller.rb @@ -15,6 +15,7 @@ class Settings::AliasesController < Settings::BaseController @alias = current_account.aliases.build(resource_params) if @alias.save + ActivityPub::UpdateDistributionWorker.perform_async(current_account.id) redirect_to settings_aliases_path, notice: I18n.t('aliases.created_msg') else render :index diff --git a/app/models/account_alias.rb b/app/models/account_alias.rb index e9a0dd79e..66f8ce409 100644 --- a/app/models/account_alias.rb +++ b/app/models/account_alias.rb @@ -17,11 +17,17 @@ class AccountAlias < ApplicationRecord validates :acct, presence: true, domain: { acct: true } validates :uri, presence: true + validates :uri, uniqueness: { scope: :account_id } before_validation :set_uri after_create :add_to_account after_destroy :remove_from_account + def acct=(val) + val = val.to_s.strip + super(val.start_with?('@') ? val[1..-1] : val) + end + private def set_uri From b18aea91e3b7c89338c2b0cd07e037e6557514ee Mon Sep 17 00:00:00 2001 From: Takeshi Umeda Date: Sat, 21 Sep 2019 16:11:38 +0900 Subject: [PATCH 127/134] Accept acct starting with @ in account migration (#11907) --- app/models/account_migration.rb | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/app/models/account_migration.rb b/app/models/account_migration.rb index 15830bffb..e2c2cb085 100644 --- a/app/models/account_migration.rb +++ b/app/models/account_migration.rb @@ -46,6 +46,11 @@ class AccountMigration < ApplicationRecord created_at + COOLDOWN_PERIOD end + def acct=(val) + val = val.to_s.strip + super(val.start_with?('@') ? val[1..-1] : val) + end + private def set_target_account From a90243a712ac17708de898e302e337de05b7699d Mon Sep 17 00:00:00 2001 From: Takeshi Umeda Date: Sat, 21 Sep 2019 16:11:58 +0900 Subject: [PATCH 128/134] Fixed missing account in MoveDistributionWorker (#11906) --- app/workers/activitypub/move_distribution_worker.rb | 1 + 1 file changed, 1 insertion(+) diff --git a/app/workers/activitypub/move_distribution_worker.rb b/app/workers/activitypub/move_distribution_worker.rb index 396d5258f..bf1c0e7ae 100644 --- a/app/workers/activitypub/move_distribution_worker.rb +++ b/app/workers/activitypub/move_distribution_worker.rb @@ -8,6 +8,7 @@ class ActivityPub::MoveDistributionWorker def perform(migration_id) @migration = AccountMigration.find(migration_id) + @account = @migration.account ActivityPub::DeliveryWorker.push_bulk(inboxes) do |inbox_url| [signed_payload, @account.id, inbox_url] From ba0de8fb68f5e67312446d1ac351f06d093fc2b8 Mon Sep 17 00:00:00 2001 From: Eugen Rochko Date: Sat, 21 Sep 2019 09:12:13 +0200 Subject: [PATCH 129/134] Fix updates being hidden behind pending items on unmounted components (#11898) --- app/javascript/mastodon/actions/notifications.js | 11 +++++++++++ .../mastodon/components/scrollable_list.js | 5 +++++ .../mastodon/features/notifications/index.js | 7 ++++++- app/javascript/mastodon/reducers/notifications.js | 14 +++++++++++--- 4 files changed, 33 insertions(+), 4 deletions(-) diff --git a/app/javascript/mastodon/actions/notifications.js b/app/javascript/mastodon/actions/notifications.js index ea76255e3..58803d1ae 100644 --- a/app/javascript/mastodon/actions/notifications.js +++ b/app/javascript/mastodon/actions/notifications.js @@ -28,6 +28,9 @@ export const NOTIFICATIONS_CLEAR = 'NOTIFICATIONS_CLEAR'; export const NOTIFICATIONS_SCROLL_TOP = 'NOTIFICATIONS_SCROLL_TOP'; export const NOTIFICATIONS_LOAD_PENDING = 'NOTIFICATIONS_LOAD_PENDING'; +export const NOTIFICATIONS_MOUNT = 'NOTIFICATIONS_MOUNT'; +export const NOTIFICATIONS_UNMOUNT = 'NOTIFICATIONS_UNMOUNT'; + defineMessages({ mention: { id: 'notification.mention', defaultMessage: '{name} mentioned you' }, group: { id: 'notifications.group', defaultMessage: '{count} notifications' }, @@ -215,3 +218,11 @@ export function setFilter (filterType) { dispatch(saveSettings()); }; }; + +export const mountNotifications = () => ({ + type: NOTIFICATIONS_MOUNT, +}); + +export const unmountNotifications = () => ({ + type: NOTIFICATIONS_UNMOUNT, +}); diff --git a/app/javascript/mastodon/components/scrollable_list.js b/app/javascript/mastodon/components/scrollable_list.js index 253646ed0..b8fa0c2d9 100644 --- a/app/javascript/mastodon/components/scrollable_list.js +++ b/app/javascript/mastodon/components/scrollable_list.js @@ -199,7 +199,12 @@ export default class ScrollableList extends PureComponent { this.clearMouseIdleTimer(); this.detachScrollListener(); this.detachIntersectionObserver(); + detachFullscreenListener(this.onFullScreenChange); + + if (this.props.onScrollToTop) { + this.props.onScrollToTop(); + } } onFullScreenChange = () => { diff --git a/app/javascript/mastodon/features/notifications/index.js b/app/javascript/mastodon/features/notifications/index.js index 7e5de0613..d16a0f33a 100644 --- a/app/javascript/mastodon/features/notifications/index.js +++ b/app/javascript/mastodon/features/notifications/index.js @@ -4,7 +4,7 @@ import PropTypes from 'prop-types'; import ImmutablePropTypes from 'react-immutable-proptypes'; import Column from '../../components/column'; import ColumnHeader from '../../components/column_header'; -import { expandNotifications, scrollTopNotifications, loadPending } from '../../actions/notifications'; +import { expandNotifications, scrollTopNotifications, loadPending, mountNotifications, unmountNotifications } from '../../actions/notifications'; import { addColumn, removeColumn, moveColumn } from '../../actions/columns'; import NotificationContainer from './containers/notification_container'; import { defineMessages, injectIntl, FormattedMessage } from 'react-intl'; @@ -66,11 +66,16 @@ class Notifications extends React.PureComponent { trackScroll: true, }; + componentWillMount() { + this.props.dispatch(mountNotifications()); + } + componentWillUnmount () { this.handleLoadOlder.cancel(); this.handleScrollToTop.cancel(); this.handleScroll.cancel(); this.props.dispatch(scrollTopNotifications(false)); + this.props.dispatch(unmountNotifications()); } handleLoadGap = (maxId) => { diff --git a/app/javascript/mastodon/reducers/notifications.js b/app/javascript/mastodon/reducers/notifications.js index 45d3a5c51..aac644950 100644 --- a/app/javascript/mastodon/reducers/notifications.js +++ b/app/javascript/mastodon/reducers/notifications.js @@ -7,6 +7,8 @@ import { NOTIFICATIONS_CLEAR, NOTIFICATIONS_SCROLL_TOP, NOTIFICATIONS_LOAD_PENDING, + NOTIFICATIONS_MOUNT, + NOTIFICATIONS_UNMOUNT, } from '../actions/notifications'; import { ACCOUNT_BLOCK_SUCCESS, @@ -22,6 +24,7 @@ const initialState = ImmutableMap({ items: ImmutableList(), hasMore: true, top: false, + mounted: false, unread: 0, isLoading: false, }); @@ -35,9 +38,10 @@ const notificationToMap = notification => ImmutableMap({ }); const normalizeNotification = (state, notification, usePendingItems) => { - const top = state.get('top'); + const top = state.get('top'); + const mounted = state.get('mounted'); - if (usePendingItems || !top || !state.get('pendingItems').isEmpty()) { + if (usePendingItems || (!top && mounted) || !state.get('pendingItems').isEmpty()) { return state.update('pendingItems', list => list.unshift(notificationToMap(notification))).update('unread', unread => unread + 1); } @@ -63,7 +67,7 @@ const expandNormalizedNotifications = (state, notifications, next, isLoadingRece return state.withMutations(mutable => { if (!items.isEmpty()) { - usePendingItems = isLoadingRecent && (usePendingItems || !mutable.get('top') || !mutable.get('pendingItems').isEmpty()); + usePendingItems = isLoadingRecent && (usePendingItems || (!mutable.get('top') && mutable.get('mounted')) || !mutable.get('pendingItems').isEmpty()); mutable.update(usePendingItems ? 'pendingItems' : 'items', list => { const lastIndex = 1 + list.findLastIndex( @@ -134,6 +138,10 @@ export default function notifications(state = initialState, action) { return action.timeline === 'home' ? state.update(action.usePendingItems ? 'pendingItems' : 'items', items => items.first() ? items.unshift(null) : items) : state; + case NOTIFICATIONS_MOUNT: + return state.set('mounted', true); + case NOTIFICATIONS_UNMOUNT: + return state.set('mounted', false); default: return state; } From 33b2e0f1895f981c13e3257badcd1210c3d86946 Mon Sep 17 00:00:00 2001 From: Eugen Rochko Date: Sat, 21 Sep 2019 20:01:02 +0200 Subject: [PATCH 130/134] Fix "reason" prefix being shown with no reason for public blocks (#11908) --- app/views/about/more.html.haml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/views/about/more.html.haml b/app/views/about/more.html.haml index 4b3035ee8..cba2fe657 100644 --- a/app/views/about/more.html.haml +++ b/app/views/about/more.html.haml @@ -65,7 +65,7 @@ = t('about.unavailable_content_description.silenced') if domain_block.silence? = t('about.unavailable_content_description.rejecting_media') if domain_block.reject_media? - - if display_blocks_rationale? + - if display_blocks_rationale? && domain_block.public_comment.present? %strong= t('about.unavailable_content_description.reason') = domain_block.public_comment From bc5678d0151dd96e0ec5f3d4084ac6356c1d02f5 Mon Sep 17 00:00:00 2001 From: Eugen Rochko Date: Sat, 21 Sep 2019 20:01:16 +0200 Subject: [PATCH 131/134] Change conversations UI (#11896) Fix #11414, fix #9860, fix #10434 --- .../mastodon/actions/conversations.js | 28 ++++ .../mastodon/components/avatar_composite.js | 28 ++-- .../mastodon/containers/status_container.js | 1 + .../components/conversation.js | 130 +++++++++++++++--- .../containers/conversation_container.js | 75 ++++++++-- .../styles/mastodon/components.scss | 99 ++++++++----- 6 files changed, 286 insertions(+), 75 deletions(-) diff --git a/app/javascript/mastodon/actions/conversations.js b/app/javascript/mastodon/actions/conversations.js index c6e062ef7..4ef654b1f 100644 --- a/app/javascript/mastodon/actions/conversations.js +++ b/app/javascript/mastodon/actions/conversations.js @@ -15,6 +15,10 @@ export const CONVERSATIONS_UPDATE = 'CONVERSATIONS_UPDATE'; export const CONVERSATIONS_READ = 'CONVERSATIONS_READ'; +export const CONVERSATIONS_DELETE_REQUEST = 'CONVERSATIONS_DELETE_REQUEST'; +export const CONVERSATIONS_DELETE_SUCCESS = 'CONVERSATIONS_DELETE_SUCCESS'; +export const CONVERSATIONS_DELETE_FAIL = 'CONVERSATIONS_DELETE_FAIL'; + export const mountConversations = () => ({ type: CONVERSATIONS_MOUNT, }); @@ -82,3 +86,27 @@ export const updateConversations = conversation => dispatch => { conversation, }); }; + +export const deleteConversation = conversationId => (dispatch, getState) => { + dispatch(deleteConversationRequest(conversationId)); + + api(getState).delete(`/api/v1/conversations/${conversationId}`) + .then(() => dispatch(deleteConversationSuccess(conversationId))) + .catch(error => dispatch(deleteConversationFail(conversationId, error))); +}; + +export const deleteConversationRequest = id => ({ + type: CONVERSATIONS_DELETE_REQUEST, + id, +}); + +export const deleteConversationSuccess = id => ({ + type: CONVERSATIONS_DELETE_SUCCESS, + id, +}); + +export const deleteConversationFail = (id, error) => ({ + type: CONVERSATIONS_DELETE_FAIL, + id, + error, +}); diff --git a/app/javascript/mastodon/components/avatar_composite.js b/app/javascript/mastodon/components/avatar_composite.js index 4a9a73c51..5d5b89749 100644 --- a/app/javascript/mastodon/components/avatar_composite.js +++ b/app/javascript/mastodon/components/avatar_composite.js @@ -35,35 +35,35 @@ export default class AvatarComposite extends React.PureComponent { if (size === 2) { if (index === 0) { - right = '2px'; + right = '1px'; } else { - left = '2px'; + left = '1px'; } } else if (size === 3) { if (index === 0) { - right = '2px'; + right = '1px'; } else if (index > 0) { - left = '2px'; + left = '1px'; } if (index === 1) { - bottom = '2px'; + bottom = '1px'; } else if (index > 1) { - top = '2px'; + top = '1px'; } } else if (size === 4) { if (index === 0 || index === 2) { - right = '2px'; + right = '1px'; } if (index === 1 || index === 3) { - left = '2px'; + left = '1px'; } if (index < 2) { - bottom = '2px'; + bottom = '1px'; } else { - top = '2px'; + top = '1px'; } } @@ -88,7 +88,13 @@ export default class AvatarComposite extends React.PureComponent { return (
- {accounts.take(4).map((account, i) => this.renderItem(account, accounts.size, i))} + {accounts.take(4).map((account, i) => this.renderItem(account, Math.min(accounts.size, 4), i))} + + {accounts.size > 4 && ( + + +{accounts.size - 4} + + )}
); } diff --git a/app/javascript/mastodon/containers/status_container.js b/app/javascript/mastodon/containers/status_container.js index fa58589a6..7b0906b39 100644 --- a/app/javascript/mastodon/containers/status_container.js +++ b/app/javascript/mastodon/containers/status_container.js @@ -56,6 +56,7 @@ const mapDispatchToProps = (dispatch, { intl }) => ({ onReply (status, router) { dispatch((_, getState) => { let state = getState(); + if (state.getIn(['compose', 'text']).trim().length !== 0) { dispatch(openModal('CONFIRM', { message: intl.formatMessage(messages.replyMessage), diff --git a/app/javascript/mastodon/features/direct_timeline/components/conversation.js b/app/javascript/mastodon/features/direct_timeline/components/conversation.js index ffcd6d281..cc3faf0de 100644 --- a/app/javascript/mastodon/features/direct_timeline/components/conversation.js +++ b/app/javascript/mastodon/features/direct_timeline/components/conversation.js @@ -2,9 +2,28 @@ import React from 'react'; import PropTypes from 'prop-types'; import ImmutablePropTypes from 'react-immutable-proptypes'; import ImmutablePureComponent from 'react-immutable-pure-component'; -import StatusContainer from '../../../containers/status_container'; +import StatusContent from 'mastodon/components/status_content'; +import AttachmentList from 'mastodon/components/attachment_list'; +import { defineMessages, injectIntl, FormattedMessage } from 'react-intl'; +import DropdownMenuContainer from 'mastodon/containers/dropdown_menu_container'; +import AvatarComposite from 'mastodon/components/avatar_composite'; +import Permalink from 'mastodon/components/permalink'; +import IconButton from 'mastodon/components/icon_button'; +import RelativeTimestamp from 'mastodon/components/relative_timestamp'; +import { HotKeys } from 'react-hotkeys'; -export default class Conversation extends ImmutablePureComponent { +const messages = defineMessages({ + more: { id: 'status.more', defaultMessage: 'More' }, + open: { id: 'conversation.open', defaultMessage: 'View conversation' }, + reply: { id: 'status.reply', defaultMessage: 'Reply' }, + markAsRead: { id: 'conversation.mark_as_read', defaultMessage: 'Mark as read' }, + delete: { id: 'conversation.delete', defaultMessage: 'Delete conversation' }, + muteConversation: { id: 'status.mute_conversation', defaultMessage: 'Mute conversation' }, + unmuteConversation: { id: 'status.unmute_conversation', defaultMessage: 'Unmute conversation' }, +}); + +export default @injectIntl +class Conversation extends ImmutablePureComponent { static contextTypes = { router: PropTypes.object, @@ -13,11 +32,12 @@ export default class Conversation extends ImmutablePureComponent { static propTypes = { conversationId: PropTypes.string.isRequired, accounts: ImmutablePropTypes.list.isRequired, - lastStatusId: PropTypes.string, + lastStatus: ImmutablePropTypes.map, unread:PropTypes.bool.isRequired, onMoveUp: PropTypes.func, onMoveDown: PropTypes.func, markRead: PropTypes.func.isRequired, + intl: PropTypes.object.isRequired, }; handleClick = () => { @@ -25,13 +45,25 @@ export default class Conversation extends ImmutablePureComponent { return; } - const { lastStatusId, unread, markRead } = this.props; + const { lastStatus, unread, markRead } = this.props; if (unread) { markRead(); } - this.context.router.history.push(`/statuses/${lastStatusId}`); + this.context.router.history.push(`/statuses/${lastStatus.get('id')}`); + } + + handleMarkAsRead = () => { + this.props.markRead(); + } + + handleReply = () => { + this.props.reply(this.props.lastStatus, this.context.router.history); + } + + handleDelete = () => { + this.props.delete(); } handleHotkeyMoveUp = () => { @@ -42,22 +74,88 @@ export default class Conversation extends ImmutablePureComponent { this.props.onMoveDown(this.props.conversationId); } - render () { - const { accounts, lastStatusId, unread } = this.props; + handleConversationMute = () => { + this.props.onMute(this.props.lastStatus); + } - if (lastStatusId === null) { + handleShowMore = () => { + this.props.onToggleHidden(this.props.lastStatus); + } + + render () { + const { accounts, lastStatus, unread, intl } = this.props; + + if (lastStatus === null) { return null; } + const menu = [ + { text: intl.formatMessage(messages.open), action: this.handleClick }, + null, + ]; + + menu.push({ text: intl.formatMessage(lastStatus.get('muted') ? messages.unmuteConversation : messages.muteConversation), action: this.handleConversationMute }); + + if (unread) { + menu.push({ text: intl.formatMessage(messages.markAsRead), action: this.handleMarkAsRead }); + menu.push(null); + } + + menu.push({ text: intl.formatMessage(messages.delete), action: this.handleDelete }); + + const names = accounts.map(a => ).reduce((prev, cur) => [prev, ', ', cur]); + + const handlers = { + reply: this.handleReply, + open: this.handleClick, + moveUp: this.handleHotkeyMoveUp, + moveDown: this.handleHotkeyMoveDown, + toggleHidden: this.handleShowMore, + }; + return ( - + +
+
+ +
+ +
+
+
+ +
+ +
+ {names} }} /> +
+
+ + + + {lastStatus.get('media_attachments').size > 0 && ( + + )} + +
+ + +
+ +
+
+
+
+
); } diff --git a/app/javascript/mastodon/features/direct_timeline/containers/conversation_container.js b/app/javascript/mastodon/features/direct_timeline/containers/conversation_container.js index bd6f6bfb0..94cef81a7 100644 --- a/app/javascript/mastodon/features/direct_timeline/containers/conversation_container.js +++ b/app/javascript/mastodon/features/direct_timeline/containers/conversation_container.js @@ -1,19 +1,74 @@ import { connect } from 'react-redux'; import Conversation from '../components/conversation'; -import { markConversationRead } from '../../../actions/conversations'; +import { markConversationRead, deleteConversation } from 'mastodon/actions/conversations'; +import { makeGetStatus } from 'mastodon/selectors'; +import { replyCompose } from 'mastodon/actions/compose'; +import { openModal } from 'mastodon/actions/modal'; +import { muteStatus, unmuteStatus, hideStatus, revealStatus } from 'mastodon/actions/statuses'; +import { defineMessages, injectIntl } from 'react-intl'; -const mapStateToProps = (state, { conversationId }) => { - const conversation = state.getIn(['conversations', 'items']).find(x => x.get('id') === conversationId); +const messages = defineMessages({ + replyConfirm: { id: 'confirmations.reply.confirm', defaultMessage: 'Reply' }, + replyMessage: { id: 'confirmations.reply.message', defaultMessage: 'Replying now will overwrite the message you are currently composing. Are you sure you want to proceed?' }, +}); - return { - accounts: conversation.get('accounts').map(accountId => state.getIn(['accounts', accountId], null)), - unread: conversation.get('unread'), - lastStatusId: conversation.get('last_status', null), +const mapStateToProps = () => { + const getStatus = makeGetStatus(); + + return (state, { conversationId }) => { + const conversation = state.getIn(['conversations', 'items']).find(x => x.get('id') === conversationId); + const lastStatusId = conversation.get('last_status', null); + + return { + accounts: conversation.get('accounts').map(accountId => state.getIn(['accounts', accountId], null)), + unread: conversation.get('unread'), + lastStatus: lastStatusId && getStatus(state, { id: lastStatusId }), + }; }; }; -const mapDispatchToProps = (dispatch, { conversationId }) => ({ - markRead: () => dispatch(markConversationRead(conversationId)), +const mapDispatchToProps = (dispatch, { intl, conversationId }) => ({ + + markRead () { + dispatch(markConversationRead(conversationId)); + }, + + reply (status, router) { + dispatch((_, getState) => { + let state = getState(); + + if (state.getIn(['compose', 'text']).trim().length !== 0) { + dispatch(openModal('CONFIRM', { + message: intl.formatMessage(messages.replyMessage), + confirm: intl.formatMessage(messages.replyConfirm), + onConfirm: () => dispatch(replyCompose(status, router)), + })); + } else { + dispatch(replyCompose(status, router)); + } + }); + }, + + delete () { + dispatch(deleteConversation(conversationId)); + }, + + onMute (status) { + if (status.get('muted')) { + dispatch(unmuteStatus(status.get('id'))); + } else { + dispatch(muteStatus(status.get('id'))); + } + }, + + onToggleHidden (status) { + if (status.get('hidden')) { + dispatch(revealStatus(status.get('id'))); + } else { + dispatch(hideStatus(status.get('id'))); + } + }, + }); -export default connect(mapStateToProps, mapDispatchToProps)(Conversation); +export default injectIntl(connect(mapStateToProps, mapDispatchToProps)(Conversation)); diff --git a/app/javascript/styles/mastodon/components.scss b/app/javascript/styles/mastodon/components.scss index 17c94e23c..f4f26203e 100644 --- a/app/javascript/styles/mastodon/components.scss +++ b/app/javascript/styles/mastodon/components.scss @@ -1276,14 +1276,28 @@ &-composite { @include avatar-radius; + border-radius: 50%; overflow: hidden; + position: relative; + cursor: default; & > div { - @include avatar-radius; float: left; position: relative; box-sizing: border-box; } + + &__label { + display: block; + position: absolute; + top: 50%; + left: 50%; + transform: translate(-50%, -50%); + color: $primary-text-color; + text-shadow: 1px 1px 2px $base-shadow-color; + font-weight: 700; + font-size: 15px; + } } } @@ -6383,48 +6397,57 @@ noscript { } } -.layout-toggle { +.conversation { display: flex; + border-bottom: 1px solid lighten($ui-base-color, 8%); padding: 5px; + padding-bottom: 0; - button { - box-sizing: border-box; - flex: 0 0 50%; - background: transparent; - padding: 5px; - border: 0; - position: relative; + &:focus { + background: lighten($ui-base-color, 2%); + outline: 0; + } - &:hover, - &:focus, - &:active { - svg path:first-child { - fill: lighten($ui-base-color, 16%); + &__avatar { + flex: 0 0 auto; + padding: 10px; + padding-top: 12px; + } + + &__content { + flex: 1 1 auto; + padding: 10px 5px; + padding-right: 15px; + + &__info { + overflow: hidden; + } + + &__relative-time { + float: right; + font-size: 15px; + color: $darker-text-color; + padding-left: 15px; + } + + &__names { + color: $darker-text-color; + font-size: 15px; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + margin-bottom: 4px; + + a { + color: $primary-text-color; + text-decoration: none; + + &:hover, + &:focus, + &:active { + text-decoration: underline; + } } } } - - svg { - width: 100%; - height: auto; - - path:first-child { - fill: lighten($ui-base-color, 12%); - } - - path:last-child { - fill: darken($ui-base-color, 14%); - } - } - - &__active { - color: $ui-highlight-color; - position: absolute; - top: 50%; - left: 50%; - transform: translate(-50%, -50%); - background: lighten($ui-base-color, 12%); - border-radius: 50%; - padding: 0.35rem; - } } From e87bcaa10761b73d22a6b826e8aa7eebf316bad3 Mon Sep 17 00:00:00 2001 From: Eugen Rochko Date: Sat, 21 Sep 2019 20:02:14 +0200 Subject: [PATCH 132/134] Bump version to 3.0.0rc1 (#11900) --- CHANGELOG.md | 4 ++++ lib/mastodon/version.rb | 18 +++++++++--------- 2 files changed, 13 insertions(+), 9 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index a17fbf8f0..d8f7c77d3 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,10 @@ Changelog All notable changes to this project will be documented in this file. +## Unreleased + +TODO + ## [2.9.3] - 2019-08-10 ### Added diff --git a/lib/mastodon/version.rb b/lib/mastodon/version.rb index 99d709c98..bd49f0a17 100644 --- a/lib/mastodon/version.rb +++ b/lib/mastodon/version.rb @@ -5,19 +5,19 @@ module Mastodon module_function def major - 2 - end - - def minor - 9 - end - - def patch 3 end + def minor + 0 + end + + def patch + 0 + end + def flags - '' + 'rc1' end def suffix From b240f7873f1ffbaf77bda715848005fadbec1701 Mon Sep 17 00:00:00 2001 From: Eugen Rochko Date: Sat, 21 Sep 2019 20:04:43 +0200 Subject: [PATCH 133/134] New Crowdin translations (#11901) * New translations en.json (Armenian) [ci skip] * New translations doorkeeper.en.yml (Italian) [ci skip] * New translations en.yml (Greek) [ci skip] * New translations doorkeeper.en.yml (Greek) [ci skip] * New translations en.json (Hungarian) [ci skip] * New translations en.yml (Hungarian) [ci skip] * New translations doorkeeper.en.yml (Hungarian) [ci skip] * New translations en.json (Italian) [ci skip] * New translations en.yml (Italian) [ci skip] * New translations en.json (Japanese) [ci skip] * New translations doorkeeper.en.yml (German) [ci skip] * New translations en.yml (Japanese) [ci skip] * New translations doorkeeper.en.yml (Japanese) [ci skip] * New translations en.json (Kazakh) [ci skip] * New translations en.yml (Kazakh) [ci skip] * New translations doorkeeper.en.yml (Kazakh) [ci skip] * New translations en.json (Korean) [ci skip] * New translations en.yml (Korean) [ci skip] * New translations doorkeeper.en.yml (Korean) [ci skip] * New translations en.json (Greek) [ci skip] * New translations en.yml (German) [ci skip] * New translations en.yml (Estonian) [ci skip] * New translations doorkeeper.en.yml (Danish) [ci skip] * New translations en.json (Dutch) [ci skip] * New translations en.yml (Dutch) [ci skip] * New translations doorkeeper.en.yml (Dutch) [ci skip] * New translations en.json (Esperanto) [ci skip] * New translations en.yml (Esperanto) [ci skip] * New translations doorkeeper.en.yml (Esperanto) [ci skip] * New translations en.json (Estonian) [ci skip] * New translations doorkeeper.en.yml (Estonian) [ci skip] * New translations en.json (German) [ci skip] * New translations en.json (Finnish) [ci skip] * New translations en.yml (Finnish) [ci skip] * New translations doorkeeper.en.yml (Finnish) [ci skip] * New translations en.json (French) [ci skip] * New translations doorkeeper.en.yml (French) [ci skip] * New translations en.json (Galician) [ci skip] * New translations en.yml (Galician) [ci skip] * New translations doorkeeper.en.yml (Galician) [ci skip] * New translations en.yml (Norwegian Nynorsk) [ci skip] * New translations en.json (Occitan) [ci skip] * New translations en.json (Danish) [ci skip] * New translations en.yml (Telugu) [ci skip] * New translations en.json (Swedish) [ci skip] * New translations en.yml (Swedish) [ci skip] * New translations doorkeeper.en.yml (Swedish) [ci skip] * New translations en.json (Tamil) [ci skip] * New translations en.yml (Tamil) [ci skip] * New translations en.json (Telugu) [ci skip] * New translations en.yml (Spanish) [ci skip] * New translations en.json (Thai) [ci skip] * New translations en.yml (Thai) [ci skip] * New translations doorkeeper.en.yml (Thai) [ci skip] * New translations en.json (Turkish) [ci skip] * New translations en.yml (Turkish) [ci skip] * New translations doorkeeper.en.yml (Turkish) [ci skip] * New translations en.json (Welsh) [ci skip] * New translations en.yml (Welsh) [ci skip] * New translations doorkeeper.en.yml (Spanish) [ci skip] * New translations en.json (Spanish) [ci skip] * New translations en.yml (Occitan) [ci skip] * New translations en.yml (Portuguese) [ci skip] * New translations doorkeeper.en.yml (Occitan) [ci skip] * New translations en.json (Persian) [ci skip] * New translations en.yml (Persian) [ci skip] * New translations doorkeeper.en.yml (Persian) [ci skip] * New translations en.json (Polish) [ci skip] * New translations en.yml (Polish) [ci skip] * New translations doorkeeper.en.yml (Polish) [ci skip] * New translations en.json (Portuguese) [ci skip] * New translations doorkeeper.en.yml (Portuguese) [ci skip] * New translations doorkeeper.en.yml (Slovenian) [ci skip] * New translations en.json (Portuguese, Brazilian) [ci skip] * New translations en.yml (Portuguese, Brazilian) [ci skip] * New translations doorkeeper.en.yml (Portuguese, Brazilian) [ci skip] * New translations en.json (Romanian) [ci skip] * New translations en.yml (Romanian) [ci skip] * New translations en.json (Slovenian) [ci skip] * New translations en.yml (Slovenian) [ci skip] * New translations en.yml (Danish) [ci skip] * New translations doorkeeper.en.yml (Czech) [ci skip] * New translations en.yml (Armenian) [ci skip] * New translations en.yml (Latvian) [ci skip] * New translations en.json (Ido) [ci skip] * New translations en.yml (Ido) [ci skip] * New translations doorkeeper.en.yml (Ido) [ci skip] * New translations en.json (Indonesian) [ci skip] * New translations en.yml (Indonesian) [ci skip] * New translations doorkeeper.en.yml (Indonesian) [ci skip] * New translations en.json (Latvian) [ci skip] * New translations en.yml (Hebrew) [ci skip] * New translations en.json (Lithuanian) [ci skip] * New translations en.yml (Lithuanian) [ci skip] * New translations en.json (Malay) [ci skip] * New translations en.yml (Malay) [ci skip] * New translations en.json (Norwegian) [ci skip] * New translations en.yml (Norwegian) [ci skip] * New translations doorkeeper.en.yml (Hebrew) [ci skip] * New translations en.json (Hebrew) [ci skip] * New translations en.json (Russian) [ci skip] * New translations en.yml (Bulgarian) [ci skip] * New translations en.json (Asturian) [ci skip] * New translations en.yml (Asturian) [ci skip] * New translations doorkeeper.en.yml (Asturian) [ci skip] * New translations en.json (Breton) [ci skip] * New translations en.yml (Breton) [ci skip] * New translations en.json (Bulgarian) [ci skip] * New translations doorkeeper.en.yml (Bulgarian) [ci skip] * New translations doorkeeper.en.yml (Georgian) [ci skip] * New translations en.json (Chinese Traditional, Hong Kong) [ci skip] * New translations en.yml (Chinese Traditional, Hong Kong) [ci skip] * New translations doorkeeper.en.yml (Chinese Traditional, Hong Kong) [ci skip] * New translations en.json (Croatian) [ci skip] * New translations en.yml (Croatian) [ci skip] * New translations doorkeeper.en.yml (Croatian) [ci skip] * New translations en.json (Georgian) [ci skip] * New translations en.yml (Georgian) [ci skip] * New translations doorkeeper.en.yml (Norwegian) [ci skip] * New translations en.yml (Russian) [ci skip] * New translations en.yml (Czech) [ci skip] * New translations en.json (Chinese Simplified) [ci skip] * New translations doorkeeper.en.yml (Basque) [ci skip] * New translations en.json (Bengali) [ci skip] * New translations en.yml (Bengali) [ci skip] * New translations en.json (Catalan) [ci skip] * New translations en.yml (Catalan) [ci skip] * New translations doorkeeper.en.yml (Catalan) [ci skip] * New translations en.yml (Chinese Simplified) [ci skip] * New translations en.json (Basque) [ci skip] * New translations doorkeeper.en.yml (Chinese Simplified) [ci skip] * New translations en.json (Chinese Traditional) [ci skip] * New translations en.yml (Chinese Traditional) [ci skip] * New translations doorkeeper.en.yml (Chinese Traditional) [ci skip] * New translations en.json (Corsican) [ci skip] * New translations en.yml (Corsican) [ci skip] * New translations doorkeeper.en.yml (Corsican) [ci skip] * New translations en.json (Czech) [ci skip] * New translations en.yml (Basque) [ci skip] * New translations doorkeeper.en.yml (Arabic) [ci skip] * New translations doorkeeper.en.yml (Russian) [ci skip] * New translations doorkeeper.en.yml (Slovak) [ci skip] * New translations en.json (Serbian (Cyrillic)) [ci skip] * New translations en.yml (Serbian (Cyrillic)) [ci skip] * New translations doorkeeper.en.yml (Serbian (Cyrillic)) [ci skip] * New translations en.json (Serbian (Latin)) [ci skip] * New translations en.yml (Serbian (Latin)) [ci skip] * New translations doorkeeper.en.yml (Serbian (Latin)) [ci skip] * New translations en.json (Slovak) [ci skip] * New translations en.yml (Slovak) [ci skip] * New translations en.json (Ukrainian) [ci skip] * New translations doorkeeper.en.yml (Albanian) [ci skip] * New translations en.yml (Ukrainian) [ci skip] * New translations doorkeeper.en.yml (Ukrainian) [ci skip] * New translations en.yml (French) [ci skip] * New translations en.json (Norwegian Nynorsk) [ci skip] * New translations en.json (Arabic) [ci skip] * New translations en.yml (Arabic) [ci skip] * New translations en.json (Albanian) [ci skip] * New translations en.yml (Albanian) [ci skip] * New translations doorkeeper.en.yml (Welsh) [ci skip] * New translations en.yml (Welsh) [ci skip] * New translations devise.en.yml (Welsh) [ci skip] * New translations en.yml (Welsh) [ci skip] * New translations simple_form.en.yml (Welsh) [ci skip] * New translations simple_form.en.yml (Welsh) [ci skip] * New translations simple_form.en.yml (Welsh) [ci skip] * New translations simple_form.en.yml (Welsh) [ci skip] * New translations en.json (Welsh) [ci skip] * New translations en.yml (Welsh) [ci skip] * New translations simple_form.en.yml (Welsh) [ci skip] * New translations en.json (Czech) [ci skip] * New translations en.json (Persian) [ci skip] * New translations en.json (Persian) [ci skip] * New translations en.yml (Persian) [ci skip] * New translations en.yml (Persian) [ci skip] * New translations en.yml (Persian) [ci skip] * New translations en.yml (Persian) [ci skip] * New translations en.json (German) [ci skip] * New translations en.json (Occitan) [ci skip] * New translations en.yml (Persian) [ci skip] * New translations en.json (Japanese) [ci skip] * New translations en.json (Occitan) [ci skip] * New translations en.yml (Occitan) [ci skip] * New translations simple_form.en.yml (Occitan) [ci skip] * New translations en.yml (Persian) [ci skip] * New translations en.json (French) [ci skip] * New translations en.json (Japanese) [ci skip] * New translations en.json (Portuguese, Brazilian) [ci skip] * New translations devise.en.yml (French) [ci skip] * New translations en.yml (French) [ci skip] * New translations en.json (Japanese) [ci skip] * New translations en.yml (Persian) [ci skip] * New translations en.json (Portuguese, Brazilian) [ci skip] * New translations devise.en.yml (French) [ci skip] * New translations en.yml (French) [ci skip] * New translations en.yml (Persian) [ci skip] * New translations en.json (Portuguese, Brazilian) [ci skip] * New translations en.yml (Portuguese, Brazilian) [ci skip] * New translations en.json (Spanish) [ci skip] * New translations en.yml (French) [ci skip] * New translations en.yml (Dutch) [ci skip] * New translations en.yml (Portuguese, Brazilian) [ci skip] * New translations en.json (Spanish) [ci skip] * New translations simple_form.en.yml (Spanish) [ci skip] * New translations devise.en.yml (Spanish) [ci skip] * New translations en.yml (French) [ci skip] * New translations simple_form.en.yml (French) [ci skip] * New translations en.yml (Korean) [ci skip] * New translations simple_form.en.yml (Korean) [ci skip] * New translations en.yml (Portuguese, Brazilian) [ci skip] * New translations en.yml (Spanish) [ci skip] * New translations simple_form.en.yml (Spanish) [ci skip] * New translations devise.en.yml (Korean) [ci skip] * New translations en.json (Korean) [ci skip] * New translations en.yml (Korean) [ci skip] * New translations en.yml (Portuguese, Brazilian) [ci skip] * New translations en.yml (Spanish) [ci skip] * New translations devise.en.yml (Korean) [ci skip] * New translations en.yml (Portuguese, Brazilian) [ci skip] * New translations en.json (Esperanto) [ci skip] * New translations en.yml (Esperanto) [ci skip] * New translations en.yml (Persian) [ci skip] * New translations en.yml (Portuguese, Brazilian) [ci skip] * New translations en.json (Esperanto) [ci skip] * New translations en.yml (Esperanto) [ci skip] * New translations en.yml (Persian) [ci skip] * New translations en.json (Esperanto) [ci skip] * New translations en.yml (Esperanto) [ci skip] * New translations en.yml (Persian) [ci skip] * New translations simple_form.en.yml (Persian) [ci skip] * New translations devise.en.yml (Persian) [ci skip] * New translations en.json (Esperanto) [ci skip] * New translations en.yml (Occitan) [ci skip] * New translations simple_form.en.yml (Persian) [ci skip] * New translations en.json (Esperanto) [ci skip] * New translations en.yml (Japanese) [ci skip] * i18n-tasks normalize * yarn manage:translations --- app/javascript/mastodon/locales/cs.json | 8 +- app/javascript/mastodon/locales/cy.json | 10 +- app/javascript/mastodon/locales/de.json | 8 +- app/javascript/mastodon/locales/eo.json | 68 +++++------ app/javascript/mastodon/locales/es.json | 18 +-- app/javascript/mastodon/locales/fa.json | 40 +++---- app/javascript/mastodon/locales/fr.json | 8 +- app/javascript/mastodon/locales/ja.json | 24 ++-- app/javascript/mastodon/locales/ko.json | 8 +- app/javascript/mastodon/locales/oc.json | 10 +- app/javascript/mastodon/locales/pt-BR.json | 22 ++-- config/locales/cy.yml | 25 +++++ config/locales/devise.cy.yml | 12 ++ config/locales/devise.es.yml | 12 ++ config/locales/devise.fa.yml | 12 ++ config/locales/devise.fr.yml | 12 ++ config/locales/devise.ko.yml | 12 ++ config/locales/eo.yml | 14 ++- config/locales/es.yml | 19 ++++ config/locales/fa.yml | 89 ++++++++++++++- config/locales/fr.yml | 69 +++++++++++- config/locales/ja.yml | 33 ++++++ config/locales/ko.yml | 21 ++++ config/locales/nl.yml | 26 ++++- config/locales/oc.yml | 20 ++++ config/locales/pt-BR.yml | 124 +++++++++++++++++++++ config/locales/simple_form.cy.yml | 21 ++++ config/locales/simple_form.es.yml | 14 +++ config/locales/simple_form.fa.yml | 8 ++ config/locales/simple_form.fr.yml | 12 ++ config/locales/simple_form.ko.yml | 4 + config/locales/simple_form.oc.yml | 7 ++ 32 files changed, 667 insertions(+), 123 deletions(-) diff --git a/app/javascript/mastodon/locales/cs.json b/app/javascript/mastodon/locales/cs.json index 586ca5fd5..e566d46ca 100644 --- a/app/javascript/mastodon/locales/cs.json +++ b/app/javascript/mastodon/locales/cs.json @@ -111,10 +111,10 @@ "confirmations.reply.message": "Odpovězením nyní přepíšete zprávu, kterou aktuálně píšete. Jste si jistý/á, že chcete pokračovat?", "confirmations.unfollow.confirm": "Přestat sledovat", "confirmations.unfollow.message": "jste si jistý/á, že chcete přestat sledovat uživatele {name}?", - "conversation.delete": "Delete conversation", - "conversation.mark_as_read": "Mark as read", - "conversation.open": "View conversation", - "conversation.with": "With {names}", + "conversation.delete": "Smazat konverzaci", + "conversation.mark_as_read": "Označit jako přečtenou", + "conversation.open": "Zobrazit konverzaci", + "conversation.with": "S {names}", "directory.federated": "Ze známého fedivesmíru", "directory.local": "Pouze z {domain}", "directory.new_arrivals": "Nově příchozí", diff --git a/app/javascript/mastodon/locales/cy.json b/app/javascript/mastodon/locales/cy.json index c06f0fd66..eecb43b59 100644 --- a/app/javascript/mastodon/locales/cy.json +++ b/app/javascript/mastodon/locales/cy.json @@ -25,7 +25,7 @@ "account.mute": "Tawelu @{name}", "account.mute_notifications": "Cuddio hysbysiadau o @{name}", "account.muted": "Distewyd", - "account.never_active": "Never", + "account.never_active": "Byth", "account.posts": "Tŵtiau", "account.posts_with_replies": "Tŵtiau ac atebion", "account.report": "Adrodd @{name}", @@ -63,7 +63,7 @@ "column.notifications": "Hysbysiadau", "column.pins": "Tŵtiau wedi eu pinio", "column.public": "Ffrwd y ffederasiwn", - "column.status": "Toot", + "column.status": "Tŵt", "column_back_button.label": "Nôl", "column_header.hide_settings": "Cuddio dewisiadau", "column_header.moveLeft_settings": "Symud y golofn i'r chwith", @@ -101,7 +101,7 @@ "confirmations.delete_list.message": "Ydych chi'n sicr eich bod eisiau dileu y rhestr hwn am byth?", "confirmations.domain_block.confirm": "Cuddio parth cyfan", "confirmations.domain_block.message": "A ydych yn hollol, hollol sicr eich bod am flocio y {domain} cyfan? Yn y nifer helaeth o achosion mae blocio neu tawelu ambell gyfrif yn ddigonol ac yn well. Ni fyddwch yn gweld cynnwys o'r parth hwnnw mewn unrhyw ffrydiau cyhoeddus na chwaith yn eich hysbysiadau. Bydd hyn yn cael gwared o'ch dilynwyr o'r parth hwnnw.", - "confirmations.logout.confirm": "Log out", + "confirmations.logout.confirm": "Allgofnodi", "confirmations.logout.message": "Are you sure you want to log out?", "confirmations.mute.confirm": "Tawelu", "confirmations.mute.message": "Ydych chi'n sicr eich bod am ddistewi {name}?", @@ -112,7 +112,7 @@ "confirmations.unfollow.confirm": "Dad-ddilynwch", "confirmations.unfollow.message": "Ydych chi'n sicr eich bod am ddad-ddilyn {name}?", "conversation.delete": "Delete conversation", - "conversation.mark_as_read": "Mark as read", + "conversation.mark_as_read": "Nodi fel wedi'i ddarllen", "conversation.open": "View conversation", "conversation.with": "With {names}", "directory.federated": "From known fediverse", @@ -396,7 +396,7 @@ "upload_error.limit": "Wedi mynd heibio'r uchafswm terfyn uwchlwytho.", "upload_error.poll": "Nid oes modd uwchlwytho ffeiliau â phleidleisiau.", "upload_form.description": "Disgrifio i'r rheini a nam ar ei golwg", - "upload_form.edit": "Edit", + "upload_form.edit": "Golygu", "upload_form.undo": "Dileu", "upload_modal.analyzing_picture": "Analyzing picture…", "upload_modal.apply": "Apply", diff --git a/app/javascript/mastodon/locales/de.json b/app/javascript/mastodon/locales/de.json index 566332293..58392eeca 100644 --- a/app/javascript/mastodon/locales/de.json +++ b/app/javascript/mastodon/locales/de.json @@ -111,10 +111,10 @@ "confirmations.reply.message": "Wenn du jetzt antwortest wird es die gesamte Nachricht verwerfen, die du gerade schreibst. Möchtest du wirklich fortfahren?", "confirmations.unfollow.confirm": "Entfolgen", "confirmations.unfollow.message": "Bist du dir sicher, dass du {name} entfolgen möchtest?", - "conversation.delete": "Delete conversation", - "conversation.mark_as_read": "Mark as read", - "conversation.open": "View conversation", - "conversation.with": "With {names}", + "conversation.delete": "Unterhaltung löschen", + "conversation.mark_as_read": "Als gelesen markieren", + "conversation.open": "Unterhaltung anzeigen", + "conversation.with": "Mit {names}", "directory.federated": "Aus dem Fediverse", "directory.local": "Nur von {domain}", "directory.new_arrivals": "Neue Benutzer", diff --git a/app/javascript/mastodon/locales/eo.json b/app/javascript/mastodon/locales/eo.json index 2d7fcd19b..ee224e9fb 100644 --- a/app/javascript/mastodon/locales/eo.json +++ b/app/javascript/mastodon/locales/eo.json @@ -4,7 +4,7 @@ "account.block": "Bloki @{name}", "account.block_domain": "Kaŝi ĉion de {domain}", "account.blocked": "Blokita", - "account.cancel_follow_request": "Nuligi peto de sekvado", + "account.cancel_follow_request": "Nuligi peton de sekvado", "account.direct": "Rekte mesaĝi @{name}", "account.domain_blocked": "Domajno kaŝita", "account.edit_profile": "Redakti profilon", @@ -16,14 +16,14 @@ "account.follows.empty": "Tiu uzanto ankoraŭ ne sekvas iun.", "account.follows_you": "Sekvas vin", "account.hide_reblogs": "Kaŝi diskonigojn de @{name}", - "account.last_status": "Lasta aktiva", + "account.last_status": "Laste aktiva", "account.link_verified_on": "La posedanto de tiu ligilo estis kontrolita je {date}", "account.locked_info": "La privateco de tiu konto estas elektita kiel fermita. La posedanto povas mane akcepti tiun, kiu povas sekvi rin.", "account.media": "Aŭdovidaĵoj", "account.mention": "Mencii @{name}", "account.moved_to": "{name} moviĝis al:", "account.mute": "Silentigi @{name}", - "account.mute_notifications": "Silentigi sciigojn el @{name}", + "account.mute_notifications": "Silentigi sciigojn de @{name}", "account.muted": "Silentigita", "account.never_active": "Neniam", "account.posts": "Mesaĝoj", @@ -38,8 +38,8 @@ "account.unfollow": "Ne plu sekvi", "account.unmute": "Malsilentigi @{name}", "account.unmute_notifications": "Malsilentigi sciigojn de @{name}", - "alert.rate_limited.message": "Bonvolu reprovi poste {retry_time, time, medium}.", - "alert.rate_limited.title": "Rate limited", + "alert.rate_limited.message": "Bonvolu reprovi post {retry_time, time, medium}.", + "alert.rate_limited.title": "Mesaĝkvante limigita", "alert.unexpected.message": "Neatendita eraro okazis.", "alert.unexpected.title": "Ups!", "autosuggest_hashtag.per_week": "{count} semajne", @@ -53,7 +53,7 @@ "column.blocks": "Blokitaj uzantoj", "column.community": "Loka tempolinio", "column.direct": "Rektaj mesaĝoj", - "column.directory": "Browse profiles", + "column.directory": "Trarigardi profilojn", "column.domain_blocks": "Kaŝitaj domajnoj", "column.favourites": "Stelumoj", "column.follow_requests": "Petoj de sekvado", @@ -63,7 +63,7 @@ "column.notifications": "Sciigoj", "column.pins": "Alpinglitaj mesaĝoj", "column.public": "Fratara tempolinio", - "column.status": "Toot", + "column.status": "Mesaĝo", "column_back_button.label": "Reveni", "column_header.hide_settings": "Kaŝi agordojn", "column_header.moveLeft_settings": "Movi kolumnon maldekstren", @@ -79,10 +79,10 @@ "compose_form.lock_disclaimer": "Via konta ne estas {locked}. Iu ajn povas sekvi vin por vidi viajn mesaĝojn, kiuj estas nur por sekvantoj.", "compose_form.lock_disclaimer.lock": "ŝlosita", "compose_form.placeholder": "Pri kio vi pensas?", - "compose_form.poll.add_option": "Aldoni elekto", + "compose_form.poll.add_option": "Aldoni elekteblon", "compose_form.poll.duration": "Balotenketa daŭro", - "compose_form.poll.option_placeholder": "elekto {number}", - "compose_form.poll.remove_option": "Forigi ĉi tiu elekton", + "compose_form.poll.option_placeholder": "Elekteblo {number}", + "compose_form.poll.remove_option": "Forigi ĉi tiu elekteblon", "compose_form.publish": "Hup", "compose_form.publish_loud": "{publish}!", "compose_form.sensitive.hide": "Marki la aŭdovidaĵojn kiel tiklaj", @@ -92,7 +92,7 @@ "compose_form.spoiler.unmarked": "Teksto ne kaŝita", "compose_form.spoiler_placeholder": "Skribu vian averton ĉi tie", "confirmation_modal.cancel": "Nuligi", - "confirmations.block.block_and_report": "Bloki & Signali", + "confirmations.block.block_and_report": "Bloki kaj signali", "confirmations.block.confirm": "Bloki", "confirmations.block.message": "Ĉu vi certas, ke vi volas bloki {name}?", "confirmations.delete.confirm": "Forigi", @@ -111,14 +111,14 @@ "confirmations.reply.message": "Respondi nun anstataŭigos la mesaĝon, kiun vi nun skribas. Ĉu vi certas, ke vi volas daŭrigi?", "confirmations.unfollow.confirm": "Ne plu sekvi", "confirmations.unfollow.message": "Ĉu vi certas, ke vi volas ĉesi sekvi {name}?", - "conversation.delete": "Delete conversation", - "conversation.mark_as_read": "Mark as read", - "conversation.open": "View conversation", - "conversation.with": "With {names}", + "conversation.delete": "Forigi konversacion", + "conversation.mark_as_read": "Marki legita", + "conversation.open": "Vidi konversacion", + "conversation.with": "Kun {names}", "directory.federated": "El konata fediverso", "directory.local": "Nur de {domain}", - "directory.new_arrivals": "Novaj veniĝoj", - "directory.recently_active": "Recently active", + "directory.new_arrivals": "Novaj alvenoj", + "directory.recently_active": "Lastatempe aktiva", "embed.instructions": "Enkorpigu ĉi tiun mesaĝon en vian retejon per kopio de la suba kodo.", "embed.preview": "Ĝi aperos tiel:", "emoji_button.activity": "Agadoj", @@ -170,18 +170,18 @@ "hashtag.column_settings.tag_mode.all": "Ĉiuj", "hashtag.column_settings.tag_mode.any": "Iu ajn", "hashtag.column_settings.tag_mode.none": "Neniu", - "hashtag.column_settings.tag_toggle": "Inkluzivi pluajn etikedojn por ĉi tiu kolumno", + "hashtag.column_settings.tag_toggle": "Aldoni pliajn etikedojn por ĉi tiu kolumno", "home.column_settings.basic": "Bazaj agordoj", "home.column_settings.show_reblogs": "Montri diskonigojn", "home.column_settings.show_replies": "Montri respondojn", - "home.column_settings.update_live": "Update in real-time", + "home.column_settings.update_live": "Tuje ĝisdatigi", "intervals.full.days": "{number, plural, one {# tago} other {# tagoj}}", "intervals.full.hours": "{number, plural, one {# horo} other {# horoj}}", "intervals.full.minutes": "{number, plural, one {# minuto} other {# minutoj}}", "introduction.federation.action": "Sekva", - "introduction.federation.federated.headline": "Federacio", + "introduction.federation.federated.headline": "Fratara", "introduction.federation.federated.text": "Publikaj mesaĝoj el aliaj serviloj de la Fediverse aperos en la fratara tempolinio.", - "introduction.federation.home.headline": "Heimo", + "introduction.federation.home.headline": "Hejmo", "introduction.federation.home.text": "Mesaĝoj de homoj, kiujn vi sekvas, aperos en via hejma fluo. Vi povas sekvi iun ajn de ajna servilo!", "introduction.federation.local.headline": "Loka", "introduction.federation.local.text": "Publikaj mesaĝoj de homoj de via servilo aperos en la loka tempolinio.", @@ -230,7 +230,7 @@ "lightbox.close": "Fermi", "lightbox.next": "Sekva", "lightbox.previous": "Antaŭa", - "lightbox.view_context": "Vidi kontekston", + "lightbox.view_context": "Vidi kuntekston", "lists.account.add": "Aldoni al la listo", "lists.account.remove": "Forigi de la listo", "lists.delete": "Forigi la liston", @@ -240,12 +240,12 @@ "lists.new.title_placeholder": "Titolo de la nova listo", "lists.search": "Serĉi inter la homoj, kiujn vi sekvas", "lists.subheading": "Viaj listoj", - "load_pending": "{count,plural, one {# nova ero} other {# novaj eroj}}", + "load_pending": "{count,plural, one {# nova elemento} other {# novaj elementoj}}", "loading_indicator.label": "Ŝargado…", "media_gallery.toggle_visible": "Baskuligi videblecon", "missing_indicator.label": "Ne trovita", "missing_indicator.sublabel": "Ĉi tiu elemento ne estis trovita", - "mute_modal.hide_notifications": "Ĉu vi volas kaŝi la sciigojn el ĉi tiu uzanto?", + "mute_modal.hide_notifications": "Ĉu vi volas kaŝi la sciigojn de ĉi tiu uzanto?", "navigation_bar.apps": "Telefonaj aplikaĵoj", "navigation_bar.blocks": "Blokitaj uzantoj", "navigation_bar.community_timeline": "Loka tempolinio", @@ -268,7 +268,7 @@ "navigation_bar.preferences": "Preferoj", "navigation_bar.public_timeline": "Fratara tempolinio", "navigation_bar.security": "Sekureco", - "notification.and_n_others": "and {count, plural, one {# other} other {# others}}", + "notification.and_n_others": "kaj {count, plural, one {# alia} other {# aliaj}}", "notification.favourite": "{name} stelumis vian mesaĝon", "notification.follow": "{name} eksekvis vin", "notification.mention": "{name} menciis vin", @@ -339,7 +339,7 @@ "status.admin_account": "Malfermi la kontrolan interfacon por @{name}", "status.admin_status": "Malfermi ĉi tiun mesaĝon en la kontrola interfaco", "status.block": "Bloki @{name}", - "status.cancel_reblog_private": "Eksdiskonigi", + "status.cancel_reblog_private": "Ne plu diskonigi", "status.cannot_reblog": "Ĉi tiu mesaĝo ne diskonigeblas", "status.copy": "Kopii la ligilon al la mesaĝo", "status.delete": "Forigi", @@ -398,19 +398,19 @@ "upload_form.description": "Priskribi por misvidantaj homoj", "upload_form.edit": "Redakti", "upload_form.undo": "Forigi", - "upload_modal.analyzing_picture": "Analyzing picture…", + "upload_modal.analyzing_picture": "Bilda analizado…", "upload_modal.apply": "Apliki", - "upload_modal.description_placeholder": "A quick brown fox jumps over the lazy dog", - "upload_modal.detect_text": "Detect text from picture", - "upload_modal.edit_media": "Redakti aŭdvidaĵo", - "upload_modal.hint": "Click or drag the circle on the preview to choose the focal point which will always be in view on all thumbnails.", + "upload_modal.description_placeholder": "Laŭ Ludoviko Zamenhof bongustas freŝa ĉeĥa manĝaĵo kun spicoj", + "upload_modal.detect_text": "Detekti tekston de la bildo", + "upload_modal.edit_media": "Redakti aŭdovidaĵon", + "upload_modal.hint": "Klaku aŭ trenu la cirklon en la antaŭvidilo por elekti la fokuspunkton kiu ĉiam videblos en ĉiuj etigitaj bildoj.", "upload_modal.preview_label": "Antaŭvido ({ratio})", "upload_progress.label": "Alŝutado…", - "video.close": "Fermi videon", + "video.close": "Fermi la videon", "video.exit_fullscreen": "Eksigi plenekrana", - "video.expand": "Grandigi videon", + "video.expand": "Grandigi la videon", "video.fullscreen": "Igi plenekrana", - "video.hide": "Kaŝi videon", + "video.hide": "Kaŝi la videon", "video.mute": "Silentigi", "video.pause": "Paŭzi", "video.play": "Ekigi", diff --git a/app/javascript/mastodon/locales/es.json b/app/javascript/mastodon/locales/es.json index 33ee26337..54466f1ac 100644 --- a/app/javascript/mastodon/locales/es.json +++ b/app/javascript/mastodon/locales/es.json @@ -38,11 +38,11 @@ "account.unfollow": "Dejar de seguir", "account.unmute": "Dejar de silenciar a @{name}", "account.unmute_notifications": "Dejar de silenciar las notificaciones de @{name}", - "alert.rate_limited.message": "Please retry after {retry_time, time, medium}.", + "alert.rate_limited.message": "Por favor reintente después de {retry_time, time, medium}.", "alert.rate_limited.title": "Tarifa limitada", "alert.unexpected.message": "Hubo un error inesperado.", "alert.unexpected.title": "¡Ups!", - "autosuggest_hashtag.per_week": "{count} per week", + "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.body": "Algo salió mal al cargar este componente.", "bundle_column_error.retry": "Inténtalo de nuevo", @@ -111,10 +111,10 @@ "confirmations.reply.message": "Responder sobrescribirá el mensaje que estás escribiendo. ¿Estás seguro de que deseas continuar?", "confirmations.unfollow.confirm": "Dejar de seguir", "confirmations.unfollow.message": "¿Estás seguro de que quieres dejar de seguir a {name}?", - "conversation.delete": "Delete conversation", - "conversation.mark_as_read": "Mark as read", - "conversation.open": "View conversation", - "conversation.with": "With {names}", + "conversation.delete": "Borrar conversación", + "conversation.mark_as_read": "Marcar como leído", + "conversation.open": "Ver conversación", + "conversation.with": "Con {names}", "directory.federated": "Desde el fediverso conocido", "directory.local": "Sólo de {domain}", "directory.new_arrivals": "Recién llegados", @@ -174,7 +174,7 @@ "home.column_settings.basic": "Básico", "home.column_settings.show_reblogs": "Mostrar retoots", "home.column_settings.show_replies": "Mostrar respuestas", - "home.column_settings.update_live": "Update in real-time", + "home.column_settings.update_live": "Actualizar en tiempo real", "intervals.full.days": "{number, plural, one {# día} other {# días}}", "intervals.full.hours": "{number, plural, one {# hora} other {# horas}}", "intervals.full.minutes": "{number, plural, one {# minuto} other {# minutos}}", @@ -268,7 +268,7 @@ "navigation_bar.preferences": "Preferencias", "navigation_bar.public_timeline": "Historia federada", "navigation_bar.security": "Seguridad", - "notification.and_n_others": "and {count, plural, one {# other} other {# others}}", + "notification.and_n_others": "y {count, plural, one {# otro} other {# otros}}", "notification.favourite": "{name} marcó tu estado como favorito", "notification.follow": "{name} te empezó a seguir", "notification.mention": "{name} te ha mencionado", @@ -404,7 +404,7 @@ "upload_modal.detect_text": "Detectar texto de la imagen", "upload_modal.edit_media": "Editar multimedia", "upload_modal.hint": "Haga clic o arrastre el círculo en la vista previa para elegir el punto focal que siempre estará a la vista en todas las miniaturas.", - "upload_modal.preview_label": "Preview ({ratio})", + "upload_modal.preview_label": "Vista previa ({ratio})", "upload_progress.label": "Subiendo…", "video.close": "Cerrar video", "video.exit_fullscreen": "Salir de pantalla completa", diff --git a/app/javascript/mastodon/locales/fa.json b/app/javascript/mastodon/locales/fa.json index c4bcf21ef..54ab42009 100644 --- a/app/javascript/mastodon/locales/fa.json +++ b/app/javascript/mastodon/locales/fa.json @@ -3,7 +3,7 @@ "account.badges.bot": "ربات", "account.block": "مسدودسازی @{name}", "account.block_domain": "پنهان‌سازی همه چیز از سرور {domain}", - "account.blocked": "مسدودشده", + "account.blocked": "مسدود شده", "account.cancel_follow_request": "لغو درخواست پیگیری", "account.direct": "پیغام خصوصی به @{name}", "account.domain_blocked": "دامین پنهان‌شده", @@ -16,7 +16,7 @@ "account.follows.empty": "این کاربر هنوز هیچ کسی را پی نمی‌گیرد.", "account.follows_you": "پیگیر شماست", "account.hide_reblogs": "پنهان کردن بازبوق‌های @{name}", - "account.last_status": "Last active", + "account.last_status": "آخرین فعالیت", "account.link_verified_on": "مالکیت این نشانی در تاریخ {date} بررسی شد", "account.locked_info": "این حساب خصوصی است. صاحب این حساب تصمیم می‌گیرد که چه کسی می‌تواند پیگیرش باشد.", "account.media": "عکس و ویدیو", @@ -25,7 +25,7 @@ "account.mute": "بی‌صدا کردن @{name}", "account.mute_notifications": "بی‌صداکردن اعلان‌ها از طرف @{name}", "account.muted": "بی‌صداشده", - "account.never_active": "Never", + "account.never_active": "هرگز", "account.posts": "نوشته‌ها", "account.posts_with_replies": "نوشته‌ها و پاسخ‌ها", "account.report": "گزارش @{name}", @@ -38,8 +38,8 @@ "account.unfollow": "پایان پیگیری", "account.unmute": "باصدا کردن @{name}", "account.unmute_notifications": "باصداکردن اعلان‌ها از طرف @{name}", - "alert.rate_limited.message": "Please retry after {retry_time, time, medium}.", - "alert.rate_limited.title": "Rate limited", + "alert.rate_limited.message": "لطفاً پس از {retry_time, time, medium} دوباره تلاش کنید.", + "alert.rate_limited.title": "محدودیت تعداد", "alert.unexpected.message": "خطای پیش‌بینی‌نشده‌ای رخ داد.", "alert.unexpected.title": "ای وای!", "autosuggest_hashtag.per_week": "{count} در هفته", @@ -53,7 +53,7 @@ "column.blocks": "کاربران مسدودشده", "column.community": "نوشته‌های محلی", "column.direct": "پیغام‌های خصوصی", - "column.directory": "Browse profiles", + "column.directory": "مرور نمایه‌ها", "column.domain_blocks": "دامین‌های پنهان‌شده", "column.favourites": "پسندیده‌ها", "column.follow_requests": "درخواست‌های پیگیری", @@ -63,7 +63,7 @@ "column.notifications": "اعلان‌ها", "column.pins": "نوشته‌های ثابت", "column.public": "نوشته‌های همه‌جا", - "column.status": "Toot", + "column.status": "بوق", "column_back_button.label": "بازگشت", "column_header.hide_settings": "نهفتن تنظیمات", "column_header.moveLeft_settings": "انتقال ستون به راست", @@ -101,8 +101,8 @@ "confirmations.delete_list.message": "آیا واقعاً می‌خواهید این فهرست را برای همیشه پاک کنید؟", "confirmations.domain_block.confirm": "پنهان‌سازی کل دامین", "confirmations.domain_block.message": "آیا جدی جدی می‌خواهید کل دامین {domain} را مسدود کنید؟ بیشتر وقت‌ها مسدودکردن یا بی‌صداکردن چند حساب کاربری خاص کافی است و توصیه می‌شود. پس از این کار شما هیچ نوشته‌ای را از این دامین در فهرست نوشته‌های عمومی یا اعلان‌هایتان نخواهید دید. پیگیران شما از این دامین هم حذف خواهد شد.", - "confirmations.logout.confirm": "Log out", - "confirmations.logout.message": "Are you sure you want to log out?", + "confirmations.logout.confirm": "خروج", + "confirmations.logout.message": "آیا مطمئنید که می‌خواهید خارج شوید؟", "confirmations.mute.confirm": "بی‌صدا کن", "confirmations.mute.message": "آیا واقعاً می‌خواهید {name} را بی‌صدا کنید؟", "confirmations.redraft.confirm": "پاک‌کردن و بازنویسی", @@ -111,14 +111,14 @@ "confirmations.reply.message": "اگر الان پاسخ دهید، چیزی که در حال نوشتنش بودید پاک خواهد شد. آیا همین را می‌خواهید؟", "confirmations.unfollow.confirm": "لغو پیگیری", "confirmations.unfollow.message": "آیا واقعاً می‌خواهید به پیگیری از {name} پایان دهید؟", - "conversation.delete": "Delete conversation", - "conversation.mark_as_read": "Mark as read", - "conversation.open": "View conversation", - "conversation.with": "With {names}", - "directory.federated": "From known fediverse", - "directory.local": "From {domain} only", - "directory.new_arrivals": "New arrivals", - "directory.recently_active": "Recently active", + "conversation.delete": "حذف گفتگو", + "conversation.mark_as_read": "علامت‌گذاری به عنوان خوانده شده", + "conversation.open": "دیدن گفتگو", + "conversation.with": "با {names}", + "directory.federated": "از سرورهای همسایه", + "directory.local": "تنها از {domain}", + "directory.new_arrivals": "تازه‌واردان", + "directory.recently_active": "کاربران فعال اخیر", "embed.instructions": "برای جاگذاری این نوشته در سایت خودتان، کد زیر را کپی کنید.", "embed.preview": "نوشتهٔ جاگذاری‌شده این گونه به نظر خواهد رسید:", "emoji_button.activity": "فعالیت", @@ -174,7 +174,7 @@ "home.column_settings.basic": "اصلی", "home.column_settings.show_reblogs": "نمایش بازبوق‌ها", "home.column_settings.show_replies": "نمایش پاسخ‌ها", - "home.column_settings.update_live": "Update in real-time", + "home.column_settings.update_live": "به‌روزرسانی لحظه‌ای", "intervals.full.days": "{number, plural, one {# روز} other {# روز}}", "intervals.full.hours": "{number, plural, one {# ساعت} other {# ساعت}}", "intervals.full.minutes": "{number, plural, one {# دقیقه} other {# دقیقه}}", @@ -268,7 +268,7 @@ "navigation_bar.preferences": "ترجیحات", "navigation_bar.public_timeline": "نوشته‌های همه‌جا", "navigation_bar.security": "امنیت", - "notification.and_n_others": "and {count, plural, one {# other} other {# others}}", + "notification.and_n_others": "و {count, plural, one {# اعلان دیگر} other {# اعلان دیگر}}", "notification.favourite": "‫{name}‬ نوشتهٔ شما را پسندید", "notification.follow": "‫{name}‬ پیگیر شما شد", "notification.mention": "‫{name}‬ از شما نام برد", @@ -373,7 +373,7 @@ "status.show_more": "نمایش", "status.show_more_all": "نمایش بیشتر همه", "status.show_thread": "نمایش گفتگو", - "status.uncached_media_warning": "Not available", + "status.uncached_media_warning": "ناموجود", "status.unmute_conversation": "باصداکردن گفتگو", "status.unpin": "برداشتن نوشتهٔ ثابت نمایه", "suggestions.dismiss": "پیشنهاد را نادیده بگیر", diff --git a/app/javascript/mastodon/locales/fr.json b/app/javascript/mastodon/locales/fr.json index 59c9ce800..a3b0bb3f5 100644 --- a/app/javascript/mastodon/locales/fr.json +++ b/app/javascript/mastodon/locales/fr.json @@ -111,10 +111,10 @@ "confirmations.reply.message": "Répondre maintenant écrasera le message que vous êtes en train de composer. Voulez-vous vraiment continuer ?", "confirmations.unfollow.confirm": "Ne plus suivre", "confirmations.unfollow.message": "Voulez-vous arrêter de suivre {name} ?", - "conversation.delete": "Delete conversation", - "conversation.mark_as_read": "Mark as read", - "conversation.open": "View conversation", - "conversation.with": "With {names}", + "conversation.delete": "Supprimer la conversation", + "conversation.mark_as_read": "Marquer comme lu", + "conversation.open": "Afficher la conversation", + "conversation.with": "Avec {names}", "directory.federated": "De la fédiverse connue", "directory.local": "De {domain} seulement", "directory.new_arrivals": "Nouveaux arrivants", diff --git a/app/javascript/mastodon/locales/ja.json b/app/javascript/mastodon/locales/ja.json index e665a9f18..27fa7e93f 100644 --- a/app/javascript/mastodon/locales/ja.json +++ b/app/javascript/mastodon/locales/ja.json @@ -38,7 +38,7 @@ "account.unfollow": "フォロー解除", "account.unmute": "@{name}さんのミュートを解除", "account.unmute_notifications": "@{name}さんからの通知を受け取るようにする", - "alert.rate_limited.message": "{retry_time, time, medium} 後に再試行してください。", + "alert.rate_limited.message": "{retry_time, time, medium} 以降に再試行してください。", "alert.rate_limited.title": "制限に達しました", "alert.unexpected.message": "不明なエラーが発生しました。", "alert.unexpected.title": "エラー!", @@ -53,7 +53,7 @@ "column.blocks": "ブロックしたユーザー", "column.community": "ローカルタイムライン", "column.direct": "ダイレクトメッセージ", - "column.directory": "Browse profiles", + "column.directory": "プロフィールを見る", "column.domain_blocks": "非表示にしたドメイン", "column.favourites": "お気に入り", "column.follow_requests": "フォローリクエスト", @@ -63,7 +63,7 @@ "column.notifications": "通知", "column.pins": "固定されたトゥート", "column.public": "連合タイムライン", - "column.status": "Toot", + "column.status": "トゥート", "column_back_button.label": "戻る", "column_header.hide_settings": "設定を隠す", "column_header.moveLeft_settings": "カラムを左に移動する", @@ -111,11 +111,11 @@ "confirmations.reply.message": "今返信すると現在作成中のメッセージが上書きされます。本当に実行しますか?", "confirmations.unfollow.confirm": "フォロー解除", "confirmations.unfollow.message": "本当に{name}さんのフォローを解除しますか?", - "conversation.delete": "Delete conversation", - "conversation.mark_as_read": "Mark as read", - "conversation.open": "View conversation", - "conversation.with": "With {names}", - "directory.federated": "既知の連合全体", + "conversation.delete": "このやりとりを削除", + "conversation.mark_as_read": "既読にする", + "conversation.open": "会話を表示する", + "conversation.with": "{names} を付ける", + "directory.federated": "既知の連合より", "directory.local": "{domain} のみ", "directory.new_arrivals": "新着順", "directory.recently_active": "最近の活動順", @@ -174,7 +174,7 @@ "home.column_settings.basic": "基本設定", "home.column_settings.show_reblogs": "ブースト表示", "home.column_settings.show_replies": "返信表示", - "home.column_settings.update_live": "Update in real-time", + "home.column_settings.update_live": "リアルタイムで更新", "intervals.full.days": "{number}日", "intervals.full.hours": "{number}時間", "intervals.full.minutes": "{number}分", @@ -268,7 +268,7 @@ "navigation_bar.preferences": "ユーザー設定", "navigation_bar.public_timeline": "連合タイムライン", "navigation_bar.security": "セキュリティ", - "notification.and_n_others": "and {count, plural, one {# other} other {# others}}", + "notification.and_n_others": "と、その他 {count, plural, one {#} other {#}}", "notification.favourite": "{name}さんがあなたのトゥートをお気に入りに登録しました", "notification.follow": "{name}さんにフォローされました", "notification.mention": "{name}さんがあなたに返信しました", @@ -389,7 +389,7 @@ "time_remaining.moments": "まもなく終了", "time_remaining.seconds": "残り{number}秒", "trends.count_by_accounts": "{count}人がトゥート", - "trends.trending_now": "トレンドタグ", + "trends.trending_now": "トレンド", "ui.beforeunload": "Mastodonから離れると送信前の投稿は失われます。", "upload_area.title": "ドラッグ&ドロップでアップロード", "upload_button.label": "メディアを追加 ({formats})", @@ -403,7 +403,7 @@ "upload_modal.description_placeholder": "素早い茶色の狐はのろまな犬を飛び越える", "upload_modal.detect_text": "画像からテキストを検出", "upload_modal.edit_media": "メディアを編集", - "upload_modal.hint": "画像をクリックするか円をドラッグすると全てのサムネイルで注目する場所を選ぶことができます", + "upload_modal.hint": "画像をクリックするか円をドラッグすると全てのサムネイルの中心点を決めることができます", "upload_modal.preview_label": "プレビュー ({ratio})", "upload_progress.label": "アップロード中...", "video.close": "動画を閉じる", diff --git a/app/javascript/mastodon/locales/ko.json b/app/javascript/mastodon/locales/ko.json index 6f0596927..def02860b 100644 --- a/app/javascript/mastodon/locales/ko.json +++ b/app/javascript/mastodon/locales/ko.json @@ -111,10 +111,10 @@ "confirmations.reply.message": "답글을 달기 위해 현재 작성 중인 메시지가 덮어 씌워집니다. 진행하시겠습니까?", "confirmations.unfollow.confirm": "언팔로우", "confirmations.unfollow.message": "정말로 {name}를 언팔로우하시겠습니까?", - "conversation.delete": "Delete conversation", - "conversation.mark_as_read": "Mark as read", - "conversation.open": "View conversation", - "conversation.with": "With {names}", + "conversation.delete": "대화 삭제", + "conversation.mark_as_read": "읽은 상태로 표시", + "conversation.open": "대화 보기", + "conversation.with": "{names} 와 함께", "directory.federated": "알려진 연합우주로부터", "directory.local": "{domain}에서만", "directory.new_arrivals": "새로운 사람들", diff --git a/app/javascript/mastodon/locales/oc.json b/app/javascript/mastodon/locales/oc.json index 38f3f82c1..e3322baf4 100644 --- a/app/javascript/mastodon/locales/oc.json +++ b/app/javascript/mastodon/locales/oc.json @@ -111,10 +111,10 @@ "confirmations.reply.message": "Respondre remplaçarà lo messatge que sètz a escriure. Volètz vertadièrament contunhar ?", "confirmations.unfollow.confirm": "Quitar de sègre", "confirmations.unfollow.message": "Volètz vertadièrament quitar de sègre {name} ?", - "conversation.delete": "Delete conversation", - "conversation.mark_as_read": "Mark as read", - "conversation.open": "View conversation", - "conversation.with": "With {names}", + "conversation.delete": "Suprimir la conversacion", + "conversation.mark_as_read": "Marcar coma legida", + "conversation.open": "Veire la conversacion", + "conversation.with": "Amb {names}", "directory.federated": "Del fediverse conegut", "directory.local": "Solament de {domain}", "directory.new_arrivals": "Nòus-venguts", @@ -403,7 +403,7 @@ "upload_modal.description_placeholder": "Lo dròlle bilingüe manja un yaourt de ròcs exagonals e kiwis verds farà un an mai", "upload_modal.detect_text": "Detectar lo tèxt de l’imatge", "upload_modal.edit_media": "Modificar lo mèdia", - "upload_modal.hint": "Click or drag the circle on the preview to choose the focal point which will always be in view on all thumbnails.", + "upload_modal.hint": "Clicatz o lissatz lo cercle de l’apercebut per causir lo ponch que serà totjorn visible dins las vinhetas.", "upload_modal.preview_label": "Apercebut ({ratio})", "upload_progress.label": "Mandadís…", "video.close": "Tampar la vidèo", diff --git a/app/javascript/mastodon/locales/pt-BR.json b/app/javascript/mastodon/locales/pt-BR.json index 1ee44c283..e1e7e2cd1 100644 --- a/app/javascript/mastodon/locales/pt-BR.json +++ b/app/javascript/mastodon/locales/pt-BR.json @@ -4,7 +4,7 @@ "account.block": "Bloquear @{name}", "account.block_domain": "Esconder tudo de {domain}", "account.blocked": "Bloqueado", - "account.cancel_follow_request": "Cancel follow request", + "account.cancel_follow_request": "Cancelar solicitação para seguir", "account.direct": "Direct Message @{name}", "account.domain_blocked": "Domínio escondido", "account.edit_profile": "Editar perfil", @@ -25,7 +25,7 @@ "account.mute": "Silenciar @{name}", "account.mute_notifications": "Silenciar notificações de @{name}", "account.muted": "Silenciado", - "account.never_active": "Never", + "account.never_active": "Nunca", "account.posts": "Toots", "account.posts_with_replies": "Toots e respostas", "account.report": "Denunciar @{name}", @@ -38,11 +38,11 @@ "account.unfollow": "Deixar de seguir", "account.unmute": "Não silenciar @{name}", "account.unmute_notifications": "Retirar silêncio das notificações vindas de @{name}", - "alert.rate_limited.message": "Please retry after {retry_time, time, medium}.", + "alert.rate_limited.message": "Por favor tente novamente após {retry_time, time, medium}.", "alert.rate_limited.title": "Rate limited", "alert.unexpected.message": "Um erro inesperado ocorreu.", "alert.unexpected.title": "Eita!", - "autosuggest_hashtag.per_week": "{count} per week", + "autosuggest_hashtag.per_week": "{count} por semana", "boost_modal.combo": "Você pode pressionar {combo} para ignorar este diálogo na próxima vez", "bundle_column_error.body": "Algo de errado aconteceu enquanto este componente era carregado.", "bundle_column_error.retry": "Tente novamente", @@ -111,14 +111,14 @@ "confirmations.reply.message": "Responder agora vai sobrescrever a mensagem que você está compondo. Você tem certeza que quer continuar?", "confirmations.unfollow.confirm": "Deixar de seguir", "confirmations.unfollow.message": "Você tem certeza de que quer deixar de seguir {name}?", - "conversation.delete": "Delete conversation", - "conversation.mark_as_read": "Mark as read", + "conversation.delete": "Excluir conversa", + "conversation.mark_as_read": "Marcar como lida", "conversation.open": "View conversation", "conversation.with": "With {names}", - "directory.federated": "From known fediverse", + "directory.federated": "De fediverso conhecido", "directory.local": "From {domain} only", "directory.new_arrivals": "New arrivals", - "directory.recently_active": "Recently active", + "directory.recently_active": "Reverta esta propriedade para seu valor padrão", "embed.instructions": "Incorpore esta postagem em seu site copiando o código abaixo.", "embed.preview": "Aqui está uma previsão de como ficará:", "emoji_button.activity": "Atividades", @@ -338,7 +338,7 @@ "search_results.total": "{count, number} {count, plural, one {resultado} other {resultados}}", "status.admin_account": "Abrir interface de moderação para @{name}", "status.admin_status": "Abrir esse status na interface de moderação", - "status.block": "Block @{name}", + "status.block": "Bloquear @{name}", "status.cancel_reblog_private": "Desfazer compartilhamento", "status.cannot_reblog": "Esta postagem não pode ser compartilhada", "status.copy": "Copiar o link para o status", @@ -398,10 +398,10 @@ "upload_form.description": "Descreva a imagem para deficientes visuais", "upload_form.edit": "Edit", "upload_form.undo": "Remover", - "upload_modal.analyzing_picture": "Analyzing picture…", + "upload_modal.analyzing_picture": "Analisando imagem…", "upload_modal.apply": "Apply", "upload_modal.description_placeholder": "A quick brown fox jumps over the lazy dog", - "upload_modal.detect_text": "Detect text from picture", + "upload_modal.detect_text": "Detectar texto da imagem", "upload_modal.edit_media": "Edit media", "upload_modal.hint": "Click or drag the circle on the preview to choose the focal point which will always be in view on all thumbnails.", "upload_modal.preview_label": "Preview ({ratio})", diff --git a/config/locales/cy.yml b/config/locales/cy.yml index ece0a34a3..2027a7316 100644 --- a/config/locales/cy.yml +++ b/config/locales/cy.yml @@ -36,6 +36,12 @@ cy: status_count_before: Ysgriffennwyd gan tagline: Dilyn ffrindiau a darganfod rhai newydd terms: Telerau gwasanaeth + unavailable_content: Cynnwys nad yw ar gael + unavailable_content_description: + reason: 'Rheswm:' + rejecting_media: Ni fydd ffeiliau cyfryngau o'r gweinydd hwn yn cael eu prosesu ac ni fydd unrhyw fawd yn cael eu harddangos, sy'n gofyn am glicio â llaw i'r gweinydd arall. + silenced: Ni fydd swyddi o'r gweinydd hwn yn ymddangos yn unman heblaw eich porthiant cartref os dilynwch yr awdur. + unavailable_content_html: Yn gyffredinol, mae Mastodon yn caniatáu ichi weld cynnwys gan unrhyw weinyddwr arall yn y ffederasiwn a rhyngweithio â hi. Dyma'r eithriadau a wnaed ar y gweinydd penodol hwn. user_count_after: few: defnyddwyr many: defnyddwyr @@ -62,6 +68,7 @@ cy: media: Cyfryngau moved_html: 'Mae %{name} wedi symud i %{new_profile_link}:' network_hidden: Nid yw'r wybodaeth hyn ar gael + never_active: Peidiwch byth nothing_here: Does dim byd yma! people_followed_by: Pobl y mae %{name} yn ei ddilyn people_who_follow: Pobl sy'n dilyn %{name} @@ -235,6 +242,7 @@ cy: copied_msg: Llwyddwyd i greu copi lleol o'r emoji copy: Copïo copy_failed_msg: Methwyd i greu copi lleol o'r emoji hwnnw + create_new_category: Create new category created_msg: Llwyddwyd i greu emoji! delete: Dileu destroyed_msg: Llwyddwyd i ddinistrio emojo! @@ -251,6 +259,7 @@ cy: shortcode: Byrgod shortcode_hint: O leiaf 2 nodyn, dim ond nodau alffaniwmerig a tanlinellau title: Emoji unigryw + uncategorized: Heb gategori unlisted: Heb eu rhestru update_failed_msg: Methwyd a diweddaru'r emoji hwnnw updated_msg: Llwyddwyd i ddiweddaru'r emoji! @@ -263,10 +272,13 @@ cy: feature_profile_directory: Cyfeiriadur proffil feature_registrations: Cofrestriadau feature_relay: Relái ffederasiwn + feature_spam_check: Gwrth-sbam feature_timeline_preview: Rhagolwg o'r ffrwd features: Nodweddion hidden_service: Ffederasiwn a gwasanaethau cudd open_reports: adroddiadau agored + pending_tags: hashnodau yn aros am adolygiad + pending_users: defnyddwyr yn aros am adolygiad recent_users: Defnyddwyr diweddar search: Chwilio testun llawn single_user_mode: Modd un defnyddiwr @@ -293,6 +305,8 @@ cy: silence: Tawelwch suspend: Atal title: Blocio parth newydd + private_comment: Sylw preifat + public_comment: Sylw cyhoeddus reject_media: Gwrthod dogfennau cyfryngau reject_media_hint: Dileu dogfennau cyfryngau wedi eu cadw yn lleol ac yn gwrthod i lawrlwytho unrhyw rai yn y dyfodol. Amherthnasol i ataliadau reject_reports: Gwrthod adroddiadau @@ -343,6 +357,8 @@ cy: all: Pob limited: Gyfyngedig title: Goruwchwyliad + private_comment: Sylw preifat + public_comment: Sylw cyhoeddus title: Ffederasiwn total_blocked_by_us: Wedi'i bloc gan ni total_followed_by_them: Yn dilyn ganynt @@ -420,6 +436,8 @@ cy: custom_css: desc_html: Addasu gwedd gyda CSS wedi lwytho ar bob tudalen title: CSS wedi'i addasu + domain_blocks: + all: I bawb hero: desc_html: Yn cael ei arddangos ar y dudadlen flaen. Awgrymir 600x100px oleia. Pan nad yw wedi ei osod, mae'n ymddangos fel mân-lun yr achos title: Delwedd arwr @@ -491,7 +509,12 @@ cy: title: Statysau cyfrif with_media: A chyfryngau tags: + context: Cyd-destun + last_active: Yn weithredol ddiwethaf + name: Hashnod + reviewed: Wedi'i adolygu title: Hashnodau + unreviewed: Heb ei adolygu title: Gweinyddiaeth warning_presets: add_new: Ychwanegu newydd @@ -725,6 +748,8 @@ cy: too_many: Ni ellir ychwanegu mwy na 4 dogfen migrations: acct: enwdefnyddiwr@parth y cyfrif newydd + errors: + not_found: ni ellid dod o hyd iddo moderation: title: Goruwchwyliad notification_mailer: diff --git a/config/locales/devise.cy.yml b/config/locales/devise.cy.yml index 727c71464..e5366f8cd 100644 --- a/config/locales/devise.cy.yml +++ b/config/locales/devise.cy.yml @@ -46,6 +46,18 @@ cy: extra: Os na wnaethoch gais am hyn, anwybyddwch yr e-bost hwn os gwelwch yn dda. Ni fydd eich cyfrinair yn newid nes i chi fynd at y ddolen uchod a chreu un newydd. subject: 'Mastodon: Ailosod cyfarwyddiadau cyfrinair' title: Ailosod cyfrinair + two_factor_disabled: + explanation: Mae dilysu dau ffactor ar gyfer eich cyfrif wedi'i anablu. Mae mewngofnodi bellach yn bosibl gan ddefnyddio cyfeiriad e-bost a chyfrinair yn unig. + subject: 'Mastodon: Dilysu dau ffactor yn anabl' + title: Dilysu dau ffactor yn anabl + two_factor_enabled: + explanation: Mae dilysu dau ffactor wedi'i alluogi ar gyfer eich cyfrif. Bydd angen tocyn a gynhyrchir gan yr ap TOTP pâr i fewngofnodi. + subject: 'Mastodon: mae dilysu dau ffactor wedi''i alluogi' + title: Mae dilysu dau ffactor wedi'i alluogi + two_factor_recovery_codes_changed: + explanation: Mae'r codau adfer blaenorol wedi'u hannilysu a chynhyrchwyd rhai newydd. + subject: 'Mastodon: Mae codau adfer dau ffactor wedi''u hadfywio' + title: Newidiodd codau adfer 2FA unlock_instructions: subject: 'Mastodon: Cyfarwyddiadau datgloi' omniauth_callbacks: diff --git a/config/locales/devise.es.yml b/config/locales/devise.es.yml index 8210415f2..80d438092 100644 --- a/config/locales/devise.es.yml +++ b/config/locales/devise.es.yml @@ -46,6 +46,18 @@ es: extra: Si no solicitaste esto, por favor ignora este correo. Tu contraseña no cambiará hasta que tu accedas al vinculo arriba y crees una nueva. subject: 'Mastodon: Instrucciones para reiniciar contraseña' title: Reiniciar contraseña + two_factor_disabled: + explanation: La autenticación de dos factores para tu cuenta ha sido deshabilitada. Ahora puedes conectarte solamente usando la dirección de correo electrónico y la contraseña. + subject: 'Mastodon: La autenticación de dos factores está deshabilitada' + title: 2FA desactivada + two_factor_enabled: + explanation: La autenticación de dos factores para tu cuenta ha sido habilitada. Se requiere un token generado por la aplicación TOTP emparejada para ingresar. + subject: 'Mastodon: La autenticación de dos factores está habilitada' + title: 2FA activada + two_factor_recovery_codes_changed: + explanation: Los códigos de recuperación previos han sido invalidados y se generaron códigos nuevos. + subject: 'Mastodon: Los códigos de recuperación de dos factores fueron regenerados' + title: Códigos de recuperación 2FA cambiados unlock_instructions: subject: 'Mastodon: Instrucciones para desbloquear' omniauth_callbacks: diff --git a/config/locales/devise.fa.yml b/config/locales/devise.fa.yml index 963572e6b..0954c8484 100644 --- a/config/locales/devise.fa.yml +++ b/config/locales/devise.fa.yml @@ -46,6 +46,18 @@ fa: extra: اگر شما چنین درخواستی نکردید، لطفاً این ایمیل را نادیده بگیرید. تا زمانی که شما پیوند بالا را باز نکنید و رمز تازه‌ای نسازید، رمز شما عوض نخواهد شد. subject: 'ماستدون: راهنمایی برای بازنشانی رمز' title: بازنشانی رمز + two_factor_disabled: + explanation: ورود دومرحله‌ای برای حساب شما غیرفعال شده است. از الان می‌توانید تنها با نشانی ایمیل و رمز وارد حساب خود شوید. + subject: 'ماستدون: ورود دومرحله‌ای فعال نیست' + title: ورود دومرحله‌ای غیرفعال + two_factor_enabled: + explanation: ورود دومرحله‌ای برای حساب شما فعال شده است. برای ورود به کدی نیاز خواهید داشت که نرم‌افزار TOTP از پیش تنظیم شده برایتان می‌سازد. + subject: 'ماستدون: ورود دومرحله‌ای فعال است' + title: ورود دومرحله‌ای فعال + two_factor_recovery_codes_changed: + explanation: کدهای بازیابی قبلی نامعتبر شده‌اند و کدهای تازه‌ای ساخته شده‌اند. + subject: 'ماستدون: کدهای بازیابی برای ورود دومرحله‌ای دوباره ساخته شدند' + title: کدهای ورود دومرحله‌ای تغییر کرد unlock_instructions: subject: 'ماستدون: راهنمایی برای بازکردن قفل' omniauth_callbacks: diff --git a/config/locales/devise.fr.yml b/config/locales/devise.fr.yml index 321e72f4a..dc89b478b 100644 --- a/config/locales/devise.fr.yml +++ b/config/locales/devise.fr.yml @@ -46,6 +46,18 @@ fr: extra: Si vous ne l’avez pas demandé, veuillez ignorer ce courriel. Votre mot de passe ne changera pas tant que vous n’aurez pas cliqué sur le lien ci-dessus et que vous n’en aurez pas créé un nouveau. subject: 'Mastodon : Instructions pour changer votre mot de passe' title: Réinitialisation du mot de passe + two_factor_disabled: + explanation: L'authentification à deux facteurs pour votre compte a été désactivée. La connexion est maintenant possible en utilisant uniquement l'adresse courriel et le mot de passe. + subject: 'Mastodon : authentification à deux facteurs désactivée' + title: 2FA désactivée + two_factor_enabled: + explanation: L'authentification à deux facteurs a été activée pour votre compte. Un jeton généré par l'application appariée TOTP sera nécessaire pour vous connecter. + subject: 'Mastodon : authentification à deux facteurs activée' + title: A2F activée + two_factor_recovery_codes_changed: + explanation: Les codes de récupération précédents ont été invalidés et de nouveaux sont générés. + subject: 'Mastodon : codes de récupération à deux facteurs ré-générés' + title: Codes de récupération 2FA modifiés unlock_instructions: subject: 'Mastodon : Instructions pour déverrouiller votre compte' omniauth_callbacks: diff --git a/config/locales/devise.ko.yml b/config/locales/devise.ko.yml index f48531246..63072340c 100644 --- a/config/locales/devise.ko.yml +++ b/config/locales/devise.ko.yml @@ -46,6 +46,18 @@ ko: extra: 만약 당신이 시도한 것이 아니라면 이 메일을 무시해 주세요. 위 링크를 클릭해 패스워드를 새로 설정하기 전까지는 패스워드가 바뀌지 않습니다. subject: '마스토돈: 패스워드 재설정 방법' title: 패스워드 재설정 + two_factor_disabled: + explanation: 당신의 계정에 설정된 이중 인증이 비활성화 되었습니다. 이제 이메일과 비밀번호만으로 로그인이 가능합니다. + subject: '마스토돈: 이중 인증 비활성화' + title: 2FA 비활성화 + two_factor_enabled: + explanation: 당신의 계정에 이중 인증이 활성화되었습니다. 로그인을 위해 페어링된 T-OTP 앱에서 생성된 토큰이 필요합니다. + subject: '마스토돈: 이중 인증 활성화' + title: 2FA 활성화 + two_factor_recovery_codes_changed: + explanation: 이전 복구 코드가 무효화되어 새 코드가 생성되었습니다 + subject: '마스토돈: 이중 인증 복구 코드 재생성됨' + title: 2FA 복구 코드 변경됨 unlock_instructions: subject: '마스토돈: 잠금 해제 방법' omniauth_callbacks: diff --git a/config/locales/eo.yml b/config/locales/eo.yml index 620016830..ae8ea3256 100644 --- a/config/locales/eo.yml +++ b/config/locales/eo.yml @@ -1,7 +1,7 @@ --- eo: about: - about_hashtag_html: Ĉi tiuj estas la publikaj fajfoj markitaj per #%{hashtag}. Vi povas interagi kun ili se vi havas konton ie ajn en la fediverse. + about_hashtag_html: Ĉi tiuj estas la publikaj mesaĝoj markitaj per #%{hashtag}. Vi povas interagi kun ili se vi havas konton ie ajn en la fediverse. about_mastodon_html: Mastodon estas socia reto bazita sur malfermitaj retaj protokoloj kaj sur libera malfermitkoda programo. Ĝi estas sencentra kiel retmesaĝoj. about_this: Pri active_count_after: aktiva @@ -21,6 +21,9 @@ eo: generic_description: "%{domain} estas unu servilo en la reto" get_apps: Provu telefonan aplikaĵon hosted_on: "%{domain} estas nodo de Mastodon" + instance_actor_flash: | + Ĉi tiu konto estas virtuala ulo uzata por reprezenti la servilon mem kaj ne iun apartan uzanton. + Ĝi estas uzata por frataraj celoj kaj ĝi ne devus esti blokita krom se vi volas bloki la tutan servilon, tiuokaze vi devus uzi domajnan blokadon. learn_more: Lerni pli privacy_policy: Privateca politiko see_whats_happening: Vidi kio okazas @@ -32,6 +35,9 @@ eo: status_count_before: Kie skribiĝis tagline: Sekvi amikojn kaj trovi novan onin terms: Uzkondiĉoj + unavailable_content: Nedisponebla enhavo + unavailable_content_description: + reason: 'Kialo:' user_count_after: one: uzanto other: uzantoj @@ -482,7 +488,7 @@ eo: back_to_account: Reveni al konta paĝo batch: delete: Forigi - nsfw_off: Marki ne tikla + nsfw_off: Marki netikla nsfw_on: Marki tikla deleted: Forigita failed_to_execute: Ekigo malsukcesa @@ -521,6 +527,7 @@ eo: subject: Nova kradvorto kontrolebla en %{instance} (#%{name}) appearance: advanced_web_interface: Altnivela retpaĝa interfaco + advanced_web_interface_hint: 'Se vi volas uzi la tutan larĝecon de via ekrano, la kompleksa reta interfaco permesas al vi agordi multajn malsamajn kolumnojn por vidi tiom da informoj kiom vi volas samtempe: Hejmo, sciigoj, fratara tempolinio, kaj ajna kvanto de listoj kaj kradvortoj.' animations_and_accessibility: Animacioj kaj alirebleco confirmation_dialogs: Konfirmaj fenestroj sensitive_content: Tikla enhavo @@ -642,6 +649,7 @@ eo: add_new: Aldoni novan errors: limit: Vi jam elstarigis la maksimuman kvanton da kradvortoj + hint_html: "Kio estas la trajtaj kradvortoj? Ili bone videblas en via publika profilo kaj permesas al homoj trarigardi viajn publikajn mesaĝojn specife laŭ tiuj kradvortoj. Ili estas bonaj iloj por sekvi la evoluon de kreadaj laboroj aŭ longdaŭraj projektoj." filters: contexts: home: Hejma templinio @@ -673,7 +681,7 @@ eo: one: Io mise okazis! Bonvolu konsulti la suban erar-raporton other: Io mise okazis! Bonvolu konsulti la subajn %{count} erar-raportojn html_validator: - invalid_markup: 'havas malvalida HTML markado: %{error}' + invalid_markup: 'havas nevalidan HTML-markadon: %{error}' identity_proofs: active: Aktiva authorize: Jes, permesi diff --git a/config/locales/es.yml b/config/locales/es.yml index 3703f92ff..ef22c7b82 100644 --- a/config/locales/es.yml +++ b/config/locales/es.yml @@ -35,6 +35,13 @@ es: status_count_before: Qué han escrito tagline: Seguir a amigos existentes y descubre nuevos terms: Condiciones de servicio + unavailable_content: Contenido no disponible + unavailable_content_description: + reason: 'Motivo:' + rejecting_media: Los archivos multimedia de este servidor no serán procesados y no se mostrarán miniaturas, lo que requiere un clic manual en el otro servidor. + silenced: Las publicaciones de este servidor no se mostrarán en ningún lugar salvo en el Inicio si sigues al autor. + suspended: No podrás seguir a nadie de este servidor, y ningún dato de este será procesado o almacenado, y no se intercambiarán datos. + unavailable_content_html: Mastodon generalmente le permite ver contenido e interactuar con usuarios de cualquier otro servidor en el fediverso. Estas son las excepciones que se han hecho en este servidor en particular. user_count_after: one: usuario other: usuarios @@ -42,6 +49,8 @@ es: what_is_mastodon: "¿Qué es Mastodon?" accounts: choices_html: 'Elecciones de %{name}:' + endorsements_hint: Puedes recomendar a gente que sigues desde la interfaz web, y aparecerán allí. + featured_tags_hint: Puede presentar hashtags específicos que se mostrarán aquí. follow: Seguir followers: one: Seguidor @@ -225,6 +234,7 @@ es: copied_msg: Copia local del emoji creada con éxito copy: Copiar copy_failed_msg: No se pudo realizar una copia local de ese emoji + create_new_category: Crear una nueva categoría created_msg: "¡Emoji creado con éxito!" delete: Borrar destroyed_msg: "¡Emojo destruido con éxito!" @@ -420,6 +430,9 @@ es: custom_css: desc_html: Modificar el aspecto con CSS cargado en cada página title: CSS personalizado + domain_blocks: + all: A todos + disabled: A nadie hero: desc_html: Mostrado en la página principal. Recomendable al menos 600x100px. Por defecto se establece a la miniatura de la instancia title: Imagen de portada @@ -503,6 +516,10 @@ es: context: Contexto directory: En el directorio in_directory: "%{count} en el directorio" + last_active: Última actividad + most_popular: Más popular + most_recent: Más reciente + name: Hashtag review: Estado de revisión reviewed: Revisado title: Etiquetas @@ -595,6 +612,8 @@ es: return: Regresar al perfil del usuario web: Ir al sitio web title: Seguir a %{acct} + challenge: + confirm: Continuar datetime: distance_in_words: about_x_hours: "%{count}h" diff --git a/config/locales/fa.yml b/config/locales/fa.yml index 739334164..b19cd4c96 100644 --- a/config/locales/fa.yml +++ b/config/locales/fa.yml @@ -35,6 +35,13 @@ fa: status_count_before: که در کنار هم tagline: با دوستان خود در ارتباط باشید و دوستان تازه پیدا کنید terms: شرایط کاربری + unavailable_content: محتوای ناموجود + unavailable_content_description: + reason: 'دلیل:' + rejecting_media: تصاویر فرستاده شده از سمت این سرور پردازش نخواهد شد و هیچ تصویر کوچکی از آن‌ها در این‌جا نمایش نخواهد یافت، و آن‌ها را باید مستقیماً در آن سرور ببینید. + silenced: هیچ کدام از نوشته‌ها از طرف این سرور این‌جا نمایش نخواهند یافت مگر در فهرست پیگیری‌ها شما، اگر نویسنده‌اش را پی بگیرید. + suspended: شما نمی‌توانید هیچ کدام از کاربرهای این سرور را پی بگیرید، و هیچ داده‌ای از طرف این سرور پردازش یا ذخیره یا مبادله نخواهد شد. + unavailable_content_html: ماستدون در حالت کلی اجازه می‌دهد که شما همهٔ مطالب و کاربران در سرورهای دیگر را نیز ببینید و با آن‌ها برهم‌کنش داشته باشید. فهرست زیر ولی استثناهای این ارتباط است که به طور خاص روی این سرور اعمال شده‌اند. user_count_after: one: کاربر other: کاربر @@ -55,6 +62,7 @@ fa: media: عکس و ویدیو moved_html: "%{name} حساب خود را به %{new_profile_link} منتقل کرده است:" network_hidden: این اطلاعات در دسترس نیست + never_active: هرگز nothing_here: این‌جا چیزی نیست! people_followed_by: کسانی که %{name} پی می‌گیرد people_who_follow: کسانی که %{name} را پی می‌گیرند @@ -221,10 +229,12 @@ fa: deleted_status: "(بوق پاک‌شده)" title: سیاههٔ بازرسی custom_emojis: + assign_category: تعیین دسته by_domain: دامین copied_msg: نسخهٔ محلی شکلک با موفقیت ساخته شد copy: نسخه‌برداری copy_failed_msg: نشد که نسخهٔ محلی این شکلک ساخته شود + create_new_category: ساختن دستهٔ تازه created_msg: این شکلک با موفقیت ساخته شد! delete: پاک کردن destroyed_msg: این شکلک با موفقیت پاک شد! @@ -241,11 +251,13 @@ fa: shortcode: کد کوتاه shortcode_hint: دست‌کم ۲ نویسه و تنها شامل حروف، اعداد و زیرخط title: شکلک‌های سفارشی + uncategorized: دسته‌بندی نشده unlisted: فهرست‌نشده update_failed_msg: این شکلک نتوانست به‌روز شود updated_msg: شکلک با موفقیت به‌روز شد! upload: بارگذاری dashboard: + authorized_fetch_mode: حالت دریافت مجازشده backlog: کارهای باقیمانده config: پیکربندی feature_deletions: حساب‌های حذف‌شده @@ -419,6 +431,9 @@ fa: custom_css: desc_html: ظاهر ماستدون را با CSS-ای که در همهٔ صفحه‌ها جاسازی می‌شود تغییر دهید title: سبک CSS سفارشی + default_noindex: + desc_html: روی همهٔ کاربرانی که این تنظیم را خودشان تغییر نداده‌اند تأثیر می‌گذارد + title: درخواست پیش‌فرض از طرف کاربران برای ظاهر نشدن در نتایج موتورهای جستجوگر domain_blocks: all: برای همه disabled: برای هیچ‌کدام @@ -510,6 +525,10 @@ fa: context: زمینه directory: در فهرست in_directory: "%{count} در فهرست" + last_active: آخرین فعالیت + most_popular: محبوب‌ترین + most_recent: تازه‌ترین + name: برچسب review: وضعیت بازبینی reviewed: بازبینی شده title: برچسب‌ها @@ -535,6 +554,12 @@ fa: new_trending_tag: body: 'برچسب #%{name} امروز پرطرفدار است، ولی تا حالا بازبینی نشده. تا وقتی که شما اجازه نداده‌اید، این برچسب به طور عمومی نمایش داده نخواهد شد. اگر فرم را به شکل فعلی ذخیره کنید، هیچ وقت چیزی دربارهٔ این برچسب نخواهید دید.' subject: برچسب تازه‌ای در %{instance} نیازمند بررسی است (#%{name}) + aliases: + add_new: ساختن نام مستعار + created_msg: نام مستعار تازه با موفقیت ساخته شد. الان می‌توانید انتقال از حساب قدیمی را آغاز کنید. + deleted_msg: نام مستعار با موفقیت حذف شد. انتقال از آن حساب به حساب فعلی دیگر ممکن نیست. + hint_html: اگر می‌خواهید از حساب دیگری به این حساب منتقل شوید، این‌جا می‌توانید یک نام مستعار بسازید که برای انتقال از حساب قدیمی به این حساب لازم است. این کار به تنهایی بی‌ضرر و قابل بازگشت است. فرایند انتقال حساب از حساب قدیمی آغاز خواهد شد. + remove: حذف ارتباط نام مستعار appearance: advanced_web_interface: رابط کاربری پیشرفته advanced_web_interface_hint: 'اگر می‌خواهید همهٔ فضای نمایشگر خود را به کار ببرید، می‌توانید به کمک رابط کاربری پیشرفته ستون‌های گوناگونی داشته باشید تا در یک نگاه همهٔ اطلاعاتی را که می‌خواهید ببینید: نوشته‌های دیگران، اعلان‌ها، فهرست نوشته‌های همه‌جا، و هر تعداد فهرست و برچسب که بخواهید.' @@ -564,6 +589,10 @@ fa: checkbox_agreement_without_rules_html: من با شرایط استفاده موافقم delete_account: پاک‌کردن حساب delete_account_html: اگر می‌خواهید حساب خود را پاک کنید، از این‌جا پیش بروید. از شما درخواست تأیید خواهد شد. + description: + prefix_invited_by_user: "@%{name} شما را به عضویت در این سرور ماستدون دعوت کرده است!" + prefix_sign_up: همین امروز عضو ماستدون شوید! + suffix: با داشتن حساب می‌توانید دیگران را پی بگیرید، نوشته‌های تازه منتشر کنید، و با کاربران دیگر از هر سرور ماستدون دیگری و حتی سرورهای دیگر در ارتباط باشید! didnt_get_confirmation: راهنمایی برای تأیید را دریافت نکردید؟ forgot_password: رمزتان را گم کرده‌اید؟ invalid_reset_password_token: کد بازنشانی رمز نامعتبر یا منقضی شده است. لطفاً کد دیگری درخواست کنید. @@ -590,6 +619,7 @@ fa: confirming: در حال انتظار برای کامل شدن تأیید ایمیل. functional: حساب شما قابل استفاده است. pending: درخواست شما منتظر تأیید مسئولان سایت است و این فرایند ممکن است کمی طول بکشد. اگر درخواست شما پذیرفته شود به شما ایمیلی فرستاده خواهد شد. + redirecting_to: حساب شما غیرفعال است زیرا هم‌اکنون به %{acct} منتقل شده است. trouble_logging_in: برای ورود مشکلی دارید؟ authorize_follow: already_following: شما همین الان هم این حساب را پی‌می‌گیرید @@ -602,6 +632,11 @@ fa: return: نمایهٔ این کاربر را نشان بده web: رفتن به وب title: پیگیری %{acct} + challenge: + confirm: ادامه + hint_html: "نکته: ما در یک ساعت آینده رمزتان را از شما نخواهیم پرسید." + invalid_password: رمز نامعتبر + prompt: برای ادامه رمزتان را تأیید کنید datetime: distance_in_words: about_x_hours: "%{count} ساعت" @@ -617,18 +652,33 @@ fa: x_months: "%{count} ماه" x_seconds: "%{count} ثانیه" deletes: + challenge_not_passed: اطلاعاتی که وارد کردید اشتباه بود confirm_password: رمز فعلی خود را وارد کنید تا معلوم شود که خود شمایید + confirm_username: برای تأیید این فرایند نام کاربری خود را وارد کنید proceed: پاک‌کردن حساب success_msg: حساب شما با موفقیت پاک شد + warning: + before: 'پیش از ادامه،‌ لطفاً نکته‌های زیر را به دقت بخوانید:' + caches: محتواهایی که سرورهای دیگر ذخیره کرده‌اند شاید همچنان باقی بمانند + data_removal: نوشته‌ها و داده‌های شما برای همیشه پاک خواهند شد + email_change_html: شما می‌توانید بدون پاک کردن حساب نشانی ایمیل خود را تغییر دهید + email_contact_html: اگر ایمیل همچنان نرسیده، برای درخواست کمک به %{email} پیغام دهید + email_reconfirmation_html: اگر ایمیل تأیید به دستتان نرسیده، می‌توانید یک بار دیگر برایش درخواست بدهید + irreversible: شما نخواهید توانست حساب خود را بازیابی یا فعال‌سازی کنید + more_details_html: برای اطلاعات بیشتر سیاست رازداری را ببینید. + username_available: نام کاربری شما دوباره در دسترس خواهد بود + username_unavailable: نام کاربری شما برای دیگران غیرقابل دسترس خواهد ماند directories: directory: فهرست گزیدهٔ کاربران explanation: کاربران این سرور را بر اساس علاقه‌مندی‌هایشان پیدا کنید explore_mastodon: گشت و گذار در %{title} + domain_validator: + invalid_domain: نام دامین معتبر نیست errors: - '400': The request you submitted was invalid or malformed. + '400': درخواستی که فرستادید نامعتبر یا اشتباه بود. '403': شما اجازهٔ دیدن این صفحه را ندارید. '404': صفحه‌ای که به دنبالش هستید این‌جا نیست. - '406': This page is not available in the requested format. + '406': این صفحه در قالبی که درخواست کرده‌اید موجود نیست. '410': صفحه‌ای که به دنبالش بودید دیگر این‌جا وجود ندارد. '422': content: تأیید امنیتی انجام نشد. آیا مرورگر شما کوکی‌ها را مسدود می‌کند؟ @@ -637,7 +687,7 @@ fa: '500': content: شرمنده، یک چیزی از سمت ما اشتباه شده. title: این صفحه درست نیست - '503': The page could not be served due to a temporary server failure. + '503': این صفحه به خاطر مشکل موقت سرور در دسترس نیست. noscript_html: برای استفاده از نسخهٔ تحت وب ماستدون، لطفاً جاوااسکریپت را فعال کنید. یا به جایش می‌توانید یک اپ ماستدون را به‌کار ببرید. existing_username_validator: not_found: کاربری در این سرور با این نام کاربری پیدا نشد @@ -661,6 +711,7 @@ fa: add_new: افزودن تازه errors: limit: شما بیشترین تعداد مجاز برچسب‌ها را دارید + hint_html: "برچسب‌های برگزیده چیستند؟ این برچسب‌ها (هشتگ‌ها) به طور واضحی روی نمایهٔ عمومی شما نمایش می‌یابند و دیگران می‌توانند نوشته‌های شما را تحت هر کدام از این برچسب‌ها مرور کنند. این یک روش بسیار خوب برای دسته‌بندی آثار خلاقانه یا پروژه‌های بلندمدت شماست." filters: contexts: home: خانه @@ -681,10 +732,12 @@ fa: developers: برنامه‌نویسان more: بیشتر… resources: منابع + trending_now: پرطرفدار generic: all: همه changes_saved_msg: تغییرات با موفقیت ذخیره شدند! copy: رونوشت + no_batch_actions_available: هیچ کار گروهی‌ای در این صفحه موجود نیست order_by: مرتب‌سازی save_changes: ذخیرهٔ تغییرات validation_errors: @@ -756,6 +809,31 @@ fa: too_many: نمی‌توان بیشتر از ۴ تصویر بارگذاری کرد migrations: acct: username@domain حساب تازه + cancel: لغو انتقال + cancel_explanation: با لغو انتقال، حساب شما دوباره فعال می‌شود، ولی این کار پیگیران شما را که به حساب دیگر منتقل شده‌اند برنمی‌گرداند. + cancelled_msg: انتقال حساب با موفقیت لغو شد. + errors: + already_moved: این همان حسابی است که به آن منتقل شده‌اید + missing_also_known_as: به حساب شما اشاره نمی‌کند + move_to_self: نمی‌تواند حساب فعلی شما باشد + not_found: چنین حسابی پیدا نشد + on_cooldown: شما باید صبر کنید + followers_count: شمار پیگیران در زمان انتقال + incoming_migrations: انتقال از یک حساب دیگر + incoming_migrations_html: برای انتقال از یک حساب دیگر به این حساب، شما باید نخست یک نام مستعار بسازید. + moved_msg: حساب شما هم‌اینک به %{acct} منتقل شده است و پیگیران شما در حال انتقال به آن‌جا هستند. + not_redirecting: حساب شما هم‌اینک به هیچ حساب دیگری منتقل نشده است یا اشاره نمی‌کند. + on_cooldown: شما به تازگی حساب خود را منتقل کرده‌اید. این ویژگی برای شما دوباره در %{count} روز فعال خواهد شد. + past_migrations: انتقال‌های پیشین + proceed_with_move: انتقال پیگیران + redirecting_to: حساب شما هم‌اینک به %{acct} منتقل شده است. + warning: + backreference_required: حساب تازهٔ شما نخست باید تنظیم شود تا به این حساب اشاره کند + before: 'پیش از ادامه،‌ لطفاً نکته‌های زیر را به دقت بخوانید:' + cooldown: پس از انتقال حساب، یک دورهٔ انتظار وجود دارد که در این مدت نخواهید توانست دوباره حسابتان را منتقل کنید + disabled_account: حساب فعلی شما پس از این کار دیگر قابل استفاده نخواهد بود. شما فقط خواهید توانست داده‌های خود را بیرون ببرید یا حساب را دوباره فعال کنید. + followers: این کار همهٔ پیگیران شما را از حساب فعلی به حساب تازه منتقل خواهد کرد + other_data: هیچ دادهٔ دیگری خودبه‌خود منتقل نخواهد شد moderation: title: مدیریت کاربران notification_mailer: @@ -900,6 +978,7 @@ fa: settings: account: حساب account_settings: تنظیمات حساب + aliases: نام‌های مستعار appearance: نما authorized_apps: برنامه‌های مجاز back: بازگشت به ماستدون @@ -960,6 +1039,8 @@ fa: pinned: نوشته‌های ثابت reblogged: بازبوقید sensitive_content: محتوای حساس + tags: + does_not_match_previous_name: با نام پیشین مطابق نیست terms: body_html: |

سیاست رازداری

@@ -1077,7 +1158,9 @@ fa: disable: تا وقتی حساب شما متوقف باشد، داده‌های شما دست‌نخورده باقی می‌مانند، ولی تا وقتی که حسابتان باز نشده، نمی‌توانید هیچ کاری با آن بکنید. silence: تا وقتی حساب شما محدود باشد، تنها کسانی که از قبل پیگیر شما بودند نوشته‌های شما در این سرور را می‌بینند و شما در فهرست‌های عمومی دیده نمی‌شوید. ولی دیگران همچنان می‌توانند به دلخواه خودشان پیگیر شما شوند. suspend: حساب شما معلق شده است، و همهٔ نوشته‌ها و رسانه‌های تصویری شما به طور بازگشت‌ناپذیری پاک شده‌اند؛ چه از این سرور و چه از سرورهای دیگری که از آن‌ها پیگیر داشتید. + get_in_touch: با پاسخ به این ایمیل می‌توانید با دست‌اندرکاران %{instance} در تماس باشید. review_server_policies: مرور سیاست‌های این سرور + statuses: 'به طور خاص برای:' subject: disable: حساب %{acct} شما متوقف شده است none: هشدار برای %{acct} diff --git a/config/locales/fr.yml b/config/locales/fr.yml index be146d997..faffc5e75 100644 --- a/config/locales/fr.yml +++ b/config/locales/fr.yml @@ -35,6 +35,13 @@ fr: status_count_before: Ayant publié tagline: Suivez vos ami·e·s et découvrez en de nouveaux·elles terms: Conditions d’utilisation + unavailable_content: Contenu non disponible + unavailable_content_description: + reason: 'Motif :' + rejecting_media: Les fichiers média de ce serveur ne seront pas traités et aucune miniature ne sera affichée, nécessitant un clic manuel vers l'autre serveur. + silenced: Les messages de ce serveur ne s'afficheront nulle part sauf votre flux personnel si vous suivez l'auteur. + suspended: Vous ne pourrez suivre personne de ce serveur, aucune donnée ne sera traitée ou stockée et aucune donnée ne sera échangée. + unavailable_content_html: Mastodon vous permet généralement de visualiser le contenu et d'interagir avec les utilisateurs de n'importe quel autre serveur dans le fédiverse. Voici les exceptions qui ont été faites sur ce serveur en particulier. user_count_after: one: utilisateur other: utilisateurs @@ -222,10 +229,12 @@ fr: deleted_status: "(statut supprimé)" title: Journal d’audit custom_emojis: + assign_category: Attribuer une catégorie by_domain: Domaine copied_msg: Copie locale de l’émoji créée avec succès ! copy: Copier copy_failed_msg: Impossible de faire une copie locale de cet émoji + create_new_category: Créer une nouvelle catégorie created_msg: Émoji créé avec succès ! delete: Supprimer destroyed_msg: Émoji supprimé avec succès ! @@ -242,6 +251,7 @@ fr: shortcode: Raccourci shortcode_hint: Au moins deux caractères, seulement des caractères alphanumériques ou des tirets bas title: Émojis personnalisés + uncategorized: Non catégorisé unlisted: Délisté update_failed_msg: N’a pas pu mettre à jour cet émoji updated_msg: Émoji mis à jour avec succès ! @@ -421,6 +431,9 @@ fr: custom_css: desc_html: Modifier l’apparence avec une CSS chargée sur chaque page title: CSS personnalisé + default_noindex: + desc_html: Affecte tous les utilisateurs qui n'ont pas changé eux-mêmes ce paramètre + title: Opter pour le retrait de l'indexation des moteurs de recherche par défaut domain_blocks: all: À tout le monde disabled: À personne @@ -512,6 +525,10 @@ fr: context: Contexte  directory: Dans le répertoire in_directory: "%{count} dans le répertoire" + last_active: Dernière activité + most_popular: Plus populaire + most_recent: Plus récent + name: Mot-clé review: État de traitement reviewed: Traité title: Hashtags @@ -537,6 +554,12 @@ fr: new_trending_tag: body: 'Le hashtag #%{name} est populaire aujourd’hui, mais il n’a pas été approuvé. Il ne sera pas affiché publiquement à moins que l’autorisiez, ou sauvegardez simplement ce formulaire tel quel pour ne plus jamais en entendre parler.' subject: Nouveau hashtag en attente de traitement sur %{instance} (#%{name}) + aliases: + add_new: Créer un alias + created_msg: Un nouvel alias a été créé avec succès. Vous pouvez maintenant lancer le déplacement depuis l'ancien compte. + deleted_msg: Suppression réussie de l'alias. Déplacer de ce compte vers celui-ci ne sera plus possible. + hint_html: Si vous voulez passer d'un autre compte à celui-ci, vous pouvez créer ici un alias, qui est nécessaire avant de pouvoir déplacer les abonné·e·s de l'ancien compte à celui-ci. Cette action en soi est inoffensive et réversible. La migration du compte est initiée à partir de l'ancien compte. + remove: Détacher l'alias appearance: advanced_web_interface: Interface web avancée advanced_web_interface_hint: 'Si vous voulez utiliser toute la largeur de votre écran, l’interface web avancée vous permet de configurer plusieurs colonnes différentes pour voir autant d’informations que vous le souhaitez en même temps : Accueil, notifications, fil public fédéré, un nombre illimité de listes et hashtags.' @@ -596,6 +619,7 @@ fr: confirming: En attente de la confirmation par e-mail à compléter. functional: Votre compte est entièrement opérationnel. pending: Votre demande est en attente d'examen par notre personnel. Cela peut prendre un certain temps. Vous recevrez un courriel si votre demande est approuvée. + redirecting_to: Votre compte est inactif car il est actuellement redirigé vers %{acct}. trouble_logging_in: Vous avez un problème pour vous connecter ? authorize_follow: already_following: Vous suivez déjà ce compte @@ -608,6 +632,11 @@ fr: return: Afficher le profil de l’utilisateur⋅ice web: Retour à l’interface web title: Suivre %{acct} + challenge: + confirm: Continuer + hint_html: "Astuce : Nous ne vous demanderons plus votre mot de passe pour la prochaine heure." + invalid_password: Mot de passe invalide + prompt: Confirmez votre mot de passe pour continuer datetime: distance_in_words: about_x_hours: "%{count} h" @@ -623,10 +652,19 @@ fr: x_months: "%{count} mois" x_seconds: "%{count} s" deletes: + challenge_not_passed: Les renseignements que vous avez entrés n'étaient pas exacts confirm_password: Entrez votre mot de passe pour vérifier votre identité + confirm_username: Entrez votre nom d'utilisateur pour confirmer la procédure proceed: Supprimer compte success_msg: Votre compte a été supprimé avec succès warning: + before: 'Avant de procéder, veuillez lire attentivement ces notes :' + caches: Le contenu mis en cache par d'autres serveurs peut persister + data_removal: Vos messages et autres données seront définitivement supprimés + email_change_html: Vous pouvez modifier votre adresse courriel sans supprimer votre compte + email_contact_html: S'il n'arrive toujours pas, vous pouvez envoyer un courriel à %{email} pour de l'aide + email_reconfirmation_html: Si vous ne recevez pas le courriel de confirmation, vous pouvez le demander à nouveau + irreversible: Vous ne pourrez pas restaurer ou réactiver votre compte more_details_html: Pour plus de détails, voir la politique de confidentialité. username_available: Votre nom d’utilisateur sera à nouveau disponible username_unavailable: Votre nom d’utilisateur restera indisponible @@ -637,7 +675,7 @@ fr: domain_validator: invalid_domain: n’est pas un nom de domaine valide errors: - '400': The request you submitted was invalid or malformed. + '400': La demande que vous avez soumise est invalide ou mal formée. '403': Vous n’avez pas accès à cette page. '404': La page que vous recherchez n’existe pas. '406': Cette page n'est pas disponible au format demandé. @@ -649,7 +687,7 @@ fr: '500': content: Nous sommes désolé·e·s, mais quelque chose s’est mal passé de notre côté. title: Cette page n’est pas correcte - '503': The page could not be served due to a temporary server failure. + '503': La page n'a pas pu être servie en raison d'une défaillance temporaire du serveur. noscript_html: Pour utiliser Mastodon, veuillez activer JavaScript. Sinon, essayez l’une des applications natives pour Mastodon pour votre plate-forme. existing_username_validator: not_found: n’a pas trouvé d’utilisateur·rice local·e avec ce nom @@ -699,6 +737,7 @@ fr: all: Tous changes_saved_msg: Les modifications ont été enregistrées avec succès ! copy: Copier + no_batch_actions_available: Aucune action par lots disponible sur cette page order_by: Classer par save_changes: Enregistrer les modifications validation_errors: @@ -770,6 +809,31 @@ fr: too_many: Impossible de joindre plus de 4 fichiers migrations: acct: profil@domaine du nouveau compte + cancel: Annuler la redirection + cancel_explanation: Annuler la redirection réactivera votre compte courant, mais ne rapportera pas les abonnés qui ont été déplacés sur ce compte. + cancelled_msg: Suppression de la redirection réussie. + errors: + already_moved: est le même compte que vous avez déjà déplacé vers + missing_also_known_as: ne référence pas rétroactivement ce compte + move_to_self: ne peut pas être un compte courant + not_found: n'a pas été trouvé + on_cooldown: Vous êtes en refroidissement + followers_count: Abonnés au moment du déplacement + incoming_migrations: Déplacement d'un compte différent + incoming_migrations_html: Pour passer d'un autre compte à celui-ci, vous devez d'abord créer un alias de compte. + moved_msg: Votre compte est maintenant redirigé vers %{acct} et vos abonnés sont déplacés. + not_redirecting: Votre compte n'est pas redirigé vers un autre compte actuellement. + on_cooldown: Vous avez récemment migré votre compte. Cette fonction sera à nouveau disponible dans %{count} jours. + past_migrations: Migrations passées + proceed_with_move: Déplacer les abonnés + redirecting_to: Votre compte est redirigé vers %{acct}. + warning: + backreference_required: Le nouveau compte doit d'abord être configuré pour faire référence à celui-ci + before: 'Avant de procéder, veuillez lire attentivement ces notes :' + cooldown: Après le déménagement, il y a une période de refroidissement pendant laquelle vous ne pourrez plus bouger + disabled_account: Votre compte actuel ne sera pas entièrement utilisable par la suite. Cependant, vous aurez accès à l'exportation de données et à la ré-activation. + followers: Cette action va déplacer tous les abonnés du compte courant vers le nouveau compte + other_data: Aucune autre donnée ne sera déplacée automatiquement moderation: title: Modération notification_mailer: @@ -914,6 +978,7 @@ fr: settings: account: Compte account_settings: Paramètres du compte + aliases: Alias du compte appearance: Apparence authorized_apps: Applications autorisées back: Retour vers Mastodon diff --git a/config/locales/ja.yml b/config/locales/ja.yml index 1c63a706f..2649fb2a3 100644 --- a/config/locales/ja.yml +++ b/config/locales/ja.yml @@ -34,6 +34,13 @@ ja: status_count_before: トゥート数 tagline: Follow friends and discover new ones terms: 利用規約 + unavailable_content: 制限中のサーバー + unavailable_content_description: + reason: '制限理由:' + rejecting_media: このサーバーからのメディアファイルは受信されず、サムネイルも表示されません。表示するにはクリックしてそのサーバーに直接アクセスする必要があります。 + silenced: このサーバーからの投稿は相手をフォローしてもあなたのホームタイムライン以外には表示されません。 + suspended: このサーバーからは誰もフォローできません。このサーバーからのデータは受信されず、やりとりもされません。 + unavailable_content_html: 通常 Mastodon では連合先のどんなサーバーのユーザーとでもやりとりできます。ただし次のサーバーには例外が設定されています。 user_count_after: other: 人 user_count_before: ユーザー数 @@ -218,10 +225,12 @@ ja: deleted_status: "(削除済)" title: 操作履歴 custom_emojis: + assign_category: カテゴリーを割り当て by_domain: ドメイン copied_msg: 絵文字のコピーをローカルに作成しました copy: コピー copy_failed_msg: 絵文字のコピーをローカルに作成できませんでした + create_new_category: カテゴリーを作成 created_msg: 絵文字の追加に成功しました! delete: 削除 destroyed_msg: 絵文字の削除に成功しました! @@ -238,6 +247,7 @@ ja: shortcode: ショートコード shortcode_hint: 2文字以上の半角英数字とアンダーバーのみ利用できます title: カスタム絵文字 + uncategorized: 未分類 unlisted: 未収載 update_failed_msg: 絵文字を更新できませんでした updated_msg: 絵文字の更新に成功しました! @@ -415,6 +425,9 @@ ja: custom_css: desc_html: 全ページに適用されるCSSの編集 title: カスタムCSS + default_noindex: + desc_html: この設定を変更していない全ユーザーに影響します + title: デフォルトで検索エンジンによるインデックスを拒否する domain_blocks: all: 誰でも許可 disabled: 誰も許可しない @@ -506,6 +519,10 @@ ja: context: 表示先 directory: ディレクトリに使用 in_directory: "%{count} 人がディレクトリに使用" + last_active: 最近使われた順 + most_popular: 使用頻度順 + most_recent: 新着順 + name: ハッシュタグ review: 審査状況 reviewed: 審査済み title: ハッシュタグ @@ -531,6 +548,12 @@ ja: new_trending_tag: body: 'ハッシュタグ #%{name} が本日のトレンドになっていますが、審査がまだ行われていないためトレンドタグには表示されていません。一度許可すれば次回からこの操作は不要です。' subject: "%{instance} で新しいハッシュタグ (#%{name}) が審査待ちです" + aliases: + add_new: エイリアスを作成 + created_msg: エイリアスを作成しました。これで以前のアカウントから引っ越しを開始できます。 + deleted_msg: エイリアスを解除しました。そのアカウントからは引っ越しできなくなります。 + hint_html: 他のアカウントからこのアカウントにフォロワーを引き継いで引っ越したい場合、ここでエイリアスを作成しておく必要があります。エイリアス自体は無害で、取り消すことができます。引っ越しは以前のアカウント側から開始する必要があります。 + remove: エイリアスを解除 appearance: advanced_web_interface: 上級者向け UI advanced_web_interface_hint: ディスプレイを幅いっぱいまで活用したい場合、上級者向け UI をおすすめします。ホーム、通知、連合タイムライン、更にはリストやハッシュタグなど、様々な異なるカラムから望む限りの情報を一度に受け取れるような設定が可能になります。 @@ -560,6 +583,10 @@ ja: checkbox_agreement_without_rules_html: 利用規約 に同意します delete_account: アカウントの削除 delete_account_html: アカウントを削除したい場合、こちら から手続きが行えます。削除する前に、確認画面があります。 + description: + prefix_invited_by_user: "@%{name} があなたをこの Mastodon サーバーに招待しました" + prefix_sign_up: 今すぐ Mastodon に登録しましょう! + suffix: アカウントがあれば、どんな Mastodon 互換サーバーのユーザーでもフォローしたりメッセージをやり取りできるようになります! didnt_get_confirmation: 確認メールを受信できませんか? forgot_password: パスワードをお忘れですか? invalid_reset_password_token: パスワードリセットトークンが正しくないか期限切れです。もう一度リクエストしてください。 @@ -586,6 +613,7 @@ ja: confirming: メールアドレスの確認が完了するのを待っています。 functional: アカウントは完全に機能しています。 pending: あなたの申請は現在サーバー管理者による審査待ちです。これにはしばらくかかります。申請が承認されるとメールが届きます。 + redirecting_to: アカウントは %{acct} に引っ越し設定されているため非アクティブになっています。 trouble_logging_in: ログインできませんか? authorize_follow: already_following: あなたは既にこのアカウントをフォローしています @@ -598,6 +626,11 @@ ja: return: ユーザーのプロフィールを見る web: Web を開く title: "%{acct} をフォロー" + challenge: + confirm: 続行する + hint_html: 以後 1 時間はパスワードの再入力を求めません + invalid_password: パスワードが間違っています + prompt: 続行するにはパスワードを入力してください datetime: distance_in_words: about_x_hours: "%{count}時間" diff --git a/config/locales/ko.yml b/config/locales/ko.yml index c95189dc5..fb32552da 100644 --- a/config/locales/ko.yml +++ b/config/locales/ko.yml @@ -34,6 +34,9 @@ ko: status_count_before: 툿 수 tagline: 친구들을 팔로우 하고 새로운 사람들도 만나기 terms: 이용약관 + unavailable_content: 이용 불가능한 컨텐츠 + unavailable_content_description: + reason: '이유:' user_count_after: other: 명 user_count_before: 사용자 수 @@ -614,6 +617,11 @@ ko: return: 유저 프로필 보기 web: 웹으로 가기 title: "%{acct} 를 팔로우" + challenge: + confirm: 계속 + hint_html: "팁:한 시간동안 다시 비밀번호를 묻지 않을 겁니다." + invalid_password: 잘못된 비밀번호 + prompt: 계속하려면 암호 확인 datetime: distance_in_words: about_x_hours: "%{count}시간" @@ -784,6 +792,18 @@ ko: too_many: 최대 4개까지 첨부할 수 있습니다 migrations: acct: 새 계정의 username@domain + cancel: 리디렉션 취소 + errors: + not_found: 찾을 수 없습니다 + incoming_migrations: 다른 계정으로부터 옮기기 + on_cooldown: 당신은 최근에 이미 계정을 이동했습니다. 이 기능은 %{count} 일 후에 다시 이용 가능합니다. + past_migrations: 이전 마이그레이션 + proceed_with_move: 팔로워 이동 + redirecting_to: 당신의 계정은 %{acct} 로 리다이렉트됩니다. + warning: + before: '진행하기 전, 주의사항을 꼼꼼히 읽어보세요:' + followers: 이 행동은 현재 계정의 모든 팔로워를 새 계정으로 이동시킵니다 + other_data: 다른 어떤 데이터도 자동적으로 옮겨지지 않을 것입니다 moderation: title: 모더레이션 notification_mailer: @@ -926,6 +946,7 @@ ko: settings: account: 계정 account_settings: 계정 설정 + aliases: 계정 별명 appearance: 외관 authorized_apps: 인증된 애플리케이션 back: 돌아가기 diff --git a/config/locales/nl.yml b/config/locales/nl.yml index 1878a95a2..213d213c3 100644 --- a/config/locales/nl.yml +++ b/config/locales/nl.yml @@ -40,6 +40,7 @@ nl: reason: 'Reden:' rejecting_media: Mediabestanden van deze server worden niet verwerkt en er worden geen thumbnails getoond. Je moet handmatig naar deze server doorklikken om de mediabestanden te kunnen bekijken. silenced: Toots van deze server worden nergens weergegeven, behalve op jouw eigen starttijdlijn wanneer je het account volgt. + suspended: Je bent niet in staat om iemand van deze server te volgen, en er worden geen gegevens van deze server verwerkt of opgeslagen, en met deze server uitgewisseld. user_count_after: one: gebruiker other: gebruikers @@ -510,8 +511,8 @@ nl: title: Toots van account with_media: Met media tags: - accounts_today: Aantal unieke keren vandaag gebruikt - accounts_week: Aantal unieke keren deze week gebruikt + accounts_today: Aantal verschillende keren vandaag gebruikt + accounts_week: Aantal verschillende keren deze week gebruikt breakdown: Uitsplitsing van het gebruik van vandaag naar bron context: Context directory: In de gebruikersgids @@ -524,8 +525,9 @@ nl: reviewed: Beoordeeld title: Hashtags trending_right_now: Op dit moment trending - unique_uses_today: "%{count} toots vandaag" + unique_uses_today: "%{count} keer vandaag gebruikt" unreviewed: Niet beoordeeld + updated_msg: Instellingen hashtag succesvol bijgewerkt title: Beheer warning_presets: add_new: Nieuwe toevoegen @@ -541,6 +543,11 @@ nl: body: "%{reporter} heeft %{target} gerapporteerd" body_remote: Iemand van %{domain} heeft %{target} gerapporteerd subject: Nieuwe rapportage op %{instance} (#%{id}) + aliases: + add_new: Alias aanmaken + created_msg: Succesvol een nieuwe alias aangemaakt. Je kunt nu met de verhuizing vanaf het oude account beginnen. + deleted_msg: De alias is succesvol verwijderd. Verhuizen vanaf dat account naar dit account is niet meer mogelijk. + remove: Alias ontkoppelen appearance: advanced_web_interface: Geavanceerde webomgeving advanced_web_interface_hint: 'Wanneer je van de hele schermbreedte gebruik wilt maken, stelt de geavanceerde webomgeving je in staat om meerdere verschillende kolommen te configureren. Hiermee kun je zoveel mogelijk informatie op hetzelfde moment bekijken, zoals: Start, meldingen, de globale tijdlijn, meerdere lijsten en hashtags.' @@ -569,6 +576,8 @@ nl: checkbox_agreement_html: Ik ga akkoord met de regels van deze server en de gebruiksvoorwaarden delete_account: Account verwijderen delete_account_html: Wanneer je jouw account graag wilt verwijderen, kun je dat hier doen. We vragen jou daar om een bevestiging. + description: + prefix_sign_up: Registreer je vandaag nog op Mastodon! didnt_get_confirmation: Geen bevestigingsinstructies ontvangen? forgot_password: Wachtwoord vergeten? invalid_reset_password_token: De code om jouw wachtwoord opnieuw in te stellen is verlopen. Vraag een nieuwe aan. @@ -590,6 +599,7 @@ nl: title: Instellen status: account_status: Accountstatus + functional: Jouw account is volledig operationeel. trouble_logging_in: Problemen met inloggen? authorize_follow: already_following: Je volgt dit account al @@ -626,10 +636,15 @@ nl: confirm_username: Voer uw gebruikersnaam in om de procedure te bevestigen proceed: Account verwijderen success_msg: Jouw account is succesvol verwijderd + warning: + username_available: Jouw gebruikersnaam zal weer beschikbaar komen + username_unavailable: Jouw gebruikersnaam zal onbeschikbaar blijven directories: directory: Gebruikersgids explanation: Ontdek gebruikers aan de hand van hun interesses explore_mastodon: "%{title} verkennen" + domain_validator: + invalid_domain: is een ongeldige domeinnaam errors: '400': The request you submitted was invalid or malformed. '403': Jij hebt geen toestemming om deze pagina te bekijken. @@ -763,6 +778,7 @@ nl: too_many: Er kunnen niet meer dan 4 afbeeldingen toegevoegd worden migrations: acct: Verhuisd naar + cancel: Doorverwijzing annuleren cancelled_msg: De doorverwijzing is succesvol geannuleerd. errors: already_moved: is hetzelfde account waarnaar je al naar toe bent verhuisd @@ -989,6 +1005,8 @@ nl: pinned: Vastgemaakte toot reblogged: boostte sensitive_content: Gevoelige inhoud + tags: + does_not_match_previous_name: komt niet overeen met de vorige naam terms: body_html: |

Privacy Policy

@@ -1106,7 +1124,9 @@ nl: disable: Zolang jouw account is bevroren blijven jouw accountgegevens intact, maar kun je geen handelingen uitvoeren totdat het account is vrijgegeven. silence: Zolang jouw account wordt beperkt, kunnen alleen mensen die jou al volgen jouw toots op deze server zien. Tevens ben je niet zichtbaar in meldingen, gesprekken en op openbare tijdlijnen. Anderen kunnen je echter wel handmatig volgen. suspend: Jouw account is opgeschort. Jouw toots en geüploade media zijn onomkeerbaar van deze server verwijderd, en ook o.a. van de servers waar jij volgers had. + get_in_touch: Je kunt deze e-mail beantwoorden om in contact te komen met de medewerkers van %{instance}. review_server_policies: Serverbeleid bekijken + statuses: 'Met name voor:' subject: disable: Jouw account %{acct} is bevroren none: Waarschuwing voor %{acct} diff --git a/config/locales/oc.yml b/config/locales/oc.yml index 2d11d3399..101483c3e 100644 --- a/config/locales/oc.yml +++ b/config/locales/oc.yml @@ -32,6 +32,9 @@ oc: status_count_before: qu’an escrich tagline: Seguètz d’amics e trobatz-ne de nòus terms: Condicions d’utilizacion + unavailable_content: Contengut pas disponible + unavailable_content_description: + reason: 'Motiu :' user_count_after: one: utilizaire other: utilizaires @@ -486,6 +489,10 @@ oc: context: Contèxt directory: A l’annuari in_directory: "%{count} a l’annuari" + last_active: Darrièra activitat + most_popular: Mai popularas + most_recent: Mai recentas + name: Etiqueta title: Etiquetas title: Administracion warning_presets: @@ -507,6 +514,7 @@ oc: advanced_web_interface_hint: 'Se volètz utilizar la nautor complèta de l’ecran, l’interfàcia web avançada vos permet de configurar diferentas colomnas per mostrar tan d’informacions que volètz : Acuèlh, notificacions, flux d’actualitat, e d’autras listas e etiquetas.' animations_and_accessibility: Animacion e accessibilitat confirmation_dialogs: Fenèstras de confirmacion + discovery: Descobèrta sensitive_content: Contengut sensible application_mailer: notification_preferences: Cambiar las preferéncias de corrièl @@ -562,6 +570,10 @@ oc: return: Veire lo perfil a la persona web: Tornar a l’interfàcia Web title: Sègre %{acct} + challenge: + confirm: Contunhar + invalid_password: Senhal invalid + prompt: Confirmatz lo senhal per dire de contunhar datetime: distance_in_words: about_x_hours: "%{count} h" @@ -584,6 +596,8 @@ oc: directory: Annuari de perfils explanation: Trobar d’utilizaires segon lor interèsses explore_mastodon: Explorar %{title} + domain_validator: + invalid_domain: es pas un nom de domeni valid errors: '400': The request you submitted was invalid or malformed. '403': Avètz pas l’autorizacion de veire aquesta pagina. @@ -641,6 +655,7 @@ oc: developers: Desvolopaires more: Mai… resources: Ressorsas + trending_now: Tendéncia del moment generic: all: Tot changes_saved_msg: Cambiaments ben realizats ! @@ -716,6 +731,10 @@ oc: too_many: Se pòt pas ajustar mai de 4 fichièrs migrations: acct: nomutilizaire@domeni del nòu compte + errors: + move_to_self: pòt pas èsser lo compte actual + not_found: impossible de trobar + proceed_with_move: Desplaçar los seguidors moderation: title: Moderacion notification_mailer: @@ -1038,6 +1057,7 @@ oc: silence: Del temps que vòstre compte es limitat, solament lo monde que vos sègon veiràn vòstres tuts sus aqueste servidor, e poiriatz èsser tirat de mantunas listas publicas. Pasmens, d’autres vos pòdon sègre manualament. suspend: Vòstre compte es suspendut e totes vòstres tuts e fichièrs enviats son estats suprimits sens retorn possible d’aqueste servidor e los de vòstres seguidors. review_server_policies: Repassar las politicas del servidor + statuses: 'Especificament per :' subject: disable: Vòstre compte %{acct} es gelat none: Avertiment per %{acct} diff --git a/config/locales/pt-BR.yml b/config/locales/pt-BR.yml index ac7e70908..32ea8caf6 100644 --- a/config/locales/pt-BR.yml +++ b/config/locales/pt-BR.yml @@ -7,6 +7,7 @@ pt-BR: active_count_after: Ativo active_footnote: Usuários ativos mensais (UAM) administered_by: 'Administrado por:' + api: API apps: Apps apps_platforms: Use o Mastodon a partir de iOS, Android e outras plataformas browse_directory: Navegue pelo diretório de perfis e filtre por interesses @@ -28,6 +29,11 @@ pt-BR: status_count_before: Autores de tagline: Siga amigos e encontre novos terms: Termos de serviço + unavailable_content: Conteúdo indisponível + unavailable_content_description: + reason: 'Motivo:' + suspended: Você não será capaz de seguir ninguém deste servidor, e nenhum dado dele será processado ou armazenado, e nenhum dado trocado. + unavailable_content_html: Mastodon geralmente permite que você veja o conteúdo e interaja com usuários de qualquer outro servidor no fediverso. Estas são as exceções deste servidor específico. user_count_after: one: usuário other: usuários @@ -35,6 +41,7 @@ pt-BR: what_is_mastodon: O que é Mastodon? accounts: choices_html: 'Escolhas de %{name}:' + featured_tags_hint: Você pode destacar hashtags específicas que serão exibidas aqui. follow: Seguir followers: one: Seguidor @@ -46,11 +53,16 @@ pt-BR: media: Mídia moved_html: "%{name} se mudou para %{new_profile_link}:" network_hidden: Esta informação não está disponível + never_active: Nunca nothing_here: Não há nada aqui! people_followed_by: Pessoas que %{name} segue people_who_follow: Pessoas que seguem %{name} pin_errors: following: Você tem que estar seguindo a pessoa que você quer sugerir + posts: + one: Toot + other: Toots + posts_tab_heading: Toots posts_with_replies: Toots e respostas reserved_username: Este usuário está reservado roles: @@ -72,6 +84,7 @@ pt-BR: approve: Aprovar approve_all: Aprovar tudo are_you_sure: Você tem certeza? + avatar: Imagem de Perfil by_domain: Domínio change_email: changed_msg: E-mail da conta modificado com sucesso! @@ -102,9 +115,11 @@ pt-BR: header: Cabeçalho inbox_url: URL da caixa de entrada invited_by: Convidado por + ip: IP joined: Se cadastrou location: all: Todos + local: Local remote: Remoto title: Localização login_status: Situação de login @@ -160,6 +175,7 @@ pt-BR: statuses: Postagens subscribe: Inscrever-se suspended: Suspenso + time_in_queue: Esperando na fila por %{time} title: Contas unconfirmed_email: E-mail não confirmado undo_silenced: Retirar silenciamento @@ -167,6 +183,7 @@ pt-BR: unsubscribe: Desinscrever-se username: Nome de usuário warn: Notificar + web: Web action_logs: actions: assigned_to_self_report: "%{name} designou a denúncia %{target} para si" @@ -202,15 +219,18 @@ pt-BR: deleted_status: "(status deletado)" title: Auditar relatório custom_emojis: + assign_category: Designar Categoria by_domain: Domínio copied_msg: Cópia local do emoji criada com sucesso copy: Copiar copy_failed_msg: Não foi possível criar uma cópia local deste emoji + create_new_category: Criar nova categoria created_msg: Emoji criado com sucesso! delete: Excluir destroyed_msg: Emoji deletado com sucesso! disable: Desabilitar disabled_msg: Emoji desabilitado com sucesso + emoji: Emoji enable: Habilitar enabled_msg: Emoji habilitado com sucesso image_hint: PNG de até 50KB @@ -221,6 +241,7 @@ pt-BR: shortcode: Atalho shortcode_hint: Pelo menos 2 caracteres, apenas caracteres alfanuméricos e underscores title: Emojis customizados + uncategorized: Não categorizado unlisted: Não listado update_failed_msg: Não foi possível atualizar esse emoji updated_msg: Emoji atualizado com sucesso! @@ -233,13 +254,17 @@ pt-BR: feature_profile_directory: Diretório de perfis feature_registrations: Cadastros feature_relay: Repetidor da federação + feature_spam_check: Anti-spam feature_timeline_preview: pré-visualização da timeline features: Funcionalidades hidden_service: Federação com serviços onion open_reports: Denúncias em aberto + pending_tags: hashtags aguardando revisão + pending_users: usuários aguardando revisão recent_users: Usuários recentes search: Pesquisa em texto single_user_mode: Modo de usuário único + software: Software space: Uso de espaço em disco title: Painel de controle total_users: usuários no total @@ -252,6 +277,8 @@ pt-BR: created_msg: Bloqueio de domínio está sendo processado destroyed_msg: Bloqueio de domínio desfeito domain: Domínio + edit: Editar bloqueio de domínio + existing_domain_block_html: Você já impôs limites mais restritivos a %{name}, é necessário primeiro desbloqueá-lo. new: create: Criar bloqueio hint: O bloqueio de domínio não prevenirá a criação de entradas de contas na base de dados, mas vai reatroativa e automaticamente aplicar métodos específicos de moderação nestas contas. @@ -261,6 +288,8 @@ pt-BR: silence: Silêncio suspend: Suspensão title: Novo bloqueio de domínio + private_comment: Comentário privado + public_comment: Comentário público reject_media: Rejeitar arquivos de mídia reject_media_hint: Remove arquivos de mídia armazenados localmente e recusa quaisquer outros no futuro. Irrelevante para suspensões reject_reports: Rejeitar denúncias @@ -280,6 +309,7 @@ pt-BR: title: Retirar bloqueio de domínio de %{domain} undo: Retirar undo: Retirar bloqueio de domínio + view: Ver domínios bloqueados email_domain_blocks: add_new: Adicionar novo created_msg: Bloqueio de domínio de e-mail criado com sucesso @@ -303,6 +333,8 @@ pt-BR: all: Todas limited: Limitado title: Moderação + private_comment: Comentário privado + public_comment: Comentário público title: Federação total_blocked_by_us: Bloqueado por nós total_followed_by_them: Seguidos por eles @@ -378,6 +410,15 @@ pt-BR: custom_css: desc_html: Modificar o visual com CSS que é carregado em todas as páginas title: CSS customizado + default_noindex: + desc_html: Afeta qualquer usuário que não tenha modificado esta configuração manualmente + domain_blocks: + all: Para todo mundo + disabled: Para ninguém + title: Mostrar domínios bloqueados + users: Para usuários locais logados + domain_blocks_rationale: + title: Visualizar justificativa hero: desc_html: Aparece na página inicial. Ao menos 600x100px é recomendado. Se não estiver definido, o thumbnail da instância é usado no lugar title: Imagem de capa @@ -428,6 +469,8 @@ pt-BR: desc_html: Você pode escrever a sua própria política de privacidade, termos de serviço, entre outras coisas. Você pode usar tags HTML title: Termos de serviço customizados site_title: Nome da instância + spam_check_enabled: + title: Automação anti-spam thumbnail: desc_html: Usada para prévias via OpenGraph e API. Recomenda-se 1200x630px title: Miniatura da instância @@ -435,12 +478,15 @@ pt-BR: desc_html: Exibir a timeline pública na página inicial title: Prévia da timeline title: Configurações do site + trends: + title: Hashtags em alta statuses: back_to_account: Voltar para página da conta batch: delete: Deletar nsfw_off: Marcar como não-sensível nsfw_on: Marcar como sensível + deleted: Excluídos failed_to_execute: Falha em executar media: title: Mídia @@ -448,6 +494,16 @@ pt-BR: no_status_selected: Nenhum status foi modificado porque nenhum estava selecionado title: Postagens da conta with_media: Com mídia + tags: + context: Contexto + directory: No diretório + most_popular: Mais populares + most_recent: Mais recentes + name: Hashtag + title: Hashtags + trending_right_now: Em alta no momento + unreviewed: Não revisadas + updated_msg: Configurações de hashtag atualizadas com sucesso title: Administração warning_presets: add_new: Adicionar um novo @@ -463,8 +519,14 @@ pt-BR: body: "%{reporter} denunciou %{target}" body_remote: Alguém da instância %{domain} reportou %{target} subject: Nova denúncia sobre %{instance} (#%{id}) + appearance: + animations_and_accessibility: Animações e acessibilidade + confirmation_dialogs: Popups de confirmação + discovery: Descobrir + sensitive_content: Conteúdo sensível application_mailer: notification_preferences: Mudar preferências de e-mail + salutation: "%{name}," settings: 'Mudar e-mail de preferência: %{link}' view: 'Visualizar:' view_profile: Ver perfil @@ -481,8 +543,13 @@ pt-BR: apply_for_account: Pedir um convite change_password: Senha checkbox_agreement_html: Eu concordo com as regras do servidor e com os termos de serviço + checkbox_agreement_without_rules_html: Concordo com os termos do serviço delete_account: Excluir conta delete_account_html: Se você deseja excluir a sua conta, você pode prosseguir para cá. Uma confirmação será requisitada. + description: + prefix_invited_by_user: "@%{name} convidou você para entrar neste servidor do Mastodon!" + prefix_sign_up: Cadastre-se no Mastodon hoje! + suffix: Com uma conta, você poderá seguir pessoas, postar atualizações, trocar mensagens com usuários de qualquer servidor Mastodon e muito mais! didnt_get_confirmation: Não recebeu instruções de confirmação? forgot_password: Esqueceu a sua senha? invalid_reset_password_token: Token de modificação de senha é inválido ou expirou. Por favor, requisite um novo. @@ -491,6 +558,9 @@ pt-BR: migrate_account: Mudar para uma conta diferente migrate_account_html: Se você quer redirecionar essa conta para uma outra você pode configurar isso aqui. or_log_in_with: Ou faça login com + providers: + cas: CAS + saml: SAML register: Cadastrar-se registration_closed: "%{instance} não está aceitando novos membros" resend_confirmation: Reenviar instruções de confirmação @@ -509,8 +579,12 @@ pt-BR: return: Exibir o perfil do usuário web: Voltar para a página inicial title: Seguir %{acct} + challenge: + invalid_password: Senha inválida + prompt: Confirme sua senha para continuar datetime: distance_in_words: + about_x_hours: "%{count}h" about_x_months: "%{count} meses" about_x_years: "%{count} anos" almost_x_years: "%{count} anos" @@ -523,9 +597,16 @@ pt-BR: x_months: "%{count} meses" x_seconds: "%{count} segundos" deletes: + challenge_not_passed: As informações que você inseriu não estão corretas confirm_password: Insira a sua senha atual para verificar a sua identidade + confirm_username: Digite seu nome de usuário para confirmar o procedimento proceed: Excluir conta success_msg: A sua conta foi excluída com sucesso + warning: + before: 'Antes de prosseguir, por favor leia com cuidado:' + data_removal: Suas postagens e outros dados serão removidos permanentemente + username_available: Seu nome de usuário ficará disponível novamente + username_unavailable: Seu nome de usuário permanecerá indisponível directories: directory: Diretório de perfis explanation: Descobrir usuários baseado em seus interesses @@ -557,6 +638,7 @@ pt-BR: request: Solicitar o seu arquivo size: Tamanho blocks: Você bloqueou + csv: CSV domain_blocks: Bloqueios de domínio follows: Você segue lists: Listas @@ -661,6 +743,15 @@ pt-BR: too_many: Não é possível anexar mais de 4 imagens migrations: acct: username@domain da nova conta + incoming_migrations: Migrando de outra conta + moved_msg: Agora sua conta está redirecionando para %{acct} e seus seguidores estão sendo movidos. + not_redirecting: Sua conta não está redirecionando para nenhuma outra conta atualmente. + on_cooldown: Você migrou recentemente sua conta. Esta função ficará disponível novamente em %{count} dias. + past_migrations: Migrações passadas + proceed_with_move: Migrar seguidores + redirecting_to: Sua conta está redirecionando para %{acct}. + warning: + before: 'Antes de prosseguir, por favor leia com cuidado:' moderation: title: Moderação notification_mailer: @@ -752,13 +843,40 @@ pt-BR: activity: Última atividade browser: Navegador browsers: + alipay: Alipay + blackberry: BlackBerry + chrome: Chrome + edge: Microsoft Edge + electron: Electron + firefox: Firefox generic: Navegador desconhecido + ie: Internet Explorer + micro_messenger: MicroMessenger nokia: Navegador Nokia S40 Ovi + opera: Opera + otter: Otter + phantom_js: PhantomJS + qq: QQ Browser + safari: Safari + uc_browser: UCBrowser + weibo: Weibo current_session: Sessão atual description: "%{browser} em %{platform}" explanation: Estes são os navegadores que estão conectados com a sua conta do Mastodon. + ip: IP platforms: + adobe_air: Adobe Air + android: Android + blackberry: BlackBerry + chrome_os: ChromeOS + firefox_os: Firefox OS + ios: iOS + linux: Linux + mac: Mac other: Plataforma desconhecida + windows: Windows + windows_mobile: Windows Mobile + windows_phone: Windows Phone revoke: Revogar revoke_success: Sessão revogada com sucesso title: Sessões @@ -782,6 +900,8 @@ pt-BR: profile: Perfil relationships: Seguindo e seguidores two_factor_authentication: Autenticação em dois passos + spam_check: + spam_detected_and_silenced: Este é um relatório automatizado. Spam foi detectado e o remetente foi silenciado automaticamente. Se isto for um erro, por favor, desfaça esta ação. statuses: attached: description: 'Anexado: %{attached}' @@ -811,6 +931,7 @@ pt-BR: vote: Votar show_more: Mostrar mais sign_in_to_participate: Entre para participar dessa conversa + title: '%{name}: "%{quote}"' visibilities: private: Apenas seguidores private_long: Mostrar apenas para seguidores @@ -822,6 +943,8 @@ pt-BR: pinned: Toot fixado reblogged: compartilhou sensitive_content: Conteúdo sensível + tags: + does_not_match_previous_name: não corresponde ao nome anterior terms: body_html: |

Política de privacidade

@@ -938,6 +1061,7 @@ pt-BR: disable: Enquanto sua conta está congelada, seus dados estão intactos, mas você não pode realizar nenhuma ação até que sua conta seja desbloqueada. silence: Enquanto sua conta está limitada, somente pessoas que já estão seguindo você poderão ver seus toots nesse servidor, e você pode ser excluído de diversas listagens públicas. No entanto, outros ainda podem seguir você manualmente. suspend: Sua conta está suspensa e todos os seus toots e mídias foram irreversivelmente removidas desse servidor e de servidores onde você tinha seguidores. + get_in_touch: Você pode responder a este e-mail para entrar em contato com a equipe de %{instance}. review_server_policies: Revisar as políticas do servidor subject: disable: Sua conta %{acct} foi congelada diff --git a/config/locales/simple_form.cy.yml b/config/locales/simple_form.cy.yml index 1d5ecae95..93e052f27 100644 --- a/config/locales/simple_form.cy.yml +++ b/config/locales/simple_form.cy.yml @@ -2,9 +2,14 @@ cy: simple_form: hints: + account_alias: + acct: Rhowch enwdefnyddiwr@parth y cyfrif rydych chi am symud ohono + account_migration: + acct: Rhowch enwdefnyddiwr@parth y cyfrif rydych chi am symud iddo account_warning_preset: text: Gallwch defnyddio cystrawen tŵt, fel URLs, hashnodau a sôniadau admin_account_action: + include_statuses: Bydd y defnyddiwr yn gweld pa tŵtiau sydd wedi achosi'r weithred gymedroli neu'r rhybudd send_email_notification: Bydd y defnyddiwr yn derbyn esboniad o beth digwyddodd gyda'i cyfrif text_html: Yn ddewisol. Gallwch defnyddio cystrawen tŵt. Gallwch ychwanegu rhagosodiadau rhybydd i arbed amser type_html: Dewis beth i wneud gyda %{acct} @@ -14,7 +19,10 @@ cy: avatar: PNG, GIF neu JPG. %{size} ar y mwyaf. Caiff ei israddio i %{dimensions}px bot: Mae'r cyfrif hwn yn perfformio gweithredoedd awtomatig yn bennaf ac mae'n bosib nad yw'n cael ei fonitro context: Un neu fwy cyd-destun lle dylai'r hidlydd weithio + current_password: At ddibenion diogelwch, nodwch gyfrinair y cyfrif cyfredol + current_username: I gadarnhau, nodwch enw defnyddiwr y cyfrif cyfredol digest: Ond yn cael eu hanfon ar ôl cyfnod hir o anweithgarwch ac ond os ydych wedi derbyn unrhyw negeseuon personol yn eich absenoldeb + discoverable: Mae'r cyfeirlyfr proffil yn ffordd arall y gall eich cyfrif gyrraedd cynulleidfa ehangach email: Byddwch yn derbyn e-bost i gadarnhau fields: Mae modd i chi arddangos hyd at 4 eitem fel tabl ar eich proffil header: PNG, GIF neu JPG. %{size} ar y mwyaf. Ceith ei israddio i %{dimensions}px @@ -34,10 +42,15 @@ cy: setting_noindex: Mae hyn yn effeithio ar eich proffil cyhoeddus a'ch tudalennau statws setting_show_application: Bydd y offer frydych yn defnyddio i dŵtio yn cael ei arddangos yn golwg manwl eich tŵtiau setting_use_blurhash: Mae graddiannau wedi'u seilio ar liwiau'r delweddau cudd ond maent yn cuddio unrhyw fanylion + setting_use_pending_items: Cuddio diweddariadau llinell amser y tu ôl i glic yn lle sgrolio yn awtomatig username: Bydd eich enw defnyddiwr yn unigryw ar %{domain} whole_word: Os yw'r allweddair neu'r ymadrodd yn alffaniwmerig yn unig, mi fydd ond yn cael ei osod os yw'n cyfateb a'r gair cyfan + domain_allow: + domain: Bydd y parth hwn yn gallu nôl data o'r gweinydd hwn a bydd data sy'n dod i mewn ohono yn cael ei brosesu a'i storio featured_tag: name: 'Efallai hoffech defnyddio un o''r rhain:' + form_challenge: + current_password: Rydych chi'n mynd i mewn i ardal sicr imports: data: Allforiwyd dogfen CSV o achos Mastodon arall invite_request: @@ -110,6 +123,7 @@ cy: setting_theme: Thema'r wefan setting_unfollow_modal: Dangos deialog cadarnhau cyn dad-ddilyn rhywun setting_use_blurhash: Dangoswch raddiannau lliwgar ar gyfer cyfryngau cudd + setting_use_pending_items: Modd araf severity: Difrifoldeb type: Modd mewnforio username: Enw defnyddiwr @@ -121,6 +135,8 @@ cy: must_be_follower: Blocio hysbysiadau o bobl nad ydynt yn eich dilyn must_be_following: Blocio hysbysiadau o bobl nad ydych yn eu dilyn must_be_following_dm: Blocio negeseuon uniongyrchol o bobl nad ydych yn eu dilyn + invite: + comment: Sylw invite_request: text: Pam hoffech ymuno? notification_emails: @@ -132,6 +148,11 @@ cy: pending_account: Anfon ebost pan mae cyfrif newydd angen adolygiad reblog: Anfon e-bost pan mae rhywun yn bŵstio eich statws report: Anfon e-bost pan y cyflwynir adroddiad newydd + tag: + listable: Gadewch i'r hashnod hwn ymddangos mewn chwiliadau ac ar y cyfeiriadur proffil + name: Hashnod + trendable: Gadewch i'r hashnod hwn ymddangos o dan dueddiadau + usable: Caniatáu i tŵtiau ddefnyddio'r hashnod hwn 'no': Na recommended: Argymhellwyd required: diff --git a/config/locales/simple_form.es.yml b/config/locales/simple_form.es.yml index 898d200d2..2fb33dbc3 100644 --- a/config/locales/simple_form.es.yml +++ b/config/locales/simple_form.es.yml @@ -2,6 +2,10 @@ es: simple_form: hints: + account_alias: + acct: Especifique el nombre de usuario@dominio de la cuenta desde la cual se desea migrar + account_migration: + acct: Especifique el nombre de usuario@dominio de la cuenta a la cual se desea migrar account_warning_preset: text: Puede usar sintaxis de toots, como URLs, hashtags y menciones admin_account_action: @@ -15,6 +19,8 @@ es: avatar: PNG, GIF o JPG. Máximo %{size}. Será escalado a %{dimensions}px bot: Esta cuenta ejecuta principalmente acciones automatizadas y podría no ser monitorizada context: Uno o múltiples contextos en los que debe aplicarse el filtro + current_password: Por razones de seguridad por favor ingrese la contraseña de la cuenta actual + current_username: Para confirmar, por favor ingrese el nombre de usuario de la cuenta actual digest: Solo enviado tras un largo periodo de inactividad y solo si has recibido mensajes personales durante tu ausencia discoverable: El directorio del perfil es otra forma en la que su cuenta puede llegar a un público más amplio email: Se le enviará un correo de confirmación @@ -43,6 +49,8 @@ es: domain: Este dominio podrá obtener datos de este servidor y los datos entrantes serán procesados y archivados featured_tag: name: 'Puede que quieras usar uno de estos:' + form_challenge: + current_password: Estás entrando en un área segura imports: data: Archivo CSV exportado desde otra instancia de Mastodon invite_request: @@ -58,6 +66,10 @@ es: fields: name: Etiqueta value: Contenido + account_alias: + acct: Maneja la cuenta antigua + account_migration: + acct: Maneja la cuenta nueva account_warning_preset: text: Texto predefinido admin_account_action: @@ -131,6 +143,8 @@ es: must_be_follower: Bloquear notificaciones de personas que no te siguen must_be_following: Bloquear notificaciones de personas que no sigues must_be_following_dm: Bloquear mensajes directos de la gente que no sigues + invite: + comment: Comentar invite_request: text: "¿Por qué quiere unirse usted?" notification_emails: diff --git a/config/locales/simple_form.fa.yml b/config/locales/simple_form.fa.yml index 90e644e55..b9f0e9372 100644 --- a/config/locales/simple_form.fa.yml +++ b/config/locales/simple_form.fa.yml @@ -2,9 +2,14 @@ fa: simple_form: hints: + account_alias: + acct: نشانی username@domain را برای حسابی که می‌خواهید از آن منتقل شوید بنویسید + account_migration: + acct: نشانی username@domain را برای حسابی که می‌خواهید به آن منتقل شوید بنویسید account_warning_preset: text: می‌توانید مانند بوق‌های معمولی کاربران دیگر را نام ببرید یا پیوند و برچسب بگذارید admin_account_action: + include_statuses: این کاربر خواهد دید که کدام بوق او موجب اقدام مدیریتی یا هشدار شده است send_email_notification: توضیحی که کاربر می‌بینید که برای حسابش چه رخ داده است text_html: اختیاری. می‌توانید مثل بوق‌های معمولی بنویسید. می‌توانید برای صرفه‌جویی در زمان هشدارهای ازپیش‌آماده بیفزایید type_html: با حساب %{acct} می‌خواهید چه کار کنید؟‌ @@ -14,7 +19,10 @@ fa: avatar: یکی از قالب‌های PNG یا GIF یا JPG. بیشترین اندازه %{size}. تصویر به اندازهٔ %{dimensions} پیکسل تبدیل خواهد شد bot: این حساب بیشتر به طور خودکار فعالیت می‌کند و نظارت پیوسته‌ای روی آن وجود ندارد context: یک یا چند زمینه که فیلتر باید در آن‌ها اعمال شود + current_password: به دلایل امنیتی لطفاً رمز این حساب را وارد کنید + current_username: برای تأیید، لطفاً نام کاربری حساب فعلی را وارد کنید digest: تنها وقتی فرستاده می‌شود که مدتی طولانی فعالیتی نداشته باشید و در این مدت برای شما پیغام خصوصی‌ای نوشته شده باشد + discoverable: فهرست گزیدهٔ کاربران این سرور راه دیگری است که با آن حساب شما می‌تواند مخاطبان بیشتری پیدا کند email: به شما ایمیل تأییدی فرستاده خواهد شد fields: شما می‌توانید تا چهار مورد را در یک جدول در نمایهٔ خود نمایش دهید header: یکی از قالب‌های PNG یا GIF یا JPG. بیشترین اندازه %{size}. تصویر به اندازهٔ %{dimensions} پیکسل تبدیل خواهد شد diff --git a/config/locales/simple_form.fr.yml b/config/locales/simple_form.fr.yml index 9f2f15b07..c41292abf 100644 --- a/config/locales/simple_form.fr.yml +++ b/config/locales/simple_form.fr.yml @@ -2,6 +2,10 @@ fr: simple_form: hints: + account_alias: + acct: Spécifiez le nom d'utilisateur@domaine du compte que vous souhaitez déplacer + account_migration: + acct: Spécifiez le nom d'utilisateur@domaine du compte vers lequel vous souhaitez déplacer account_warning_preset: text: Vous pouvez utiliser la syntaxe des pouets, comme les URLs, les hashtags et les mentions admin_account_action: @@ -15,6 +19,8 @@ fr: avatar: Au format PNG, GIF ou JPG. %{size} maximum. Sera réduit à %{dimensions}px bot: Ce compte exécute principalement des actions automatisées et pourrait ne pas être surveillé context: Un ou plusieurs contextes où le filtre devrait s’appliquer + current_password: Pour des raisons de sécurité, veuillez saisir le mot de passe du compte courant + current_username: Pour confirmer, veuillez saisir le nom d'utilisateur du compte courant digest: Uniquement envoyé après une longue période d’inactivité et uniquement si vous avez reçu des messages personnels pendant votre absence discoverable: L’annuaire des profils est une autre façon pour votre compte d’atteindre une plus grand audience email: Vous recevrez un courriel de confirmation @@ -43,6 +49,8 @@ fr: domain: Ce domaine pourra récupérer des données de ce serveur et les données entrantes seront traitées et stockées featured_tag: name: 'Vous pourriez vouloir utiliser l’un d’entre eux :' + form_challenge: + current_password: Vous entrez une zone sécurisée imports: data: Un fichier CSV généré par un autre serveur de Mastodon invite_request: @@ -58,6 +66,10 @@ fr: fields: name: Étiquette value: Contenu + account_alias: + acct: Gestion de l'ancien compte + account_migration: + acct: Gestion du nouveau compte account_warning_preset: text: Texte de présélection admin_account_action: diff --git a/config/locales/simple_form.ko.yml b/config/locales/simple_form.ko.yml index a6db9e006..7c0a81558 100644 --- a/config/locales/simple_form.ko.yml +++ b/config/locales/simple_form.ko.yml @@ -15,6 +15,8 @@ ko: avatar: PNG, GIF 혹은 JPG. 최대 %{size}. %{dimensions}px로 다운스케일 될 것임 bot: 사람들에게 계정이 사람이 아님을 알립니다 context: 필터를 적용 할 한 개 이상의 컨텍스트 + current_password: 보안을 위해 현재 계정의 비밀번호를 입력해주세요 + current_username: 확인을 위해, 현재 계정의 유저명을 입력해주세요 digest: 오랫동안 활동하지 않았을 때 받은 멘션들에 대한 요약 받기 discoverable: 프로필 디렉터리는 내 계정이 더 많은 관심을 갖게 할 수 있는 다른 방법입니다 email: 당신은 확인 메일을 받게 됩니다 @@ -43,6 +45,8 @@ ko: domain: 이 도메인은 이 서버에서 데이터를 가져갈 수 있고 이 도메인에서 보내진 데이터는 처리되고 저장 됩니다 featured_tag: name: '이것들을 사용하면 좋을 것 같습니다:' + form_challenge: + current_password: 당신은 보안 구역에 진입하고 있습니다 imports: data: 다른 마스토돈 서버에서 추출된 CSV 파일 invite_request: diff --git a/config/locales/simple_form.oc.yml b/config/locales/simple_form.oc.yml index 9336a9846..50a8efab1 100644 --- a/config/locales/simple_form.oc.yml +++ b/config/locales/simple_form.oc.yml @@ -124,6 +124,8 @@ oc: must_be_follower: Blocar las notificacions del mond que vos sègon pas must_be_following: Blocar las notificacions del mond que seguètz pas must_be_following_dm: Blocar los messatges del monde que seguètz pas + invite: + comment: Comentari invite_request: text: Perqué volètz vos marcar ? notification_emails: @@ -135,6 +137,11 @@ oc: pending_account: Enviar un corrièl quand cal validar un compte novèl reblog: Enviar un corrièl quand qualqu’un tòrna partejar vòstre estatut report: Enviar un corrièl pels nòus senhalaments + tag: + listable: Permetre a aquesta etiqueta d’aparéisser a las recèrcas e a l’annuari de perfils + name: Etiqueta + trendable: Permetre a aquesta etiqueta d’aparéisser a las tendéncias + usable: Permetre als tuts d’utilizar aquesta etiqueta 'no': Non recommended: Recomandat required: From 4fe5f8f3c7db8842fc58b8116bd1ae219ab068a9 Mon Sep 17 00:00:00 2001 From: Takeshi Umeda Date: Sun, 22 Sep 2019 09:37:15 +0900 Subject: [PATCH 134/134] Add full numeric notation to the dashboard title attribute (#11911) --- app/views/admin/dashboard/index.html.haml | 24 +++++++++++++++-------- 1 file changed, 16 insertions(+), 8 deletions(-) diff --git a/app/views/admin/dashboard/index.html.haml b/app/views/admin/dashboard/index.html.haml index 514637c4f..2849f07aa 100644 --- a/app/views/admin/dashboard/index.html.haml +++ b/app/views/admin/dashboard/index.html.haml @@ -4,35 +4,43 @@ .dashboard__counters %div = link_to admin_accounts_url(local: 1, recent: 1) do - .dashboard__counters__num= number_to_human @users_count, strip_insignificant_zeros: true + .dashboard__counters__num{ title: number_with_delimiter(@users_count, strip_insignificant_zeros: true) } + = number_to_human @users_count, strip_insignificant_zeros: true .dashboard__counters__label= t 'admin.dashboard.total_users' %div %div - .dashboard__counters__num= number_to_human @registrations_week, strip_insignificant_zeros: true + .dashboard__counters__num{ title: number_with_delimiter(@registrations_week, strip_insignificant_zeros: true) } + = number_to_human @registrations_week, strip_insignificant_zeros: true .dashboard__counters__label= t 'admin.dashboard.week_users_new' %div %div - .dashboard__counters__num= number_to_human @logins_week, strip_insignificant_zeros: true + .dashboard__counters__num{ title: number_with_delimiter(@logins_week, strip_insignificant_zeros: true) } + = number_to_human @logins_week, strip_insignificant_zeros: true .dashboard__counters__label= t 'admin.dashboard.week_users_active' %div = link_to admin_pending_accounts_path do - .dashboard__counters__num= number_to_human @pending_users_count, strip_insignificant_zeros: true + .dashboard__counters__num{ title: number_with_delimiter(@pending_users_count, strip_insignificant_zeros: true) } + = number_to_human @pending_users_count, strip_insignificant_zeros: true .dashboard__counters__label= t 'admin.dashboard.pending_users' %div = link_to admin_reports_url do - .dashboard__counters__num= number_to_human @reports_count, strip_insignificant_zeros: true + .dashboard__counters__num{ title: number_with_delimiter(@reports_count, strip_insignificant_zeros: true) } + = number_to_human @reports_count, strip_insignificant_zeros: true .dashboard__counters__label= t 'admin.dashboard.open_reports' %div = link_to admin_tags_path(pending_review: '1') do - .dashboard__counters__num= number_to_human @pending_tags_count, strip_insignificant_zeros: true + .dashboard__counters__num{ title: number_with_delimiter(@pending_tags_count, strip_insignificant_zeros: true) } + = number_to_human @pending_tags_count, strip_insignificant_zeros: true .dashboard__counters__label= t 'admin.dashboard.pending_tags' %div %div - .dashboard__counters__num= number_to_human @interactions_week, strip_insignificant_zeros: true + .dashboard__counters__num{ title: number_with_delimiter(@interactions_week, strip_insignificant_zeros: true) } + = number_to_human @interactions_week, strip_insignificant_zeros: true .dashboard__counters__label= t 'admin.dashboard.week_interactions' %div = link_to sidekiq_url do - .dashboard__counters__num= number_to_human @queue_backlog, strip_insignificant_zeros: true + .dashboard__counters__num{ title: number_with_delimiter(@queue_backlog, strip_insignificant_zeros: true) } + = number_to_human @queue_backlog, strip_insignificant_zeros: true .dashboard__counters__label= t 'admin.dashboard.backlog' .dashboard__widgets