From 68b05e994f9c5f9e6a67ae76a12ef060863d4a99 Mon Sep 17 00:00:00 2001
From: Claire
Date: Tue, 1 Jul 2025 19:43:59 +0200
Subject: [PATCH 01/29] Fix error on log-in from old users requiring ToS
interstitial when said ToS has been removed (#35233)
---
app/controllers/concerns/web_app_controller_concern.rb | 7 +++++++
1 file changed, 7 insertions(+)
diff --git a/app/controllers/concerns/web_app_controller_concern.rb b/app/controllers/concerns/web_app_controller_concern.rb
index 77af015805..39fc948e90 100644
--- a/app/controllers/concerns/web_app_controller_concern.rb
+++ b/app/controllers/concerns/web_app_controller_concern.rb
@@ -50,6 +50,13 @@ module WebAppControllerConcern
return unless current_user&.require_tos_interstitial?
@terms_of_service = TermsOfService.published.first
+
+ # Handle case where terms of service have been removed from the database
+ if @terms_of_service.nil?
+ current_user.update(require_tos_interstitial: false)
+ return
+ end
+
render 'terms_of_service_interstitial/show', layout: 'auth'
end
From c047014214067d72f28ef0c9182a5bedbaee02f8 Mon Sep 17 00:00:00 2001
From: Matt Jankowski
Date: Wed, 2 Jul 2025 03:34:42 -0400
Subject: [PATCH 02/29] Add coverage for `valid_locale_or_nil` languages helper
method (#34866)
---
spec/helpers/languages_helper_spec.rb | 36 +++++++++++++++++++++++++++
1 file changed, 36 insertions(+)
diff --git a/spec/helpers/languages_helper_spec.rb b/spec/helpers/languages_helper_spec.rb
index dd9b6004d1..615194a642 100644
--- a/spec/helpers/languages_helper_spec.rb
+++ b/spec/helpers/languages_helper_spec.rb
@@ -86,4 +86,40 @@ RSpec.describe LanguagesHelper do
end
end
end
+
+ describe '#valid_locale_or_nil' do
+ subject { helper.valid_locale_or_nil(string) }
+
+ context 'when string is nil' do
+ let(:string) { nil }
+
+ it { is_expected.to be_nil }
+ end
+
+ context 'when string is empty' do
+ let(:string) { '' }
+
+ it { is_expected.to be_nil }
+ end
+
+ context 'when string is valid locale' do
+ let(:string) { 'en' }
+
+ it { is_expected.to eq('en') }
+ end
+
+ context 'when string contains region' do
+ context 'when base locale is valid' do
+ let(:string) { 'en-US' }
+
+ it { is_expected.to eq('en') }
+ end
+
+ context 'when base locale is not valid' do
+ let(:string) { 'qq-US' }
+
+ it { is_expected.to be_nil }
+ end
+ end
+ end
end
From 3a533c6c8d3e712fac217164d5dc0e7d80fbc11f Mon Sep 17 00:00:00 2001
From: Renaud Chaput
Date: Wed, 2 Jul 2025 10:00:43 +0200
Subject: [PATCH 03/29] Bump version to 4.5.0-alpha.1 (#35231)
---
lib/mastodon/version.rb | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/lib/mastodon/version.rb b/lib/mastodon/version.rb
index a06a2b0226..7cb5dec677 100644
--- a/lib/mastodon/version.rb
+++ b/lib/mastodon/version.rb
@@ -9,7 +9,7 @@ module Mastodon
end
def minor
- 4
+ 5
end
def patch
@@ -17,7 +17,7 @@ module Mastodon
end
def default_prerelease
- 'rc.1'
+ 'alpha.1'
end
def prerelease
From 9443e2cc4b487697e512335c258c32e38ae272c0 Mon Sep 17 00:00:00 2001
From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com>
Date: Wed, 2 Jul 2025 10:02:30 +0200
Subject: [PATCH 04/29] chore(deps): update dependency
opentelemetry-instrumentation-http to v0.25.1 (#35240)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
---
Gemfile.lock | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/Gemfile.lock b/Gemfile.lock
index 299507cac9..4463a8182a 100644
--- a/Gemfile.lock
+++ b/Gemfile.lock
@@ -553,7 +553,7 @@ GEM
opentelemetry-instrumentation-faraday (0.27.0)
opentelemetry-api (~> 1.0)
opentelemetry-instrumentation-base (~> 0.23.0)
- opentelemetry-instrumentation-http (0.25.0)
+ opentelemetry-instrumentation-http (0.25.1)
opentelemetry-api (~> 1.0)
opentelemetry-instrumentation-base (~> 0.23.0)
opentelemetry-instrumentation-http_client (0.23.0)
From b1375328e1fd26ea0411a27d0b1aa29678ab1c60 Mon Sep 17 00:00:00 2001
From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com>
Date: Wed, 2 Jul 2025 10:02:33 +0200
Subject: [PATCH 05/29] chore(deps): update dependency faker to v3.5.2 (#35239)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
---
Gemfile.lock | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/Gemfile.lock b/Gemfile.lock
index 4463a8182a..b2eff8ad35 100644
--- a/Gemfile.lock
+++ b/Gemfile.lock
@@ -231,7 +231,7 @@ GEM
excon (1.2.5)
logger
fabrication (3.0.0)
- faker (3.5.1)
+ faker (3.5.2)
i18n (>= 1.8.11, < 2)
faraday (2.13.1)
faraday-net_http (>= 2.0, < 3.5)
From 52bc2f64f44ebf8ef938b37abc9cbfe53eaa9220 Mon Sep 17 00:00:00 2001
From: Echo
Date: Wed, 2 Jul 2025 10:58:39 +0200
Subject: [PATCH 06/29] Import Emojibase data (#35229)
---
.../mastodon/features/emoji/locale.test.ts | 64 +++++++++
.../mastodon/features/emoji/locale.ts | 51 +++++++
.../mastodon/features/emoji/normalize.test.ts | 72 ++++++++++
.../mastodon/features/emoji/normalize.ts | 135 ++++++++++++++++++
package.json | 2 +
yarn.lock | 18 +++
6 files changed, 342 insertions(+)
create mode 100644 app/javascript/mastodon/features/emoji/locale.test.ts
create mode 100644 app/javascript/mastodon/features/emoji/locale.ts
create mode 100644 app/javascript/mastodon/features/emoji/normalize.test.ts
create mode 100644 app/javascript/mastodon/features/emoji/normalize.ts
diff --git a/app/javascript/mastodon/features/emoji/locale.test.ts b/app/javascript/mastodon/features/emoji/locale.test.ts
new file mode 100644
index 0000000000..0e098b2d44
--- /dev/null
+++ b/app/javascript/mastodon/features/emoji/locale.test.ts
@@ -0,0 +1,64 @@
+import { flattenEmojiData, SUPPORTED_LOCALES } from 'emojibase';
+import emojiEnData from 'emojibase-data/en/compact.json';
+import emojiFrData from 'emojibase-data/fr/compact.json';
+
+import { toSupportedLocale, unicodeToLocaleLabel } from './locale';
+
+describe('unicodeToLocaleLabel', () => {
+ const emojiTestCases = [
+ '1F3CB-1F3FF-200D-2640-FE0F', // 🏋🏿♀️ Woman weightlifter, dark skin
+ '1F468-1F3FB', // 👨🏻 Man, light skin
+ '1F469-1F3FB-200D-2695-FE0F', // 👩🏻⚕️ Woman health worker, light skin
+ '1F468-1F3FD-200D-1F692', // 👨🏽🚒 Man firefighter, medium skin
+ '1F469-1F3FE', // 👩🏾 Woman, medium-dark skin
+ '1F469-1F3FF-200D-1F4BB', // 👩🏿💻 Woman technologist, dark skin
+ '1F478-1F3FF', // 👸🏿 Princess with dark skin tone
+ '1F935-1F3FC-200D-2640-FE0F', // 🤵🏼♀️ Woman in tuxedo, medium-light skin
+ '1F9D1-1F3FC', // 🧑🏼 Person, medium-light skin
+ '1F9D4-1F3FE', // 🧔🏾 Person with beard, medium-dark skin
+ ];
+
+ const flattenedEnData = flattenEmojiData(emojiEnData);
+ const flattenedFrData = flattenEmojiData(emojiFrData);
+
+ const emojiTestEnLabels = new Map(
+ emojiTestCases.map((code) => [
+ code,
+ flattenedEnData.find((emoji) => emoji.hexcode === code)?.label,
+ ]),
+ );
+ const emojiTestFrLabels = new Map(
+ emojiTestCases.map((code) => [
+ code,
+ flattenedFrData.find((emoji) => emoji.hexcode === code)?.label,
+ ]),
+ );
+
+ test.for(
+ emojiTestCases.flatMap((code) => [
+ [code, 'en', emojiTestEnLabels.get(code)],
+ [code, 'fr', emojiTestFrLabels.get(code)],
+ ]) satisfies [string, string, string | undefined][],
+ )(
+ 'returns correct label for %s for %s locale',
+ async ([unicodeHex, locale, expectedLabel]) => {
+ const label = await unicodeToLocaleLabel(unicodeHex, locale);
+ expect(label).toBe(expectedLabel);
+ },
+ );
+});
+
+describe('toSupportedLocale', () => {
+ test('returns the same locale if it is supported', () => {
+ for (const locale of SUPPORTED_LOCALES) {
+ expect(toSupportedLocale(locale)).toBe(locale);
+ }
+ });
+
+ test('returns "en" for unsupported locales', () => {
+ const unsupportedLocales = ['xx', 'fr-CA'];
+ for (const locale of unsupportedLocales) {
+ expect(toSupportedLocale(locale)).toBe('en');
+ }
+ });
+});
diff --git a/app/javascript/mastodon/features/emoji/locale.ts b/app/javascript/mastodon/features/emoji/locale.ts
new file mode 100644
index 0000000000..aac6c376b0
--- /dev/null
+++ b/app/javascript/mastodon/features/emoji/locale.ts
@@ -0,0 +1,51 @@
+import type { CompactEmoji, Locale } from 'emojibase';
+import { flattenEmojiData, SUPPORTED_LOCALES } from 'emojibase';
+
+// Simple cache. This will be replaced with an IndexedDB cache in the future.
+const localeCache = new Map>();
+
+export async function unicodeToLocaleLabel(
+ unicodeHex: string,
+ localeString: string,
+) {
+ const locale = toSupportedLocale(localeString);
+ let hexMap = localeCache.get(locale);
+ if (!hexMap) {
+ hexMap = await loadLocaleLabels(locale);
+ localeCache.set(locale, hexMap);
+ }
+
+ const label = hexMap.get(unicodeHex)?.label;
+ if (!label) {
+ throw new Error(
+ `Label for unicode hex ${unicodeHex} not found in locale ${locale}`,
+ );
+ }
+ return label;
+}
+
+async function loadLocaleLabels(
+ locale: Locale,
+): Promise
-Mastodon is a **free, open-source social network server** based on ActivityPub where users can follow friends and discover new ones. On Mastodon, users can publish anything they want: links, pictures, text, and video. All Mastodon servers are interoperable as a federated network (users on one server can seamlessly communicate with users from another one, including non-Mastodon software that implements ActivityPub!)
+Mastodon is a **free, open-source social network server** based on [ActivityPub](https://www.w3.org/TR/activitypub/) where users can follow friends and discover new ones. On Mastodon, users can publish anything they want: links, pictures, text, and video. All Mastodon servers are interoperable as a federated network (users on one server can seamlessly communicate with users from another one, including non-Mastodon software that implements ActivityPub!)
## Navigation
- [Project homepage 🐘](https://joinmastodon.org)
-- [Support the development via Patreon][patreon]
-- [View sponsors](https://joinmastodon.org/sponsors)
-- [Blog](https://blog.joinmastodon.org)
-- [Documentation](https://docs.joinmastodon.org)
-- [Roadmap](https://joinmastodon.org/roadmap)
-- [Official Docker image](https://github.com/mastodon/mastodon/pkgs/container/mastodon)
-- [Browse Mastodon servers](https://joinmastodon.org/communities)
-- [Browse Mastodon apps](https://joinmastodon.org/apps)
-
-[patreon]: https://www.patreon.com/mastodon
+- [Donate to support development 🎁](https://joinmastodon.org/sponsors#donate)
+ - [View sponsors](https://joinmastodon.org/sponsors)
+- [Blog 📰](https://blog.joinmastodon.org)
+- [Documentation 📚](https://docs.joinmastodon.org)
+- [Official container image 🚢](https://github.com/mastodon/mastodon/pkgs/container/mastodon)
## Features
-
+
-**No vendor lock-in: Fully interoperable with any conforming platform** - It doesn't have to be Mastodon; whatever implements ActivityPub is part of the social network! [Learn more](https://blog.joinmastodon.org/2018/06/why-activitypub-is-the-future/)
+**Part of the Fediverse. Based on open standards, with no vendor lock-in.** - the network goes beyond just Mastodon; anything that implements ActivityPub is part of a broader social network known as [the Fediverse](https://jointhefediverse.net/). You can follow and interact with users on other servers (including those running different software), and they can follow you back.
-**Real-time, chronological timeline updates** - updates of people you're following appear in real-time in the UI via WebSockets. There's a firehose view as well!
+**Real-time, chronological timeline updates** - updates of people you're following appear in real-time in the UI.
-**Media attachments like images and short videos** - upload and view images and WebM/MP4 videos attached to the updates. Videos with no audio track are treated like GIFs; normal videos loop continuously!
+**Media attachments** - upload and view images and videos attached to the updates. Videos with no audio track are treated like animated GIFs; normal videos loop continuously.
-**Safety and moderation tools** - Mastodon includes private posts, locked accounts, phrase filtering, muting, blocking, and all sorts of other features, along with a reporting and moderation system. [Learn more](https://blog.joinmastodon.org/2018/07/cage-the-mastodon/)
+**Safety and moderation tools** - Mastodon includes private posts, locked accounts, phrase filtering, muting, blocking, and many other features, along with a reporting and moderation system.
-**OAuth2 and a straightforward REST API** - Mastodon acts as an OAuth2 provider, so 3rd party apps can use the REST and Streaming APIs. This results in a rich app ecosystem with a lot of choices!
+**OAuth2 and a straightforward REST API** - Mastodon acts as an OAuth2 provider, and third party apps can use the REST and Streaming APIs. This results in a [rich app ecosystem](https://joinmastodon.org/apps) with a variety of choices!
## Deployment
### Tech stack
-- **Ruby on Rails** powers the REST API and other web pages
-- **React.js** and **Redux** are used for the dynamic parts of the interface
-- **Node.js** powers the streaming API
+- [Ruby on Rails](https://github.com/rails/rails) powers the REST API and other web pages.
+- [PostgreSQL](https://www.postgresql.org/) is the main database.
+- [Redis](https://redis.io/) and [Sidekiq](https://sidekiq.org/) are used for caching and queueing.
+- [Node.js](https://nodejs.org/) powers the streaming API.
+- [React.js](https://reactjs.org/) and [Redux](https://redux.js.org/) are used for the dynamic parts of the interface.
+- [BrowserStack](https://www.browserstack.com/) supports testing on real devices and browsers.
+- [Chromatic](https://www.chromatic.com/) provides visual regression testing.
### Requirements
+- **Ruby** 3.2+
- **PostgreSQL** 13+
- **Redis** 6.2+
-- **Ruby** 3.2+
- **Node.js** 20+
-The repository includes deployment configurations for **Docker and docker-compose** as well as specific platforms like **Heroku**, and **Scalingo**. For Helm charts, reference the [mastodon/chart repository](https://github.com/mastodon/chart). The [**standalone** installation guide](https://docs.joinmastodon.org/admin/install/) is available in the documentation.
+This repository includes deployment configurations for **Docker and docker-compose**, as well as for other environments like Heroku and Scalingo. For Helm charts, reference the [mastodon/chart repository](https://github.com/mastodon/chart). A [**standalone** installation guide](https://docs.joinmastodon.org/admin/install/) is available in the main documentation.
## Contributing
-Mastodon is **free, open-source software** licensed under **AGPLv3**.
+Mastodon is **free, open-source software** licensed under **AGPLv3**. We welcome contributions and help from anyone who wants to improve the project.
-You can open issues for bugs you've found or features you think are missing. You
-can also submit pull requests to this repository or translations via Crowdin. To
-get started, look at the [CONTRIBUTING] and [DEVELOPMENT] guides. For changes
-accepted into Mastodon, you can request to be paid through our [OpenCollective].
+You should read the overall [CONTRIBUTING](https://github.com/mastodon/.github/blob/main/CONTRIBUTING.md) guide, which covers our development processes.
-**IRC channel**: #mastodon on [`irc.libera.chat`](https://libera.chat)
+You should also read and understand the [CODE OF CONDUCT](https://github.com/mastodon/.github/blob/main/CODE_OF_CONDUCT.md) that enables us to maintain a welcoming and inclusive community. Collaboration begins with mutual respect and understanding.
-## License
+You can learn about setting up a development environment in the [DEVELOPMENT](docs/DEVELOPMENT.md) documentation.
+
+If you would like to help with translations 🌐 you can do so on [Crowdin](https://crowdin.com/project/mastodon).
+
+## LICENSE
Copyright (c) 2016-2025 Eugen Rochko (+ [`mastodon authors`](AUTHORS.md))
Licensed under GNU Affero General Public License as stated in the [LICENSE](LICENSE):
-```
+```text
Copyright (c) 2016-2025 Eugen Rochko & other Mastodon contributors
This program is free software: you can redistribute it and/or modify it under
@@ -97,7 +97,3 @@ details.
You should have received a copy of the GNU Affero General Public License along
with this program. If not, see https://www.gnu.org/licenses/
```
-
-[CONTRIBUTING]: CONTRIBUTING.md
-[DEVELOPMENT]: docs/DEVELOPMENT.md
-[OpenCollective]: https://opencollective.com/mastodon
From 49db8a9662807ca8c28006b30db5f6627209655c Mon Sep 17 00:00:00 2001
From: Matt Jankowski
Date: Thu, 3 Jul 2025 03:28:03 -0400
Subject: [PATCH 10/29] Use `Account#targeted_reports` association where needed
(#35249)
---
app/models/admin/account_action.rb | 2 +-
app/models/form/account_batch.rb | 2 +-
app/services/delete_account_service.rb | 2 +-
3 files changed, 3 insertions(+), 3 deletions(-)
diff --git a/app/models/admin/account_action.rb b/app/models/admin/account_action.rb
index 7c66b6e646..4443d6343b 100644
--- a/app/models/admin/account_action.rb
+++ b/app/models/admin/account_action.rb
@@ -185,7 +185,7 @@ class Admin::AccountAction
@reports ||= if type == 'none'
with_report? ? [report] : []
else
- Report.where(target_account: target_account).unresolved
+ target_account.targeted_reports.unresolved
end
end
diff --git a/app/models/form/account_batch.rb b/app/models/form/account_batch.rb
index 4665a58679..98e3be1a0c 100644
--- a/app/models/form/account_batch.rb
+++ b/app/models/form/account_batch.rb
@@ -128,7 +128,7 @@ class Form::AccountBatch
# Suspending a single account closes their associated reports, so
# mass-suspending would be consistent.
- Report.where(target_account: account).unresolved.find_each do |report|
+ account.targeted_reports.unresolved.find_each do |report|
authorize(report, :update?)
log_action(:resolve, report)
report.resolve!(current_account)
diff --git a/app/services/delete_account_service.rb b/app/services/delete_account_service.rb
index 20d6ee8d64..6557dda48f 100644
--- a/app/services/delete_account_service.rb
+++ b/app/services/delete_account_service.rb
@@ -297,7 +297,7 @@ class DeleteAccountService < BaseService
end
def reported_status_ids
- @reported_status_ids ||= Report.where(target_account: @account).unresolved.pluck(:status_ids).flatten.uniq
+ @reported_status_ids ||= @account.targeted_reports.unresolved.pluck(:status_ids).flatten.uniq
end
def associations_for_destruction
From 6e39b5ef04adca8c28b700b30ca06bbdd737e03b Mon Sep 17 00:00:00 2001
From: Matt Jankowski
Date: Thu, 3 Jul 2025 03:28:07 -0400
Subject: [PATCH 11/29] Use `ActiveModel::Attributes` for admin/account_action
boolean values (#35247)
---
app/models/admin/account_action.rb | 21 +++++----------------
1 file changed, 5 insertions(+), 16 deletions(-)
diff --git a/app/models/admin/account_action.rb b/app/models/admin/account_action.rb
index 4443d6343b..e43a50ae63 100644
--- a/app/models/admin/account_action.rb
+++ b/app/models/admin/account_action.rb
@@ -2,6 +2,7 @@
class Admin::AccountAction
include ActiveModel::Model
+ include ActiveModel::Attributes
include AccountableConcern
include Authorization
@@ -20,7 +21,10 @@ class Admin::AccountAction
:report_id,
:warning_preset_id
- attr_reader :warning, :send_email_notification, :include_statuses
+ attr_reader :warning
+
+ attribute :include_statuses, :boolean, default: true
+ attribute :send_email_notification, :boolean, default: true
alias send_email_notification? send_email_notification
alias include_statuses? include_statuses
@@ -28,21 +32,6 @@ class Admin::AccountAction
validates :type, :target_account, :current_account, presence: true
validates :type, inclusion: { in: TYPES }
- def initialize(attributes = {})
- @send_email_notification = true
- @include_statuses = true
-
- super
- end
-
- def send_email_notification=(value)
- @send_email_notification = ActiveModel::Type::Boolean.new.cast(value)
- end
-
- def include_statuses=(value)
- @include_statuses = ActiveModel::Type::Boolean.new.cast(value)
- end
-
def save!
raise ActiveRecord::RecordInvalid, self unless valid?
From 39028dde40b028e3d6de63d2d787337aacdd57ed Mon Sep 17 00:00:00 2001
From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com>
Date: Thu, 3 Jul 2025 07:32:15 +0000
Subject: [PATCH 12/29] chore(deps): update dependency scenic to v1.9.0
(#35226)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
---
Gemfile.lock | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/Gemfile.lock b/Gemfile.lock
index b2eff8ad35..c59f26c44d 100644
--- a/Gemfile.lock
+++ b/Gemfile.lock
@@ -682,7 +682,7 @@ GEM
activesupport (= 8.0.2)
bundler (>= 1.15.0)
railties (= 8.0.2)
- rails-dom-testing (2.2.0)
+ rails-dom-testing (2.3.0)
activesupport (>= 5.0.0)
minitest
nokogiri (>= 1.6)
@@ -815,7 +815,7 @@ GEM
sanitize (7.0.0)
crass (~> 1.0.2)
nokogiri (>= 1.16.8)
- scenic (1.8.0)
+ scenic (1.9.0)
activerecord (>= 4.0.0)
railties (>= 4.0.0)
securerandom (0.4.1)
From 70cd1fdc6302d8527c8da9dd2c9ff324a7153a67 Mon Sep 17 00:00:00 2001
From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com>
Date: Thu, 3 Jul 2025 09:32:51 +0200
Subject: [PATCH 13/29] fix(deps): update dependency vite-plugin-pwa to v1.0.1
(#35223)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
---
yarn.lock | 8 ++++----
1 file changed, 4 insertions(+), 4 deletions(-)
diff --git a/yarn.lock b/yarn.lock
index 46fb5b98d2..a1aea84b5e 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -13774,8 +13774,8 @@ __metadata:
linkType: hard
"vite-plugin-pwa@npm:^1.0.0":
- version: 1.0.0
- resolution: "vite-plugin-pwa@npm:1.0.0"
+ version: 1.0.1
+ resolution: "vite-plugin-pwa@npm:1.0.1"
dependencies:
debug: "npm:^4.3.6"
pretty-bytes: "npm:^6.1.1"
@@ -13784,13 +13784,13 @@ __metadata:
workbox-window: "npm:^7.3.0"
peerDependencies:
"@vite-pwa/assets-generator": ^1.0.0
- vite: ^3.1.0 || ^4.0.0 || ^5.0.0 || ^6.0.0
+ vite: ^3.1.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0
workbox-build: ^7.3.0
workbox-window: ^7.3.0
peerDependenciesMeta:
"@vite-pwa/assets-generator":
optional: true
- checksum: 10c0/284a7a0be50c6ffb742363767951efe76d751183c6b273b576d3d9ffa070e6d48d292f0a564e58dc6fc73cc1bdcdca6f076b7cd47e2e34ddfc28625eb937f3c7
+ checksum: 10c0/ceca04df97877ca97eb30805207d4826bd6340796194c9015afeefeb781931bf9019a630c5a0bdaa6dffcada11ce1fdf8595ac48a08d751dff81601aa0c7db38
languageName: node
linkType: hard
From 3c0767f543dfdbb2fbb6a35f43f8ac5f7b545e2b Mon Sep 17 00:00:00 2001
From: diondiondion
Date: Thu, 3 Jul 2025 09:51:12 +0200
Subject: [PATCH 14/29] fix: Remove focus highlight when status is clicked in
light mode (#35251)
---
app/javascript/styles/mastodon-light/diff.scss | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/app/javascript/styles/mastodon-light/diff.scss b/app/javascript/styles/mastodon-light/diff.scss
index 7e11af1247..874c44240a 100644
--- a/app/javascript/styles/mastodon-light/diff.scss
+++ b/app/javascript/styles/mastodon-light/diff.scss
@@ -101,7 +101,7 @@
}
// Change the background colors of statuses
-.focusable:focus {
+.focusable:focus-visible {
background: lighten($white, 4%);
}
From c66c5fd73d602caa5cb48f591866a2e91309205a Mon Sep 17 00:00:00 2001
From: "github-actions[bot]"
<41898282+github-actions[bot]@users.noreply.github.com>
Date: Thu, 3 Jul 2025 11:47:57 +0200
Subject: [PATCH 15/29] New Crowdin Translations (automated) (#35250)
Co-authored-by: GitHub Actions
---
app/javascript/mastodon/locales/da.json | 10 ++--
app/javascript/mastodon/locales/et.json | 10 ++--
app/javascript/mastodon/locales/fa.json | 20 +++++++
app/javascript/mastodon/locales/fr-CA.json | 15 +++--
app/javascript/mastodon/locales/fr.json | 15 +++--
app/javascript/mastodon/locales/ru.json | 2 +-
app/javascript/mastodon/locales/tok.json | 2 +
config/locales/et.yml | 70 +++++++++++++++++++---
config/locales/fa.yml | 15 +++++
config/locales/fr-CA.yml | 5 +-
config/locales/fr.yml | 5 +-
config/locales/ru.yml | 52 ++++++++--------
config/locales/simple_form.et.yml | 9 ++-
13 files changed, 171 insertions(+), 59 deletions(-)
diff --git a/app/javascript/mastodon/locales/da.json b/app/javascript/mastodon/locales/da.json
index ea5fbad94a..c28345b260 100644
--- a/app/javascript/mastodon/locales/da.json
+++ b/app/javascript/mastodon/locales/da.json
@@ -208,9 +208,9 @@
"compose_form.publish": "Publicér",
"compose_form.reply": "Svar",
"compose_form.save_changes": "Opdatér",
- "compose_form.spoiler.marked": "Fjern emnefelt",
- "compose_form.spoiler.unmarked": "Tilføj emnefelt",
- "compose_form.spoiler_placeholder": "Emnefelt (valgfrit)",
+ "compose_form.spoiler.marked": "Fjern indholdsadvarsel",
+ "compose_form.spoiler.unmarked": "Tilføj indholdsadvarsel",
+ "compose_form.spoiler_placeholder": "Indholdsadvarsel (valgfri)",
"confirmation_modal.cancel": "Afbryd",
"confirmations.block.confirm": "Blokér",
"confirmations.delete.confirm": "Slet",
@@ -492,9 +492,9 @@
"keyboard_shortcuts.reply": "Besvar indlægget",
"keyboard_shortcuts.requests": "Åbn liste over følgeanmodninger",
"keyboard_shortcuts.search": "Fokusér søgebjælke",
- "keyboard_shortcuts.spoilers": "Vis/skjul emnefelt",
+ "keyboard_shortcuts.spoilers": "Vis/skjul indholdsadvarsel-felt",
"keyboard_shortcuts.start": "Åbn \"komme i gang\"-kolonne",
- "keyboard_shortcuts.toggle_hidden": "Vis/skjul tekst bag emnefelt",
+ "keyboard_shortcuts.toggle_hidden": "Vis/skjul tekst bag indholdsadvarsel",
"keyboard_shortcuts.toggle_sensitivity": "Vis/skjul medier",
"keyboard_shortcuts.toot": "Påbegynd nyt indlæg",
"keyboard_shortcuts.translate": "for at oversætte et indlæg",
diff --git a/app/javascript/mastodon/locales/et.json b/app/javascript/mastodon/locales/et.json
index b4b4c380cd..ffb33c7e7a 100644
--- a/app/javascript/mastodon/locales/et.json
+++ b/app/javascript/mastodon/locales/et.json
@@ -167,7 +167,7 @@
"column.domain_blocks": "Peidetud domeenid",
"column.edit_list": "Muuda loendit",
"column.favourites": "Lemmikud",
- "column.firehose": "Laiv lõimed",
+ "column.firehose": "Postitused reaalajas",
"column.follow_requests": "Jälgimistaotlused",
"column.home": "Kodu",
"column.list_members": "Halda loendi liikmeid",
@@ -337,7 +337,7 @@
"errors.unexpected_crash.copy_stacktrace": "Kopeeri stacktrace lõikelauale",
"errors.unexpected_crash.report_issue": "Teavita veast",
"explore.suggested_follows": "Inimesed",
- "explore.title": "Populaarsust kohuv",
+ "explore.title": "Populaarsust koguv",
"explore.trending_links": "Uudised",
"explore.trending_statuses": "Postitused",
"explore.trending_tags": "Sildid",
@@ -389,7 +389,7 @@
"followed_tags": "Jälgitavad märksõnad",
"footer.about": "Teave",
"footer.directory": "Profiilikataloog",
- "footer.get_app": "Tõmba äpp",
+ "footer.get_app": "Laadi rakendus",
"footer.keyboard_shortcuts": "Kiirklahvid",
"footer.privacy_policy": "Isikuandmete kaitse",
"footer.source_code": "Lähtekood",
@@ -831,7 +831,7 @@
"search_results.statuses": "Postitused",
"search_results.title": "Otsi märksõna: {q}",
"server_banner.about_active_users": "Inimesed, kes kasutavad seda serverit viimase 30 päeva jooksul (kuu aktiivsed kasutajad)",
- "server_banner.active_users": "aktiivsed kasutajad",
+ "server_banner.active_users": "aktiivset kasutajaid",
"server_banner.administered_by": "Administraator:",
"server_banner.is_one_of_many": "{domain} on üks paljudest sõltumatutest Mastodoni serveritest, mida saab fediversumis osalemiseks kasutada.",
"server_banner.server_stats": "Serveri statistika:",
@@ -858,7 +858,7 @@
"status.edited_x_times": "Muudetud {count, plural, one{{count} kord} other {{count} korda}}",
"status.embed": "Hangi manustamiskood",
"status.favourite": "Lemmik",
- "status.favourites": "{count, plural, one {lemmik} other {lemmikud}}",
+ "status.favourites": "{count, plural, one {lemmik} other {lemmikut}}",
"status.filter": "Filtreeri seda postitust",
"status.history.created": "{name} lõi {date}",
"status.history.edited": "{name} muutis {date}",
diff --git a/app/javascript/mastodon/locales/fa.json b/app/javascript/mastodon/locales/fa.json
index e73d1625f6..a6c556ac0a 100644
--- a/app/javascript/mastodon/locales/fa.json
+++ b/app/javascript/mastodon/locales/fa.json
@@ -219,6 +219,13 @@
"confirmations.delete_list.confirm": "حذف",
"confirmations.delete_list.message": "مطمئنید میخواهید این سیاهه را برای همیشه حذف کنید؟",
"confirmations.delete_list.title": "حذف سیاهه؟",
+ "confirmations.discard_draft.confirm": "دور انداختن و ادامه",
+ "confirmations.discard_draft.edit.cancel": "ادامهٔ ویرایش",
+ "confirmations.discard_draft.edit.message": "ادامه دادن هر تغییری که روی فرستهٔ در حال ویرایش دادهاید را دور خواهد ریخت.",
+ "confirmations.discard_draft.edit.title": "دور ریختن تغییرات فرستهتان؟",
+ "confirmations.discard_draft.post.cancel": "از سر گیری پیشنویس",
+ "confirmations.discard_draft.post.message": "ادامه دادن باعث دور ریخته شدن تغییرات روی فرستهای که دارید مینویسید خواهد شد.",
+ "confirmations.discard_draft.post.title": "دور ریختن فرستهٔ پیشنویستان؟",
"confirmations.discard_edit_media.confirm": "دور انداختن",
"confirmations.discard_edit_media.message": "تغییرات ذخیره نشدهای در توضیحات یا پیشنمایش رسانه دارید. همگی نادیده گرفته شوند؟",
"confirmations.follow_to_list.confirm": "پیگیری و افزودن به سیاهه",
@@ -557,6 +564,8 @@
"navigation_bar.follows_and_followers": "پیگرفتگان و پیگیرندگان",
"navigation_bar.import_export": "درونریزی و برونبری",
"navigation_bar.lists": "سیاههها",
+ "navigation_bar.live_feed_local": "خوراک زنده (محلی)",
+ "navigation_bar.live_feed_public": "خوراک زنده (عمومی)",
"navigation_bar.logout": "خروج",
"navigation_bar.moderation": "نظارت",
"navigation_bar.more": "بیشتر",
@@ -566,6 +575,10 @@
"navigation_bar.privacy_and_reach": "محرمانگی و دسترسی",
"navigation_bar.search": "جستوجو",
"navigation_bar.search_trends": "جستجو \\ پرطرفدار",
+ "navigation_panel.collapse_followed_tags": "جمع کردن فهرست برچسبهای پیگرفته",
+ "navigation_panel.collapse_lists": "جمع کردن فهرست سیاهه",
+ "navigation_panel.expand_followed_tags": "گسترش فهرست برچسبهای پیگرفته",
+ "navigation_panel.expand_lists": "گسترش فهرست سیاهه",
"not_signed_in_indicator.not_signed_in": "برای دسترسی به این منبع باید وارد شوید.",
"notification.admin.report": "{name}، {target} را گزارش داد",
"notification.admin.report_account": "{name} {count, plural, one {یک پست} other {پست}} از {target} برای {category} را گزارش داد",
@@ -792,6 +805,7 @@
"report_notification.categories.violation": "تخطّی از قانون",
"report_notification.categories.violation_sentence": "تخطّی از قانون",
"report_notification.open": "گشودن گزارش",
+ "search.clear": "پاکسازی جستوجو",
"search.no_recent_searches": "جستوجوی اخیری نیست",
"search.placeholder": "جستوجو",
"search.quick_action.account_search": "نمایههای جور با {x}",
@@ -858,6 +872,12 @@
"status.mute_conversation": "خموشاندن گفتوگو",
"status.open": "گسترش این فرسته",
"status.pin": "سنجاق به نمایه",
+ "status.quote_error.filtered": "نهفته بنا بر یکی از پالایههایتان",
+ "status.quote_error.not_found": "این فرسته قابل نمایش نیست.",
+ "status.quote_error.pending_approval": "این فرسته منظر تأیید نگارندهٔ اصلی است.",
+ "status.quote_error.rejected": "از آنجا که نگارندهٔ اصلی فرسته اجازهٔ نقل قولش را نمیدهد این فرسته قابل نمایش نیست.",
+ "status.quote_error.removed": "این فرسته به دست نگارندهاش برداشته شده.",
+ "status.quote_error.unauthorized": "از آنجا که اجازهٔ دیدن این فرسته را ندارید قابل نمایش نیست.",
"status.quote_post_author": "فرسته توسط {name}",
"status.read_more": "بیشتر بخوانید",
"status.reblog": "تقویت",
diff --git a/app/javascript/mastodon/locales/fr-CA.json b/app/javascript/mastodon/locales/fr-CA.json
index cbe3ff3316..3a31a5af56 100644
--- a/app/javascript/mastodon/locales/fr-CA.json
+++ b/app/javascript/mastodon/locales/fr-CA.json
@@ -68,6 +68,7 @@
"account.open_original_page": "Ouvrir la page d'origine",
"account.posts": "Publications",
"account.posts_with_replies": "Publications et réponses",
+ "account.remove_from_followers": "Retirer {name} des suiveurs",
"account.report": "Signaler @{name}",
"account.requested": "En attente d’approbation. Cliquez pour annuler la demande",
"account.requested_follow": "{name} a demandé à vous suivre",
@@ -137,8 +138,8 @@
"block_modal.title": "Bloquer le compte ?",
"block_modal.you_wont_see_mentions": "Vous ne verrez pas les messages qui le mentionne.",
"boost_modal.combo": "Vous pouvez appuyer sur {combo} pour sauter ceci la prochaine fois",
- "boost_modal.reblog": "Amplifier le message ?",
- "boost_modal.undo_reblog": "Annuler l'amplification du message ?",
+ "boost_modal.reblog": "Booster le message ?",
+ "boost_modal.undo_reblog": "Annuler le boost du message ?",
"bundle_column_error.copy_stacktrace": "Copier le rapport d'erreur",
"bundle_column_error.error.body": "La page demandée n'a pas pu être affichée. Cela pourrait être dû à un bogue dans notre code, ou à un problème de compatibilité avec le navigateur.",
"bundle_column_error.error.title": "Oh non!",
@@ -218,8 +219,12 @@
"confirmations.delete_list.confirm": "Supprimer",
"confirmations.delete_list.message": "Voulez-vous vraiment supprimer définitivement cette liste?",
"confirmations.delete_list.title": "Supprimer la liste ?",
- "confirmations.discard_draft.confirm": "Efface et continue",
+ "confirmations.discard_draft.confirm": "Effacer et continuer",
"confirmations.discard_draft.edit.cancel": "Retour vers l'éditeur",
+ "confirmations.discard_draft.edit.title": "Jeter les changements faits au message?",
+ "confirmations.discard_draft.post.cancel": "Retour au brouillon",
+ "confirmations.discard_draft.post.message": "En continuant, vous perdez le message que vous êtes en train d'écrire.",
+ "confirmations.discard_draft.post.title": "Jeter le brouillon de message?",
"confirmations.discard_edit_media.confirm": "Rejeter",
"confirmations.discard_edit_media.message": "Vous avez des modifications non enregistrées de la description ou de l'aperçu du média, voulez-vous quand même les supprimer?",
"confirmations.follow_to_list.confirm": "Suivre et ajouter à la liste",
@@ -839,8 +844,8 @@
"status.mute_conversation": "Masquer la conversation",
"status.open": "Afficher la publication entière",
"status.pin": "Épingler sur profil",
- "status.quote_error.removed": "Ce message a été retiré par son auteur.",
- "status.quote_error.unauthorized": "Ce message ne peut pas être affiché car vous n'êtes pas autorisé à le voir.",
+ "status.quote_error.removed": "Ce message a été retiré par son auteur·ice.",
+ "status.quote_error.unauthorized": "Ce message ne peut pas être affiché car vous n'êtes pas autorisé·e à le voir.",
"status.quote_post_author": "Message par {name}",
"status.read_more": "En savoir plus",
"status.reblog": "Booster",
diff --git a/app/javascript/mastodon/locales/fr.json b/app/javascript/mastodon/locales/fr.json
index ca84ae4ff2..173cae18ae 100644
--- a/app/javascript/mastodon/locales/fr.json
+++ b/app/javascript/mastodon/locales/fr.json
@@ -68,6 +68,7 @@
"account.open_original_page": "Ouvrir la page d'origine",
"account.posts": "Messages",
"account.posts_with_replies": "Messages et réponses",
+ "account.remove_from_followers": "Retirer {name} des suiveurs",
"account.report": "Signaler @{name}",
"account.requested": "En attente d’approbation. Cliquez pour annuler la demande",
"account.requested_follow": "{name} a demandé à vous suivre",
@@ -137,8 +138,8 @@
"block_modal.title": "Bloquer le compte ?",
"block_modal.you_wont_see_mentions": "Vous ne verrez pas les messages qui le mentionne.",
"boost_modal.combo": "Vous pouvez appuyer sur {combo} pour passer ceci la prochaine fois",
- "boost_modal.reblog": "Amplifier le message ?",
- "boost_modal.undo_reblog": "Annuler l'amplification du message ?",
+ "boost_modal.reblog": "Booster le message ?",
+ "boost_modal.undo_reblog": "Annuler le boost du message ?",
"bundle_column_error.copy_stacktrace": "Copier le rapport d'erreur",
"bundle_column_error.error.body": "La page demandée n'a pas pu être affichée. Cela peut être dû à un bogue dans notre code, ou à un problème de compatibilité avec le navigateur.",
"bundle_column_error.error.title": "Oh non !",
@@ -218,8 +219,12 @@
"confirmations.delete_list.confirm": "Supprimer",
"confirmations.delete_list.message": "Voulez-vous vraiment supprimer définitivement cette liste ?",
"confirmations.delete_list.title": "Supprimer la liste ?",
- "confirmations.discard_draft.confirm": "Efface et continue",
+ "confirmations.discard_draft.confirm": "Effacer et continuer",
"confirmations.discard_draft.edit.cancel": "Retour vers l'éditeur",
+ "confirmations.discard_draft.edit.title": "Jeter les changements faits au message?",
+ "confirmations.discard_draft.post.cancel": "Retour au brouillon",
+ "confirmations.discard_draft.post.message": "En continuant, vous perdez le message que vous êtes en train d'écrire.",
+ "confirmations.discard_draft.post.title": "Jeter le brouillon de message?",
"confirmations.discard_edit_media.confirm": "Rejeter",
"confirmations.discard_edit_media.message": "Vous avez des modifications non enregistrées de la description ou de l'aperçu du média, les supprimer quand même ?",
"confirmations.follow_to_list.confirm": "Suivre et ajouter à la liste",
@@ -839,8 +844,8 @@
"status.mute_conversation": "Masquer la conversation",
"status.open": "Afficher le message entier",
"status.pin": "Épingler sur le profil",
- "status.quote_error.removed": "Ce message a été retiré par son auteur.",
- "status.quote_error.unauthorized": "Ce message ne peut pas être affiché car vous n'êtes pas autorisé à le voir.",
+ "status.quote_error.removed": "Ce message a été retiré par son auteur·ice.",
+ "status.quote_error.unauthorized": "Ce message ne peut pas être affiché car vous n'êtes pas autorisé·e à le voir.",
"status.quote_post_author": "Message par {name}",
"status.read_more": "En savoir plus",
"status.reblog": "Partager",
diff --git a/app/javascript/mastodon/locales/ru.json b/app/javascript/mastodon/locales/ru.json
index c777873db4..66e5cf4760 100644
--- a/app/javascript/mastodon/locales/ru.json
+++ b/app/javascript/mastodon/locales/ru.json
@@ -264,7 +264,7 @@
"directory.recently_active": "Недавно активные",
"disabled_account_banner.account_settings": "Настройки учётной записи",
"disabled_account_banner.text": "Ваша учётная запись {disabledAccount} в настоящее время отключена.",
- "dismissable_banner.community_timeline": "Это самые новые публичные посты от тех пользователей, чьи учётные записи находятся на сервере {domain}.",
+ "dismissable_banner.community_timeline": "Это самые новые публичные посты от тех пользователей, чьи учётные записи размещены на сервере {domain}.",
"dismissable_banner.dismiss": "Закрыть",
"dismissable_banner.public_timeline": "Это самые новые публичные посты от всех тех людей в федивёрсе, на которых подписаны пользователи {domain}.",
"domain_block_modal.block": "Заблокировать сервер",
diff --git a/app/javascript/mastodon/locales/tok.json b/app/javascript/mastodon/locales/tok.json
index 168c3d8e31..c48ffa5fe2 100644
--- a/app/javascript/mastodon/locales/tok.json
+++ b/app/javascript/mastodon/locales/tok.json
@@ -458,6 +458,8 @@
"navigation_bar.favourites": "ijo pona",
"navigation_bar.filters": "nimi len",
"navigation_bar.lists": "kulupu lipu",
+ "navigation_bar.logout": "o weka tan sijelo",
+ "navigation_bar.moderation": "nasin lawa",
"navigation_bar.mutes": "sina wile ala kute e jan ni",
"navigation_bar.preferences": "wile sina",
"navigation_bar.search": "o alasa",
diff --git a/config/locales/et.yml b/config/locales/et.yml
index 9cf46415af..dba31f4ffd 100644
--- a/config/locales/et.yml
+++ b/config/locales/et.yml
@@ -187,6 +187,7 @@ et:
create_domain_block: Domeeni blokeerimine
create_email_domain_block: Loo e-posti domeeni blokeering
create_ip_block: IP-reegli lisamine
+ create_relay: Loo sõnumivahendusserver
create_unavailable_domain: Kättesaamatu domeeni lisamine
create_user_role: Loo roll
demote_user: Alandas kasutaja
@@ -198,14 +199,17 @@ et:
destroy_email_domain_block: Kustuta e-posti domeeni blokeering
destroy_instance: Domeeni kustutamine
destroy_ip_block: IP-reegli kustutamine
+ destroy_relay: Kustuta sõnumivahendusserver
destroy_status: Kustuta postitus
destroy_unavailable_domain: Kättesaamatu domeeni kustutamine
destroy_user_role: Rolli kustutamine
disable_2fa_user: Keela 2FA
disable_custom_emoji: Keelas kohandatud emotikoni
+ disable_relay: Lülita sõnumivahendusserver välja
disable_sign_in_token_auth_user: Keela e-posti võtme abil autentimine kasutajale
disable_user: Keelas kasutaja
enable_custom_emoji: Lubas kohandatud emotikoni
+ enable_relay: Lülita sõnumivahendusserver sisse
enable_sign_in_token_auth_user: Luba e-posti võtme abil autentimine kasutajale
enable_user: Lubas kasutaja
memorialize_account: Igaveselt lahkunuks märkimine
@@ -248,6 +252,7 @@ et:
create_domain_block_html: "%{name} keelas domeeni %{target}"
create_email_domain_block_html: "%{name} blokeeris e-posti domeeni %{target}"
create_ip_block_html: "%{name} lõi IP-aadressile %{target} reegli"
+ create_relay_html: "%{name} lõi sõnumivahendusserveri: %{target}"
create_unavailable_domain_html: "%{name} lõpetas edastamise domeeni %{target}"
create_user_role_html: "%{name} lõi rolli %{target}"
demote_user_html: "%{name} alandas kasutajat %{target}"
@@ -259,14 +264,17 @@ et:
destroy_email_domain_block_html: "%{name} eemaldas blokeeringu e-posti domeenilt %{target}"
destroy_instance_html: "%{name} kustutas domeeni %{target}"
destroy_ip_block_html: "%{name} kustutas IP-aadressi %{target} reegli"
+ destroy_relay_html: "%{name} kustutas sõnumivahendusserveri: %{target}"
destroy_status_html: "%{name} kustutas %{target} postituse"
destroy_unavailable_domain_html: "%{name} taastas edastamise domeeni %{target}"
destroy_user_role_html: "%{name} kustutas %{target} rolli"
disable_2fa_user_html: "%{name} eemaldas kasutaja %{target} kahe etapise nõude"
disable_custom_emoji_html: "%{name} keelas emotikooni %{target}"
+ disable_relay_html: "%{name} eemaldas sõnumivahendusserveri kasutuselt: %{target}"
disable_sign_in_token_auth_user_html: "%{name} keelas e-posti võtme abil autentimise %{target} jaoks"
disable_user_html: "%{name} keelas %{target} sisenemise"
enable_custom_emoji_html: "%{name} lubas emotikooni %{target}"
+ enable_relay_html: "%{name} võttis sõnumivahendusserveri kasutusele: %{target}"
enable_sign_in_token_auth_user_html: "%{name} lubas e-posti võtme abil autentimise %{target} jaoks"
enable_user_html: "%{name} lubas %{target} sisenemise"
memorialize_account_html: "%{name} märkis %{target} igaveselt lahkunuks"
@@ -354,7 +362,7 @@ et:
updated_msg: Emotikoni uuendamine õnnestus!
upload: Lae üles
dashboard:
- active_users: aktiivsed kasutajad
+ active_users: aktiivseid kasutajaid
interactions: interaktsioonid
media_storage: Meedia hoidla
new_users: uued kasutajad
@@ -469,9 +477,32 @@ et:
title: Domeenikeeldude import
no_file: Faili pole valitud
fasp:
+ debug:
+ callbacks:
+ created_at: 'Loodud:'
+ delete: Kustuta
+ ip: IP-aadress
+ request_body: Päringu sisu
providers:
+ active: Aktiivne
+ callback: Pöördliiklus
+ delete: Kustuta
+ edit: Muuda teenusepakkujat
+ finish_registration: Lõpeta registreerimine
+ name: Nimi
+ providers: Teenusepakkujad
+ public_key_fingerprint: Avaliku võtme sõrmejälg
+ registration_requested: Registreerimispäring
+ registrations:
+ confirm: Kinnita
+ description: Sa oled saanud FASP-i registreerimispäringu. Kui sa seda ise ei algatanud, siis keeldu. Kui algatasid, siis enne kinnitamist kontrolli nime ja võtme sõrmejälge.
+ reject: Keeldu
+ title: Kinnita FASP-i registreerimine
+ save: Salvesta
sign_in: Logi sisse
status: Olek
+ title: Täiendavad teenusepakkujad Födiversumis (FASP - Fediverse Auxiliary Service Providers)
+ title: FASP
follow_recommendations:
description_html: "Jälgimissoovitused aitavad uutel kasutajatel kiirelt leida huvipakkuvat sisu. Kui kasutaja pole teistega piisavalt läbi käinud, et saaks luua personaalseid soovitusi, soovitatakse neid kontosid. Need arvutatakse ümber igapäevaselt konkreetse keele populaarseimate postituste ja enim jälgitavate kontode seast."
language: Keel
@@ -540,6 +571,13 @@ et:
all: Kõik
limited: Piiratud
title: Modereerimine
+ moderation_notes:
+ create: Lisa modereerimisteade
+ created_msg: Serveri modereerimisteate koostamine õnnestus!
+ description_html: Vaata ja lisa teade teistele moderaatoritele ning endalegi tulevikus
+ destroyed_msg: Serveri modereerimisteate kustutamine õnnestus!
+ placeholder: Teave selle koduserveri kohta, tehtud toimingud või mis iganes muu oluline, mis võimaldab sul või teistel serverit tulevikus modereerida.
+ title: Modereerimisteated
private_comment: Privaatne kommentaar
public_comment: Avalik kommentaar
purge: Kustuta
@@ -578,7 +616,7 @@ et:
relationships:
title: "%{acct}-i suhted"
relays:
- add_new: Lisa uus vahendaja
+ add_new: Lisa uus sõnumivahendusserver
delete: Kustuta
description_html: "Födereerumisvahendaja on vahendav server, mis kannab üle suures koguses avalikke postitusi nende serverite vahel, mis on sellega liitunud ja edastavad sellele oma postitusi. See aitab väikestel ja keskmistel serveritel avastada födiversumi sellist sisu, mis muidu eeldaks kohalikelt kasutajatelt nende serverite kasutajate jälgitavaks märkimist."
disable: Keela
@@ -586,13 +624,13 @@ et:
enable: Luba
enable_hint: Kui lubatud, siis server tellib sellelt vahendajalt kõik avalikud postitused ning hakkab ka enda avalikke postitusi sellele saatma.
enabled: Lubatud
- inbox_url: Vahendaja URL
- pending: Ootab vahendaja nõusolekut
+ inbox_url: Sõnumivahendusserveri võrguaadress
+ pending: Ootan sõnumivahendusserveri kinnitust
save_and_enable: Salvesta ja luba
setup: Sea üles vahendav ühendus
- signatures_not_enabled: Vahendamine ei tööta korrektselt kuniks turvarežiim või lubatud nimekirja režiim on sisse lülitatud
+ signatures_not_enabled: Vahendamine ei tööta korrektselt kui turvarežiim või lubatud nimekirja režiim on sisse lülitatud
status: Olek
- title: Vahendajad
+ title: Sõnumivahendusserverid
report_notes:
created_msg: Teade edukalt koostatud!
destroyed_msg: Teade edukalt kustutatud!
@@ -830,6 +868,7 @@ et:
back_to_account: Tagasi konto lehele
back_to_report: Tagasi raporti lehele
batch:
+ add_to_report: 'Lisa teatisele #%{id}'
remove_from_report: Eemalda raportist
report: Raport
contents: Sisu
@@ -941,6 +980,13 @@ et:
explanation_html: Esitatud teenusetingimuste näidis on mõeldud ainult teavitamise eesmärgil ja seda ei tohiks tõlgendada kui juriidilist nõuannet mis tahes küsimuses. Palun konsulteeri olukorra ja konkreetsete juriidiliste küsimuste osas oma õigusnõustajaga.
title: Teenuse tingimuste seadistamine
history: Ajalugu
+ notify_users: Teata kasutajatele
+ preview:
+ explanation_html: 'See e-kiri saadetakse %{display_count}-le kasutajale, kes olid liitunud enne %{date}. E-kirjas sisaldub järgnev tekst:'
+ send_preview: Saada eelvaade %{email} e-posti aadressile
+ send_to_all:
+ one: Saada %{display_count} e-kiri
+ other: Saada %{display_count} e-kirja
publish: Postita
published_on_html: Postitatud %{date}
title: Kasutustingimused
@@ -1180,7 +1226,7 @@ et:
new_confirmation_instructions_sent: Saad mõne minuti pärast uue kinnituslingiga e-kirja!
title: Kontrolli sisendkasti
sign_in:
- preamble_html: Logi sisse oma kasutajakontoga serveris %{domain}. Kui konto asub teises serveris, siis sa ei saa siin sisse logida.
+ preamble_html: Logi sisse oma kasutajakontoga serverisse %{domain}. Kui konto asub teises serveris, siis sa ei saa siin sisse logida.
title: Logi sisse serverisse %{domain}
sign_up:
manual_review: Liitumised kohas %{domain} vaadatakse meie moderaatorite poolt käsitsi läbi. Aitamaks meil sinu taotlust läbi vaadata, kirjuta palun natuke endast ja miks soovid kontot kohas %{domain}.
@@ -1808,6 +1854,8 @@ et:
reblog: Jagamist ei saa kinnitada
quote_policies:
followers: Jälgijad ja mainitud kasutajad
+ nobody: Vaid mainitud kasutajad
+ public: Kõik
title: '%{name}: "%{quote}"'
visibilities:
direct: Otsene
@@ -1863,6 +1911,11 @@ et:
does_not_match_previous_name: ei ühti eelmise nimega
terms_of_service:
title: Kasutustingimused
+ terms_of_service_interstitial:
+ future_preamble_html: Alates %{date} muudame me oma kasutustingimusi. Palun vaata muutunud tingimused üle.
+ past_preamble_html: Peale sinu viimast külastust oleme muutnud oma kasutustingimusi. Palun vaata muutunud tingimused üle.
+ review_link: Vaata üle kasutustingimused
+ title: "%{domain} saidi kasutustingimused muutuvad"
themes:
contrast: Mastodon (Kõrge kontrast)
default: Mastodon (Tume)
@@ -1895,6 +1948,7 @@ et:
webauthn: Turvavõtmed
user_mailer:
announcement_published:
+ description: "%{domain} saidi peakasutajate teadaanne:"
subject: Saidi teadaanne teenuste kohta
title: "%{domain} saidi teadaanne teenuste kohta"
appeal_approved:
@@ -1927,6 +1981,8 @@ et:
subject: Kontole sisenemine uuelt IP-aadressilt
title: Uus sisenemine
terms_of_service_changed:
+ agreement: Jätkates %{domain} teenuse kasutamisega nõustud sa kasutustingimustega. Kui sa pole tingimustega nõus, siis võid oma kasutajakonto kustutamisega lepingu %{domain} saidiga alati lõpetada.
+ changelog: 'Selle uuenduse ülevaade sinu jaoks:'
sign_off: "%{domain} saidi tiim"
subject: Meie kasutustingimuste uuendused
subtitle: "%{domain} saidi kasutustingimused muutuvad"
diff --git a/config/locales/fa.yml b/config/locales/fa.yml
index 41f8b7febf..b05a152dc2 100644
--- a/config/locales/fa.yml
+++ b/config/locales/fa.yml
@@ -578,6 +578,13 @@ fa:
all: همه
limited: محدود
title: مدیریت
+ moderation_notes:
+ create: افزودن یادداشت نظارتی
+ created_msg: یادداشت نظارتی با موفقیت ساخته شد!
+ description_html: دیدن و گذاشتن یادداشتهایی برای دیگر ناظران و خود آیندهتان
+ destroyed_msg: یادداشت نظارتی با موفقیت حذف شد!
+ placeholder: اطلاعاتی دربارهٔ این نمونه، کنشهای انجام شده یا هرچیز دیگری که در نظارت این نمونه در آینده کمک خواهد کرد.
+ title: یادداشتهای نظارتی
private_comment: یادداشت خصوصی
public_comment: یادداشت عمومی
purge: پاکسازی
@@ -791,13 +798,21 @@ fa:
description_html: در حالی که اکثر افراد ادعا میکنند که شرایط استفاده را خوانده و پذیرفتهاند، افراد معمولا تا پیش از بروز مشکل این متن را مطالعه نمیکنند. پیدا کردن قوانین کارسازتان را با تبدیلشان به صورت فهرست برای کاربران تسهیل کنید. سعی کنید هر قانون را کوتاه و ساده نگاه دارید اما از آن طرف هم تلاش نکنید که آنها به تعداد زیادی مورد جدا از هم تقسیم کنید.
edit: ویرایش قانون
empty: هنوز هیچ قانونی برای کارساز تعریف نشده.
+ move_down: پایین بردن
+ move_up: بالا بردن
title: قوانین کارساز
+ translation: ترجمه
+ translations: ترجمهها
+ translations_explanation: میتوانید به صورت اختیاری نقشها را ترجمه کنید. در صورت موجود نبودن نگارش ترجمه شده مقدار پیشگزیده نشان داده خواهد شد. لطفاً همواره مطمئن شوید که ترجمهها با مقدار پیشگزیده هماهنگند.
settings:
about:
manage_rules: مدیریت قانونهای کارساز
preamble: اطلاعات عمیقی در مورد نحوه کارکرد، تعدیل و تأمین مالی سرور ارائه دهید.
rules_hint: یک منطقه اختصاصی برای قوانینی وجود دارد که انتظار می رود کاربران شما به آن پایبند باشند.
title: درباره
+ allow_referrer_origin:
+ desc: ممکن است هنگام زدن کاربرانتان روی پیوند پایگاههای خارجی مرورگرشان نشانی کارساز ماستودونتان را به عنوان هدایتگر بفرستد. اگر این کار موجب شناسایی یکتای کاربرانتان میشود، برای نمونه در صورت خصوصی بودن کارسازتان از کار بیندازدش.
+ title: اجازه به پایگاههای خارجی برای دیدن کارساز ماستودونتان به عنوان منبع شدآمد
appearance:
preamble: سفارشیسازی رابطس وب ماستودون.
title: ظاهر
diff --git a/config/locales/fr-CA.yml b/config/locales/fr-CA.yml
index 35f7433146..86c03aab7d 100644
--- a/config/locales/fr-CA.yml
+++ b/config/locales/fr-CA.yml
@@ -493,11 +493,14 @@ fr-CA:
providers: Fournisseur
registrations:
confirm: Confirmer
+ description: Vous avez reçu une souscription d'un FSAF. Rejetez-la si vous ne l'avez pas initiée. Si c'est bien votre intention, comparez le nom et l'empreinte de la clé avant de confirmer la souscription.
reject: Rejeter
+ title: Confirmer la souscription au FSAF
save: Enregistrer
select_capabilities: Sélectionnez les Capacités
sign_in: Se connecter
status: État
+ title: Fournisseurs de Services Auxiliaire du Fedivers
follow_recommendations:
description_html: "Les recommandations d'abonnement aident les nouvelles personnes à trouver rapidement du contenu intéressant. Si un·e utilisateur·rice n'a pas assez interagi avec les autres pour avoir des recommandations personnalisées, ces comptes sont alors recommandés. La sélection est mise à jour quotidiennement depuis un mélange de comptes ayant le plus d'interactions récentes et le plus grand nombre d'abonné·e·s locaux pour une langue donnée."
language: Pour la langue
@@ -567,7 +570,7 @@ fr-CA:
limited: Limité
title: Modération
moderation_notes:
- title: Notes d'arbitrage
+ title: Notes de modération
private_comment: Commentaire privé
public_comment: Commentaire public
purge: Purge
diff --git a/config/locales/fr.yml b/config/locales/fr.yml
index c3af77f1ea..bace64c213 100644
--- a/config/locales/fr.yml
+++ b/config/locales/fr.yml
@@ -493,11 +493,14 @@ fr:
providers: Fournisseur
registrations:
confirm: Confirmer
+ description: Vous avez reçu une souscription d'un FSAF. Rejetez-la si vous ne l'avez pas initiée. Si c'est bien votre intention, comparez le nom et l'empreinte de la clé avant de confirmer la souscription.
reject: Rejeter
+ title: Confirmer la souscription au FSAF
save: Enregistrer
select_capabilities: Sélectionnez les Capacités
sign_in: Se connecter
status: État
+ title: Fournisseurs de Services Auxiliaire du Fedivers
follow_recommendations:
description_html: "Les recommandations d'abonnement aident les nouvelles personnes à trouver rapidement du contenu intéressant. Si un·e utilisateur·rice n'a pas assez interagi avec les autres pour avoir des recommandations personnalisées, ces comptes sont alors recommandés. La sélection est mise à jour quotidiennement depuis un mélange de comptes ayant le plus d'interactions récentes et le plus grand nombre d'abonné·e·s locaux pour une langue donnée."
language: Pour la langue
@@ -567,7 +570,7 @@ fr:
limited: Limité
title: Modération
moderation_notes:
- title: Notes d'arbitrage
+ title: Notes de modération
private_comment: Commentaire privé
public_comment: Commentaire public
purge: Purge
diff --git a/config/locales/ru.yml b/config/locales/ru.yml
index ac4f3542b1..7160bb0a2e 100644
--- a/config/locales/ru.yml
+++ b/config/locales/ru.yml
@@ -401,7 +401,7 @@ ru:
software: Программное обеспечение
sources: Источники регистрации
space: Используемое пространство
- title: Дашборд
+ title: Обзор
top_languages: Рейтинг языков по активности
top_servers: Рейтинг серверов по активности
website: Веб-сайт
@@ -1236,49 +1236,49 @@ ru:
rules:
accept: Принять
back: Назад
- invited_by: 'Вы можете присоединиться к %{domain} благодаря приглашению полученному от:'
- preamble: Они устанавливаются и применяются модераторами %{domain}.
+ invited_by: 'Вы можете зарегистрироваться на сервере %{domain}, потому что вы получили приглашение от:'
+ preamble: Модераторы сервера %{domain} установили эти правила и следят за их исполнением.
preamble_invited: Прежде чем продолжить, ознакомьтесь с основными правилами, установленными модераторами сервера %{domain}.
title: Несколько основных правил.
- title_invited: Вы были приглашены.
+ title_invited: Вы получили приглашение.
security: Безопасность
- set_new_password: Задать новый пароль
+ set_new_password: Сменить пароль
setup:
- email_below_hint_html: Проверьте папку "Спам" или запросите другую. Вы можете исправить свой адрес электронной почты, если он неправильный.
- email_settings_hint_html: Чтобы начать пользоваться Mastodon, пройдите по ссылке, которую мы отправили на %{email}. А мы пока подождём тут.
- link_not_received: Не получили ссылку?
+ email_below_hint_html: Проверьте папку «Спам» или нажмите на кнопку ниже, чтобы выслать письмо повторно. Вы можете исправить свой адрес электронной почты, если вы ввели его неверно.
+ email_settings_hint_html: Чтобы начать пользоваться Mastodon, перейдите по ссылке, которую мы отправили на адрес %{email}.
+ link_not_received: Не приходит письмо?
new_confirmation_instructions_sent: Через несколько минут вы получите новое письмо со ссылкой для подтверждения!
- title: Проверьте свой почтовый ящик
+ title: Проверьте свою почту
sign_in:
- preamble_html: Войдите, используя ваши учётные данные %{domain}. Если ваша учётная запись размещена на другом сервере, вы не сможете здесь войти.
- title: Войти в %{domain}
+ preamble_html: Введите здесь данные своей учётной записи на сервере %{domain}, чтобы войти. Вы не сможете войти, если ваша учётная запись размещена на другом сервере.
+ title: Авторизация на %{domain}
sign_up:
- manual_review: Регистрация на %{domain} проходит через ручную проверку нашими модераторами. Чтобы помочь нам обработать вашу регистрацию, напишите немного о себе и о том, почему вы хотите получить аккаунт на %{domain}.
- preamble: С учётной записью на этом сервере Mastodon вы сможете подписываться на всех других людей в федиверсе вне зависимости от того, где находятся их учётные записи.
- title: Зарегистрируйтесь в %{domain}.
+ manual_review: На сервере %{domain} все заявки на регистрацию проверяются модераторами вручную. Чтобы помочь нам принять решение в отношении вашей заявки, напишите немного о себе и о том, почему вы хотите создать учётную запись на сервере %{domain}.
+ preamble: С учётной записью на этом сервере Mastodon вы сможете подписываться на всех других людей в федивёрсе вне зависимости от того, где размещены их учётные записи.
+ title: Создайте учётную запись на сервере %{domain}.
status:
- account_status: Статус учётной записи
- confirming: Жду подтверждения по электронной почте.
+ account_status: Состояние учётной записи
+ confirming: Ожидание подтверждения e-mail.
functional: Ваша учётная запись в полном порядке.
- pending: Ваша заявка находится на рассмотрении у наших сотрудников. Это может занять некоторое время. Вы получите электронное письмо, если ваша заявка будет одобрена.
+ pending: Ваша заявка ожидает одобрения администраторами, это может занять немного времени. Вы получите письмо, как только заявку одобрят.
redirecting_to: Ваша учётная запись деактивированна, потому что вы настроили перенаправление на %{acct}.
self_destruct: Поскольку %{domain} закрывается, вы получите ограниченный доступ к вашей учетной записи.
view_strikes: Просмотр предыдущих замечаний в адрес вашей учетной записи
too_fast: Форма отправлена слишком быстро, попробуйте еще раз.
use_security_key: Использовать ключ безопасности
- user_agreement_html: Мной прочитаны и принятыпользовательское соглашение и политика конфиденциальности
+ user_agreement_html: Мной прочитаны и приняты пользовательское соглашение и политика конфиденциальности
user_privacy_agreement_html: Мной прочитана и принята политика конфиденциальности
author_attribution:
- example_title: Образец текста
- hint_html: Публикуете ли вы свои статьи где-либо ещё кроме Mastodon? Если да, то ваше авторство может быть упомянуто, когда ими делятся в Mastodon.
- instructions: 'Добавьте код ниже в HTML ваших статей:'
- more_from_html: Больше от %{name}
- s_blog: "%{name}'S Блог"
- then_instructions: Затем добавьте доменное имя сайта, где вы публикуетесь, в поле ниже.
- title: Авторская атрибуция
+ example_title: Пример текста
+ hint_html: Вы пишете статьи для новостных сайтов или ведёте блог где-либо ещё помимо Mastodon? Ваше авторство может быть упомянуто всякий раз, когда вашими статьями делятся в Mastodon.
+ instructions: 'Добавьте следующий код в HTML-разметку ваших статей:'
+ more_from_html: 'Автор: %{name}'
+ s_blog: "%{name} ведёт блог"
+ then_instructions: Затем впишите доменное имя сайта, где вы публикуетесь, в поле ниже.
+ title: Упоминание авторства
challenge:
confirm: Продолжить
- hint_html: "Подсказка: мы не будем спрашивать пароль повторно в течение часа."
+ hint_html: "Подсказка: В течение часа вам не придётся снова вводить свой пароль."
invalid_password: Неверный пароль
prompt: Введите пароль для продолжения
crypto:
diff --git a/config/locales/simple_form.et.yml b/config/locales/simple_form.et.yml
index f1a0b40bdd..f013f454ca 100644
--- a/config/locales/simple_form.et.yml
+++ b/config/locales/simple_form.et.yml
@@ -19,7 +19,7 @@ et:
title: Valikuline. Ei ole nähtav saajale
admin_account_action:
include_statuses: Kasutaja näeb, millised postitused on põhjustanud moderaatori otsuse või hoiatuse
- send_email_notification: Konto omanik saab selgituse selle kohta, mis juhtus nende kontoga
+ send_email_notification: Kasutajakonto omanik saab selgituse selle kohta, mis juhtus tema kontoga
text_html: Valikuline. On võimalik kasutada postituse süntaksi. On võimalik lisada hoiatuste eelseadistusi säästmaks aega
type_html: Vali, mida teha kasutajaga %{acct}
types:
@@ -47,7 +47,7 @@ et:
digest: Saadetakse ainult pärast pikka tegevusetuse perioodi ja ainult siis, kui on saadetud otsesõnumeid
email: Sulle saadetakse e-posti teel kinnituskiri
header: WEBP, PNG, GIF või JPG. Kõige rohkem %{size}. Vähendatakse %{dimensions} pikslini
- inbox_url: Kopeeri soovitud vahendaja avalehe URL
+ inbox_url: Kopeeri soovitud sõnumivahendusserveri avalehe võrguaadress
irreversible: Filtreeritud postitused kaovad taastamatult, isegi kui filter on hiljem eemaldatud
locale: Kasutajaliidese, e-kirjade ja tõuketeadete keel
password: Vajalik on vähemalt 8 märki
@@ -196,7 +196,7 @@ et:
fields: Veebiviited
header: Päis
honeypot: "%{label} (ära sisesta)"
- inbox_url: Vahendaja sisendkausta URL
+ inbox_url: Sõnumivahendusserveri sisendkausta võrguaadress
irreversible: Kustuta selle asemel, et peita
locale: Kasutajaliidese keel
max_uses: Maksimum kasutajate arv
@@ -212,6 +212,7 @@ et:
setting_boost_modal: Näita enne jagamist kinnitusdialoogi
setting_default_language: Postituse keel
setting_default_privacy: Postituse nähtavus
+ setting_default_quote_policy: Kes võivad tsiteerida
setting_default_sensitive: Alati märgista meedia tundlikuks
setting_delete_modal: Näita kinnitusdialoogi enne postituse kustutamist
setting_disable_hover_cards: Keela profiili eelvaade kui hõljutada
@@ -224,6 +225,7 @@ et:
setting_hide_network: Peida oma võrk
setting_reduce_motion: Vähenda animatsioonides liikumist
setting_system_font_ui: Kasuta süsteemi vaikefonti
+ setting_system_scrollbars_ui: Kasuta süsteemi vaikimisi kerimisriba
setting_theme: Saidi teema
setting_trends: Näita tänaseid trende
setting_unfollow_modal: Näita kinnitusdialoogi enne jälgimise eemaldamist
@@ -242,6 +244,7 @@ et:
name: Silt
filters:
actions:
+ blur: Peida hoiatusega meedia
hide: Peida täielikult
warn: Peida hoiatusega
form_admin_settings:
From e97f43399be6443d6c2fb1dfc959e40ca0795414 Mon Sep 17 00:00:00 2001
From: Claire
Date: Thu, 3 Jul 2025 16:42:48 +0200
Subject: [PATCH 16/29] Fix error handling for blank actions in account
moderation action form (#35246)
---
.../admin/account_actions_controller.rb | 20 +++++++++++--------
app/models/admin/account_action.rb | 10 ++++++++--
spec/system/admin/account_actions_spec.rb | 7 +++++++
3 files changed, 27 insertions(+), 10 deletions(-)
diff --git a/app/controllers/admin/account_actions_controller.rb b/app/controllers/admin/account_actions_controller.rb
index 91849811e3..3cfd1e1761 100644
--- a/app/controllers/admin/account_actions_controller.rb
+++ b/app/controllers/admin/account_actions_controller.rb
@@ -14,16 +14,20 @@ module Admin
def create
authorize @account, :show?
- account_action = Admin::AccountAction.new(resource_params)
- account_action.target_account = @account
- account_action.current_account = current_account
+ @account_action = Admin::AccountAction.new(resource_params)
+ @account_action.target_account = @account
+ @account_action.current_account = current_account
- account_action.save!
-
- if account_action.with_report?
- redirect_to admin_reports_path, notice: I18n.t('admin.reports.processed_msg', id: resource_params[:report_id])
+ if @account_action.save
+ if @account_action.with_report?
+ redirect_to admin_reports_path, notice: I18n.t('admin.reports.processed_msg', id: resource_params[:report_id])
+ else
+ redirect_to admin_account_path(@account.id)
+ end
else
- redirect_to admin_account_path(@account.id)
+ @warning_presets = AccountWarningPreset.all
+
+ render :new
end
end
diff --git a/app/models/admin/account_action.rb b/app/models/admin/account_action.rb
index e43a50ae63..3cde3c7f8e 100644
--- a/app/models/admin/account_action.rb
+++ b/app/models/admin/account_action.rb
@@ -32,8 +32,8 @@ class Admin::AccountAction
validates :type, :target_account, :current_account, presence: true
validates :type, inclusion: { in: TYPES }
- def save!
- raise ActiveRecord::RecordInvalid, self unless valid?
+ def save
+ return false unless valid?
ApplicationRecord.transaction do
process_action!
@@ -43,6 +43,12 @@ class Admin::AccountAction
process_notification!
process_queue!
+
+ true
+ end
+
+ def save!
+ raise ActiveRecord::RecordInvalid, self unless save
end
def report
diff --git a/spec/system/admin/account_actions_spec.rb b/spec/system/admin/account_actions_spec.rb
index 787b988a0d..abfd33dc27 100644
--- a/spec/system/admin/account_actions_spec.rb
+++ b/spec/system/admin/account_actions_spec.rb
@@ -15,6 +15,13 @@ RSpec.describe 'Admin Account Actions' do
expect(page)
.to have_title(I18n.t('admin.account_actions.title', acct: account.pretty_acct))
+ # Invalid submission
+ expect { submit_form }
+ .to_not(change { account.strikes.count })
+ expect(page)
+ .to have_content(/can't be blank/)
+
+ # Valid submission
choose(option: 'silence')
expect { submit_form }
.to change { account.strikes.count }.by(1)
From 2af17adc34cda13ad305e51c9d787d4202ca0eec Mon Sep 17 00:00:00 2001
From: Matt Jankowski
Date: Thu, 3 Jul 2025 10:43:36 -0400
Subject: [PATCH 17/29] Use `ActiveModel::Attributes` in
admin/status_batch_action (#35255)
---
app/models/admin/status_batch_action.rb | 7 ++-----
1 file changed, 2 insertions(+), 5 deletions(-)
diff --git a/app/models/admin/status_batch_action.rb b/app/models/admin/status_batch_action.rb
index 4a10001935..4d0ee13038 100644
--- a/app/models/admin/status_batch_action.rb
+++ b/app/models/admin/status_batch_action.rb
@@ -2,6 +2,7 @@
class Admin::StatusBatchAction
include ActiveModel::Model
+ include ActiveModel::Attributes
include AccountableConcern
include Authorization
@@ -9,11 +10,7 @@ class Admin::StatusBatchAction
:status_ids, :report_id,
:text
- attr_reader :send_email_notification
-
- def send_email_notification=(value)
- @send_email_notification = ActiveModel::Type::Boolean.new.cast(value)
- end
+ attribute :send_email_notification, :boolean
def save!
process_action!
From e8d2432e6acbb385765e1595915e6b9905ad93e9 Mon Sep 17 00:00:00 2001
From: Matt Jankowski
Date: Thu, 3 Jul 2025 12:28:47 -0400
Subject: [PATCH 18/29] Fix intermittent failure of TOS model spec from
effective date collision (#35244)
---
spec/models/terms_of_service_spec.rb | 10 ++++++----
1 file changed, 6 insertions(+), 4 deletions(-)
diff --git a/spec/models/terms_of_service_spec.rb b/spec/models/terms_of_service_spec.rb
index 7e68c4eac7..16cd5dd2eb 100644
--- a/spec/models/terms_of_service_spec.rb
+++ b/spec/models/terms_of_service_spec.rb
@@ -44,22 +44,24 @@ RSpec.describe TermsOfService do
end
describe '.live' do
- let!(:not_effective) { Fabricate :terms_of_service }
+ # The `pre_effective_date` record captures a period before the value was tracked
+ # The update in the `before` block creates an invalid (but historically plausible) record
+ let!(:pre_effective_date) { travel_to(10.days.ago) { Fabricate :terms_of_service, effective_date: Time.zone.today } }
let!(:effective_past) { travel_to(3.days.ago) { Fabricate :terms_of_service, effective_date: Time.zone.today } }
let!(:effective_future) { Fabricate :terms_of_service, effective_date: 3.days.from_now }
- before { not_effective.update_attribute(:effective_date, nil) }
+ before { pre_effective_date.update_attribute(:effective_date, nil) }
it 'returns records without effective or with past effective' do
expect(described_class.live)
- .to include(not_effective)
+ .to include(pre_effective_date)
.and include(effective_past)
.and not_include(effective_future)
end
end
describe '.upcoming' do
- let!(:unpublished) { Fabricate :terms_of_service, published_at: nil }
+ let!(:unpublished) { Fabricate :terms_of_service, published_at: nil, effective_date: 10.days.from_now }
let!(:effective_past) { travel_to(3.days.ago) { Fabricate :terms_of_service, effective_date: Time.zone.today } }
let!(:effective_future_near) { Fabricate :terms_of_service, effective_date: 3.days.from_now }
let!(:effective_future_far) { Fabricate :terms_of_service, effective_date: 5.days.from_now }
From 5a7c0d42f7f9a6c5dc8579f480395678298f6333 Mon Sep 17 00:00:00 2001
From: Andy Piper
Date: Thu, 3 Jul 2025 21:51:32 +0100
Subject: [PATCH 19/29] Add specific language confirming that we test with
BrowserStack and Chromatic (#35248)
Signed-off-by: Andy Piper
---
README.md | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/README.md b/README.md
index 552940fbea..1202728965 100644
--- a/README.md
+++ b/README.md
@@ -51,8 +51,8 @@ Mastodon is a **free, open-source social network server** based on [ActivityPub]
- [Redis](https://redis.io/) and [Sidekiq](https://sidekiq.org/) are used for caching and queueing.
- [Node.js](https://nodejs.org/) powers the streaming API.
- [React.js](https://reactjs.org/) and [Redux](https://redux.js.org/) are used for the dynamic parts of the interface.
-- [BrowserStack](https://www.browserstack.com/) supports testing on real devices and browsers.
-- [Chromatic](https://www.chromatic.com/) provides visual regression testing.
+- [BrowserStack](https://www.browserstack.com/) supports testing on real devices and browsers. (This project is tested with BrowserStack)
+- [Chromatic](https://www.chromatic.com/) provides visual regression testing. (This project is tested with Chromatic)
### Requirements
From 1fa72d6c4419ee9b209553a1add13ef3da4e318d Mon Sep 17 00:00:00 2001
From: David Roetzel
Date: Fri, 4 Jul 2025 09:25:42 +0200
Subject: [PATCH 20/29] Raise better exception on FASP error responses (#35262)
---
app/lib/fasp/request.rb | 2 ++
spec/lib/fasp/request_spec.rb | 24 +++++++++++++++++++-----
2 files changed, 21 insertions(+), 5 deletions(-)
diff --git a/app/lib/fasp/request.rb b/app/lib/fasp/request.rb
index 6ea837b89c..2002e90bb0 100644
--- a/app/lib/fasp/request.rb
+++ b/app/lib/fasp/request.rb
@@ -49,6 +49,8 @@ class Fasp::Request
end
def validate!(response)
+ raise Mastodon::UnexpectedResponseError, response if response.code >= 400
+
content_digest_header = response.headers['content-digest']
raise Mastodon::SignatureVerificationError, 'content-digest missing' if content_digest_header.blank?
raise Mastodon::SignatureVerificationError, 'content-digest does not match' if content_digest_header != content_digest(response.body)
diff --git a/spec/lib/fasp/request_spec.rb b/spec/lib/fasp/request_spec.rb
index 80d061dc61..9b354c8f44 100644
--- a/spec/lib/fasp/request_spec.rb
+++ b/spec/lib/fasp/request_spec.rb
@@ -32,13 +32,27 @@ RSpec.describe Fasp::Request do
context 'when the response is not signed' do
before do
stub_request(method, 'https://reqprov.example.com/fasp/test_path')
- .to_return(status: 200)
+ .to_return(status:)
end
- it 'raises an error' do
- expect do
- subject.send(method, '/test_path')
- end.to raise_error(Mastodon::SignatureVerificationError)
+ context 'when the request was successful' do
+ let(:status) { 200 }
+
+ it 'raises a signature verification error' do
+ expect do
+ subject.send(method, '/test_path')
+ end.to raise_error(Mastodon::SignatureVerificationError)
+ end
+ end
+
+ context 'when an error response is received' do
+ let(:status) { 401 }
+
+ it 'raises an unexpected response error' do
+ expect do
+ subject.send(method, '/test_path')
+ end.to raise_error(Mastodon::UnexpectedResponseError)
+ end
end
end
end
From 83660ee3812516773cb307502acbe6bdab4723f4 Mon Sep 17 00:00:00 2001
From: "github-actions[bot]"
<41898282+github-actions[bot]@users.noreply.github.com>
Date: Fri, 4 Jul 2025 07:34:54 +0000
Subject: [PATCH 21/29] New Crowdin Translations (automated) (#35261)
Co-authored-by: GitHub Actions
---
app/javascript/mastodon/locales/el.json | 3 ++
app/javascript/mastodon/locales/eu.json | 35 ++++++++++++++++++++++
app/javascript/mastodon/locales/fr-CA.json | 22 ++++++++++++++
app/javascript/mastodon/locales/fr.json | 22 ++++++++++++++
config/locales/da.yml | 8 ++---
5 files changed, 86 insertions(+), 4 deletions(-)
diff --git a/app/javascript/mastodon/locales/el.json b/app/javascript/mastodon/locales/el.json
index ee6de69d41..4a6de095a8 100644
--- a/app/javascript/mastodon/locales/el.json
+++ b/app/javascript/mastodon/locales/el.json
@@ -219,6 +219,8 @@
"confirmations.delete_list.confirm": "Διαγραφή",
"confirmations.delete_list.message": "Σίγουρα θες να διαγράψεις οριστικά αυτή τη λίστα;",
"confirmations.delete_list.title": "Διαγραφή λίστας;",
+ "confirmations.discard_draft.confirm": "Απόρριψη και συνέχεια",
+ "confirmations.discard_draft.edit.cancel": "Συνέχιση επεξεργασίας",
"confirmations.discard_edit_media.confirm": "Απόρριψη",
"confirmations.discard_edit_media.message": "Έχεις μη αποθηκευμένες αλλαγές στην περιγραφή πολυμέσων ή στην προεπισκόπηση, απόρριψη ούτως ή άλλως;",
"confirmations.follow_to_list.confirm": "Ακολούθησε και πρόσθεσε στη λίστα",
@@ -796,6 +798,7 @@
"report_notification.categories.violation": "Παραβίαση κανόνα",
"report_notification.categories.violation_sentence": "παραβίαση κανόνα",
"report_notification.open": "Ανοιχτή αναφορά",
+ "search.clear": "Εκκαθάριση αναζήτησης",
"search.no_recent_searches": "Καμία πρόσφατη αναζήτηση",
"search.placeholder": "Αναζήτηση",
"search.quick_action.account_search": "Προφίλ που ταιριάζουν με {x}",
diff --git a/app/javascript/mastodon/locales/eu.json b/app/javascript/mastodon/locales/eu.json
index f3528024c9..3b2662d6af 100644
--- a/app/javascript/mastodon/locales/eu.json
+++ b/app/javascript/mastodon/locales/eu.json
@@ -1,6 +1,7 @@
{
"about.blocks": "Moderatutako zerbitzariak",
"about.contact": "Kontaktua:",
+ "about.default_locale": "Lehenetsia",
"about.disclaimer": "Mastodon software libre eta kode irekikoa da, eta Mastodon gGmbH-ren marka erregistratua.",
"about.domain_blocks.no_reason_available": "Arrazoia ez dago eskuragarri",
"about.domain_blocks.preamble": "Mastodonek orokorrean aukera ematen dizu fedibertsoko beste zerbitzarietako erabiltzaileen edukia ikusi eta haiekin komunikatzeko. Zerbitzari zehatz honi ezarritako salbuespenak hauek dira.",
@@ -8,6 +9,7 @@
"about.domain_blocks.silenced.title": "Mugatua",
"about.domain_blocks.suspended.explanation": "Ez da zerbitzari honetako daturik prozesatuko, gordeko, edo partekatuko, zerbitzari honetako erabiltzaileekin komunikatzea ezinezkoa eginez.",
"about.domain_blocks.suspended.title": "Kanporatua",
+ "about.language_label": "Hizkuntza",
"about.not_available": "Zerbitzari honek ez du informazio hau eskuragarri jarri.",
"about.powered_by": "{mastodon} erabiltzen duen sare sozial deszentralizatua",
"about.rules": "Zerbitzariaren arauak",
@@ -19,13 +21,20 @@
"account.block_domain": "Blokeatu {domain} domeinua",
"account.block_short": "Blokeatu",
"account.blocked": "Blokeatuta",
+ "account.blocking": "Eragotzitakoak",
"account.cancel_follow_request": "Baztertu jarraitzeko eskaera",
"account.copy": "Kopiatu profilerako esteka",
"account.direct": "Aipatu pribatuki @{name}",
"account.disable_notifications": "Utzi jakinarazteari @{name} erabiltzaileak argitaratzean",
+ "account.domain_blocking": "Eragotzitako domeinua",
"account.edit_profile": "Editatu profila",
"account.enable_notifications": "Jakinarazi @{name} erabiltzaileak argitaratzean",
"account.endorse": "Nabarmendu profilean",
+ "account.familiar_followers_one": "{name1}-k jarraitzen du",
+ "account.familiar_followers_two": "{name1}-k eta {name2}-k jarraitzen dute",
+ "account.featured": "Gailenak",
+ "account.featured.accounts": "Profilak",
+ "account.featured.hashtags": "Traolak",
"account.featured_tags.last_status_at": "Azken bidalketa {date} datan",
"account.featured_tags.last_status_never": "Bidalketarik ez",
"account.follow": "Jarraitu",
@@ -33,9 +42,11 @@
"account.followers": "Jarraitzaileak",
"account.followers.empty": "Ez du inork erabiltzaile hau jarraitzen oraindik.",
"account.followers_counter": "{count, plural, one {{counter} jarraitzaile} other {{counter} jarraitzaile}}",
+ "account.followers_you_know_counter": "{counter} ezagutzen dituzu",
"account.following": "Jarraitzen",
"account.following_counter": "{count, plural, one {{counter} jarraitzen} other {{counter} jarraitzen}}",
"account.follows.empty": "Erabiltzaile honek ez du inor jarraitzen oraindik.",
+ "account.follows_you": "Jarraitzen zaitu",
"account.go_to_profile": "Joan profilera",
"account.hide_reblogs": "Ezkutatu @{name} erabiltzailearen bultzadak",
"account.in_memoriam": "Oroimenezkoa.",
@@ -50,18 +61,23 @@
"account.mute_notifications_short": "Mututu jakinarazpenak",
"account.mute_short": "Mututu",
"account.muted": "Mutututa",
+ "account.muting": "Isilarazitakoak",
+ "account.mutual": "Elkar jarraitzen duzue",
"account.no_bio": "Ez da deskribapenik eman.",
"account.open_original_page": "Ireki jatorrizko orria",
"account.posts": "Bidalketa",
"account.posts_with_replies": "Bidalketak eta erantzunak",
+ "account.remove_from_followers": "Kendu {name} zure jarraitzaileengandik",
"account.report": "Salatu @{name}",
"account.requested": "Onarpenaren zain. Egin klik jarraipen-eskaera ezeztatzeko",
"account.requested_follow": "{name}-(e)k zu jarraitzeko eskaera egin du",
+ "account.requests_to_follow_you": "Zu jarraitzeko eskaera egin du",
"account.share": "Partekatu @{name} erabiltzailearen profila",
"account.show_reblogs": "Erakutsi @{name} erabiltzailearen bultzadak",
"account.statuses_counter": "{count, plural, one {{counter} bidalketa} other {{counter} bidalketa}}",
"account.unblock": "Desblokeatu @{name}",
"account.unblock_domain": "Berriz erakutsi {domain}",
+ "account.unblock_domain_short": "Desblokeatu",
"account.unblock_short": "Desblokeatu",
"account.unendorse": "Ez nabarmendu profilean",
"account.unfollow": "Utzi jarraitzeari",
@@ -87,10 +103,13 @@
"alt_text_modal.add_text_from_image": "Gehitu testua iruditik",
"alt_text_modal.cancel": "Utzi",
"alt_text_modal.change_thumbnail": "Aldatu koadro txikia",
+ "alt_text_modal.describe_for_people_with_hearing_impairments": "Deskribatu hau entzumen arazoak dituzten pertsonentzat…",
+ "alt_text_modal.describe_for_people_with_visual_impairments": "Deskribatu hau ikusmen arazoak dituzten pertsonentzat…",
"alt_text_modal.done": "Egina",
"announcement.announcement": "Iragarpena",
"annual_report.summary.followers.followers": "jarraitzaileak",
"annual_report.summary.followers.total": "{count} guztira",
+ "annual_report.summary.here_it_is": "Hona hemen zure {year}. urtearen bilduma:",
"annual_report.summary.highlighted_post.by_favourites": "egindako bidalketa gogokoena",
"annual_report.summary.highlighted_post.by_reblogs": "egindako bidalketa zabalduena",
"annual_report.summary.highlighted_post.by_replies": "erantzun gehien izan dituen bidalketa",
@@ -192,6 +211,12 @@
"confirmations.delete_list.confirm": "Ezabatu",
"confirmations.delete_list.message": "Ziur behin betiko ezabatu nahi duzula zerrenda hau?",
"confirmations.delete_list.title": "Ezabatu zerrenda?",
+ "confirmations.discard_draft.confirm": "Baztertu eta jarraitu",
+ "confirmations.discard_draft.edit.cancel": "Berrekin edizioari",
+ "confirmations.discard_draft.edit.message": "Jarraitzeak editatzen ari zaren mezuan egindako aldaketak baztertuko ditu.",
+ "confirmations.discard_draft.edit.title": "Baztertu zure argitalpenari egindako aldaketak?",
+ "confirmations.discard_draft.post.cancel": "Zirriborroa berrekin",
+ "confirmations.discard_draft.post.title": "Zure argitalpenaren zirriborroa baztertu nahi duzu?",
"confirmations.discard_edit_media.confirm": "Baztertu",
"confirmations.discard_edit_media.message": "Multimediaren deskribapen edo aurrebistan gorde gabeko aldaketak daude, baztertu nahi dituzu?",
"confirmations.follow_to_list.confirm": "Jarraitu eta zerrendan sartu",
@@ -201,12 +226,16 @@
"confirmations.logout.message": "Ziur saioa amaitu nahi duzula?",
"confirmations.logout.title": "Itxi saioa?",
"confirmations.missing_alt_text.confirm": "Gehitu testu alternatiboa",
+ "confirmations.missing_alt_text.message": "Zure argitalpenak \"alt text\"-urik gabeko multimedia edukia dauka. Deskribapenak gehitzeak zure edukia jende gehiagorentzat eskuragarri jartzen laguntzen du.",
"confirmations.missing_alt_text.secondary": "Bidali edonola ere",
"confirmations.missing_alt_text.title": "Testu alternatiboa gehitu?",
"confirmations.mute.confirm": "Mututu",
"confirmations.redraft.confirm": "Ezabatu eta berridatzi",
"confirmations.redraft.message": "Ziur argitalpen hau ezabatu eta zirriborroa berriro egitea nahi duzula? Gogokoak eta bultzadak galduko dira, eta jatorrizko argitalpenaren erantzunak zurtz geratuko dira.",
"confirmations.redraft.title": "Ezabatu eta berridatzi bidalketa?",
+ "confirmations.remove_from_followers.confirm": "Jarraitzailea Kendu",
+ "confirmations.remove_from_followers.message": "{name}-k zu jarraitzeari utziko dio. Seguru zaude jarraitu nahi duzula?",
+ "confirmations.remove_from_followers.title": "Jarraitzailea kendu nahi duzu?",
"confirmations.unfollow.confirm": "Utzi jarraitzeari",
"confirmations.unfollow.message": "Ziur {name} jarraitzeari utzi nahi diozula?",
"confirmations.unfollow.title": "Erabiltzailea jarraitzeari utzi?",
@@ -228,12 +257,14 @@
"disabled_account_banner.text": "Zure {disabledAccount} kontua desgaituta dago une honetan.",
"dismissable_banner.community_timeline": "Hauek dira {domain} zerbitzarian ostatatutako kontuen bidalketa publiko berrienak.",
"dismissable_banner.dismiss": "Baztertu",
+ "dismissable_banner.public_timeline": "Hauek dira {domain}-eko jendeak jarraitzen dituen fedibertsoko erabiltzaileen azken mezu publikoak.",
"domain_block_modal.block": "Blokeatu zerbitzaria",
"domain_block_modal.block_account_instead": "Blokeatu @{name} bestela",
"domain_block_modal.they_can_interact_with_old_posts": "Zerbitzari honetako jendea zure argitalpen zaharrekin elkarreragin dezake.",
"domain_block_modal.they_cant_follow": "Zerbitzari honetako inork ezin zaitu jarraitu.",
"domain_block_modal.they_wont_know": "Ez dute jakingo blokeatuak izan direnik.",
"domain_block_modal.title": "Domeinua blokeatu nahi duzu?",
+ "domain_block_modal.you_will_lose_relationships": "Instantzia honetatik jarraitzen dituzun jarraitzaile eta pertsona guztiak galduko dituzu.",
"domain_block_modal.you_wont_see_posts": "Ez dituzu zerbitzari honetako erabiltzaileen argitalpenik edota jakinarazpenik ikusiko.",
"domain_pill.activitypub_lets_connect": "Mastodon-en ez ezik, beste sare sozialen aplikazioetako jendearekin konektatzea eta harremanetan jartzea uzten dizu.",
"domain_pill.activitypub_like_language": "ActivityPub, Mastodon-ek beste sare sozialekin hitz egiteko erabiltzen duen hizkuntza bezalakoxea da.",
@@ -265,6 +296,9 @@
"emoji_button.search_results": "Bilaketaren emaitzak",
"emoji_button.symbols": "Sinboloak",
"emoji_button.travel": "Bidaiak eta tokiak",
+ "empty_column.account_featured.me": "Oraindik ez duzu ezer nabarmendu. Ba al zenekien gehien erabiltzen dituzun traolak eta baita zure lagunen kontuak ere zure profilean nabarmendu ditzakezula?",
+ "empty_column.account_featured.other": "{acct}-ek ez du ezer nabarmendu oraindik. Ba al zenekien gehien erabiltzen dituzun traolak eta baita zure lagunen kontuak ere zure profilean nabarmendu ditzakezula?",
+ "empty_column.account_featured_other.unknown": "Kontu honek ez du ezer nabarmendu oraindik.",
"empty_column.account_hides_collections": "Erabiltzaile honek informazio hau erabilgarri ez egotea aukeratu du.",
"empty_column.account_suspended": "Kanporatutako kontua",
"empty_column.account_timeline": "Ez dago bidalketarik hemen!",
@@ -296,6 +330,7 @@
"explore.trending_links": "Berriak",
"explore.trending_statuses": "Tutak",
"explore.trending_tags": "Traolak",
+ "featured_carousel.previous": "Aurrekoa",
"filter_modal.added.context_mismatch_explanation": "Iragazki-kategoria hau ez zaio aplikatzen bidalketa honetara sartzeko erabili duzun testuinguruari. Bidalketa testuinguru horretan ere iragaztea nahi baduzu, iragazkia editatu beharko duzu.",
"filter_modal.added.context_mismatch_title": "Testuingurua ez dator bat!",
"filter_modal.added.expired_explanation": "Iragazki kategoria hau iraungi da, eragina izan dezan bere iraungitze-data aldatu beharko duzu.",
diff --git a/app/javascript/mastodon/locales/fr-CA.json b/app/javascript/mastodon/locales/fr-CA.json
index 3a31a5af56..0fdd593859 100644
--- a/app/javascript/mastodon/locales/fr-CA.json
+++ b/app/javascript/mastodon/locales/fr-CA.json
@@ -221,6 +221,7 @@
"confirmations.delete_list.title": "Supprimer la liste ?",
"confirmations.discard_draft.confirm": "Effacer et continuer",
"confirmations.discard_draft.edit.cancel": "Retour vers l'éditeur",
+ "confirmations.discard_draft.edit.message": "Continued va perdre les changements que vous avez faits dans le message courant.",
"confirmations.discard_draft.edit.title": "Jeter les changements faits au message?",
"confirmations.discard_draft.post.cancel": "Retour au brouillon",
"confirmations.discard_draft.post.message": "En continuant, vous perdez le message que vous êtes en train d'écrire.",
@@ -241,6 +242,9 @@
"confirmations.redraft.confirm": "Supprimer et réécrire",
"confirmations.redraft.message": "Êtes-vous sûr·e de vouloir effacer cette publication pour la réécrire? Ses ses mises en favori et boosts seront perdus et ses réponses seront orphelines.",
"confirmations.redraft.title": "Supprimer et réécrire le message ?",
+ "confirmations.remove_from_followers.confirm": "Supprimer l'abonné·e",
+ "confirmations.remove_from_followers.message": "{name} cessera de vous suivre. Êtes-vous sûr de vouloir continuer ?",
+ "confirmations.remove_from_followers.title": "Supprimer l'abonné·e ?",
"confirmations.unfollow.confirm": "Ne plus suivre",
"confirmations.unfollow.message": "Voulez-vous vraiment arrêter de suivre {name}?",
"confirmations.unfollow.title": "Se désabonner de l'utilisateur·rice ?",
@@ -302,6 +306,9 @@
"emoji_button.search_results": "Résultats",
"emoji_button.symbols": "Symboles",
"emoji_button.travel": "Voyage et lieux",
+ "empty_column.account_featured.me": "Vous n'avez pas encore mis de contenu en avant. Saviez-vous que vous pouviez mettre en avant les hashtags que vous utilisez le plus, et même les comptes de vos amis sur votre profil ?",
+ "empty_column.account_featured.other": "{acct} n'a pas encore mis de contenu en avant. Saviez-vous que vous pouviez mettre en avant les hashtags que vous utilisez le plus, et même les comptes de vos amis sur votre profil ?",
+ "empty_column.account_featured_other.unknown": "Ce compte n'a mis aucun contenu en avant pour l'instant.",
"empty_column.account_hides_collections": "Cet utilisateur·ice préfère ne pas rendre publiques ces informations",
"empty_column.account_suspended": "Compte suspendu",
"empty_column.account_timeline": "Aucune publication ici!",
@@ -330,6 +337,7 @@
"errors.unexpected_crash.copy_stacktrace": "Copier la trace d'appels dans le presse-papier",
"errors.unexpected_crash.report_issue": "Signaler un problème",
"explore.suggested_follows": "Personnes",
+ "explore.title": "Tendances",
"explore.trending_links": "Nouvelles",
"explore.trending_statuses": "Messages",
"explore.trending_tags": "Hashtags",
@@ -389,6 +397,8 @@
"generic.saved": "Sauvegardé",
"getting_started.heading": "Pour commencer",
"hashtag.admin_moderation": "Ouvrir l'interface de modération pour #{name}",
+ "hashtag.browse": "Parcourir les posts dans #{hashtag}",
+ "hashtag.browse_from_account": "Parcourir les posts de @{name} dans #{hashtag}",
"hashtag.column_header.tag_mode.all": "et {additional}",
"hashtag.column_header.tag_mode.any": "ou {additional}",
"hashtag.column_header.tag_mode.none": "sans {additional}",
@@ -401,7 +411,10 @@
"hashtag.counter_by_accounts": "{count, plural, one {{counter} participant} other {{counter} participants}}",
"hashtag.counter_by_uses": "{count, plural, one {{counter} message} other {{counter} messages}}",
"hashtag.counter_by_uses_today": "{count, plural, one {{counter} message} other {{counter} messages}} aujourd’hui",
+ "hashtag.feature": "Mettre en avant sur votre profil",
"hashtag.follow": "Suivre ce hashtag",
+ "hashtag.mute": "Mettre #{hashtag} en sourdine",
+ "hashtag.unfeature": "Ne plus mettre en avant sur votre profil",
"hashtag.unfollow": "Ne plus suivre ce hashtag",
"hashtags.and_other": "…et {count, plural, other {# de plus}}",
"hints.profiles.followers_may_be_missing": "Les abonné·e·s à ce profil peuvent être manquant·e·s.",
@@ -412,6 +425,7 @@
"hints.profiles.see_more_posts": "Voir plus de messages sur {domain}",
"hints.threads.replies_may_be_missing": "Les réponses provenant des autres serveurs pourraient être manquantes.",
"hints.threads.see_more": "Afficher plus de réponses sur {domain}",
+ "home.column_settings.show_quotes": "Afficher les citations",
"home.column_settings.show_reblogs": "Afficher boosts",
"home.column_settings.show_replies": "Afficher réponses",
"home.hide_announcements": "Masquer les annonces",
@@ -534,8 +548,10 @@
"mute_modal.you_wont_see_mentions": "Vous ne verrez pas les publications qui le mentionne.",
"mute_modal.you_wont_see_posts": "Il peut toujours voir vos publications, mais vous ne verrez pas les siennes.",
"navigation_bar.about": "À propos",
+ "navigation_bar.account_settings": "Mot de passe et sécurité",
"navigation_bar.administration": "Administration",
"navigation_bar.advanced_interface": "Ouvrir dans l’interface avancée",
+ "navigation_bar.automated_deletion": "Suppression automatique du message",
"navigation_bar.blocks": "Comptes bloqués",
"navigation_bar.bookmarks": "Signets",
"navigation_bar.direct": "Mention privée",
@@ -545,13 +561,19 @@
"navigation_bar.follow_requests": "Demandes d'abonnements",
"navigation_bar.followed_tags": "Hashtags suivis",
"navigation_bar.follows_and_followers": "Abonnements et abonnés",
+ "navigation_bar.import_export": "Import et export",
"navigation_bar.lists": "Listes",
+ "navigation_bar.live_feed_local": "Flux en direct (local)",
+ "navigation_bar.live_feed_public": "Flux en direct (public)",
"navigation_bar.logout": "Se déconnecter",
"navigation_bar.moderation": "Modération",
+ "navigation_bar.more": "Plus",
"navigation_bar.mutes": "Utilisateurs masqués",
"navigation_bar.opened_in_classic_interface": "Les messages, les comptes et les pages spécifiques sont ouvertes dans l’interface classique.",
"navigation_bar.preferences": "Préférences",
+ "navigation_bar.privacy_and_reach": "Vie privée et visibilité",
"navigation_bar.search": "Rechercher",
+ "navigation_bar.search_trends": "Recherche / Tendance",
"not_signed_in_indicator.not_signed_in": "Vous devez vous connecter pour accéder à cette ressource.",
"notification.admin.report": "{name} a signalé {target}",
"notification.admin.report_account": "{name} a signalé {count, plural, one {un message} other {# messages}} de {target} pour {category}",
diff --git a/app/javascript/mastodon/locales/fr.json b/app/javascript/mastodon/locales/fr.json
index 173cae18ae..6f1bbae61c 100644
--- a/app/javascript/mastodon/locales/fr.json
+++ b/app/javascript/mastodon/locales/fr.json
@@ -221,6 +221,7 @@
"confirmations.delete_list.title": "Supprimer la liste ?",
"confirmations.discard_draft.confirm": "Effacer et continuer",
"confirmations.discard_draft.edit.cancel": "Retour vers l'éditeur",
+ "confirmations.discard_draft.edit.message": "Continued va perdre les changements que vous avez faits dans le message courant.",
"confirmations.discard_draft.edit.title": "Jeter les changements faits au message?",
"confirmations.discard_draft.post.cancel": "Retour au brouillon",
"confirmations.discard_draft.post.message": "En continuant, vous perdez le message que vous êtes en train d'écrire.",
@@ -241,6 +242,9 @@
"confirmations.redraft.confirm": "Supprimer et ré-écrire",
"confirmations.redraft.message": "Voulez-vous vraiment supprimer le message pour le réécrire ? Ses partages ainsi que ses mises en favori seront perdues, et ses réponses seront orphelines.",
"confirmations.redraft.title": "Supprimer et réécrire le message ?",
+ "confirmations.remove_from_followers.confirm": "Supprimer l'abonné·e",
+ "confirmations.remove_from_followers.message": "{name} cessera de vous suivre. Êtes-vous sûr de vouloir continuer ?",
+ "confirmations.remove_from_followers.title": "Supprimer l'abonné·e ?",
"confirmations.unfollow.confirm": "Ne plus suivre",
"confirmations.unfollow.message": "Voulez-vous vraiment vous désabonner de {name} ?",
"confirmations.unfollow.title": "Se désabonner de l'utilisateur·rice ?",
@@ -302,6 +306,9 @@
"emoji_button.search_results": "Résultats de la recherche",
"emoji_button.symbols": "Symboles",
"emoji_button.travel": "Voyage et lieux",
+ "empty_column.account_featured.me": "Vous n'avez pas encore mis de contenu en avant. Saviez-vous que vous pouviez mettre en avant les hashtags que vous utilisez le plus, et même les comptes de vos amis sur votre profil ?",
+ "empty_column.account_featured.other": "{acct} n'a pas encore mis de contenu en avant. Saviez-vous que vous pouviez mettre en avant les hashtags que vous utilisez le plus, et même les comptes de vos amis sur votre profil ?",
+ "empty_column.account_featured_other.unknown": "Ce compte n'a mis aucun contenu en avant pour l'instant.",
"empty_column.account_hides_collections": "Cet utilisateur·ice préfère ne pas rendre publiques ces informations",
"empty_column.account_suspended": "Compte suspendu",
"empty_column.account_timeline": "Aucun message ici !",
@@ -330,6 +337,7 @@
"errors.unexpected_crash.copy_stacktrace": "Copier la trace d'appels dans le presse-papier",
"errors.unexpected_crash.report_issue": "Signaler le problème",
"explore.suggested_follows": "Personnes",
+ "explore.title": "Tendances",
"explore.trending_links": "Nouvelles",
"explore.trending_statuses": "Messages",
"explore.trending_tags": "Hashtags",
@@ -389,6 +397,8 @@
"generic.saved": "Sauvegardé",
"getting_started.heading": "Pour commencer",
"hashtag.admin_moderation": "Ouvrir l'interface de modération pour #{name}",
+ "hashtag.browse": "Parcourir les posts dans #{hashtag}",
+ "hashtag.browse_from_account": "Parcourir les posts de @{name} dans #{hashtag}",
"hashtag.column_header.tag_mode.all": "et {additional}",
"hashtag.column_header.tag_mode.any": "ou {additional}",
"hashtag.column_header.tag_mode.none": "sans {additional}",
@@ -401,7 +411,10 @@
"hashtag.counter_by_accounts": "{count, plural, one {{counter} participant} other {{counter} participants}}",
"hashtag.counter_by_uses": "{count, plural, one {{counter} message} other {{counter} messages}}",
"hashtag.counter_by_uses_today": "{count, plural, one {{counter} message} other {{counter} messages}} aujourd’hui",
+ "hashtag.feature": "Mettre en avant sur votre profil",
"hashtag.follow": "Suivre le hashtag",
+ "hashtag.mute": "Mettre #{hashtag} en sourdine",
+ "hashtag.unfeature": "Ne plus mettre en avant sur votre profil",
"hashtag.unfollow": "Ne plus suivre le hashtag",
"hashtags.and_other": "…et {count, plural, other {# de plus}}",
"hints.profiles.followers_may_be_missing": "Les abonné·e·s à ce profil peuvent être manquant·e·s.",
@@ -412,6 +425,7 @@
"hints.profiles.see_more_posts": "Voir plus de messages sur {domain}",
"hints.threads.replies_may_be_missing": "Les réponses provenant des autres serveurs pourraient être manquantes.",
"hints.threads.see_more": "Afficher plus de réponses sur {domain}",
+ "home.column_settings.show_quotes": "Afficher les citations",
"home.column_settings.show_reblogs": "Afficher les partages",
"home.column_settings.show_replies": "Afficher les réponses",
"home.hide_announcements": "Masquer les annonces",
@@ -534,8 +548,10 @@
"mute_modal.you_wont_see_mentions": "Vous ne verrez pas les publications qui le mentionne.",
"mute_modal.you_wont_see_posts": "Il peut toujours voir vos publications, mais vous ne verrez pas les siennes.",
"navigation_bar.about": "À propos",
+ "navigation_bar.account_settings": "Mot de passe et sécurité",
"navigation_bar.administration": "Administration",
"navigation_bar.advanced_interface": "Ouvrir dans l’interface avancée",
+ "navigation_bar.automated_deletion": "Suppression automatique du message",
"navigation_bar.blocks": "Comptes bloqués",
"navigation_bar.bookmarks": "Marque-pages",
"navigation_bar.direct": "Mention privée",
@@ -545,13 +561,19 @@
"navigation_bar.follow_requests": "Demandes d’abonnement",
"navigation_bar.followed_tags": "Hashtags suivis",
"navigation_bar.follows_and_followers": "Abonnements et abonnés",
+ "navigation_bar.import_export": "Import et export",
"navigation_bar.lists": "Listes",
+ "navigation_bar.live_feed_local": "Flux en direct (local)",
+ "navigation_bar.live_feed_public": "Flux en direct (public)",
"navigation_bar.logout": "Déconnexion",
"navigation_bar.moderation": "Modération",
+ "navigation_bar.more": "Plus",
"navigation_bar.mutes": "Comptes masqués",
"navigation_bar.opened_in_classic_interface": "Les messages, les comptes et les pages spécifiques sont ouvertes dans l’interface classique.",
"navigation_bar.preferences": "Préférences",
+ "navigation_bar.privacy_and_reach": "Vie privée et visibilité",
"navigation_bar.search": "Rechercher",
+ "navigation_bar.search_trends": "Recherche / Tendance",
"not_signed_in_indicator.not_signed_in": "Vous devez vous connecter pour accéder à cette ressource.",
"notification.admin.report": "{name} a signalé {target}",
"notification.admin.report_account": "{name} a signalé {count, plural, one {un message} other {# messages}} de {target} pour {category}",
diff --git a/config/locales/da.yml b/config/locales/da.yml
index 189ddea40d..ca5f1831c9 100644
--- a/config/locales/da.yml
+++ b/config/locales/da.yml
@@ -1905,9 +1905,9 @@ da:
keep_polls: Behold afstemninger
keep_polls_hint: Sletter ingen af dine afstemninger
keep_self_bookmark: Behold bogmærkede indlæg
- keep_self_bookmark_hint: Sletter ikke egne indlæg, såfremt de er bogmærket
+ keep_self_bookmark_hint: Sletter ikke dine egne indlæg, såfremt de er bogmærket
keep_self_fav: Behold favoritmarkerede indlæg
- keep_self_fav_hint: Sletter ikke egne indlæg, såfremt de er favoritmarkeret
+ keep_self_fav_hint: Sletter ikke dine egne indlæg, såfremt de er favoritmarkeret
min_age:
'1209600': 2 uger
'15778476': 6 måneder
@@ -1919,9 +1919,9 @@ da:
'7889238': 3 måneder
min_age_label: Alderstærskel
min_favs: Behold indlæg favoritmarkeret mindst
- min_favs_hint: Sletter ingen egne indlæg, som har modtaget minimum dette antal favoritmarkeringer. Lad stå tomt for at slette indlæg uanset favoritmarkeringer
+ min_favs_hint: Sletter ingen dine egne indlæg, som har modtaget minimum dette antal favoritmarkeringer. Lad stå tomt for at slette indlæg uanset antal favoritmarkeringer
min_reblogs: Behold indlæg fremhævet mindst
- min_reblogs_hint: Sletter ingen af egne indlæg, som er fremhævet flere end dette antal gange. Lad stå tomt for at ignorere denne tærskel under sletning
+ min_reblogs_hint: Sletter ingen af dine egne indlæg, som er fremhævet flere end dette antal gange. Lad stå tom for at slette indlæg uanset antallet af fremhævelser
stream_entries:
sensitive_content: Sensitivt indhold
strikes:
From 1ebb87a6a819dc4c2d3772994c268dd90a6ef674 Mon Sep 17 00:00:00 2001
From: Claire
Date: Fri, 4 Jul 2025 09:51:01 +0200
Subject: [PATCH 22/29] Fix incorrect name in scheduler configuration (#35263)
---
config/sidekiq.yml | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/config/sidekiq.yml b/config/sidekiq.yml
index 97eaa55ce3..fb85343d94 100644
--- a/config/sidekiq.yml
+++ b/config/sidekiq.yml
@@ -70,5 +70,5 @@
queue: scheduler
fasp_follow_recommendation_cleanup_scheduler:
interval: 1 day
- class: Scheduler::Fasp::FollowRecommendationsScheduler
+ class: Scheduler::Fasp::FollowRecommendationCleanupScheduler
queue: scheduler
From bdffdcb12f092b3a104194015d461f87ab78fe5b Mon Sep 17 00:00:00 2001
From: Matt Jankowski
Date: Mon, 7 Jul 2025 04:07:01 -0400
Subject: [PATCH 23/29] Remove unused scopes in `Account` model (#35276)
---
app/models/account.rb | 3 ---
spec/models/account_spec.rb | 13 -------------
2 files changed, 16 deletions(-)
diff --git a/app/models/account.rb b/app/models/account.rb
index c4e5475672..c23549c22d 100644
--- a/app/models/account.rb
+++ b/app/models/account.rb
@@ -138,10 +138,7 @@ class Account < ApplicationRecord
scope :partitioned, -> { order(Arel.sql('row_number() over (partition by domain)')) }
scope :without_instance_actor, -> { where.not(id: INSTANCE_ACTOR_ID) }
scope :recent, -> { reorder(id: :desc) }
- scope :bots, -> { where(actor_type: AUTOMATED_ACTOR_TYPES) }
scope :non_automated, -> { where.not(actor_type: AUTOMATED_ACTOR_TYPES) }
- scope :groups, -> { where(actor_type: 'Group') }
- scope :alphabetic, -> { order(domain: :asc, username: :asc) }
scope :matches_uri_prefix, ->(value) { where(arel_table[:uri].matches("#{sanitize_sql_like(value)}/%", false, true)).or(where(uri: value)) }
scope :matches_username, ->(value) { where('lower((username)::text) LIKE lower(?)', "#{value}%") }
scope :matches_display_name, ->(value) { where(arel_table[:display_name].matches("#{value}%")) }
diff --git a/spec/models/account_spec.rb b/spec/models/account_spec.rb
index 994a475dd9..8ce337f1c7 100644
--- a/spec/models/account_spec.rb
+++ b/spec/models/account_spec.rb
@@ -640,19 +640,6 @@ RSpec.describe Account do
end
end
- describe 'alphabetic' do
- it 'sorts by alphabetic order of domain and username' do
- matches = [
- { username: 'a', domain: 'a' },
- { username: 'b', domain: 'a' },
- { username: 'a', domain: 'b' },
- { username: 'b', domain: 'b' },
- ].map(&method(:Fabricate).curry(2).call(:account))
-
- expect(described_class.without_internal.alphabetic).to eq matches
- end
- end
-
describe 'matches_display_name' do
it 'matches display name which starts with the given string' do
match = Fabricate(:account, display_name: 'pattern and suffix')
From f6b2609353cddae944c6624db512d1daaa5a47ba Mon Sep 17 00:00:00 2001
From: "github-actions[bot]"
<41898282+github-actions[bot]@users.noreply.github.com>
Date: Mon, 7 Jul 2025 10:21:51 +0200
Subject: [PATCH 24/29] New Crowdin Translations (automated) (#35269)
Co-authored-by: GitHub Actions
---
app/javascript/mastodon/locales/ar.json | 2 +-
app/javascript/mastodon/locales/bg.json | 34 +++++++++++
app/javascript/mastodon/locales/da.json | 34 +++++------
app/javascript/mastodon/locales/eu.json | 49 +++++++++++++++-
app/javascript/mastodon/locales/pt-BR.json | 7 +++
app/javascript/mastodon/locales/ru.json | 2 +-
app/javascript/mastodon/locales/sk.json | 1 +
app/javascript/mastodon/locales/th.json | 28 ++++++++-
config/locales/activerecord.eu.yml | 6 ++
config/locales/bg.yml | 22 +++++++
config/locales/da.yml | 20 +++----
config/locales/devise.vi.yml | 12 ++--
config/locales/doorkeeper.da.yml | 6 +-
config/locales/eu.yml | 67 ++++++++++++++++++++++
config/locales/nan.yml | 62 ++++++++++++++++++++
config/locales/pt-BR.yml | 2 +
config/locales/simple_form.eu.yml | 9 +++
config/locales/simple_form.vi.yml | 4 +-
config/locales/th.yml | 12 ++++
config/locales/vi.yml | 28 ++++-----
20 files changed, 351 insertions(+), 56 deletions(-)
diff --git a/app/javascript/mastodon/locales/ar.json b/app/javascript/mastodon/locales/ar.json
index 92c269fc3d..813a92761d 100644
--- a/app/javascript/mastodon/locales/ar.json
+++ b/app/javascript/mastodon/locales/ar.json
@@ -1,7 +1,7 @@
{
"about.blocks": "خوادم تحت الإشراف",
"about.contact": "للاتصال:",
- "about.default_locale": "الافتراضية",
+ "about.default_locale": "افتراضيالافتراضية",
"about.disclaimer": "ماستدون برنامج حر ومفتوح المصدر وعلامة تجارية لـ Mastodon GmbH.",
"about.domain_blocks.no_reason_available": "السبب غير متوفر",
"about.domain_blocks.preamble": "يتيح مَستُدون عمومًا لمستخدميه مطالعة المحتوى من المستخدمين من الخواديم الأخرى في الفدرالية والتفاعل معهم. وهذه هي الاستثناءات التي وضعت على هذا الخادوم.",
diff --git a/app/javascript/mastodon/locales/bg.json b/app/javascript/mastodon/locales/bg.json
index 80d881c2f1..61951ee236 100644
--- a/app/javascript/mastodon/locales/bg.json
+++ b/app/javascript/mastodon/locales/bg.json
@@ -8,6 +8,7 @@
"about.domain_blocks.silenced.title": "Ограничено",
"about.domain_blocks.suspended.explanation": "Никакви данни от този сървър няма да се обработват, съхраняват или обменят, правещи невъзможно всяко взаимодействие или комуникация с потребители от тези сървъри.",
"about.domain_blocks.suspended.title": "Спряно",
+ "about.language_label": "Език",
"about.not_available": "Тази информация не е публична на този сървър.",
"about.powered_by": "Децентрализирана социална мрежа, захранвана от {mastodon}",
"about.rules": "Правила на сървъра",
@@ -28,6 +29,7 @@
"account.edit_profile": "Редактиране на профила",
"account.enable_notifications": "Известяване при публикуване от @{name}",
"account.endorse": "Представи в профила",
+ "account.familiar_followers_many": "Последвано от {name1}, {name2}, и {othersCount, plural, one {един друг, когото познавате} other {# други, които познавате}}",
"account.familiar_followers_one": "Последвано от {name1}",
"account.familiar_followers_two": "Последвано от {name1} и {name2}",
"account.featured": "Препоръчано",
@@ -40,6 +42,7 @@
"account.followers": "Последователи",
"account.followers.empty": "Още никой не следва потребителя.",
"account.followers_counter": "{count, plural, one {{counter} последовател} other {{counter} последователи}}",
+ "account.followers_you_know_counter": "{counter} познавате",
"account.following": "Последвано",
"account.following_counter": "{count, plural, one {{counter} последван} other {{counter} последвани}}",
"account.follows.empty": "Потребителят още никого не следва.",
@@ -215,6 +218,13 @@
"confirmations.delete_list.confirm": "Изтриване",
"confirmations.delete_list.message": "Наистина ли искате да изтриете завинаги списъка?",
"confirmations.delete_list.title": "Изтривате ли списъка?",
+ "confirmations.discard_draft.confirm": "Изхвърляне и продължаване",
+ "confirmations.discard_draft.edit.cancel": "Възобновяване на редактиране",
+ "confirmations.discard_draft.edit.message": "Продължаването ще изхвърли всякакви промени, които сте правили в публикацията, която сега редактирате.",
+ "confirmations.discard_draft.edit.title": "Изхвърляте ли промените в публикацията си?",
+ "confirmations.discard_draft.post.cancel": "Възстановка на чернова",
+ "confirmations.discard_draft.post.message": "Продължаването ще изхвърли публикацията, която сега съставяте.",
+ "confirmations.discard_draft.post.title": "Изхвърляте ли черновата си публикация?",
"confirmations.discard_edit_media.confirm": "Отхвърляне",
"confirmations.discard_edit_media.message": "Не сте запазили промени на описанието или огледа на мултимедията, отхвърляте ли ги?",
"confirmations.follow_to_list.confirm": "Последване и добавяне в списък",
@@ -324,9 +334,15 @@
"errors.unexpected_crash.copy_stacktrace": "Копиране на трасето на стека в буферната памет",
"errors.unexpected_crash.report_issue": "Сигнал за проблем",
"explore.suggested_follows": "Хора",
+ "explore.title": "Вървежно",
"explore.trending_links": "Новини",
"explore.trending_statuses": "Публикации",
"explore.trending_tags": "Хаштагове",
+ "featured_carousel.header": "{count, plural, one {закачена публикация} other {закачени публикации}}",
+ "featured_carousel.next": "Напред",
+ "featured_carousel.post": "Публикация",
+ "featured_carousel.previous": "Назад",
+ "featured_carousel.slide": "{index} от {total}",
"filter_modal.added.context_mismatch_explanation": "Тази категория филтър не е приложима към контекста, в който достъпвате тази публикация. Ако желаете да филтрирате публикациите в този контекст, трябва да изберете друг филтър.",
"filter_modal.added.context_mismatch_title": "Несъвпадащ контекст!",
"filter_modal.added.expired_explanation": "Валидността на тази категория филтър е изтекла. Сменете срока на валидност, за да я приложите.",
@@ -405,6 +421,7 @@
"hints.profiles.see_more_posts": "Преглед на още публикации на {domain}",
"hints.threads.replies_may_be_missing": "Отговори от други сървъри може да липсват.",
"hints.threads.see_more": "Преглед на още отговори на {domain}",
+ "home.column_settings.show_quotes": "Показване на цитираното",
"home.column_settings.show_reblogs": "Показване на подсилванията",
"home.column_settings.show_replies": "Показване на отговорите",
"home.hide_announcements": "Скриване на оповестяванията",
@@ -527,8 +544,10 @@
"mute_modal.you_wont_see_mentions": "Няма да виждате споменаващите ги публикации.",
"mute_modal.you_wont_see_posts": "Още могат да виждат публикациите ви, но вие техните не.",
"navigation_bar.about": "Относно",
+ "navigation_bar.account_settings": "Парола и сигурност",
"navigation_bar.administration": "Администрация",
"navigation_bar.advanced_interface": "Отваряне в разширен уебинтерфейс",
+ "navigation_bar.automated_deletion": "Автоматично изтриване на публикации",
"navigation_bar.blocks": "Блокирани потребители",
"navigation_bar.bookmarks": "Отметки",
"navigation_bar.direct": "Частни споменавания",
@@ -538,13 +557,17 @@
"navigation_bar.follow_requests": "Заявки за последване",
"navigation_bar.followed_tags": "Последвани хаштагове",
"navigation_bar.follows_and_followers": "Последвания и последователи",
+ "navigation_bar.import_export": "Внасяне и изнасяне",
"navigation_bar.lists": "Списъци",
"navigation_bar.logout": "Излизане",
"navigation_bar.moderation": "Модериране",
+ "navigation_bar.more": "Още",
"navigation_bar.mutes": "Заглушени потребители",
"navigation_bar.opened_in_classic_interface": "Публикации, акаунти и други особени страници се отварят по подразбиране в класическия мрежови интерфейс.",
"navigation_bar.preferences": "Предпочитания",
+ "navigation_bar.privacy_and_reach": "Поверителност и обхват",
"navigation_bar.search": "Търсене",
+ "navigation_bar.search_trends": "Търсене / Вървежно",
"not_signed_in_indicator.not_signed_in": "Трябва ви вход за достъп до ресурса.",
"notification.admin.report": "{name} докладва {target}",
"notification.admin.report_account": "{name} докладва {count, plural, one {публикация} other {# публикации}} от {target} за {category}",
@@ -771,6 +794,7 @@
"report_notification.categories.violation": "Нарушение на правилото",
"report_notification.categories.violation_sentence": "нарушение на правило",
"report_notification.open": "Отваряне на доклада",
+ "search.clear": "Изчистване на търсенето",
"search.no_recent_searches": "Няма скорошни търсения",
"search.placeholder": "Търсене",
"search.quick_action.account_search": "Съвпадение на профили {x}",
@@ -837,6 +861,13 @@
"status.mute_conversation": "Заглушаване на разговора",
"status.open": "Разширяване на публикацията",
"status.pin": "Закачане в профила",
+ "status.quote_error.filtered": "Скрито поради един от филтрите ви",
+ "status.quote_error.not_found": "Публикацията не може да се показва.",
+ "status.quote_error.pending_approval": "Публикацията чака одобрение от първоначалния автор.",
+ "status.quote_error.rejected": "Публикацията не може да се показва като първоначалния автор не позволява цитирането ѝ.",
+ "status.quote_error.removed": "Публикацията е премахната от автора ѝ.",
+ "status.quote_error.unauthorized": "Публикацията не може да се показва, тъй като не сте упълномощени да я гледате.",
+ "status.quote_post_author": "Публикация от {name}",
"status.read_more": "Още за четене",
"status.reblog": "Подсилване",
"status.reblog_private": "Подсилване с оригиналната видимост",
@@ -866,7 +897,10 @@
"subscribed_languages.save": "Запазване на промените",
"subscribed_languages.target": "Промяна на абонираните езици за {target}",
"tabs_bar.home": "Начало",
+ "tabs_bar.menu": "Меню",
"tabs_bar.notifications": "Известия",
+ "tabs_bar.publish": "Нова публикация",
+ "tabs_bar.search": "Търсене",
"terms_of_service.effective_as_of": "В сила от {date}",
"terms_of_service.title": "Условия на услугата",
"terms_of_service.upcoming_changes_on": "Предстоящи промени на {date}",
diff --git a/app/javascript/mastodon/locales/da.json b/app/javascript/mastodon/locales/da.json
index c28345b260..74515fd702 100644
--- a/app/javascript/mastodon/locales/da.json
+++ b/app/javascript/mastodon/locales/da.json
@@ -83,7 +83,7 @@
"account.unendorse": "Vis ikke på profil",
"account.unfollow": "Følg ikke længere",
"account.unmute": "Vis @{name} igen",
- "account.unmute_notifications_short": "Tænd for notifikationer",
+ "account.unmute_notifications_short": "Vis notifikationer igen",
"account.unmute_short": "Vis igen",
"account_note.placeholder": "Klik for at tilføje notat",
"admin.dashboard.daily_retention": "Brugerfastholdelsesrate pr. dag efter tilmelding",
@@ -130,7 +130,7 @@
"attachments_list.unprocessed": "(ubehandlet)",
"audio.hide": "Skjul lyd",
"block_modal.remote_users_caveat": "Serveren {domain} vil blive bedt om at respektere din beslutning. Overholdelse er dog ikke garanteret, da nogle servere kan håndtere blokke forskelligt. Offentlige indlæg kan stadig være synlige for ikke-indloggede brugere.",
- "block_modal.show_less": "Vis færre",
+ "block_modal.show_less": "Vis mindre",
"block_modal.show_more": "Vis flere",
"block_modal.they_cant_mention": "Vedkommende kan ikke omtale eller følge dig.",
"block_modal.they_cant_see_posts": "Vedkommende kan ikke se dine indlæg, og du vil ikke se vedkommendes.",
@@ -239,9 +239,9 @@
"confirmations.missing_alt_text.secondary": "Læg op alligevel",
"confirmations.missing_alt_text.title": "Tilføj alt-tekst?",
"confirmations.mute.confirm": "Skjul",
- "confirmations.redraft.confirm": "Slet og omformulér",
+ "confirmations.redraft.confirm": "Slet og omskriv",
"confirmations.redraft.message": "Sikker på, at dette indlæg skal slettes og omskrives? Favoritter og fremhævelser går tabt, og svar til det oprindelige indlæg mister tilknytningen.",
- "confirmations.redraft.title": "Slet og omformulér indlæg?",
+ "confirmations.redraft.title": "Slet og omskriv indlæg?",
"confirmations.remove_from_followers.confirm": "Fjern følger",
"confirmations.remove_from_followers.message": "{name} vil ikke længere følge dig. Er du sikker på, at du vil fortsætte?",
"confirmations.remove_from_followers.title": "Fjern følger?",
@@ -279,14 +279,14 @@
"domain_pill.activitypub_lets_connect": "Det muliggører at forbinde og interagere med folk, ikke kun på Mastodon, men også på tværs af forskellige sociale apps.",
"domain_pill.activitypub_like_language": "ActivityPub er \"sproget\", som Mastodon taler med andre sociale netværk.",
"domain_pill.server": "Server",
- "domain_pill.their_handle": "Deres greb:",
+ "domain_pill.their_handle": "Deres handle:",
"domain_pill.their_server": "Det digitale hjem, hvor alle indlæggene findes.",
"domain_pill.their_username": "Entydig identifikator på denne server. Det er muligt at finde brugere med samme brugernavn på forskellige servere.",
"domain_pill.username": "Brugernavn",
- "domain_pill.whats_in_a_handle": "Hvad er der i et greb?",
+ "domain_pill.whats_in_a_handle": "Hvad indeholder et handle?",
"domain_pill.who_they_are": "Da et handle fortæller, hvem nogen er, og hvor de er, kan du interagere med folk på tværs af det sociale net af .",
"domain_pill.who_you_are": "Fordi dit handle fortæller, hvem du er, og hvor du er, kan du interagere med folk på tværs af det sociale net af .",
- "domain_pill.your_handle": "Dit greb:",
+ "domain_pill.your_handle": "Dit handle:",
"domain_pill.your_server": "Dit digitale hjem, hvor alle dine indlæg lever. Synes ikke om den her server? Du kan til enhver tid rykke over på en anden server og beholde dine følgere.",
"domain_pill.your_username": "Din entydige identifikator på denne server. Det er muligt at finde brugere med samme brugernavn på forskellige servere.",
"embed.instructions": "Indlejr dette indlæg på din hjemmeside ved at kopiere nedenstående kode.",
@@ -414,7 +414,7 @@
"hashtag.counter_by_uses_today": "{count, plural, one {{counter} indlæg} other {{counter} indlæg}} i dag",
"hashtag.feature": "Fremhæv på profil",
"hashtag.follow": "Følg hashtag",
- "hashtag.mute": "Tavsgør #{hashtag}",
+ "hashtag.mute": "Skjul #{hashtag}",
"hashtag.unfeature": "Fremhæv ikke på profil",
"hashtag.unfollow": "Følg ikke længere hashtag",
"hashtags.and_other": "…og {count, plural, one {}other {# flere}}",
@@ -543,10 +543,10 @@
"mute_modal.hide_options": "Skjul valgmuligheder",
"mute_modal.indefinite": "Indtil jeg vælger at se dem igen",
"mute_modal.show_options": "Vis valgmuligheder",
- "mute_modal.they_can_mention_and_follow": "De kan omtale og følge dig, men du vil ikke se dem.",
+ "mute_modal.they_can_mention_and_follow": "Vedkommende kan nævne og følge dig, men vil ikke blive vist.",
"mute_modal.they_wont_know": "De vil ikke vide, at de er blevet skjult.",
"mute_modal.title": "Skjul bruger?",
- "mute_modal.you_wont_see_mentions": "Du vil ikke se indlæg som omtaler dem.",
+ "mute_modal.you_wont_see_mentions": "Indlæg, som nævner vedkommende, vises ikke.",
"mute_modal.you_wont_see_posts": "De kan stadig se dine indlæg, men du vil ikke se deres.",
"navigation_bar.about": "Om",
"navigation_bar.account_settings": "Adgangskode og sikkerhed",
@@ -686,11 +686,11 @@
"notifications.policy.filter_limited_accounts_hint": "Begrænset af servermoderatorer",
"notifications.policy.filter_limited_accounts_title": "Modererede konti",
"notifications.policy.filter_new_accounts.hint": "Oprettet indenfor {days, plural, one {den seneste dag} other {de seneste # dage}}",
- "notifications.policy.filter_new_accounts_title": "Ny konti",
- "notifications.policy.filter_not_followers_hint": "Inklusiv personer, som har fulgt dig {days, plural, one {mindre end én dag} other {færre end # dage}}",
- "notifications.policy.filter_not_followers_title": "Folk, som ikke følger dig",
+ "notifications.policy.filter_new_accounts_title": "Nye konti",
+ "notifications.policy.filter_not_followers_hint": "Inklusiv personer, som har fulgt dig {days, plural, one {mindre end én dag} other {mindre end # dage}}",
+ "notifications.policy.filter_not_followers_title": "Personer, som ikke følger dig",
"notifications.policy.filter_not_following_hint": "Indtil du manuelt godkender dem",
- "notifications.policy.filter_not_following_title": "Folk, du ikke følger",
+ "notifications.policy.filter_not_following_title": "Personer, du ikke følger",
"notifications.policy.filter_private_mentions_hint": "Filtreret, medmindre det er i svar på egen omtale, eller hvis afsenderen følges",
"notifications.policy.filter_private_mentions_title": "Uopfordrede private omtaler",
"notifications.policy.title": "Håndtér notifikationer fra…",
@@ -830,7 +830,7 @@
"search_results.see_all": "Vis alle",
"search_results.statuses": "Indlæg",
"search_results.title": "Søg efter \"{q}\"",
- "server_banner.about_active_users": "Folk, som brugte denne server de seneste 30 dage (månedlige aktive brugere)",
+ "server_banner.about_active_users": "Personer, som brugte denne server de seneste 30 dage (månedlige aktive brugere)",
"server_banner.active_users": "aktive brugere",
"server_banner.administered_by": "Håndteres af:",
"server_banner.is_one_of_many": "{domain} er en af de mange uafhængige Mastodon-servere, du kan bruge for at deltage i fediverset.",
@@ -885,7 +885,7 @@
"status.reblogged_by": "{name} fremhævede",
"status.reblogs": "{count, plural, one {# fremhævelse} other {# fremhævelser}}",
"status.reblogs.empty": "Ingen har endnu fremhævet dette indlæg. Når nogen gør, vil det fremgå hér.",
- "status.redraft": "Slet og omformulér",
+ "status.redraft": "Slet og omskriv",
"status.remove_bookmark": "Fjern bogmærke",
"status.remove_favourite": "Fjern fra favoritter",
"status.replied_in_thread": "Svaret i tråd",
@@ -902,7 +902,7 @@
"status.translate": "Oversæt",
"status.translated_from_with": "Oversat fra {lang} ved brug af {provider}",
"status.uncached_media_warning": "Ingen forhåndsvisning",
- "status.unmute_conversation": "Genaktivér samtale",
+ "status.unmute_conversation": "Vis samtale",
"status.unpin": "Frigør fra profil",
"subscribed_languages.lead": "Efter ændringen vises kun indlæg på de valgte sprog på din hjem- og listetidslinje. Vælger du ingen, vil du modtage indlæg på alle sprog.",
"subscribed_languages.save": "Gem ændringer",
diff --git a/app/javascript/mastodon/locales/eu.json b/app/javascript/mastodon/locales/eu.json
index 3b2662d6af..e492cf9f80 100644
--- a/app/javascript/mastodon/locales/eu.json
+++ b/app/javascript/mastodon/locales/eu.json
@@ -327,10 +327,14 @@
"errors.unexpected_crash.copy_stacktrace": "Kopiatu irteera arbelera",
"errors.unexpected_crash.report_issue": "Eman arazoaren berri",
"explore.suggested_follows": "Jendea",
+ "explore.title": "Joerak",
"explore.trending_links": "Berriak",
"explore.trending_statuses": "Tutak",
"explore.trending_tags": "Traolak",
+ "featured_carousel.next": "Hurrengoa",
+ "featured_carousel.post": "Argitaratu",
"featured_carousel.previous": "Aurrekoa",
+ "featured_carousel.slide": "{total}-tik {index}",
"filter_modal.added.context_mismatch_explanation": "Iragazki-kategoria hau ez zaio aplikatzen bidalketa honetara sartzeko erabili duzun testuinguruari. Bidalketa testuinguru horretan ere iragaztea nahi baduzu, iragazkia editatu beharko duzu.",
"filter_modal.added.context_mismatch_title": "Testuingurua ez dator bat!",
"filter_modal.added.expired_explanation": "Iragazki kategoria hau iraungi da, eragina izan dezan bere iraungitze-data aldatu beharko duzu.",
@@ -383,6 +387,8 @@
"generic.saved": "Gordea",
"getting_started.heading": "Menua",
"hashtag.admin_moderation": "#{name}-(r)en moderazio-interfazea ireki",
+ "hashtag.browse": "Arakatu bidalketak #{hashtag}(e)n",
+ "hashtag.browse_from_account": "Arakatu @{name}(r)en bidalketak #{hashtag}(e)n",
"hashtag.column_header.tag_mode.all": "eta {osagarria}",
"hashtag.column_header.tag_mode.any": "edo {osagarria}",
"hashtag.column_header.tag_mode.none": "gabe {osagarria}",
@@ -395,7 +401,10 @@
"hashtag.counter_by_accounts": "{count, plural, one {{counter} parte-hartzaile} other {{counter} parte-hartzaile}}",
"hashtag.counter_by_uses": "{count, plural, one {{counter} argitalpen} other {{counter} argitalpen}}",
"hashtag.counter_by_uses_today": "{count, plural, one {{counter} argitalpen} other {{counter} argitalpen}} gaur",
+ "hashtag.feature": "Nabarmendu profilean",
"hashtag.follow": "Jarraitu traolari",
+ "hashtag.mute": "Mututu #{hashtag}",
+ "hashtag.unfeature": "Ez nabarmendu profilean",
"hashtag.unfollow": "Utzi traola jarraitzeari",
"hashtags.and_other": "…eta {count, plural, one {}other {# gehiago}}",
"hints.profiles.followers_may_be_missing": "Baliteke profil honen jarraitzaile guztiak ez agertzea.",
@@ -406,6 +415,7 @@
"hints.profiles.see_more_posts": "Ikusi bidalketa gehiago {domain}-(e)n",
"hints.threads.replies_may_be_missing": "Baliteke beste zerbitzari batzuen erantzun batzuk ez erakustea.",
"hints.threads.see_more": "Ikusi erantzun gehiago {domain}-(e)n",
+ "home.column_settings.show_quotes": "Erakutsi aipamenak",
"home.column_settings.show_reblogs": "Erakutsi bultzadak",
"home.column_settings.show_replies": "Erakutsi erantzunak",
"home.hide_announcements": "Ezkutatu iragarpenak",
@@ -424,6 +434,11 @@
"ignore_notifications_modal.not_followers_title": "Jarraitzen ez zaituzten pertsonen jakinarazpenei ez ikusiarena egin?",
"ignore_notifications_modal.not_following_title": "Jarraitzen ez dituzun pertsonen jakinarazpenei ez ikusiarena egin?",
"ignore_notifications_modal.private_mentions_title": "Eskatu gabeko aipamen pribatuen jakinarazpenei ez ikusiarena egin?",
+ "info_button.label": "Laguntza",
+ "interaction_modal.action.favourite": "Jarraitzeko, zure kontutik atsegindu behar duzu.",
+ "interaction_modal.action.follow": "Jarraitzeko zure kontutik jarraitu behar duzu.",
+ "interaction_modal.action.reply": "Jarraitzeko zure kontutik erantzun behar duzu.",
+ "interaction_modal.action.vote": "Jarraitzeko, zure kontutik bozkatu behar duzu.",
"interaction_modal.go": "Joan",
"interaction_modal.no_account_yet": "Ez al duzu konturik oraindik?",
"interaction_modal.on_another_server": "Beste zerbitzari batean",
@@ -468,11 +483,14 @@
"keyboard_shortcuts.toggle_hidden": "testua erakustea/ezkutatzea abisu baten atzean",
"keyboard_shortcuts.toggle_sensitivity": "multimedia erakutsi/ezkutatzeko",
"keyboard_shortcuts.toot": "Hasi bidalketa berri bat",
+ "keyboard_shortcuts.translate": "bidalketa itzultzeko",
"keyboard_shortcuts.unfocus": "testua konposatzeko area / bilaketatik fokua kentzea",
"keyboard_shortcuts.up": "zerrendan gora mugitzea",
"lightbox.close": "Itxi",
"lightbox.next": "Hurrengoa",
"lightbox.previous": "Aurrekoa",
+ "lightbox.zoom_in": "Zooma egungo tamainara",
+ "lightbox.zoom_out": "Zooma egokitzeko",
"limited_account_hint.action": "Erakutsi profila hala ere",
"limited_account_hint.title": "Profil hau ezkutatu egin dute {domain} zerbitzariko moderatzaileek.",
"link_preview.author": "Egilea: {name}",
@@ -482,13 +500,24 @@
"lists.add_to_list": "Gehitu zerrendara",
"lists.add_to_lists": "Gehitu {name} zerrendetara",
"lists.create": "Sortu",
+ "lists.create_a_list_to_organize": "Sortu zerrenda berria zure Hasierako jarioa antolatzeko",
"lists.create_list": "Sortu zerrenda",
"lists.delete": "Ezabatu zerrenda",
"lists.done": "Egina",
"lists.edit": "Editatu zerrenda",
+ "lists.exclusive": "Ezkutatu kideak Hasieran",
+ "lists.exclusive_hint": "Norbait zerrenda honetan badago, ezkutatu zure Hasierako jariotik mezuak bi aldiz ez ikusteko.",
+ "lists.find_users_to_add": "Bilatu erabiltzaileak gehitzeko",
+ "lists.list_name": "Zerrenda izena",
+ "lists.new_list_name": "Zerrenda izen berria",
+ "lists.no_lists_yet": "Ez duzu zerrendarik oraindik.",
+ "lists.no_members_yet": "Ez duzu kiderik oraindik.",
+ "lists.no_results_found": "Ez da emaitzarik aurkitu.",
+ "lists.remove_member": "Ezabatu",
"lists.replies_policy.followed": "Jarraitutako edozein erabiltzaile",
"lists.replies_policy.list": "Zerrendako kideak",
"lists.replies_policy.none": "Bat ere ez",
+ "lists.save": "Gorde",
"lists.search": "Bilatu",
"load_pending": "{count, plural, one {elementu berri #} other {# elementu berri}}",
"loading_indicator.label": "Kargatzen…",
@@ -504,8 +533,10 @@
"mute_modal.you_wont_see_mentions": "Ez duzu ikusiko bera aipatzen duen argitalpenik.",
"mute_modal.you_wont_see_posts": "Zure argitalpenak ikus ditzake, baina ez dituzu bereak ikusiko.",
"navigation_bar.about": "Honi buruz",
+ "navigation_bar.account_settings": "Pasahitza eta segurtasuna",
"navigation_bar.administration": "Administrazioa",
"navigation_bar.advanced_interface": "Ireki web interfaze aurreratuan",
+ "navigation_bar.automated_deletion": "Bidalketa automatikoaren ezabaketa",
"navigation_bar.blocks": "Blokeatutako erabiltzaileak",
"navigation_bar.bookmarks": "Laster-markak",
"navigation_bar.direct": "Aipamen pribatuak",
@@ -515,13 +546,19 @@
"navigation_bar.follow_requests": "Jarraitzeko eskaerak",
"navigation_bar.followed_tags": "Jarraitutako traolak",
"navigation_bar.follows_and_followers": "Jarraitutakoak eta jarraitzaileak",
+ "navigation_bar.import_export": "Inportazioa eta esportazioa",
"navigation_bar.lists": "Zerrendak",
+ "navigation_bar.live_feed_local": "Zuzeneko jarioa (lokala)",
+ "navigation_bar.live_feed_public": "Zuzeneko jarioa (publikoa)",
"navigation_bar.logout": "Amaitu saioa",
"navigation_bar.moderation": "Moderazioa",
+ "navigation_bar.more": "Gehiago",
"navigation_bar.mutes": "Mutututako erabiltzaileak",
"navigation_bar.opened_in_classic_interface": "Argitalpenak, kontuak eta beste orri jakin batzuk lehenespenez irekitzen dira web-interfaze klasikoan.",
"navigation_bar.preferences": "Hobespenak",
+ "navigation_bar.privacy_and_reach": "Pribatutasuna eta irismena",
"navigation_bar.search": "Bilatu",
+ "navigation_bar.search_trends": "Bilatu / Joera",
"not_signed_in_indicator.not_signed_in": "Baliabide honetara sarbidea izateko saioa hasi behar duzu.",
"notification.admin.report": "{name} erabiltzaileak {target} salatu du",
"notification.admin.report_account": "{name}-(e)k {target}-ren {count, plural, one {bidalketa bat} other {# bidalketa}} salatu zituen {category} delakoagatik",
@@ -540,6 +577,7 @@
"notification.label.private_reply": "Erantzun pribatua",
"notification.label.reply": "Erantzuna",
"notification.mention": "Aipamena",
+ "notification.mentioned_you": "{name}(e)k aipatu zaitu",
"notification.moderation-warning.learn_more": "Informazio gehiago",
"notification.moderation_warning": "Moderazio-abisu bat jaso duzu",
"notification.moderation_warning.action_delete_statuses": "Argitalpen batzuk kendu dira.",
@@ -586,6 +624,7 @@
"notifications.column_settings.filter_bar.category": "Iragazki-barra bizkorra",
"notifications.column_settings.follow": "Jarraitzaile berriak:",
"notifications.column_settings.follow_request": "Jarraitzeko eskaera berriak:",
+ "notifications.column_settings.group": "Taldea",
"notifications.column_settings.mention": "Aipamenak:",
"notifications.column_settings.poll": "Inkestaren emaitzak:",
"notifications.column_settings.push": "Push jakinarazpenak",
@@ -736,6 +775,7 @@
"report_notification.categories.violation": "Arau haustea",
"report_notification.categories.violation_sentence": "arau haustea",
"report_notification.open": "Ireki salaketa",
+ "search.clear": "Garbitu bilaketa",
"search.no_recent_searches": "Duela gutxiko bilaketarik ez",
"search.placeholder": "Bilatu",
"search.quick_action.account_search": "{x}-(r)ekin bat datozen profilak",
@@ -800,6 +840,8 @@
"status.mute_conversation": "Mututu elkarrizketa",
"status.open": "Hedatu bidalketa hau",
"status.pin": "Finkatu profilean",
+ "status.quote_error.not_found": "Bidalketa hau ezin da erakutsi.",
+ "status.quote_error.pending_approval": "Bidalketa hau egile originalak onartzeko zain dago.",
"status.read_more": "Irakurri gehiago",
"status.reblog": "Bultzada",
"status.reblog_private": "Bultzada jatorrizko hartzaileei",
@@ -828,7 +870,11 @@
"subscribed_languages.save": "Gorde aldaketak",
"subscribed_languages.target": "Aldatu {target}(e)n harpidetutako hizkuntzak",
"tabs_bar.home": "Hasiera",
+ "tabs_bar.menu": "Menua",
"tabs_bar.notifications": "Jakinarazpenak",
+ "tabs_bar.publish": "Bidalketa berria",
+ "tabs_bar.search": "Bilatu",
+ "terms_of_service.title": "Zerbitzuaren baldintzak",
"time_remaining.days": "{number, plural, one {egun #} other {# egun}} amaitzeko",
"time_remaining.hours": "{number, plural, one {ordu #} other {# ordu}} amaitzeko",
"time_remaining.minutes": "{number, plural, one {minutu #} other {# minutu}} amaitzeko",
@@ -855,5 +901,6 @@
"video.fullscreen": "Pantaila osoa",
"video.hide": "Ezkutatu bideoa",
"video.pause": "Pausatu",
- "video.play": "Jo"
+ "video.play": "Jo",
+ "video.volume_up": "Bolumena Igo"
}
diff --git a/app/javascript/mastodon/locales/pt-BR.json b/app/javascript/mastodon/locales/pt-BR.json
index 1a18d4339f..d479793687 100644
--- a/app/javascript/mastodon/locales/pt-BR.json
+++ b/app/javascript/mastodon/locales/pt-BR.json
@@ -1,6 +1,7 @@
{
"about.blocks": "Servidores moderados",
"about.contact": "Contato:",
+ "about.default_locale": "Padrão",
"about.disclaimer": "Mastodon é um software de código aberto e livre, e uma marca registrada de Mastodon gGmbH.",
"about.domain_blocks.no_reason_available": "Razão não disponível",
"about.domain_blocks.preamble": "O 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 em específico.",
@@ -8,6 +9,7 @@
"about.domain_blocks.silenced.title": "Limitado",
"about.domain_blocks.suspended.explanation": "Nenhum dado desse servidor será processado, armazenado ou trocado, impossibilitando qualquer interação ou comunicação com os usuários deste servidor.",
"about.domain_blocks.suspended.title": "Suspenso",
+ "about.language_label": "Idioma",
"about.not_available": "Esta informação não foi disponibilizada neste servidor.",
"about.powered_by": "Redes sociais descentralizadas alimentadas por {mastodon}",
"about.rules": "Regras do servidor",
@@ -217,6 +219,11 @@
"confirmations.delete_list.confirm": "Excluir",
"confirmations.delete_list.message": "Você tem certeza de que deseja excluir esta lista?",
"confirmations.delete_list.title": "Excluir lista?",
+ "confirmations.discard_draft.confirm": "Descartar e continuar",
+ "confirmations.discard_draft.edit.cancel": "Continuar editando",
+ "confirmations.discard_draft.edit.message": "Continuar vai descartar quaisquer mudanças feitas ao post sendo editado.",
+ "confirmations.discard_draft.edit.title": "Descartar mudanças no seu post?",
+ "confirmations.discard_draft.post.cancel": "Continuar rascunho",
"confirmations.discard_edit_media.confirm": "Descartar",
"confirmations.discard_edit_media.message": "Há mudanças não salvas na descrição ou pré-visualização da mídia. Descartar assim mesmo?",
"confirmations.follow_to_list.confirm": "Seguir e adicionar à lista",
diff --git a/app/javascript/mastodon/locales/ru.json b/app/javascript/mastodon/locales/ru.json
index 66e5cf4760..31d1993143 100644
--- a/app/javascript/mastodon/locales/ru.json
+++ b/app/javascript/mastodon/locales/ru.json
@@ -363,7 +363,7 @@
"filter_modal.select_filter.title": "Фильтровать этот пост",
"filter_modal.title.status": "Фильтровать пост",
"filter_warning.matches_filter": "Соответствует фильтру «{title}»",
- "filtered_notifications_banner.pending_requests": "От {count, plural, =0 {не знакомых вам людей} one {# человека, которого вы можете знать} other {# человек, которых вы можете знать}}",
+ "filtered_notifications_banner.pending_requests": "От {count, plural, =0 {незнакомых вам людей} one {# человека, которого вы можете знать} other {# человек, которых вы можете знать}}",
"filtered_notifications_banner.title": "Отфильтрованные уведомления",
"firehose.all": "Всё вместе",
"firehose.local": "Этот сервер",
diff --git a/app/javascript/mastodon/locales/sk.json b/app/javascript/mastodon/locales/sk.json
index d82c4cb94d..63fd556f79 100644
--- a/app/javascript/mastodon/locales/sk.json
+++ b/app/javascript/mastodon/locales/sk.json
@@ -27,6 +27,7 @@
"account.edit_profile": "Upraviť profil",
"account.enable_notifications": "Zapnúť upozornenia na príspevky od @{name}",
"account.endorse": "Zobraziť na vlastnom profile",
+ "account.featured": "Zviditeľnené",
"account.featured.accounts": "Profily",
"account.featured.hashtags": "Hashtagy",
"account.featured_tags.last_status_at": "Posledný príspevok dňa {date}",
diff --git a/app/javascript/mastodon/locales/th.json b/app/javascript/mastodon/locales/th.json
index a6adca289a..603c1ab61f 100644
--- a/app/javascript/mastodon/locales/th.json
+++ b/app/javascript/mastodon/locales/th.json
@@ -1,6 +1,7 @@
{
"about.blocks": "เซิร์ฟเวอร์ที่ได้รับการกลั่นกรอง",
"about.contact": "ติดต่อ:",
+ "about.default_locale": "ค่าเริ่มต้น",
"about.disclaimer": "Mastodon เป็นซอฟต์แวร์เสรี โอเพนซอร์ส และเครื่องหมายการค้าของ Mastodon gGmbH",
"about.domain_blocks.no_reason_available": "เหตุผลไม่พร้อมใช้งาน",
"about.domain_blocks.preamble": "โดยทั่วไป Mastodon อนุญาตให้คุณดูเนื้อหาจากและโต้ตอบกับผู้ใช้จากเซิร์ฟเวอร์อื่นใดในจักรวาลสหพันธ์ นี่คือข้อยกเว้นที่ทำขึ้นในเซิร์ฟเวอร์นี้โดยเฉพาะ",
@@ -8,6 +9,7 @@
"about.domain_blocks.silenced.title": "จำกัดอยู่",
"about.domain_blocks.suspended.explanation": "จะไม่ประมวลผล จัดเก็บ หรือแลกเปลี่ยนข้อมูลจากเซิร์ฟเวอร์นี้ ทำให้การโต้ตอบหรือการสื่อสารใด ๆ กับผู้ใช้จากเซิร์ฟเวอร์นี้เป็นไปไม่ได้",
"about.domain_blocks.suspended.title": "ระงับอยู่",
+ "about.language_label": "ภาษา",
"about.not_available": "ไม่ได้ทำให้ข้อมูลนี้พร้อมใช้งานในเซิร์ฟเวอร์นี้",
"about.powered_by": "สื่อสังคมแบบกระจายศูนย์ที่ขับเคลื่อนโดย {mastodon}",
"about.rules": "กฎของเซิร์ฟเวอร์",
@@ -19,14 +21,18 @@
"account.block_domain": "ปิดกั้นโดเมน {domain}",
"account.block_short": "ปิดกั้น",
"account.blocked": "ปิดกั้นอยู่",
+ "account.blocking": "กำลังปิดกั้น",
"account.cancel_follow_request": "ยกเลิกการติดตาม",
"account.copy": "คัดลอกลิงก์ไปยังโปรไฟล์",
"account.direct": "กล่าวถึง @{name} แบบส่วนตัว",
"account.disable_notifications": "หยุดแจ้งเตือนฉันเมื่อ @{name} โพสต์",
- "account.domain_blocking": "โดเมน",
+ "account.domain_blocking": "กำลังปิดกั้นโดเมน",
"account.edit_profile": "แก้ไขโปรไฟล์",
"account.enable_notifications": "แจ้งเตือนฉันเมื่อ @{name} โพสต์",
"account.endorse": "แสดงในโปรไฟล์",
+ "account.featured": "น่าสนใจ",
+ "account.featured.accounts": "โปรไฟล์",
+ "account.featured.hashtags": "แฮชแท็ก",
"account.featured_tags.last_status_at": "โพสต์ล่าสุดเมื่อ {date}",
"account.featured_tags.last_status_never": "ไม่มีโพสต์",
"account.follow": "ติดตาม",
@@ -37,6 +43,7 @@
"account.following": "กำลังติดตาม",
"account.following_counter": "{count, plural, other {{counter} กำลังติดตาม}}",
"account.follows.empty": "ผู้ใช้นี้ยังไม่ได้ติดตามใคร",
+ "account.follows_you": "ติดตามคุณ",
"account.go_to_profile": "ไปยังโปรไฟล์",
"account.hide_reblogs": "ซ่อนการดันจาก @{name}",
"account.in_memoriam": "เพื่อระลึกถึง",
@@ -51,6 +58,7 @@
"account.mute_notifications_short": "ซ่อนการแจ้งเตือน",
"account.mute_short": "ซ่อน",
"account.muted": "ซ่อนอยู่",
+ "account.muting": "กำลังซ่อน",
"account.no_bio": "ไม่ได้ให้คำอธิบาย",
"account.open_original_page": "เปิดหน้าดั้งเดิม",
"account.posts": "โพสต์",
@@ -305,9 +313,14 @@
"errors.unexpected_crash.copy_stacktrace": "คัดลอกการติดตามสแตกไปยังคลิปบอร์ด",
"errors.unexpected_crash.report_issue": "รายงานปัญหา",
"explore.suggested_follows": "ผู้คน",
+ "explore.title": "กำลังนิยม",
"explore.trending_links": "ข่าว",
"explore.trending_statuses": "โพสต์",
"explore.trending_tags": "แฮชแท็ก",
+ "featured_carousel.next": "ถัดไป",
+ "featured_carousel.post": "โพสต์",
+ "featured_carousel.previous": "ก่อนหน้า",
+ "featured_carousel.slide": "{index} จาก {total}",
"filter_modal.added.context_mismatch_explanation": "หมวดหมู่ตัวกรองนี้ไม่นำไปใช้กับบริบทที่คุณได้เข้าถึงโพสต์นี้ หากคุณต้องการกรองโพสต์ในบริบทนี้ด้วย คุณจะต้องแก้ไขตัวกรอง",
"filter_modal.added.context_mismatch_title": "บริบทไม่ตรงกัน!",
"filter_modal.added.expired_explanation": "หมวดหมู่ตัวกรองนี้หมดอายุแล้ว คุณจะต้องเปลี่ยนวันหมดอายุสำหรับหมวดหมู่เพื่อนำไปใช้",
@@ -372,7 +385,10 @@
"hashtag.counter_by_accounts": "{count, plural, other {{counter} ผู้มีส่วนร่วม}}",
"hashtag.counter_by_uses": "{count, plural, other {{counter} โพสต์}}",
"hashtag.counter_by_uses_today": "{count, plural, other {{counter} โพสต์}}วันนี้",
+ "hashtag.feature": "แสดงในโปรไฟล์",
"hashtag.follow": "ติดตามแฮชแท็ก",
+ "hashtag.mute": "ซ่อน #{hashtag}",
+ "hashtag.unfeature": "ไม่แสดงในโปรไฟล์",
"hashtag.unfollow": "เลิกติดตามแฮชแท็ก",
"hashtags.and_other": "…และอีก {count, plural, other {# เพิ่มเติม}}",
"hints.profiles.followers_may_be_missing": "ผู้ติดตามสำหรับโปรไฟล์นี้อาจขาดหายไป",
@@ -504,8 +520,10 @@
"mute_modal.you_wont_see_mentions": "คุณจะไม่เห็นโพสต์ที่กล่าวถึงเขา",
"mute_modal.you_wont_see_posts": "เขายังคงสามารถเห็นโพสต์ของคุณ แต่คุณจะไม่เห็นโพสต์ของเขา",
"navigation_bar.about": "เกี่ยวกับ",
+ "navigation_bar.account_settings": "รหัสผ่านและความปลอดภัย",
"navigation_bar.administration": "การดูแล",
"navigation_bar.advanced_interface": "เปิดในส่วนติดต่อเว็บขั้นสูง",
+ "navigation_bar.automated_deletion": "การลบโพสต์แบบอัตโนมัติ",
"navigation_bar.blocks": "ผู้ใช้ที่ปิดกั้นอยู่",
"navigation_bar.bookmarks": "ที่คั่นหน้า",
"navigation_bar.direct": "การกล่าวถึงแบบส่วนตัว",
@@ -515,12 +533,15 @@
"navigation_bar.follow_requests": "คำขอติดตาม",
"navigation_bar.followed_tags": "แฮชแท็กที่ติดตาม",
"navigation_bar.follows_and_followers": "การติดตามและผู้ติดตาม",
+ "navigation_bar.import_export": "การนำเข้าและการส่งออก",
"navigation_bar.lists": "รายการ",
"navigation_bar.logout": "ออกจากระบบ",
"navigation_bar.moderation": "การกลั่นกรอง",
+ "navigation_bar.more": "เพิ่มเติม",
"navigation_bar.mutes": "ผู้ใช้ที่ซ่อนอยู่",
"navigation_bar.opened_in_classic_interface": "จะเปิดโพสต์, บัญชี และหน้าที่เฉพาะเจาะจงอื่น ๆ เป็นค่าเริ่มต้นในส่วนติดต่อเว็บแบบคลาสสิก",
"navigation_bar.preferences": "การกำหนดลักษณะ",
+ "navigation_bar.privacy_and_reach": "ความเป็นส่วนตัวและการเข้าถึง",
"navigation_bar.search": "ค้นหา",
"not_signed_in_indicator.not_signed_in": "คุณจำเป็นต้องเข้าสู่ระบบเพื่อเข้าถึงทรัพยากรนี้",
"notification.admin.report": "{name} ได้รายงาน {target}",
@@ -747,6 +768,7 @@
"report_notification.categories.violation": "การละเมิดกฎ",
"report_notification.categories.violation_sentence": "การละเมิดกฎ",
"report_notification.open": "รายงานที่เปิด",
+ "search.clear": "ล้างการค้นหา",
"search.no_recent_searches": "ไม่มีการค้นหาล่าสุด",
"search.placeholder": "ค้นหา",
"search.quick_action.account_search": "โปรไฟล์ที่ตรงกับ {x}",
@@ -812,6 +834,7 @@
"status.mute_conversation": "ซ่อนการสนทนา",
"status.open": "ขยายโพสต์นี้",
"status.pin": "ปักหมุดในโปรไฟล์",
+ "status.quote_post_author": "โพสต์โดย {name}",
"status.read_more": "อ่านเพิ่มเติม",
"status.reblog": "ดัน",
"status.reblog_private": "ดันด้วยการมองเห็นดั้งเดิม",
@@ -841,7 +864,10 @@
"subscribed_languages.save": "บันทึกการเปลี่ยนแปลง",
"subscribed_languages.target": "เปลี่ยนภาษาที่บอกรับสำหรับ {target}",
"tabs_bar.home": "หน้าแรก",
+ "tabs_bar.menu": "เมนู",
"tabs_bar.notifications": "การแจ้งเตือน",
+ "tabs_bar.publish": "โพสต์ใหม่",
+ "tabs_bar.search": "ค้นหา",
"terms_of_service.title": "เงื่อนไขการให้บริการ",
"time_remaining.days": "เหลืออีก {number, plural, other {# วัน}}",
"time_remaining.hours": "เหลืออีก {number, plural, other {# ชั่วโมง}}",
diff --git a/config/locales/activerecord.eu.yml b/config/locales/activerecord.eu.yml
index 8b4235eb99..c0ac1bb338 100644
--- a/config/locales/activerecord.eu.yml
+++ b/config/locales/activerecord.eu.yml
@@ -49,8 +49,14 @@ eu:
attributes:
reblog:
taken: mezu honentzat bazegoen aurretik
+ terms_of_service:
+ attributes:
+ effective_date:
+ too_soon: goizegi da, %{date} baino geroagokoa izan behar da
user:
attributes:
+ date_of_birth:
+ below_limit: adinaren mugaren azpitik dago
email:
blocked: onartu gabeko e-posta hornitzaile bat erabiltzen du
unreachable: dirudienez ez da existitzen
diff --git a/config/locales/bg.yml b/config/locales/bg.yml
index 5a41164c06..137f9c711f 100644
--- a/config/locales/bg.yml
+++ b/config/locales/bg.yml
@@ -566,6 +566,13 @@ bg:
all: Всичко
limited: Ограничено
title: Mодериране
+ moderation_notes:
+ create: Добавяне на бележка за модериране
+ created_msg: Успешно създадена бележка за модериране на екземпляр!
+ description_html: Прегледайте и оставете бележки за други модератори и за вас в бъдеще
+ destroyed_msg: Успешно изтрита бележка за модериране на екземпляр!
+ placeholder: Сведенията за този екземпляр, предприети действия, или всичко друго, което ще ви помогне да модерирате този екземпляр в бъдеще.
+ title: Бележки за модериране
private_comment: Личен коментар
public_comment: Публичен коментар
purge: Чистка
@@ -774,11 +781,16 @@ bg:
title: Роли
rules:
add_new: Добавяне на правило
+ add_translation: Добавяне на превод
delete: Изтриване
description_html: Дори повечето хора да отбелязват, че са прочели и са съгласни с условията на услугата, обикновено хората не ги четат, докато не се сблъскат с проблем. Улеснете четенето на правилата за сървъра си, представяйки ги като списък с точки. Опитайте да се придържате към кратки и прости правила, но не ги разпилявайте в премного точки.
edit: Промяна на правило
empty: Още няма определени правила на сървъра.
+ move_down: Преместване надолу
+ move_up: Преместване нагоре
title: Сървърни правила
+ translation: Превод
+ translations: Преводи
settings:
about:
manage_rules: Управление на правилата на сървъра
@@ -804,6 +816,7 @@ bg:
discovery:
follow_recommendations: Препоръки за следване
preamble: За потребители, които са нови и не познават никого в Mastodon, показването на интересно съдържание е ключово. Настройте начина, по който различни функции по откриване на съдържание работят на вашия сървър.
+ privacy: Поверителност
profile_directory: Указател на профила
public_timelines: Публични хронологии
publish_statistics: Публикуване на статистиката
@@ -890,6 +903,8 @@ bg:
system_checks:
database_schema_check:
message_html: Има миграции на базата данни, които чакат да бъдат изпълнени. Моля, изпълнете ги, за да осигурите изправността на приложението
+ elasticsearch_analysis_index_mismatch:
+ message_html: Настройките за анализиращия индекс Elasticsearch са остарели. Пуснете tootctl search deploy --only-mapping --only=%{value}
elasticsearch_health_red:
message_html: Клъстерът Elasticsearch е нездрав (червено състояние), функциите за търсене не са налични
elasticsearch_health_yellow:
@@ -1841,6 +1856,10 @@ bg:
limit: Вече сте закачили максималния брой публикации
ownership: Публикация на някого другиго не може да бъде закачена
reblog: Раздуване не може да бъде закачано
+ quote_policies:
+ followers: Последователи и споменати потребители
+ nobody: Само споменатите потребители
+ public: Всеки
title: "%{name}: „%{quote}“"
visibilities:
direct: Директно
@@ -1894,6 +1913,9 @@ bg:
does_not_match_previous_name: не съвпада с предишното име
terms_of_service:
title: Условия на услугата
+ terms_of_service_interstitial:
+ future_preamble_html: Правим някои промени в условията на услугата ни, което ще влезе в сила на %{date}. Насърчаваме ви да разгледате обновените условия.
+ past_preamble_html: Променихме условията на услугата ни от последното ви посещение. Насърчаваме ви да разгледате обновените условия.
themes:
contrast: Mastodon (висок контраст)
default: Mastodon (тъмно)
diff --git a/config/locales/da.yml b/config/locales/da.yml
index ca5f1831c9..db3bb547fe 100644
--- a/config/locales/da.yml
+++ b/config/locales/da.yml
@@ -1485,8 +1485,8 @@ da:
one: Man er ved at erstatte sine lister med indhold fra %{filename}. %{count} konto føjes til nye lister.
other: Man er ved at erstatte sine lister med indhold fra %{filename}. Op til %{count} konti føjes til nye lister.
muting_html:
- one: Man er ved at sin liste over en tavsgjort konto med %{count} konto fra %{filename}.
- other: Du er ved at erstatte din liste over skjulte kontoer med op til %{count} kontoer fra %{filename}.
+ one: Du er ved at erstatte din liste over en skjult konto med op til %{count} konto fra %{filename}.
+ other: Du er ved at erstatte din liste over skjulte konti med op til %{count} konti fra %{filename}.
preambles:
blocking_html:
one: Man er ved at blokere%{count} konto fra %{filename}.
@@ -1504,8 +1504,8 @@ da:
one: Man er ved at tilføje %{count} konto fra %{filename} til sine lister. Nye lister oprettes, hvis der ikke findes nogen liste at tilføje til.
other: Man er ved at tilføje %{count} konti fra %{filename} til sine lister. Nye lister oprettes, hvis der ikke findes nogen liste at tilføje til.
muting_html:
- one: Man er ved at tavsgøre%{count} konto fra %{filename}.
- other: Du er ved at skjule op til %{count} kontoer fra %{filename}.
+ one: Du er ved at skjule op til %{count} konto fra %{filename}.
+ other: Du er ved at skjule op til %{count} konti fra %{filename}.
preface: Du kan importere data, du har eksporteret fra en anden server, såsom en liste over folk du følger eller blokerer.
recent_imports: Seneste importer
states:
@@ -1522,11 +1522,11 @@ da:
domain_blocking: Importerer blokerede konti
following: Importerer fulgte konti
lists: Import af lister
- muting: Importerer skjulte kontoer
+ muting: Importerer skjulte konti
type: Importtype
type_groups:
constructive: Følger og Bogmærker
- destructive: Blokerede og skjulte kontoer
+ destructive: Blokerede og skjulte konti
types:
blocking: Blokeringsliste
bookmarks: Bogmærker
@@ -1628,7 +1628,7 @@ da:
title: Moderation
move_handler:
carry_blocks_over_text: Denne bruger er flyttet fra %{acct}, som du har haft blokeret.
- carry_mutes_over_text: Denne bruger er flyttet fra %{acct}, som du har haft skjult.
+ carry_mutes_over_text: Denne bruger flyttede fra %{acct}, som du havde skjult.
copy_account_note_text: 'Denne bruger er flyttet fra %{acct}, hvor dine tidligere noter om dem var:'
navigation:
toggle_menu: Åbn/luk menu
@@ -1832,7 +1832,7 @@ da:
profile: Offentlig profil
relationships: Følger og følgere
severed_relationships: Afbrudte forhold
- statuses_cleanup: Auto-indlægssletning
+ statuses_cleanup: Automatiseret sletning af indlæg
strikes: Moderationsadvarsler
two_factor_authentication: Tofaktorgodkendelse
webauthn_authentication: Sikkerhedsnøgler
@@ -1905,9 +1905,9 @@ da:
keep_polls: Behold afstemninger
keep_polls_hint: Sletter ingen af dine afstemninger
keep_self_bookmark: Behold bogmærkede indlæg
- keep_self_bookmark_hint: Sletter ikke dine egne indlæg, såfremt de er bogmærket
+ keep_self_bookmark_hint: Sletter ikke dine egne indlæg, hvis du har bogmærket dem
keep_self_fav: Behold favoritmarkerede indlæg
- keep_self_fav_hint: Sletter ikke dine egne indlæg, såfremt de er favoritmarkeret
+ keep_self_fav_hint: Sletter ikke dine egne indlæg, hvis du har favoritmarkeret dem
min_age:
'1209600': 2 uger
'15778476': 6 måneder
diff --git a/config/locales/devise.vi.yml b/config/locales/devise.vi.yml
index 04107b2897..5b4bbf3839 100644
--- a/config/locales/devise.vi.yml
+++ b/config/locales/devise.vi.yml
@@ -49,14 +49,14 @@ vi:
title: Đổi lại mật khẩu
two_factor_disabled:
explanation: Đăng nhập bây giờ chỉ có thể sử dụng địa chỉ email và mật khẩu.
- subject: 'Mastodon: Xác minh 2 bước đã bị vô hiệu hóa'
- subtitle: Xác minh hai bước cho tài khoản của bạn đã bị vô hiệu hóa.
- title: Vô hiệu hóa xác minh 2 bước
+ subject: 'Mastodon: Xác thực 2 bước đã bị vô hiệu hóa'
+ subtitle: Xác thực 2 bước cho tài khoản của bạn đã bị vô hiệu hóa.
+ title: Vô hiệu hóa xác thực 2 bước
two_factor_enabled:
explanation: Cần có mã token được tạo bởi ứng dụng TOTP được ghép nối để đăng nhập.
- subject: 'Mastodon: Kích hoạt xác minh 2 bước'
- subtitle: Xác minh hai bước đã được bật cho tài khoản của bạn.
- title: Kích hoạt xác minh 2 bước
+ subject: 'Mastodon: Kích hoạt xác thực 2 bước'
+ subtitle: Xác thực 2 bước đã được bật cho tài khoản của bạn.
+ title: Kích hoạt xác thực 2 bước
two_factor_recovery_codes_changed:
explanation: Các mã khôi phục trước đó đã bị vô hiệu hóa và thay bằng mã mới.
subject: 'Mastodon: Mã khôi phục xác thực hai yếu tố đã được tạo lại'
diff --git a/config/locales/doorkeeper.da.yml b/config/locales/doorkeeper.da.yml
index 5be66d6c2a..49917c8ebc 100644
--- a/config/locales/doorkeeper.da.yml
+++ b/config/locales/doorkeeper.da.yml
@@ -130,11 +130,11 @@ da:
crypto: Ende-til-ende kryptering
favourites: Favoritter
filters: Filtre
- follow: Fulgte, skjjulte og blokerede kontoer
+ follow: Fulgte, skjulte og blokerede konti
follows: Følger
lists: Lister
media: Medievedhæftninger
- mutes: Skjulte kontoer
+ mutes: Skjulte
notifications: Notifikationer
profile: Din Mastodon-profil
push: Push-notifikationer
@@ -177,7 +177,7 @@ da:
read:filters: se dine filtre
read:follows: se dine følger
read:lists: se dine lister
- read:mutes: se dine skjulte kontoer
+ read:mutes: se dine skjulte konti
read:notifications: se dine notifikationer
read:reports: se dine anmeldelser
read:search: søg på dine vegne
diff --git a/config/locales/eu.yml b/config/locales/eu.yml
index 79080c7bfb..19a6be4a9c 100644
--- a/config/locales/eu.yml
+++ b/config/locales/eu.yml
@@ -450,6 +450,27 @@ eu:
new:
title: Domeinu-blokeoak inportatu
no_file: Ez da fitxategirik hautatu
+ fasp:
+ debug:
+ callbacks:
+ delete: Ezabatu
+ ip: IP helbidea
+ providers:
+ active: Aktibo
+ base_url: Oinarrizko URL-a
+ delete: Ezabatu
+ edit: Editatu hornitzailea
+ finish_registration: Izen-ematea bukatu
+ name: Izena
+ providers: Hornitzaileak
+ public_key_fingerprint: Gako publikoaren hatz-marka
+ registration_requested: Izen-ematea eskatuta
+ registrations:
+ confirm: Berretsi
+ reject: Ukatu
+ save: Gorde
+ sign_in: Hasi saioa
+ status: Egoera
follow_recommendations:
description_html: "Jarraitzeko gomendioek erabiltzaile berriei eduki interesgarria azkar aurkitzen laguntzen diete. Erabiltzaile batek jarraitzeko gomendio pertsonalizatuak jasotzeko adina interakzio izan ez duenean, kontu hauek gomendatzen zaizkio. Egunero birkalkulatzen dira hizkuntza bakoitzerako, azken aldian parte-hartze handiena izan duten eta jarraitzaile lokal gehien dituzten kontuak nahasiz."
language: Hizkuntza
@@ -717,11 +738,14 @@ eu:
title: Rolak
rules:
add_new: Gehitu araua
+ add_translation: Gehitu itzulpena
delete: Ezabatu
description_html: Gehienek erabilera baldintzak irakurri eta onartu dituztela baieztatzen badute ere, orokorrean arazoren bat dagoen arte ez dituzte irakurtzen. Zerbitzariaren arauak begirada batean ikustea errazteko buletadun zerrenda batean bildu. Saiatu arauak labur eta sinple idazten, baina elementu askotan banatu gabe.
edit: Editatu araua
empty: Ez da zerbitzariko araurik definitu oraindik.
title: Zerbitzariaren arauak
+ translation: Itzulpena
+ translations: Itzulpenak
settings:
about:
manage_rules: Kudeatu zerbitzariaren arauak
@@ -747,6 +771,7 @@ eu:
discovery:
follow_recommendations: Jarraitzeko gomendioak
preamble: Eduki interesgarria aurkitzea garrantzitsua da Mastodoneko erabiltzaile berrientzat, behar bada inor ez dutelako ezagutuko. Kontrolatu zure zerbitzariko aurkikuntza-ezaugarriek nola funtzionatzen duten.
+ privacy: Pribatutasuna
profile_directory: Profil-direktorioa
public_timelines: Denbora-lerro publikoak
publish_statistics: Argitaratu estatistikak
@@ -794,6 +819,7 @@ eu:
batch:
remove_from_report: Kendu txostenetik
report: Salatu
+ contents: Edukiak
deleted: Ezabatuta
favourites: Gogokoak
history: Bertsio-historia
@@ -802,6 +828,7 @@ eu:
media:
title: Multimedia
metadata: Metadatuak
+ no_history: Bidalketa hau ez da editatu
no_status_selected: Ez da bidalketarik aldatu ez delako bat ere hautatu
open: Ireki bidalketa
original_status: Jatorrizko bidalketa
@@ -849,6 +876,8 @@ eu:
message_html: Ez duzu zerbitzariaren araurik definitu.
sidekiq_process_check:
message_html: Ez da ari Sidekiq prozesurik exekutatzen %{value} ilad(et)an. Egiaztatu Sidekiq konfigurazioa
+ software_version_check:
+ message_html: Mastodon eguneratze bat eskuragarri dago.
software_version_critical_check:
action: Ikusi eguneraketa eskuragarriak
message_html: Mastodon eguneraketa kritikoa eskuragarri, mesedez eguneratu ahal bezain azkar.
@@ -862,8 +891,35 @@ eu:
action: Ikus hemen informazio gehiagorako
message_html: "Zure objektuen biltegiratzea ez dago ongi konfiguratua. Zure erabiltzaileen pribatutasuna arriskuan dago."
tags:
+ moderation:
+ not_usable: Ez erabilgarri
+ pending_review: Berrikusketaren zain
+ reviewed: Berrikusita
+ title: Egoera
+ unreviewed: Berrikusi gabe
+ usable: Erabilgarri
+ name: Izena
+ newest: Berriena
+ oldest: Zaharrena
+ open: Publikoki ikusi
+ reset: Berrezarri
review: Berrikusketaren egoera
+ search: Bilatu
+ title: Traolak
updated_msg: Traola-ezarpenak ongi eguneratu dira
+ terms_of_service:
+ changelog: Zer aldatu da
+ current: Oraingoa
+ draft: Zirriborroa
+ generate: Txantiloila erabili
+ generates:
+ action: Sortu
+ history: Historia
+ live: Zuzenean
+ publish: Argitaratu
+ published_on_html: "%{date}(e)an argitaratua"
+ save_draft: Gorde zirriborroa
+ title: Zerbitzuaren baldintzak
title: Administrazioa
trends:
allow: Onartu
@@ -1056,6 +1112,7 @@ eu:
migrate_account_html: Kontu hau beste batera birbideratu nahi baduzu, hemen konfiguratu dezakezu.
or_log_in_with: Edo hasi saioa honekin
progress:
+ confirm: Berretsi e-mail helbidea
details: Zure xehetasunak
review: Gure berrikuspena
rules: Onartu arauak
@@ -1077,6 +1134,7 @@ eu:
security: Segurtasuna
set_new_password: Ezarri pasahitza berria
setup:
+ email_below_hint_html: Begiratu zure spameko karpetan, edo eskatu beste bat. Zure helbide elektronikoa zuzen dezakezu oker badago.
link_not_received: Ez duzu estekarik jaso?
title: Begiratu zure sarrera-ontzia
sign_in:
@@ -1587,10 +1645,12 @@ eu:
delete: Kontuaren ezabaketa
development: Garapena
edit_profile: Editatu profila
+ export: Esportatu
featured_tags: Nabarmendutako traolak
import: Inportazioa
import_and_export: Inportatu eta esportatu
migrate: Kontuaren migrazioa
+ notifications: Posta bidezko jakinarazpenak
preferences: Hobespenak
profile: Profila
relationships: Jarraitutakoak eta jarraitzaileak
@@ -1637,6 +1697,10 @@ eu:
limit: Gehienez finkatu daitekeen bidalketa kopurua finkatu duzu jada
ownership: Ezin duzu beste norbaiten bidalketa bat finkatu
reblog: Bultzada bat ezin da finkatu
+ quote_policies:
+ followers: Jarraitzaileak eta aipatutako erabiltzaileak
+ nobody: Aipatutako erabiltzaileak soilik
+ public: Guztiak
title: '%{name}: "%{quote}"'
visibilities:
direct: Zuzena
@@ -1688,6 +1752,8 @@ eu:
too_late: Beranduegi da neurri hau apelatzeko
tags:
does_not_match_previous_name: ez dator aurreko izenarekin bat
+ terms_of_service:
+ title: Erabilera baldintzak
themes:
contrast: Mastodon (Kontraste altua)
default: Mastodon (Iluna)
@@ -1833,6 +1899,7 @@ eu:
instructions_html: Kopiatu eta itsatsi ondoko kodea zure webguneko HTMLan. Ondoren, gehitu zure webgunearen helbidea zure profileko eremu gehigarrietako batean, "Editatu profila" fitxatik eta gorde aldaketak.
verification: Egiaztaketa
verified_links: Zure lotura egiaztatuak
+ website_verification: Web orriaren egiaztapena
webauthn_credentials:
add: Gehitu segurtasun gako berria
create:
diff --git a/config/locales/nan.yml b/config/locales/nan.yml
index 810a6f6957..317900e56b 100644
--- a/config/locales/nan.yml
+++ b/config/locales/nan.yml
@@ -346,6 +346,68 @@ nan:
enabled: 啟用ê
enabled_msg: Hit ê emoji成功啟用ah
image_hint: Sài-suh無超過 %{size} ê PNG á是 GIF
+ list: 列單
+ listed: 加入列單ah
+ new:
+ title: 加添新ê自訂emoji
+ no_emoji_selected: 因為無揀任何emoji,所以lóng無改變
+ not_permitted: Lí無允准行tsit ê動作
+ overwrite: Khàm掉
+ shortcode: 短碼
+ shortcode_hint: 字元上少2 ê,kan-ta接受字母、數字kap底線(_)
+ title: 自訂emoji
+ uncategorized: Iáu無分類
+ unlist: Tuì列單the̍h掉
+ unlisted: The̍h掉ah
+ update_failed_msg: Bē當更新hit ê emoji
+ updated_msg: Emoji成功更新ah!
+ upload: 傳上去
+ dashboard:
+ active_users: 活動ê用者
+ interactions: 互動
+ media_storage: 媒體儲存
+ new_users: 新用者
+ opened_reports: 拍開ê報告
+ pending_appeals_html:
+ other: "%{count} ê投訴愛處理"
+ pending_reports_html:
+ other: "%{count} ê檢舉愛處理"
+ pending_tags_html:
+ other: "%{count} ê hashtag愛處理"
+ pending_users_html:
+ other: "%{count} ê用者愛處理"
+ resolved_reports: 解決ê報告
+ software: 軟體
+ sources: 註冊ê源頭
+ space: 空間ê使用
+ title: Le-jí-páng (dashboard)
+ top_languages: 上tsia̍p出現ê語言
+ top_servers: 上tsia̍p活動ê服侍器
+ website: 網站
+ disputes:
+ appeals:
+ empty: Tshuē無投訴。
+ title: 投訴
+ domain_allows:
+ add_new: 允准kap tsit ê域名相連
+ created_msg: 域名已經成功允准相連
+ destroyed_msg: 域名已經成功取消相連
+ export: 輸出
+ import: 輸入
+ undo: 禁止kap tsit ê域名相連
+ domain_blocks:
+ add_new: 加添新ê封鎖域名
+ confirm_suspension:
+ cancel: 取消
+ confirm: 中止權限
+ permanent_action: 取消中止權限,bē當復原任何資料á是關係。
+ preamble_html: Lí teh beh停止 %{domain} kap伊ê kiánn域名ê權限。
+ remove_all_data: Tse ē tī lí ê服侍器內底,kā tuì tsit ê域名ê口座來ê所有內容、媒體kap個人資料lóng thâi掉。
+ stop_communication: Lí ê服侍器ē停止kap hia ê服侍器聯絡。
+ title: 確認封鎖域名 %{domain}
+ edit: 編輯域名封鎖
+ export: 輸出
+ import: 輸入
instances:
dashboard:
instance_languages_dimension: Tsia̍p用ê語言
diff --git a/config/locales/pt-BR.yml b/config/locales/pt-BR.yml
index 27d2c860e1..1e630275ce 100644
--- a/config/locales/pt-BR.yml
+++ b/config/locales/pt-BR.yml
@@ -578,6 +578,8 @@ pt-BR:
all: Todos
limited: Limitados
title: Moderação
+ moderation_notes:
+ title: Notas de Moderação
private_comment: Comentário privado
public_comment: Comentário público
purge: Limpar
diff --git a/config/locales/simple_form.eu.yml b/config/locales/simple_form.eu.yml
index dfe6c0b6d7..7706db6637 100644
--- a/config/locales/simple_form.eu.yml
+++ b/config/locales/simple_form.eu.yml
@@ -56,6 +56,7 @@ eu:
scopes: Zeintzuk API atzitu ditzakeen aplikazioak. Goi mailako arloa aukeratzen baduzu, ez dituzu azpikoak aukeratu behar.
setting_aggregate_reblogs: Ez erakutsi bultzada berriak berriki bultzada jaso duten tootentzat (berriki jasotako bultzadei eragiten die bakarrik)
setting_always_send_emails: Normalean eposta jakinarazpenak ez dira bidaliko Mastodon aktiboki erabiltzen ari zaren bitartean
+ setting_default_quote_policy: Aipaturiko erabiltzaileek beti dute aipatzeko baimena. Ezarpen honek Mastodon-en hurrengo bertsioarekin sortutako argitalpenetan bakarrik izango du eragina, baina prestatzean lehentasuna hauta dezakezu
setting_default_sensitive: Multimedia hunkigarria lehenetsita ezkutatzen da, eta sakatuz ikusi daiteke
setting_display_media_default: Ezkutatu hunkigarri gisa markatutako multimedia
setting_display_media_hide_all: Ezkutatu multimedia guztia beti
@@ -75,6 +76,7 @@ eu:
filters:
action: Aukeratu ze ekintza burutu behar den bidalketa bat iragazkiarekin bat datorrenean
actions:
+ blur: Ezkutatu edukia ohar baten atzean, testua bera ezkutatu gabe
hide: Ezkutatu erabat iragazitako edukia, existituko ez balitz bezala
warn: Ezkutatu iragazitako edukia iragazkiaren izenburua duen abisu batekin
form_admin_settings:
@@ -88,6 +90,7 @@ eu:
favicon: WEBP, PNG, GIF or JPG. Mastodon-en favicon-a gainidazten du ikono pertsonalizatu batekin.
mascot: Web interfaze aurreratuko ilustrazioa gainidazten du.
media_cache_retention_period: Multimedia-fitxategiak dituzten urruneko erabiltzaileen argitalpenak zure zerbitzarian gordetzen dira cachean. Balio positiboa ezartzean, multimedia zehazturiko egunen buruan ezabatuko da. Multimedia-datuak eskatzen badira ezabatu ostean, berriro deskargatuko dira, iturburuko edukia oraindik erabilgarri badago. Estekaren aurrebistako txartelek hirugarrenen guneei zenbatetan dei diezaieketen mugatzen dieten murrizketak direla eta, balio honi, gutxienez, 14 egunen balioa ezartzea gomendatzen da, bestela, esteken aurrebistako txartelak ez dira eguneratuko eskatu ahala denbora horren aurretik.
+ min_age: Erabiltzaileei jaiotze-data berresteko eskatuko zaie izen-ematean
peers_api_enabled: Zerbitzari honek fedibertsoan ikusi dituen zerbitzarien domeinu-izenen zerrenda. Ez da daturik ematen zerbitzari jakin batekin federatzearen ala ez federatzearen inguruan, zerbitzariak haien berri duela soilik. Federazioari buruzko estatistika orokorrak biltzen dituzten zerbitzuek erabiltzen dute hau.
profile_directory: Profilen direktorioan ikusgai egotea aukeratu duten erabiltzaile guztiak zerrendatzen dira.
require_invite_text: Izen emateak eskuz onartu behar direnean, "Zergatik elkartu nahi duzu?" testu sarrera derrigorrezko bezala ezarri, ez hautazko
@@ -132,9 +135,12 @@ eu:
name: Letrak maiuskula/minuskulara aldatu ditzakezu besterik ez, adibidez irakurterrazago egiteko
terms_of_service:
changelog: Markdown-en sintaxiarekin egitura daiteke.
+ effective_date: Zentzuzko epe bat 10 eta 30 egun bitartekoa izan daiteke, erabiltzaileei jakinarazten diezun egunetik kontatzen hasita.
text: Markdown-en sintaxiarekin egitura daiteke.
terms_of_service_generator:
admin_email: Legezko abisuak, kontraindikazioak, agindu judizialak, erretiratzeko eskaerak eta legea betetzeko eskaerak barne.
+ arbitration_address: Goiko helbide fisikoa edo "N/A" bera izan daiteke posta elektronikoa erabiliz gero.
+ arbitration_website: Web formularioa izan daiteke, edo "N/A" posta elektronikoa erabiliz gero.
user:
chosen_languages: Markatzean, hautatutako hizkuntzetan dauden tutak besterik ez dira erakutsiko.
user_role:
@@ -327,6 +333,9 @@ eu:
terms_of_service_generator:
domain: Domeinua
user:
+ date_of_birth_1i: Eguna
+ date_of_birth_2i: Hilabetea
+ date_of_birth_3i: Urtea
role: Rola
time_zone: Ordu zona
user_role:
diff --git a/config/locales/simple_form.vi.yml b/config/locales/simple_form.vi.yml
index b9f8d5d9c3..9e794028c5 100644
--- a/config/locales/simple_form.vi.yml
+++ b/config/locales/simple_form.vi.yml
@@ -126,7 +126,7 @@ vi:
hint: Tùy chọn. Cung cấp chi tiết hơn về nội quy
text: Mô tả một nội quy bắt buộc trên máy chủ này. Nên để ngắn và đơn giản
sessions:
- otp: 'Nhập mã xác minh 2 bước được tạo bởi ứng dụng điện thoại của bạn hoặc dùng một trong các mã khôi phục của bạn:'
+ otp: 'Nhập mã xác thực 2 bước được tạo bởi ứng dụng điện thoại của bạn hoặc dùng một trong các mã khôi phục của bạn:'
webauthn: Nếu đây là USB key, hãy cắm vào và thử xoay chiều.
settings:
indexable: Trang của bạn có thể xuất hiện trong kết quả tìm kiếm trên Google, Bing và các nơi khác.
@@ -221,7 +221,7 @@ vi:
max_uses: Lượt dùng tối đa
new_password: Mật khẩu mới
note: Giới thiệu
- otp_attempt: Mã xác minh 2 bước
+ otp_attempt: Mã xác thực 2 bước
password: Mật khẩu
phrase: Từ khóa hoặc cụm từ
setting_advanced_layout: Bố cục nhiều cột
diff --git a/config/locales/th.yml b/config/locales/th.yml
index 558e95249b..51db141fc5 100644
--- a/config/locales/th.yml
+++ b/config/locales/th.yml
@@ -472,6 +472,15 @@ th:
created_at: สร้างเมื่อ
delete: ลบ
ip: ที่อยู่ IP
+ providers:
+ delete: ลบ
+ name: ชื่อ
+ registrations:
+ confirm: ยืนยัน
+ reject: ปฏิเสธ
+ save: บันทึก
+ sign_in: ลงชื่อเข้า
+ status: สถานะ
follow_recommendations:
description_html: "คำแนะนำการติดตามช่วยให้ผู้ใช้ใหม่ค้นหาเนื้อหาที่น่าสนใจได้อย่างรวดเร็ว เมื่อผู้ใช้ไม่ได้โต้ตอบกับผู้อื่นมากพอที่จะสร้างคำแนะนำการติดตามเฉพาะบุคคล จะแนะนำบัญชีเหล่านี้แทน จะคำนวณคำแนะนำใหม่เป็นประจำทุกวันจากบัญชีต่าง ๆ ที่มีการมีส่วนร่วมล่าสุดสูงสุดและจำนวนผู้ติดตามในเซิร์ฟเวอร์สูงสุดสำหรับภาษาที่กำหนด"
language: สำหรับภาษา
@@ -746,6 +755,8 @@ th:
description_html: ขณะที่ส่วนใหญ่อ้างว่าได้อ่านและยอมรับเงื่อนไขการให้บริการ ผู้คนมักจะไม่อ่านจนกว่าหลังจากปัญหาเกิดขึ้น ทำให้การดูกฎของเซิร์ฟเวอร์ของคุณอย่างรวดเร็วง่ายขึ้นโดยการระบุกฎเหล่านั้นในรายการสัญลักษณ์แสดงหัวข้อย่อยแบบแบน พยายามทำให้กฎแต่ละข้อสั้นและเรียบง่าย แต่พยายามอย่าแบ่งกฎเหล่านั้นเป็นหลายรายการแยกเช่นกัน
edit: แก้ไขกฎ
empty: ยังไม่ได้กำหนดกฎของเซิร์ฟเวอร์
+ move_down: ย้ายลง
+ move_up: ย้ายขึ้น
title: กฎของเซิร์ฟเวอร์
settings:
about:
@@ -772,6 +783,7 @@ th:
discovery:
follow_recommendations: คำแนะนำการติดตาม
preamble: การแสดงเนื้อหาที่น่าสนใจเป็นเครื่องมือในการเตรียมความพร้อมให้ผู้ใช้ใหม่ที่อาจไม่รู้จักใครก็ตามใน Mastodon ควบคุมวิธีที่คุณลักษณะการค้นพบต่าง ๆ ทำงานในเซิร์ฟเวอร์ของคุณ
+ privacy: ความเป็นส่วนตัว
profile_directory: ไดเรกทอรีโปรไฟล์
public_timelines: เส้นเวลาสาธารณะ
publish_statistics: เผยแพร่สถิติ
diff --git a/config/locales/vi.yml b/config/locales/vi.yml
index 271683c238..93ab1fb811 100644
--- a/config/locales/vi.yml
+++ b/config/locales/vi.yml
@@ -60,7 +60,7 @@ vi:
destroyed_msg: Dữ liệu %{username} sẽ được lên lịch xóa ngay bây giờ
disable: Khóa
disable_sign_in_token_auth: Tắt xác minh bằng email
- disable_two_factor_authentication: Vô hiệu hóa xác minh 2 bước
+ disable_two_factor_authentication: Vô hiệu hóa xác thực 2 bước
disabled: Tạm khóa
display_name: Biệt danh
domain: Máy chủ
@@ -265,7 +265,7 @@ vi:
destroy_status_html: "%{name} đã xóa tút của %{target}"
destroy_unavailable_domain_html: "%{name} tiếp tục liên hợp với máy chủ %{target}"
destroy_user_role_html: "%{name} đã xóa vai trò %{target}"
- disable_2fa_user_html: "%{name} đã vô hiệu hóa xác minh hai bước của %{target}"
+ disable_2fa_user_html: "%{name} đã vô hiệu hóa xác thực 2 bước của %{target}"
disable_custom_emoji_html: "%{name} đã ẩn emoji %{target}"
disable_relay_html: "%{name} đã tắt relay %{target}"
disable_sign_in_token_auth_user_html: "%{name} đã tắt xác minh email của %{target}"
@@ -765,7 +765,7 @@ vi:
manage_taxonomies: Quản lý phân loại
manage_taxonomies_description: Cho phép đánh giá nội dung xu hướng và cập nhật cài đặt hashtag
manage_user_access: Quản lý người truy cập
- manage_user_access_description: Cho phép người dùng tắt xác minh hai bước của người khác, đổi địa chỉ email và đặt lại mật khẩu của họ
+ manage_user_access_description: Cho phép người dùng tắt xác thực 2 bước của người khác, đổi địa chỉ email và đặt lại mật khẩu của họ
manage_users: Quản lý người
manage_users_description: Cho phép xem thông tin chi tiết của người khác và thực hiện các hành động kiểm duyệt
manage_webhooks: Quản lý Webhook
@@ -1524,11 +1524,11 @@ vi:
limit: Bạn đã đạt đến số lượng danh sách tối đa
login_activities:
authentication_methods:
- otp: xác minh 2 bước
+ otp: xác thực 2 bước
password: mật khẩu
sign_in_token: mã an toàn email
webauthn: khóa bảo mật
- description_html: Nếu có lần đăng nhập đáng ngờ, hãy đổi ngay mật khẩu và bật xác minh 2 bước.
+ description_html: Nếu có lần đăng nhập đáng ngờ, hãy đổi ngay mật khẩu và bật xác thực 2 bước.
empty: Không có lịch sử đăng nhập
failed_sign_in_html: Đăng nhập thất bại bằng %{method} từ %{ip} (%{browser})
successful_sign_in_html: Đăng nhập bằng %{method} từ %{ip} (%{browser})
@@ -1795,7 +1795,7 @@ vi:
severed_relationships: Quan hệ đứt gãy
statuses_cleanup: Tự động xóa tút cũ
strikes: Lần cảnh cáo
- two_factor_authentication: Xác minh 2 bước
+ two_factor_authentication: Xác thực 2 bước
webauthn_authentication: Khóa bảo mật
severed_relationships:
download: Tải xuống (%{count})
@@ -1911,10 +1911,10 @@ vi:
two_factor_authentication:
add: Thêm
disable: Vô hiệu hóa
- disabled_success: Đã vô hiệu hóa xác minh 2 bước
+ disabled_success: Đã vô hiệu hóa xác thực 2 bước
edit: Sửa
- enabled: Đã kích hoạt xác minh 2 bước
- enabled_success: Xác minh 2 bước được kích hoạt thành công
+ enabled: Đã kích hoạt xác thực 2 bước
+ enabled_success: Xác thực 2 bước được kích hoạt thành công
generate_recovery_codes: Tạo mã khôi phục
lost_recovery_codes: Mã khôi phục cho phép bạn lấy lại quyền truy cập vào tài khoản của mình nếu bạn mất điện thoại. Nếu bạn bị mất mã khôi phục, bạn có thể tạo lại chúng ở đây. Mã khôi phục cũ của bạn sẽ bị vô hiệu.
methods: Phương pháp xác minh
@@ -1948,13 +1948,13 @@ vi:
details: 'Chi tiết thông tin đăng nhập:'
explanation: Ai đó đã cố đăng nhập vào tài khoản của bạn nhưng cung cấp yếu tố xác thực thứ hai không hợp lệ.
further_actions_html: Nếu không phải bạn, hãy lập tức %{action} vì có thể có rủi ro.
- subject: Xác minh hai bước thất bại
- title: Xác minh hai bước thất bại
+ subject: Xác thực 2 bước thất bại
+ title: Xác thực 2 bước thất bại
suspicious_sign_in:
change_password: đổi mật khẩu của bạn
details: 'Chi tiết thông tin đăng nhập:'
explanation: Chúng tôi phát hiện tài khoản của bạn đăng nhập bất thường từ một địa chỉ IP mới.
- further_actions_html: Nếu đây không phải là bạn, hãy %{action} lập tức và bật xác minh hai bước để giữ tài khoản được an toàn.
+ further_actions_html: Nếu đây không phải là bạn, hãy %{action} lập tức và bật xác thực 2 bước để giữ tài khoản được an toàn.
subject: Đăng nhập tài khoản từ địa chỉ IP mới
title: Lần đăng nhập mới
terms_of_service_changed:
@@ -2039,7 +2039,7 @@ vi:
users:
follow_limit_reached: Bạn chỉ có thể theo dõi tối đa %{limit} người
go_to_sso_account_settings: Thiết lập tài khoản nhà cung cấp danh tính
- invalid_otp_token: Mã xác minh 2 bước không hợp lệ
+ invalid_otp_token: Mã xác thực 2 bước không hợp lệ
otp_lost_help_html: Nếu bạn mất quyền truy cập vào cả hai, bạn có thể đăng nhập bằng %{email}
rate_limited: Quá nhiều lần thử, vui lòng thử lại sau.
seamless_external_login: Bạn đã đăng nhập thông qua một dịch vụ bên ngoài, vì vậy mật khẩu và email không khả dụng.
@@ -2067,5 +2067,5 @@ vi:
nickname_hint: Nhập tên mới cho khóa bảo mật của bạn
not_enabled: Bạn chưa kích hoạt WebAuthn
not_supported: Trình duyệt của bạn không hỗ trợ khóa bảo mật
- otp_required: Để dùng khóa bảo mật, trước tiên hãy kích hoạt xác minh 2 bước.
+ otp_required: Để dùng khóa bảo mật, trước tiên hãy kích hoạt xác thực 2 bước.
registered_on: Đăng ký vào %{date}
From fdefc4d2b4b955729b0ff0b2c5ca4ffb10a5e70b Mon Sep 17 00:00:00 2001
From: Claire
Date: Mon, 7 Jul 2025 11:22:22 +0200
Subject: [PATCH 25/29] Add ability to manually trigger i18n uploads (#35279)
---
.github/workflows/crowdin-upload.yml | 1 +
1 file changed, 1 insertion(+)
diff --git a/.github/workflows/crowdin-upload.yml b/.github/workflows/crowdin-upload.yml
index 4f4d917d15..d0d79d9199 100644
--- a/.github/workflows/crowdin-upload.yml
+++ b/.github/workflows/crowdin-upload.yml
@@ -14,6 +14,7 @@ on:
- config/locales/devise.en.yml
- config/locales/doorkeeper.en.yml
- .github/workflows/crowdin-upload.yml
+ workflow_dispatch:
jobs:
upload-translations:
From b5eebd4d2ba22fe5ae763fd6cc0fe24649d282a4 Mon Sep 17 00:00:00 2001
From: diondiondion
Date: Mon, 7 Jul 2025 17:10:51 +0200
Subject: [PATCH 26/29] fix: Fix can't skip search field by tabbing (#35281)
---
.../features/compose/components/search.tsx | 51 ++++++++++++++-----
1 file changed, 39 insertions(+), 12 deletions(-)
diff --git a/app/javascript/mastodon/features/compose/components/search.tsx b/app/javascript/mastodon/features/compose/components/search.tsx
index ae242190e8..2d44772ba2 100644
--- a/app/javascript/mastodon/features/compose/components/search.tsx
+++ b/app/javascript/mastodon/features/compose/components/search.tsx
@@ -47,10 +47,6 @@ const labelForRecentSearch = (search: RecentSearch) => {
}
};
-const unfocus = () => {
- document.querySelector('.ui')?.parentElement?.focus();
-};
-
const ClearButton: React.FC<{
onClick: () => void;
hasValue: boolean;
@@ -107,6 +103,11 @@ export const Search: React.FC<{
}, [initialValue]);
const searchOptions: SearchOption[] = [];
+ const unfocus = useCallback(() => {
+ document.querySelector('.ui')?.parentElement?.focus();
+ setExpanded(false);
+ }, []);
+
if (searchEnabled) {
searchOptions.push(
{
@@ -282,7 +283,7 @@ export const Search: React.FC<{
history.push({ pathname: '/search', search: queryParams.toString() });
unfocus();
},
- [dispatch, history],
+ [dispatch, history, unfocus],
);
const handleChange = useCallback(
@@ -402,7 +403,7 @@ export const Search: React.FC<{
setQuickActions(newQuickActions);
},
- [dispatch, history, signedIn, setValue, setQuickActions, submit],
+ [signedIn, dispatch, unfocus, history, submit],
);
const handleClear = useCallback(() => {
@@ -410,7 +411,7 @@ export const Search: React.FC<{
setQuickActions([]);
setSelectedOption(-1);
unfocus();
- }, [setValue, setQuickActions, setSelectedOption]);
+ }, [unfocus]);
const handleKeyDown = useCallback(
(e: React.KeyboardEvent) => {
@@ -461,7 +462,7 @@ export const Search: React.FC<{
break;
}
},
- [navigableOptions, value, selectedOption, setSelectedOption, submit],
+ [unfocus, navigableOptions, selectedOption, submit, value],
);
const handleFocus = useCallback(() => {
@@ -481,12 +482,38 @@ export const Search: React.FC<{
}, [setExpanded, setSelectedOption, singleColumn]);
const handleBlur = useCallback(() => {
- setExpanded(false);
setSelectedOption(-1);
- }, [setExpanded, setSelectedOption]);
+ }, [setSelectedOption]);
+
+ const formRef = useRef(null);
+
+ useEffect(() => {
+ // If the search popover is expanded, close it when tabbing or
+ // clicking outside of it or the search form, while allowing
+ // tabbing or clicking inside of the popover
+ if (expanded) {
+ function closeOnLeave(event: FocusEvent | MouseEvent) {
+ const form = formRef.current;
+ const isClickInsideForm =
+ form &&
+ (form === event.target || form.contains(event.target as Node));
+ if (!isClickInsideForm) {
+ setExpanded(false);
+ }
+ }
+ document.addEventListener('focusin', closeOnLeave);
+ document.addEventListener('click', closeOnLeave);
+
+ return () => {
+ document.removeEventListener('focusin', closeOnLeave);
+ document.removeEventListener('click', closeOnLeave);
+ };
+ }
+ return () => null;
+ }, [expanded]);
return (
-