From f0359af35874b29d0e0db330598a8c36094c0d2e Mon Sep 17 00:00:00 2001 From: Renaud Chaput Date: Wed, 3 Jun 2026 11:36:50 +0200 Subject: [PATCH 001/130] Change Mastodon gGmbH => Mastodon GmbH (#39261) --- app/javascript/mastodon/features/about/index.jsx | 2 +- app/javascript/mastodon/locales/en.json | 2 +- config/templates/terms-of-service.md | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/app/javascript/mastodon/features/about/index.jsx b/app/javascript/mastodon/features/about/index.jsx index 85b76aee32e..83f5bf60258 100644 --- a/app/javascript/mastodon/features/about/index.jsx +++ b/app/javascript/mastodon/features/about/index.jsx @@ -168,7 +168,7 @@ class About extends PureComponent {
-

+

diff --git a/app/javascript/mastodon/locales/en.json b/app/javascript/mastodon/locales/en.json index 810fe1da944..8df8070ed1a 100644 --- a/app/javascript/mastodon/locales/en.json +++ b/app/javascript/mastodon/locales/en.json @@ -2,7 +2,7 @@ "about.blocks": "Moderated servers", "about.contact": "Contact:", "about.default_locale": "Default", - "about.disclaimer": "Mastodon is free, open-source software, and a trademark of Mastodon gGmbH.", + "about.disclaimer": "Mastodon is free, open-source software, and a trademark of Mastodon GmbH.", "about.domain_blocks.no_reason_available": "Reason not available", "about.domain_blocks.preamble": "Mastodon generally allows you to view content from and interact with users from any other server in the fediverse. These are the exceptions that have been made on this particular server.", "about.domain_blocks.silenced.explanation": "You will generally not see profiles and content from this server, unless you explicitly look it up or opt into it by following.", diff --git a/config/templates/terms-of-service.md b/config/templates/terms-of-service.md index b2e32f76b96..348bf18701e 100644 --- a/config/templates/terms-of-service.md +++ b/config/templates/terms-of-service.md @@ -4,7 +4,7 @@ These terms of service (the "Terms") cover your access and use of Server Operator's ("Administrator", "we", or "us") instance, located at %{domain} (the "Instance"). These Terms apply solely to your use of the Instance as operated by the Administrator. Please note that we have no affiliation with Mastodon -gGmbH (“Mastodon”) and these Terms do not contain any representations or +GmbH (“Mastodon”) and these Terms do not contain any representations or warranties or other promises from Mastodon about your use of the Instance. If you would like to contact us for any reason, please direct all questions, comments, concerns and notices to us by following the instructions provided in From c2daca655fb8b4667ff068a318f45066988fbaf3 Mon Sep 17 00:00:00 2001 From: Claire Date: Wed, 3 Jun 2026 11:57:50 +0200 Subject: [PATCH 002/130] Merge commit from fork --- app/helpers/context_helper.rb | 2 +- app/services/activitypub/process_account_service.rb | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/app/helpers/context_helper.rb b/app/helpers/context_helper.rb index 1677c2d02ea..f7e74481b2d 100644 --- a/app/helpers/context_helper.rb +++ b/app/helpers/context_helper.rb @@ -25,7 +25,7 @@ module ContextHelper memorial: { 'toot' => 'http://joinmastodon.org/ns#', 'memorial' => 'toot:memorial' }, voters_count: { 'toot' => 'http://joinmastodon.org/ns#', 'votersCount' => 'toot:votersCount' }, suspended: { 'toot' => 'http://joinmastodon.org/ns#', 'suspended' => 'toot:suspended' }, - attribution_domains: { 'toot' => 'http://joinmastodon.org/ns#', 'attributionDomains' => { '@id' => 'toot:attributionDomains', '@type' => '@id' } }, + attribution_domains: { 'toot' => 'http://joinmastodon.org/ns#', 'attributionDomains' => { '@id' => 'toot:attributionDomains', '@container' => '@set' } }, profile_settings: { 'toot' => 'http://joinmastodon.org/ns#', 'showFeatured' => 'toot:showFeatured', diff --git a/app/services/activitypub/process_account_service.rb b/app/services/activitypub/process_account_service.rb index e616400c934..d4b38162a8d 100644 --- a/app/services/activitypub/process_account_service.rb +++ b/app/services/activitypub/process_account_service.rb @@ -150,7 +150,7 @@ class ActivityPub::ProcessAccountService < BaseService @account.show_featured = @json['showFeatured'] if @json.key?('showFeatured') @account.show_media = @json['showMedia'] if @json.key?('showMedia') @account.show_media_replies = @json['showRepliesInMedia'] if @json.key?('showRepliesInMedia') - @account.attribution_domains = as_array(@json['attributionDomains'] || []).take(Account::ATTRIBUTION_DOMAINS_HARD_LIMIT).map { |item| value_or_id(item) } + @account.attribution_domains = as_array(@json['attributionDomains'] || []).take(Account::ATTRIBUTION_DOMAINS_HARD_LIMIT).filter { |item| item.is_a?(String) } end def set_fetchable_key! From 07236016bcc78a82205093b3e067bf4a1bb07d88 Mon Sep 17 00:00:00 2001 From: "Pia B." Date: Wed, 3 Jun 2026 12:12:37 +0200 Subject: [PATCH 003/130] Merge commit from fork * add guard clause to check for node attributes * check for encoding attribute specifically * check for encoding attribute specifically * change spec --- lib/sanitize_ext/sanitize_config.rb | 4 +++- spec/lib/sanitize/config_spec.rb | 8 ++++++++ 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/lib/sanitize_ext/sanitize_config.rb b/lib/sanitize_ext/sanitize_config.rb index f30eec476cc..3c3d697eda9 100644 --- a/lib/sanitize_ext/sanitize_config.rb +++ b/lib/sanitize_ext/sanitize_config.rb @@ -83,8 +83,10 @@ class Sanitize # next, we find the plain-text description is_annotation_with_encoding = lambda do |encoding, node| return false unless node.name == 'annotation' + encoding_attr = node.attributes['encoding'] + return false if encoding_attr.nil? - node.attributes['encoding'].value == encoding + encoding_attr.value == encoding end annotation = semantics.children.find(&is_annotation_with_encoding.curry['application/x-tex']) diff --git a/spec/lib/sanitize/config_spec.rb b/spec/lib/sanitize/config_spec.rb index b4c849c427a..7baa1423b7c 100644 --- a/spec/lib/sanitize/config_spec.rb +++ b/spec/lib/sanitize/config_spec.rb @@ -38,6 +38,14 @@ RSpec.describe Sanitize::Config do expect(Sanitize.fragment('Test<a href="https://example.com">test</a>', subject)).to eq 'Test<a href="https://example.com">test</a>' end + it 'removes math when unparsable due to missing attributes' do + expect(Sanitize.fragment('x', subject)).to eq '' + end + + it 'removes math when unparsable due to missing encoding attribute' do + expect(Sanitize.fragment('x', subject)).to eq '' + end + it 'keeps a with href' do expect(Sanitize.fragment('Test', subject)).to eq 'Test' end From 0529a1f7d2197dd535f59163c00634f9c060723d Mon Sep 17 00:00:00 2001 From: Claire Date: Wed, 3 Jun 2026 14:26:55 +0200 Subject: [PATCH 004/130] Bump version to v4.5.11 (#39264) --- CHANGELOG.md | 12 ++++++++++++ app/services/activitypub/process_account_service.rb | 2 +- docker-compose.yml | 6 +++--- lib/mastodon/version.rb | 2 +- lib/sanitize_ext/sanitize_config.rb | 1 + 5 files changed, 18 insertions(+), 5 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 15b25a4c38e..d4201950d22 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,18 @@ All notable changes to this project will be documented in this file. +## [4.5.11] - 2026-06-03 + +### Security + +- Fix allowed attribution domains spoofing ([GHSA-rwcw-vq68-g34p](https://github.com/mastodon/mastodon/security/advisories/GHSA-rwcw-vq68-g34p)) +- Fix uncaught exception in message sanitization causing Denial of Service ([GHSA-qrgq-9fx2-vf2r](https://github.com/mastodon/mastodon/security/advisories/GHSA-qrgq-9fx2-vf2r)) +- Update dependencies + +### Fixed + +- Fix remote statuses with large media descriptions being rejected (#39135 by @ClearlyClaire) + ## [4.5.10] - 2026-05-20 ### Security diff --git a/app/services/activitypub/process_account_service.rb b/app/services/activitypub/process_account_service.rb index d4b38162a8d..d027c0c3a70 100644 --- a/app/services/activitypub/process_account_service.rb +++ b/app/services/activitypub/process_account_service.rb @@ -150,7 +150,7 @@ class ActivityPub::ProcessAccountService < BaseService @account.show_featured = @json['showFeatured'] if @json.key?('showFeatured') @account.show_media = @json['showMedia'] if @json.key?('showMedia') @account.show_media_replies = @json['showRepliesInMedia'] if @json.key?('showRepliesInMedia') - @account.attribution_domains = as_array(@json['attributionDomains'] || []).take(Account::ATTRIBUTION_DOMAINS_HARD_LIMIT).filter { |item| item.is_a?(String) } + @account.attribution_domains = as_array(@json['attributionDomains'] || []).take(Account::ATTRIBUTION_DOMAINS_HARD_LIMIT).grep(String) end def set_fetchable_key! diff --git a/docker-compose.yml b/docker-compose.yml index 35d08b89967..14998d6e827 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -59,7 +59,7 @@ services: web: # You can uncomment the following line if you want to not use the prebuilt image, for example if you have local code changes # build: . - image: ghcr.io/mastodon/mastodon:v4.5.10 + image: ghcr.io/mastodon/mastodon:v4.5.11 restart: always env_file: .env.production command: bundle exec puma -C config/puma.rb @@ -83,7 +83,7 @@ services: # build: # dockerfile: ./streaming/Dockerfile # context: . - image: ghcr.io/mastodon/mastodon-streaming:v4.5.10 + image: ghcr.io/mastodon/mastodon-streaming:v4.5.11 restart: always env_file: .env.production command: node ./streaming/index.js @@ -102,7 +102,7 @@ services: sidekiq: # You can uncomment the following line if you want to not use the prebuilt image, for example if you have local code changes # build: . - image: ghcr.io/mastodon/mastodon:v4.5.10 + image: ghcr.io/mastodon/mastodon:v4.5.11 restart: always env_file: .env.production command: bundle exec sidekiq diff --git a/lib/mastodon/version.rb b/lib/mastodon/version.rb index 6d5353eefc9..711cf067392 100644 --- a/lib/mastodon/version.rb +++ b/lib/mastodon/version.rb @@ -17,7 +17,7 @@ module Mastodon end def default_prerelease - 'alpha.8' + 'alpha.9' end def prerelease diff --git a/lib/sanitize_ext/sanitize_config.rb b/lib/sanitize_ext/sanitize_config.rb index 3c3d697eda9..618722bcae7 100644 --- a/lib/sanitize_ext/sanitize_config.rb +++ b/lib/sanitize_ext/sanitize_config.rb @@ -83,6 +83,7 @@ class Sanitize # next, we find the plain-text description is_annotation_with_encoding = lambda do |encoding, node| return false unless node.name == 'annotation' + encoding_attr = node.attributes['encoding'] return false if encoding_attr.nil? From c5432e3a0976fe158b1eb2ed717b4dd94f6793ec Mon Sep 17 00:00:00 2001 From: David Roetzel Date: Wed, 3 Jun 2026 15:01:32 +0200 Subject: [PATCH 005/130] Remove `featuredObjectType` property (#39260) --- app/serializers/activitypub/featured_item_serializer.rb | 7 +------ .../activitypub/featured_collection_serializer_spec.rb | 2 -- .../activitypub/featured_item_serializer_spec.rb | 2 -- 3 files changed, 1 insertion(+), 10 deletions(-) diff --git a/app/serializers/activitypub/featured_item_serializer.rb b/app/serializers/activitypub/featured_item_serializer.rb index 529bfd797f6..4620c2d71ae 100644 --- a/app/serializers/activitypub/featured_item_serializer.rb +++ b/app/serializers/activitypub/featured_item_serializer.rb @@ -3,8 +3,7 @@ class ActivityPub::FeaturedItemSerializer < ActivityPub::Serializer include RoutingHelper - attributes :id, :type, :featured_object, :featured_object_type, - :feature_authorization, :published + attributes :id, :type, :featured_object, :feature_authorization, :published def id ActivityPub::TagManager.instance.uri_for(object) @@ -18,10 +17,6 @@ class ActivityPub::FeaturedItemSerializer < ActivityPub::Serializer ActivityPub::TagManager.instance.uri_for(object.account) end - def featured_object_type - object.account.actor_type || 'Person' - end - def feature_authorization if object.account.local? ap_account_feature_authorization_url(object.account_id, object) diff --git a/spec/serializers/activitypub/featured_collection_serializer_spec.rb b/spec/serializers/activitypub/featured_collection_serializer_spec.rb index df582237ab8..c68f826aa37 100644 --- a/spec/serializers/activitypub/featured_collection_serializer_spec.rb +++ b/spec/serializers/activitypub/featured_collection_serializer_spec.rb @@ -37,7 +37,6 @@ RSpec.describe ActivityPub::FeaturedCollectionSerializer do 'id' => ActivityPub::TagManager.instance.uri_for(collection_items.first), 'type' => 'FeaturedItem', 'featuredObject' => ActivityPub::TagManager.instance.uri_for(collection_items.first.account), - 'featuredObjectType' => 'Person', 'featureAuthorization' => ap_account_feature_authorization_url(collection_items.first.account_id, collection_items.first), 'published' => match_api_datetime_format, }, @@ -45,7 +44,6 @@ RSpec.describe ActivityPub::FeaturedCollectionSerializer do 'id' => ActivityPub::TagManager.instance.uri_for(collection_items.last), 'type' => 'FeaturedItem', 'featuredObject' => ActivityPub::TagManager.instance.uri_for(collection_items.last.account), - 'featuredObjectType' => 'Person', 'featureAuthorization' => ap_account_feature_authorization_url(collection_items.last.account_id, collection_items.last), 'published' => match_api_datetime_format, }, diff --git a/spec/serializers/activitypub/featured_item_serializer_spec.rb b/spec/serializers/activitypub/featured_item_serializer_spec.rb index 18afdd10fee..010f355f6d3 100644 --- a/spec/serializers/activitypub/featured_item_serializer_spec.rb +++ b/spec/serializers/activitypub/featured_item_serializer_spec.rb @@ -15,7 +15,6 @@ RSpec.describe ActivityPub::FeaturedItemSerializer do 'type' => 'FeaturedItem', 'id' => ActivityPub::TagManager.instance.uri_for(collection_item), 'featuredObject' => ActivityPub::TagManager.instance.uri_for(collection_item.account), - 'featuredObjectType' => 'Person', 'featureAuthorization' => ap_account_feature_authorization_url(collection_item.account_id, collection_item), 'published' => '2026-04-16T01:00:00Z', }) @@ -32,7 +31,6 @@ RSpec.describe ActivityPub::FeaturedItemSerializer do 'type' => 'FeaturedItem', 'id' => ActivityPub::TagManager.instance.uri_for(collection_item), 'featuredObject' => ActivityPub::TagManager.instance.uri_for(collection_item.account), - 'featuredObjectType' => 'Person', 'featureAuthorization' => 'https://example.com/auth/1', }) end From 0172d819f7882db3dd4f1350c01e5d728924bc86 Mon Sep 17 00:00:00 2001 From: Echo Date: Wed, 3 Jun 2026 15:17:21 +0200 Subject: [PATCH 006/130] Remove PWA plugin (#39250) --- app/javascript/mastodon/main.tsx | 43 +- .../mastodon/service_worker/caching.test.ts | 390 +++++++ .../mastodon/service_worker/caching.ts | 143 +++ app/javascript/mastodon/service_worker/sw.js | 88 -- app/javascript/mastodon/service_worker/sw.ts | 22 + package.json | 8 +- vite.config.mts | 36 +- yarn.lock | 979 +----------------- 8 files changed, 618 insertions(+), 1091 deletions(-) create mode 100644 app/javascript/mastodon/service_worker/caching.test.ts create mode 100644 app/javascript/mastodon/service_worker/caching.ts delete mode 100644 app/javascript/mastodon/service_worker/sw.js create mode 100644 app/javascript/mastodon/service_worker/sw.ts diff --git a/app/javascript/mastodon/main.tsx b/app/javascript/mastodon/main.tsx index ccefd7f366d..c87eeb40cea 100644 --- a/app/javascript/mastodon/main.tsx +++ b/app/javascript/mastodon/main.tsx @@ -10,7 +10,7 @@ import { me, reduceMotion } from 'mastodon/initial_state'; import ready from 'mastodon/ready'; import { store } from 'mastodon/store'; -import { isProduction, isDevelopment } from './utils/environment'; +import { isDevelopment, isProduction } from './utils/environment'; function main() { perf.start('main()'); @@ -41,29 +41,30 @@ function main() { ); store.dispatch(setupBrowserNotifications()); - if (isProduction() && me && 'serviceWorker' in navigator) { - const { Workbox } = await import('workbox-window'); - const wb = new Workbox( - isDevelopment() ? '/packs-dev/dev-sw.js?dev-sw' : '/sw.js', - { type: 'module', scope: '/' }, - ); - let registration; - - try { - registration = await wb.register(); - } catch (err) { - console.error(err); + if ( + me && + 'serviceWorker' in navigator && + (isDevelopment() || isProduction()) // Disallow testing environment + ) { + let swPath = '/sw.js'; + if (isDevelopment()) { + const { default: swDevUrl } = + await import('@/mastodon/service_worker/sw?url'); + swPath = swDevUrl; } - if ( - registration && - 'Notification' in window && - Notification.permission === 'granted' - ) { - const registerPushNotifications = - await import('mastodon/actions/push_notifications'); + await navigator.serviceWorker.register(swPath, { + scope: '/', + type: 'module', + }); - store.dispatch(registerPushNotifications.register()); + if (isProduction()) { + if ('Notification' in window && Notification.permission === 'granted') { + const registerPushNotifications = + await import('mastodon/actions/push_notifications'); + + store.dispatch(registerPushNotifications.register()); + } } } diff --git a/app/javascript/mastodon/service_worker/caching.test.ts b/app/javascript/mastodon/service_worker/caching.test.ts new file mode 100644 index 00000000000..3d67604c35f --- /dev/null +++ b/app/javascript/mastodon/service_worker/caching.test.ts @@ -0,0 +1,390 @@ +import { DAY } from '../utils/time'; + +import { expireCachedItems, handleFetch } from './caching'; + +const now = 1_700_000_000_000; + +describe('expireCachedItems', () => { + beforeEach(() => { + vi.useFakeTimers(); + vi.setSystemTime(now); + }); + + afterEach(() => { + vi.useRealTimers(); + vi.unstubAllGlobals(); + }); + + test('deletes expired entries and requests without a cached response', async () => { + const cache = new MockCache(); + const missingRequest = new Request('https://example.com/missing'); + + cache.set('/fresh', now - DAY); + cache.set('/expired', now - DAY * 31); + cache.store.set(missingRequest.url, { request: missingRequest }); + + vi.stubGlobal('caches', { + open: vi.fn().mockResolvedValue(cache), + }); + + await expireCachedItems({ name: 'images', ttl: DAY * 30, max: 5 }); + + expect(Array.from(cache.store.keys())).toEqual([ + 'https://example.com/fresh', + ]); + }); + + test('trims the oldest valid entries when the cache exceeds max size', async () => { + const cache = new MockCache(); + + cache.set('/oldest', now - DAY * 3); + cache.set('/older', now - DAY * 2); + cache.set('/newest', now - DAY); + + vi.stubGlobal('caches', { + open: vi.fn().mockResolvedValue(cache), + }); + + await expireCachedItems({ name: 'images', ttl: DAY * 30, max: 2 }); + + expect(Array.from(cache.store.keys())).toEqual([ + 'https://example.com/older', + 'https://example.com/newest', + ]); + }); + + test('keeps entries without a timestamp header over timestamped entries', async () => { + const cache = new MockCache(); + const untimestampedRequest = new Request('https://example.com/no-header'); + + cache.store.set(untimestampedRequest.url, { + request: untimestampedRequest, + response: createResponse(), + }); + cache.set('/older', now - DAY * 2); + cache.set('/newer', now - DAY); + + vi.stubGlobal('caches', { + open: vi.fn().mockResolvedValue(cache), + }); + + await expireCachedItems({ name: 'images', ttl: DAY * 30, max: 2 }); + + expect(Array.from(cache.store.keys())).toEqual([ + 'https://example.com/no-header', + 'https://example.com/newer', + ]); + }); +}); + +describe('handleFetch', () => { + beforeEach(() => { + vi.useFakeTimers(); + vi.setSystemTime(now); + }); + + afterEach(() => { + vi.useRealTimers(); + vi.unstubAllGlobals(); + }); + + test('serves cached images without hitting the network while the TTL is valid', async () => { + const imageCache = new MockCache(); + const request = createRequest('/test.png', 'image'); + const cachedResponse = createResponse(now - DAY); + + imageCache.store.set(request.url, { request, response: cachedResponse }); + + vi.stubGlobal('caches', { + open: vi.fn().mockResolvedValue(imageCache), + }); + + const fetch = vi.fn(); + vi.stubGlobal('fetch', fetch); + + const { event, respondWith } = createFetchEvent(request); + + handleFetch(event); + + await expect(respondWith()).resolves.toBe(cachedResponse); + expect(fetch).not.toHaveBeenCalled(); + }); + + test('fetches stale cached images from the network and stores a refreshed response', async () => { + const imageCache = new MockCache(); + const request = createRequest('/stale.png', 'image'); + const networkResponse = new Response('fresh', { + headers: { 'content-type': 'image/png' }, + status: 200, + statusText: 'OK', + }); + const putSpy = vi.spyOn(imageCache, 'put'); + + imageCache.store.set(request.url, { + request, + response: createResponse(now - DAY * 8), + }); + + vi.stubGlobal('caches', { + open: vi.fn().mockResolvedValue(imageCache), + }); + + const fetch = vi.fn().mockResolvedValue(networkResponse); + vi.stubGlobal('fetch', fetch); + + const { event, respondWith } = createFetchEvent(request); + + handleFetch(event); + + await expect(respondWith()).resolves.toBe(networkResponse); + expect(fetch).toHaveBeenCalledWith(request); + expect(putSpy).toHaveBeenCalledWith(request, expect.any(Response)); + expect( + imageCache.store.get(request.url)?.response?.headers.get('x-timestamp'), + ).toBe(now.toString()); + }); + + test('does not cache opaque image responses with status zero', async () => { + const imageCache = new MockCache(); + const request = createRequest('/opaque.png', 'image'); + const opaqueResponse = Response.error(); + const putSpy = vi.spyOn(imageCache, 'put'); + + vi.stubGlobal('caches', { + open: vi.fn().mockResolvedValue(imageCache), + }); + + const fetch = vi.fn().mockResolvedValue(opaqueResponse); + vi.stubGlobal('fetch', fetch); + + const { event, respondWith } = createFetchEvent(request); + + handleFetch(event); + + await expect(respondWith()).resolves.toBe(opaqueResponse); + expect(fetch).toHaveBeenCalledWith(request); + expect(putSpy).not.toHaveBeenCalled(); + expect(imageCache.store.size).toBe(0); + }); + + test.each([ + ['/intl/en.js', '', 'mastodon-locales'], + ['/fonts/mastodon.woff2', 'font', 'mastodon-fonts'], + ])( + 'routes %s requests through %s', + async (pathname, destination, cacheName) => { + const cache = new MockCache(); + const request = createRequest(pathname, destination); + const networkResponse = new Response('asset', { status: 200 }); + const open = vi.fn().mockImplementation((name: string) => { + expect(name).toBe(cacheName); + return Promise.resolve(cache); + }); + + vi.stubGlobal('caches', { open }); + + const fetch = vi.fn().mockResolvedValue(networkResponse); + vi.stubGlobal('fetch', fetch); + + const { event, respondWith } = createFetchEvent(request); + + handleFetch(event); + + await expect(respondWith()).resolves.toBe(networkResponse); + expect(fetch).toHaveBeenCalledWith(request); + expect(open).toHaveBeenCalledWith(cacheName); + }, + ); + + test('clears the root cache after a successful logout request', async () => { + const webCache = new MockCache(); + const deleteSpy = vi.spyOn(webCache, 'delete'); + + vi.stubGlobal('caches', { + open: vi.fn().mockImplementation((name: string) => { + expect(name).toBe('mastodon-web'); + return Promise.resolve(webCache); + }), + }); + + const fetch = vi + .fn() + .mockResolvedValue(new Response(null, { status: 200 })); + vi.stubGlobal('fetch', fetch); + + const { event, respondWith } = createFetchEvent( + createRequest('/auth/sign_out'), + ); + + handleFetch(event); + + await expect(respondWith()).resolves.toBeInstanceOf(Response); + expect(deleteSpy).toHaveBeenCalledWith('/'); + }); + + test('does not clear the root cache after a failed logout request', async () => { + const webCache = new MockCache(); + const deleteSpy = vi.spyOn(webCache, 'delete'); + + vi.stubGlobal('caches', { + open: vi.fn().mockResolvedValue(webCache), + }); + + const fetch = vi + .fn() + .mockResolvedValue( + new Response(null, { status: 500, statusText: 'Error' }), + ); + vi.stubGlobal('fetch', fetch); + + const { event, respondWith } = createFetchEvent( + createRequest('/auth/sign_out'), + ); + + handleFetch(event); + + await expect(respondWith()).resolves.toBeInstanceOf(Response); + expect(deleteSpy).not.toHaveBeenCalled(); + }); + + test('clears the root cache for opaqueredirect logout responses', async () => { + const webCache = new MockCache(); + const deleteSpy = vi.spyOn(webCache, 'delete'); + const opaqueRedirectResponse = { + ok: false, + type: 'opaqueredirect', + } as Response; + + vi.stubGlobal('caches', { + open: vi.fn().mockResolvedValue(webCache), + }); + + const fetch = vi.fn().mockResolvedValue(opaqueRedirectResponse); + vi.stubGlobal('fetch', fetch); + + const { event, respondWith } = createFetchEvent( + createRequest('/auth/sign_out'), + ); + + handleFetch(event); + + await expect(respondWith()).resolves.toBe(opaqueRedirectResponse); + expect(deleteSpy).toHaveBeenCalledWith('/'); + }); + + test('ignores requests that are not handled by the service worker cache', () => { + const { event, respondWith, respondWithMock } = createFetchEvent( + createRequest('/api/v1/timelines/home'), + ); + + handleFetch(event); + + expect(respondWithMock).not.toHaveBeenCalled(); + expect(respondWith()).toBeUndefined(); + }); +}); + +interface CacheEntry { + request: Request; + response?: Response; +} + +class MockCache implements Cache { + public readonly store = new Map(); + + private normalizeRequest(request: RequestInfo | URL) { + if (request instanceof Request) { + return request.url; + } + + return request.toString(); + } + + add(): Promise { + return Promise.reject(new Error('Not implemented')); + } + + addAll(): Promise { + return Promise.reject(new Error('Not implemented')); + } + + delete(request: RequestInfo | URL): Promise { + return Promise.resolve(this.store.delete(this.normalizeRequest(request))); + } + + keys(): Promise { + return Promise.resolve( + Array.from(this.store.values(), ({ request }) => request), + ); + } + + match(request: RequestInfo | URL): Promise { + return Promise.resolve( + this.store.get(this.normalizeRequest(request))?.response, + ); + } + + matchAll(): Promise { + return Promise.reject(new Error('Not implemented')); + } + + put(request: RequestInfo | URL, response: Response): Promise { + const normalizedRequest = + request instanceof Request ? request : new Request(request); + + this.store.set(this.normalizeRequest(normalizedRequest), { + request: normalizedRequest, + response, + }); + + return Promise.resolve(); + } + + set(pathname: string, timestamp?: number) { + const request = new Request(`https://example.com${pathname}`); + + this.store.set(request.url, { + request, + response: createResponse(timestamp), + }); + + return request; + } +} + +function createResponse(timestamp?: number) { + const headers = new Headers(); + + if (timestamp !== undefined) { + headers.set('x-timestamp', timestamp.toString()); + } + + return new Response('body', { headers }); +} + +function createRequest(pathname: string, destination = '') { + const request = new Request(`https://example.com${pathname}`); + + Object.defineProperty(request, 'destination', { + value: destination, + configurable: true, + }); + + return request; +} + +function createFetchEvent(request: Request) { + let responsePromise: Promise | undefined; + const respondWith = vi.fn((response: Response | Promise) => { + responsePromise = Promise.resolve(response); + }); + + return { + event: { + request, + respondWith, + } as unknown as FetchEvent, + respondWith: () => responsePromise, + respondWithMock: respondWith, + }; +} diff --git a/app/javascript/mastodon/service_worker/caching.ts b/app/javascript/mastodon/service_worker/caching.ts new file mode 100644 index 00000000000..96c2898dd79 --- /dev/null +++ b/app/javascript/mastodon/service_worker/caching.ts @@ -0,0 +1,143 @@ +/// +/// + +import { DAY } from '../utils/time'; + +const CACHE_NAME_PREFIX = 'mastodon-'; +const CACHE_HEADER_TTL = 'x-timestamp'; + +export async function cacheRoot() { + const cache = await openWebCache(); + const response = await fetch('/', { + credentials: 'include', + redirect: 'manual', + }); + await cache.put('/', response); +} + +export function handleFetch(event: FetchEvent) { + const url = new URL(event.request.url); + + if (url.pathname === '/auth/sign_out') { + event.respondWith(handleLogout(event)); + } else if (/intl\/.*\.js$/.test(url.pathname)) { + event.respondWith(cacheFirst({ event, name: 'locales' })); + } else if (event.request.destination === 'font') { + event.respondWith(cacheFirst({ event, name: 'fonts' })); + } else if (event.request.destination === 'image') { + event.respondWith(cacheFirst({ event, name: 'images', ttl: DAY * 7 })); + } +} + +async function cacheFirst({ + event, + name, + ttl = DAY * 30, + max = 5, +}: { + event: FetchEvent; + name: string; + ttl?: number; + max?: number; +}) { + const cache = await caches.open(`${CACHE_NAME_PREFIX}${name}`); + const request = event.request; + const cachedResponse = await cache.match(request); + + // Start expiring cache items while the process continues. + void expireCachedItems({ name, ttl, max }); + + if (cachedResponse) { + // If we have a cached response, check the TTL header. + const ttlHeader = Number.parseInt( + cachedResponse.headers.get(CACHE_HEADER_TTL) ?? '0', + ); + + if (!ttlHeader || ttlHeader + ttl > Date.now()) { + return cachedResponse; + } + } + + const networkResponse = await fetch(request); + + // For opaque responses, the status will be zero so we can't clone them. + if (networkResponse.status !== 0) { + // Clone request with a custom header to store timestamp. + const cloneHeaders = new Headers(networkResponse.headers); + cloneHeaders.set(CACHE_HEADER_TTL, Date.now().toString()); + + const cloneResponse = new Response(networkResponse.clone().body, { + headers: cloneHeaders, + status: networkResponse.status, + statusText: networkResponse.statusText, + }); + + await cache.put(request, cloneResponse); + } + + return networkResponse; +} + +export async function expireCachedItems({ + name, + ttl = DAY * 30, + max = 5, +}: { + name: string; + ttl?: number; + max?: number; +}) { + const cache = await caches.open(`${CACHE_NAME_PREFIX}${name}`); + + const keys = await cache.keys(); + const now = Date.now(); + const validKeys: { key: Request; timestamp: number }[] = []; + + for (const key of keys) { + const cachedResponse = await cache.match(key); + + if (!cachedResponse) { + await cache.delete(key); + continue; + } + + const timestamp = Number.parseInt( + cachedResponse.headers.get(CACHE_HEADER_TTL) ?? '0', + ); + + if (!timestamp || timestamp + ttl > now) { + validKeys.push({ key, timestamp: timestamp || Number.POSITIVE_INFINITY }); + continue; + } + + await cache.delete(key); + } + + if (validKeys.length <= max) { + return; + } + + const sortedValidKeys = validKeys.toSorted( + ({ timestamp: a }, { timestamp: b }) => a - b, + ); + await Promise.all( + sortedValidKeys + .slice(0, sortedValidKeys.length - max) + .map(({ key }) => cache.delete(key)), + ); +} + +function openWebCache() { + return caches.open(`${CACHE_NAME_PREFIX}web`); +} + +async function handleLogout(event: FetchEvent) { + const response = await fetch(event.request); + + if (response.ok || response.type === 'opaqueredirect') { + const cache = await openWebCache(); + await cache.delete('/'); + } + + return response; +} diff --git a/app/javascript/mastodon/service_worker/sw.js b/app/javascript/mastodon/service_worker/sw.js deleted file mode 100644 index 9c153b123f5..00000000000 --- a/app/javascript/mastodon/service_worker/sw.js +++ /dev/null @@ -1,88 +0,0 @@ -import { ExpirationPlugin } from 'workbox-expiration'; -import { registerRoute } from 'workbox-routing'; -import { CacheFirst } from 'workbox-strategies'; - -import { handleNotificationClick, handlePush } from './web_push_notifications'; - -const CACHE_NAME_PREFIX = 'mastodon-'; - -function openWebCache() { - return caches.open(`${CACHE_NAME_PREFIX}web`); -} - -function fetchRoot() { - return fetch('/', { credentials: 'include', redirect: 'manual' }); -} - - -registerRoute( - /intl\/.*\.js$/, - new CacheFirst({ - cacheName: `${CACHE_NAME_PREFIX}locales`, - plugins: [ - new ExpirationPlugin({ - maxAgeSeconds: 30 * 24 * 60 * 60, // 1 month - maxEntries: 5, - }), - ], - }), -); - -registerRoute( - ({ request }) => request.destination === 'font', - new CacheFirst({ - cacheName: `${CACHE_NAME_PREFIX}fonts`, - plugins: [ - new ExpirationPlugin({ - maxAgeSeconds: 30 * 24 * 60 * 60, // 1 month - maxEntries: 5, - }), - ], - }), -); - -registerRoute( - ({ request }) => request.destination === 'image', - new CacheFirst({ - cacheName: `m${CACHE_NAME_PREFIX}media`, - plugins: [ - new ExpirationPlugin({ - maxAgeSeconds: 7 * 24 * 60 * 60, // 1 week - maxEntries: 256, - }), - ], - }), -); - -// Cause a new version of a registered Service Worker to replace an existing one -// that is already installed, and replace the currently active worker on open pages. -self.addEventListener('install', function(event) { - event.waitUntil(Promise.all([openWebCache(), fetchRoot()]).then(([cache, root]) => cache.put('/', root))); -}); - -self.addEventListener('activate', function(event) { - event.waitUntil(self.clients.claim()); -}); - -self.addEventListener('fetch', function(event) { - const url = new URL(event.request.url); - - if (url.pathname === '/auth/sign_out') { - const asyncResponse = fetch(event.request); - const asyncCache = openWebCache(); - - event.respondWith(asyncResponse.then(response => { - if (response.ok || response.type === 'opaqueredirect') { - return Promise.all([ - asyncCache.then(cache => cache.delete('/')), - indexedDB.deleteDatabase('mastodon'), - ]).then(() => response); - } - - return response; - })); - } -}); - -self.addEventListener('push', handlePush); -self.addEventListener('notificationclick', handleNotificationClick); diff --git a/app/javascript/mastodon/service_worker/sw.ts b/app/javascript/mastodon/service_worker/sw.ts new file mode 100644 index 00000000000..d86bb6d5857 --- /dev/null +++ b/app/javascript/mastodon/service_worker/sw.ts @@ -0,0 +1,22 @@ +/// +/// + +import { cacheRoot, handleFetch } from './caching'; +import { handleNotificationClick, handlePush } from './web_push_notifications'; + +declare const self: ServiceWorkerGlobalScope; + +// Cause a new version of a registered Service Worker to replace an existing one +// that is already installed, and replace the currently active worker on open pages. +self.addEventListener('install', (event) => { + event.waitUntil(cacheRoot()); +}); + +self.addEventListener('activate', (event) => { + event.waitUntil(self.clients.claim()); +}); + +self.addEventListener('fetch', handleFetch); + +self.addEventListener('push', handlePush); +self.addEventListener('notificationclick', handleNotificationClick); diff --git a/package.json b/package.json index 54229c4aa0a..af9928e6c49 100644 --- a/package.json +++ b/package.json @@ -115,19 +115,15 @@ "stacktrace-js": "^2.0.2", "stringz": "^2.1.0", "substring-trie": "^1.0.2", + "terser": "^5.48.0", "tesseract.js": "^7.0.0", "tiny-queue": "^0.2.1", "twitter-text": "3.1.0", "use-debounce": "^10.0.0", "vite": "^8.0.0", "vite-plugin-manifest-sri": "^0.2.0", - "vite-plugin-pwa": "^1.2.0", "vite-plugin-svgr": "^5.0.0", - "wicg-inert": "^3.1.2", - "workbox-expiration": "^7.3.0", - "workbox-routing": "^7.3.0", - "workbox-strategies": "^7.3.0", - "workbox-window": "^7.3.0" + "wicg-inert": "^3.1.2" }, "devDependencies": { "@eslint/js": "^9.39.2", diff --git a/vite.config.mts b/vite.config.mts index 8424471867d..06d6ab1990e 100644 --- a/vite.config.mts +++ b/vite.config.mts @@ -17,7 +17,6 @@ import { UserConfig, } from 'vite'; import manifestSRI from 'vite-plugin-manifest-sri'; -import { VitePWA } from 'vite-plugin-pwa'; import svgr from 'vite-plugin-svgr'; import { MastodonAssetsManifest } from './config/vite/plugin-assets-manifest'; @@ -155,6 +154,14 @@ export const config: UserConfigFnPromise = async ({ mode, command }) => { } return '[name]-[hash].js'; }, + entryFileNames({ name }) { + // If this is the service worker, don't add the hash to the name. + if (name === 'sw') { + return '[name].js'; + } + // Otherwise, use the same value as chunkFileNames. + return '[name]-[hash].js'; + }, }, }, }, @@ -188,29 +195,6 @@ export const config: UserConfigFnPromise = async ({ mode, command }) => { manifestSRI({ manifestPaths: ['.vite/manifest.json'], }), - VitePWA({ - srcDir: path.resolve(jsRoot, 'mastodon/service_worker'), - // We need to use injectManifest because we use our own service worker - strategies: 'injectManifest', - manifest: false, - injectRegister: false, - injectManifest: { - // Do not inject a manifest, we don't use precache - injectionPoint: undefined, - buildPlugins: { - vite: [ - // Provide a virtual import with only the locales used in the ServiceWorker - MastodonServiceWorkerLocales(), - ], - }, - }, - // Force the output location, because we have a symlink in `public/sw.js` - outDir: path.resolve(__dirname, 'public/packs'), - devOptions: { - enabled: true, - type: 'module', - }, - }), svgr(), // Old library types need to be converted optimizeLodashImports() as PluginOption, @@ -224,7 +208,9 @@ export const config: UserConfigFnPromise = async ({ mode, command }) => { }; async function findEntrypoints() { - const entrypoints: Record = {}; + const entrypoints: Record = { + sw: path.resolve(jsRoot, 'mastodon/service_worker/sw.ts'), + }; // First, JS entrypoints const jsEntrypointsDir = path.resolve(jsRoot, 'entrypoints'); diff --git a/yarn.lock b/yarn.lock index 6d194fc5b8b..c27f3c70bd2 100644 --- a/yarn.lock +++ b/yarn.lock @@ -26,19 +26,6 @@ __metadata: languageName: node linkType: hard -"@apideck/better-ajv-errors@npm:^0.3.1": - version: 0.3.6 - resolution: "@apideck/better-ajv-errors@npm:0.3.6" - dependencies: - json-schema: "npm:^0.4.0" - jsonpointer: "npm:^5.0.0" - leven: "npm:^3.1.0" - peerDependencies: - ajv: ">=8" - checksum: 10c0/f89a1e16ecbc2ada91c56d4391c8345471e385f0b9c38d62c3bccac40ec94482cdfa496d4c2fe0af411e9851a9931c0d5042a8040f52213f603ba6b6fd7f949b - languageName: node - linkType: hard - "@asamuzakjp/css-color@npm:^5.1.11": version: 5.1.11 resolution: "@asamuzakjp/css-color@npm:5.1.11" @@ -217,7 +204,7 @@ __metadata: languageName: node linkType: hard -"@babel/helper-module-imports@npm:^7.16.7, @babel/helper-module-imports@npm:^7.18.6, @babel/helper-module-imports@npm:^7.28.6": +"@babel/helper-module-imports@npm:^7.16.7, @babel/helper-module-imports@npm:^7.28.6": version: 7.28.6 resolution: "@babel/helper-module-imports@npm:7.28.6" dependencies: @@ -1060,7 +1047,7 @@ __metadata: languageName: node linkType: hard -"@babel/preset-env@npm:^7.11.0, @babel/preset-env@npm:^7.29.5": +"@babel/preset-env@npm:^7.29.5": version: 7.29.5 resolution: "@babel/preset-env@npm:7.29.5" dependencies: @@ -1154,7 +1141,7 @@ __metadata: languageName: node linkType: hard -"@babel/runtime@npm:^7.0.0, @babel/runtime@npm:^7.1.2, @babel/runtime@npm:^7.11.2, @babel/runtime@npm:^7.12.0, @babel/runtime@npm:^7.12.13, @babel/runtime@npm:^7.12.5, @babel/runtime@npm:^7.13.8, @babel/runtime@npm:^7.18.3, @babel/runtime@npm:^7.20.13, @babel/runtime@npm:^7.3.1, @babel/runtime@npm:^7.5.5, @babel/runtime@npm:^7.6.3, @babel/runtime@npm:^7.8.7, @babel/runtime@npm:^7.9.2": +"@babel/runtime@npm:^7.0.0, @babel/runtime@npm:^7.1.2, @babel/runtime@npm:^7.12.0, @babel/runtime@npm:^7.12.13, @babel/runtime@npm:^7.12.5, @babel/runtime@npm:^7.13.8, @babel/runtime@npm:^7.18.3, @babel/runtime@npm:^7.20.13, @babel/runtime@npm:^7.3.1, @babel/runtime@npm:^7.5.5, @babel/runtime@npm:^7.6.3, @babel/runtime@npm:^7.8.7, @babel/runtime@npm:^7.9.2": version: 7.27.0 resolution: "@babel/runtime@npm:7.27.0" dependencies: @@ -2842,12 +2829,12 @@ __metadata: linkType: hard "@jridgewell/source-map@npm:^0.3.3": - version: 0.3.6 - resolution: "@jridgewell/source-map@npm:0.3.6" + version: 0.3.11 + resolution: "@jridgewell/source-map@npm:0.3.11" dependencies: "@jridgewell/gen-mapping": "npm:^0.3.5" "@jridgewell/trace-mapping": "npm:^0.3.25" - checksum: 10c0/6a4ecc713ed246ff8e5bdcc1ef7c49aaa93f7463d948ba5054dda18b02dcc6a055e2828c577bcceee058f302ce1fc95595713d44f5c45e43d459f88d267f2f04 + checksum: 10c0/50a4fdafe0b8f655cb2877e59fe81320272eaa4ccdbe6b9b87f10614b2220399ae3e05c16137a59db1f189523b42c7f88bd097ee991dbd7bc0e01113c583e844 languageName: node linkType: hard @@ -3021,6 +3008,7 @@ __metadata: stylelint: "npm:^17.0.0" stylelint-config-standard-scss: "npm:^17.0.0" substring-trie: "npm:^1.0.2" + terser: "npm:^5.48.0" tesseract.js: "npm:^7.0.0" tiny-queue: "npm:^0.2.1" twitter-text: "npm:3.1.0" @@ -3030,14 +3018,9 @@ __metadata: use-debounce: "npm:^10.0.0" vite: "npm:^8.0.0" vite-plugin-manifest-sri: "npm:^0.2.0" - vite-plugin-pwa: "npm:^1.2.0" vite-plugin-svgr: "npm:^5.0.0" vitest: "npm:^4.1.7" wicg-inert: "npm:^3.1.2" - workbox-expiration: "npm:^7.3.0" - workbox-routing: "npm:^7.3.0" - workbox-strategies: "npm:^7.3.0" - workbox-window: "npm:^7.3.0" peerDependenciesMeta: react: optional: true @@ -3927,75 +3910,7 @@ __metadata: languageName: node linkType: hard -"@rollup/plugin-babel@npm:^6.1.0": - version: 6.1.0 - resolution: "@rollup/plugin-babel@npm:6.1.0" - dependencies: - "@babel/helper-module-imports": "npm:^7.18.6" - "@rollup/pluginutils": "npm:^5.0.1" - peerDependencies: - "@babel/core": ^7.0.0 - "@types/babel__core": ^7.1.9 - rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 - peerDependenciesMeta: - "@types/babel__core": - optional: true - rollup: - optional: true - checksum: 10c0/68bc1a3689552992c3443e43a95ac14ac4e271079a5a18e252d8113358236e9c91fe514dad7a42b84581214f8714ec1f46fd99a5d9cc5a6a1e7456367ee4d6d4 - languageName: node - linkType: hard - -"@rollup/plugin-node-resolve@npm:^16.0.3": - version: 16.0.3 - resolution: "@rollup/plugin-node-resolve@npm:16.0.3" - dependencies: - "@rollup/pluginutils": "npm:^5.0.1" - "@types/resolve": "npm:1.20.2" - deepmerge: "npm:^4.2.2" - is-module: "npm:^1.0.0" - resolve: "npm:^1.22.1" - peerDependencies: - rollup: ^2.78.0||^3.0.0||^4.0.0 - peerDependenciesMeta: - rollup: - optional: true - checksum: 10c0/5bafff8e51cd28b5b3b8f415c30a893f5bfdb1a54469e00b3dc6530f26051620f3dfa172f40544361948b46cc3070cb34fd44ade66d38c0677d74c846fbc58dc - languageName: node - linkType: hard - -"@rollup/plugin-replace@npm:^6.0.3": - version: 6.0.3 - resolution: "@rollup/plugin-replace@npm:6.0.3" - dependencies: - "@rollup/pluginutils": "npm:^5.0.1" - magic-string: "npm:^0.30.3" - peerDependencies: - rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 - peerDependenciesMeta: - rollup: - optional: true - checksum: 10c0/93217c52fe86b03363bc534b5f07963ac4fd6b91f19f6070a66809b0c65a036b3b234624a65a8bfcc01a8dc0e42838feae03c021b0d1e5e91753c503c4d70cd6 - languageName: node - linkType: hard - -"@rollup/plugin-terser@npm:^1.0.0": - version: 1.0.0 - resolution: "@rollup/plugin-terser@npm:1.0.0" - dependencies: - serialize-javascript: "npm:^7.0.3" - smob: "npm:^1.0.0" - terser: "npm:^5.17.4" - peerDependencies: - rollup: ^2.0.0||^3.0.0||^4.0.0 - peerDependenciesMeta: - rollup: - optional: true - checksum: 10c0/08be445cc2e0677132ee06cdebbcd1b6cd3ab22e220fcd89d8a22eaf9ee501a940f425931ac65c65ab113803ad31a895f2575716248609c882c8e562fd6cc2d4 - languageName: node - linkType: hard - -"@rollup/pluginutils@npm:^5.0.1, @rollup/pluginutils@npm:^5.0.2, @rollup/pluginutils@npm:^5.1.0, @rollup/pluginutils@npm:^5.3.0": +"@rollup/pluginutils@npm:^5.0.2, @rollup/pluginutils@npm:^5.1.0, @rollup/pluginutils@npm:^5.3.0": version: 5.3.0 resolution: "@rollup/pluginutils@npm:5.3.0" dependencies: @@ -4011,181 +3926,6 @@ __metadata: languageName: node linkType: hard -"@rollup/rollup-android-arm-eabi@npm:4.60.3": - version: 4.60.3 - resolution: "@rollup/rollup-android-arm-eabi@npm:4.60.3" - conditions: os=android & cpu=arm - languageName: node - linkType: hard - -"@rollup/rollup-android-arm64@npm:4.60.3": - version: 4.60.3 - resolution: "@rollup/rollup-android-arm64@npm:4.60.3" - conditions: os=android & cpu=arm64 - languageName: node - linkType: hard - -"@rollup/rollup-darwin-arm64@npm:4.60.3": - version: 4.60.3 - resolution: "@rollup/rollup-darwin-arm64@npm:4.60.3" - conditions: os=darwin & cpu=arm64 - languageName: node - linkType: hard - -"@rollup/rollup-darwin-x64@npm:4.60.3": - version: 4.60.3 - resolution: "@rollup/rollup-darwin-x64@npm:4.60.3" - conditions: os=darwin & cpu=x64 - languageName: node - linkType: hard - -"@rollup/rollup-freebsd-arm64@npm:4.60.3": - version: 4.60.3 - resolution: "@rollup/rollup-freebsd-arm64@npm:4.60.3" - conditions: os=freebsd & cpu=arm64 - languageName: node - linkType: hard - -"@rollup/rollup-freebsd-x64@npm:4.60.3": - version: 4.60.3 - resolution: "@rollup/rollup-freebsd-x64@npm:4.60.3" - conditions: os=freebsd & cpu=x64 - languageName: node - linkType: hard - -"@rollup/rollup-linux-arm-gnueabihf@npm:4.60.3": - version: 4.60.3 - resolution: "@rollup/rollup-linux-arm-gnueabihf@npm:4.60.3" - conditions: os=linux & cpu=arm & libc=glibc - languageName: node - linkType: hard - -"@rollup/rollup-linux-arm-musleabihf@npm:4.60.3": - version: 4.60.3 - resolution: "@rollup/rollup-linux-arm-musleabihf@npm:4.60.3" - conditions: os=linux & cpu=arm & libc=musl - languageName: node - linkType: hard - -"@rollup/rollup-linux-arm64-gnu@npm:4.60.3": - version: 4.60.3 - resolution: "@rollup/rollup-linux-arm64-gnu@npm:4.60.3" - conditions: os=linux & cpu=arm64 & libc=glibc - languageName: node - linkType: hard - -"@rollup/rollup-linux-arm64-musl@npm:4.60.3": - version: 4.60.3 - resolution: "@rollup/rollup-linux-arm64-musl@npm:4.60.3" - conditions: os=linux & cpu=arm64 & libc=musl - languageName: node - linkType: hard - -"@rollup/rollup-linux-loong64-gnu@npm:4.60.3": - version: 4.60.3 - resolution: "@rollup/rollup-linux-loong64-gnu@npm:4.60.3" - conditions: os=linux & cpu=loong64 & libc=glibc - languageName: node - linkType: hard - -"@rollup/rollup-linux-loong64-musl@npm:4.60.3": - version: 4.60.3 - resolution: "@rollup/rollup-linux-loong64-musl@npm:4.60.3" - conditions: os=linux & cpu=loong64 & libc=musl - languageName: node - linkType: hard - -"@rollup/rollup-linux-ppc64-gnu@npm:4.60.3": - version: 4.60.3 - resolution: "@rollup/rollup-linux-ppc64-gnu@npm:4.60.3" - conditions: os=linux & cpu=ppc64 & libc=glibc - languageName: node - linkType: hard - -"@rollup/rollup-linux-ppc64-musl@npm:4.60.3": - version: 4.60.3 - resolution: "@rollup/rollup-linux-ppc64-musl@npm:4.60.3" - conditions: os=linux & cpu=ppc64 & libc=musl - languageName: node - linkType: hard - -"@rollup/rollup-linux-riscv64-gnu@npm:4.60.3": - version: 4.60.3 - resolution: "@rollup/rollup-linux-riscv64-gnu@npm:4.60.3" - conditions: os=linux & cpu=riscv64 & libc=glibc - languageName: node - linkType: hard - -"@rollup/rollup-linux-riscv64-musl@npm:4.60.3": - version: 4.60.3 - resolution: "@rollup/rollup-linux-riscv64-musl@npm:4.60.3" - conditions: os=linux & cpu=riscv64 & libc=musl - languageName: node - linkType: hard - -"@rollup/rollup-linux-s390x-gnu@npm:4.60.3": - version: 4.60.3 - resolution: "@rollup/rollup-linux-s390x-gnu@npm:4.60.3" - conditions: os=linux & cpu=s390x & libc=glibc - languageName: node - linkType: hard - -"@rollup/rollup-linux-x64-gnu@npm:4.60.3": - version: 4.60.3 - resolution: "@rollup/rollup-linux-x64-gnu@npm:4.60.3" - conditions: os=linux & cpu=x64 & libc=glibc - languageName: node - linkType: hard - -"@rollup/rollup-linux-x64-musl@npm:4.60.3": - version: 4.60.3 - resolution: "@rollup/rollup-linux-x64-musl@npm:4.60.3" - conditions: os=linux & cpu=x64 & libc=musl - languageName: node - linkType: hard - -"@rollup/rollup-openbsd-x64@npm:4.60.3": - version: 4.60.3 - resolution: "@rollup/rollup-openbsd-x64@npm:4.60.3" - conditions: os=openbsd & cpu=x64 - languageName: node - linkType: hard - -"@rollup/rollup-openharmony-arm64@npm:4.60.3": - version: 4.60.3 - resolution: "@rollup/rollup-openharmony-arm64@npm:4.60.3" - conditions: os=openharmony & cpu=arm64 - languageName: node - linkType: hard - -"@rollup/rollup-win32-arm64-msvc@npm:4.60.3": - version: 4.60.3 - resolution: "@rollup/rollup-win32-arm64-msvc@npm:4.60.3" - conditions: os=win32 & cpu=arm64 - languageName: node - linkType: hard - -"@rollup/rollup-win32-ia32-msvc@npm:4.60.3": - version: 4.60.3 - resolution: "@rollup/rollup-win32-ia32-msvc@npm:4.60.3" - conditions: os=win32 & cpu=ia32 - languageName: node - linkType: hard - -"@rollup/rollup-win32-x64-gnu@npm:4.60.3": - version: 4.60.3 - resolution: "@rollup/rollup-win32-x64-gnu@npm:4.60.3" - conditions: os=win32 & cpu=x64 - languageName: node - linkType: hard - -"@rollup/rollup-win32-x64-msvc@npm:4.60.3": - version: 4.60.3 - resolution: "@rollup/rollup-win32-x64-msvc@npm:4.60.3" - conditions: os=win32 & cpu=x64 - languageName: node - linkType: hard - "@rtsao/scc@npm:^1.1.0": version: 1.1.0 resolution: "@rtsao/scc@npm:1.1.0" @@ -4568,18 +4308,6 @@ __metadata: languageName: node linkType: hard -"@trickfilm400/rollup-plugin-off-main-thread@npm:^3.0.0-pre1": - version: 3.0.0-pre1 - resolution: "@trickfilm400/rollup-plugin-off-main-thread@npm:3.0.0-pre1" - dependencies: - ejs: "npm:^3.1.10" - json5: "npm:^2.2.3" - magic-string: "npm:^0.30.21" - string.prototype.matchall: "npm:^4.0.12" - checksum: 10c0/60d4ff15295413e8b4092221f2683681d13168fb136d94b0c1ca472810e4b28c51b1f88be5fa1aa44327e18b620fd6ca9a3201cb2679034b29adf7bdbde014e0 - languageName: node - linkType: hard - "@tybys/wasm-util@npm:^0.10.0, @tybys/wasm-util@npm:^0.10.1": version: 0.10.1 resolution: "@tybys/wasm-util@npm:0.10.1" @@ -4713,7 +4441,7 @@ __metadata: languageName: node linkType: hard -"@types/estree@npm:1.0.8, @types/estree@npm:^1.0.0, @types/estree@npm:^1.0.6, @types/estree@npm:^1.0.8": +"@types/estree@npm:^1.0.0, @types/estree@npm:^1.0.6, @types/estree@npm:^1.0.8": version: 1.0.8 resolution: "@types/estree@npm:1.0.8" checksum: 10c0/39d34d1afaa338ab9763f37ad6066e3f349444f9052b9676a7cc0252ef9485a41c6d81c9c4e0d26e9077993354edf25efc853f3224dd4b447175ef62bdcc86a5 @@ -5014,13 +4742,6 @@ __metadata: languageName: node linkType: hard -"@types/resolve@npm:1.20.2": - version: 1.20.2 - resolution: "@types/resolve@npm:1.20.2" - checksum: 10c0/c5b7e1770feb5ccfb6802f6ad82a7b0d50874c99331e0c9b259e415e55a38d7a86ad0901c57665d93f75938be2a6a0bc9aa06c9749192cadb2e4512800bbc6e6 - languageName: node - linkType: hard - "@types/resolve@npm:^1.20.2": version: 1.20.6 resolution: "@types/resolve@npm:1.20.6" @@ -5055,13 +4776,6 @@ __metadata: languageName: node linkType: hard -"@types/trusted-types@npm:^2.0.2": - version: 2.0.3 - resolution: "@types/trusted-types@npm:2.0.3" - checksum: 10c0/25eae736a8a6d24353c3e0108138935250f79d1d239f6fd6f3eb52d88476456ba946f8cb8f3130c6841d40534cafc2dd2326358d86966327c3c4a3d3eecaf585 - languageName: node - linkType: hard - "@types/use-sync-external-store@npm:^0.0.6": version: 0.0.6 resolution: "@types/use-sync-external-store@npm:0.0.6" @@ -5757,7 +5471,7 @@ __metadata: languageName: node linkType: hard -"acorn@npm:^8.15.0, acorn@npm:^8.16.0, acorn@npm:^8.8.2": +"acorn@npm:^8.15.0, acorn@npm:^8.16.0": version: 8.16.0 resolution: "acorn@npm:8.16.0" bin: @@ -5794,7 +5508,7 @@ __metadata: languageName: node linkType: hard -"ajv@npm:^8.0.1, ajv@npm:^8.6.0": +"ajv@npm:^8.0.1": version: 8.17.1 resolution: "ajv@npm:8.17.1" dependencies: @@ -6055,13 +5769,6 @@ __metadata: languageName: node linkType: hard -"async@npm:^3.2.3": - version: 3.2.4 - resolution: "async@npm:3.2.4" - checksum: 10c0/b5d02fed64717edf49e35b2b156debd9cf524934ea670108fa5528e7615ed66a5e0bf6c65f832c9483b63aa7f0bffe3e588ebe8d58a539b833798d324516e1c9 - languageName: node - linkType: hard - "asynckit@npm:^0.4.0": version: 0.4.0 resolution: "asynckit@npm:0.4.0" @@ -6069,13 +5776,6 @@ __metadata: languageName: node linkType: hard -"at-least-node@npm:^1.0.0": - version: 1.0.0 - resolution: "at-least-node@npm:1.0.0" - checksum: 10c0/4c058baf6df1bc5a1697cf182e2029c58cd99975288a13f9e70068ef5d6f4e1f1fd7c4d2c3c4912eae44797d1725be9700995736deca441b39f3e66d8dee97ef - languageName: node - linkType: hard - "atomic-sleep@npm:^1.0.0": version: 1.0.0 resolution: "atomic-sleep@npm:1.0.0" @@ -6276,7 +5976,7 @@ __metadata: languageName: node linkType: hard -"brace-expansion@npm:^2.0.1, brace-expansion@npm:^2.0.2": +"brace-expansion@npm:^2.0.2": version: 2.1.0 resolution: "brace-expansion@npm:2.1.0" dependencies: @@ -6477,7 +6177,7 @@ __metadata: languageName: node linkType: hard -"chalk@npm:^4.0.0, chalk@npm:^4.0.2": +"chalk@npm:^4.0.0": version: 4.1.2 resolution: "chalk@npm:4.1.2" dependencies: @@ -6677,13 +6377,6 @@ __metadata: languageName: node linkType: hard -"common-tags@npm:^1.8.0": - version: 1.8.2 - resolution: "common-tags@npm:1.8.2" - checksum: 10c0/23efe47ff0a1a7c91489271b3a1e1d2a171c12ec7f9b35b29b2fce51270124aff0ec890087e2bc2182c1cb746e232ab7561aaafe05f1e7452aea733d2bfe3f63 - languageName: node - linkType: hard - "concat-map@npm:0.0.1": version: 0.0.1 resolution: "concat-map@npm:0.0.1" @@ -6862,13 +6555,6 @@ __metadata: languageName: node linkType: hard -"crypto-random-string@npm:^2.0.0": - version: 2.0.0 - resolution: "crypto-random-string@npm:2.0.0" - checksum: 10c0/288589b2484fe787f9e146f56c4be90b940018f17af1b152e4dde12309042ff5a2bf69e949aab8b8ac253948381529cc6f3e5a2427b73643a71ff177fa122b37 - languageName: node - linkType: hard - "css-blank-pseudo@npm:^8.0.1": version: 8.0.1 resolution: "css-blank-pseudo@npm:8.0.1" @@ -7006,7 +6692,7 @@ __metadata: languageName: node linkType: hard -"debug@npm:4, debug@npm:4.4.3, debug@npm:^4.1.0, debug@npm:^4.3.1, debug@npm:^4.3.2, debug@npm:^4.3.4, debug@npm:^4.3.5, debug@npm:^4.3.6, debug@npm:^4.4.0, debug@npm:^4.4.1, debug@npm:^4.4.3": +"debug@npm:4, debug@npm:4.4.3, debug@npm:^4.1.0, debug@npm:^4.3.1, debug@npm:^4.3.2, debug@npm:^4.3.4, debug@npm:^4.3.5, debug@npm:^4.4.0, debug@npm:^4.4.1, debug@npm:^4.4.3": version: 4.4.3 resolution: "debug@npm:4.4.3" dependencies: @@ -7057,13 +6743,6 @@ __metadata: languageName: node linkType: hard -"deepmerge@npm:^4.2.2": - version: 4.3.1 - resolution: "deepmerge@npm:4.3.1" - checksum: 10c0/e53481aaf1aa2c4082b5342be6b6d8ad9dfe387bc92ce197a66dea08bd4265904a087e75e464f14d1347cf2ac8afe1e4c16b266e0561cc5df29382d3c5f80044 - languageName: node - linkType: hard - "default-browser-id@npm:^5.0.0": version: 5.0.1 resolution: "default-browser-id@npm:5.0.1" @@ -7292,17 +6971,6 @@ __metadata: languageName: node linkType: hard -"ejs@npm:^3.1.10": - version: 3.1.10 - resolution: "ejs@npm:3.1.10" - dependencies: - jake: "npm:^10.8.5" - bin: - ejs: bin/cli.js - checksum: 10c0/52eade9e68416ed04f7f92c492183340582a36482836b11eab97b159fcdcfdedc62233a1bf0bf5e5e1851c501f2dca0e2e9afd111db2599e4e7f53ee29429ae1 - languageName: node - linkType: hard - "electron-to-chromium@npm:^1.5.328": version: 1.5.358 resolution: "electron-to-chromium@npm:1.5.358" @@ -8103,13 +7771,6 @@ __metadata: languageName: node linkType: hard -"eta@npm:^4.5.1": - version: 4.6.0 - resolution: "eta@npm:4.6.0" - checksum: 10c0/98c8081f756884bbc22f2bf4a6a38c2322ee97575fb6f0c02dcb1c3040353971c91a96bfba2d6f7cba39bb0ebece5708803a765447d9a81ca1172ccd5e31becf - languageName: node - linkType: hard - "etag@npm:^1.8.1": version: 1.8.1 resolution: "etag@npm:1.8.1" @@ -8208,7 +7869,7 @@ __metadata: languageName: node linkType: hard -"fast-json-stable-stringify@npm:^2.0.0, fast-json-stable-stringify@npm:^2.1.0": +"fast-json-stable-stringify@npm:^2.0.0": version: 2.1.0 resolution: "fast-json-stable-stringify@npm:2.1.0" checksum: 10c0/7f081eb0b8a64e0057b3bb03f974b3ef00135fbf36c1c710895cd9300f13c94ba809bb3a81cf4e1b03f6e5285610a61abbd7602d0652de423144dfee5a389c9b @@ -8289,15 +7950,6 @@ __metadata: languageName: node linkType: hard -"filelist@npm:^1.0.4": - version: 1.0.4 - resolution: "filelist@npm:1.0.4" - dependencies: - minimatch: "npm:^5.0.1" - checksum: 10c0/426b1de3944a3d153b053f1c0ebfd02dccd0308a4f9e832ad220707a6d1f1b3c9784d6cadf6b2f68f09a57565f63ebc7bcdc913ccf8012d834f472c46e596f41 - languageName: node - linkType: hard - "fill-range@npm:^7.1.1": version: 7.1.1 resolution: "fill-range@npm:7.1.1" @@ -8385,7 +8037,7 @@ __metadata: languageName: node linkType: hard -"foreground-child@npm:^3.1.0, foreground-child@npm:^3.3.1": +"foreground-child@npm:^3.1.0": version: 3.3.1 resolution: "foreground-child@npm:3.3.1" dependencies: @@ -8429,18 +8081,6 @@ __metadata: languageName: node linkType: hard -"fs-extra@npm:^9.0.1": - version: 9.1.0 - resolution: "fs-extra@npm:9.1.0" - dependencies: - at-least-node: "npm:^1.0.0" - graceful-fs: "npm:^4.2.0" - jsonfile: "npm:^6.0.1" - universalify: "npm:^2.0.0" - checksum: 10c0/9b808bd884beff5cb940773018179a6b94a966381d005479f00adda6b44e5e3d4abf765135773d849cc27efe68c349e4a7b86acd7d3306d5932c14f3a4b17a92 - languageName: node - linkType: hard - "fs-minipass@npm:^3.0.0": version: 3.0.3 resolution: "fs-minipass@npm:3.0.3" @@ -8467,7 +8107,7 @@ __metadata: languageName: node linkType: hard -"fsevents@npm:~2.3.2, fsevents@npm:~2.3.3": +"fsevents@npm:~2.3.3": version: 2.3.3 resolution: "fsevents@npm:2.3.3" dependencies: @@ -8486,7 +8126,7 @@ __metadata: languageName: node linkType: hard -"fsevents@patch:fsevents@npm%3A~2.3.2#optional!builtin, fsevents@patch:fsevents@npm%3A~2.3.3#optional!builtin": +"fsevents@patch:fsevents@npm%3A~2.3.3#optional!builtin": version: 2.3.3 resolution: "fsevents@patch:fsevents@npm%3A2.3.3#optional!builtin::version=2.3.3&hash=df0bf1" dependencies: @@ -8569,13 +8209,6 @@ __metadata: languageName: node linkType: hard -"get-own-enumerable-property-symbols@npm:^3.0.0": - version: 3.0.2 - resolution: "get-own-enumerable-property-symbols@npm:3.0.2" - checksum: 10c0/103999855f3d1718c631472437161d76962cbddcd95cc642a34c07bfb661ed41b6c09a9c669ccdff89ee965beb7126b80eec7b2101e20e31e9cc6c4725305e10 - languageName: node - linkType: hard - "get-proto@npm:^1.0.0, get-proto@npm:^1.0.1": version: 1.0.1 resolution: "get-proto@npm:1.0.1" @@ -8640,22 +8273,6 @@ __metadata: languageName: node linkType: hard -"glob@npm:^11.0.1": - version: 11.1.0 - resolution: "glob@npm:11.1.0" - dependencies: - foreground-child: "npm:^3.3.1" - jackspeak: "npm:^4.1.1" - minimatch: "npm:^10.1.1" - minipass: "npm:^7.1.2" - package-json-from-dist: "npm:^1.0.0" - path-scurry: "npm:^2.0.0" - bin: - glob: dist/esm/bin.mjs - checksum: 10c0/1ceae07f23e316a6fa74581d9a74be6e8c2e590d2f7205034dd5c0435c53f5f7b712c2be00c3b65bf0a49294a1c6f4b98cd84c7637e29453b5aa13b79f1763a2 - languageName: node - linkType: hard - "glob@npm:^13.0.1": version: 13.0.6 resolution: "glob@npm:13.0.6" @@ -8753,7 +8370,7 @@ __metadata: languageName: node linkType: hard -"graceful-fs@npm:^4.1.2, graceful-fs@npm:^4.1.6, graceful-fs@npm:^4.2.0, graceful-fs@npm:^4.2.6": +"graceful-fs@npm:^4.1.2, graceful-fs@npm:^4.2.6": version: 4.2.11 resolution: "graceful-fs@npm:4.2.11" checksum: 10c0/386d011a553e02bc594ac2ca0bd6d9e4c22d7fa8cfbfc448a6d148c59ea881b092db9dbe3547ae4b88e55f1b01f7c4a2ecc53b310c042793e63aa44cf6c257f2 @@ -9061,13 +8678,6 @@ __metadata: languageName: node linkType: hard -"idb@npm:^7.0.1": - version: 7.1.1 - resolution: "idb@npm:7.1.1" - checksum: 10c0/72418e4397638797ee2089f97b45fc29f937b830bc0eb4126f4a9889ecf10320ceacf3a177fe5d7ffaf6b4fe38b20bbd210151549bfdc881db8081eed41c870d - languageName: node - linkType: hard - "idb@npm:^8.0.3": version: 8.0.3 resolution: "idb@npm:8.0.3" @@ -9423,13 +9033,6 @@ __metadata: languageName: node linkType: hard -"is-module@npm:^1.0.0": - version: 1.0.0 - resolution: "is-module@npm:1.0.0" - checksum: 10c0/795a3914bcae7c26a1c23a1e5574c42eac13429625045737bf3e324ce865c0601d61aee7a5afbca1bee8cb300c7d9647e7dc98860c9bdbc3b7fdc51d8ac0bffc - languageName: node - linkType: hard - "is-negative-zero@npm:^2.0.3": version: 2.0.3 resolution: "is-negative-zero@npm:2.0.3" @@ -9461,13 +9064,6 @@ __metadata: languageName: node linkType: hard -"is-obj@npm:^1.0.1": - version: 1.0.1 - resolution: "is-obj@npm:1.0.1" - checksum: 10c0/5003acba0af7aa47dfe0760e545a89bbac89af37c12092c3efadc755372cdaec034f130e7a3653a59eb3c1843cfc72ca71eaf1a6c3bafe5a0bab3611a47f9945 - languageName: node - linkType: hard - "is-path-inside@npm:^4.0.0": version: 4.0.0 resolution: "is-path-inside@npm:4.0.0" @@ -9508,13 +9104,6 @@ __metadata: languageName: node linkType: hard -"is-regexp@npm:^1.0.0": - version: 1.0.0 - resolution: "is-regexp@npm:1.0.0" - checksum: 10c0/34cacda1901e00f6e44879378f1d2fa96320ea956c1bec27713130aaf1d44f6e7bd963eed28945bfe37e600cb27df1cf5207302680dad8bdd27b9baff8ecf611 - languageName: node - linkType: hard - "is-set@npm:^2.0.3": version: 2.0.3 resolution: "is-set@npm:2.0.3" @@ -9531,13 +9120,6 @@ __metadata: languageName: node linkType: hard -"is-stream@npm:^2.0.0": - version: 2.0.1 - resolution: "is-stream@npm:2.0.1" - checksum: 10c0/7c284241313fc6efc329b8d7f08e16c0efeb6baab1b4cd0ba579eb78e5af1aa5da11e68559896a2067cd6c526bd29241dda4eb1225e627d5aa1a89a76d4635a5 - languageName: node - linkType: hard - "is-string@npm:^1.1.1": version: 1.1.1 resolution: "is-string@npm:1.1.1" @@ -9700,29 +9282,6 @@ __metadata: languageName: node linkType: hard -"jackspeak@npm:^4.1.1": - version: 4.1.1 - resolution: "jackspeak@npm:4.1.1" - dependencies: - "@isaacs/cliui": "npm:^8.0.2" - checksum: 10c0/84ec4f8e21d6514db24737d9caf65361511f75e5e424980eebca4199f400874f45e562ac20fa8aeb1dd20ca2f3f81f0788b6e9c3e64d216a5794fd6f30e0e042 - languageName: node - linkType: hard - -"jake@npm:^10.8.5": - version: 10.8.7 - resolution: "jake@npm:10.8.7" - dependencies: - async: "npm:^3.2.3" - chalk: "npm:^4.0.2" - filelist: "npm:^1.0.4" - minimatch: "npm:^3.1.2" - bin: - jake: bin/cli.js - checksum: 10c0/89326d01a8bc110d02d973729a66394c79a34b34461116f5c530a2a2dbc30265683fe6737928f75df9178e9d369ff1442f5753fb983d525e740eefdadc56a103 - languageName: node - linkType: hard - "joycon@npm:^3.1.1": version: 3.1.1 resolution: "joycon@npm:3.1.1" @@ -9833,13 +9392,6 @@ __metadata: languageName: node linkType: hard -"json-schema@npm:^0.4.0": - version: 0.4.0 - resolution: "json-schema@npm:0.4.0" - checksum: 10c0/d4a637ec1d83544857c1c163232f3da46912e971d5bf054ba44fdb88f07d8d359a462b4aec46f2745efbc57053365608d88bc1d7b1729f7b4fc3369765639ed3 - languageName: node - linkType: hard - "json-stable-stringify-without-jsonify@npm:^1.0.1": version: 1.0.1 resolution: "json-stable-stringify-without-jsonify@npm:1.0.1" @@ -9880,19 +9432,6 @@ __metadata: languageName: node linkType: hard -"jsonfile@npm:^6.0.1": - version: 6.1.0 - resolution: "jsonfile@npm:6.1.0" - dependencies: - graceful-fs: "npm:^4.1.6" - universalify: "npm:^2.0.0" - dependenciesMeta: - graceful-fs: - optional: true - checksum: 10c0/4f95b5e8a5622b1e9e8f33c96b7ef3158122f595998114d1e7f03985649ea99cb3cd99ce1ed1831ae94c8c8543ab45ebd044207612f31a56fd08462140e46865 - languageName: node - linkType: hard - "jsonify@npm:^0.0.1": version: 0.0.1 resolution: "jsonify@npm:0.0.1" @@ -9900,13 +9439,6 @@ __metadata: languageName: node linkType: hard -"jsonpointer@npm:^5.0.0": - version: 5.0.1 - resolution: "jsonpointer@npm:5.0.1" - checksum: 10c0/89929e58b400fcb96928c0504fcf4fc3f919d81e9543ceb055df125538470ee25290bb4984251e172e6ef8fcc55761eb998c118da763a82051ad89d4cb073fe7 - languageName: node - linkType: hard - "jsx-ast-utils@npm:^2.4.1 || ^3.0.0, jsx-ast-utils@npm:^3.3.5": version: 3.3.5 resolution: "jsx-ast-utils@npm:3.3.5" @@ -10011,13 +9543,6 @@ __metadata: languageName: node linkType: hard -"leven@npm:^3.1.0": - version: 3.1.0 - resolution: "leven@npm:3.1.0" - checksum: 10c0/cd778ba3fbab0f4d0500b7e87d1f6e1f041507c56fdcd47e8256a3012c98aaee371d4c15e0a76e0386107af2d42e2b7466160a2d80688aaa03e66e49949f42df - languageName: node - linkType: hard - "levn@npm:^0.4.1": version: 0.4.1 resolution: "levn@npm:0.4.1" @@ -10223,13 +9748,6 @@ __metadata: languageName: node linkType: hard -"lodash.sortby@npm:^4.7.0": - version: 4.7.0 - resolution: "lodash.sortby@npm:4.7.0" - checksum: 10c0/fc48fb54ff7669f33bb32997cab9460757ee99fafaf72400b261c3e10fde21538e47d8cfcbe6a25a31bcb5b7b727c27d52626386fc2de24eb059a6d64a89cdf5 - languageName: node - linkType: hard - "lodash.truncate@npm:^4.4.2": version: 4.4.2 resolution: "lodash.truncate@npm:4.4.2" @@ -10328,7 +9846,7 @@ __metadata: languageName: node linkType: hard -"magic-string@npm:^0.30.0, magic-string@npm:^0.30.21, magic-string@npm:^0.30.3, magic-string@npm:~0.30.11": +"magic-string@npm:^0.30.0, magic-string@npm:^0.30.21, magic-string@npm:~0.30.11": version: 0.30.21 resolution: "magic-string@npm:0.30.21" dependencies: @@ -10521,7 +10039,7 @@ __metadata: languageName: node linkType: hard -"minimatch@npm:^10.1.1, minimatch@npm:^10.2.2": +"minimatch@npm:^10.2.2": version: 10.2.5 resolution: "minimatch@npm:10.2.5" dependencies: @@ -10539,15 +10057,6 @@ __metadata: languageName: node linkType: hard -"minimatch@npm:^5.0.1": - version: 5.1.9 - resolution: "minimatch@npm:5.1.9" - dependencies: - brace-expansion: "npm:^2.0.1" - checksum: 10c0/4202718683815a7288b13e470160a4f9560cf392adef4f453927505817e01ef6b3476ecde13cfcaed17e7326dd3b69ad44eb2daeb19a217c5500f9277893f1d6 - languageName: node - linkType: hard - "minimatch@npm:^9.0.4, minimatch@npm:^9.0.5": version: 9.0.9 resolution: "minimatch@npm:9.0.9" @@ -11374,7 +10883,7 @@ __metadata: languageName: node linkType: hard -"path-scurry@npm:^2.0.0, path-scurry@npm:^2.0.2": +"path-scurry@npm:^2.0.2": version: 2.0.2 resolution: "path-scurry@npm:2.0.2" dependencies: @@ -12195,20 +11704,6 @@ __metadata: languageName: node linkType: hard -"pretty-bytes@npm:^5.3.0": - version: 5.6.0 - resolution: "pretty-bytes@npm:5.6.0" - checksum: 10c0/f69f494dcc1adda98dbe0e4a36d301e8be8ff99bfde7a637b2ee2820e7cb583b0fc0f3a63b0e3752c01501185a5cf38602c7be60da41bdf84ef5b70e89c370f3 - languageName: node - linkType: hard - -"pretty-bytes@npm:^6.1.1": - version: 6.1.1 - resolution: "pretty-bytes@npm:6.1.1" - checksum: 10c0/c7a660b933355f3b4587ad3f001c266a8dd6afd17db9f89ebc50812354bb142df4b9600396ba5999bdb1f9717300387dc311df91895c5f0f2a1780e22495b5f8 - languageName: node - linkType: hard - "pretty-format@npm:^27.0.2": version: 27.5.1 resolution: "pretty-format@npm:27.5.1" @@ -13114,96 +12609,6 @@ __metadata: languageName: node linkType: hard -"rollup@npm:^4.53.3": - version: 4.60.3 - resolution: "rollup@npm:4.60.3" - dependencies: - "@rollup/rollup-android-arm-eabi": "npm:4.60.3" - "@rollup/rollup-android-arm64": "npm:4.60.3" - "@rollup/rollup-darwin-arm64": "npm:4.60.3" - "@rollup/rollup-darwin-x64": "npm:4.60.3" - "@rollup/rollup-freebsd-arm64": "npm:4.60.3" - "@rollup/rollup-freebsd-x64": "npm:4.60.3" - "@rollup/rollup-linux-arm-gnueabihf": "npm:4.60.3" - "@rollup/rollup-linux-arm-musleabihf": "npm:4.60.3" - "@rollup/rollup-linux-arm64-gnu": "npm:4.60.3" - "@rollup/rollup-linux-arm64-musl": "npm:4.60.3" - "@rollup/rollup-linux-loong64-gnu": "npm:4.60.3" - "@rollup/rollup-linux-loong64-musl": "npm:4.60.3" - "@rollup/rollup-linux-ppc64-gnu": "npm:4.60.3" - "@rollup/rollup-linux-ppc64-musl": "npm:4.60.3" - "@rollup/rollup-linux-riscv64-gnu": "npm:4.60.3" - "@rollup/rollup-linux-riscv64-musl": "npm:4.60.3" - "@rollup/rollup-linux-s390x-gnu": "npm:4.60.3" - "@rollup/rollup-linux-x64-gnu": "npm:4.60.3" - "@rollup/rollup-linux-x64-musl": "npm:4.60.3" - "@rollup/rollup-openbsd-x64": "npm:4.60.3" - "@rollup/rollup-openharmony-arm64": "npm:4.60.3" - "@rollup/rollup-win32-arm64-msvc": "npm:4.60.3" - "@rollup/rollup-win32-ia32-msvc": "npm:4.60.3" - "@rollup/rollup-win32-x64-gnu": "npm:4.60.3" - "@rollup/rollup-win32-x64-msvc": "npm:4.60.3" - "@types/estree": "npm:1.0.8" - fsevents: "npm:~2.3.2" - dependenciesMeta: - "@rollup/rollup-android-arm-eabi": - optional: true - "@rollup/rollup-android-arm64": - optional: true - "@rollup/rollup-darwin-arm64": - optional: true - "@rollup/rollup-darwin-x64": - optional: true - "@rollup/rollup-freebsd-arm64": - optional: true - "@rollup/rollup-freebsd-x64": - optional: true - "@rollup/rollup-linux-arm-gnueabihf": - optional: true - "@rollup/rollup-linux-arm-musleabihf": - optional: true - "@rollup/rollup-linux-arm64-gnu": - optional: true - "@rollup/rollup-linux-arm64-musl": - optional: true - "@rollup/rollup-linux-loong64-gnu": - optional: true - "@rollup/rollup-linux-loong64-musl": - optional: true - "@rollup/rollup-linux-ppc64-gnu": - optional: true - "@rollup/rollup-linux-ppc64-musl": - optional: true - "@rollup/rollup-linux-riscv64-gnu": - optional: true - "@rollup/rollup-linux-riscv64-musl": - optional: true - "@rollup/rollup-linux-s390x-gnu": - optional: true - "@rollup/rollup-linux-x64-gnu": - optional: true - "@rollup/rollup-linux-x64-musl": - optional: true - "@rollup/rollup-openbsd-x64": - optional: true - "@rollup/rollup-openharmony-arm64": - optional: true - "@rollup/rollup-win32-arm64-msvc": - optional: true - "@rollup/rollup-win32-ia32-msvc": - optional: true - "@rollup/rollup-win32-x64-gnu": - optional: true - "@rollup/rollup-win32-x64-msvc": - optional: true - fsevents: - optional: true - bin: - rollup: dist/bin/rollup - checksum: 10c0/72c9c768f3fabeaeff228b6364e6600c169d6c231a4324c47c34880fd8961aebacd974cf905ecc2db75e56c6491bdd676409a06aecf589791bf419cd41d06e76 - languageName: node - linkType: hard - "rou3@npm:^0.8.1": version: 0.8.1 resolution: "rou3@npm:0.8.1" @@ -13422,13 +12827,6 @@ __metadata: languageName: node linkType: hard -"serialize-javascript@npm:^7.0.3": - version: 7.0.5 - resolution: "serialize-javascript@npm:7.0.5" - checksum: 10c0/7b7818e5267f6d474ec7a56d36ba69dd712726a13eab37706ec94615fb7ca8945471f2b7fb0dc9dbe8c79c1930c1079d97f66f91315c8c8c2ca6c38898cec96f - languageName: node - linkType: hard - "serve-static@npm:^2.2.0": version: 2.2.0 resolution: "serve-static@npm:2.2.0" @@ -13619,13 +13017,6 @@ __metadata: languageName: node linkType: hard -"smob@npm:^1.0.0": - version: 1.5.0 - resolution: "smob@npm:1.5.0" - checksum: 10c0/a1067f23265812de8357ed27312101af49b89129eb973e3f26ab5856ea774f88cace13342e66e32470f933ccfa916e0e9d0f7ca8bbd4f92dfab2af45c15956c2 - languageName: node - linkType: hard - "snake-case@npm:^3.0.4": version: 3.0.4 resolution: "snake-case@npm:3.0.4" @@ -13711,15 +13102,6 @@ __metadata: languageName: node linkType: hard -"source-map@npm:^0.8.0-beta.0": - version: 0.8.0-beta.0 - resolution: "source-map@npm:0.8.0-beta.0" - dependencies: - whatwg-url: "npm:^7.0.0" - checksum: 10c0/fb4d9bde9a9fdb2c29b10e5eae6c71d10e09ef467e1afb75fdec2eb7e11fa5b343a2af553f74f18b695dbc0b81f9da2e9fa3d7a317d5985e9939499ec6087835 - languageName: node - linkType: hard - "spdx-exceptions@npm:^2.1.0": version: 2.3.0 resolution: "spdx-exceptions@npm:2.3.0" @@ -14015,17 +13397,6 @@ __metadata: languageName: node linkType: hard -"stringify-object@npm:^3.3.0": - version: 3.3.0 - resolution: "stringify-object@npm:3.3.0" - dependencies: - get-own-enumerable-property-symbols: "npm:^3.0.0" - is-obj: "npm:^1.0.1" - is-regexp: "npm:^1.0.0" - checksum: 10c0/ba8078f84128979ee24b3de9a083489cbd3c62cb8572a061b47d4d82601a8ae4b4d86fa8c54dd955593da56bb7c16a6de51c27221fdc6b7139bb4f29d815f35b - languageName: node - linkType: hard - "stringz@npm:^2.1.0": version: 2.1.0 resolution: "stringz@npm:2.1.0" @@ -14060,13 +13431,6 @@ __metadata: languageName: node linkType: hard -"strip-comments@npm:^2.0.1": - version: 2.0.1 - resolution: "strip-comments@npm:2.0.1" - checksum: 10c0/984321b1ec47a531bdcfddd87f217590934e2d2f142198a080ec88588280239a5b58a81ca780730679b6195e52afef83673c6d6466c07c2277f71f44d7d9553d - languageName: node - linkType: hard - "strip-indent@npm:^3.0.0": version: 3.0.0 resolution: "strip-indent@npm:3.0.0" @@ -14349,36 +13713,17 @@ __metadata: languageName: node linkType: hard -"temp-dir@npm:^2.0.0": - version: 2.0.0 - resolution: "temp-dir@npm:2.0.0" - checksum: 10c0/b1df969e3f3f7903f3426861887ed76ba3b495f63f6d0c8e1ce22588679d9384d336df6064210fda14e640ed422e2a17d5c40d901f60e161c99482d723f4d309 - languageName: node - linkType: hard - -"tempy@npm:^0.6.0": - version: 0.6.0 - resolution: "tempy@npm:0.6.0" - dependencies: - is-stream: "npm:^2.0.0" - temp-dir: "npm:^2.0.0" - type-fest: "npm:^0.16.0" - unique-string: "npm:^2.0.0" - checksum: 10c0/ca0882276732d1313b85006b0427620cb4a8d7a57738a2311a72befae60ed152be7d5b41b951dcb447a01a35404bed76f33eb4e37c55263cd7f807eee1187f8f - languageName: node - linkType: hard - -"terser@npm:^5.17.4": - version: 5.31.0 - resolution: "terser@npm:5.31.0" +"terser@npm:^5.48.0": + version: 5.48.0 + resolution: "terser@npm:5.48.0" dependencies: "@jridgewell/source-map": "npm:^0.3.3" - acorn: "npm:^8.8.2" + acorn: "npm:^8.15.0" commander: "npm:^2.20.0" source-map-support: "npm:~0.5.20" bin: terser: bin/terser - checksum: 10c0/cb127a579b03fb9dcee0d293ff24814deedcd430f447933b618e8593b7454f615b5c8493c68e86a4b0188769d5ea2af5251b5d507edb208114f7e8aebdc7c850 + checksum: 10c0/d6ee713ea09a2b83b461ccbf1b76bd673a5090b3076ec13db7edc6d6470ab940d21c87b8d1ad82523b7cf02d9be07393fcdd334bde8f589e9bc3804da6fc32d2 languageName: node linkType: hard @@ -14450,7 +13795,7 @@ __metadata: languageName: node linkType: hard -"tinyglobby@npm:^0.2.10, tinyglobby@npm:^0.2.12, tinyglobby@npm:^0.2.14, tinyglobby@npm:^0.2.15, tinyglobby@npm:^0.2.16": +"tinyglobby@npm:^0.2.12, tinyglobby@npm:^0.2.14, tinyglobby@npm:^0.2.15, tinyglobby@npm:^0.2.16": version: 0.2.16 resolution: "tinyglobby@npm:0.2.16" dependencies: @@ -14555,15 +13900,6 @@ __metadata: languageName: node linkType: hard -"tr46@npm:^1.0.1": - version: 1.0.1 - resolution: "tr46@npm:1.0.1" - dependencies: - punycode: "npm:^2.1.0" - checksum: 10c0/41525c2ccce86e3ef30af6fa5e1464e6d8bb4286a58ea8db09228f598889581ef62347153f6636cd41553dc41685bdfad0a9d032ef58df9fbb0792b3447d0f04 - languageName: node - linkType: hard - "tr46@npm:^6.0.0": version: 6.0.0 resolution: "tr46@npm:6.0.0" @@ -14654,13 +13990,6 @@ __metadata: languageName: node linkType: hard -"type-fest@npm:^0.16.0": - version: 0.16.0 - resolution: "type-fest@npm:0.16.0" - checksum: 10c0/6b4d846534e7bcb49a6160b068ffaed2b62570d989d909ac3f29df5ef1e993859f890a4242eebe023c9e923f96adbcb3b3e88a198c35a1ee9a731e147a6839c3 - languageName: node - linkType: hard - "type-fest@npm:^0.21.3": version: 0.21.3 resolution: "type-fest@npm:0.21.3" @@ -14950,22 +14279,6 @@ __metadata: languageName: node linkType: hard -"unique-string@npm:^2.0.0": - version: 2.0.0 - resolution: "unique-string@npm:2.0.0" - dependencies: - crypto-random-string: "npm:^2.0.0" - checksum: 10c0/11820db0a4ba069d174bedfa96c588fc2c96b083066fafa186851e563951d0de78181ac79c744c1ed28b51f9d82ac5b8196ff3e4560d0178046ef455d8c2244b - languageName: node - linkType: hard - -"universalify@npm:^2.0.0": - version: 2.0.1 - resolution: "universalify@npm:2.0.1" - checksum: 10c0/73e8ee3809041ca8b818efb141801a1004e3fc0002727f1531f4de613ea281b494a40909596dae4a042a4fb6cd385af5d4db2e137b1362e0e91384b828effd3a - languageName: node - linkType: hard - "unpipe@npm:~1.0.0": version: 1.0.0 resolution: "unpipe@npm:1.0.0" @@ -15070,13 +14383,6 @@ __metadata: languageName: node linkType: hard -"upath@npm:^1.2.0": - version: 1.2.0 - resolution: "upath@npm:1.2.0" - checksum: 10c0/3746f24099bf69dbf8234cecb671e1016e1f6b26bd306de4ff8966fb0bc463fa1014ffc48646b375de1ab573660e3a0256f6f2a87218b2dfa1779a84ef6992fa - languageName: node - linkType: hard - "update-browserslist-db@npm:^1.2.3": version: 1.2.3 resolution: "update-browserslist-db@npm:1.2.3" @@ -15212,27 +14518,6 @@ __metadata: languageName: node linkType: hard -"vite-plugin-pwa@npm:^1.2.0": - version: 1.3.0 - resolution: "vite-plugin-pwa@npm:1.3.0" - dependencies: - debug: "npm:^4.3.6" - pretty-bytes: "npm:^6.1.1" - tinyglobby: "npm:^0.2.10" - workbox-build: "npm:^7.4.1" - workbox-window: "npm:^7.4.1" - peerDependencies: - "@vite-pwa/assets-generator": ^1.0.0 - vite: ^3.1.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0 - workbox-build: ^7.4.1 - workbox-window: ^7.4.1 - peerDependenciesMeta: - "@vite-pwa/assets-generator": - optional: true - checksum: 10c0/1cf7a43bf25d3f1276fe61e63cf7134b735b4426ddd2cf05775160e5bcd0a84eb705c15496abe78f6fb051f7a9481fcf854ed2b5b86922e07865ab37d5cb7a0b - languageName: node - linkType: hard - "vite-plugin-svgr@npm:^5.0.0": version: 5.2.0 resolution: "vite-plugin-svgr@npm:5.2.0" @@ -15403,13 +14688,6 @@ __metadata: languageName: node linkType: hard -"webidl-conversions@npm:^4.0.2": - version: 4.0.2 - resolution: "webidl-conversions@npm:4.0.2" - checksum: 10c0/def5c5ac3479286dffcb604547628b2e6b46c5c5b8a8cfaa8c71dc3bafc85859bde5fbe89467ff861f571ab38987cf6ab3d6e7c80b39b999e50e803c12f3164f - languageName: node - linkType: hard - "webidl-conversions@npm:^8.0.1": version: 8.0.1 resolution: "webidl-conversions@npm:8.0.1" @@ -15452,17 +14730,6 @@ __metadata: languageName: node linkType: hard -"whatwg-url@npm:^7.0.0": - version: 7.1.0 - resolution: "whatwg-url@npm:7.1.0" - dependencies: - lodash.sortby: "npm:^4.7.0" - tr46: "npm:^1.0.1" - webidl-conversions: "npm:^4.0.2" - checksum: 10c0/2785fe4647690e5a0225a79509ba5e21fdf4a71f9de3eabdba1192483fe006fc79961198e0b99f82751557309f17fc5a07d4d83c251aa5b2f85ba71e674cbee9 - languageName: node - linkType: hard - "which-boxed-primitive@npm:^1.1.0, which-boxed-primitive@npm:^1.1.1": version: 1.1.1 resolution: "which-boxed-primitive@npm:1.1.1" @@ -15576,196 +14843,6 @@ __metadata: languageName: node linkType: hard -"workbox-background-sync@npm:7.4.1": - version: 7.4.1 - resolution: "workbox-background-sync@npm:7.4.1" - dependencies: - idb: "npm:^7.0.1" - workbox-core: "npm:7.4.1" - checksum: 10c0/804729b83eb194a7694cb174d79090de85765f835bcc94d4c7eb739cb839385c6755baaf8dc82a43468b27488355cfaabb08cff751d5dfc70e07bf4c07e1c45d - languageName: node - linkType: hard - -"workbox-broadcast-update@npm:7.4.1": - version: 7.4.1 - resolution: "workbox-broadcast-update@npm:7.4.1" - dependencies: - workbox-core: "npm:7.4.1" - checksum: 10c0/fb640c12dc9034f4f0fe9636f532a41c8eccba360676b4cd28d479b59684eab727435310d0e115b935d92e7abfe5ee91a77d567f9cb824fe33064e18880d7c4f - languageName: node - linkType: hard - -"workbox-build@npm:^7.4.1": - version: 7.4.1 - resolution: "workbox-build@npm:7.4.1" - dependencies: - "@apideck/better-ajv-errors": "npm:^0.3.1" - "@babel/core": "npm:^7.24.4" - "@babel/preset-env": "npm:^7.11.0" - "@babel/runtime": "npm:^7.11.2" - "@rollup/plugin-babel": "npm:^6.1.0" - "@rollup/plugin-node-resolve": "npm:^16.0.3" - "@rollup/plugin-replace": "npm:^6.0.3" - "@rollup/plugin-terser": "npm:^1.0.0" - "@trickfilm400/rollup-plugin-off-main-thread": "npm:^3.0.0-pre1" - ajv: "npm:^8.6.0" - common-tags: "npm:^1.8.0" - eta: "npm:^4.5.1" - fast-json-stable-stringify: "npm:^2.1.0" - fs-extra: "npm:^9.0.1" - glob: "npm:^11.0.1" - pretty-bytes: "npm:^5.3.0" - rollup: "npm:^4.53.3" - source-map: "npm:^0.8.0-beta.0" - stringify-object: "npm:^3.3.0" - strip-comments: "npm:^2.0.1" - tempy: "npm:^0.6.0" - upath: "npm:^1.2.0" - workbox-background-sync: "npm:7.4.1" - workbox-broadcast-update: "npm:7.4.1" - workbox-cacheable-response: "npm:7.4.1" - workbox-core: "npm:7.4.1" - workbox-expiration: "npm:7.4.1" - workbox-google-analytics: "npm:7.4.1" - workbox-navigation-preload: "npm:7.4.1" - workbox-precaching: "npm:7.4.1" - workbox-range-requests: "npm:7.4.1" - workbox-recipes: "npm:7.4.1" - workbox-routing: "npm:7.4.1" - workbox-strategies: "npm:7.4.1" - workbox-streams: "npm:7.4.1" - workbox-sw: "npm:7.4.1" - workbox-window: "npm:7.4.1" - checksum: 10c0/18ed36ef28d31ffc26efbc0796d858b68b5dd9b61c86a9d5eef1c2a863ea05cc5a777a6e842af9a28a8efdbf84e6273b3ab82f8c60f495d95bdb5a7acf491da0 - languageName: node - linkType: hard - -"workbox-cacheable-response@npm:7.4.1": - version: 7.4.1 - resolution: "workbox-cacheable-response@npm:7.4.1" - dependencies: - workbox-core: "npm:7.4.1" - checksum: 10c0/fc7bb1e435262c6390c6cdab02f27c7304bdd5de663514278718620c15df894e1d57a1cf38b10ec5dbe673ce3d650010c650dcd3d6587eb4dfad170caeaa53d4 - languageName: node - linkType: hard - -"workbox-core@npm:7.4.1": - version: 7.4.1 - resolution: "workbox-core@npm:7.4.1" - checksum: 10c0/953c3bcec2c04cef44ac779ac6b525f639fade17c594cfa601d7892090da6e18abd3eda22d2d592d8b4df6aa6856c947770f8b960f70c1ac1c989f722d0e7f67 - languageName: node - linkType: hard - -"workbox-expiration@npm:7.4.1, workbox-expiration@npm:^7.3.0": - version: 7.4.1 - resolution: "workbox-expiration@npm:7.4.1" - dependencies: - idb: "npm:^7.0.1" - workbox-core: "npm:7.4.1" - checksum: 10c0/d940f2f263b5c1b5a27c4e0b7df9c44c9a8d9aa4ac4c8217610cee6e235aa4d97608d8713bb95a0da3228f145209e8cbc3d4ebc51455bd72a60d33f706640e15 - languageName: node - linkType: hard - -"workbox-google-analytics@npm:7.4.1": - version: 7.4.1 - resolution: "workbox-google-analytics@npm:7.4.1" - dependencies: - workbox-background-sync: "npm:7.4.1" - workbox-core: "npm:7.4.1" - workbox-routing: "npm:7.4.1" - workbox-strategies: "npm:7.4.1" - checksum: 10c0/107beef09bc14f7b83a257964dc4ac2f19d14fce20f5498e31172e8ef387fd46ee9e0dd63f01825c8baf49fc0fea0451e06fb1879df958b4df634f85564be8a1 - languageName: node - linkType: hard - -"workbox-navigation-preload@npm:7.4.1": - version: 7.4.1 - resolution: "workbox-navigation-preload@npm:7.4.1" - dependencies: - workbox-core: "npm:7.4.1" - checksum: 10c0/efe8fda736cc6afa1bf90eec65fccf206c179bda194264c5fa14063cd7d3b9bf399b960c22400212f83e48e3509cb6f586d1360710319049542cbe93254af5b9 - languageName: node - linkType: hard - -"workbox-precaching@npm:7.4.1": - version: 7.4.1 - resolution: "workbox-precaching@npm:7.4.1" - dependencies: - workbox-core: "npm:7.4.1" - workbox-routing: "npm:7.4.1" - workbox-strategies: "npm:7.4.1" - checksum: 10c0/e1f22df8945fe8cf3b77d8c8c9fb460d8e6469dbf0dba3d372a59e9649a6272024d6e63783ceb95bfed30f634ced524f1d0d3f21979fb6e48cdaa009e9be12c5 - languageName: node - linkType: hard - -"workbox-range-requests@npm:7.4.1": - version: 7.4.1 - resolution: "workbox-range-requests@npm:7.4.1" - dependencies: - workbox-core: "npm:7.4.1" - checksum: 10c0/fca4ca13a82056bac7b1599b103287b74819e8532500c5f229c27466681e243628df8cb9ed3660eff9dcb07b81b0b8bb5428271351a3502317423214fb5b5dc0 - languageName: node - linkType: hard - -"workbox-recipes@npm:7.4.1": - version: 7.4.1 - resolution: "workbox-recipes@npm:7.4.1" - dependencies: - workbox-cacheable-response: "npm:7.4.1" - workbox-core: "npm:7.4.1" - workbox-expiration: "npm:7.4.1" - workbox-precaching: "npm:7.4.1" - workbox-routing: "npm:7.4.1" - workbox-strategies: "npm:7.4.1" - checksum: 10c0/5d238895f7a3c0791ee315bd7ad6dcb268acdd2328abb3e78e655cff591ceb89d466ecf63bea92007b88d5bb52074a6a7a16b813f718b1cce89fe0153bae6ad7 - languageName: node - linkType: hard - -"workbox-routing@npm:7.4.1, workbox-routing@npm:^7.3.0": - version: 7.4.1 - resolution: "workbox-routing@npm:7.4.1" - dependencies: - workbox-core: "npm:7.4.1" - checksum: 10c0/11447d16c652de1667aa2be89634e426b615ff00f96d08d395a096afef07813a131d64c1f840344dd4210746800937437682a6bde7ef8a5233f371203c99d36a - languageName: node - linkType: hard - -"workbox-strategies@npm:7.4.1, workbox-strategies@npm:^7.3.0": - version: 7.4.1 - resolution: "workbox-strategies@npm:7.4.1" - dependencies: - workbox-core: "npm:7.4.1" - checksum: 10c0/db96df6ef1260e281c580a963e68390e64df198b0684f37a693449af928edb3679ac97390dabe2ec11dc617a632cf4410a65854dd399bfdeaafbb74aea6532d8 - languageName: node - linkType: hard - -"workbox-streams@npm:7.4.1": - version: 7.4.1 - resolution: "workbox-streams@npm:7.4.1" - dependencies: - workbox-core: "npm:7.4.1" - workbox-routing: "npm:7.4.1" - checksum: 10c0/f487b6e2f17119057b3f4265a0454de2304e5378ddfc95b1f7e4f660aab6f93f4b0ede86fd0c33fbcae3a077162020ea07846cb5fc69d7c71c6ddf5ad6f3b1da - languageName: node - linkType: hard - -"workbox-sw@npm:7.4.1": - version: 7.4.1 - resolution: "workbox-sw@npm:7.4.1" - checksum: 10c0/cef8ebffcef9e8f055d7f51273c8fcb9981b6c9de272c4d37b17a11cef5df55d05f814bda3d8daab6b7e207a484865cb08a579e0ba7341ed66ecce34acb3cfc3 - languageName: node - linkType: hard - -"workbox-window@npm:7.4.1, workbox-window@npm:^7.3.0, workbox-window@npm:^7.4.1": - version: 7.4.1 - resolution: "workbox-window@npm:7.4.1" - dependencies: - "@types/trusted-types": "npm:^2.0.2" - workbox-core: "npm:7.4.1" - checksum: 10c0/1c4db303d2f71cccd16e12ced9c85e2a2d16a00e3992bade92e990bcd1e6c8a49bc2021261e62145ba098065a691972a763f958d35f07232ee61e8d26555699b - languageName: node - linkType: hard - "wrap-ansi-cjs@npm:wrap-ansi@^7.0.0, wrap-ansi@npm:^7.0.0": version: 7.0.0 resolution: "wrap-ansi@npm:7.0.0" From 0ff2c7aedcdfa0e4f00cd38fb3104915d421c2c9 Mon Sep 17 00:00:00 2001 From: diondiondion Date: Wed, 3 Jun 2026 15:21:38 +0200 Subject: [PATCH 007/130] Fix about page error when selecting non-default Rules language (#39267) --- .../features/about/components/rules.tsx | 37 +++++++++---------- 1 file changed, 17 insertions(+), 20 deletions(-) diff --git a/app/javascript/mastodon/features/about/components/rules.tsx b/app/javascript/mastodon/features/about/components/rules.tsx index e8bde723cad..8fd7f2a3a7f 100644 --- a/app/javascript/mastodon/features/about/components/rules.tsx +++ b/app/javascript/mastodon/features/about/components/rules.tsx @@ -6,6 +6,7 @@ import { defineMessages, FormattedMessage, useIntl } from 'react-intl'; import { createSelector } from '@reduxjs/toolkit'; +import type { ApiRuleJSON } from '@/mastodon/api_types/instance'; import type { SelectItem } from '@/mastodon/components/dropdown_selector'; import { Select } from '@/mastodon/components/form_fields'; import type { RootState } from '@/mastodon/store'; @@ -104,13 +105,13 @@ export const RulesSection: FC = ({ isLoading = false }) => { defaultMessage='Language' /> - {localeOptions.map((option) => ( - ))} @@ -121,15 +122,10 @@ export const RulesSection: FC = ({ isLoading = false }) => { ); }; -const selectRules = (state: RootState) => { - const rules = state.server.server.item?.rules; - - if (!rules) { - return []; - } - - return rules; -}; +const selectRules = createSelector( + [(state: RootState) => state.server.server.item], + (item) => item?.rules ?? [], +); const rulesSelector = createSelector( [selectRules, (_state, locale: string) => locale], @@ -142,18 +138,19 @@ const rulesSelector = createSelector( return rule; } + const translatedRule: ApiRuleJSON = { ...rule }; const partialLocale = locale.split('-')[0]; if (partialLocale && translations[partialLocale]) { - rule.text = translations[partialLocale].text; - rule.hint = translations[partialLocale].hint; + translatedRule.text = translations[partialLocale].text; + translatedRule.hint = translations[partialLocale].hint; } if (translations[locale]) { - rule.text = translations[locale].text; - rule.hint = translations[locale].hint; + translatedRule.text = translations[locale].text; + translatedRule.hint = translations[locale].hint; } - return rule; + return translatedRule; }); }, ); From 65622a52e1aa8d67086975e889b9cbd71fd1834d Mon Sep 17 00:00:00 2001 From: Matt Jankowski Date: Wed, 3 Jun 2026 09:22:01 -0400 Subject: [PATCH 008/130] Exercise more of `rule_translations/_rule_translation` partial (#39266) --- spec/system/auth/registrations_spec.rb | 2 ++ 1 file changed, 2 insertions(+) diff --git a/spec/system/auth/registrations_spec.rb b/spec/system/auth/registrations_spec.rb index 04ad77f819a..e3b5683aa0e 100644 --- a/spec/system/auth/registrations_spec.rb +++ b/spec/system/auth/registrations_spec.rb @@ -5,12 +5,14 @@ require 'rails_helper' RSpec.describe 'Auth Registration' do context 'when there are server rules' do let!(:rule) { Fabricate :rule, text: 'You must be seven meters tall' } + let!(:rule_translation) { Fabricate :rule_translation, rule:, hint: 'Rule translation hint', text: rule.text } it 'shows rules page before proceeding with sign up' do visit new_user_registration_path expect(page) .to have_title(I18n.t('auth.register')) .and have_text(rule.text) + .and have_text(rule_translation.hint) end end From ce3fdf73f3bac6e2bb559399cbefe63d94fe0a2d Mon Sep 17 00:00:00 2001 From: diondiondion Date: Wed, 3 Jun 2026 15:26:43 +0200 Subject: [PATCH 009/130] [Accessibility] Add hotkeys `PageUp` and `PageDown` for list navigation (#39252) --- .../mastodon/components/hotkeys/index.tsx | 26 ++++++++++++------- .../features/keyboard_shortcuts/index.jsx | 14 +++++----- app/javascript/mastodon/features/ui/index.jsx | 6 +++-- .../mastodon/features/ui/util/focusUtils.ts | 8 +++--- app/javascript/mastodon/locales/en.json | 6 +++++ 5 files changed, 39 insertions(+), 21 deletions(-) diff --git a/app/javascript/mastodon/components/hotkeys/index.tsx b/app/javascript/mastodon/components/hotkeys/index.tsx index 751ec01fe57..481057bd7da 100644 --- a/app/javascript/mastodon/components/hotkeys/index.tsx +++ b/app/javascript/mastodon/components/hotkeys/index.tsx @@ -109,8 +109,8 @@ const hotkeyMatcherMap = { mention: just('m'), open: any('enter', 'o'), openProfile: just('p'), - moveDown: just('j'), - moveUp: just('k'), + moveDown: any('j', 'pagedown'), + moveUp: any('k', 'pageup'), moveToTop: just('0'), toggleHidden: just('x'), toggleSensitive: just('h'), @@ -147,9 +147,15 @@ const hotkeyMatcherMap = { type HotkeyName = keyof typeof hotkeyMatcherMap; -export type HandlerMap = Partial< - Record void> ->; +type HandlerFunction = + // When a handler returns a boolean, it should indicate whether the + // hotkey was handled (i.e. it resulted in an action). + // If `false` is returned, `preventDefault` and `stopPropagation` + // will not be called on the keyboard event, restoring the key's + // native behaviour. + ((event: KeyboardEvent) => boolean) | ((event: KeyboardEvent) => void); + +export type HandlerMap = Partial>; export function useHotkeys(handlers: HandlerMap) { const ref = useRef(null); @@ -184,7 +190,7 @@ export function useHotkeys(handlers: HandlerMap) { const matchCandidates: { // A candidate will be have an undefined handler if it's matched, // but handled in a parent component rather than this one. - handler: ((event: KeyboardEvent) => void) | undefined; + handler: HandlerFunction | undefined; priority: number; }[] = []; @@ -209,9 +215,11 @@ export function useHotkeys(handlers: HandlerMap) { const bestMatchingHandler = matchCandidates.at(0)?.handler; if (bestMatchingHandler) { - bestMatchingHandler(event); - event.stopPropagation(); - event.preventDefault(); + const wasHandled = bestMatchingHandler(event); + if (wasHandled !== false) { + event.stopPropagation(); + event.preventDefault(); + } } // Add last keypress to buffer diff --git a/app/javascript/mastodon/features/keyboard_shortcuts/index.jsx b/app/javascript/mastodon/features/keyboard_shortcuts/index.jsx index dc0e8cb4f8d..efc63ddfea4 100644 --- a/app/javascript/mastodon/features/keyboard_shortcuts/index.jsx +++ b/app/javascript/mastodon/features/keyboard_shortcuts/index.jsx @@ -68,7 +68,7 @@ class KeyboardShortcuts extends ImmutablePureComponent { - enter, o + , o @@ -88,11 +88,11 @@ class KeyboardShortcuts extends ImmutablePureComponent { - k + k, - j + j, @@ -112,15 +112,15 @@ class KeyboardShortcuts extends ImmutablePureComponent { - alt+n + +n - alt+x + +x - backspace + @@ -128,7 +128,7 @@ class KeyboardShortcuts extends ImmutablePureComponent { - esc + diff --git a/app/javascript/mastodon/features/ui/index.jsx b/app/javascript/mastodon/features/ui/index.jsx index 4910950b44f..22332eae6ef 100644 --- a/app/javascript/mastodon/features/ui/index.jsx +++ b/app/javascript/mastodon/features/ui/index.jsx @@ -508,7 +508,8 @@ class UI extends PureComponent { if (currentItemIndex === -1) { focusColumn(1); } else { - focusItemSibling(currentItemIndex, -1); + const wasHandled = focusItemSibling(currentItemIndex, -1); + return wasHandled; } }; @@ -517,7 +518,8 @@ class UI extends PureComponent { if (currentItemIndex === -1) { focusColumn(1); } else { - focusItemSibling(currentItemIndex, 1); + const wasHandled = focusItemSibling(currentItemIndex, 1); + return wasHandled; } }; diff --git a/app/javascript/mastodon/features/ui/util/focusUtils.ts b/app/javascript/mastodon/features/ui/util/focusUtils.ts index c632a0a51dc..80e9cb97683 100644 --- a/app/javascript/mastodon/features/ui/util/focusUtils.ts +++ b/app/javascript/mastodon/features/ui/util/focusUtils.ts @@ -159,13 +159,12 @@ export function focusItemSibling(index: number, direction: 1 | -1) { ); if (!siblingItem) { - return; + return false; } // If sibling element is empty, we skip it if (siblingItem.matches(':empty')) { - focusItemSibling(index + direction, direction); - return; + return focusItemSibling(index + direction, direction); } // Check if the sibling is a post or a 'follow suggestions' widget @@ -184,5 +183,8 @@ export function focusItemSibling(index: number, direction: 1 | -1) { }); targetElement.focus(); + return true; + } else { + return false; } } diff --git a/app/javascript/mastodon/locales/en.json b/app/javascript/mastodon/locales/en.json index 8df8070ed1a..44e2c9aa170 100644 --- a/app/javascript/mastodon/locales/en.json +++ b/app/javascript/mastodon/locales/en.json @@ -819,6 +819,12 @@ "keyboard_shortcuts.heading": "Keyboard shortcuts", "keyboard_shortcuts.home": "Open home timeline", "keyboard_shortcuts.hotkey": "Hotkey", + "keyboard_shortcuts.keys.alt": "Alt", + "keyboard_shortcuts.keys.backspace": "Backspace", + "keyboard_shortcuts.keys.enter": "Enter", + "keyboard_shortcuts.keys.esc": "Esc", + "keyboard_shortcuts.keys.page_down": "Page Down", + "keyboard_shortcuts.keys.page_up": "Page Up", "keyboard_shortcuts.legend": "Display this legend", "keyboard_shortcuts.load_more": "Focus \"Load more\" button", "keyboard_shortcuts.local": "Open local timeline", From 4cbea7f5a4ed55777390168428233ea5e8d79b71 Mon Sep 17 00:00:00 2001 From: diondiondion Date: Wed, 3 Jun 2026 15:32:13 +0200 Subject: [PATCH 010/130] Limit compose field height to prevent column scrolling (#39268) --- app/javascript/styles/mastodon/components.scss | 1 + 1 file changed, 1 insertion(+) diff --git a/app/javascript/styles/mastodon/components.scss b/app/javascript/styles/mastodon/components.scss index b5bc754dc43..c8bd186a8d7 100644 --- a/app/javascript/styles/mastodon/components.scss +++ b/app/javascript/styles/mastodon/components.scss @@ -614,6 +614,7 @@ body > [data-popper-placement] { display: block; box-sizing: border-box; width: 100%; + max-height: 300px; margin: 0; color: var(--color-text-primary); background: transparent; From 8b18195075402bc907222bacf6ed10b29b5274a2 Mon Sep 17 00:00:00 2001 From: David Roetzel Date: Wed, 3 Jun 2026 15:56:38 +0200 Subject: [PATCH 011/130] Add missing FeaturedCollection vocabulary to contexts (#39251) --- app/helpers/context_helper.rb | 17 +++++++++++++++++ .../feature_authorization_serializer.rb | 2 ++ .../activitypub/feature_request_serializer.rb | 2 ++ .../featured_collection_serializer.rb | 2 ++ .../activitypub/featured_item_serializer.rb | 2 ++ 5 files changed, 25 insertions(+) diff --git a/app/helpers/context_helper.rb b/app/helpers/context_helper.rb index f7e74481b2d..e092a441e91 100644 --- a/app/helpers/context_helper.rb +++ b/app/helpers/context_helper.rb @@ -42,6 +42,7 @@ module ContextHelper interaction_policies: { 'gts' => 'https://gotosocial.org/ns#', 'interactionPolicy' => { '@id' => 'gts:interactionPolicy', '@type' => '@id' }, + 'canFeature' => { '@id' => 'https://w3id.org/fep/7aa9#canFeature', '@type' => '@id' }, 'canQuote' => { '@id' => 'gts:canQuote', '@type' => '@id' }, 'automaticApproval' => { '@id' => 'gts:automaticApproval', '@type' => '@id' }, 'manualApproval' => { '@id' => 'gts:manualApproval', '@type' => '@id' }, @@ -52,6 +53,22 @@ module ContextHelper 'interactingObject' => { '@id' => 'gts:interactingObject', '@type' => '@id' }, 'interactionTarget' => { '@id' => 'gts:interactionTarget', '@type' => '@id' }, }, + feature_requests: { 'FeatureRequest' => 'https://w3id.org/fep/7aa9#FeatureRequest' }, + featured_collections: { + 'FeaturedCollection' => 'https://w3id.org/fep/7aa9#FeaturedCollection', + 'FeaturedItem' => 'https://w3id.org/fep/7aa9#FeaturedItem', + 'FeatureRequest' => 'https://w3id.org/fep/7aa9#FeatureRequest', + 'FeatureAuthorization' => 'https://w3id.org/fep/7aa9#FeatureAuthorization', + 'topic' => { '@id' => 'https://w3id.org/fep/7aa9#topic', '@type' => '@id' }, + 'featuredObject' => { '@id' => 'https://w3id.org/fep/7aa9#featuredObject', '@type' => '@id' }, + 'featureAuthorization' => { '@id' => 'https://w3id.org/fep/7aa9#featureAuthorization', '@type' => '@id' }, + }, + feature_authorizations: { + 'gts' => 'https://gotosocial.org/ns#', + 'FeatureAuthorization' => 'https://w3id.org/fep/7aa9#FeatureAuthorization', + 'interactingObject' => { '@id' => 'gts:interactingObject', '@type' => '@id' }, + 'interactionTarget' => { '@id' => 'gts:interactionTarget', '@type' => '@id' }, + }, }.freeze def full_context diff --git a/app/serializers/activitypub/feature_authorization_serializer.rb b/app/serializers/activitypub/feature_authorization_serializer.rb index 4181025802d..5a34229d731 100644 --- a/app/serializers/activitypub/feature_authorization_serializer.rb +++ b/app/serializers/activitypub/feature_authorization_serializer.rb @@ -3,6 +3,8 @@ class ActivityPub::FeatureAuthorizationSerializer < ActivityPub::Serializer include RoutingHelper + context_extensions :feature_authorizations + attributes :id, :type, :interacting_object, :interaction_target def id diff --git a/app/serializers/activitypub/feature_request_serializer.rb b/app/serializers/activitypub/feature_request_serializer.rb index a7a22f4ea0f..b1b84e62d18 100644 --- a/app/serializers/activitypub/feature_request_serializer.rb +++ b/app/serializers/activitypub/feature_request_serializer.rb @@ -1,6 +1,8 @@ # frozen_string_literal: true class ActivityPub::FeatureRequestSerializer < ActivityPub::Serializer + context_extensions :feature_requests + attributes :id, :type, :instrument attribute :virtual_object, key: :object diff --git a/app/serializers/activitypub/featured_collection_serializer.rb b/app/serializers/activitypub/featured_collection_serializer.rb index b83e0bf9ea7..213f5b4e929 100644 --- a/app/serializers/activitypub/featured_collection_serializer.rb +++ b/app/serializers/activitypub/featured_collection_serializer.rb @@ -1,6 +1,8 @@ # frozen_string_literal: true class ActivityPub::FeaturedCollectionSerializer < ActivityPub::Serializer + context_extensions :discoverable, :featured_collections, :hashtag, :sensitive + attributes :id, :type, :total_items, :name, :attributed_to, :url, :sensitive, :discoverable, :published, :updated diff --git a/app/serializers/activitypub/featured_item_serializer.rb b/app/serializers/activitypub/featured_item_serializer.rb index 4620c2d71ae..527c611c46c 100644 --- a/app/serializers/activitypub/featured_item_serializer.rb +++ b/app/serializers/activitypub/featured_item_serializer.rb @@ -3,6 +3,8 @@ class ActivityPub::FeaturedItemSerializer < ActivityPub::Serializer include RoutingHelper + context_extensions :featured_collections + attributes :id, :type, :featured_object, :feature_authorization, :published def id From 52aa8a44bbd0c9a6673cbd9b7c088020be938799 Mon Sep 17 00:00:00 2001 From: Eugen Rochko Date: Wed, 3 Jun 2026 17:09:26 +0200 Subject: [PATCH 012/130] Bump version to v4.6.0-beta.1 (#39222) Co-authored-by: Claire Co-authored-by: diondiondion --- CHANGELOG.md | 139 ++++++++++++++++++++++++++++++++++++++++ lib/mastodon/version.rb | 2 +- 2 files changed, 140 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index d4201950d22..a0240292833 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,145 @@ All notable changes to this project will be documented in this file. +## [4.6.0] - UNRELEASED + +### Added + +- **Add collections** (#37992, #37005, #37049, #37020, #37053, #37110, #37117, #37122, #37154, #37157, #37176, #37192, #37222, #37225, #37254, #37277, #37298, #37322, #37434, #37468, #37514, #37512, #37549, #37556, #37560, #37580, #37591, #37552, #37618, #37643, #37658, #37731, #37678, #37741, #37762, #37790, #37805, #37823, #37837, #37842, #37850, #37848, #37812, #37950, #37898, #37916, #37920, #37927, #37928, #37961, #37967, #37974, #37989, #37986, #38004, #38026, #38027, #38030, #38038, #38065, #38081, #38082, #38096, #38106, #38113, #38124, #38133, #38144, #38153, #38166, #38167, #38169, #38170, #38177, #38193, #38213, #38251, #38255, #38256, #38282, #38298, #38292, #38307, #38306, #38316, #38115, #38329, #38334, #38337, #38351, #38368, #38370, #38356, #38383, #38386, #38385, #38394, #38393, #38399, #38402, #38409, #38414, #38413, #38424, #38425, #38450, #38508, #38528, #38534, #38536, #38540, #38543, #38491, #38586, #38611, #38588, #38612, #38628, #38626, #38630, #38633, #38629, #38638, #38645, #38644, #38636, #38660, #38657, #38688, #38690, #38672, #38698, #38697, #38708, #38712, #38713, #38709, #38719, #38728, #38730, #38732, #38739, #38749, #38751, #38750, #38767, #38769, #38783, #38785, #38959, #38786, #38794, #38776, #38817, #38792, #38822, #38827, #38831, #38830, #38844, #38843, #38852, #38850, #38847, #38865, #38897, #38900, #38919, #38933, #38934, #38935, #38942, #38941, #38954, #38961, #38957, #38962, #38991, #39009, #39062, #39029, #39069, #39020, #39073, #39082, #39096, #39080, #39182, #39143, #39127, #37929, #38029, #39194, #39198, #39210, #39211, #39202, #39214, #39215, #39220, #39234, #39260, and #39251 by @ChaosExAnima, @ClearlyClaire, @Gargron, @arte7, @diondiondion, @mjankowski, @oneiros, and @shleeable) + - Create collections with up to 25 accounts each, then share them with others. You can read more about this feature [on our blog](https://blog.joinmastodon.org/2026/04/designing-collections/). This is based on FEP-7aa9 (Featured Collections) to be interoperable with the wider Fediverse. All the new API methods [are documented here](https://docs.joinmastodon.org/client/collections/). +- **Add email subscriptions** (#38163, #38507, #38502, #38487, #38527, #38582, #38741, #38907, and #39162 by @ClearlyClaire and @Gargron) + - Admins can allow specific roles to enable email subscriptions on their profile, allowing anonymous visitors to subscribe to their posts via email. +- **Add new overview landing page setting** (#39074, #39170, #39163, and #39138 by @Gargron, @diondiondion, and @zunda) + - Admins can choose a new frontpage for anonymous visitors, which combines the about page and most recent posts from local profiles. +- **Add ability to require 2FA for specific roles** (including Everybody) (#37701, #37846, and #38906 by @ClearlyClaire and @mjankowski) +- Add export for custom filters (#39085 by @arte7) +- Add ability to search email blocks by domain in admin UI (#38923 by @arte7) +- Add new endpoints for profile editing in REST API (#37912, #37934, #37932, #38221, and #38339 by @ClearlyClaire) + - Add `GET /api/v1/profile` and `PATCH /api/v1/profile` to replace the existing `update_credentials` endpoint. See [the documentation](https://www.notion.so/joinmastodon/Mastodon-v4-6-0-beta1-changelog-3656208ac91b8088a745d15a9e81f727) for more information. +- Add `missing_attribution` boolean to preview cards in REST API (#38043 by @ClearlyClaire) + - Documentation: https://docs.joinmastodon.org/entities/PreviewCard/#missing_attribution +- Add `exclude_direct` flag to `/api/v1/accounts/:id/statuses` to exclude direct messages (#37763 by @ClearlyClaire) +- Add `max_note_length` and `max_display_name_length` attributes to `configuration.accounts` in `Instance` entity (#37991 by @ClearlyClaire) +- Add profile field limits to instance entity in REST API (#37535 by @mkljczk) + - This adds attributes `configuration.accounts.max_profile_fields`, `configuration.accounts.profile_field_name_limit` and `configuration.accounts.profile_field_value_limit` to the [`Instance` entity](https://docs.joinmastodon.org/entities/Instance). +- Add `unresolved` flag to `/api/v1/admin/reports` to query both resolved and unresolved reports (#38323 by @mkljczk) +- Add fallback attributes to notifications for new and infrequent notifications in REST API (#38832 and #38860 by @ClearlyClaire) + - This adds a [`supported_types`](https://docs.joinmastodon.org/methods/notifications/#query-parameters-1) parameter to `GET /api/v1/notifications`, `GET /api/v1/notifications/:id`, `GET /api/v2/notifications`, and `GET /api/v2/notifications/:group_key` along with a new `fallback` attribute for notifications and notification groups. +- Add support for posts in vertical languages in web UI (#37204, #38205, and #38797 by @shimon1024) +- Add `PageUp` and `PageDown` hotkeys for list navigation (#39252 by @diondiondion) +- Add `g`+`e` keyboard shortcut to access the trending page in web UI (#38014 by @antoinecellerier) +- Add `Cmd`/`Ctrl`+`Enter` for form submissions in more text areas in web UI (#37821 by @diondiondion) +- Add support for quoting by dragging a link into the compose form in web UI (#36859 and #36896 by @ClearlyClaire and @tribela) +- Add `text-autospace` to posts to improve rendering of mixed script posts in web UI (#37694 by @ahxxm) +- Add `nan-TW` to supported locales (#37650, #34923, #37822, and #37721 by @ClearlyClaire and @Yoxem) +- Add support for `hosts` resolver in request socket DNS lookup (#38699, #38866, and #39030 by @ClearlyClaire and @mjankowski) +- Add support for FEP-2c59 (Webfinger Backlink) (#38239, #38538, and #38639 by @ClearlyClaire and @shleeable) +- Add support for FEP-3b86 (Activity Intents) (#38120 and #38130 by @ClearlyClaire and @Gargron) +- Add support for alt text for profile pictures and headers (#37634, #37641, and #38000 by @ClearlyClaire and @Doxterpepper) +- Add support for multiple keypairs for remote accounts (#38279, #38407, #38419, #38511, #38516, #38515, #38555 and #39235 by @ClearlyClaire) +- Add support for the “require approval” feature for email domain blocks to `tootctl email_domain_blocks` (#34579 and #38107 by @ClearlyClaire and @e-nomem) +- Add `--keep-interacted` flag to `tootctl media remove` to preserve cached media on cleanup (#36200 by @northerner) +- Add systemd service file for prometheus exporter (#35130 by @ThisIsMissEm) + +### Changed + +- **Change design of profiles in web UI** (#37472, #37490, #37479, #37513, #37527, #37550, #37538, #37632, #37627, #37593, #37638, #37626, #37645, #37653, #37683, #37707, #37682, #37742, #37747, #37760, #37761, #37831, #37766, #37811, #37813, #37825, #37854, #37851, #37876, #37885, #37892, #37890, #37907, #37922, #37952, #37958, #37996, #37990, #37994, #38005, #38012, #38040, #38052, #38066, #38083, #38147, #38148, #38152, #38168, #38156, #38175, #38191, #38189, #38235, #38283, #38310, #38309, #38315, #38314, #38365, #38366, #38363, #38346, #38382, #38384, #38400, #38404, #38417, #38426, #38440, #38442, #38443, #38445, #38446, #38451, #38456, #38509, #38510, #38512, #38513, #38517, #38529, #38531, #38535, #38532, #38544, #38549, #38575, #38579, #38580, #38581, #38585, #38584, #38604, #38605, #38606, #38607, #38622, #38616, #38625, #38632, #38640, #38663, #38667, #38646, #38691, #38692, #38766, #38791, #38687, #38826, #38828, #38863, #38845, #38870, #38872, #38932, #38945, #38963, #38964, #39055, #39042, #38893, #39079, #39084, #39160, #39070, and #39217 by @ChaosExAnima, @ClearlyClaire, @Coro365, @diondiondion, and @shleeable) + - The profile screen has been entirely redesigned, has new features, and allows you to update your own profile directly without going into the preferences panel. You can read more about it [on our blog](https://blog.joinmastodon.org/2026/03/a-redesign-for-profiles/). +- **Change how #Wrapstodon reports are generated and displayed** (#37033, #37045, #37093, #37055, #37096, #37047, #37103, #37104, #37106, #37109, #37121, #37138, #37134, #37177, #37182, #37169, #37186, #37187, #37188, #37189, #37190, #37193, #37198, #37201, #37203, #37205, #37206, #37207, #37209, #37202, #37216, #37219, #37224, #37226, #37229, #37249, #37251, #37256, #37261, #37269, #37270, #37273, and #37289 by @ChaosExAnima, @ClearlyClaire, @channyeintun, and @diondiondion) + - This finishes up work started in 2024 by completely revamping how Wrapstodon reports are generated and displayed, reducing the amount of data collected and generating reports when active users ask for them. + - Instead of requiring manual generation from a server administrator, this is now offered between the 10th of December and the end of each year if enabled in the server settings. + - The design of the Wrapstodon report has also been fully reworked to be more delightful and easier to share! + - The relevant API endpoints are documented at https://docs.joinmastodon.org/methods/annual_reports/ +- Change pending user notification email to link directly to the pending account (#39206 by @vmstan) +- Changed emoji processing in web UI to make it less resource intensive and more robust (#39077, #39008, #39088, #38892, #38885, #38965, #38854, #38825, #38784, #38541, #37442, #37300, #37306, #37271, #37255, #37284, #37272, #37178, #37084, #37080, #37418, #39167, and #39126 by @ChaosExAnima, @ClearlyClaire, @diondiondion, and @gomasy) +- Change composer textarea to have a limited height to prevent column scrolling (#39268 by @diondiondion) +- Change mentions of “Mastodon gGmbH” to “Mastodon GmbH” (#39261 by @renchap) +- Change the limited profile message to be less misleading (#39231 by @mortie) +- Change images/videos in posts in web UI to not have unlimited height (#36966, #37035, #37136, and #37032 by @diondiondion) +- Change search field and tabs to stick to the top on the search results page in web UI (#38968 by @diondiondion) +- Change “anyone can quote” label to “quotes allowed” in web UI (#37427 by @vmstan) +- Change navigation by `j`/`k` hotkeys to anchor navigated item to top of viewport in web UI (#38036 by @diondiondion) +- Change hotkeys to focus columns to not reset scroll, add hotkey `0` to scroll to top in web UI (#37052 by @diondiondion) +- Change media modal swipe animation in web UI (#36916, #37034, #37323, and #37464 by @ChaosExAnima and @heathdutton) +- Change “Hide”/“Show all” eye icon in thread view in web UI (#22301 by @tribela) +- Change order of onboarding steps (follow people, then fill out profile) in web UI (#38121 by @Gargron) +- Change “Why do you want to join” field on the sign-up page to have a label (#38936 by @diondiondion) +- Change date of birth field on the sign-up page to use locale-specific fields order (#36039 and #36895 by @mjankowski) +- Change how invalid-but-not-expired invites are shown in admin UI (#38736 by @ClearlyClaire) +- Change wording and ordering of media display settings (#38731 by @mjankowski) +- Change wording of server account recommendation setting description (#36771 by @mjankowski) +- Change wording and ordering of account migration warnings (#20387 by @jsoref) +- Change wording of “Automatic post deletion” settings (#37286 by @mjankowski) +- Change wording of language filter settings to clarify they do not impact home/lists (#38490 by @mjankowski) +- Change invitations to only bypass sign-up approval setting when the issuer of the invitation has the `invite_bypass_approval` permission (#38278 by @ClearlyClaire) + - This splits the “Invite Users” permission into a new “Invite Users without review” permission. + - Existing roles will be updated to have the new permission if they have the old one, but default permissions will not include the new `invite_bypass_approval` permission. +- Change followers synchronization mechanism on followers-only posts to be skipped for accounts with 25k followers or more (#37302 by @ClearlyClaire) +- Change “dark”, “light” and “high contrast” themes to be separate “Color scheme” and “Contrast” settings handled by a single theme (#37095, #37120, #37288, #37459, #37470, #37477, #37519, #37520, #37523, #37524, #37526, #37612, #37824, #37807, #37810, #37819, #37906, and #38261 by @ClearlyClaire, @diondiondion, and @mjankowski) + - Existing settings should be migrated automatically from user settings, and using browser defaults otherwise. + - This also allows third-party theme authors to make use of the same browser defaults and user settings. Learn more about this in [our new Theming docs](https://docs.joinmastodon.org/dev/frontend/theming/). +- Change default theme to use CSS theme tokens (#36861, #36936, #37019, #37054, #37056, #37081, #37105, #37268, #37841, #37843, #38387, #38459, and #38621 by @diondiondion) + - A [guide to using the new tokens](https://docs.joinmastodon.org/dev/frontend/design-tokens/) can be found in our docs. +- Change location blocks in default `nginx.conf` (#19644 and #37866 by @BedrockDigger and @Izorkin) +- Change `proxy_read_timeout` to 120 seconds in default `nginx.conf` (#30599 by @shleeable) +- Change JSON-LD collection handling (#34595 and #37806 by @ClearlyClaire and @sneakers-the-rat) + +### Removed + +- Remove support for EOL Node version 20 (#38926 by @mjankowski) +- Remove support for Ruby 3.2 (#37476 by @mjankowski) +- Remove support for `ENABLE_SIDEKIQ_UNIQUE_JOBS_UI` (#38340 by @ClearlyClaire) +- Remove support for ImageMagick (#37488 by @mjankowski) + +### Fixed + +- Fix accessibility issues in web UI (#37250, #38006, #38033, #38188, #38230, #38252, #38257, #38285, #38293, #38362, #38387, #38459, #38796, #38801, #39098, #39111, #39120, #39129, #39133, #39134, #39144, #39145, #39149, #39164, #39165, #39169, and #39181 by @ChaosExAnima and @diondiondion) +- Fix processing some link previews where text is language-tagged (#39190 by @zunda) +- Fix error when “New trends” email is sent at the same time trends are recomputed (#39122 by @arte7) +- Fix hover card opening even when not preceded by mouse movement in web UI (#39166 by @diondiondion) +- Fix [ominous](https://mastodon.social/@mcc/116404362104299129) "Moments remaining" timestamp in web UI (#38488 and #38689 by @ChaosExAnima and @MitarashiDango) +- Fix filters not being applied to search results in web UI (#36346 by @ClearlyClaire) +- Fix error when visiting non-public hashtag timelines (#36961 by @diondiondion) +- Fix duplicate favourite/boost counters in some languages (#36844 by @ChaosExAnima) +- Fix unblocking domain from blocked domains column not updating the list in web UI (#38882 by @tribela) +- Fix profile dropdown menu sometimes ending with a separator in web UI (#38481 by @mkljczk) +- Fix short numbers rounding up instead of truncating in web UI (#38114 by @serranodfm) +- Fix directory showing load more button when no more profiles exist in web UI (#37465 by @heathdutton) +- Fix focus restoration after closing some modals in web UI (#37424 by @MegaManSec) +- Fix video modals being pushed down on mobile in web UI (#37421 by @ChaosExAnima) +- Fix outer page margins when viewport width equals content width in web UI (#36733 by @diondiondion) +- Fix announcement margin when in advanced web UI (#36714 by @ChaosExAnima) +- Fix navigation overflow issue in advanced web UI (#39178 by @diondiondion) +- Fix stale merging stale account from cached instance API response in web UI (#37666 by @ChaosExAnima) +- Fix HTML `lang` attribute being stripped out of remote posts (#39114 by @artemist) +- Fix remote posts with large media descriptions being rejected (#39135 by @ClearlyClaire) +- Fix some occurrence of PostgreSQL log pollution when processing new hashtags (#35792 by @oelison) +- Fix replica database not being used when `REPLICA_DB_HOST` is used but neither `REPLICA_DB_NAME` nor `REPLICA_DATABASE_URL` (#37240 by @smiba) +- Fix remote media attachment thumbnails not being stored in the `cache/` directory (#36911 by @shugo) +- Fix race condition when processing posts twice with the same idempotency key (#37879 by @ClearlyClaire) +- Fix various missing translation strings (#37671, #37838, #37078, #37371, and #37827 by @ClearlyClaire, @mjankowski, and @valtlai) +- Fix last post time for remote accounts not being accurately tracked (#37619 by @ClearlyClaire) +- Fix filtering of mentions from filtered-on-their-origin-server accounts (#37583 by @ClearlyClaire) +- Fix irrelevant remote accounts being passed through to local fan-out worker (#37589 by @ClearlyClaire) +- Fix required field markers being displayed on fields that cannot be empty anyway in settings (#37291 by @diondiondion) +- Fix thumbnails for links from The Guardian (and possibly other CDNs that check URL hashes) not showing up (#36139 by @phocks) +- Fix `mastodon-async-refresh` response header not being exposed through CORS (#38914 by @mkljczk) +- Fix FASP availability being incorrectly updated (#38818 by @oneiros) +- Fix use of deprecated `vsync` FFmpeg option, using `fps_mode` instead (FFmpeg >= 5.1 now required) (#38198 by @mjankowski) +- Fix unnecessary downcasing of some words in admin UI (#37364 by @ClearlyClaire) +- Fix delivery worker counting unsalvageable HTTP errors as successes (#37235 by @shleeable) +- Fix streaming heartbeat comment not being its own event (#37389 by @ClearlyClaire) +- Fix posts with edited out media attachments being returned in `GET /api/v1/accounts/:id/statuses?only_media=true` (#37363 by @ClearlyClaire) +- Fix wrong media attachment URLs being returned from `DELETE /api/v1/statuses/:id` (#35880 by @dbarabashh) +- Fix hashtag matching by replacing negative look-behind with positive look-behind (#37684 and #38212 by @ClearlyClaire) +- Fix discovery of ActivityPub representation from HTML tags in presence of a non-ActivityPub alternate Link header (#37439 by @shleeable) +- Fix Webfinger endpoint not handling new ActivityPub ID scheme (#38391 by @ClearlyClaire) +- Fix error when admin-selected theme does not exist by falling back to `default` theme (#38703 by @shleeable) +- Fix wrong endonyms for Divehi and Latvian in languages list (#36254 and #36876 by @cuu508 and @shimon1024) +- Fix `Accept` headers when fetching ActivityPub resources not including JSON-LD profile (#30354 by @TheOneric) +- Fix wrong hover indicators on unclickable items in admin UI (#38782 by @diondiondion) +- Fix streaming server using deprecated `url.parse` instead of WHATWG URL API (#36973 by @Exagone313) + ## [4.5.11] - 2026-06-03 ### Security diff --git a/lib/mastodon/version.rb b/lib/mastodon/version.rb index 711cf067392..5d612150881 100644 --- a/lib/mastodon/version.rb +++ b/lib/mastodon/version.rb @@ -17,7 +17,7 @@ module Mastodon end def default_prerelease - 'alpha.9' + 'beta.1' end def prerelease From 2713f1444704da9a5dd3fcb4ac809aed31c827fa Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Thu, 4 Jun 2026 10:12:30 +0200 Subject: [PATCH 013/130] New Crowdin Translations (automated) (#39259) Co-authored-by: GitHub Actions --- app/javascript/mastodon/locales/af.json | 1 - app/javascript/mastodon/locales/an.json | 1 - app/javascript/mastodon/locales/ar.json | 1 - app/javascript/mastodon/locales/az.json | 1 - app/javascript/mastodon/locales/be.json | 2 +- app/javascript/mastodon/locales/bg.json | 1 - app/javascript/mastodon/locales/br.json | 1 - app/javascript/mastodon/locales/ca.json | 1 - app/javascript/mastodon/locales/ckb.json | 1 - app/javascript/mastodon/locales/cs.json | 1 - app/javascript/mastodon/locales/cy.json | 1 - app/javascript/mastodon/locales/da.json | 2 +- app/javascript/mastodon/locales/de.json | 2 +- app/javascript/mastodon/locales/el.json | 6 +++--- app/javascript/mastodon/locales/en-GB.json | 1 - app/javascript/mastodon/locales/eo.json | 1 - app/javascript/mastodon/locales/es-AR.json | 2 +- app/javascript/mastodon/locales/es-MX.json | 2 +- app/javascript/mastodon/locales/es.json | 2 +- app/javascript/mastodon/locales/et.json | 2 +- app/javascript/mastodon/locales/eu.json | 1 - app/javascript/mastodon/locales/fa.json | 1 - app/javascript/mastodon/locales/fo.json | 1 - app/javascript/mastodon/locales/fr-CA.json | 2 +- app/javascript/mastodon/locales/fr.json | 2 +- app/javascript/mastodon/locales/fy.json | 1 - app/javascript/mastodon/locales/ga.json | 2 +- app/javascript/mastodon/locales/gd.json | 1 - app/javascript/mastodon/locales/gl.json | 2 +- app/javascript/mastodon/locales/he.json | 2 +- app/javascript/mastodon/locales/hi.json | 1 - app/javascript/mastodon/locales/hu.json | 2 +- app/javascript/mastodon/locales/ia.json | 1 - app/javascript/mastodon/locales/id.json | 1 - app/javascript/mastodon/locales/ie.json | 1 - app/javascript/mastodon/locales/io.json | 1 - app/javascript/mastodon/locales/is.json | 2 +- app/javascript/mastodon/locales/it.json | 2 +- app/javascript/mastodon/locales/ja.json | 1 - app/javascript/mastodon/locales/ko.json | 1 - app/javascript/mastodon/locales/ku.json | 1 - app/javascript/mastodon/locales/lad.json | 1 - app/javascript/mastodon/locales/lt.json | 1 - app/javascript/mastodon/locales/lv.json | 1 - app/javascript/mastodon/locales/mr.json | 1 - app/javascript/mastodon/locales/ms.json | 1 - app/javascript/mastodon/locales/my.json | 1 - app/javascript/mastodon/locales/nan-TW.json | 1 - app/javascript/mastodon/locales/nl.json | 2 +- app/javascript/mastodon/locales/nn.json | 1 - app/javascript/mastodon/locales/no.json | 1 - app/javascript/mastodon/locales/oc.json | 1 - app/javascript/mastodon/locales/pl.json | 1 - app/javascript/mastodon/locales/pt-BR.json | 2 +- app/javascript/mastodon/locales/pt-PT.json | 1 - app/javascript/mastodon/locales/ro.json | 1 - app/javascript/mastodon/locales/ru.json | 1 - app/javascript/mastodon/locales/sa.json | 1 - app/javascript/mastodon/locales/sc.json | 1 - app/javascript/mastodon/locales/sco.json | 1 - app/javascript/mastodon/locales/si.json | 1 - app/javascript/mastodon/locales/sk.json | 1 - app/javascript/mastodon/locales/sl.json | 1 - app/javascript/mastodon/locales/sq.json | 2 +- app/javascript/mastodon/locales/sr-Latn.json | 1 - app/javascript/mastodon/locales/sr.json | 1 - app/javascript/mastodon/locales/sv.json | 1 - app/javascript/mastodon/locales/th.json | 1 - app/javascript/mastodon/locales/tr.json | 2 +- app/javascript/mastodon/locales/tt.json | 1 - app/javascript/mastodon/locales/uk.json | 1 - app/javascript/mastodon/locales/vi.json | 1 - app/javascript/mastodon/locales/zh-CN.json | 2 +- app/javascript/mastodon/locales/zh-HK.json | 1 - app/javascript/mastodon/locales/zh-TW.json | 2 +- config/locales/de.yml | 2 ++ config/locales/es-MX.yml | 4 ++-- config/locales/et.yml | 4 ++++ config/locales/ga.yml | 4 ++++ config/locales/he.yml | 2 ++ config/locales/zh-CN.yml | 2 ++ 81 files changed, 40 insertions(+), 79 deletions(-) diff --git a/app/javascript/mastodon/locales/af.json b/app/javascript/mastodon/locales/af.json index daa78a0cd4e..ac05096895e 100644 --- a/app/javascript/mastodon/locales/af.json +++ b/app/javascript/mastodon/locales/af.json @@ -200,7 +200,6 @@ "lightbox.next": "Volgende", "lightbox.previous": "Vorige", "limited_account_hint.action": "Vertoon profiel in elk geval", - "limited_account_hint.title": "Hierdie profiel is deur moderators van {domain} versteek.", "link_preview.author": "Deur {name}", "lists.delete": "Verwyder lys", "lists.edit": "Redigeer lys", diff --git a/app/javascript/mastodon/locales/an.json b/app/javascript/mastodon/locales/an.json index b5d282f1a4f..469403241b2 100644 --- a/app/javascript/mastodon/locales/an.json +++ b/app/javascript/mastodon/locales/an.json @@ -264,7 +264,6 @@ "lightbox.next": "Siguient", "lightbox.previous": "Anterior", "limited_account_hint.action": "Amostrar perfil de totz modos", - "limited_account_hint.title": "Este perfil ha estau amagau per los moderadors de {domain}.", "lists.delete": "Borrar lista", "lists.edit": "Editar lista", "lists.replies_policy.followed": "Qualsequier usuario seguiu", diff --git a/app/javascript/mastodon/locales/ar.json b/app/javascript/mastodon/locales/ar.json index cfd6160b924..2148b1053ba 100644 --- a/app/javascript/mastodon/locales/ar.json +++ b/app/javascript/mastodon/locales/ar.json @@ -773,7 +773,6 @@ "lightbox.zoom_in": "التكبير إلى الحجم الفعلي", "lightbox.zoom_out": "التكبير ليناسب الحجم", "limited_account_hint.action": "إظهار الملف التعريفي على أي حال", - "limited_account_hint.title": "تم إخفاء هذا الملف الشخصي من قبل مشرفي {domain}.", "link_preview.author": "مِن {name}", "link_preview.more_from_author": "المزيد من {name}", "link_preview.shares": "{count, plural, zero {{counter} منشور}one {{counter} منشور} two {{counter} منشور} few {{counter} منشور} many {{counter} منشور} other {{counter} منشور}}", diff --git a/app/javascript/mastodon/locales/az.json b/app/javascript/mastodon/locales/az.json index 6710075ad71..fb1969bbcdf 100644 --- a/app/javascript/mastodon/locales/az.json +++ b/app/javascript/mastodon/locales/az.json @@ -505,7 +505,6 @@ "lightbox.zoom_in": "Həqiqi ölçüyə qayıt", "lightbox.zoom_out": "Sığacaq şəkildə yaxınlaşdır", "limited_account_hint.action": "Yenə də profili göstər", - "limited_account_hint.title": "Bu profil, {domain} moderatorları tərəfindən gizlədildi.", "link_preview.author": "Müəllif: {name}", "link_preview.more_from_author": "{name} - daha çox", "link_preview.shares": "{count, plural, one {{counter} göndəriş} other {{counter} göndəriş}}", diff --git a/app/javascript/mastodon/locales/be.json b/app/javascript/mastodon/locales/be.json index 2a7c4dd41cf..f0fd8edfbfa 100644 --- a/app/javascript/mastodon/locales/be.json +++ b/app/javascript/mastodon/locales/be.json @@ -850,7 +850,7 @@ "lightbox.zoom_in": "Маштабаваць да фактычнага памеру", "lightbox.zoom_out": "Дапасаваць усё змесціва пад памеры экрана", "limited_account_hint.action": "Усе роўна паказваць профіль", - "limited_account_hint.title": "Гэты профіль быў схаваны мадэратарамі {domain}.", + "limited_account_hint.title": "Гэты профіль або сервер быў схаваны мадэратарамі {domain}.", "link_preview.author": "Ад {name}", "link_preview.more_from_author": "Больш ад {name}", "link_preview.shares": "{count, plural, one {{counter} допіс} few {{counter} допісы} many {{counter} допісаў} other {{counter} допісу}}", diff --git a/app/javascript/mastodon/locales/bg.json b/app/javascript/mastodon/locales/bg.json index 58106c55a84..de7d0ab6239 100644 --- a/app/javascript/mastodon/locales/bg.json +++ b/app/javascript/mastodon/locales/bg.json @@ -464,7 +464,6 @@ "lightbox.zoom_in": "Увеличение до действителната големина", "lightbox.zoom_out": "Увеличение до побиране", "limited_account_hint.action": "Показване на профила въпреки това", - "limited_account_hint.title": "Този профил е бил скрит от модераторите на {domain}.", "link_preview.author": "От {name}", "link_preview.more_from_author": "Още от {name}", "link_preview.shares": "{count, plural, one {{counter} публикация} other {{counter} публикации}}", diff --git a/app/javascript/mastodon/locales/br.json b/app/javascript/mastodon/locales/br.json index 9ec1ff452d1..bdeba762fe5 100644 --- a/app/javascript/mastodon/locales/br.json +++ b/app/javascript/mastodon/locales/br.json @@ -442,7 +442,6 @@ "lightbox.next": "Da-heul", "lightbox.previous": "A-raok", "limited_account_hint.action": "Diskouez ar profil memes tra", - "limited_account_hint.title": "Kuzhet eo bet ar profil-mañ gant an evezhierien eus {domain}.", "link_preview.author": "Gant {name}", "link_preview.more_from_author": "Muioc'h gant {name}", "link_preview.shares": "{count, plural, one {{counter} embannadur} two {{counter} embannadur} few {{counter} embannadur} many {{counter} embannadur} other {{counter} embannadur}}", diff --git a/app/javascript/mastodon/locales/ca.json b/app/javascript/mastodon/locales/ca.json index 7b721371115..767f4e5c43a 100644 --- a/app/javascript/mastodon/locales/ca.json +++ b/app/javascript/mastodon/locales/ca.json @@ -559,7 +559,6 @@ "lightbox.zoom_in": "Amplia fins a la mida real", "lightbox.zoom_out": "Amplia fins a encabir", "limited_account_hint.action": "Mostra el perfil de totes maneres", - "limited_account_hint.title": "Aquest perfil l'han amagat els moderadors de {domain}.", "link_preview.author": "Per {name}", "link_preview.more_from_author": "Més de {name}", "link_preview.shares": "{count, plural, one {{counter} publicació} other {{counter} publicacions}}", diff --git a/app/javascript/mastodon/locales/ckb.json b/app/javascript/mastodon/locales/ckb.json index 8a7ff76c6f5..564e1d159bc 100644 --- a/app/javascript/mastodon/locales/ckb.json +++ b/app/javascript/mastodon/locales/ckb.json @@ -306,7 +306,6 @@ "lightbox.next": "داهاتوو", "lightbox.previous": "پێشوو", "limited_account_hint.action": "بەهەر حاڵ پڕۆفایلی پیشان بدە", - "limited_account_hint.title": "ئەم پرۆفایلە لەلایەن بەڕێوەبەرانی {domain} شاراوەتەوە.", "lists.delete": "سڕینەوەی لیست", "lists.edit": "دەستکاری لیست", "lists.replies_policy.followed": "هەر بەکارهێنەرێکی بەدواکەوتوو", diff --git a/app/javascript/mastodon/locales/cs.json b/app/javascript/mastodon/locales/cs.json index 9b11c74664a..271329ce0ac 100644 --- a/app/javascript/mastodon/locales/cs.json +++ b/app/javascript/mastodon/locales/cs.json @@ -619,7 +619,6 @@ "lightbox.zoom_in": "Přiblížit na skutečnou velikost", "lightbox.zoom_out": "Přizpůsobit velikost", "limited_account_hint.action": "Přesto profil zobrazit", - "limited_account_hint.title": "Tento profil byl skryt moderátory {domain}.", "link_preview.author": "Od {name}", "link_preview.more_from_author": "Více od {name}", "link_preview.shares": "{count, plural, one {{counter} příspěvek} few {{counter} příspěvky} many {{counter} příspěvků} other {{counter} příspěvků}}", diff --git a/app/javascript/mastodon/locales/cy.json b/app/javascript/mastodon/locales/cy.json index e577fbc44a5..f717a74a822 100644 --- a/app/javascript/mastodon/locales/cy.json +++ b/app/javascript/mastodon/locales/cy.json @@ -840,7 +840,6 @@ "lightbox.zoom_in": "Chwyddo i faint gwirioneddol", "lightbox.zoom_out": "Chwyddo i ffitio", "limited_account_hint.action": "Dangos y proffil beth bynnag", - "limited_account_hint.title": "Mae'r proffil hwn wedi cael ei guddio gan gymedrolwyr {domain}.", "link_preview.author": "Gan {name}", "link_preview.more_from_author": "Mwy gan {name}", "link_preview.shares": "{count, plural, one {{counter} postiad } two {{counter} bostiad } few {{counter} postiad} many {{counter} postiad} other {{counter} postiad}}", diff --git a/app/javascript/mastodon/locales/da.json b/app/javascript/mastodon/locales/da.json index 2451e0f4e66..a7cc1c96318 100644 --- a/app/javascript/mastodon/locales/da.json +++ b/app/javascript/mastodon/locales/da.json @@ -850,7 +850,7 @@ "lightbox.zoom_in": "Zoom til faktisk størrelse", "lightbox.zoom_out": "Zoom for at tilpasse", "limited_account_hint.action": "Vis profil alligevel", - "limited_account_hint.title": "Denne profil er blevet skjult af {domain}-moderatorerne.", + "limited_account_hint.title": "Denne profil eller server er blevet skjult af moderatorerne på {domain}.", "link_preview.author": "Af {name}", "link_preview.more_from_author": "Mere fra {name}", "link_preview.shares": "{count, plural, one {{counter} indlæg} other {{counter} indlæg}}", diff --git a/app/javascript/mastodon/locales/de.json b/app/javascript/mastodon/locales/de.json index fe79bd772f1..0e07f296d13 100644 --- a/app/javascript/mastodon/locales/de.json +++ b/app/javascript/mastodon/locales/de.json @@ -850,7 +850,7 @@ "lightbox.zoom_in": "In Originalgröße anzeigen", "lightbox.zoom_out": "In angepasster Größe anzeigen", "limited_account_hint.action": "Profil trotzdem anzeigen", - "limited_account_hint.title": "Dieses Profil wurde von den Moderator*innen von {domain} ausgeblendet.", + "limited_account_hint.title": "Dieses Profil oder dieser Server wurde von den Moderator*innen von {domain} ausgeblendet.", "link_preview.author": "Von {name}", "link_preview.more_from_author": "Mehr von {name}", "link_preview.shares": "{count, plural, one {{counter} Beitrag} other {{counter} Beiträge}}", diff --git a/app/javascript/mastodon/locales/el.json b/app/javascript/mastodon/locales/el.json index 4b3286832c5..160315510a4 100644 --- a/app/javascript/mastodon/locales/el.json +++ b/app/javascript/mastodon/locales/el.json @@ -760,10 +760,10 @@ "hashtag.counter_by_uses": "{count, plural, one {{counter} ανάρτηση} other {{counter} αναρτήσεις}}", "hashtag.counter_by_uses_today": "{count, plural, one {{counter} ανάρτηση} other {{counter} αναρτήσεις}} σήμερα", "hashtag.feature": "Ανάδειξη στο προφίλ", - "hashtag.follow": "Παρακολούθηση ετικέτας", + "hashtag.follow": "Ακολούθηση ετικέτας", "hashtag.mute": "Σίγαση #{hashtag}", "hashtag.unfeature": "Να μην αναδεικνύεται στο προφίλ", - "hashtag.unfollow": "Διακοπή παρακολούθησης ετικέτας", + "hashtag.unfollow": "Άρση ακολούθησης ετικέτας", "hashtags.and_other": "…και {count, plural, other {# ακόμα}}", "hints.profiles.followers_may_be_missing": "Μπορεί να λείπουν ακόλουθοι για αυτό το προφίλ.", "hints.profiles.follows_may_be_missing": "Άτομα που ακολουθούνται μπορεί να λείπουν απ' αυτό το προφίλ.", @@ -850,7 +850,7 @@ "lightbox.zoom_in": "Εστίαση στο πραγματικό μέγεθος", "lightbox.zoom_out": "Εστίαση για προσαρμογή", "limited_account_hint.action": "Εμφάνιση προφίλ ούτως ή άλλως", - "limited_account_hint.title": "Αυτό το προφίλ έχει αποκρυφτεί από τους διαχειριστές του διακομιστή {domain}.", + "limited_account_hint.title": "Αυτό το προφίλ ή διακομιστής έχει κρυφτεί από τους διαχειριστές του {domain}.", "link_preview.author": "Από {name}", "link_preview.more_from_author": "Περισσότερα από {name}", "link_preview.shares": "{count, plural, one {{counter} ανάρτηση} other {{counter} αναρτήσεις}}", diff --git a/app/javascript/mastodon/locales/en-GB.json b/app/javascript/mastodon/locales/en-GB.json index be685559aca..fb95859d3a0 100644 --- a/app/javascript/mastodon/locales/en-GB.json +++ b/app/javascript/mastodon/locales/en-GB.json @@ -833,7 +833,6 @@ "lightbox.zoom_in": "Zoom to actual size", "lightbox.zoom_out": "Zoom to fit", "limited_account_hint.action": "Show profile anyway", - "limited_account_hint.title": "This profile or server has been hidden by the moderators of {domain}.", "link_preview.author": "By {name}", "link_preview.more_from_author": "More from {name}", "link_preview.shares": "{count, plural, one {{counter} post} other {{counter} posts}}", diff --git a/app/javascript/mastodon/locales/eo.json b/app/javascript/mastodon/locales/eo.json index 4dabacba5dc..904a5a6a606 100644 --- a/app/javascript/mastodon/locales/eo.json +++ b/app/javascript/mastodon/locales/eo.json @@ -478,7 +478,6 @@ "lightbox.zoom_in": "Zomi al reala grandeco", "lightbox.zoom_out": "Zomi por konveni", "limited_account_hint.action": "Montru profilon ĉiukaze", - "limited_account_hint.title": "La profilo estas kaŝita de la moderigantoj de {domain}.", "link_preview.author": "De {name}", "link_preview.more_from_author": "Pli de {name}", "link_preview.shares": "{count, plural, one {{counter} afiŝo} other {{counter} afiŝoj}}", diff --git a/app/javascript/mastodon/locales/es-AR.json b/app/javascript/mastodon/locales/es-AR.json index 865212b6e1f..dcaa4ccc648 100644 --- a/app/javascript/mastodon/locales/es-AR.json +++ b/app/javascript/mastodon/locales/es-AR.json @@ -850,7 +850,7 @@ "lightbox.zoom_in": "Ampliar al tamaño real", "lightbox.zoom_out": "Ampliar hasta ajustar", "limited_account_hint.action": "Mostrar perfil de todos modos", - "limited_account_hint.title": "Este perfil fue ocultado por los moderadores de {domain}.", + "limited_account_hint.title": "Este perfil del servidor fue ocultado por los moderadores de {domain}.", "link_preview.author": "Por {name}", "link_preview.more_from_author": "Más de {name}", "link_preview.shares": "{count, plural, one {{counter} mensaje} other {{counter} mensajes}}", diff --git a/app/javascript/mastodon/locales/es-MX.json b/app/javascript/mastodon/locales/es-MX.json index a6589a751bc..38bec754721 100644 --- a/app/javascript/mastodon/locales/es-MX.json +++ b/app/javascript/mastodon/locales/es-MX.json @@ -850,7 +850,7 @@ "lightbox.zoom_in": "Ampliar al tamaño real", "lightbox.zoom_out": "Ampliar para ajustar", "limited_account_hint.action": "Mostrar perfil de todos modos", - "limited_account_hint.title": "Este perfil ha sido ocultado por los moderadores de {domain}.", + "limited_account_hint.title": "Este perfil o servidor ha sido ocultado por los moderadores de {domain}.", "link_preview.author": "Por {name}", "link_preview.more_from_author": "Más de {name}", "link_preview.shares": "{count, plural, one {{counter} publicación} other {{counter} publicaciones}}", diff --git a/app/javascript/mastodon/locales/es.json b/app/javascript/mastodon/locales/es.json index df1fc288432..c5c68be3dbb 100644 --- a/app/javascript/mastodon/locales/es.json +++ b/app/javascript/mastodon/locales/es.json @@ -850,7 +850,7 @@ "lightbox.zoom_in": "Ampliar al tamaño real", "lightbox.zoom_out": "Ampliar para ajustar", "limited_account_hint.action": "Mostrar perfil de todos modos", - "limited_account_hint.title": "Este perfil ha sido ocultado por los moderadores de {domain}.", + "limited_account_hint.title": "Los moderadores de {domain} han ocultado este perfil o servidor.", "link_preview.author": "Por {name}", "link_preview.more_from_author": "Más de {name}", "link_preview.shares": "{count, plural, one {{counter} publicación} other {{counter} publicaciones}}", diff --git a/app/javascript/mastodon/locales/et.json b/app/javascript/mastodon/locales/et.json index a7c5fe1f9fc..2ca57023b41 100644 --- a/app/javascript/mastodon/locales/et.json +++ b/app/javascript/mastodon/locales/et.json @@ -850,7 +850,7 @@ "lightbox.zoom_in": "Näita algsuuruses", "lightbox.zoom_out": "Näita kõik", "limited_account_hint.action": "Näita profilli sellegipoolest", - "limited_account_hint.title": "See profiil on peidetud {domain} moderaatorite poolt.", + "limited_account_hint.title": "See profiil või server on {domain}-i moderaatorite poolt peidetud.", "link_preview.author": "{name} poolt", "link_preview.more_from_author": "Veel kasutajalt {name}", "link_preview.shares": "{count, plural, one {{counter} postitus} other {{counter} postitust}}", diff --git a/app/javascript/mastodon/locales/eu.json b/app/javascript/mastodon/locales/eu.json index 422d37763ef..eeec939a334 100644 --- a/app/javascript/mastodon/locales/eu.json +++ b/app/javascript/mastodon/locales/eu.json @@ -527,7 +527,6 @@ "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}", "link_preview.more_from_author": "{name} erabiltzaileaz gehiago jakin", "link_preview.shares": "{count, plural, one {{counter} bidalketa} other {{counter} bidalketa}}", diff --git a/app/javascript/mastodon/locales/fa.json b/app/javascript/mastodon/locales/fa.json index 483844e4bb2..a5e9b2b097a 100644 --- a/app/javascript/mastodon/locales/fa.json +++ b/app/javascript/mastodon/locales/fa.json @@ -833,7 +833,6 @@ "lightbox.zoom_in": "بزرگ‌نمایی به اندازهٔ اصلی", "lightbox.zoom_out": "بزرگ نمایی برای برازش", "limited_account_hint.action": "به هر روی نمایه نشان داده شود", - "limited_account_hint.title": "این نمایه از سوی ناظم‌های {domain} پنهان شده.", "link_preview.author": "از {name}", "link_preview.more_from_author": "بیش‌تر از {name}", "link_preview.shares": "{count, plural, one {{counter} فرسته} other {{counter} فرسته}}", diff --git a/app/javascript/mastodon/locales/fo.json b/app/javascript/mastodon/locales/fo.json index 8268e443546..a8651ba586e 100644 --- a/app/javascript/mastodon/locales/fo.json +++ b/app/javascript/mastodon/locales/fo.json @@ -662,7 +662,6 @@ "lightbox.zoom_in": "Suma til veruliga stødd", "lightbox.zoom_out": "Suma, so tað passar", "limited_account_hint.action": "Vís vangamynd kortini", - "limited_account_hint.title": "Hesin vangin er fjaldur av kjakleiðarunum á {domain}.", "link_preview.author": "Av {name}", "link_preview.more_from_author": "Meira frá {name}", "link_preview.shares": "{count, plural, one {{counter} postur} other {{counter} postar}}", diff --git a/app/javascript/mastodon/locales/fr-CA.json b/app/javascript/mastodon/locales/fr-CA.json index 1bfdf758df3..52482f5c932 100644 --- a/app/javascript/mastodon/locales/fr-CA.json +++ b/app/javascript/mastodon/locales/fr-CA.json @@ -850,7 +850,7 @@ "lightbox.zoom_in": "Zoomer sur la taille réelle", "lightbox.zoom_out": "Zoomer pour adapter", "limited_account_hint.action": "Afficher le profil quand même", - "limited_account_hint.title": "Ce profil a été masqué par la modération de {domain}.", + "limited_account_hint.title": "Ce profil ou serveur a été masqué par l'équipe de modération de {domain}.", "link_preview.author": "Par {name}", "link_preview.more_from_author": "Voir plus de {name}", "link_preview.shares": "{count, plural, one {{counter} message} other {{counter} messages}}", diff --git a/app/javascript/mastodon/locales/fr.json b/app/javascript/mastodon/locales/fr.json index 129c4f778a6..0ccc72f5170 100644 --- a/app/javascript/mastodon/locales/fr.json +++ b/app/javascript/mastodon/locales/fr.json @@ -850,7 +850,7 @@ "lightbox.zoom_in": "Zoomer sur la taille réelle", "lightbox.zoom_out": "Zoomer pour adapter", "limited_account_hint.action": "Afficher le profil quand même", - "limited_account_hint.title": "Ce profil a été masqué par la modération de {domain}.", + "limited_account_hint.title": "Ce profil ou serveur a été masqué par l'équipe de modération de {domain}.", "link_preview.author": "Par {name}", "link_preview.more_from_author": "Voir plus de {name}", "link_preview.shares": "{count, plural, one {{counter} message} other {{counter} messages}}", diff --git a/app/javascript/mastodon/locales/fy.json b/app/javascript/mastodon/locales/fy.json index 507983097d9..63d4dce56c5 100644 --- a/app/javascript/mastodon/locales/fy.json +++ b/app/javascript/mastodon/locales/fy.json @@ -443,7 +443,6 @@ "lightbox.zoom_in": "Oarspronklike grutte toane", "lightbox.zoom_out": "Passend toane", "limited_account_hint.action": "Profyl dochs besjen", - "limited_account_hint.title": "Dit profyl is troch de behearders fan {domain} ferstoppe.", "link_preview.author": "Troch {name}", "link_preview.more_from_author": "Mear fan {name}", "link_preview.shares": "{count, plural, one {{counter} berjocht} other {{counter} berjochten}}", diff --git a/app/javascript/mastodon/locales/ga.json b/app/javascript/mastodon/locales/ga.json index b356ce66171..cd9a83745a1 100644 --- a/app/javascript/mastodon/locales/ga.json +++ b/app/javascript/mastodon/locales/ga.json @@ -850,7 +850,7 @@ "lightbox.zoom_in": "Súmáil chuig an méid iarbhír", "lightbox.zoom_out": "Súmáil a d'oirfeadh", "limited_account_hint.action": "Taispeáin an phróifíl ar aon nós", - "limited_account_hint.title": "Tá an phróifíl seo curtha i bhfolach ag na modhnóra {domain}.", + "limited_account_hint.title": "Tá an phróifíl nó an freastalaí seo i bhfolach ag modhnóirí {domain}.", "link_preview.author": "Le {name}", "link_preview.more_from_author": "Tuilleadh ó {name}", "link_preview.shares": "{count, plural, one {{counter} post} other {{counter} poist}}", diff --git a/app/javascript/mastodon/locales/gd.json b/app/javascript/mastodon/locales/gd.json index e5bb99c9d97..9c6ecb55337 100644 --- a/app/javascript/mastodon/locales/gd.json +++ b/app/javascript/mastodon/locales/gd.json @@ -824,7 +824,6 @@ "lightbox.zoom_in": "Sùm dhan fhìor-mheud", "lightbox.zoom_out": "Sùm fèin-obrachail", "limited_account_hint.action": "Seall a’ phròifil co-dhiù", - "limited_account_hint.title": "Chaidh a’ phròifil seo fhalach le maoir {domain}.", "link_preview.author": "Le {name}", "link_preview.more_from_author": "Barrachd le {name}", "link_preview.shares": "{count, plural, one {{counter} phost} two {{counter} phost} few {{counter} postaichean} other {{counter} post}}", diff --git a/app/javascript/mastodon/locales/gl.json b/app/javascript/mastodon/locales/gl.json index 2a6e86c1454..45b7d7af9d4 100644 --- a/app/javascript/mastodon/locales/gl.json +++ b/app/javascript/mastodon/locales/gl.json @@ -850,7 +850,7 @@ "lightbox.zoom_in": "Ver tamaño real", "lightbox.zoom_out": "Ver tamaño axustado", "limited_account_hint.action": "Mostrar perfil igualmente", - "limited_account_hint.title": "Este perfil foi agochado pola moderación de {domain}.", + "limited_account_hint.title": "A moderación de {domain} ocultou este perfil ou servidor.", "link_preview.author": "Por {name}", "link_preview.more_from_author": "Máis de {name}", "link_preview.shares": "{count, plural, one {{counter} publicación} other {{counter} publicacións}}", diff --git a/app/javascript/mastodon/locales/he.json b/app/javascript/mastodon/locales/he.json index e6bb2d7333b..dc9382e7f93 100644 --- a/app/javascript/mastodon/locales/he.json +++ b/app/javascript/mastodon/locales/he.json @@ -850,7 +850,7 @@ "lightbox.zoom_in": "הגדלה לגודל מלא", "lightbox.zoom_out": "התאמה לגודל המסך", "limited_account_hint.action": "הצג חשבון בכל זאת", - "limited_account_hint.title": "פרופיל המשתמש הזה הוסתר על ידי מנחי הדיון של {domain}.", + "limited_account_hint.title": "פרופיל המשתמש או השרת כולו הוסתר על ידי מנחי הדיון של {domain}.", "link_preview.author": "מאת {name}", "link_preview.more_from_author": "עוד מאת {name}", "link_preview.shares": "{count, plural, one {הודעה אחת} two {הודעותיים} many {{counter} הודעות} other {{counter} הודעות}}", diff --git a/app/javascript/mastodon/locales/hi.json b/app/javascript/mastodon/locales/hi.json index 5db28962cae..a6215bc6b12 100644 --- a/app/javascript/mastodon/locales/hi.json +++ b/app/javascript/mastodon/locales/hi.json @@ -326,7 +326,6 @@ "lightbox.next": "अगला", "lightbox.previous": "पिछला", "limited_account_hint.action": "फिर भी प्रोफाइल दिखाओ", - "limited_account_hint.title": "यह प्रोफ़ाइल {domain} के मॉडरेटर द्वारा छिपाई गई है.", "lists.delete": "सूची हटाएँ", "lists.edit": "सूची संपादित करें", "lists.replies_policy.followed": "अन्य फोल्लोवेद यूजर", diff --git a/app/javascript/mastodon/locales/hu.json b/app/javascript/mastodon/locales/hu.json index 4360b3b10bb..4af2e3d474f 100644 --- a/app/javascript/mastodon/locales/hu.json +++ b/app/javascript/mastodon/locales/hu.json @@ -850,7 +850,7 @@ "lightbox.zoom_in": "Nagyítás a tényleges méretre", "lightbox.zoom_out": "Méretre igazítás", "limited_account_hint.action": "Profil megjelenítése mindenképpen", - "limited_account_hint.title": "Ezt a profilt {domain} moderátorai elrejtették.", + "limited_account_hint.title": "Ezt a profilt vagy kiszolgálót a(z) {domain} moderátorai elrejtették.", "link_preview.author": "{name} szerint", "link_preview.more_from_author": "Több tőle: {name}", "link_preview.shares": "{count, plural, one {{counter} bejegyzés} other {{counter} bejegyzés}}", diff --git a/app/javascript/mastodon/locales/ia.json b/app/javascript/mastodon/locales/ia.json index 181b9cbb644..fb1ec026a81 100644 --- a/app/javascript/mastodon/locales/ia.json +++ b/app/javascript/mastodon/locales/ia.json @@ -483,7 +483,6 @@ "lightbox.zoom_in": "Aggrandir al dimension real", "lightbox.zoom_out": "Diminuer pro adaptar", "limited_account_hint.action": "Monstrar profilo in omne caso", - "limited_account_hint.title": "Iste profilo ha essite celate per le moderatores de {domain}.", "link_preview.author": "Per {name}", "link_preview.more_from_author": "Plus de {name}", "link_preview.shares": "{count, plural, one {{counter} message} other {{counter} messages}}", diff --git a/app/javascript/mastodon/locales/id.json b/app/javascript/mastodon/locales/id.json index ae36afb463d..63bd8f231e0 100644 --- a/app/javascript/mastodon/locales/id.json +++ b/app/javascript/mastodon/locales/id.json @@ -347,7 +347,6 @@ "lightbox.next": "Selanjutnya", "lightbox.previous": "Sebelumnya", "limited_account_hint.action": "Tetap tampilkan profil", - "limited_account_hint.title": "Profil ini telah disembunyikan oleh moderator {domain}.", "link_preview.author": "Oleh {name}", "lists.delete": "Hapus daftar", "lists.edit": "Sunting daftar", diff --git a/app/javascript/mastodon/locales/ie.json b/app/javascript/mastodon/locales/ie.json index 0238f4567af..42f8bad5bff 100644 --- a/app/javascript/mastodon/locales/ie.json +++ b/app/javascript/mastodon/locales/ie.json @@ -342,7 +342,6 @@ "lightbox.next": "Sequent", "lightbox.previous": "Precedent", "limited_account_hint.action": "Monstrar profil totvez", - "limited_account_hint.title": "Ti-ci profil ha esset celat del moderatores de {domain}.", "link_preview.author": "De {name}", "lists.delete": "Deleter liste", "lists.edit": "Redacter liste", diff --git a/app/javascript/mastodon/locales/io.json b/app/javascript/mastodon/locales/io.json index 5c318f09b4d..bbba5af9a3d 100644 --- a/app/javascript/mastodon/locales/io.json +++ b/app/javascript/mastodon/locales/io.json @@ -524,7 +524,6 @@ "lightbox.zoom_in": "Grandigez a reala grandeso", "lightbox.zoom_out": "Grandigez por fitigar", "limited_account_hint.action": "Jus montrez profilo", - "limited_account_hint.title": "Ca profilo celesas dal jereri di {domain}.", "link_preview.author": "Da {name}", "link_preview.more_from_author": "Plua de {name}", "link_preview.shares": "{count, plural,one {{counter} posto} other {{counter} posti}}", diff --git a/app/javascript/mastodon/locales/is.json b/app/javascript/mastodon/locales/is.json index bf2ee7416d9..56f1ca4358d 100644 --- a/app/javascript/mastodon/locales/is.json +++ b/app/javascript/mastodon/locales/is.json @@ -850,7 +850,7 @@ "lightbox.zoom_in": "Renna að raunstærð", "lightbox.zoom_out": "Renna að svo passi", "limited_account_hint.action": "Birta notandasniðið samt", - "limited_account_hint.title": "Þetta notandasnið hefur verið falið af umsjónarmönnum {domain}.", + "limited_account_hint.title": "Þetta notandasnið eða netþjónn var falið af stjórnendum {domain}.", "link_preview.author": "Frá {name}", "link_preview.more_from_author": "Meira frá {name}", "link_preview.shares": "{count, plural, one {{counter} færsla} other {{counter} færslur}}", diff --git a/app/javascript/mastodon/locales/it.json b/app/javascript/mastodon/locales/it.json index ca9790020dc..5b0e89a0bf4 100644 --- a/app/javascript/mastodon/locales/it.json +++ b/app/javascript/mastodon/locales/it.json @@ -850,7 +850,7 @@ "lightbox.zoom_in": "Ingrandisci alla dimensione attuale", "lightbox.zoom_out": "Ingrandisci per adattarsi", "limited_account_hint.action": "Mostra comunque il profilo", - "limited_account_hint.title": "Questo profilo è stato nascosto dai moderatori di {domain}.", + "limited_account_hint.title": "Questo profilo o server è stato nascosto dai moderatori di {domain}.", "link_preview.author": "Di {name}", "link_preview.more_from_author": "Altro da {name}", "link_preview.shares": "{count, plural, one {{counter} post} other {{counter} post}}", diff --git a/app/javascript/mastodon/locales/ja.json b/app/javascript/mastodon/locales/ja.json index f8d67407b2b..f864cb0b771 100644 --- a/app/javascript/mastodon/locales/ja.json +++ b/app/javascript/mastodon/locales/ja.json @@ -545,7 +545,6 @@ "lightbox.zoom_in": "実際のサイズにする", "lightbox.zoom_out": "表示範囲に合わせる", "limited_account_hint.action": "構わず表示する", - "limited_account_hint.title": "このプロフィールは{domain}のモデレーターによって非表示にされています。", "link_preview.author": "{name}", "link_preview.more_from_author": "{name}さんの投稿をもっと読む", "link_preview.shares": "{count, plural, other {{counter}件の投稿}}", diff --git a/app/javascript/mastodon/locales/ko.json b/app/javascript/mastodon/locales/ko.json index c388d53d524..507c2d03120 100644 --- a/app/javascript/mastodon/locales/ko.json +++ b/app/javascript/mastodon/locales/ko.json @@ -568,7 +568,6 @@ "lightbox.zoom_in": "실제 크기에 맞춰 보기", "lightbox.zoom_out": "화면 크기에 맞춰 보기", "limited_account_hint.action": "그래도 프로필 보기", - "limited_account_hint.title": "이 프로필은 {domain}의 중재자에 의해 숨겨진 상태입니다.", "link_preview.author": "{name}", "link_preview.more_from_author": "{name} 프로필 보기", "link_preview.shares": "{count, plural, other {{counter} 개의 게시물}}", diff --git a/app/javascript/mastodon/locales/ku.json b/app/javascript/mastodon/locales/ku.json index 34fa3086b21..202a15d2ace 100644 --- a/app/javascript/mastodon/locales/ku.json +++ b/app/javascript/mastodon/locales/ku.json @@ -324,7 +324,6 @@ "lightbox.next": "Pêş", "lightbox.previous": "Paş", "limited_account_hint.action": "Bi heman awayî profîlê nîşan bide", - "limited_account_hint.title": "Profîl ji aliyê rêveberên {domain}ê ve hatiye veşartin.", "lists.delete": "Lîsteyê jê bibe", "lists.edit": "Lîsteyê serrast bike", "lists.replies_policy.followed": "Bikarhênereke şopandî", diff --git a/app/javascript/mastodon/locales/lad.json b/app/javascript/mastodon/locales/lad.json index ae72cace9ed..e22aa33ab6a 100644 --- a/app/javascript/mastodon/locales/lad.json +++ b/app/javascript/mastodon/locales/lad.json @@ -488,7 +488,6 @@ "lightbox.next": "Sigiente", "lightbox.previous": "Anterior", "limited_account_hint.action": "Amostra el profil entanto", - "limited_account_hint.title": "Este profil fue eskondido por los moderadores de {domain}.", "link_preview.author": "Publikasyon de {name}", "link_preview.more_from_author": "Mas de {name}", "link_preview.shares": "{count, plural, one {{counter} publikasyon} other {{counter} publikasyones}}", diff --git a/app/javascript/mastodon/locales/lt.json b/app/javascript/mastodon/locales/lt.json index 517a9d62653..61525d0ec7b 100644 --- a/app/javascript/mastodon/locales/lt.json +++ b/app/javascript/mastodon/locales/lt.json @@ -520,7 +520,6 @@ "lightbox.zoom_in": "Padidink iki tikrojo dydžio", "lightbox.zoom_out": "Padidink, kad tilptų", "limited_account_hint.action": "Vis tiek rodyti profilį", - "limited_account_hint.title": "Šį profilį paslėpė {domain} prižiūrėtojai.", "link_preview.author": "Sukūrė {name}", "link_preview.more_from_author": "Daugiau iš {name}", "link_preview.shares": "{count, plural, one {{counter} įrašas} few {{counter} įrašai} many {{counter} įrašo} other {{counter} įrašų}}", diff --git a/app/javascript/mastodon/locales/lv.json b/app/javascript/mastodon/locales/lv.json index 5323bab63cb..0ac38ecd005 100644 --- a/app/javascript/mastodon/locales/lv.json +++ b/app/javascript/mastodon/locales/lv.json @@ -526,7 +526,6 @@ "lightbox.zoom_in": "Tālummainīt līdz patiesajam izmēram", "lightbox.zoom_out": "Tālummainīt, lai ietilpinātu", "limited_account_hint.action": "Tik un tā rādīt profilu", - "limited_account_hint.title": "{domain} moderatori ir paslēpuši šo profilu.", "link_preview.author": "No {name}", "link_preview.more_from_author": "Vairāk no {name}", "lists.add_member": "Pievienot", diff --git a/app/javascript/mastodon/locales/mr.json b/app/javascript/mastodon/locales/mr.json index 3eda8913339..ca6b67046a7 100644 --- a/app/javascript/mastodon/locales/mr.json +++ b/app/javascript/mastodon/locales/mr.json @@ -153,7 +153,6 @@ "lightbox.next": "पुढे", "lightbox.previous": "मागील", "limited_account_hint.action": "तरीही प्रोफाइल दाखवा", - "limited_account_hint.title": "हे प्रोफाइल {domain} च्या नियंत्रकांनी लपवले आहे.", "lists.delete": "सूची हटवा", "lists.edit": "सूची संपादित करा", "lists.replies_policy.followed": "कोणताही फॉलो केलेला वापरकर्ता", diff --git a/app/javascript/mastodon/locales/ms.json b/app/javascript/mastodon/locales/ms.json index 3c28a1e2752..2024174bf60 100644 --- a/app/javascript/mastodon/locales/ms.json +++ b/app/javascript/mastodon/locales/ms.json @@ -381,7 +381,6 @@ "lightbox.next": "Seterusnya", "lightbox.previous": "Sebelumnya", "limited_account_hint.action": "Paparkan profil", - "limited_account_hint.title": "Profil ini telah disembunyikan oleh moderator {domain}.", "link_preview.author": "Dengan {name}", "lists.delete": "Padam senarai", "lists.edit": "Sunting senarai", diff --git a/app/javascript/mastodon/locales/my.json b/app/javascript/mastodon/locales/my.json index c45ee000a98..a08722a66ea 100644 --- a/app/javascript/mastodon/locales/my.json +++ b/app/javascript/mastodon/locales/my.json @@ -304,7 +304,6 @@ "lightbox.next": "ရှေ့သို့", "lightbox.previous": "ရှေ့သို့", "limited_account_hint.action": "ဘာပဲဖြစ်ဖြစ် ပရိုဖိုင်ကို ပြပါ", - "limited_account_hint.title": "ဤပရိုဖိုင်ကို {domain} ၏ စိစစ်သူများမှ ဖျောက်ထားသည်။", "link_preview.author": "{name} ဖြင့်", "lists.delete": "စာရင်းကိုဖျက်ပါ", "lists.edit": "စာရင်းကိုပြင်ဆင်ပါ", diff --git a/app/javascript/mastodon/locales/nan-TW.json b/app/javascript/mastodon/locales/nan-TW.json index 1a8d26108db..393351265cd 100644 --- a/app/javascript/mastodon/locales/nan-TW.json +++ b/app/javascript/mastodon/locales/nan-TW.json @@ -850,7 +850,6 @@ "lightbox.zoom_in": "Tshūn-kiu kàu實際ê sài-suh", "lightbox.zoom_out": "Tshūn-kiu kàu適當ê sài-suh", "limited_account_hint.action": "一直顯示個人資料", - "limited_account_hint.title": "Tsit ê 個人資料予 {domain} ê管理員tshàng起來ah。", "link_preview.author": "Tuì {name}", "link_preview.more_from_author": "看 {name} ê其他內容", "link_preview.shares": "{count, plural, one {{counter} 篇} other {{counter} 篇}}PO文", diff --git a/app/javascript/mastodon/locales/nl.json b/app/javascript/mastodon/locales/nl.json index 9dba7c61032..89e98a45535 100644 --- a/app/javascript/mastodon/locales/nl.json +++ b/app/javascript/mastodon/locales/nl.json @@ -850,7 +850,7 @@ "lightbox.zoom_in": "Oorspronkelijke grootte weergeven", "lightbox.zoom_out": "Passend weergeven", "limited_account_hint.action": "Alsnog het profiel tonen", - "limited_account_hint.title": "Dit profiel is door de moderatoren van {domain} verborgen.", + "limited_account_hint.title": "Dit profiel of deze server is door de moderatoren van {domain} verborgen.", "link_preview.author": "Door {name}", "link_preview.more_from_author": "Meer van {name}", "link_preview.shares": "{count, plural, one {{counter} bericht} other {{counter} berichten}}", diff --git a/app/javascript/mastodon/locales/nn.json b/app/javascript/mastodon/locales/nn.json index c995f4aa8bb..f95af7bb5de 100644 --- a/app/javascript/mastodon/locales/nn.json +++ b/app/javascript/mastodon/locales/nn.json @@ -790,7 +790,6 @@ "lightbox.zoom_in": "Zoom til faktisk storleik", "lightbox.zoom_out": "Vis heile", "limited_account_hint.action": "Vis profilen likevel", - "limited_account_hint.title": "Denne profilen er skjult av moderatorane på {domain}.", "link_preview.author": "Av {name}", "link_preview.more_from_author": "Meir frå {name}", "link_preview.shares": "{count, plural,one {{counter} innlegg} other {{counter} innlegg}}", diff --git a/app/javascript/mastodon/locales/no.json b/app/javascript/mastodon/locales/no.json index d8851a95bf5..afb565e3c47 100644 --- a/app/javascript/mastodon/locales/no.json +++ b/app/javascript/mastodon/locales/no.json @@ -528,7 +528,6 @@ "lightbox.zoom_in": "Zoom til original størrelse", "lightbox.zoom_out": "Vis hele", "limited_account_hint.action": "Vis profil likevel", - "limited_account_hint.title": "Denne profilen har blitt skjult av moderatorene til {domain}.", "link_preview.author": "Av {name}", "link_preview.more_from_author": "Mer fra {name}", "link_preview.shares": "{count, plural, one {{counter} innlegg} other {{counter} innlegg}}", diff --git a/app/javascript/mastodon/locales/oc.json b/app/javascript/mastodon/locales/oc.json index a001cc8ec0d..400f14ba0c1 100644 --- a/app/javascript/mastodon/locales/oc.json +++ b/app/javascript/mastodon/locales/oc.json @@ -347,7 +347,6 @@ "lightbox.next": "Seguent", "lightbox.previous": "Precedent", "limited_account_hint.action": "Afichar lo perfil de tota manièra", - "limited_account_hint.title": "Aqueste perfil foguèt rescondut per la moderacion de {domain}.", "link_preview.author": "Per {name}", "link_preview.more_from_author": "Mai de {name}", "lists.delete": "Suprimir la lista", diff --git a/app/javascript/mastodon/locales/pl.json b/app/javascript/mastodon/locales/pl.json index 0615f5c914b..4756b753eb6 100644 --- a/app/javascript/mastodon/locales/pl.json +++ b/app/javascript/mastodon/locales/pl.json @@ -602,7 +602,6 @@ "lightbox.zoom_in": "Powiększ do rzeczywistego rozmiaru", "lightbox.zoom_out": "Powiększ, aby dopasować", "limited_account_hint.action": "Pokaż profil mimo to", - "limited_account_hint.title": "Ten profil został ukryty przez moderatorów {domain}.", "link_preview.author": "{name}", "link_preview.more_from_author": "Więcej od {name}", "link_preview.shares": "{count, plural, one {{counter} wpis} few {{counter} wpisy} many {{counter} wpisów} other {{counter} wpisów}}", diff --git a/app/javascript/mastodon/locales/pt-BR.json b/app/javascript/mastodon/locales/pt-BR.json index ae9a2fb5281..c8b24dcd1be 100644 --- a/app/javascript/mastodon/locales/pt-BR.json +++ b/app/javascript/mastodon/locales/pt-BR.json @@ -850,7 +850,7 @@ "lightbox.zoom_in": "Retornar ao tamanho real", "lightbox.zoom_out": "Ampliar para ajustar", "limited_account_hint.action": "Exibir perfil mesmo assim", - "limited_account_hint.title": "Este perfil foi ocultado pelos moderadores de {domain}.", + "limited_account_hint.title": "Este perfil ou servidor foi ocultado pelos moderadores de {domain}.", "link_preview.author": "Por {name}", "link_preview.more_from_author": "Mais de {name}", "link_preview.shares": "{count, plural, one {{counter} publicação} other {{counter} publicações}}", diff --git a/app/javascript/mastodon/locales/pt-PT.json b/app/javascript/mastodon/locales/pt-PT.json index 7cb6db1ab24..3a93b7273b7 100644 --- a/app/javascript/mastodon/locales/pt-PT.json +++ b/app/javascript/mastodon/locales/pt-PT.json @@ -800,7 +800,6 @@ "lightbox.zoom_in": "Ampliar para o tamanho real", "lightbox.zoom_out": "Ajustar para caber", "limited_account_hint.action": "Mostrar perfil mesmo assim", - "limited_account_hint.title": "Este perfil foi ocultado pelos moderadores de {domain}.", "link_preview.author": "Por {name}", "link_preview.more_from_author": "Mais de {name}", "link_preview.shares": "{count, plural, one {{counter} publicação} other {{counter} publicações}}", diff --git a/app/javascript/mastodon/locales/ro.json b/app/javascript/mastodon/locales/ro.json index 32990569c17..07da3389c35 100644 --- a/app/javascript/mastodon/locales/ro.json +++ b/app/javascript/mastodon/locales/ro.json @@ -325,7 +325,6 @@ "lightbox.next": "Înainte", "lightbox.previous": "Înapoi", "limited_account_hint.action": "Afișează profilul oricum", - "limited_account_hint.title": "Acest profil a fost ascuns de moderatorii domeniului {domain}.", "link_preview.author": "De {name}", "lists.delete": "Șterge lista", "lists.edit": "Modifică lista", diff --git a/app/javascript/mastodon/locales/ru.json b/app/javascript/mastodon/locales/ru.json index c999bb6f445..56a4e98fe1c 100644 --- a/app/javascript/mastodon/locales/ru.json +++ b/app/javascript/mastodon/locales/ru.json @@ -769,7 +769,6 @@ "lightbox.zoom_in": "Масштаб до фактического размера", "lightbox.zoom_out": "Масштаб по размеру экрана", "limited_account_hint.action": "Всё равно показать", - "limited_account_hint.title": "Этот профиль был скрыт модераторами сервера {domain}.", "link_preview.author": "Автор: {name}", "link_preview.more_from_author": "Автор: {name}", "link_preview.shares": "{count, plural, one {{counter} пост} few {{counter} поста} other {{counter} постов}}", diff --git a/app/javascript/mastodon/locales/sa.json b/app/javascript/mastodon/locales/sa.json index 4f660c8d1f4..d536301f603 100644 --- a/app/javascript/mastodon/locales/sa.json +++ b/app/javascript/mastodon/locales/sa.json @@ -273,7 +273,6 @@ "lightbox.next": "परः", "lightbox.previous": "पूर्वः", "limited_account_hint.action": "प्रोफैलं दर्शय कथञ्चित्", - "limited_account_hint.title": "{domain} इत्यस्य प्रशासकैरयं प्रोफैल्प्रच्छन्नः।", "lists.delete": "सूचिं मार्जय", "lists.edit": "सूचिं सम्पादय", "lists.replies_policy.followed": "कोऽप्यनुसारितोपभोक्ता", diff --git a/app/javascript/mastodon/locales/sc.json b/app/javascript/mastodon/locales/sc.json index 39baa3f00af..bb377da3842 100644 --- a/app/javascript/mastodon/locales/sc.json +++ b/app/javascript/mastodon/locales/sc.json @@ -385,7 +385,6 @@ "lightbox.next": "Imbeniente", "lightbox.previous": "Pretzedente", "lightbox.zoom_in": "Ismànnia finas a sa mannària atuale", - "limited_account_hint.title": "Custu profilu est istadu cuadu dae sa moderatzione de {domain}.", "link_preview.author": "Dae {name}", "link_preview.shares": "{count, plural, one {{counter} publicatzione} other {{counter} publicatziones}}", "lists.delete": "Cantzella sa lista", diff --git a/app/javascript/mastodon/locales/sco.json b/app/javascript/mastodon/locales/sco.json index 746b7373020..59680e7c79e 100644 --- a/app/javascript/mastodon/locales/sco.json +++ b/app/javascript/mastodon/locales/sco.json @@ -266,7 +266,6 @@ "lightbox.next": "Neist", "lightbox.previous": "Last ane", "limited_account_hint.action": "Shaw profile onieweys", - "limited_account_hint.title": "This profile haes been planked bi the moderators o {domain}.", "lists.delete": "Delete list", "lists.edit": "Edit list", "lists.replies_policy.followed": "Onie follaed uiser", diff --git a/app/javascript/mastodon/locales/si.json b/app/javascript/mastodon/locales/si.json index 1bec768e05b..7506b049581 100644 --- a/app/javascript/mastodon/locales/si.json +++ b/app/javascript/mastodon/locales/si.json @@ -431,7 +431,6 @@ "lightbox.zoom_in": "සැබෑ ප්‍රමාණයට විශාලනය කරන්න", "lightbox.zoom_out": "ගැළපීමට විශාලනය කරන්න", "limited_account_hint.action": "කෙසේ හෝ පැතිකඩ පෙන්වන්න", - "limited_account_hint.title": "මෙම පැතිකඩ {domain}හි මධ්‍යස්ථකරුවන් විසින් සඟවා ඇත.", "link_preview.author": "{name}විසිනි", "link_preview.more_from_author": "{name}වෙතින් තවත්", "link_preview.shares": "{count, plural, one {{counter} සටහන} other {{counter} සටහන්}}", diff --git a/app/javascript/mastodon/locales/sk.json b/app/javascript/mastodon/locales/sk.json index 3b50a77caf7..381e1948174 100644 --- a/app/javascript/mastodon/locales/sk.json +++ b/app/javascript/mastodon/locales/sk.json @@ -458,7 +458,6 @@ "lightbox.previous": "Späť", "lightbox.zoom_out": "Priblížiť na mieru", "limited_account_hint.action": "Aj tak zobraziť profil", - "limited_account_hint.title": "Tento profil bol skrytý správcami servera {domain}.", "link_preview.author": "Autor: {name}", "link_preview.more_from_author": "Viac od {name}", "link_preview.shares": "{count, plural, one {{counter} príspevok} other {{counter} príspevkov}}", diff --git a/app/javascript/mastodon/locales/sl.json b/app/javascript/mastodon/locales/sl.json index 5f4f42cbec0..43e01d231c1 100644 --- a/app/javascript/mastodon/locales/sl.json +++ b/app/javascript/mastodon/locales/sl.json @@ -489,7 +489,6 @@ "lightbox.zoom_in": "Približaj na dejansko velikost", "lightbox.zoom_out": "Čez cel prikaz", "limited_account_hint.action": "Vseeno pokaži profil", - "limited_account_hint.title": "Profil so moderatorji strežnika {domain} skrili.", "link_preview.author": "Avtor/ica {name}", "link_preview.more_from_author": "Več od {name}", "link_preview.shares": "{count, plural, one {{counter} objava} two {{counter} objavi} few {{counter} objave} other {{counter} objav}}", diff --git a/app/javascript/mastodon/locales/sq.json b/app/javascript/mastodon/locales/sq.json index fb2d1c6f9c6..2456186445d 100644 --- a/app/javascript/mastodon/locales/sq.json +++ b/app/javascript/mastodon/locales/sq.json @@ -845,7 +845,7 @@ "lightbox.zoom_in": "Ktheje në madhësinë origjinale", "lightbox.zoom_out": "Zmadhoje të përshtatet", "limited_account_hint.action": "Shfaqe profilin sido qoftë", - "limited_account_hint.title": "Ky profil është fshehur nga moderatorët e {domain}.", + "limited_account_hint.title": "Ky profil, ose shërbyes është fshehur nga moderatorër e {domain}.", "link_preview.author": "Nga {name}", "link_preview.more_from_author": "Më tepër nga {name}", "link_preview.shares": "{count, plural, one {{counter} post} other {{counter} postime}}", diff --git a/app/javascript/mastodon/locales/sr-Latn.json b/app/javascript/mastodon/locales/sr-Latn.json index 5d7760a0d40..841c8e54734 100644 --- a/app/javascript/mastodon/locales/sr-Latn.json +++ b/app/javascript/mastodon/locales/sr-Latn.json @@ -368,7 +368,6 @@ "lightbox.next": "Sledeće", "lightbox.previous": "Prethodno", "limited_account_hint.action": "Ipak prikaži profil", - "limited_account_hint.title": "Ovaj profil su sakrili moderatori {domain}.", "link_preview.author": "Po {name}", "link_preview.more_from_author": "Više od {name}", "link_preview.shares": "{count, plural, one {{counter} objava} few {{counter} objave} other {{counter} objava}}", diff --git a/app/javascript/mastodon/locales/sr.json b/app/javascript/mastodon/locales/sr.json index 57e5d93011e..93731afcfd6 100644 --- a/app/javascript/mastodon/locales/sr.json +++ b/app/javascript/mastodon/locales/sr.json @@ -345,7 +345,6 @@ "lightbox.next": "Следеће", "lightbox.previous": "Претходно", "limited_account_hint.action": "Ипак прикажи профил", - "limited_account_hint.title": "Овај профил су сакрили модератори {domain}.", "link_preview.author": "По {name}", "link_preview.more_from_author": "Више од {name}", "link_preview.shares": "{count, plural, one {{counter} објава} few {{counter} објаве} other {{counter} објава}}", diff --git a/app/javascript/mastodon/locales/sv.json b/app/javascript/mastodon/locales/sv.json index 11b664d6805..a5cda9c93f3 100644 --- a/app/javascript/mastodon/locales/sv.json +++ b/app/javascript/mastodon/locales/sv.json @@ -850,7 +850,6 @@ "lightbox.zoom_in": "Zooma till faktisk storlek", "lightbox.zoom_out": "Zooma för att passa", "limited_account_hint.action": "Visa profil ändå", - "limited_account_hint.title": "Denna profil har dolts av {domain}s moderatorer.", "link_preview.author": "Av {name}", "link_preview.more_from_author": "Mer från {name}", "link_preview.shares": "{count, plural, one {{counter} inlägg} other {{counter} inlägg}}", diff --git a/app/javascript/mastodon/locales/th.json b/app/javascript/mastodon/locales/th.json index 2f9bc2ad4c1..64df55cd2cb 100644 --- a/app/javascript/mastodon/locales/th.json +++ b/app/javascript/mastodon/locales/th.json @@ -475,7 +475,6 @@ "lightbox.zoom_in": "ซูมเป็นขนาดจริง", "lightbox.zoom_out": "ซูมให้พอดี", "limited_account_hint.action": "แสดงโปรไฟล์ต่อไป", - "limited_account_hint.title": "มีการซ่อนโปรไฟล์นี้โดยผู้กลั่นกรองของ {domain}", "link_preview.author": "โดย {name}", "link_preview.more_from_author": "เพิ่มเติมจาก {name}", "link_preview.shares": "{count, plural, other {{counter} โพสต์}}", diff --git a/app/javascript/mastodon/locales/tr.json b/app/javascript/mastodon/locales/tr.json index fe86644071d..e1306a87fc5 100644 --- a/app/javascript/mastodon/locales/tr.json +++ b/app/javascript/mastodon/locales/tr.json @@ -850,7 +850,7 @@ "lightbox.zoom_in": "Özgün boyuta dön", "lightbox.zoom_out": "Sığacak şekilde boyutla", "limited_account_hint.action": "Yine de profili göster", - "limited_account_hint.title": "Bu profil {domain} moderatörleri tarafından gizlendi.", + "limited_account_hint.title": "Bu profil veya sunucu, {domain} moderatörleri tarafından gizlendi.", "link_preview.author": "Yazar: {name}", "link_preview.more_from_author": "{name} kişisinden daha fazlası", "link_preview.shares": "{count, plural, one {{counter} gönderi} other {{counter} gönderi}}", diff --git a/app/javascript/mastodon/locales/tt.json b/app/javascript/mastodon/locales/tt.json index e09cfa8dafa..9dabb0d2568 100644 --- a/app/javascript/mastodon/locales/tt.json +++ b/app/javascript/mastodon/locales/tt.json @@ -274,7 +274,6 @@ "lightbox.next": "Киләсе", "lightbox.previous": "Алдагы", "limited_account_hint.action": "Барыбер профильне күрсәтергә", - "limited_account_hint.title": "Бу профильне модераторлар яшергән {domain}.", "lists.delete": "Исемлекне бетерегез", "lists.edit": "Исемлекне үзгәртү", "lists.replies_policy.list": "Исемлек әгъзалары", diff --git a/app/javascript/mastodon/locales/uk.json b/app/javascript/mastodon/locales/uk.json index a514e369908..54917fab1d3 100644 --- a/app/javascript/mastodon/locales/uk.json +++ b/app/javascript/mastodon/locales/uk.json @@ -517,7 +517,6 @@ "lightbox.zoom_in": "Масштаб за реальним розміром", "lightbox.zoom_out": "Збільшити відповідно до розміру", "limited_account_hint.action": "Усе одно показати профіль", - "limited_account_hint.title": "Цей профіль сховали модератори {domain}.", "link_preview.author": "Від {name}", "link_preview.more_from_author": "Більше від {name}", "link_preview.shares": "{count, plural, one {{counter} допис} few {{counter} дописи} many {{counter} дописів} other {{counter} допис}}", diff --git a/app/javascript/mastodon/locales/vi.json b/app/javascript/mastodon/locales/vi.json index 3e14da491c7..973ecf626e2 100644 --- a/app/javascript/mastodon/locales/vi.json +++ b/app/javascript/mastodon/locales/vi.json @@ -850,7 +850,6 @@ "lightbox.zoom_in": "Kích cỡ gốc", "lightbox.zoom_out": "Vừa màn hình", "limited_account_hint.action": "Vẫn cứ xem", - "limited_account_hint.title": "Tài khoản này đã bị ẩn bởi quản trị viên {domain}.", "link_preview.author": "Bởi {name}", "link_preview.more_from_author": "Viết bởi {name}", "link_preview.shares": "{count, plural, other {{counter} lượt chia sẻ}}", diff --git a/app/javascript/mastodon/locales/zh-CN.json b/app/javascript/mastodon/locales/zh-CN.json index 13410edba69..7312742aa28 100644 --- a/app/javascript/mastodon/locales/zh-CN.json +++ b/app/javascript/mastodon/locales/zh-CN.json @@ -850,7 +850,7 @@ "lightbox.zoom_in": "缩放为实际大小", "lightbox.zoom_out": "缩放到适合窗口大小", "limited_account_hint.action": "仍要显示个人资料", - "limited_account_hint.title": "此账号资料已被 {domain} 管理员隐藏。", + "limited_account_hint.title": "此账号资料或服务器已被 {domain} 管理员隐藏。", "link_preview.author": "由 {name}", "link_preview.more_from_author": "查看 {name} 的更多内容", "link_preview.shares": "{count, plural, other {{counter} 条嘟文}}", diff --git a/app/javascript/mastodon/locales/zh-HK.json b/app/javascript/mastodon/locales/zh-HK.json index 837ae22f90f..a64c3ada6e4 100644 --- a/app/javascript/mastodon/locales/zh-HK.json +++ b/app/javascript/mastodon/locales/zh-HK.json @@ -464,7 +464,6 @@ "lightbox.next": "下一頁", "lightbox.previous": "上一頁", "limited_account_hint.action": "一律顯示個人檔案", - "limited_account_hint.title": "此個人檔案已被 {domain} 的管理員隱藏。", "link_preview.author": "由 {name} 提供", "lists.add_member": "新增", "lists.create": "建立", diff --git a/app/javascript/mastodon/locales/zh-TW.json b/app/javascript/mastodon/locales/zh-TW.json index d7a303721f2..724ff38ce16 100644 --- a/app/javascript/mastodon/locales/zh-TW.json +++ b/app/javascript/mastodon/locales/zh-TW.json @@ -850,7 +850,7 @@ "lightbox.zoom_in": "縮放至實際大小", "lightbox.zoom_out": "縮放至合適大小", "limited_account_hint.action": "一律顯示個人檔案", - "limited_account_hint.title": "此個人檔案已被 {domain} 之管理員隱藏。", + "limited_account_hint.title": "此個人檔案或伺服器已被 {domain} 之管理員隱藏。", "link_preview.author": "來自 {name}", "link_preview.more_from_author": "來自 {name} 之更多內容", "link_preview.shares": "{count, plural, other {{counter} 則嘟文}}", diff --git a/config/locales/de.yml b/config/locales/de.yml index aaa00f64859..27a49b4d797 100644 --- a/config/locales/de.yml +++ b/config/locales/de.yml @@ -746,6 +746,7 @@ de: action_log: Protokoll action_taken_by: Maßnahme ergriffen von actions: + delete_description_html: Die gemeldeten Beiträge/Sammlungen werden gelöscht und die ergriffene Maßnahme wird aufgezeichnet, um dir bei zukünftigen Verstößen des gleichen Kontos zu helfen. mark_as_sensitive_description_html: Die Medien in den gemeldeten Beiträgen werden mit einer Inhaltswarnung versehen und der Vorfall wird vermerkt, um bei zukünftigen Verstößen desselben Kontos besser reagieren zu können. other_description_html: Weitere Optionen zur Steuerung des Kontoverhaltens und zur Anpassung der Kommunikation mit dem gemeldeten Konto. resolve_description_html: Es wird keine Maßnahme gegen das gemeldete Konto ergriffen und der Vorgang wird nicht aufgezeichnet – die Meldung wird hiermit geschlossen. @@ -772,6 +773,7 @@ de: confirm: Bestätigen confirm_action: Maßnahme gegen @%{acct} bestätigen created_at: Gemeldet am + delete_and_resolve: Inhalt löschen forwarded: Weitergeleitet forwarded_replies_explanation: Diese Meldung stammt von einem externen Profil und betrifft einen externen Inhalt. Der Inhalt wurde an dich weitergeleitet, weil er eine Antwort auf ein bei dir registriertes Profil ist. forwarded_to: Weitergeleitet an %{domain} diff --git a/config/locales/es-MX.yml b/config/locales/es-MX.yml index 958492bae93..746f64655b5 100644 --- a/config/locales/es-MX.yml +++ b/config/locales/es-MX.yml @@ -746,7 +746,7 @@ es-MX: action_log: Registro de auditoría action_taken_by: Acción tomada por actions: - delete_description_html: Las publicaciones y/o colecciones informadas se borrarán, y se aplicará una amonestación para ayudarte a escalar futuras acciones sobre la misma cuenta. + delete_description_html: Las publicaciones y/o colecciones denunciadas serán eliminadas y se registrará una advertencia para ayudarte a tomar medidas más estrictas en caso de futuras infracciones por parte de la misma cuenta. mark_as_sensitive_description_html: Los archivos multimedia en las publicaciones reportadas se marcarán como sensibles y se aplicará una amonestación para ayudarte a escalar las futuras infracciones de la misma cuenta. other_description_html: Ver más opciones para controlar el comportamiento de la cuenta y personalizar la comunicación de la cuenta reportada. resolve_description_html: No se tomarán medidas contra la cuenta denunciada, no se registrará la amonestación, y se cerrará el informe. @@ -773,7 +773,7 @@ es-MX: confirm: Confirmar confirm_action: Confirmar acción de moderación contra @%{acct} created_at: Denunciado - delete_and_resolve: Borrar contenido + delete_and_resolve: Eliminar contenido forwarded: Reenviado forwarded_replies_explanation: Este reporte es de un usuario remoto y sobre contenido remoto. Se le ha enviado porque el contenido reportado es en respuesta a uno de sus usuarios. forwarded_to: Reenviado a %{domain} diff --git a/config/locales/et.yml b/config/locales/et.yml index 866c764f7e0..1c41ade363d 100644 --- a/config/locales/et.yml +++ b/config/locales/et.yml @@ -746,6 +746,7 @@ et: action_log: Auditilogi action_taken_by: Meetmeid kasutanud actions: + delete_description_html: Teatatud postitused ja/või kogumikud kustutatakse ning registreeritakse hoiatus, mis aitab sul sama konto tulevaste rikkumiste korral asja edasi suunata. mark_as_sensitive_description_html: Raporteeritud meedia märgitakse kui tundlik sisu ja juhtum talletatakse hoiatusena tulevaste eksimuste ärahoidmiseks. other_description_html: On rohkem valikuid konto käitumise juhtimiseks ja suhtluse kohandamiseks raporteeritud kontoga. resolve_description_html: Raporteeritud konto suhtes ei võeta midagi ette, juhtumit ei registreerita ja raport suletakse. @@ -772,6 +773,7 @@ et: confirm: Kinnita confirm_action: Kinnita @%{acct} modereering created_at: Teavitatud + delete_and_resolve: Kustuta sisu forwarded: Edastatud forwarded_replies_explanation: See aruanne pärineb kaugkasutajalt ja käsitleb kaugsisu. See on edastatud sulle, sest raporteeritud sisu on vastus ühele sinu kasutajale. forwarded_to: Edastatud %{domain} domeeni @@ -1567,7 +1569,9 @@ et: blocks: Sa blokeerid bookmarks: Järjehoidjad csv: CSV + custom_filters: Filtrid domain_blocks: Domeeni blokeeringud + json: JSON lists: Loetelud mutes: Oled summutanud storage: Meedia hoidla diff --git a/config/locales/ga.yml b/config/locales/ga.yml index d4fba106d24..437fcd3d946 100644 --- a/config/locales/ga.yml +++ b/config/locales/ga.yml @@ -788,6 +788,7 @@ ga: action_log: Loga iniúchta action_taken_by: Gníomh arna ghlacadh ag actions: + delete_description_html: Scriosfar na poist agus/nó na bailiúcháin a tuairiscíodh agus taifeadfar stailc chun cabhrú leat sárú dlí amach anseo ag an gcuntas céanna a chur chun cinn. mark_as_sensitive_description_html: Déanfar na meáin sna poist tuairiscithe a mharcáil mar íogair agus déanfar stailc a thaifeadadh chun cabhrú leat sárú a dhéanamh ar sháruithe sa todhchaí tríd an gcuntas céanna. other_description_html: Féach ar a thuilleadh roghanna chun iompar an chuntais a rialú agus cumarsáid a shaincheapadh chuig an gcuntas tuairiscithe. resolve_description_html: Ní dhéanfar aon ghníomhaíocht i gcoinne an chuntais thuairiscithe, ní dhéanfar aon stailc a thaifeadadh, agus dúnfar an tuarascáil. @@ -814,6 +815,7 @@ ga: confirm: Deimhnigh confirm_action: Deimhnigh gníomh modhnóireachta i gcoinne @%{acct} created_at: Tuairiscithe + delete_and_resolve: Scrios ábhar forwarded: Ar aghaidh forwarded_replies_explanation: Is ó chianúsáideoir an tuairisc seo agus faoi chianábhar. Tá sé curtha ar aghaidh chugat toisc go bhfuil an t-ábhar tuairiscithe mar fhreagra ar cheann de na húsáideoirí atá agat. forwarded_to: Ar aghaidh chuig %{domain} @@ -1635,7 +1637,9 @@ ga: blocks: Bac leat bookmarks: Leabharmharcanna csv: CSV + custom_filters: Scagairí domain_blocks: Bloic fearainn + json: JSON lists: Liostaí mutes: Balbhaíonn tú storage: Stóráil meáin diff --git a/config/locales/he.yml b/config/locales/he.yml index f160d6f2cbd..c754a48df6d 100644 --- a/config/locales/he.yml +++ b/config/locales/he.yml @@ -774,6 +774,7 @@ he: action_log: ביקורת יומן action_taken_by: פעולה בוצעה ע"י actions: + delete_description_html: ההודעות המדווחות ו/או אוספים יימחקו ותרשם עבירה על מנת להקל בהעלאה של דיווחים עתידיים על אותו החשבון. mark_as_sensitive_description_html: המדיה בהודעות מדווחות תסומן כרגישה ועבירה תרשם כדי לעזור לך להסלים באינטראקציות עתידיות עם אותו החשבון. other_description_html: ראו אפשרויות נוספות לשליטה בהתנהגות החשבון וכדי לבצע התאמות בתקשורת עם החשבון המדווח. resolve_description_html: אף פעולה לא תבוצע נגד החשבון עליו דווח, לא תירשם עבירה, והדיווח ייסגר. @@ -800,6 +801,7 @@ he: confirm: אישור confirm_action: נא לאשר פעולת משמעת לגבי חשבון %{acct} created_at: מדווח + delete_and_resolve: מחק תוכן forwarded: קודם forwarded_replies_explanation: דווח זה הגיע מחשבון משתמש חיצוני על תוכן חיצוני. הוא הועבר אליך כיוון שהתוכן שדווח הוא בתשובה למשתמש.ת שלך. forwarded_to: קודם ל-%{domain} diff --git a/config/locales/zh-CN.yml b/config/locales/zh-CN.yml index 379b941c7cf..d8255d01a18 100644 --- a/config/locales/zh-CN.yml +++ b/config/locales/zh-CN.yml @@ -732,6 +732,7 @@ zh-CN: action_log: 审计日志 action_taken_by: 操作执行者 actions: + delete_description_html: 被举报的嘟文和收藏列表将被删除,同时该账号将被标记一次处罚,以供未来同一账号再次违规时参考。 mark_as_sensitive_description_html: 被举报的嘟文将被标记为敏感,同时该账号将被标记一次处罚,以供未来同一账号再次违规时参考。 other_description_html: 查看更多控制该账号行为的选项,并自定义编写与被举报账号的通信。 resolve_description_html: 不会对被举报账号采取任何动作,举报将被关闭,也不会留下处罚记录。 @@ -758,6 +759,7 @@ zh-CN: confirm: 确认 confirm_action: 确认对 @%{acct} 的管理操作 created_at: 举报时间 + delete_and_resolve: 删除内容 forwarded: 已转发 forwarded_replies_explanation: 该举报来自外站用户,涉及外站内容。之所以转发给你,是因为被举报的内容是对你站点一位用户的回复。 forwarded_to: 转发举报到 %{domain} From a6ec5ce508eae1dcd37eec05ae25a3622e86ceb7 Mon Sep 17 00:00:00 2001 From: diondiondion Date: Thu, 4 Jun 2026 10:20:46 +0200 Subject: [PATCH 014/130] Remove resize handles from inputs in Firefox (#39274) --- app/javascript/styles/mastodon/forms.scss | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/app/javascript/styles/mastodon/forms.scss b/app/javascript/styles/mastodon/forms.scss index 27b2a462233..d3fdf2fb214 100644 --- a/app/javascript/styles/mastodon/forms.scss +++ b/app/javascript/styles/mastodon/forms.scss @@ -557,7 +557,6 @@ code { display: block; width: 100%; font-family: inherit; - resize: vertical; background: var(--color-bg-secondary); border: 1px solid var(--color-border-primary); border-radius: 4px; @@ -584,6 +583,10 @@ code { } } + textarea { + resize: vertical; + } + input[type='text'], input[type='number'], input[type='email'], From 8d9a7aa50b5f4b1132ddc489cb1a28654ec47cea Mon Sep 17 00:00:00 2001 From: Matt Jankowski Date: Thu, 4 Jun 2026 04:38:33 -0400 Subject: [PATCH 015/130] Exercise more of `tags/show.rss` view (#39269) --- spec/requests/tags_spec.rb | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/spec/requests/tags_spec.rb b/spec/requests/tags_spec.rb index f04d1bc2d3a..bacd85ca6f5 100644 --- a/spec/requests/tags_spec.rb +++ b/spec/requests/tags_spec.rb @@ -6,6 +6,9 @@ RSpec.describe 'Tags' do describe 'GET /tags/:id' do context 'when tag exists' do let(:tag) { Fabricate :tag } + let(:status) { Fabricate :status } + + before { status.tags << tag } context 'with HTML format' do before { get tag_path(tag) } @@ -51,6 +54,8 @@ RSpec.describe 'Tags' do .and have_cacheable_headers.with_vary('Accept, Accept-Language, Cookie') expect(response.content_type) .to start_with('application/rss+xml') + expect(response.body) + .to include(status.text) end end end From a849a2d824fa2c19056b3fcccba7bf396b41a0a5 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Thu, 4 Jun 2026 11:27:15 +0200 Subject: [PATCH 016/130] Update dependency js-yaml to v4.2.0 (#39241) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- yarn.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/yarn.lock b/yarn.lock index c27f3c70bd2..d5a210c45cd 100644 --- a/yarn.lock +++ b/yarn.lock @@ -9304,13 +9304,13 @@ __metadata: linkType: hard "js-yaml@npm:^4.1.0": - version: 4.1.1 - resolution: "js-yaml@npm:4.1.1" + version: 4.2.0 + resolution: "js-yaml@npm:4.2.0" dependencies: argparse: "npm:^2.0.1" bin: js-yaml: bin/js-yaml.js - checksum: 10c0/561c7d7088c40a9bb53cc75becbfb1df6ae49b34b5e6e5a81744b14ae8667ec564ad2527709d1a6e7d5e5fa6d483aa0f373a50ad98d42fde368ec4a190d4fae7 + checksum: 10c0/1916456c118746603b067d74bbcbb0445d9a1d5e474ad4ae775e7b20525bed902e01d9d97dd0c81fcd8d4f596162309d0eb057f4aa38f3e9647f14075e9dea45 languageName: node linkType: hard From 0eed603a361ddb64669e2daf73a3493793edf32c Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Thu, 4 Jun 2026 09:27:52 +0000 Subject: [PATCH 017/130] Update dependency aws-sdk-core to v3.251.0 (#39257) 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 a8f4d4fc88f..6df2d6e0fb9 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -99,8 +99,8 @@ GEM ast (2.4.3) attr_required (1.0.2) aws-eventstream (1.4.0) - aws-partitions (1.1255.0) - aws-sdk-core (3.250.0) + aws-partitions (1.1256.0) + aws-sdk-core (3.251.0) aws-eventstream (~> 1, >= 1.3.0) aws-partitions (~> 1, >= 1.992.0) aws-sigv4 (~> 1.9) From 6bdecf2e4f118d147d69943504c43d553f8c04e2 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Thu, 4 Jun 2026 09:27:54 +0000 Subject: [PATCH 018/130] Update dependency aws-sdk-s3 to v1.225.0 (#39258) 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 6df2d6e0fb9..4630d77e233 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -108,10 +108,10 @@ GEM bigdecimal jmespath (~> 1, >= 1.6.1) logger - aws-sdk-kms (1.128.0) + aws-sdk-kms (1.129.0) aws-sdk-core (~> 3, >= 3.248.0) aws-sigv4 (~> 1.5) - aws-sdk-s3 (1.224.0) + aws-sdk-s3 (1.225.0) aws-sdk-core (~> 3, >= 3.248.0) aws-sdk-kms (~> 1) aws-sigv4 (~> 1.5) From df27144803bce46d9ff6d9f0c972f99a72f45c2f Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Thu, 4 Jun 2026 11:34:49 +0200 Subject: [PATCH 019/130] Update dependency vite to v8.0.16 (#39245) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- yarn.lock | 157 ++++++++++++++++++++++++++++-------------------------- 1 file changed, 82 insertions(+), 75 deletions(-) diff --git a/yarn.lock b/yarn.lock index d5a210c45cd..847501e2f41 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3361,7 +3361,14 @@ __metadata: languageName: node linkType: hard -"@oxc-project/types@npm:=0.132.0, @oxc-project/types@npm:^0.132.0": +"@oxc-project/types@npm:=0.133.0": + version: 0.133.0 + resolution: "@oxc-project/types@npm:0.133.0" + checksum: 10c0/70c57ba58644f7ec217b670c301801f4d06995f4ccdba6b2bd106ea3e5ee49d616573e6ef8d55530b87571a960696543687f3850e87ad173d3f88965c30cdd63 + languageName: node + linkType: hard + +"@oxc-project/types@npm:^0.132.0": version: 0.132.0 resolution: "@oxc-project/types@npm:0.132.0" checksum: 10c0/d0ca5e98be0b873d69e4f0f743eb35026833603dac11db9d55f2b5438251b381b886dc556fe3175a17b673f8e2073c49bde88d7e6e702aa09298c22b8b5504e1 @@ -3772,93 +3779,93 @@ __metadata: languageName: node linkType: hard -"@rolldown/binding-android-arm64@npm:1.0.2": - version: 1.0.2 - resolution: "@rolldown/binding-android-arm64@npm:1.0.2" +"@rolldown/binding-android-arm64@npm:1.0.3": + version: 1.0.3 + resolution: "@rolldown/binding-android-arm64@npm:1.0.3" conditions: os=android & cpu=arm64 languageName: node linkType: hard -"@rolldown/binding-darwin-arm64@npm:1.0.2": - version: 1.0.2 - resolution: "@rolldown/binding-darwin-arm64@npm:1.0.2" +"@rolldown/binding-darwin-arm64@npm:1.0.3": + version: 1.0.3 + resolution: "@rolldown/binding-darwin-arm64@npm:1.0.3" conditions: os=darwin & cpu=arm64 languageName: node linkType: hard -"@rolldown/binding-darwin-x64@npm:1.0.2": - version: 1.0.2 - resolution: "@rolldown/binding-darwin-x64@npm:1.0.2" +"@rolldown/binding-darwin-x64@npm:1.0.3": + version: 1.0.3 + resolution: "@rolldown/binding-darwin-x64@npm:1.0.3" conditions: os=darwin & cpu=x64 languageName: node linkType: hard -"@rolldown/binding-freebsd-x64@npm:1.0.2": - version: 1.0.2 - resolution: "@rolldown/binding-freebsd-x64@npm:1.0.2" +"@rolldown/binding-freebsd-x64@npm:1.0.3": + version: 1.0.3 + resolution: "@rolldown/binding-freebsd-x64@npm:1.0.3" conditions: os=freebsd & cpu=x64 languageName: node linkType: hard -"@rolldown/binding-linux-arm-gnueabihf@npm:1.0.2": - version: 1.0.2 - resolution: "@rolldown/binding-linux-arm-gnueabihf@npm:1.0.2" +"@rolldown/binding-linux-arm-gnueabihf@npm:1.0.3": + version: 1.0.3 + resolution: "@rolldown/binding-linux-arm-gnueabihf@npm:1.0.3" conditions: os=linux & cpu=arm languageName: node linkType: hard -"@rolldown/binding-linux-arm64-gnu@npm:1.0.2": - version: 1.0.2 - resolution: "@rolldown/binding-linux-arm64-gnu@npm:1.0.2" +"@rolldown/binding-linux-arm64-gnu@npm:1.0.3": + version: 1.0.3 + resolution: "@rolldown/binding-linux-arm64-gnu@npm:1.0.3" conditions: os=linux & cpu=arm64 & libc=glibc languageName: node linkType: hard -"@rolldown/binding-linux-arm64-musl@npm:1.0.2": - version: 1.0.2 - resolution: "@rolldown/binding-linux-arm64-musl@npm:1.0.2" +"@rolldown/binding-linux-arm64-musl@npm:1.0.3": + version: 1.0.3 + resolution: "@rolldown/binding-linux-arm64-musl@npm:1.0.3" conditions: os=linux & cpu=arm64 & libc=musl languageName: node linkType: hard -"@rolldown/binding-linux-ppc64-gnu@npm:1.0.2": - version: 1.0.2 - resolution: "@rolldown/binding-linux-ppc64-gnu@npm:1.0.2" +"@rolldown/binding-linux-ppc64-gnu@npm:1.0.3": + version: 1.0.3 + resolution: "@rolldown/binding-linux-ppc64-gnu@npm:1.0.3" conditions: os=linux & cpu=ppc64 & libc=glibc languageName: node linkType: hard -"@rolldown/binding-linux-s390x-gnu@npm:1.0.2": - version: 1.0.2 - resolution: "@rolldown/binding-linux-s390x-gnu@npm:1.0.2" +"@rolldown/binding-linux-s390x-gnu@npm:1.0.3": + version: 1.0.3 + resolution: "@rolldown/binding-linux-s390x-gnu@npm:1.0.3" conditions: os=linux & cpu=s390x & libc=glibc languageName: node linkType: hard -"@rolldown/binding-linux-x64-gnu@npm:1.0.2": - version: 1.0.2 - resolution: "@rolldown/binding-linux-x64-gnu@npm:1.0.2" +"@rolldown/binding-linux-x64-gnu@npm:1.0.3": + version: 1.0.3 + resolution: "@rolldown/binding-linux-x64-gnu@npm:1.0.3" conditions: os=linux & cpu=x64 & libc=glibc languageName: node linkType: hard -"@rolldown/binding-linux-x64-musl@npm:1.0.2": - version: 1.0.2 - resolution: "@rolldown/binding-linux-x64-musl@npm:1.0.2" +"@rolldown/binding-linux-x64-musl@npm:1.0.3": + version: 1.0.3 + resolution: "@rolldown/binding-linux-x64-musl@npm:1.0.3" conditions: os=linux & cpu=x64 & libc=musl languageName: node linkType: hard -"@rolldown/binding-openharmony-arm64@npm:1.0.2": - version: 1.0.2 - resolution: "@rolldown/binding-openharmony-arm64@npm:1.0.2" +"@rolldown/binding-openharmony-arm64@npm:1.0.3": + version: 1.0.3 + resolution: "@rolldown/binding-openharmony-arm64@npm:1.0.3" conditions: os=openharmony & cpu=arm64 languageName: node linkType: hard -"@rolldown/binding-wasm32-wasi@npm:1.0.2": - version: 1.0.2 - resolution: "@rolldown/binding-wasm32-wasi@npm:1.0.2" +"@rolldown/binding-wasm32-wasi@npm:1.0.3": + version: 1.0.3 + resolution: "@rolldown/binding-wasm32-wasi@npm:1.0.3" dependencies: "@emnapi/core": "npm:1.10.0" "@emnapi/runtime": "npm:1.10.0" @@ -3867,16 +3874,16 @@ __metadata: languageName: node linkType: hard -"@rolldown/binding-win32-arm64-msvc@npm:1.0.2": - version: 1.0.2 - resolution: "@rolldown/binding-win32-arm64-msvc@npm:1.0.2" +"@rolldown/binding-win32-arm64-msvc@npm:1.0.3": + version: 1.0.3 + resolution: "@rolldown/binding-win32-arm64-msvc@npm:1.0.3" conditions: os=win32 & cpu=arm64 languageName: node linkType: hard -"@rolldown/binding-win32-x64-msvc@npm:1.0.2": - version: 1.0.2 - resolution: "@rolldown/binding-win32-x64-msvc@npm:1.0.2" +"@rolldown/binding-win32-x64-msvc@npm:1.0.3": + version: 1.0.3 + resolution: "@rolldown/binding-win32-x64-msvc@npm:1.0.3" conditions: os=win32 & cpu=x64 languageName: node linkType: hard @@ -12517,26 +12524,26 @@ __metadata: languageName: node linkType: hard -"rolldown@npm:1.0.2": - version: 1.0.2 - resolution: "rolldown@npm:1.0.2" +"rolldown@npm:1.0.3": + version: 1.0.3 + resolution: "rolldown@npm:1.0.3" dependencies: - "@oxc-project/types": "npm:=0.132.0" - "@rolldown/binding-android-arm64": "npm:1.0.2" - "@rolldown/binding-darwin-arm64": "npm:1.0.2" - "@rolldown/binding-darwin-x64": "npm:1.0.2" - "@rolldown/binding-freebsd-x64": "npm:1.0.2" - "@rolldown/binding-linux-arm-gnueabihf": "npm:1.0.2" - "@rolldown/binding-linux-arm64-gnu": "npm:1.0.2" - "@rolldown/binding-linux-arm64-musl": "npm:1.0.2" - "@rolldown/binding-linux-ppc64-gnu": "npm:1.0.2" - "@rolldown/binding-linux-s390x-gnu": "npm:1.0.2" - "@rolldown/binding-linux-x64-gnu": "npm:1.0.2" - "@rolldown/binding-linux-x64-musl": "npm:1.0.2" - "@rolldown/binding-openharmony-arm64": "npm:1.0.2" - "@rolldown/binding-wasm32-wasi": "npm:1.0.2" - "@rolldown/binding-win32-arm64-msvc": "npm:1.0.2" - "@rolldown/binding-win32-x64-msvc": "npm:1.0.2" + "@oxc-project/types": "npm:=0.133.0" + "@rolldown/binding-android-arm64": "npm:1.0.3" + "@rolldown/binding-darwin-arm64": "npm:1.0.3" + "@rolldown/binding-darwin-x64": "npm:1.0.3" + "@rolldown/binding-freebsd-x64": "npm:1.0.3" + "@rolldown/binding-linux-arm-gnueabihf": "npm:1.0.3" + "@rolldown/binding-linux-arm64-gnu": "npm:1.0.3" + "@rolldown/binding-linux-arm64-musl": "npm:1.0.3" + "@rolldown/binding-linux-ppc64-gnu": "npm:1.0.3" + "@rolldown/binding-linux-s390x-gnu": "npm:1.0.3" + "@rolldown/binding-linux-x64-gnu": "npm:1.0.3" + "@rolldown/binding-linux-x64-musl": "npm:1.0.3" + "@rolldown/binding-openharmony-arm64": "npm:1.0.3" + "@rolldown/binding-wasm32-wasi": "npm:1.0.3" + "@rolldown/binding-win32-arm64-msvc": "npm:1.0.3" + "@rolldown/binding-win32-x64-msvc": "npm:1.0.3" "@rolldown/pluginutils": "npm:^1.0.0" dependenciesMeta: "@rolldown/binding-android-arm64": @@ -12571,7 +12578,7 @@ __metadata: optional: true bin: rolldown: ./bin/cli.mjs - checksum: 10c0/628327a6e3122c0b62880f1c87d54095394e5138a6af2e6e7b2f67ef4c4b11f1421db68c9a5bb4e1be161465a863ab4f68f15076ce895cd4bb3d0ba18a3b20b1 + checksum: 10c0/5f9dd47b7abf203b16bc600db68542f245e974c800e59ff50b76157d1dada1403657690435b036fabca88e93d13a67c31abe5cfaa6f61ce33717f61720204cdf languageName: node linkType: hard @@ -13795,13 +13802,13 @@ __metadata: languageName: node linkType: hard -"tinyglobby@npm:^0.2.12, tinyglobby@npm:^0.2.14, tinyglobby@npm:^0.2.15, tinyglobby@npm:^0.2.16": - version: 0.2.16 - resolution: "tinyglobby@npm:0.2.16" +"tinyglobby@npm:^0.2.12, tinyglobby@npm:^0.2.14, tinyglobby@npm:^0.2.15, tinyglobby@npm:^0.2.17": + version: 0.2.17 + resolution: "tinyglobby@npm:0.2.17" dependencies: fdir: "npm:^6.5.0" picomatch: "npm:^4.0.4" - checksum: 10c0/f2e09fd93dd95c41e522113b686ff6f7c13020962f8698a864a257f3d7737599afc47722b7ab726e12f8a813f779906187911ff8ee6701ede65072671a7e934b + checksum: 10c0/7f7bb0f197c88bc4b20c231e0deca4240ca3bf313a88f5a7fee93a872b84966a4d50220947c0455ad07a60b3b360961c5b7fd979222aeb716a9f99b412002e4c languageName: node linkType: hard @@ -14532,15 +14539,15 @@ __metadata: linkType: hard "vite@npm:^6.0.0 || ^7.0.0 || ^8.0.0, vite@npm:^8.0.0": - version: 8.0.14 - resolution: "vite@npm:8.0.14" + version: 8.0.16 + resolution: "vite@npm:8.0.16" dependencies: fsevents: "npm:~2.3.3" lightningcss: "npm:^1.32.0" picomatch: "npm:^4.0.4" postcss: "npm:^8.5.15" - rolldown: "npm:1.0.2" - tinyglobby: "npm:^0.2.16" + rolldown: "npm:1.0.3" + tinyglobby: "npm:^0.2.17" peerDependencies: "@types/node": ^20.19.0 || >=22.12.0 "@vitejs/devtools": ^0.1.18 @@ -14584,7 +14591,7 @@ __metadata: optional: true bin: vite: bin/vite.js - checksum: 10c0/1ff99b4daadc64aed5f9e40387ecf39fd3bca45c1a5c4fa4aa82197de901930f0507af8d75c54715e2744c99575913947efb625653a78ef6df3997c5613970bd + checksum: 10c0/d75be3fbe2f63e6a8145325970338afaf0dd4d96ba9175c13f9a286fd5f95afc489401b693e4fa6c0899a4dd0e137be91cdf9401a40a635563911ad5036e3467 languageName: node linkType: hard From ecc823fc2e71b7baf8d7f2a5fce254284f581b59 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Thu, 4 Jun 2026 11:45:58 +0200 Subject: [PATCH 020/130] Update yarn monorepo to v4.16.0 (#39247) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- package.json | 2 +- streaming/package.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index af9928e6c49..98c0ffbd3bb 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "@mastodon/mastodon", "license": "AGPL-3.0-or-later", - "packageManager": "yarn@4.15.0", + "packageManager": "yarn@4.16.0", "engines": { "node": ">=22" }, diff --git a/streaming/package.json b/streaming/package.json index 0581cd75ad0..bd235412080 100644 --- a/streaming/package.json +++ b/streaming/package.json @@ -1,7 +1,7 @@ { "name": "@mastodon/streaming", "license": "AGPL-3.0-or-later", - "packageManager": "yarn@4.15.0", + "packageManager": "yarn@4.16.0", "engines": { "node": ">=22" }, From e00d16474e51111f0a89c81ae976d08a2082d6ec Mon Sep 17 00:00:00 2001 From: diondiondion Date: Thu, 4 Jun 2026 14:08:26 +0200 Subject: [PATCH 021/130] Prevent logged out users from accessing collection & list creation routes (#39282) --- .../features/account_featured/index.tsx | 2 +- .../features/collection_adder/index.tsx | 2 +- .../features/collections/editor/index.tsx | 19 +++--- .../mastodon/features/collections/index.tsx | 6 +- ...ated_by_you.tsx => created_by_account.tsx} | 59 ++++++++++++------- .../collections/overview/featuring_you.tsx | 2 +- .../mastodon/features/lists/index.tsx | 37 ++++++++---- .../mastodon/features/lists/new.tsx | 15 ++++- app/javascript/mastodon/locales/en.json | 1 + 9 files changed, 93 insertions(+), 50 deletions(-) rename app/javascript/mastodon/features/collections/overview/{created_by_you.tsx => created_by_account.tsx} (71%) diff --git a/app/javascript/mastodon/features/account_featured/index.tsx b/app/javascript/mastodon/features/account_featured/index.tsx index b743a7302ec..cddfb96c22a 100644 --- a/app/javascript/mastodon/features/account_featured/index.tsx +++ b/app/javascript/mastodon/features/account_featured/index.tsx @@ -29,7 +29,7 @@ import { useAppDispatch, useAppSelector } from '@/mastodon/store'; import AddIcon from '@/material-icons/400-24px/add.svg?react'; import { CollectionListItem } from '../collections/components/collection_list_item'; -import { useCollectionsCreatedBy } from '../collections/overview/created_by_you'; +import { useCollectionsCreatedBy } from '../collections/overview/created_by_account'; import { EmptyMessage } from './components/empty_message'; import { Subheading, SubheadingLink } from './components/subheading'; diff --git a/app/javascript/mastodon/features/collection_adder/index.tsx b/app/javascript/mastodon/features/collection_adder/index.tsx index 48a0e68f48d..75aae8f3f85 100644 --- a/app/javascript/mastodon/features/collection_adder/index.tsx +++ b/app/javascript/mastodon/features/collection_adder/index.tsx @@ -15,7 +15,7 @@ import { IconButton } from 'mastodon/components/icon_button'; import { useAppDispatch, useAppSelector } from 'mastodon/store'; import { MAX_COLLECTION_ACCOUNT_COUNT } from '../collections/editor/accounts'; -import { useCollectionsCreatedBy } from '../collections/overview/created_by_you'; +import { useCollectionsCreatedBy } from '../collections/overview/created_by_account'; import { CollectionToggle } from './collection_toggle'; diff --git a/app/javascript/mastodon/features/collections/editor/index.tsx b/app/javascript/mastodon/features/collections/editor/index.tsx index 935e230e4a3..06109916a3f 100644 --- a/app/javascript/mastodon/features/collections/editor/index.tsx +++ b/app/javascript/mastodon/features/collections/editor/index.tsx @@ -13,20 +13,21 @@ import { import { Helmet } from '@unhead/react/helmet'; -import { Callout } from '@/mastodon/components/callout'; -import { useCurrentAccountId } from '@/mastodon/hooks/useAccountId'; -import { initialState } from '@/mastodon/initial_state'; import ListAltIcon from '@/material-icons/400-24px/list_alt.svg?react'; +import { Callout } from 'mastodon/components/callout'; import { Column } from 'mastodon/components/column'; import { ColumnHeader } from 'mastodon/components/column_header'; import { LoadingIndicator } from 'mastodon/components/loading_indicator'; +import { NotSignedInIndicator } from 'mastodon/components/not_signed_in_indicator'; +import { useIdentity } from 'mastodon/identity_context'; +import { initialState } from 'mastodon/initial_state'; import { collectionEditorActions, fetchCollection, } from 'mastodon/reducers/slices/collections'; import { useAppDispatch, useAppSelector } from 'mastodon/store'; -import { useCollectionsCreatedBy } from '../overview/created_by_you'; +import { useCollectionsCreatedBy } from '../overview/created_by_account'; import { CollectionAccounts } from './accounts'; import { CollectionDetails } from './details'; @@ -75,7 +76,7 @@ export const CollectionEditorPage: React.FC<{ }> = ({ multiColumn }) => { const intl = useIntl(); const dispatch = useAppDispatch(); - const accountId = useCurrentAccountId(); + const { accountId, signedIn } = useIdentity(); const { id = null } = useParams<{ id?: string }>(); const { path } = useRouteMatch(); const collection = useAppSelector((state) => @@ -94,13 +95,13 @@ export const CollectionEditorPage: React.FC<{ (!isEditMode && collectionListStatus === 'loading'); const canCreateMoreCollections = - isEditMode || collectionList.length < userCollectionLimit; + signedIn && (isEditMode || collectionList.length < userCollectionLimit); useEffect(() => { - if (id) { + if (id && signedIn) { void dispatch(fetchCollection({ collectionId: id })); } - }, [dispatch, id]); + }, [dispatch, id, signedIn]); useEffect(() => { if (id !== editorStateId) { @@ -129,6 +130,8 @@ export const CollectionEditorPage: React.FC<{
{isLoading ? ( + ) : !signedIn ? ( + ) : canCreateMoreCollections ? ( - + { +export const CollectionsCreatedByAccount: React.FC = () => { const me = useCurrentAccountId(); const accountId = useAccountId(); + const account = useAccount(accountId); const { collections, status } = useCollectionsCreatedBy(accountId); @@ -78,24 +81,40 @@ export const CollectionsCreatedByYou: React.FC = () => { } if (collections.length === 0) { - return ( - - } - message={ - - } - > - - - ); + if (isOwnCollectionPage) { + return ( + + } + message={ + + } + > + + + ); + } else { + return ( + , + }} + /> + } + /> + ); + } } return ( @@ -113,7 +132,7 @@ export const CollectionsCreatedByYou: React.FC = () => { {showCreateButton && }
- {!canCreateMoreCollections && ( + {isOwnCollectionPage && !canCreateMoreCollections && ( )} {collections.map((item, index) => ( diff --git a/app/javascript/mastodon/features/collections/overview/featuring_you.tsx b/app/javascript/mastodon/features/collections/overview/featuring_you.tsx index 4d6cd30b9f3..2f5c7628d27 100644 --- a/app/javascript/mastodon/features/collections/overview/featuring_you.tsx +++ b/app/javascript/mastodon/features/collections/overview/featuring_you.tsx @@ -16,7 +16,7 @@ import { useAppSelector, useAppDispatch } from 'mastodon/store'; import { CollectionListItem } from '../components/collection_list_item'; import classes from '../styles.module.scss'; -import { CollectionListError } from './created_by_you'; +import { CollectionListError } from './created_by_account'; function useCollectionsFeaturing(accountId: string | null | undefined) { const dispatch = useAppDispatch(); diff --git a/app/javascript/mastodon/features/lists/index.tsx b/app/javascript/mastodon/features/lists/index.tsx index 6aa27d5c57f..12b96ea3363 100644 --- a/app/javascript/mastodon/features/lists/index.tsx +++ b/app/javascript/mastodon/features/lists/index.tsx @@ -6,6 +6,8 @@ import { Link } from 'react-router-dom'; import { Helmet } from '@unhead/react/helmet'; +import { NotSignedInIndicator } from '@/mastodon/components/not_signed_in_indicator'; +import { useIdentity } from '@/mastodon/identity_context'; import AddIcon from '@/material-icons/400-24px/add.svg?react'; import ListAltIcon from '@/material-icons/400-24px/list_alt.svg?react'; import MoreHorizIcon from '@/material-icons/400-24px/more_horiz.svg?react'; @@ -78,10 +80,13 @@ const Lists: React.FC<{ const dispatch = useAppDispatch(); const intl = useIntl(); const lists = useAppSelector((state) => getOrderedLists(state)); + const { signedIn } = useIdentity(); useEffect(() => { - void dispatch(fetchLists()); - }, [dispatch]); + if (signedIn) { + void dispatch(fetchLists()); + } + }, [signedIn, dispatch]); const emptyMessage = ( <> @@ -112,14 +117,16 @@ const Lists: React.FC<{ iconComponent={ListAltIcon} multiColumn={multiColumn} extraButton={ - - - + signedIn && ( + + + + ) } /> @@ -128,9 +135,13 @@ const Lists: React.FC<{ emptyMessage={emptyMessage} bindToDocument={!multiColumn} > - {lists.map((list) => ( - - ))} + {signedIn ? ( + lists.map((list) => ( + + )) + ) : ( + + )} diff --git a/app/javascript/mastodon/features/lists/new.tsx b/app/javascript/mastodon/features/lists/new.tsx index e8f6343278c..c95eb333f13 100644 --- a/app/javascript/mastodon/features/lists/new.tsx +++ b/app/javascript/mastodon/features/lists/new.tsx @@ -8,6 +8,8 @@ import { isFulfilled } from '@reduxjs/toolkit'; import { Helmet } from '@unhead/react/helmet'; +import { NotSignedInIndicator } from '@/mastodon/components/not_signed_in_indicator'; +import { useIdentity } from '@/mastodon/identity_context'; import ChevronRightIcon from '@/material-icons/400-24px/chevron_right.svg?react'; import ListAltIcon from '@/material-icons/400-24px/list_alt.svg?react'; import { fetchList } from 'mastodon/actions/lists'; @@ -250,16 +252,17 @@ const NewListWrapper: React.FC<{ }> = ({ multiColumn }) => { const intl = useIntl(); const dispatch = useAppDispatch(); + const { signedIn } = useIdentity(); const { id } = useParams<{ id?: string }>(); const list = useAppSelector((state) => id ? state.lists.get(id) : undefined, ); useEffect(() => { - if (id) { + if (signedIn && id) { dispatch(fetchList(id)); } - }, [dispatch, id]); + }, [dispatch, signedIn, id]); const isLoading = id && !list; @@ -277,7 +280,13 @@ const NewListWrapper: React.FC<{ />
- {isLoading ? : } + {!signedIn ? ( + + ) : isLoading ? ( + + ) : ( + + )}
diff --git a/app/javascript/mastodon/locales/en.json b/app/javascript/mastodon/locales/en.json index 44e2c9aa170..d051fecf8ab 100644 --- a/app/javascript/mastodon/locales/en.json +++ b/app/javascript/mastodon/locales/en.json @@ -646,6 +646,7 @@ "empty_column.account_unavailable": "Profile unavailable", "empty_column.blocks": "You haven't blocked any users yet.", "empty_column.bookmarked_statuses": "You don't have any bookmarked posts yet. When you bookmark one, it will show up here.", + "empty_column.collections": "{acct} has not created any collections yet.", "empty_column.collections.featured_in": "You have not been added to any collections yet.", "empty_column.collections.featured_in_undiscoverable": "In order for people to add you to collections, you need to allow featuring in discovery experiences from Preferences > Privacy and reach", "empty_column.community": "The local timeline is empty. Write something publicly to get the ball rolling!", From a19dd606e89dcd760f5e23ade29dd555269f5f44 Mon Sep 17 00:00:00 2001 From: Claire Date: Thu, 4 Jun 2026 15:10:06 +0200 Subject: [PATCH 022/130] Fix link to profile API documentation in CHANGELOG (#39276) --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index a0240292833..4fd104d6d40 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -16,7 +16,7 @@ All notable changes to this project will be documented in this file. - Add export for custom filters (#39085 by @arte7) - Add ability to search email blocks by domain in admin UI (#38923 by @arte7) - Add new endpoints for profile editing in REST API (#37912, #37934, #37932, #38221, and #38339 by @ClearlyClaire) - - Add `GET /api/v1/profile` and `PATCH /api/v1/profile` to replace the existing `update_credentials` endpoint. See [the documentation](https://www.notion.so/joinmastodon/Mastodon-v4-6-0-beta1-changelog-3656208ac91b8088a745d15a9e81f727) for more information. + - Add `GET /api/v1/profile` and `PATCH /api/v1/profile` to replace the existing `update_credentials` endpoint. See [the documentation](https://docs.joinmastodon.org/methods/profile/) for more information. - Add `missing_attribution` boolean to preview cards in REST API (#38043 by @ClearlyClaire) - Documentation: https://docs.joinmastodon.org/entities/PreviewCard/#missing_attribution - Add `exclude_direct` flag to `/api/v1/accounts/:id/statuses` to exclude direct messages (#37763 by @ClearlyClaire) From 2b6b2fcb6ff7f0c066260c0aa3f14f34e4bc3588 Mon Sep 17 00:00:00 2001 From: diondiondion Date: Thu, 4 Jun 2026 15:18:53 +0200 Subject: [PATCH 023/130] Fix ValidationError when loading many collections at once (#39286) --- .../mastodon/reducers/slices/collections.ts | 13 +++++++++---- app/javascript/mastodon/utils/batch_array.ts | 15 +++++++++++++++ 2 files changed, 24 insertions(+), 4 deletions(-) create mode 100644 app/javascript/mastodon/utils/batch_array.ts diff --git a/app/javascript/mastodon/reducers/slices/collections.ts b/app/javascript/mastodon/reducers/slices/collections.ts index ec2143351ab..56cf907f789 100644 --- a/app/javascript/mastodon/reducers/slices/collections.ts +++ b/app/javascript/mastodon/reducers/slices/collections.ts @@ -27,6 +27,7 @@ import { createAppSelector, createDataLoadingThunk, } from '@/mastodon/store/typed_functions'; +import { batchArray } from '@/mastodon/utils/batch_array'; import { inputToHashtag } from '@/mastodon/utils/hashtags'; type QueryStatus = 'idle' | 'loading' | 'error'; @@ -337,10 +338,14 @@ async function importAccountsForPreviewCard( ) .filter((id): id is string => !!id); - await dispatch( - fetchAccounts({ - accountIds: previewAccountIds, - }), + // fetchAccounts can only process up to 40 item ids, so we'll + // batch the list of ids + const batchedAccountIdLists = batchArray(previewAccountIds, 40); + + await Promise.allSettled( + batchedAccountIdLists.map((accountIds) => + dispatch(fetchAccounts({ accountIds })), + ), ); } diff --git a/app/javascript/mastodon/utils/batch_array.ts b/app/javascript/mastodon/utils/batch_array.ts new file mode 100644 index 00000000000..9e54895d338 --- /dev/null +++ b/app/javascript/mastodon/utils/batch_array.ts @@ -0,0 +1,15 @@ +/** + * Splits a long array so that the resulting nested arrays + * never exceed the `maxLength` provided. + * Useful when dealing with endpoints that accept a limited number + * of parameters + */ +export function batchArray(array: T[], maxLength: number) { + const result: T[][] = []; + + for (let i = 0; i < array.length; i += maxLength) { + result.push(array.slice(i, i + maxLength)); + } + + return result; +} From 085c91bf126a1df95e19198d62b315482ab3ecca Mon Sep 17 00:00:00 2001 From: Matt Jankowski Date: Thu, 4 Jun 2026 09:55:21 -0400 Subject: [PATCH 024/130] Reduce timeout minutes for actions (#39205) --- .github/workflows/bundler-audit.yml | 1 + .github/workflows/check-i18n.yml | 1 + .github/workflows/chromatic.yml | 2 ++ .github/workflows/codeql.yml | 1 + .github/workflows/format-check.yml | 1 + .github/workflows/lint-css.yml | 1 + .github/workflows/lint-haml.yml | 1 + .github/workflows/lint-js.yml | 1 + .github/workflows/lint-ruby.yml | 1 + .github/workflows/test-js.yml | 1 + .github/workflows/test-migrations.yml | 1 + .github/workflows/test-ruby.yml | 4 ++++ 12 files changed, 16 insertions(+) diff --git a/.github/workflows/bundler-audit.yml b/.github/workflows/bundler-audit.yml index b58fe600568..dc79d872646 100644 --- a/.github/workflows/bundler-audit.yml +++ b/.github/workflows/bundler-audit.yml @@ -22,6 +22,7 @@ on: jobs: security: runs-on: ubuntu-latest + timeout-minutes: 15 env: BUNDLE_ONLY: development diff --git a/.github/workflows/check-i18n.yml b/.github/workflows/check-i18n.yml index 4906ab6cf45..3a0c5dc36a8 100644 --- a/.github/workflows/check-i18n.yml +++ b/.github/workflows/check-i18n.yml @@ -19,6 +19,7 @@ permissions: jobs: check-i18n: runs-on: ubuntu-latest + timeout-minutes: 15 steps: - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6 diff --git a/.github/workflows/chromatic.yml b/.github/workflows/chromatic.yml index 9ead1916dd4..05f88df81c0 100644 --- a/.github/workflows/chromatic.yml +++ b/.github/workflows/chromatic.yml @@ -12,6 +12,7 @@ jobs: pathcheck: name: Check for relevant changes runs-on: ubuntu-latest + timeout-minutes: 15 outputs: changed: ${{ steps.filter.outputs.src }} steps: @@ -38,6 +39,7 @@ jobs: chromatic: name: Run Chromatic runs-on: ubuntu-latest + timeout-minutes: 15 needs: pathcheck if: github.repository == 'mastodon/mastodon' && needs.pathcheck.outputs.changed == 'true' steps: diff --git a/.github/workflows/codeql.yml b/.github/workflows/codeql.yml index afb70669565..bc796d828ce 100644 --- a/.github/workflows/codeql.yml +++ b/.github/workflows/codeql.yml @@ -17,6 +17,7 @@ jobs: analyze: name: Analyze runs-on: ubuntu-latest + timeout-minutes: 15 permissions: actions: read contents: read diff --git a/.github/workflows/format-check.yml b/.github/workflows/format-check.yml index 9a200504ef1..cca26ed5b09 100644 --- a/.github/workflows/format-check.yml +++ b/.github/workflows/format-check.yml @@ -10,6 +10,7 @@ on: jobs: lint: runs-on: ubuntu-latest + timeout-minutes: 15 steps: - name: Clone repository diff --git a/.github/workflows/lint-css.yml b/.github/workflows/lint-css.yml index d0c9802367e..59c69f836cb 100644 --- a/.github/workflows/lint-css.yml +++ b/.github/workflows/lint-css.yml @@ -27,6 +27,7 @@ on: jobs: lint: runs-on: ubuntu-latest + timeout-minutes: 15 steps: - name: Clone repository diff --git a/.github/workflows/lint-haml.yml b/.github/workflows/lint-haml.yml index ff18689c058..9534eb22545 100644 --- a/.github/workflows/lint-haml.yml +++ b/.github/workflows/lint-haml.yml @@ -25,6 +25,7 @@ on: jobs: lint: runs-on: ubuntu-latest + timeout-minutes: 15 env: BUNDLE_ONLY: development diff --git a/.github/workflows/lint-js.yml b/.github/workflows/lint-js.yml index f16e01d4d2e..4fa08283684 100644 --- a/.github/workflows/lint-js.yml +++ b/.github/workflows/lint-js.yml @@ -33,6 +33,7 @@ on: jobs: lint: runs-on: ubuntu-latest + timeout-minutes: 15 steps: - name: Clone repository diff --git a/.github/workflows/lint-ruby.yml b/.github/workflows/lint-ruby.yml index 8095c407244..ffecf17a765 100644 --- a/.github/workflows/lint-ruby.yml +++ b/.github/workflows/lint-ruby.yml @@ -27,6 +27,7 @@ on: jobs: lint: runs-on: ubuntu-latest + timeout-minutes: 15 env: BUNDLE_ONLY: development diff --git a/.github/workflows/test-js.yml b/.github/workflows/test-js.yml index d1b55a5e0b9..f9ba34e32b9 100644 --- a/.github/workflows/test-js.yml +++ b/.github/workflows/test-js.yml @@ -31,6 +31,7 @@ on: jobs: test: runs-on: ubuntu-latest + timeout-minutes: 15 steps: - name: Clone repository diff --git a/.github/workflows/test-migrations.yml b/.github/workflows/test-migrations.yml index f33bf981cc4..52fefbe053e 100644 --- a/.github/workflows/test-migrations.yml +++ b/.github/workflows/test-migrations.yml @@ -25,6 +25,7 @@ on: jobs: test: runs-on: ubuntu-latest + timeout-minutes: 15 strategy: fail-fast: false diff --git a/.github/workflows/test-ruby.yml b/.github/workflows/test-ruby.yml index ac95c708ddf..e4c6c1aa916 100644 --- a/.github/workflows/test-ruby.yml +++ b/.github/workflows/test-ruby.yml @@ -19,6 +19,7 @@ concurrency: jobs: build: runs-on: ubuntu-latest + timeout-minutes: 15 strategy: fail-fast: true @@ -75,6 +76,7 @@ jobs: test: runs-on: ubuntu-latest + timeout-minutes: 30 needs: - build @@ -176,6 +178,7 @@ jobs: test-e2e: name: End to End testing runs-on: ubuntu-latest + timeout-minutes: 15 needs: - build @@ -279,6 +282,7 @@ jobs: test-search: name: Elastic Search integration testing runs-on: ubuntu-latest + timeout-minutes: 15 needs: - build From fe4613ba325f0dd07176b6a7519a4e36d0f59a54 Mon Sep 17 00:00:00 2001 From: diondiondion Date: Thu, 4 Jun 2026 16:28:51 +0200 Subject: [PATCH 025/130] Display collection in search results when searched by URL (#39289) --- app/javascript/mastodon/actions/search.ts | 19 +++++++++-- .../mastodon/features/search/index.tsx | 32 ++++++++++++++++++- app/javascript/mastodon/locales/en.json | 1 + app/javascript/mastodon/models/search.ts | 7 ++-- app/javascript/mastodon/reducers/search.ts | 3 ++ .../mastodon/reducers/slices/collections.ts | 13 +++++++- 6 files changed, 69 insertions(+), 6 deletions(-) diff --git a/app/javascript/mastodon/actions/search.ts b/app/javascript/mastodon/actions/search.ts index 4f21a53b4d8..4b97682a749 100644 --- a/app/javascript/mastodon/actions/search.ts +++ b/app/javascript/mastodon/actions/search.ts @@ -12,6 +12,11 @@ import { createAppAsyncThunk, } from 'mastodon/store/typed_functions'; +import { + importAccountsForPreviewCard, + importFetchedCollections, +} from '../reducers/slices/collections'; + import { fetchRelationships } from './accounts'; import { importFetchedAccounts, importFetchedStatuses } from './importer'; @@ -29,7 +34,7 @@ export const submitSearch = createDataLoadingThunk( limit: 11, }); }, - (data, { dispatch }) => { + async (data, { dispatch }) => { if (data.accounts.length > 0) { dispatch(importFetchedAccounts(data.accounts)); dispatch(fetchRelationships(data.accounts.map((account) => account.id))); @@ -39,6 +44,11 @@ export const submitSearch = createDataLoadingThunk( dispatch(importFetchedStatuses(data.statuses)); } + if (data.collections.length > 0) { + dispatch(importFetchedCollections(data.collections)); + await importAccountsForPreviewCard(data.collections, dispatch); + } + return data; }, { @@ -60,7 +70,7 @@ export const expandSearch = createDataLoadingThunk( offset, }); }, - (data, { dispatch }) => { + async (data, { dispatch }) => { if (data.accounts.length > 0) { dispatch(importFetchedAccounts(data.accounts)); dispatch(fetchRelationships(data.accounts.map((account) => account.id))); @@ -70,6 +80,11 @@ export const expandSearch = createDataLoadingThunk( dispatch(importFetchedStatuses(data.statuses)); } + if (data.collections.length > 0) { + dispatch(importFetchedCollections(data.collections)); + await importAccountsForPreviewCard(data.collections, dispatch); + } + return data; }, { diff --git a/app/javascript/mastodon/features/search/index.tsx b/app/javascript/mastodon/features/search/index.tsx index 724d9c16d61..8ff5c9016a4 100644 --- a/app/javascript/mastodon/features/search/index.tsx +++ b/app/javascript/mastodon/features/search/index.tsx @@ -4,6 +4,7 @@ import { useIntl, defineMessages, FormattedMessage } from 'react-intl'; import { Helmet } from '@unhead/react/helmet'; +import CollectionsIcon from '@/material-icons/400-24px/category.svg?react'; import FindInPageIcon from '@/material-icons/400-24px/find_in_page.svg?react'; import PeopleIcon from '@/material-icons/400-24px/group.svg?react'; import SearchIcon from '@/material-icons/400-24px/search.svg?react'; @@ -23,6 +24,8 @@ import { useSearchParam } from 'mastodon/hooks/useSearchParam'; import type { Hashtag as HashtagType } from 'mastodon/models/tags'; import { useAppDispatch, useAppSelector } from 'mastodon/store'; +import { CollectionListItem } from '../collections/components/collection_list_item'; + import { SearchSection } from './components/search_section'; const messages = defineMessages({ @@ -131,7 +134,8 @@ export const SearchResults: React.FC<{ multiColumn: boolean }> = ({ filteredResults = results.accounts.length + results.hashtags.length + - results.statuses.length > + results.statuses.length + + results.collections.length > 0 ? ( <> {results.accounts.length > 0 && ( @@ -154,6 +158,32 @@ export const SearchResults: React.FC<{ multiColumn: boolean }> = ({ )} + {results.collections.length > 0 && ( + + + + + } + > + {results.collections + .slice(0, INITIAL_DISPLAY) + .map((collection, index, array) => ( + + ))} + + )} + {results.hashtags.length > 0 && ( ({ accounts: serverJSON.accounts.map((account) => account.id), statuses: serverJSON.statuses.map((status) => status.id), hashtags: serverJSON.hashtags, + collections: serverJSON.collections, }); diff --git a/app/javascript/mastodon/reducers/search.ts b/app/javascript/mastodon/reducers/search.ts index c8229902442..7b9e1f6fcf7 100644 --- a/app/javascript/mastodon/reducers/search.ts +++ b/app/javascript/mastodon/reducers/search.ts @@ -49,6 +49,9 @@ export const searchReducer = createReducer(initialState, (builder) => { hashtags: state.results ? [...state.results.hashtags, ...results.hashtags] : results.hashtags, + collections: state.results + ? [...state.results.collections, ...results.collections] + : results.collections, }; state.loading = false; }); diff --git a/app/javascript/mastodon/reducers/slices/collections.ts b/app/javascript/mastodon/reducers/slices/collections.ts index 56cf907f789..41bda5aa953 100644 --- a/app/javascript/mastodon/reducers/slices/collections.ts +++ b/app/javascript/mastodon/reducers/slices/collections.ts @@ -121,6 +121,15 @@ const collectionSlice = createSlice({ const { field, value } = action.payload; state.editor[field] = value; }, + importFetchedCollections( + state, + action: PayloadAction, + ) { + const collections = action.payload; + collections.forEach((collection) => { + state.collections[collection.id] = collection; + }); + }, }, extraReducers(builder) { /** @@ -328,7 +337,7 @@ const collectionSlice = createSlice({ /** * Prefetch accounts whose avatars will be displayed in the collection list */ -async function importAccountsForPreviewCard( +export async function importAccountsForPreviewCard( collections: ApiCollectionJSON[], dispatch: AppDispatch, ) { @@ -419,6 +428,8 @@ export const collections = collectionSlice.reducer; export const collectionEditorActions = collectionSlice.actions; export const updateCollectionEditorField = collectionSlice.actions.updateEditorField; +export const importFetchedCollections = + collectionSlice.actions.importFetchedCollections; /** * Selectors From 3ccda276ac64353c741833e564012da2b548b573 Mon Sep 17 00:00:00 2001 From: Matt Jankowski Date: Thu, 4 Jun 2026 10:44:06 -0400 Subject: [PATCH 026/130] Update openid_connect to version 2.5.0 (#39288) --- Gemfile.lock | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/Gemfile.lock b/Gemfile.lock index 4630d77e233..4a05001044a 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -224,8 +224,6 @@ GEM elasticsearch-api (8.19.3) multi_json elasticsearch-dsl (0.1.10) - email_validator (2.2.4) - activemodel erb (6.0.4) erubi (1.13.1) et-orbi (1.4.0) @@ -491,10 +489,9 @@ GEM omniauth_openid_connect (0.8.0) omniauth (>= 1.9, < 3) openid_connect (~> 2.2) - openid_connect (2.3.1) + openid_connect (2.5.0) activemodel attr_required (>= 1.0.0) - email_validator faraday (~> 2.0) faraday-follow_redirects json-jwt (>= 1.16) From ada6e1339d0de19682ac25559c0eeab1754df6fd Mon Sep 17 00:00:00 2001 From: Matt Jankowski Date: Thu, 4 Jun 2026 10:45:14 -0400 Subject: [PATCH 027/130] Exercise more of `disputes/strikes/_card` partial (#39265) --- spec/system/disputes/strikes_spec.rb | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/spec/system/disputes/strikes_spec.rb b/spec/system/disputes/strikes_spec.rb index 5d026a61647..6118d983791 100644 --- a/spec/system/disputes/strikes_spec.rb +++ b/spec/system/disputes/strikes_spec.rb @@ -6,8 +6,11 @@ RSpec.describe 'Disputes Strikes' do before { sign_in(current_user) } describe 'viewing strike disputes' do + let!(:strike) { Fabricate(:account_warning, target_account: current_user.account, report:, status_ids: [status.id]) } let(:current_user) { Fabricate(:user) } - let!(:strike) { Fabricate(:account_warning, target_account: current_user.account) } + let(:report) { Fabricate :report, category: :violation, rule_ids: rules.map(&:id), target_account: current_user.account } + let(:rules) { Fabricate.times 2, :rule } + let(:status) { Fabricate :status, account: current_user.account, text: 'Offensive text' } it 'shows a list of strikes and details for each' do visit disputes_strikes_path @@ -18,6 +21,8 @@ RSpec.describe 'Disputes Strikes' do expect(page) .to have_title(strike_page_title) .and have_text(strike.text) + .and have_text(rules.last.text) + .and have_text(status.text) end def strike_page_title From daae64afabdcbd638381f65cdd0f0ff5b135dd86 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Thu, 4 Jun 2026 17:27:32 +0200 Subject: [PATCH 028/130] Update dependency chewy to v8.3.0 (#39201) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- Gemfile.lock | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/Gemfile.lock b/Gemfile.lock index 4a05001044a..7e422766214 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -159,7 +159,7 @@ GEM cbor (0.5.10.2) cgi (0.5.1) charlock_holmes (0.7.9) - chewy (8.0.1) + chewy (8.3.0) activesupport (>= 7.2) elasticsearch (>= 8.14, < 9.0) elasticsearch-dsl @@ -214,7 +214,7 @@ GEM dotenv (3.2.0) drb (2.2.3) dry-cli (1.4.1) - elastic-transport (8.5.1) + elastic-transport (8.5.2) faraday (< 3) multi_json elasticsearch (8.19.3) @@ -241,7 +241,7 @@ GEM faraday (>= 1, < 3) faraday-httpclient (2.0.2) httpclient (>= 2.2) - faraday-net_http (3.4.3) + faraday-net_http (3.4.4) net-http (~> 0.5) fast_blank (1.0.1) fastimage (2.4.1) @@ -352,7 +352,7 @@ GEM azure-blob (~> 0.5.2) hashie (~> 5.0) jmespath (1.6.2) - json (2.19.7) + json (2.19.8) json-canonicalization (1.0.0) json-jwt (1.17.0) activesupport (>= 4.2) @@ -451,7 +451,7 @@ GEM drb (~> 2.0) prism (~> 1.5) msgpack (1.8.0) - multi_json (1.20.1) + multi_json (1.21.1) mutex_m (0.3.0) net-http (0.9.1) uri (>= 0.11.1) From 4957a4fb5034e8360441d7d86d5c18de8b2c93ff Mon Sep 17 00:00:00 2001 From: Matt Jankowski Date: Fri, 5 Jun 2026 03:54:34 -0400 Subject: [PATCH 029/130] Exercise ip block comment path in admin area (#39292) --- spec/system/admin/ip_blocks_spec.rb | 2 ++ 1 file changed, 2 insertions(+) diff --git a/spec/system/admin/ip_blocks_spec.rb b/spec/system/admin/ip_blocks_spec.rb index 3f99ec00504..34dfff7c521 100644 --- a/spec/system/admin/ip_blocks_spec.rb +++ b/spec/system/admin/ip_blocks_spec.rb @@ -26,10 +26,12 @@ RSpec.describe 'Admin::IpBlocks' do # Valid with IP fill_in 'ip_block_ip', with: '192.168.1.1' + fill_in 'ip_block_comment', with: 'Block explanation' expect { submit_form } .to change(IpBlock, :count).by(1) expect(page) .to have_text(I18n.t('admin.ip_blocks.created_msg')) + .and have_text('Block explanation') end def submit_form From 62bcdc41fc113af0111307b0a232789748c839fa Mon Sep 17 00:00:00 2001 From: Claire Date: Fri, 5 Jun 2026 09:54:55 +0200 Subject: [PATCH 030/130] Allow `authorized_interactions` endpoint to handle Collections (#39287) --- app/controllers/authorize_interactions_controller.rb | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/app/controllers/authorize_interactions_controller.rb b/app/controllers/authorize_interactions_controller.rb index 03cad3e3175..a1adf0e4931 100644 --- a/app/controllers/authorize_interactions_controller.rb +++ b/app/controllers/authorize_interactions_controller.rb @@ -7,10 +7,13 @@ class AuthorizeInteractionsController < ApplicationController before_action :set_resource def show - if @resource.is_a?(Account) + case @resource + when Account redirect_to web_url("@#{@resource.pretty_acct}") - elsif @resource.is_a?(Status) + when Status redirect_to web_url("@#{@resource.account.pretty_acct}/#{@resource.id}") + when Collection + redirect_to web_url("collections/#{resource.id}") else not_found end From 8c80fc612a7a9c2385fae4a83f1085f713e003a8 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Fri, 5 Jun 2026 10:29:12 +0200 Subject: [PATCH 031/130] New Crowdin Translations (automated) (#39295) Co-authored-by: GitHub Actions --- app/javascript/mastodon/locales/af.json | 1 - app/javascript/mastodon/locales/an.json | 1 - app/javascript/mastodon/locales/ar.json | 1 - app/javascript/mastodon/locales/ast.json | 1 - app/javascript/mastodon/locales/az.json | 43 ++++++- app/javascript/mastodon/locales/be.json | 10 +- app/javascript/mastodon/locales/bg.json | 1 - app/javascript/mastodon/locales/bn.json | 1 - app/javascript/mastodon/locales/br.json | 1 - app/javascript/mastodon/locales/ca.json | 1 - app/javascript/mastodon/locales/ckb.json | 1 - app/javascript/mastodon/locales/cs.json | 1 - app/javascript/mastodon/locales/cy.json | 1 - app/javascript/mastodon/locales/da.json | 10 +- app/javascript/mastodon/locales/de.json | 10 +- app/javascript/mastodon/locales/el.json | 10 +- app/javascript/mastodon/locales/en-GB.json | 1 - app/javascript/mastodon/locales/eo.json | 1 - app/javascript/mastodon/locales/es-AR.json | 10 +- app/javascript/mastodon/locales/es-MX.json | 10 +- app/javascript/mastodon/locales/es.json | 10 +- app/javascript/mastodon/locales/et.json | 1 - app/javascript/mastodon/locales/eu.json | 1 - app/javascript/mastodon/locales/fa.json | 1 - app/javascript/mastodon/locales/fi.json | 10 +- app/javascript/mastodon/locales/fil.json | 1 - app/javascript/mastodon/locales/fo.json | 1 - app/javascript/mastodon/locales/fr-CA.json | 20 +++- app/javascript/mastodon/locales/fr.json | 20 +++- app/javascript/mastodon/locales/fy.json | 1 - app/javascript/mastodon/locales/ga.json | 10 +- app/javascript/mastodon/locales/gd.json | 1 - app/javascript/mastodon/locales/gl.json | 10 +- app/javascript/mastodon/locales/he.json | 1 - app/javascript/mastodon/locales/hi.json | 1 - app/javascript/mastodon/locales/hr.json | 1 - app/javascript/mastodon/locales/hu.json | 1 - app/javascript/mastodon/locales/hy.json | 1 - app/javascript/mastodon/locales/ia.json | 1 - app/javascript/mastodon/locales/id.json | 1 - app/javascript/mastodon/locales/ie.json | 1 - app/javascript/mastodon/locales/io.json | 1 - app/javascript/mastodon/locales/is.json | 2 +- app/javascript/mastodon/locales/it.json | 2 +- app/javascript/mastodon/locales/ja.json | 1 - app/javascript/mastodon/locales/kab.json | 1 - app/javascript/mastodon/locales/kk.json | 1 - app/javascript/mastodon/locales/kn.json | 1 - app/javascript/mastodon/locales/ko.json | 1 - app/javascript/mastodon/locales/ku.json | 1 - app/javascript/mastodon/locales/la.json | 1 - app/javascript/mastodon/locales/lad.json | 1 - app/javascript/mastodon/locales/lt.json | 1 - app/javascript/mastodon/locales/lv.json | 1 - app/javascript/mastodon/locales/mk.json | 1 - app/javascript/mastodon/locales/mr.json | 1 - app/javascript/mastodon/locales/ms.json | 1 - app/javascript/mastodon/locales/my.json | 1 - app/javascript/mastodon/locales/nan-TW.json | 1 - app/javascript/mastodon/locales/ne.json | 1 - app/javascript/mastodon/locales/nl.json | 10 +- app/javascript/mastodon/locales/nn.json | 70 +++++++++++- app/javascript/mastodon/locales/no.json | 1 - app/javascript/mastodon/locales/oc.json | 1 - app/javascript/mastodon/locales/pa.json | 1 - app/javascript/mastodon/locales/pl.json | 26 ++++- app/javascript/mastodon/locales/pt-BR.json | 112 ++++++++++--------- app/javascript/mastodon/locales/pt-PT.json | 1 - app/javascript/mastodon/locales/ro.json | 1 - app/javascript/mastodon/locales/ru.json | 1 - app/javascript/mastodon/locales/ry.json | 1 - app/javascript/mastodon/locales/sa.json | 1 - app/javascript/mastodon/locales/sc.json | 1 - app/javascript/mastodon/locales/sco.json | 1 - app/javascript/mastodon/locales/si.json | 1 - app/javascript/mastodon/locales/sk.json | 1 - app/javascript/mastodon/locales/sl.json | 1 - app/javascript/mastodon/locales/sq.json | 10 +- app/javascript/mastodon/locales/sr-Latn.json | 1 - app/javascript/mastodon/locales/sr.json | 1 - app/javascript/mastodon/locales/sv.json | 2 +- app/javascript/mastodon/locales/szl.json | 1 - app/javascript/mastodon/locales/ta.json | 1 - app/javascript/mastodon/locales/tai.json | 1 - app/javascript/mastodon/locales/th.json | 1 - app/javascript/mastodon/locales/tok.json | 1 - app/javascript/mastodon/locales/tr.json | 2 +- app/javascript/mastodon/locales/tt.json | 1 - app/javascript/mastodon/locales/ug.json | 1 - app/javascript/mastodon/locales/uk.json | 1 - app/javascript/mastodon/locales/ur.json | 1 - app/javascript/mastodon/locales/uz.json | 1 - app/javascript/mastodon/locales/vi.json | 13 ++- app/javascript/mastodon/locales/zh-CN.json | 14 ++- app/javascript/mastodon/locales/zh-HK.json | 1 - app/javascript/mastodon/locales/zh-TW.json | 10 +- config/locales/doorkeeper.pl.yml | 2 + config/locales/nn.yml | 77 +++++++++++++ config/locales/pl.yml | 18 ++- config/locales/simple_form.pl.yml | 5 + config/locales/simple_form.zh-CN.yml | 2 +- config/locales/zh-CN.yml | 10 +- config/locales/zh-TW.yml | 6 +- 103 files changed, 475 insertions(+), 172 deletions(-) diff --git a/app/javascript/mastodon/locales/af.json b/app/javascript/mastodon/locales/af.json index ac05096895e..a9c7c23377b 100644 --- a/app/javascript/mastodon/locales/af.json +++ b/app/javascript/mastodon/locales/af.json @@ -2,7 +2,6 @@ "about.blocks": "Gemodereerde bedieners", "about.contact": "Kontak:", "about.default_locale": "Verstek", - "about.disclaimer": "Mastodon is gratis oopbronsagteware en ’n handelsmerk van Mastodon gGmbH.", "about.domain_blocks.no_reason_available": "Rede nie beskikbaar nie", "about.domain_blocks.preamble": "Mastodon generally allows you to view content from and interact with users from any other server in the fediverse. These are the exceptions that have been made on this particular server.", "about.domain_blocks.silenced.title": "Beperk", diff --git a/app/javascript/mastodon/locales/an.json b/app/javascript/mastodon/locales/an.json index 469403241b2..9cb076e2d9f 100644 --- a/app/javascript/mastodon/locales/an.json +++ b/app/javascript/mastodon/locales/an.json @@ -1,7 +1,6 @@ { "about.blocks": "Servidors moderaus", "about.contact": "Contacto:", - "about.disclaimer": "Mastodon ye software de codigo ubierto, y una marca comercial de Mastodon gGmbH.", "about.domain_blocks.no_reason_available": "Razón no disponible", "about.domain_blocks.preamble": "Mastodon normalment te permite veyer lo conteniu y interactuar con os usuarios de qualsequier atro servidor en o fediverso. Estas son las excepcions que s'han feito en este servidor en particular.", "about.domain_blocks.silenced.explanation": "Normalment no veyerás perfils y conteniu d'este servidor, de no estar que lo busques explicitament u sigas bella cuenta.", diff --git a/app/javascript/mastodon/locales/ar.json b/app/javascript/mastodon/locales/ar.json index 2148b1053ba..839ab07a37c 100644 --- a/app/javascript/mastodon/locales/ar.json +++ b/app/javascript/mastodon/locales/ar.json @@ -2,7 +2,6 @@ "about.blocks": "خوادم تحت الإشراف", "about.contact": "للاتصال:", "about.default_locale": "افتراضي", - "about.disclaimer": "ماستدون برنامج حر ومفتوح المصدر وعلامة تجارية لـ Mastodon GmbH.", "about.domain_blocks.no_reason_available": "السبب غير متوفر", "about.domain_blocks.preamble": "يتيح مَستُدون عمومًا لمستخدميه مطالعة المحتوى من المستخدمين من الخواديم الأخرى في الفدرالية والتفاعل معهم. وهذه هي الاستثناءات التي وضعت على هذا الخادوم.", "about.domain_blocks.silenced.explanation": "لن تظهر لك ملفات التعريف الشخصية والمحتوى من هذا الخادوم، إلا إن بحثت عنه عمدًا أو تابعته.", diff --git a/app/javascript/mastodon/locales/ast.json b/app/javascript/mastodon/locales/ast.json index 8ec910816f3..877617ca8a2 100644 --- a/app/javascript/mastodon/locales/ast.json +++ b/app/javascript/mastodon/locales/ast.json @@ -1,7 +1,6 @@ { "about.blocks": "Sirvidores moderaos", "about.contact": "Contautu:", - "about.disclaimer": "Mastodon ye software gratuito y de códigu llibre, y una marca rexistrada de Mastodon gGmbH.", "about.domain_blocks.no_reason_available": "El motivu nun ta disponible", "about.domain_blocks.preamble": "Polo xeneral, Mastodon permítete ver el conteníu ya interactuar colos perfiles d'otros sirvidores nel fediversu. Estes son les esceiciones que se ficieron nesti sirvidor.", "about.domain_blocks.silenced.explanation": "Polo xeneral, nun ves los perfiles y el conteníu d'esti sirvidor sacante que los busques o decidas siguilos.", diff --git a/app/javascript/mastodon/locales/az.json b/app/javascript/mastodon/locales/az.json index fb1969bbcdf..4be0facc60e 100644 --- a/app/javascript/mastodon/locales/az.json +++ b/app/javascript/mastodon/locales/az.json @@ -2,7 +2,7 @@ "about.blocks": "Moderasiya edilmiş serverlər", "about.contact": "Əlaqə:", "about.default_locale": "İlkin", - "about.disclaimer": "Mastodon ödənişsiz, açıq-mənbəli yazılımdır və Mastodon gGmbH-nin əmtəə nişanıdır.", + "about.disclaimer": "Mastodon ödənişsiz, açıq-mənbəli yazılımdır və Mastodon GmbH-nin əmtəə nişanıdır.", "about.domain_blocks.no_reason_available": "Səbəb mövcud deyil", "about.domain_blocks.preamble": "Mastodon, adətən fediverse-dəki hər hansısa bir serverdən məzmuna baxmağınıza və istifadəçilərlə qarşılıqlı əlaqədə olmağınıza imkanı verir. Bunlar, bu serverdə edilmiş istisnalardır.", "about.domain_blocks.silenced.explanation": "Siz bu serverdəki profilləri və məzmunu xüsusi olaraq axtarmasanız və ya izləməsəniz ümumiyyətlə görməyəcəksiniz.", @@ -86,6 +86,7 @@ "account.locked_info": "Bu hesabın məxfilik statusu kilidlənib. Sahibi, onu kimin izləyə biləcəyini manual olaraq incələyir.", "account.media": "Media", "account.mention": "@{name} istifadəçisini teq et", + "account.menu.add_to_collection": "Kolleksiyaya əlavə et…", "account.menu.add_to_list": "Siyahıya əlavə et…", "account.menu.block": "Hesabı əngəllə", "account.menu.block_domain": "{domain} - əngəllə", @@ -102,14 +103,26 @@ "account.menu.share": "Paylaş…", "account.menu.show_reblogs": "Zaman xəttində təkrar paylaşmaları göstər", "account.menu.unblock": "Hesabın əngəlini götür", + "account.menu.unblock_domain": "{domain} - əngəli götür", + "account.menu.unmute": "Hesabın səsini aç", "account.moved_to": "{name} onun yeni hesabının artıq bu olduğunu bildirdi:", "account.mute": "@{name} istifadəçisini susdur", "account.mute_notifications_short": "Bildirişləri səssizləşdir", "account.mute_short": "Səssizləşdir", "account.muted": "Səssizləşdirilib", "account.mutual": "Bir-birinizi izləyirsiniz", + "account.name.help.domain": "{domain}, istifadəçinin profil və göndərişlərinin yerləşdiyi serverdir.", + "account.name.help.domain_self": "{domain}, profil və göndərişlərinizin yerləşdiyi serverdir.", + "account.name.help.footer": "Necə ki, fərqli e-poçt provayderlərini istifadə edən insanlara e-poçt göndərə bilirsiniz, eynilə digər Mastodon serverlərindəki insanlarla və digər Fediverse tətbiqlərindəki hər kəslə qarşılıqlı əlaqə qura bilərsiniz.", + "account.name.help.username": "{username} bu hesabın öz serverindəki istifadəçi adıdır. Başqa bir serverdəki başqa biri də eyni istifadəçi adına sahib ola bilər.", + "account.name.help.username_self": "{username} sizin bu serverdəki istifadəçi adınızdır. Başqa bir serverdəki başqa biri də eyni istifadəçi adına sahib ola bilər.", + "account.name_info": "Bu nə deməkdir?", "account.no_bio": "Təsvir göstərilməyib.", + "account.node_modal.error_unknown": "Not saxlanıla bilmədi", + "account.node_modal.save": "Saxla", + "account.note.edit_button": "Düzəliş", "account.open_original_page": "Orijinal səhifəni aç", + "account.pending": "Gözləmədə", "account.posts": "Paylaşım", "account.remove_from_followers": "{name} - izləyicilərdən çıxart", "account.report": "@{name} istifadəçisini şikayət et", @@ -117,6 +130,8 @@ "account.share": "@{name} profilini paylaş", "account.show_reblogs": "@{name} - təkrar paylaşımlarını göstər", "account.statuses_counter": "{count, plural, one {{counter} paylaşım} other {{counter} paylaşım}}", + "account.timeline.pinned": "Sancıldı", + "account.timeline.pinned.view_all": "Bütün sancılmış göndərişlərə bax", "account.unblock": "@{name} blokunu aç", "account.unblock_domain": "{domain} domeninin blokunu aç", "account.unblock_domain_short": "Əngəldən çıxart", @@ -126,7 +141,33 @@ "account.unmute": "@{name} səssizləşdirmədən çıxart", "account.unmute_notifications_short": "Bildirişlərin səsini aç", "account.unmute_short": "Səssizləşdirmədən çıxart", + "account_edit.advanced_settings.bot_label": "Avtomatlaşdırılmış hesab", "account_edit.advanced_settings.title": "Qabaqcıl ayarlar", + "account_edit.bio.add_label": "Bio əlavə et", + "account_edit.bio.edit_label": "Bioya düzəliş", + "account_edit.bio.placeholder": "Başqalarının sizi tanımasına kömək edəcək qısa bir açıqlama əlavə edin.", + "account_edit.bio.title": "Bio", + "account_edit.bio_modal.add_title": "Bio əlavə et", + "account_edit.bio_modal.edit_title": "Bioya düzəliş", + "account_edit.column_button": "Hazırdır", + "account_edit.column_title": "Profilə düzəliş", + "account_edit.custom_fields.add_label": "Xana əlavə et", + "account_edit.custom_fields.edit_label": "Xanaya düzəliş", + "account_edit.custom_fields.placeholder": "Müraciət formalarını, xarici keçidləri və ya paylaşmaq istədiyiniz digər məlumatları əlavə edin.", + "account_edit.custom_fields.reorder_button": "Xanaları təkrar sırala", + "account_edit.custom_fields.tip_content": "Sahibi olduğunuz veb saytlara keçidləri doğrulayaraq Mastodon hesabınıza asanlıqla etibarlılıq qazandıra bilərsiniz.", + "account_edit.custom_fields.tip_title": "İpucu: Doğrulanmış keçidləri əlavə etmə", + "account_edit.custom_fields.title": "Özəl xanalar", + "account_edit.custom_fields.verified_hint": "Doğrulanmış keçid necə əlavə olunur?", + "account_edit.display_name.add_label": "Ekran adı əlavə et", + "account_edit.display_name.edit_label": "Ekran adına düzəliş", + "account_edit.display_name.placeholder": "Ekran adınız, profilinizdə və zaman xəttində adınızın görünmə formasıdır.", + "account_edit.display_name.title": "Ekran adı", + "account_edit.featured_hashtags.edit_label": "Mövzu etiketi əlavə et", + "account_edit.featured_hashtags.placeholder": "Başqalarının sevimli mövzularınızı tanımasına və onlara cəld erişməsinə kömək edin.", + "account_edit.featured_hashtags.title": "Seçilmiş mövzu etiketləri", + "account_edit.field_actions.delete": "Xananı sil", + "account_edit.field_actions.edit": "Xanaya düzəliş", "account_edit.field_delete_modal.title": "Özəl xananı sil?", "account_edit.field_edit_modal.add_title": "Özəl xana əlavə et", "account_edit.field_edit_modal.discard_confirm": "İmtina", diff --git a/app/javascript/mastodon/locales/be.json b/app/javascript/mastodon/locales/be.json index f0fd8edfbfa..06c7f961aea 100644 --- a/app/javascript/mastodon/locales/be.json +++ b/app/javascript/mastodon/locales/be.json @@ -2,7 +2,7 @@ "about.blocks": "Мадэраваныя серверы", "about.contact": "Кантакт:", "about.default_locale": "Прадвызначаная", - "about.disclaimer": "Mastodon - свабоднае праграмнае забеспячэнне, з адкрытым зыходным кодам, і гандлёвай маркай Mastodon gGmbH.", + "about.disclaimer": "Mastodon - свабоднае праграмнае забеспячэнне, з адкрытым зыходным кодам, і гандлёвай маркай Mastodon GmbH.", "about.domain_blocks.no_reason_available": "Прычына недаступная", "about.domain_blocks.preamble": "Mastodon, у асноўным, дазваляе вам праглядаць кантэнт і ўзаемадзейнічаць з карыстальнікамі з іншых сервераў у федэсвету. Гэтыя выключэнні былі зроблены дакладна на гэтым серверы.", "about.domain_blocks.silenced.explanation": "Вы не будзеце бачыць профілі і змесціва гэтага серверу, калі не шукаеце іх мэтанакіравана ці не падпісаны на карыстальнікаў адтуль.", @@ -646,6 +646,7 @@ "empty_column.account_unavailable": "Профіль недаступны", "empty_column.blocks": "Вы яшчэ нікога не заблакіравалі.", "empty_column.bookmarked_statuses": "У Вашых закладках яшчэ няма допісаў. Калі Вы дадасце закладку, яна з’явіцца тут.", + "empty_column.collections": "{acct} пакуль не стварыў(-ла) аніводнай калекцыі.", "empty_column.collections.featured_in": "Вас пакуль не дадалі ў ніякія калекцыі.", "empty_column.collections.featured_in_undiscoverable": "Каб людзі маглі дадаваць Вас у калекцыі, Вам трэба даць ім дазвол знаходзіць Вас у Налады > Прыватнасць і пошук", "empty_column.community": "Мясцовая стужка пустая. Напішыце нешта публічнае, каб разварушыць справу!", @@ -819,6 +820,12 @@ "keyboard_shortcuts.heading": "Спалучэнні клавіш", "keyboard_shortcuts.home": "Адкрыць хатнюю храналагічную стужку", "keyboard_shortcuts.hotkey": "Спалучэнне клавіш", + "keyboard_shortcuts.keys.alt": "Alt", + "keyboard_shortcuts.keys.backspace": "Backspace", + "keyboard_shortcuts.keys.enter": "Enter", + "keyboard_shortcuts.keys.esc": "Esc", + "keyboard_shortcuts.keys.page_down": "Page Down", + "keyboard_shortcuts.keys.page_up": "Page Up", "keyboard_shortcuts.legend": "Паказаць легенду", "keyboard_shortcuts.load_more": "Навесці на кнопку \"Загрузіць болей\"", "keyboard_shortcuts.local": "Адкрыць хатнюю храналагічную стужку", @@ -1192,6 +1199,7 @@ "search_popout.user": "карыстальнік", "search_results.accounts": "Профілі", "search_results.all": "Усё", + "search_results.collections": "Калекцыі", "search_results.hashtags": "Хэштэгі", "search_results.no_results": "Няма вынікаў.", "search_results.no_search_yet": "Паспрабуйце пашукаць допісы, профілі або хэштэгі.", diff --git a/app/javascript/mastodon/locales/bg.json b/app/javascript/mastodon/locales/bg.json index de7d0ab6239..d7e48086bcc 100644 --- a/app/javascript/mastodon/locales/bg.json +++ b/app/javascript/mastodon/locales/bg.json @@ -2,7 +2,6 @@ "about.blocks": "Модерирани сървъри", "about.contact": "За контакти:", "about.default_locale": "По подразбиране", - "about.disclaimer": "Mastodon е безплатен софтуер с отворен изходен код и търговска марка на Mastodon gGmbH.", "about.domain_blocks.no_reason_available": "Няма налична причина", "about.domain_blocks.preamble": "Mastodon обикновено позволява да разглеждате съдържание и да взаимодействате с други потребители от всякакви сървъри във Федивселената. Има изключения, направени конкретно за този сървър.", "about.domain_blocks.silenced.explanation": "Обикновено няма да виждате профили и съдържание, освен ако изрично не го потърсите или се включете в него, следвайки го.", diff --git a/app/javascript/mastodon/locales/bn.json b/app/javascript/mastodon/locales/bn.json index f9cbc3f1ca8..0222f9cf16d 100644 --- a/app/javascript/mastodon/locales/bn.json +++ b/app/javascript/mastodon/locales/bn.json @@ -1,7 +1,6 @@ { "about.blocks": "অনুপলব্ধ সার্ভার", "about.contact": "যোগাযোগ:", - "about.disclaimer": "ম্যাস্টোডন একটি ফ্রি, ওপেন সোর্স সফটওয়্যার এবং ম্যাস্টোডন জিজিএমবিএইচ এর একটি ট্রেডমার্ক।", "about.domain_blocks.no_reason_available": "কারণ দর্শানো যাচ্ছে না", "about.domain_blocks.preamble": "ম্যাস্টোডন সাধারণত আপনাকে ফেদিভার্স এ অন্য কোনও সার্ভারের ব্যবহারকারীদের থেকে সামগ্রী দেখতে এবং তাদের সাথে আলাপচারিতা করার সুযোগ দেয়। এই ব্যতিক্রম যে এই বিশেষ সার্ভারে তৈরি করা হয়েছে।", "about.domain_blocks.silenced.explanation": "আপনি সাধারণত এই সার্ভার থেকে প্রোফাইল এবং বিষয়বস্তু দেখতে পারবেন না, যদি না আপনি নিজে থেকেই এটাকে ফলো না করেন.", diff --git a/app/javascript/mastodon/locales/br.json b/app/javascript/mastodon/locales/br.json index bdeba762fe5..a852e98cea8 100644 --- a/app/javascript/mastodon/locales/br.json +++ b/app/javascript/mastodon/locales/br.json @@ -2,7 +2,6 @@ "about.blocks": "Servijerioù evezhiet", "about.contact": "Darempred :", "about.default_locale": "Dre ziouer", - "about.disclaimer": "Mastodon zo ur meziant frank, open-source hag ur merk marilhet eus Mastodon gGmbH.", "about.domain_blocks.no_reason_available": "Abeg dihegerz", "about.domain_blocks.preamble": "Gant Mastodon e c'hellit gwelet danvez hag eskemm gant implijerien·ezed eus forzh peseurt servijer er fedibed peurliesañ. Setu an nemedennoù a zo bet graet evit ar servijer-mañ e-unan.", "about.domain_blocks.silenced.explanation": "Ne vo ket gwelet profiloù eus ar servijer-mañ ganeoc'h peurliesañ, nemet ma vefec'h o klask war o lec'h pe choazfec'h o heuliañ.", diff --git a/app/javascript/mastodon/locales/ca.json b/app/javascript/mastodon/locales/ca.json index 767f4e5c43a..f8a00143b4f 100644 --- a/app/javascript/mastodon/locales/ca.json +++ b/app/javascript/mastodon/locales/ca.json @@ -2,7 +2,6 @@ "about.blocks": "Servidors moderats", "about.contact": "Contacte:", "about.default_locale": "Per defecte", - "about.disclaimer": "Mastodon és programari lliure de codi obert i una marca comercial de Mastodon gGmbH.", "about.domain_blocks.no_reason_available": "No es disposa del motiu", "about.domain_blocks.preamble": "En general, Mastodon permet de veure el contingut i interaccionar amb els usuaris de qualsevol altre servidor del fedivers. Aquestes són les excepcions d'aquest servidor en particular.", "about.domain_blocks.silenced.explanation": "Generalment no veuràs perfils ni contingut d'aquest servidor, a menys que el cerquis explícitament o optis per seguir-lo.", diff --git a/app/javascript/mastodon/locales/ckb.json b/app/javascript/mastodon/locales/ckb.json index 564e1d159bc..6dca6917b22 100644 --- a/app/javascript/mastodon/locales/ckb.json +++ b/app/javascript/mastodon/locales/ckb.json @@ -1,7 +1,6 @@ { "about.blocks": "ڕاژە سەرپەرشتیکراو", "about.contact": "پەیوەندی کردن:", - "about.disclaimer": "ماستودۆن بە خۆڕایە، پرۆگرامێکی سەرچاوە کراوەیە، وە نیشانە بازرگانیەکەی ماستودۆن (gGmbH)ە", "about.domain_blocks.no_reason_available": "هۆکار بەردەست نیە", "about.domain_blocks.preamble": "ماستۆدۆن بە گشتی ڕێگەت پێدەدات بە پیشاندانی ناوەڕۆکەکان و کارلێک کردن لەگەڵ بەکارهێنەران لە هەر ڕاژەیەکی تر بە گشتی. ئەمانە ئەو بەدەرکردنانەن کە کراون لەسەر ئەم ڕاژە تایبەتە.", "about.domain_blocks.silenced.explanation": "بە گشتی ناتوانی زانیاریە تایبەتەکان و ناوەڕۆکی ئەم ڕاژەیە ببینی، مەگەر بە ڕوونی بەدوایدا بگەڕێیت یان هەڵیبژێریت بۆ شوێنکەوتنی.", diff --git a/app/javascript/mastodon/locales/cs.json b/app/javascript/mastodon/locales/cs.json index 271329ce0ac..c2515f037b6 100644 --- a/app/javascript/mastodon/locales/cs.json +++ b/app/javascript/mastodon/locales/cs.json @@ -2,7 +2,6 @@ "about.blocks": "Moderované servery", "about.contact": "Kontakt:", "about.default_locale": "Výchozí", - "about.disclaimer": "Mastodon je svobodný software s otevřeným zdrojovým kódem a ochranná známka společnosti Mastodon gGmbH.", "about.domain_blocks.no_reason_available": "Důvod není k dispozici", "about.domain_blocks.preamble": "Mastodon umožňuje prohlížet obsah a komunikovat s uživateli jakéhokoliv serveru ve fediversu. Pro tento konkrétní server se vztahují následující výjimky.", "about.domain_blocks.silenced.explanation": "Uživatele a obsah tohoto serveru neuvidíte, pokud je nebudete výslovně hledat nebo je nezačnete sledovat.", diff --git a/app/javascript/mastodon/locales/cy.json b/app/javascript/mastodon/locales/cy.json index f717a74a822..fdd35c3a95e 100644 --- a/app/javascript/mastodon/locales/cy.json +++ b/app/javascript/mastodon/locales/cy.json @@ -2,7 +2,6 @@ "about.blocks": "Gweinyddion wedi'u cymedroli", "about.contact": "Cysylltiad:", "about.default_locale": "Rhagosodedig", - "about.disclaimer": "Mae Mastodon yn feddalwedd cod agored rhydd ac o dan hawlfraint Mastodon gGmbH.", "about.domain_blocks.no_reason_available": "Dyw'r rheswm ddim ar gael", "about.domain_blocks.preamble": "Fel rheol, mae Mastodon yn caniatáu i chi weld cynnwys gan unrhyw weinyddwr arall yn y ffedysawd a rhyngweithio â hi. Dyma'r eithriadau a wnaed ar y gweinydd penodol hwn.", "about.domain_blocks.silenced.explanation": "Fel rheol, fyddwch chi ddim yn gweld proffiliau a chynnwys o'r gweinydd hwn, oni bai eich bod yn chwilio'n benodol amdano neu yn ymuno drwy ei ddilyn.", diff --git a/app/javascript/mastodon/locales/da.json b/app/javascript/mastodon/locales/da.json index a7cc1c96318..96e2fcb5df6 100644 --- a/app/javascript/mastodon/locales/da.json +++ b/app/javascript/mastodon/locales/da.json @@ -2,7 +2,7 @@ "about.blocks": "Modererede servere", "about.contact": "Kontakt:", "about.default_locale": "Standard", - "about.disclaimer": "Mastodon er gratis, open-source software og et varemærke tilhørende Mastodon gGmbH.", + "about.disclaimer": "Mastodon er gratis, open-source software og et varemærke tilhørende Mastodon GmbH.", "about.domain_blocks.no_reason_available": "Begrundelse ikke tilgængelig", "about.domain_blocks.preamble": "Mastodon tillader generelt, at du ser indhold og interagere med brugere fra enhver anden server i fediverset. Disse er undtagelserne, som er implementeret på netop denne server.", "about.domain_blocks.silenced.explanation": "Du vil generelt ikke se profiler og indhold fra denne server, medmindre du udtrykkeligt slår den op eller vælger den ved at følge.", @@ -646,6 +646,7 @@ "empty_column.account_unavailable": "Profil utilgængelig", "empty_column.blocks": "Du har ikke blokeret nogle brugere endnu.", "empty_column.bookmarked_statuses": "Du har ingen bogmærkede indlæg endnu. Når du bogmærker ét, vil det dukke op hér.", + "empty_column.collections": "{acct} har endnu ikke oprettet nogen samlinger.", "empty_column.collections.featured_in": "Du er ikke blevet tilføjet til nogen samlinger endnu.", "empty_column.collections.featured_in_undiscoverable": "For at andre kan føje dig til samlinger, skal du give tilladelse til at blive vist i opdagelsesfunktioner under Præferencer > Fortrolighed og rækkevidde", "empty_column.community": "Den lokale tidslinje er tom. Skriv noget offentligt for at sætte tingene i gang!", @@ -819,6 +820,12 @@ "keyboard_shortcuts.heading": "Tastaturgenveje", "keyboard_shortcuts.home": "Åbn hjem-tidslinje", "keyboard_shortcuts.hotkey": "Hurtigtast", + "keyboard_shortcuts.keys.alt": "Alt", + "keyboard_shortcuts.keys.backspace": "Backspace", + "keyboard_shortcuts.keys.enter": "Enter", + "keyboard_shortcuts.keys.esc": "Esc", + "keyboard_shortcuts.keys.page_down": "Side ned", + "keyboard_shortcuts.keys.page_up": "Side op", "keyboard_shortcuts.legend": "Vis dette symbol", "keyboard_shortcuts.load_more": "Fokusér knappen \"Indlæs flere\"", "keyboard_shortcuts.local": "Åbn lokal tidslinje", @@ -1192,6 +1199,7 @@ "search_popout.user": "bruger", "search_results.accounts": "Profiler", "search_results.all": "Alle", + "search_results.collections": "Samlinger", "search_results.hashtags": "Hashtags", "search_results.no_results": "Ingen resultater.", "search_results.no_search_yet": "Prøv at søge efter indlæg, profiler eller hashtags.", diff --git a/app/javascript/mastodon/locales/de.json b/app/javascript/mastodon/locales/de.json index 0e07f296d13..214f34ffa69 100644 --- a/app/javascript/mastodon/locales/de.json +++ b/app/javascript/mastodon/locales/de.json @@ -2,7 +2,7 @@ "about.blocks": "Eingeschränkte Server", "about.contact": "Kontakt:", "about.default_locale": "Standard", - "about.disclaimer": "Mastodon ist eine freie, quelloffene Software und eine Marke der Mastodon gGmbH.", + "about.disclaimer": "Mastodon ist eine freie, quelloffene Software und eine Marke der Mastodon GmbH.", "about.domain_blocks.no_reason_available": "Keinen Grund angegeben", "about.domain_blocks.preamble": "Mastodon erlaubt es dir grundsätzlich, alle Inhalte von allen Nutzer*innen auf allen Servern im Fediverse zu sehen und mit ihnen zu interagieren. Für diesen Server gibt es aber ein paar Ausnahmen.", "about.domain_blocks.silenced.explanation": "Standardmäßig werden von diesem Server keine Inhalte oder Profile angezeigt. Du kannst die Profile und Inhalte aber dennoch sehen, wenn du explizit nach diesen suchst oder diesen folgst.", @@ -646,6 +646,7 @@ "empty_column.account_unavailable": "Profil nicht verfügbar", "empty_column.blocks": "Du hast bisher keine Profile blockiert.", "empty_column.bookmarked_statuses": "Du hast bisher keine Beiträge als Lesezeichen abgelegt. Sobald du einen Beitrag als Lesezeichen speicherst, wird er hier erscheinen.", + "empty_column.collections": "{acct} hat noch keine Sammlungen erstellt.", "empty_column.collections.featured_in": "Du wurdest noch keiner Sammlung hinzugefügt.", "empty_column.collections.featured_in_undiscoverable": "Damit du zu Sammlungen hinzugefügt werden kannst, muss „Mich beim Entdecken berücksichtigen“ unter Einstellungen > Datenschutz und Reichweite aktiviert werden", "empty_column.community": "Die lokale Timeline ist leer. Schreibe einen öffentlichen Beitrag, um den Stein ins Rollen zu bringen!", @@ -819,6 +820,12 @@ "keyboard_shortcuts.heading": "Tastenkürzel", "keyboard_shortcuts.home": "Startseite öffnen", "keyboard_shortcuts.hotkey": "Tastenkürzel", + "keyboard_shortcuts.keys.alt": "Alt", + "keyboard_shortcuts.keys.backspace": "Backspace", + "keyboard_shortcuts.keys.enter": "Eingabetaste", + "keyboard_shortcuts.keys.esc": "Esc", + "keyboard_shortcuts.keys.page_down": "Bild ab", + "keyboard_shortcuts.keys.page_up": "Bild auf", "keyboard_shortcuts.legend": "Tastenkürzel anzeigen (diese Seite)", "keyboard_shortcuts.load_more": "Schaltfläche „Mehr laden“ fokussieren", "keyboard_shortcuts.local": "Lokale Timeline öffnen", @@ -1192,6 +1199,7 @@ "search_popout.user": "Profil", "search_results.accounts": "Profile", "search_results.all": "Alles", + "search_results.collections": "Sammlungen", "search_results.hashtags": "Hashtags", "search_results.no_results": "Keine Ergebnisse.", "search_results.no_search_yet": "Suche nach Beiträgen, Profilen oder Hashtags.", diff --git a/app/javascript/mastodon/locales/el.json b/app/javascript/mastodon/locales/el.json index 160315510a4..76ad93350f8 100644 --- a/app/javascript/mastodon/locales/el.json +++ b/app/javascript/mastodon/locales/el.json @@ -2,7 +2,7 @@ "about.blocks": "Συντονιζόμενοι διακομιστές", "about.contact": "Επικοινωνία:", "about.default_locale": "Προεπιλογή", - "about.disclaimer": "Το Mastodon είναι ελεύθερο λογισμικό ανοιχτού κώδικα και εμπορικό σήμα της Mastodon gGmbH.", + "about.disclaimer": "Το Mastodon είναι ελεύθερο λογισμικό ανοιχτού κώδικα και εμπορικό σήμα της Mastodon GmbH.", "about.domain_blocks.no_reason_available": "Αιτιολογία μη διαθέσιμη", "about.domain_blocks.preamble": "Σε γενικές γραμμές το Mastodon σου επιτρέπει να βλέπεις περιεχόμενο και να αλληλεπιδράς με χρήστες από οποιονδήποτε άλλο διακομιστή σε ένα διασυνδεδεμένο σύμπαν διακομιστών (fediverse). Ακολουθούν οι εξαιρέσεις που ισχύουν για τον συγκεκριμένο διακομιστή.", "about.domain_blocks.silenced.explanation": "Συνήθως δε θα βλέπεις προφίλ και περιεχόμενο απ' αυτόν τον διακομιστή, εκτός αν κάνεις συγκεκριμένη αναζήτηση ή επιλέξεις να τον ακολουθήσεις.", @@ -646,6 +646,7 @@ "empty_column.account_unavailable": "Μη διαθέσιμο προφίλ", "empty_column.blocks": "Δεν έχεις αποκλείσει κανέναν χρήστη ακόμη.", "empty_column.bookmarked_statuses": "Δεν έχεις καμία ανάρτηση με σελιδοδείκτη ακόμη. Μόλις βάλεις κάποιον, θα εμφανιστεί εδώ.", + "empty_column.collections": "Ο χρήστης {acct} δεν έχει δημιουργήσει ακόμη καμία συλλογή.", "empty_column.collections.featured_in": "Δεν έχετε προστεθεί ακόμη σε καμία συλλογή.", "empty_column.collections.featured_in_undiscoverable": "Προκειμένου ο κόσμος να σας προσθέσει σε συλλογές, πρέπει να επιτρέψετε την ανάδειξή σας σε εμπειρίες ανακάλυψης από τις Προτιμήσεις > Ιδιωτικότητα και προσιτότητα", "empty_column.community": "Η τοπική ροή είναι κενή. Γράψε κάτι δημόσια για να αρχίσει να κυλά η μπάλα!", @@ -819,6 +820,12 @@ "keyboard_shortcuts.heading": "Συντομεύσεις πληκτρολογίου", "keyboard_shortcuts.home": "Άνοιγμα ροής αρχικής σελίδας", "keyboard_shortcuts.hotkey": "Συντόμευση", + "keyboard_shortcuts.keys.alt": "Alt", + "keyboard_shortcuts.keys.backspace": "Backspace", + "keyboard_shortcuts.keys.enter": "Enter", + "keyboard_shortcuts.keys.esc": "Esc", + "keyboard_shortcuts.keys.page_down": "Page Down", + "keyboard_shortcuts.keys.page_up": "Page Up", "keyboard_shortcuts.legend": "Εμφάνιση αυτού του οδηγού", "keyboard_shortcuts.load_more": "Εστίαση στο κουμπί \"Φόρτωση περισσότερων\"", "keyboard_shortcuts.local": "Άνοιγμα τοπικής ροής", @@ -1192,6 +1199,7 @@ "search_popout.user": "χρήστης", "search_results.accounts": "Προφίλ", "search_results.all": "Όλα", + "search_results.collections": "Συλλογές", "search_results.hashtags": "Ετικέτες", "search_results.no_results": "Κανένα αποτέλεσμα.", "search_results.no_search_yet": "Δοκίμασε να ψάξεις για αναρτήσεις, προφίλ ή ετικέτες.", diff --git a/app/javascript/mastodon/locales/en-GB.json b/app/javascript/mastodon/locales/en-GB.json index fb95859d3a0..e8cb9675f33 100644 --- a/app/javascript/mastodon/locales/en-GB.json +++ b/app/javascript/mastodon/locales/en-GB.json @@ -2,7 +2,6 @@ "about.blocks": "Moderated servers", "about.contact": "Contact:", "about.default_locale": "Default", - "about.disclaimer": "Mastodon is free, open-source software, and a trademark of Mastodon gGmbH.", "about.domain_blocks.no_reason_available": "Reason not available", "about.domain_blocks.preamble": "Mastodon generally allows you to view content from and interact with users from any other server in the Fediverse. These are the exceptions that have been made on this particular server.", "about.domain_blocks.silenced.explanation": "You will generally not see profiles and content from this server, unless you explicitly look it up or opt into it by following.", diff --git a/app/javascript/mastodon/locales/eo.json b/app/javascript/mastodon/locales/eo.json index 904a5a6a606..fa90d2d54c2 100644 --- a/app/javascript/mastodon/locales/eo.json +++ b/app/javascript/mastodon/locales/eo.json @@ -2,7 +2,6 @@ "about.blocks": "Reguligitaj serviloj", "about.contact": "Kontakto:", "about.default_locale": "Defaŭlta", - "about.disclaimer": "Mastodon estas libera, malfermitkoda programo kaj varmarko de la firmao Mastodon gGmbH.", "about.domain_blocks.no_reason_available": "Kialo ne disponeblas", "about.domain_blocks.preamble": "Mastodon ĝenerale rajtigas vidi la enhavojn de uzantoj el aliaj serviloj en la fediverso, kaj komuniki kun ili. Jen la limigoj deciditaj de tiu ĉi servilo mem.", "about.domain_blocks.silenced.explanation": "Vi ne ĝenerale vidos profilojn kaj enhavojn de ĉi tiu servilo, krom se vi eksplice trovas aŭ estas permesita de via sekvato.", diff --git a/app/javascript/mastodon/locales/es-AR.json b/app/javascript/mastodon/locales/es-AR.json index dcaa4ccc648..c4ac658b686 100644 --- a/app/javascript/mastodon/locales/es-AR.json +++ b/app/javascript/mastodon/locales/es-AR.json @@ -2,7 +2,7 @@ "about.blocks": "Servidores moderados", "about.contact": "Contacto:", "about.default_locale": "Predeterminado", - "about.disclaimer": "Mastodon es software libre y de código abierto y una marca comercial de Mastodon gGmbH.", + "about.disclaimer": "Mastodon es software libre y de código abierto, y una marca comercial de Mastodon GmbH.", "about.domain_blocks.no_reason_available": "Motivo no disponible", "about.domain_blocks.preamble": "Mastodon normalmente te permite ver el contenido e interactuar con los usuarios de cualquier otro servidor en el fediverso. Estas son las excepciones que se han hecho en este servidor en particular.", "about.domain_blocks.silenced.explanation": "Normalmente no verás perfiles y contenido de este servidor, a menos que lo busqués explícitamente o sigás alguna cuenta.", @@ -646,6 +646,7 @@ "empty_column.account_unavailable": "Perfil no disponible", "empty_column.blocks": "Todavía no bloqueaste a ningún usuario.", "empty_column.bookmarked_statuses": "Todavía no tenés mensajes guardados en \"Marcadores\". Cuando guardés uno en \"Marcadores\", se mostrará acá.", + "empty_column.collections": "{acct} todavía no creó ninguna colección.", "empty_column.collections.featured_in": "Todavía no te agregaron a ninguna colección.", "empty_column.collections.featured_in_undiscoverable": "Para que la gente pueda agregarte a colecciones, tenés que permitir que te destacen en las experiencias de descubrimiento en Configuración > Privacidad y alcance", "empty_column.community": "La línea temporal local está vacía. ¡Escribí algo en modo público para que se empiece a correr la bola!", @@ -819,6 +820,12 @@ "keyboard_shortcuts.heading": "Atajos de teclado", "keyboard_shortcuts.home": "Abrir línea temporal principal", "keyboard_shortcuts.hotkey": "Atajo", + "keyboard_shortcuts.keys.alt": "Alt", + "keyboard_shortcuts.keys.backspace": "⌫ Retroceso", + "keyboard_shortcuts.keys.enter": "↳ Intro", + "keyboard_shortcuts.keys.esc": "Escape", + "keyboard_shortcuts.keys.page_down": "Re Pág", + "keyboard_shortcuts.keys.page_up": "Av Pág", "keyboard_shortcuts.legend": "Mostrar este texto", "keyboard_shortcuts.load_more": "Focalizar el botón «Cargar más»", "keyboard_shortcuts.local": "Abrirlínea temporal local", @@ -1192,6 +1199,7 @@ "search_popout.user": "usuario", "search_results.accounts": "Perfiles", "search_results.all": "Todos", + "search_results.collections": "Colecciones", "search_results.hashtags": "Etiquetas", "search_results.no_results": "Sin resultados.", "search_results.no_search_yet": "Intentá buscar publicaciones, perfiles o etiquetas.", diff --git a/app/javascript/mastodon/locales/es-MX.json b/app/javascript/mastodon/locales/es-MX.json index 38bec754721..eacd2dce513 100644 --- a/app/javascript/mastodon/locales/es-MX.json +++ b/app/javascript/mastodon/locales/es-MX.json @@ -2,7 +2,7 @@ "about.blocks": "Servidores moderados", "about.contact": "Contacto:", "about.default_locale": "Por defecto", - "about.disclaimer": "Mastodon es software libre de código abierto, y una marca comercial de Mastodon gGmbH.", + "about.disclaimer": "Mastodon es un software libre, de código abierto, y una marca comercial de Mastodon GmbH.", "about.domain_blocks.no_reason_available": "Motivo no disponible", "about.domain_blocks.preamble": "Mastodon generalmente te permite ver contenido e interactuar con usuarios de cualquier otro servidor del fediverso. Estas son las excepciones que se han hecho en este servidor en particular.", "about.domain_blocks.silenced.explanation": "Por lo general, no verás perfiles ni contenidos de este servidor, a menos que los busques explícitamente o que optes por seguirlo.", @@ -646,6 +646,7 @@ "empty_column.account_unavailable": "Perfil no disponible", "empty_column.blocks": "Aún no has bloqueado a ningún usuario.", "empty_column.bookmarked_statuses": "Aún no tienes ninguna publicación guardada como marcador. Cuando guardes una, se mostrará aquí.", + "empty_column.collections": "{acct} aún no ha creado ninguna colección.", "empty_column.collections.featured_in": "Aún no te han añadido a ninguna colección.", "empty_column.collections.featured_in_undiscoverable": "Para que los usuarios puedan añadirte a sus colecciones, debes habilitar la opción de aparecer en las experiencias de descubrimiento desde Preferencias > Privacidad y alcance", "empty_column.community": "La cronología local está vacía. ¡Escribe algo públicamente para ponerla en marcha!", @@ -819,6 +820,12 @@ "keyboard_shortcuts.heading": "Atajos de teclado", "keyboard_shortcuts.home": "Abrir cronología principal", "keyboard_shortcuts.hotkey": "Tecla de acceso rápido", + "keyboard_shortcuts.keys.alt": "Alt", + "keyboard_shortcuts.keys.backspace": "Retroceso", + "keyboard_shortcuts.keys.enter": "Enter", + "keyboard_shortcuts.keys.esc": "Escape", + "keyboard_shortcuts.keys.page_down": "Re Pág", + "keyboard_shortcuts.keys.page_up": "Av Pág", "keyboard_shortcuts.legend": "Mostrar esta leyenda", "keyboard_shortcuts.load_more": "Enfoque en el botón \"Cargar más\"", "keyboard_shortcuts.local": "Abrir cronología local", @@ -1192,6 +1199,7 @@ "search_popout.user": "usuario", "search_results.accounts": "Perfiles", "search_results.all": "Todos", + "search_results.collections": "Colecciones", "search_results.hashtags": "Etiquetas", "search_results.no_results": "No hay resultados.", "search_results.no_search_yet": "Intenta buscar publicaciones, perfiles o etiquetas.", diff --git a/app/javascript/mastodon/locales/es.json b/app/javascript/mastodon/locales/es.json index c5c68be3dbb..f00bf988324 100644 --- a/app/javascript/mastodon/locales/es.json +++ b/app/javascript/mastodon/locales/es.json @@ -2,7 +2,7 @@ "about.blocks": "Servidores moderados", "about.contact": "Contacto:", "about.default_locale": "Por defecto", - "about.disclaimer": "Mastodon es software libre, de código abierto, y una marca comercial de Mastodon gGmbH.", + "about.disclaimer": "Mastodon es un software libre, de código abierto, y una marca comercial de Mastodon GmbH.", "about.domain_blocks.no_reason_available": "Razón no disponible", "about.domain_blocks.preamble": "Mastodon normalmente te permite ver el contenido e interactuar con los usuarios de cualquier otro servidor en el fediverso. Estas son las excepciones que se han hecho en este servidor en particular.", "about.domain_blocks.silenced.explanation": "Normalmente no verás perfiles y contenido de este servidor, a menos que lo busques explícitamente o sigas alguna cuenta.", @@ -646,6 +646,7 @@ "empty_column.account_unavailable": "Perfil no disponible", "empty_column.blocks": "Aún no has bloqueado a ningún usuario.", "empty_column.bookmarked_statuses": "Aún no tienes ninguna publicación guardada como marcador. Cuando guardes una, se mostrará aquí.", + "empty_column.collections": "{acct} aún no ha creado ninguna colección.", "empty_column.collections.featured_in": "Aún no te han añadido a ninguna colección.", "empty_column.collections.featured_in_undiscoverable": "Para que la gente pueda añadirte a colecciones, debes permitir ser destacado en algoritmos de descubrimiento desde Preferencias > Privacidad y alcance", "empty_column.community": "La línea de tiempo local está vacía. ¡Escribe algo para empezar la fiesta!", @@ -819,6 +820,12 @@ "keyboard_shortcuts.heading": "Keyboard Shortcuts", "keyboard_shortcuts.home": "Abrir cronología principal", "keyboard_shortcuts.hotkey": "Tecla rápida", + "keyboard_shortcuts.keys.alt": "Alt", + "keyboard_shortcuts.keys.backspace": "Retroceso", + "keyboard_shortcuts.keys.enter": "Enter", + "keyboard_shortcuts.keys.esc": "Escape", + "keyboard_shortcuts.keys.page_down": "Re Pág", + "keyboard_shortcuts.keys.page_up": "Av Pág", "keyboard_shortcuts.legend": "Mostrar esta leyenda", "keyboard_shortcuts.load_more": "Poner el foco en el botón \"Cargar más\"", "keyboard_shortcuts.local": "Abrir cronología local", @@ -1192,6 +1199,7 @@ "search_popout.user": "usuario", "search_results.accounts": "Perfiles", "search_results.all": "Todos", + "search_results.collections": "Colecciones", "search_results.hashtags": "Etiquetas", "search_results.no_results": "Sin resultados.", "search_results.no_search_yet": "Intenta buscar publicaciones, perfiles o etiquetas.", diff --git a/app/javascript/mastodon/locales/et.json b/app/javascript/mastodon/locales/et.json index 2ca57023b41..f8eabe8f6fc 100644 --- a/app/javascript/mastodon/locales/et.json +++ b/app/javascript/mastodon/locales/et.json @@ -2,7 +2,6 @@ "about.blocks": "Modereeritavad serverid", "about.contact": "Kontakt:", "about.default_locale": "Vaikimisi", - "about.disclaimer": "Mastodon on vaba, tasuta ja avatud lähtekoodiga tarkvara ning Mastodon gGmbH kaubamärk.", "about.domain_blocks.no_reason_available": "Põhjus on teadmata", "about.domain_blocks.preamble": "Mastodon lubab üldiselt vaadata sisu ning suhelda kasutajatega ükskõik millisest teisest födiversumi serverist. Need on erandid, mis kehtivad selles kindlas serveris.", "about.domain_blocks.silenced.explanation": "Sa üldjuhul ei näe profiile ja sisu sellest serverist, kui sa just tahtlikult neid ei otsi või jälgimise moel nõusolekut ei anna.", diff --git a/app/javascript/mastodon/locales/eu.json b/app/javascript/mastodon/locales/eu.json index eeec939a334..11f140560c8 100644 --- a/app/javascript/mastodon/locales/eu.json +++ b/app/javascript/mastodon/locales/eu.json @@ -2,7 +2,6 @@ "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.", "about.domain_blocks.silenced.explanation": "Orokorrean ez duzu zerbitzari honetako profil eta edukirik ikusiko. Profilak jarraitzen badituzu edo edukia esplizituki bilatzen baduzu bai.", diff --git a/app/javascript/mastodon/locales/fa.json b/app/javascript/mastodon/locales/fa.json index a5e9b2b097a..f73d5044755 100644 --- a/app/javascript/mastodon/locales/fa.json +++ b/app/javascript/mastodon/locales/fa.json @@ -2,7 +2,6 @@ "about.blocks": "کارسازهای نظارت شده", "about.contact": "تماس:", "about.default_locale": "پیش‌گزیده", - "about.disclaimer": "ماستودون نرم‌افزار آزاد و نشان تجاری یک شرکت غیر انتفاعی با مسئولیت محدود آلمانی است.", "about.domain_blocks.no_reason_available": "دلیلی موجود نیست", "about.domain_blocks.preamble": "ماستودون عموماً می‌گذارد محتوا را از هر کارساز دیگری در دنیای شبکه‌های اجتماعی غیرمتمرکز دیده و با آنان برهم‌کنش داشته باشید. این‌ها استثناهایی هستند که روی این کارساز خاص وضع شده‌اند.", "about.domain_blocks.silenced.explanation": "عموماً نمایه‌ها و محتوا از این کارساز را نمی‌بینید، مگر این که به طور خاص دنبالشان گشته یا با پی گیری، داوطلب دیدنشان شوید.", diff --git a/app/javascript/mastodon/locales/fi.json b/app/javascript/mastodon/locales/fi.json index f9427dfbcb4..9831a52c26a 100644 --- a/app/javascript/mastodon/locales/fi.json +++ b/app/javascript/mastodon/locales/fi.json @@ -2,7 +2,7 @@ "about.blocks": "Moderoidut palvelimet", "about.contact": "Yhteydenotto:", "about.default_locale": "Oletus", - "about.disclaimer": "Mastodon on vapaa avoimen lähdekoodin ohjelmisto ja Mastodon gGmbH:n tavaramerkki.", + "about.disclaimer": "Mastodon on vapaa avoimen lähdekoodin ohjelmisto ja Mastodon GmbH:n tavaramerkki.", "about.domain_blocks.no_reason_available": "Syy ei ole tiedossa", "about.domain_blocks.preamble": "Mastodonin avulla voi yleensä tarkastella minkä tahansa fediversumiin kuuluvan palvelimen sisältöä ja olla yhteyksissä eri palvelinten käyttäjien kanssa. Nämä poikkeukset koskevat yksin tätä palvelinta.", "about.domain_blocks.silenced.explanation": "Et yleensä näe tämän palvelimen profiileja ja sisältöä, jollet erityisesti etsi juuri sitä tai liity siihen seuraamalla.", @@ -646,6 +646,7 @@ "empty_column.account_unavailable": "Profiili ei saatavilla", "empty_column.blocks": "Et ole vielä estänyt käyttäjiä.", "empty_column.bookmarked_statuses": "Et ole vielä lisännyt julkaisuja kirjanmerkkeihisi. Kun lisäät yhden, se näkyy tässä.", + "empty_column.collections": "{acct} ei ole luonut vielä yhtään kokoelmaa.", "empty_column.collections.featured_in": "Sinua ei ole vielä lisätty mihinkään kokoelmaan.", "empty_column.collections.featured_in_undiscoverable": "Jotta sinut voi lisätä kokoelmiin, esittely löydettävyyskokemuksissa on sallittava kohdassa Asetukset > Yksityisyys ja tavoittavuus", "empty_column.community": "Paikallinen aikajana on tyhjä. Kirjoita jotain julkista, niin homma lähtee käyntiin!", @@ -819,6 +820,12 @@ "keyboard_shortcuts.heading": "Pikanäppäimet", "keyboard_shortcuts.home": "Avaa kotiaikajana", "keyboard_shortcuts.hotkey": "Pikanäppäin", + "keyboard_shortcuts.keys.alt": "Alt", + "keyboard_shortcuts.keys.backspace": "Askelpalautin", + "keyboard_shortcuts.keys.enter": "Enter", + "keyboard_shortcuts.keys.esc": "Esc", + "keyboard_shortcuts.keys.page_down": "Page Down", + "keyboard_shortcuts.keys.page_up": "Page Up", "keyboard_shortcuts.legend": "Näytä tämä ohje", "keyboard_shortcuts.load_more": "Kohdista ”Lataa lisää” -⁠painikkeeseen", "keyboard_shortcuts.local": "Avaa paikallinen aikajana", @@ -1191,6 +1198,7 @@ "search_popout.user": "käyttäjä", "search_results.accounts": "Profiilit", "search_results.all": "Kaikki", + "search_results.collections": "Kokoelmat", "search_results.hashtags": "Aihetunnisteet", "search_results.no_results": "Ei tuloksia.", "search_results.no_search_yet": "Kokeile hakea julkaisuja, profiileja tai aihetunnisteita.", diff --git a/app/javascript/mastodon/locales/fil.json b/app/javascript/mastodon/locales/fil.json index 7c3a29eafcb..fd7506baaa0 100644 --- a/app/javascript/mastodon/locales/fil.json +++ b/app/javascript/mastodon/locales/fil.json @@ -2,7 +2,6 @@ "about.blocks": "Mga pinatimping server", "about.contact": "Kontak:", "about.default_locale": "Default", - "about.disclaimer": "Ang Mastodon ay software na malaya at bukas-na-pinagmulan, at isang tatak-pangkalakal ng Mastodon gGmbH.", "about.domain_blocks.no_reason_available": "Hindi makuha ang dahilan", "about.domain_blocks.preamble": "Sa kadalasan, hinahayaan ka ng Mastodon na makita ang mga content sa, at makipag-interact sa users ng, ibang servers sa fediverse. Narito ang exceptions na ginawa sa partikular na server na ito.", "about.domain_blocks.silenced.explanation": "Sa kadalasan, hindi mo makikita ang profiles at content mula sa server na ito, maliban na lang kung sasadyain mo silang hanapin o piliing magawa ito sa pamamagitan ng mga sumusunod.", diff --git a/app/javascript/mastodon/locales/fo.json b/app/javascript/mastodon/locales/fo.json index a8651ba586e..4f4df1d18ee 100644 --- a/app/javascript/mastodon/locales/fo.json +++ b/app/javascript/mastodon/locales/fo.json @@ -2,7 +2,6 @@ "about.blocks": "Tálmaðir ambætarar", "about.contact": "Samband:", "about.default_locale": "Sjálvvirði", - "about.disclaimer": "Mastodon er fríur ritbúnaður við opnari keldu og eitt vørumerki hjá Mastodon gGmbH.", "about.domain_blocks.no_reason_available": "Ókent orsøk", "about.domain_blocks.preamble": "Yvirhøvur, so loyvir Mastodon tær at síggja innihald frá og at samvirka við brúkarar frá ein og hvørjum ambætara í fediverse. Undantøkini, sum eru gjørd á júst hesum ambætaranum, eru hesi.", "about.domain_blocks.silenced.explanation": "Yvirhøvur, so sært tú ikki vangar og innihald frá hesum ambætaranum, uttan so at tú skilliga leitar hesi upp ella velur tey við at fylgja teimum.", diff --git a/app/javascript/mastodon/locales/fr-CA.json b/app/javascript/mastodon/locales/fr-CA.json index 52482f5c932..839796ffdfe 100644 --- a/app/javascript/mastodon/locales/fr-CA.json +++ b/app/javascript/mastodon/locales/fr-CA.json @@ -2,7 +2,7 @@ "about.blocks": "Serveurs modérés", "about.contact": "Contact :", "about.default_locale": "Par défaut", - "about.disclaimer": "Mastodon est un logiciel open-source gratuit et une marque déposée de Mastodon gGmbH.", + "about.disclaimer": "Mastodon est un logiciel libre, open-source et une marque déposée de Mastodon GmbH.", "about.domain_blocks.no_reason_available": "Raison non disponible", "about.domain_blocks.preamble": "Mastodon vous permet généralement de visualiser le contenu et d'interagir avec des comptes de n'importe quel serveur dans le fediverse. Voici les exceptions qui ont été faites sur ce serveur en particulier.", "about.domain_blocks.silenced.explanation": "Vous ne verrez généralement pas de profils ou de contenu de ce serveur, à moins que vous ne les recherchiez explicitement ou que vous ne choisissiez de les suivre.", @@ -646,6 +646,7 @@ "empty_column.account_unavailable": "Profil non disponible", "empty_column.blocks": "Vous n’avez bloqué aucun compte pour le moment.", "empty_column.bookmarked_statuses": "Vous n'avez pas de publications parmi vos signets. Lorsque vous en ajouterez une, elle apparaîtra ici.", + "empty_column.collections": "{acct} n'a pas encore créé de collection.", "empty_column.collections.featured_in": "Vous n'avez pas encore été ajouté·e à une collection.", "empty_column.collections.featured_in_undiscoverable": "Afin que l'on puisse vous ajouter à des collections, vous devez autoriser d'apparaître dans les expériences de découverte depuis Vie privée et visibilité", "empty_column.community": "Le fil local est vide. Écrivez donc quelque chose pour le remplir!", @@ -819,6 +820,12 @@ "keyboard_shortcuts.heading": "Raccourcis clavier", "keyboard_shortcuts.home": "Ouvrir le fil d’accueil", "keyboard_shortcuts.hotkey": "Raccourci clavier", + "keyboard_shortcuts.keys.alt": "Alt", + "keyboard_shortcuts.keys.backspace": "Retour arrière", + "keyboard_shortcuts.keys.enter": "Entrée", + "keyboard_shortcuts.keys.esc": "Échap", + "keyboard_shortcuts.keys.page_down": "Page bas", + "keyboard_shortcuts.keys.page_up": "Page haut", "keyboard_shortcuts.legend": "Afficher cette légende", "keyboard_shortcuts.load_more": "Bouton Focus \"Charger plus\"", "keyboard_shortcuts.local": "Ouvrir le fil local", @@ -1192,6 +1199,7 @@ "search_popout.user": "utilisateur·ice", "search_results.accounts": "Profils", "search_results.all": "Tout", + "search_results.collections": "Collections", "search_results.hashtags": "Hashtags", "search_results.no_results": "Aucun résultat.", "search_results.no_search_yet": "Essayez de rechercher des messages, des profils ou des hashtags.", @@ -1333,12 +1341,12 @@ "upload_button.label": "Ajouter des images, une vidéo ou un fichier audio", "upload_error.limit": "Taille maximale d'envoi de fichier dépassée.", "upload_error.poll": "L’envoi de fichiers n’est pas autorisé avec les sondages.", - "upload_error.quote": "L’envoi de fichiers n’est pas autorisé avec les sondages.", - "upload_form.drag_and_drop.instructions": "Pour choisir un média joint, appuyez sur la touche espace ou entrée. Tout en faisant glisser, utilisez les touches fléchées pour déplacer le fichier média dans une direction donnée. Appuyez à nouveau sur la touche espace ou entrée pour déposer le fichier média dans sa nouvelle position, ou appuyez sur la touche Echap pour annuler.", - "upload_form.drag_and_drop.on_drag_cancel": "Le glissement a été annulé. La pièce jointe {item} n'a pas été ajoutée.", - "upload_form.drag_and_drop.on_drag_end": "La pièce jointe du média {item} a été déplacée.", + "upload_error.quote": "L’envoi de fichiers n’est pas autorisé avec les citations.", + "upload_form.drag_and_drop.instructions": "Pour choisir un média joint, appuyez sur la touche espace ou entrée. Pour glisser, utilisez les touches fléchées pour déplacer le fichier média dans une direction donnée. Appuyez à nouveau sur la touche espace ou entrée pour déposer le fichier média dans sa nouvelle position, ou appuyez sur la touche Echap pour annuler.", + "upload_form.drag_and_drop.on_drag_cancel": "Déplacement annulé. La pièce jointe {item} n'a pas été ajoutée.", + "upload_form.drag_and_drop.on_drag_end": "La pièce jointe du média {item} a été déposée.", "upload_form.drag_and_drop.on_drag_over": "La pièce jointe du média {item} a été déplacée.", - "upload_form.drag_and_drop.on_drag_start": "A récupéré la pièce jointe {item}.", + "upload_form.drag_and_drop.on_drag_start": "Sélection de la pièce jointe {item}.", "upload_form.edit": "Modifier", "upload_progress.label": "Envoi en cours...", "upload_progress.processing": "Traitement en cours…", diff --git a/app/javascript/mastodon/locales/fr.json b/app/javascript/mastodon/locales/fr.json index 0ccc72f5170..d4dcae1f966 100644 --- a/app/javascript/mastodon/locales/fr.json +++ b/app/javascript/mastodon/locales/fr.json @@ -2,7 +2,7 @@ "about.blocks": "Serveurs modérés", "about.contact": "Contact :", "about.default_locale": "Défaut", - "about.disclaimer": "Mastodon est un logiciel libre, open-source et une marque déposée de Mastodon gGmbH.", + "about.disclaimer": "Mastodon est un logiciel libre, open-source et une marque déposée de Mastodon GmbH.", "about.domain_blocks.no_reason_available": "Raison non disponible", "about.domain_blocks.preamble": "Mastodon vous permet généralement de visualiser le contenu et d'interagir avec les utilisateurs et utilisatrices de n'importe quel autre serveur dans le fédivers. Voici les exceptions qui ont été faites sur ce serveur.", "about.domain_blocks.silenced.explanation": "Vous ne verrez généralement pas les profils et le contenu de ce serveur, à moins que vous ne les recherchiez explicitement ou que vous ne choisissiez de les suivre.", @@ -646,6 +646,7 @@ "empty_column.account_unavailable": "Profil non disponible", "empty_column.blocks": "Vous n’avez bloqué aucun compte pour le moment.", "empty_column.bookmarked_statuses": "Vous n'avez pas de message en marque-page. Lorsque vous en ajouterez un, il apparaîtra ici.", + "empty_column.collections": "{acct} n'a pas encore créé de collection.", "empty_column.collections.featured_in": "Vous n'avez pas encore été ajouté·e à une collection.", "empty_column.collections.featured_in_undiscoverable": "Afin que l'on puisse vous ajouter à des collections, vous devez autoriser d'apparaître dans les expériences de découverte depuis Vie privée et visibilité", "empty_column.community": "Le fil public local est vide. Écrivez donc quelque chose pour le remplir !", @@ -819,6 +820,12 @@ "keyboard_shortcuts.heading": "Raccourcis clavier", "keyboard_shortcuts.home": "Ouvrir le fil d’accueil", "keyboard_shortcuts.hotkey": "Raccourci clavier", + "keyboard_shortcuts.keys.alt": "Alt", + "keyboard_shortcuts.keys.backspace": "Retour arrière", + "keyboard_shortcuts.keys.enter": "Entrée", + "keyboard_shortcuts.keys.esc": "Échap", + "keyboard_shortcuts.keys.page_down": "Page bas", + "keyboard_shortcuts.keys.page_up": "Page haut", "keyboard_shortcuts.legend": "Afficher cet aide-mémoire", "keyboard_shortcuts.load_more": "Bouton Focus \"Charger plus\"", "keyboard_shortcuts.local": "Ouvrir le fil public local", @@ -1192,6 +1199,7 @@ "search_popout.user": "utilisateur·ice", "search_results.accounts": "Profils", "search_results.all": "Tous les résultats", + "search_results.collections": "Collections", "search_results.hashtags": "Hashtags", "search_results.no_results": "Aucun résultat.", "search_results.no_search_yet": "Essayez de rechercher des messages, des profils ou des hashtags.", @@ -1333,12 +1341,12 @@ "upload_button.label": "Ajouter des images, une vidéo ou un fichier audio", "upload_error.limit": "Taille maximale d'envoi de fichier dépassée.", "upload_error.poll": "L’envoi de fichiers n’est pas autorisé avec les sondages.", - "upload_error.quote": "L’envoi de fichiers n’est pas autorisé avec les sondages.", - "upload_form.drag_and_drop.instructions": "Pour choisir un média joint, appuyez sur la touche espace ou entrée. Tout en faisant glisser, utilisez les touches fléchées pour déplacer le fichier média dans une direction donnée. Appuyez à nouveau sur la touche espace ou entrée pour déposer le fichier média dans sa nouvelle position, ou appuyez sur la touche Echap pour annuler.", - "upload_form.drag_and_drop.on_drag_cancel": "Le glissement a été annulé. La pièce jointe {item} n'a pas été ajoutée.", - "upload_form.drag_and_drop.on_drag_end": "La pièce jointe du média {item} a été déplacée.", + "upload_error.quote": "L’envoi de fichiers n’est pas autorisé avec les citations.", + "upload_form.drag_and_drop.instructions": "Pour choisir un média joint, appuyez sur la touche espace ou entrée. Pour glisser, utilisez les touches fléchées pour déplacer le fichier média dans une direction donnée. Appuyez à nouveau sur la touche espace ou entrée pour déposer le fichier média dans sa nouvelle position, ou appuyez sur la touche Echap pour annuler.", + "upload_form.drag_and_drop.on_drag_cancel": "Déplacement annulé. La pièce jointe {item} n'a pas été ajoutée.", + "upload_form.drag_and_drop.on_drag_end": "La pièce jointe du média {item} a été déposée.", "upload_form.drag_and_drop.on_drag_over": "La pièce jointe du média {item} a été déplacée.", - "upload_form.drag_and_drop.on_drag_start": "A récupéré la pièce jointe {item}.", + "upload_form.drag_and_drop.on_drag_start": "Sélection de la pièce jointe {item}.", "upload_form.edit": "Modifier", "upload_progress.label": "Envoi en cours…", "upload_progress.processing": "En cours…", diff --git a/app/javascript/mastodon/locales/fy.json b/app/javascript/mastodon/locales/fy.json index 63d4dce56c5..8930e18ba02 100644 --- a/app/javascript/mastodon/locales/fy.json +++ b/app/javascript/mastodon/locales/fy.json @@ -2,7 +2,6 @@ "about.blocks": "Moderearre servers", "about.contact": "Kontakt:", "about.default_locale": "Standert", - "about.disclaimer": "Mastodon is frije, iepenboarnesoftware en in hannelsmerk fan Mastodon gGmbH.", "about.domain_blocks.no_reason_available": "Reden net beskikber", "about.domain_blocks.preamble": "Yn it algemien kinne jo mei Mastodon berjochten ûntfange fan, en ynteraksje hawwe mei brûkers fan elke server yn de fediverse. Dit binne de útsûnderingen dy’t op dizze spesifike server jilde.", "about.domain_blocks.silenced.explanation": "Yn it algemien sjogge jo gjin berjochten en accounts fan dizze server, útsein as jo berjochten eksplisyt opsikje of derfoar kieze om in account fan dizze server te folgjen.", diff --git a/app/javascript/mastodon/locales/ga.json b/app/javascript/mastodon/locales/ga.json index cd9a83745a1..7375e57ef52 100644 --- a/app/javascript/mastodon/locales/ga.json +++ b/app/javascript/mastodon/locales/ga.json @@ -2,7 +2,7 @@ "about.blocks": "Freastalaithe modhnaithe", "about.contact": "Teagmháil:", "about.default_locale": "Réamhshocrú", - "about.disclaimer": "Bogearra foinse oscailte saor in aisce is ea Mastodon, agus is le Mastodon gGmbH an trádmharc.", + "about.disclaimer": "Is bogearraí foinse oscailte saor in aisce é Mastodon, agus trádmharc de chuid Mastodon GmbH.", "about.domain_blocks.no_reason_available": "Cúis nach bhfuil ar fáil", "about.domain_blocks.preamble": "Go ginearálta, tugann Mastodon deis duit ábhar a fheiceáil ó aon fhreastalaí eile sa fediverse agus idirghníomhú leo. Seo iad na heisceachtaí atá déanta ar an bhfreastalaí seo.", "about.domain_blocks.silenced.explanation": "Go hiondúil ní fheicfidh tú próifílí ná inneachar ón bhfreastalaí seo, ach amháin má bhíonn tú á lorg nó má ghlacann tú lena leanúint d'aon ghnó.", @@ -646,6 +646,7 @@ "empty_column.account_unavailable": "Níl an phróifíl ar fáil", "empty_column.blocks": "Níl aon úsáideoir bactha agat fós.", "empty_column.bookmarked_statuses": "Níl aon phostáil leabharmharcaithe agat fós. Nuair a dhéanann tú leabharmharc, beidh sé le feiceáil anseo.", + "empty_column.collections": "Níl aon bhailiúcháin cruthaithe ag {acct} go fóill.", "empty_column.collections.featured_in": "Níor cuireadh le haon bhailiúchán thú go fóill.", "empty_column.collections.featured_in_undiscoverable": "Chun go mbeidh daoine in ann tú a chur le bailiúcháin, ní mór duit cead a thabhairt duit a bheith le feiceáil i dtaithí fionnachtana ó Sainroghanna > Príobháideacht agus raon feidhme", "empty_column.community": "Tá an amlíne áitiúil folamh. Foilsigh rud éigin go poiblí le tús a chur le cúrsaí!", @@ -819,6 +820,12 @@ "keyboard_shortcuts.heading": "Aicearraí méarchláir", "keyboard_shortcuts.home": "Oscail amlíne bhaile", "keyboard_shortcuts.hotkey": "Eochair aicearra", + "keyboard_shortcuts.keys.alt": "Alt", + "keyboard_shortcuts.keys.backspace": "Cúlspás", + "keyboard_shortcuts.keys.enter": "Iontráil", + "keyboard_shortcuts.keys.esc": "Esc", + "keyboard_shortcuts.keys.page_down": "Leathanach Síos", + "keyboard_shortcuts.keys.page_up": "Leathanach Suas", "keyboard_shortcuts.legend": "Taispeáin an finscéal seo", "keyboard_shortcuts.load_more": "Dírigh ar an gcnaipe \"Lódáil níos mó\"", "keyboard_shortcuts.local": "Oscail an amlíne áitiúil", @@ -1192,6 +1199,7 @@ "search_popout.user": "úsáideoir", "search_results.accounts": "Próifílí", "search_results.all": "Gach", + "search_results.collections": "Bailiúcháin", "search_results.hashtags": "Haischlib", "search_results.no_results": "Gan torthaí.", "search_results.no_search_yet": "Bain triail as postálacha, próifílí nó hashtags a chuardach.", diff --git a/app/javascript/mastodon/locales/gd.json b/app/javascript/mastodon/locales/gd.json index 9c6ecb55337..3cd3821e467 100644 --- a/app/javascript/mastodon/locales/gd.json +++ b/app/javascript/mastodon/locales/gd.json @@ -2,7 +2,6 @@ "about.blocks": "Frithealaichean fo mhaorsainneachd", "about.contact": "Fios thugainn:", "about.default_locale": "Bun-roghainn", - "about.disclaimer": "’S e bathar-bog saor le bun-tùs fosgailte a th’ ann am Mastodon agus ’na chomharra-mhalairt aig Mastodon gGmbH.", "about.domain_blocks.no_reason_available": "Chan eil an t-adhbhar ga thoirt seachad", "about.domain_blocks.preamble": "San fharsaingeachd, leigidh Mastodon leat susbaint o fhrithealaiche sam bith sa cho-shaoghal a shealltainn agus eadar-ghìomh a ghabhail leis na cleachdaichean uapa-san. Seo na h-easgaidhean a tha an sàs air an fhrithealaiche shònraichte seo.", "about.domain_blocks.silenced.explanation": "San fharsaingeachd, chan fhaic thu pròifilean agus susbaint an fhrithealaiche seo ach ma nì thu lorg no ma tha thu ga leantainn.", diff --git a/app/javascript/mastodon/locales/gl.json b/app/javascript/mastodon/locales/gl.json index 45b7d7af9d4..3d0843525b0 100644 --- a/app/javascript/mastodon/locales/gl.json +++ b/app/javascript/mastodon/locales/gl.json @@ -2,7 +2,7 @@ "about.blocks": "Servidores suxeitos a moderación", "about.contact": "Contacto:", "about.default_locale": "Por defecto", - "about.disclaimer": "Mastodon é software libre, de código aberto, e unha marca comercial de Mastodon gGmbH.", + "about.disclaimer": "Mastodon é software libre, de código aberto, e unha marca comercial de Mastodon GmbH.", "about.domain_blocks.no_reason_available": "Motivo non indicado", "about.domain_blocks.preamble": "Mastodon de xeito xeral permíteche ver contidos doutros servidores do fediverso e interactuar coas súas usuarias. Estas son as excepcións que se estabeleceron neste servidor en particular.", "about.domain_blocks.silenced.explanation": "Por defecto non verás perfís e contido desde este servidor, a menos que mires de xeito explícito ou optes por seguir ese contido ou usuaria.", @@ -646,6 +646,7 @@ "empty_column.account_unavailable": "Perfil non dispoñible", "empty_column.blocks": "Aínda non bloqueaches a ningún usuaria.", "empty_column.bookmarked_statuses": "Aínda non marcaches ningunha publicación. Cando o fagas, aparecerán aquí.", + "empty_column.collections": "{acct} aínda non creou ningunha colección.", "empty_column.collections.featured_in": "Non te engadiron a ningunha colección.", "empty_column.collections.featured_in_undiscoverable": "Para que outras persoas poidan engadirte ás súas coleccións ter que conceder permiso para descubrimento da conta en Preferencias > Privacidade e alcance", "empty_column.community": "A cronoloxía local está baleira. Escribe algo de xeito público para espallalo!", @@ -819,6 +820,12 @@ "keyboard_shortcuts.heading": "Atallos do teclado", "keyboard_shortcuts.home": "Para abrir a cronoloxía inicial", "keyboard_shortcuts.hotkey": "Tecla de atallo", + "keyboard_shortcuts.keys.alt": "Alt", + "keyboard_shortcuts.keys.backspace": "Retroceso", + "keyboard_shortcuts.keys.enter": "Entrar", + "keyboard_shortcuts.keys.esc": "Escape", + "keyboard_shortcuts.keys.page_down": "Frecha abaixo", + "keyboard_shortcuts.keys.page_up": "Frecha arriba", "keyboard_shortcuts.legend": "Para amosar esta lenda", "keyboard_shortcuts.load_more": "Foco no botón \"Cargar máis\"", "keyboard_shortcuts.local": "Para abrir a cronoloxía local", @@ -1192,6 +1199,7 @@ "search_popout.user": "usuaria", "search_results.accounts": "Perfís", "search_results.all": "Todo", + "search_results.collections": "Coleccións", "search_results.hashtags": "Cancelos", "search_results.no_results": "Sen resultados.", "search_results.no_search_yet": "Intenta buscando publicacións, perfís ou cancelos.", diff --git a/app/javascript/mastodon/locales/he.json b/app/javascript/mastodon/locales/he.json index dc9382e7f93..39991d3bc70 100644 --- a/app/javascript/mastodon/locales/he.json +++ b/app/javascript/mastodon/locales/he.json @@ -2,7 +2,6 @@ "about.blocks": "שרתים תחת פיקוח תוכן", "about.contact": "יצירת קשר:", "about.default_locale": "ברירת המחדל", - "about.disclaimer": "מסטודון היא תוכנת קוד פתוח חינמית וסימן מסחרי של Mastodon gGmbH.", "about.domain_blocks.no_reason_available": "הסיבה אינה זמינה", "about.domain_blocks.preamble": "ככלל מסטודון מאפשרת לך לצפות בתוכן ולתקשר עם משתמשים מכל שרת בפדיברס. אלו הם היוצאים מן הכלל שהוגדרו עבור השרת המסוים הזה.", "about.domain_blocks.silenced.explanation": "ככלל פרופילים ותוכן משרת זה לא יוצגו, אלא אם חיפשת אותם באופן מפורש או בחרת להשתתף בו על ידי מעקב.", diff --git a/app/javascript/mastodon/locales/hi.json b/app/javascript/mastodon/locales/hi.json index a6215bc6b12..c2784a769ab 100644 --- a/app/javascript/mastodon/locales/hi.json +++ b/app/javascript/mastodon/locales/hi.json @@ -2,7 +2,6 @@ "about.blocks": "मॉडरेट सर्वर", "about.contact": "कांटेक्ट:", "about.default_locale": "Default", - "about.disclaimer": "मास्टोडन एक ओपन सोर्स सॉफ्टवेयर है, और मास्टोडन gGmbH का ट्रेडमार्क है।", "about.domain_blocks.no_reason_available": "कारण उपलब्ध नहीं है!", "about.domain_blocks.preamble": "मास्टोडन आम तौर पर आपको कंटेंट को देखने और फेडिवेर्से में किसी अन्य सर्वर से उपयोगकर्ताओं के साथ बातचीत करने की अनुमति देता है। ये अपवाद हैं जो इस विशेष सर्वर पर बनाए गए हैं।", "about.domain_blocks.silenced.explanation": "आप आमतौर पर इस सर्वर से प्रोफ़ाइल और कंटेंट नहीं देख पाएंगे, जब तक कि आप इसे स्पष्ट रूप से नहीं देखते या इसका अनुसरण करके इसका चयन नहीं करते।", diff --git a/app/javascript/mastodon/locales/hr.json b/app/javascript/mastodon/locales/hr.json index 859aaaa9ac9..a8d3c0e7810 100644 --- a/app/javascript/mastodon/locales/hr.json +++ b/app/javascript/mastodon/locales/hr.json @@ -1,7 +1,6 @@ { "about.blocks": "Moderirani poslužitelji", "about.contact": "Kontakt:", - "about.disclaimer": "Mastodon je besplatan softver otvorenog koda i zaštitni znak tvrtke Mastodon gGmbH.", "about.domain_blocks.no_reason_available": "Razlog nije dostupan", "about.domain_blocks.preamble": "Mastodon vam općenito omogućuje pregled sadržaja i interakciju s korisnicima s bilo kojeg drugog poslužitelja u fediverse. Ovo su iznimke napravljene na ovom poslužitelju.", "about.domain_blocks.silenced.explanation": "Obično nećete vidjeti profile i sadržaj s ovog poslužitelja, osim ako ga izričito ne potražite ili uključite u njega slijedeći ga.", diff --git a/app/javascript/mastodon/locales/hu.json b/app/javascript/mastodon/locales/hu.json index 4af2e3d474f..dfa722d2d7d 100644 --- a/app/javascript/mastodon/locales/hu.json +++ b/app/javascript/mastodon/locales/hu.json @@ -2,7 +2,6 @@ "about.blocks": "Moderált kiszolgálók", "about.contact": "Kapcsolat:", "about.default_locale": "Alapértelmezett", - "about.disclaimer": "A Mastodon ingyenes, nyílt forráskódú szoftver, a Mastodon gGmbH védjegye.", "about.domain_blocks.no_reason_available": "Nem áll rendelkezésre indoklás", "about.domain_blocks.preamble": "A Mastodon általában mindenféle tartalomcserét és interakciót lehetővé tesz bármelyik másik kiszolgálóval a födiverzumban. Ezek azok a kivételek, amelyek a mi kiszolgálónkon érvényben vannak.", "about.domain_blocks.silenced.explanation": "Általában nem fogsz profilokat és tartalmat látni erről a kiszolgálóról, hacsak közvetlenül fel nem keresed vagy követed.", diff --git a/app/javascript/mastodon/locales/hy.json b/app/javascript/mastodon/locales/hy.json index dc5683b7305..01fb6bb5f37 100644 --- a/app/javascript/mastodon/locales/hy.json +++ b/app/javascript/mastodon/locales/hy.json @@ -1,7 +1,6 @@ { "about.blocks": "Մոդերացուող սպասարկիչներ", "about.contact": "Կապ՝", - "about.disclaimer": "Մաստոդոնը ազատ, բաց ելակոդով ծրագրակազմ է, յայտնի Mastodon gGmbH ապրանքանշանով։", "about.domain_blocks.silenced.title": "Սահմանափակ", "about.domain_blocks.suspended.title": "Սպասող", "about.not_available": "Այս տեղեկութիւնը տեսանելի չի այս սերուերում։", diff --git a/app/javascript/mastodon/locales/ia.json b/app/javascript/mastodon/locales/ia.json index fb1ec026a81..55cc89f1383 100644 --- a/app/javascript/mastodon/locales/ia.json +++ b/app/javascript/mastodon/locales/ia.json @@ -2,7 +2,6 @@ "about.blocks": "Servitores moderate", "about.contact": "Contacto:", "about.default_locale": "Default", - "about.disclaimer": "Mastodon es software libere, de codice aperte, e un marca de Mastodon gGmbH.", "about.domain_blocks.no_reason_available": "Ration non disponibile", "about.domain_blocks.preamble": "Mastodon generalmente permitte vider le contento de, e interager con, usatores de qualcunque altere servitor in le fediverso. Istes es le exceptiones que ha essite facite sur iste servitor particular.", "about.domain_blocks.silenced.explanation": "Generalmente, tu non videra le profilos e le contento de iste servitor, excepte si tu expressemente cerca le contento o seque le profilos.", diff --git a/app/javascript/mastodon/locales/id.json b/app/javascript/mastodon/locales/id.json index 63bd8f231e0..36885c906fa 100644 --- a/app/javascript/mastodon/locales/id.json +++ b/app/javascript/mastodon/locales/id.json @@ -2,7 +2,6 @@ "about.blocks": "Server yang dimoderasi", "about.contact": "Kontak:", "about.default_locale": "Default", - "about.disclaimer": "Mastodon adalah perangkat lunak bebas dan sumber terbuka, serta merek dagang milik Mastodon gGmbH.", "about.domain_blocks.no_reason_available": "Alasan tidak tersedia", "about.domain_blocks.preamble": "Mastodon umumnya mengizinkan Anda untuk melihat konten dan berinteraksi dengan pengguna dari server lain di fediverse. Ini adalah pengecualian yang dibuat untuk beberapa server.", "about.domain_blocks.silenced.explanation": "Anda secara umum tidak melihat profil dan konten dari server ini, kecuali jika Anda mencarinya atau memilihnya dengan mengikuti secara eksplisit.", diff --git a/app/javascript/mastodon/locales/ie.json b/app/javascript/mastodon/locales/ie.json index 42f8bad5bff..516604acca8 100644 --- a/app/javascript/mastodon/locales/ie.json +++ b/app/javascript/mastodon/locales/ie.json @@ -1,7 +1,6 @@ { "about.blocks": "Moderat servitores", "about.contact": "Contacter:", - "about.disclaimer": "Mastodon es programmatura líber e con fonte apert, e un marca de fabrica de Mastodon dGmbH.", "about.domain_blocks.no_reason_available": "Rason ne disponibil", "about.domain_blocks.preamble": "Mastodon generalmen possibilisa regardar li contenete de, e li interaction con usatores de quelcunc altri servitor in li fediverse. Ci trova se li exceptiones fat de ti-ci particulari servitor.", "about.domain_blocks.silenced.explanation": "Generalmen, li profiles e contenete de ti-ci servitor ne va aparir, except si on sercha les explicitmen o optionalisa it per sequer.", diff --git a/app/javascript/mastodon/locales/io.json b/app/javascript/mastodon/locales/io.json index bbba5af9a3d..660747bcce1 100644 --- a/app/javascript/mastodon/locales/io.json +++ b/app/javascript/mastodon/locales/io.json @@ -2,7 +2,6 @@ "about.blocks": "Jerata servili", "about.contact": "Kontaktajo:", "about.default_locale": "Predeterminita", - "about.disclaimer": "Mastodon esas libera, publikfonta e komercmarko di Mastodon gGmbH.", "about.domain_blocks.no_reason_available": "Expliko nedisponebla", "about.domain_blocks.preamble": "Mastodon generale permisas on vidar kontenajo e interagar kun uzanti de irga altra servilo en fediverso. Existas eceptioni quo facesis che ca partikulara servilo.", "about.domain_blocks.silenced.explanation": "On generale ne vidar profili e enhavajo de ca servilo, se on ne intence serchar o voleskar per sequar.", diff --git a/app/javascript/mastodon/locales/is.json b/app/javascript/mastodon/locales/is.json index 56f1ca4358d..bce1167c117 100644 --- a/app/javascript/mastodon/locales/is.json +++ b/app/javascript/mastodon/locales/is.json @@ -2,7 +2,7 @@ "about.blocks": "Netþjónar með efnisumsjón", "about.contact": "Hafa samband:", "about.default_locale": "Sjálfgefið", - "about.disclaimer": "Mastodon er frjáls hugbúnaður með opinn grunnkóða og er skrásett vörumerki í eigu Mastodon gGmbH.", + "about.disclaimer": "Mastodon er frjáls hugbúnaður með opinn grunnkóða og er skrásett vörumerki í eigu Mastodon GmbH.", "about.domain_blocks.no_reason_available": "Ástæða ekki tiltæk", "about.domain_blocks.preamble": "Mastodon leyfir þér almennt að skoða og eiga við efni frá notendum frá hvaða vefþjóni sem er í vefþjónasambandinu. Þetta eru þær undantekningar sem hafa verið gerðar á þessum tiltekna vefþjóni.", "about.domain_blocks.silenced.explanation": "Þú munt almennt ekki sjá notandasnið og efni af þessum netþjóni nema þú flettir því upp sérstaklega eða veljir að fylgjast með því.", diff --git a/app/javascript/mastodon/locales/it.json b/app/javascript/mastodon/locales/it.json index 5b0e89a0bf4..3c7dadd248f 100644 --- a/app/javascript/mastodon/locales/it.json +++ b/app/javascript/mastodon/locales/it.json @@ -2,7 +2,7 @@ "about.blocks": "Server moderati", "about.contact": "Contatti:", "about.default_locale": "Predefinito", - "about.disclaimer": "Mastodon è un software libero e open-source e un marchio di Mastodon gGmbH.", + "about.disclaimer": "Mastodon è un software libero, open-source e un marchio di Mastodon GmbH.", "about.domain_blocks.no_reason_available": "Motivo non disponibile", "about.domain_blocks.preamble": "Mastodon, generalmente, ti consente di visualizzare i contenuti e interagire con gli utenti da qualsiasi altro server nel fediverso. Queste sono le eccezioni che sono state fatte su questo particolare server.", "about.domain_blocks.silenced.explanation": "Generalmente non vedrai i profili e i contenuti di questo server, a meno che tu non lo cerchi esplicitamente o che tu scelga di seguirlo.", diff --git a/app/javascript/mastodon/locales/ja.json b/app/javascript/mastodon/locales/ja.json index f864cb0b771..cc7271c3e2a 100644 --- a/app/javascript/mastodon/locales/ja.json +++ b/app/javascript/mastodon/locales/ja.json @@ -2,7 +2,6 @@ "about.blocks": "制限中のサーバー", "about.contact": "連絡先", "about.default_locale": "デフォルト", - "about.disclaimer": "Mastodonは自由なオープンソースソフトウェアであり、Mastodon gGmbHの商標です。", "about.domain_blocks.no_reason_available": "理由未記載", "about.domain_blocks.preamble": "Mastodonでは原則的にあらゆるサーバー同士で交流したり、互いの投稿を読んだりできますが、当サーバーでは例外的に次のような制限を設けています。", "about.domain_blocks.silenced.explanation": "このサーバーのプロフィールやコンテンツは、明示的に検索したり、フォローでオプトインしない限り、通常は表示されません。", diff --git a/app/javascript/mastodon/locales/kab.json b/app/javascript/mastodon/locales/kab.json index a07c68efcb7..73f0859251b 100644 --- a/app/javascript/mastodon/locales/kab.json +++ b/app/javascript/mastodon/locales/kab.json @@ -2,7 +2,6 @@ "about.blocks": "Iqeddacen yettwaɛassen", "about.contact": "Anermis:", "about.default_locale": "Tamezwert", - "about.disclaimer": "Mastodon d aseɣẓan ilelli, d aseɣẓan n uɣbalu yeldin, d tnezzut n Mastodon gGmbH.", "about.domain_blocks.no_reason_available": "Ulac taɣẓint", "about.domain_blocks.preamble": "Maṣṭudun s umata yeḍmen-ak ad teẓreḍ agbur, ad tesdemreḍ akked yimseqdacen-nniḍen seg yal aqeddac deg fedivers. Ha-tent-an ɣur-k tsuraf i yellan deg uqeddac-agi.", "about.domain_blocks.silenced.title": "Ɣur-s talast", diff --git a/app/javascript/mastodon/locales/kk.json b/app/javascript/mastodon/locales/kk.json index ad693c14b21..7e4f2cf9a70 100644 --- a/app/javascript/mastodon/locales/kk.json +++ b/app/javascript/mastodon/locales/kk.json @@ -2,7 +2,6 @@ "about.blocks": "Модерацияланған серверлер", "about.contact": "Байланыс:", "about.default_locale": "Әдепкі", - "about.disclaimer": "Mastodon деген тегін, бастапқы коды ашық бағдарламалық жасақтама және Mastodon gGmbH-тің сауда маркасы.", "about.domain_blocks.no_reason_available": "Себеп қолжетімсіз", "about.domain_blocks.preamble": "Mastodon әдетте сізге Fediverse'тің кез келген серверінің қолданушыларының контентін көріп, олармен байланысуға мүмкіндік береді. Осы белгілі серверде жасалған ережеден тыс жағдайлар міне.", "about.domain_blocks.silenced.explanation": "Сіз бұл сервердің профильдері мен контентін іздегенше немесе жазылмағанша, оларды әдетте көрмейсіз.", diff --git a/app/javascript/mastodon/locales/kn.json b/app/javascript/mastodon/locales/kn.json index 1c8875fc343..f118ba6d8cd 100644 --- a/app/javascript/mastodon/locales/kn.json +++ b/app/javascript/mastodon/locales/kn.json @@ -1,7 +1,6 @@ { "about.blocks": "ನಿಯಂತ್ರಿತ ಸರ್ವರ್‌ಗಳು", "about.contact": "ಸಂಪರ್ಕ:", - "about.disclaimer": "ಮಾಸ್ಟೋಡಾನ್ ಇದು ಉಚಿತ, ಮುಕ್ತ ತಂತ್ರಾಂಶ ಮತ್ತು Mastodon gGmbH ಇದರ ನೊಂದಾಯಿತ ಗುರುತು.", "about.domain_blocks.no_reason_available": "ಕಾರಣ ಲಭ್ಯವಿಲ್ಲ", "about.domain_blocks.preamble": "ಸಾಮಾನ್ಯವಾಗಿ ಮಾಸ್ಟೊಡಾನ್ ನಿಮಗೆ ಇತರೆ ಬಳಕೆದಾರರಿಂದ ಹಂಚಲ್ಪಟ್ಟ ವಿಷಯಗಳನ್ನು ನೋಡಲು ಮತ್ತು ಅವರೊಂದಿಗೆ ಸಂಭಾಷಿಸಲು ಅನುಮತಿಸುತ್ತದೆ.\nಆದರೆ ಈ ಸರ್ವ್ರರ್‌ನಲ್ಲಿ ಅಳವಡಿಸಲಾದ ಕೆಲವು ವಿನಾಯಿತಿಗಳು ಇಂತಿವೆ.", "account.add_or_remove_from_list": "ಪಟ್ಟಿಗೆ ಸೇರಿಸು ಅಥವ ಪಟ್ಟಿಯಿಂದ ತೆಗೆದುಹಾಕು", diff --git a/app/javascript/mastodon/locales/ko.json b/app/javascript/mastodon/locales/ko.json index 507c2d03120..4b7be7ebaf6 100644 --- a/app/javascript/mastodon/locales/ko.json +++ b/app/javascript/mastodon/locales/ko.json @@ -2,7 +2,6 @@ "about.blocks": "제한된 서버들", "about.contact": "연락처:", "about.default_locale": "기본", - "about.disclaimer": "Mastodon은 자유 오픈소스 소프트웨어이며, Mastodon gGmbH의 상표입니다", "about.domain_blocks.no_reason_available": "사유를 밝히지 않음", "about.domain_blocks.preamble": "마스토돈은 일반적으로 연합우주에 있는 어떤 서버의 사용자와도 게시물을 보고 응답을 할 수 있도록 허용합니다. 다음 항목들은 특정한 서버에 대해 만들어 진 예외사항입니다.", "about.domain_blocks.silenced.explanation": "명시적으로 찾아보거나 팔로우를 하기 전까지는, 이 서버에 있는 프로필이나 게시물 등을 일반적으로 볼 수 없습니다.", diff --git a/app/javascript/mastodon/locales/ku.json b/app/javascript/mastodon/locales/ku.json index 202a15d2ace..020ab0f82bd 100644 --- a/app/javascript/mastodon/locales/ku.json +++ b/app/javascript/mastodon/locales/ku.json @@ -2,7 +2,6 @@ "about.blocks": "Rajekarên çavdêrkirî", "about.contact": "Têkilî:", "about.default_locale": "Berdest", - "about.disclaimer": "Mastodon belaş e, nermalaveke çavkaniya vekirî ye û markeyeke Mastodon gGmbHê ye.", "about.domain_blocks.no_reason_available": "Sedem ne berdest e", "about.domain_blocks.preamble": "Mastodon bi gelemperî dihêle ku tu naverokê bibînî û bi bikarhênerên ji rajekareke din a li fendiverse re têkilî dayne. Ev awaretyên ku li ser vê rajekara taybetî hatine çêkirin ev in.", "about.domain_blocks.silenced.explanation": "Heye ku tu bi awayekî vekirî lê negerî an jî bi şopandinê hilnebijêrî, tu yêbi giştî profîl û naverok ji vê rajekarê nebînî.", diff --git a/app/javascript/mastodon/locales/la.json b/app/javascript/mastodon/locales/la.json index 59b724d17d4..09098f089db 100644 --- a/app/javascript/mastodon/locales/la.json +++ b/app/javascript/mastodon/locales/la.json @@ -2,7 +2,6 @@ "about.blocks": "Servī moderātī", "about.contact": "Ratio:", "about.default_locale": "Default", - "about.disclaimer": "Mastodon est software līberum, apertum fontem, et nōtam commercium Mastodon gGmbH.", "about.domain_blocks.no_reason_available": "Ratio abdere est", "about.domain_blocks.preamble": "Mastodon genērāliter sinit tē contentum ex aliīs servientibus in fedīversō vidēre et cum usoribus ab iīs interāgere. Haē sunt exceptionēs quae in hōc particulārī servientē factae sunt.", "about.domain_blocks.silenced.explanation": "Tua profilia atque tuum contentum ab hac serve praecipue non videbis, nisi explōrēs expresse aut subsequeris et optēs.", diff --git a/app/javascript/mastodon/locales/lad.json b/app/javascript/mastodon/locales/lad.json index e22aa33ab6a..f655a6e0032 100644 --- a/app/javascript/mastodon/locales/lad.json +++ b/app/javascript/mastodon/locales/lad.json @@ -2,7 +2,6 @@ "about.blocks": "Sirvidores moderados", "about.contact": "Kontakto:", "about.default_locale": "Predeterminado", - "about.disclaimer": "Mastodon es un programario libero, kon kodiche avierto i una marka komersiala de Mastodon gGmbH.", "about.domain_blocks.no_reason_available": "Razon no desponivle", "about.domain_blocks.preamble": "Mastodon djeneralmente te permete ver kontenido de i enteraktuar kon utilizadores de kualseker otro sirvidor en el fediverso. Estas son las eksepsiones en este sirvidor en partikolar.", "about.domain_blocks.silenced.explanation": "Djeneralmente no veras profiles i kontenido de este sirvidor, salvo ke eksplisitamente lo bushkes o sigas algun kuento de el.", diff --git a/app/javascript/mastodon/locales/lt.json b/app/javascript/mastodon/locales/lt.json index 61525d0ec7b..a1409be70b8 100644 --- a/app/javascript/mastodon/locales/lt.json +++ b/app/javascript/mastodon/locales/lt.json @@ -2,7 +2,6 @@ "about.blocks": "Prižiūrimi serveriai", "about.contact": "Kontaktai:", "about.default_locale": "Numatyta", - "about.disclaimer": "„Mastodon“ – tai nemokama atvirojo kodo programinė įranga ir „Mastodon gGmbH“ prekės ženklas.", "about.domain_blocks.no_reason_available": "Priežastis nepateikta", "about.domain_blocks.preamble": "„Mastodon“ paprastai leidžia peržiūrėti turinį ir bendrauti su naudotojais iš bet kurio kito fediverse esančio serverio. Šios yra išimtys, kurios buvo padarytos šiame konkrečiame serveryje.", "about.domain_blocks.silenced.explanation": "Paprastai nematysi profilių ir turinio iš šio serverio, nebent jį aiškiai ieškosi arba pasirinksi jį sekant.", diff --git a/app/javascript/mastodon/locales/lv.json b/app/javascript/mastodon/locales/lv.json index 0ac38ecd005..34558d6ca52 100644 --- a/app/javascript/mastodon/locales/lv.json +++ b/app/javascript/mastodon/locales/lv.json @@ -2,7 +2,6 @@ "about.blocks": "Moderētie serveri", "about.contact": "Kontakts:", "about.default_locale": "Noklusējums", - "about.disclaimer": "Mastodon ir bezmaksas atklātā pirmkoda programmatūra un Mastodon gGmbH preču zīme.", "about.domain_blocks.no_reason_available": "Iemesls nav norādīts", "about.domain_blocks.preamble": "Mastodon parasti ļauj apskatīt saturu un mijiedarboties ar lietotājiem no jebkura cita fediversa servera. Šie ir izņēmumi, kas veikti tieši šajā serverī.", "about.domain_blocks.silenced.explanation": "Parasti tu neredzēsi profilus un saturu no šī servera, ja vien tu nepārprotami izvēlēsies to pārskatīt vai sekot.", diff --git a/app/javascript/mastodon/locales/mk.json b/app/javascript/mastodon/locales/mk.json index 567c586aff3..a4f53d0cfd8 100644 --- a/app/javascript/mastodon/locales/mk.json +++ b/app/javascript/mastodon/locales/mk.json @@ -2,7 +2,6 @@ "about.blocks": "Модерирани сервери", "about.contact": "Контакт:", "about.default_locale": "Стандардно", - "about.disclaimer": "Mastodon е бесплатен, open-source софтвер, и заштитен знак на Mastodon gGmbH.", "about.domain_blocks.no_reason_available": "Причината не е достапна", "about.domain_blocks.preamble": "Mastodon вообичаено ви дозволува да прегледувате содржини и комуницирате со корисниците од било кој сервер во федиверзумот. На овој сервер има исклучоци.", "about.domain_blocks.silenced.explanation": "Вообичаено нема да гледате профили и содржина од овој сервер, освен ако не го пребарате намерно, или го заследите.", diff --git a/app/javascript/mastodon/locales/mr.json b/app/javascript/mastodon/locales/mr.json index ca6b67046a7..ac3563fbe0d 100644 --- a/app/javascript/mastodon/locales/mr.json +++ b/app/javascript/mastodon/locales/mr.json @@ -1,7 +1,6 @@ { "about.blocks": "नियंत्रित सर्व्हर", "about.contact": "संपर्क:", - "about.disclaimer": "Mastodon हे विनामूल्य, मुक्त-स्रोत सॉफ्टवेअर आहे आणि Mastodon gGmbH चे ट्रेडमार्क आहे.", "about.domain_blocks.no_reason_available": "कारण उपलब्ध नाही", "about.domain_blocks.preamble": "मास्टोडॉन तुम्हाला सामान्यत: फेडिव्हर्समधील इतर कोणत्याही सर्व्हरवरील वापरकर्त्यांवरील मजकूर पाहण्याची आणि त्यांच्याशी संवाद साधण्याची परवानगी देते. या विशिष्ट सर्व्हरवर केलेले हे अपवाद आहेत.", "about.domain_blocks.silenced.explanation": "जोपर्यंत तुम्ही ते स्पष्टपणे शोधत नाही किंवा अनुसरण करून निवड करत नाही तोपर्यंत तुम्हाला या सर्व्हरवरील प्रोफाइल आणि मजकूर दिसणार नाही.", diff --git a/app/javascript/mastodon/locales/ms.json b/app/javascript/mastodon/locales/ms.json index 2024174bf60..cd34aae576f 100644 --- a/app/javascript/mastodon/locales/ms.json +++ b/app/javascript/mastodon/locales/ms.json @@ -2,7 +2,6 @@ "about.blocks": "Pelayan yang diselaraskan", "about.contact": "Hubungi:", "about.default_locale": "Lalai", - "about.disclaimer": "Mastodon ialah perisian sumber terbuka percuma, dan merupakan tanda dagangan Mastodon gGmbH.", "about.domain_blocks.no_reason_available": "Sebab tidak tersedia", "about.domain_blocks.preamble": "Secara amnya, Mastodon membenarkan anda melihat kandungan pengguna daripada mana-mana pelayan dalam alam bersekutu dan berinteraksi dengan mereka. Berikut ialah pengecualian yang khusus pada pelayan ini.", "about.domain_blocks.silenced.explanation": "Secara amnya, anda tidak akan melihat profil dan kandungan daripada pelayan ini, kecuali anda mencarinya secara khusus atau ikut serta dengan mengikutinya.", diff --git a/app/javascript/mastodon/locales/my.json b/app/javascript/mastodon/locales/my.json index a08722a66ea..4a89b6dc4f4 100644 --- a/app/javascript/mastodon/locales/my.json +++ b/app/javascript/mastodon/locales/my.json @@ -1,7 +1,6 @@ { "about.blocks": "ထိန်းချုပ်မှုရှိသော ဆာဗာများ", "about.contact": "ဆက်သွယ်ရန်:", - "about.disclaimer": "Mastodon သည် အခမဲ့ဖြစ်ပြီး open-source software နှင့် Mastodon gGmbH ၏ ကုန်အမှတ်တံဆိပ်တစ်ခုဖြစ်သည်။.", "about.domain_blocks.no_reason_available": "အကြောင်းပြချက်မရှိပါ", "about.domain_blocks.preamble": "Mastodon သည် ယေဘုယျအားဖြင့် fediverse ရှိ အခြား​ဆာဗာ အသုံးပြုသူများထံမှ အကြောင်းအရာများကို ကြည့်ရှုနိုင်သည့်အပြင် အပြန်အလှန်တုံ့ပြန်နိုင်စေပါသည်။ ဤသည်တို့မှာ သီးခြားဆာဗာများအတွက် ပြုလုပ်ထားသောအရာများဖြစ်သည်။", "about.domain_blocks.silenced.explanation": "ရှင်းရှင်းလင်းလင်း ရှာကြည့်ခြင်း သို့မဟုတ် လိုက်ကြည့်ခြင်းဖြင့် ၎င်းကို ရွေးချယ်ခြင်းမှလွဲ၍ ဤဆာဗာမှ ပရိုဖိုင်များနှင့် အကြောင်းအရာများကို ယေဘုယျအားဖြင့် သင်သည် မမြင်ရပါ။", diff --git a/app/javascript/mastodon/locales/nan-TW.json b/app/javascript/mastodon/locales/nan-TW.json index 393351265cd..cd93bc69d1c 100644 --- a/app/javascript/mastodon/locales/nan-TW.json +++ b/app/javascript/mastodon/locales/nan-TW.json @@ -2,7 +2,6 @@ "about.blocks": "Siū 管制 ê 服侍器", "about.contact": "聯絡方法:", "about.default_locale": "預設", - "about.disclaimer": "Mastodon是自由、開放原始碼ê軟體,mā是Mastodon gGmbH ê商標。", "about.domain_blocks.no_reason_available": "原因bē-tàng用", "about.domain_blocks.preamble": "Mastodon一般ē允准lí看別ê fediverse 服侍器來ê聯絡人kap hām用者交流。Tsiah ê 是本服侍器建立ê例外。", "about.domain_blocks.silenced.explanation": "Lí一般buē-tàng tuì tsit ê服侍器看用戶ê紹介kap內容,除非lí明白tshiau-tshuē á是跟tuè伊。", diff --git a/app/javascript/mastodon/locales/ne.json b/app/javascript/mastodon/locales/ne.json index ccc4e18b0c8..0e7831318bf 100644 --- a/app/javascript/mastodon/locales/ne.json +++ b/app/javascript/mastodon/locales/ne.json @@ -1,7 +1,6 @@ { "about.contact": "सम्पर्क:", "about.default_locale": "पूर्वनिर्धारित", - "about.disclaimer": "Mastodon नि:शुल्क, खुला स्रोत सफ्टवेयर, र Mastodon gGmbH को ट्रेडमार्क हो।", "about.domain_blocks.no_reason_available": "कारण उपलब्ध छैन", "about.domain_blocks.preamble": "Mastodon ले तपाइँलाई सामान्यतया फेडिभर्समा कुनै पनि अन्य सर्भरका सामग्री हेर्न र प्रयोगकर्ताहरूसँग अन्तरक्रिया गर्न दिन्छ। यी अपवादहरू हुन् जुन यस विशेष सर्भरमा बनाइएका छन्।", "about.domain_blocks.silenced.title": "सीमित", diff --git a/app/javascript/mastodon/locales/nl.json b/app/javascript/mastodon/locales/nl.json index 89e98a45535..1d71409ced2 100644 --- a/app/javascript/mastodon/locales/nl.json +++ b/app/javascript/mastodon/locales/nl.json @@ -2,7 +2,7 @@ "about.blocks": "Beperkte en opgeschorte servers", "about.contact": "Contact:", "about.default_locale": "Standaard", - "about.disclaimer": "Mastodon is vrije, opensourcesoftware en een handelsmerk van Mastodon gGmbH.", + "about.disclaimer": "Mastodon is vrije, opensourcesoftware en een handelsmerk van Mastodon GmbH.", "about.domain_blocks.no_reason_available": "Reden niet beschikbaar", "about.domain_blocks.preamble": "In het algemeen kun je met Mastodon berichten ontvangen van, en interactie hebben met gebruikers van elke server in de fediverse. Dit zijn de uitzonderingen die op deze specifieke server gelden.", "about.domain_blocks.silenced.explanation": "In het algemeen zie je geen berichten en accounts van deze server, tenzij je berichten expliciet opzoekt of ervoor kiest om een account van deze server te volgen.", @@ -646,6 +646,7 @@ "empty_column.account_unavailable": "Profiel is niet beschikbaar", "empty_column.blocks": "Je hebt nog geen gebruikers geblokkeerd.", "empty_column.bookmarked_statuses": "Jij hebt nog geen berichten aan je bladwijzers toegevoegd. Wanneer je er een aan jouw bladwijzers toevoegt, valt deze hier te zien.", + "empty_column.collections": "{acct} heeft nog geen verzamelingen aangemaakt.", "empty_column.collections.featured_in": "Je bent aan nog geen enkele verzameling toegevoegd.", "empty_column.collections.featured_in_undiscoverable": "Om ervoor te zorgen dat mensen je aan verzamelingen kunnen toevoegen, moet je jouw account en berichten laten uitlichten door Mastodon onder Instellingen > Privacy en bereik", "empty_column.community": "De lokale tijdlijn is nog leeg. Plaats een openbaar bericht om de spits af te bijten!", @@ -819,6 +820,12 @@ "keyboard_shortcuts.heading": "Sneltoetsen", "keyboard_shortcuts.home": "Starttijdlijn tonen", "keyboard_shortcuts.hotkey": "Sneltoets", + "keyboard_shortcuts.keys.alt": "Alt", + "keyboard_shortcuts.keys.backspace": "Backspace", + "keyboard_shortcuts.keys.enter": "Enter", + "keyboard_shortcuts.keys.esc": "Esc", + "keyboard_shortcuts.keys.page_down": "Page Down", + "keyboard_shortcuts.keys.page_up": "Page Up", "keyboard_shortcuts.legend": "Deze legenda tonen", "keyboard_shortcuts.load_more": "\"Meer laden\"-knop focussen", "keyboard_shortcuts.local": "Lokale tijdlijn tonen", @@ -1192,6 +1199,7 @@ "search_popout.user": "gebruiker", "search_results.accounts": "Accounts", "search_results.all": "Alles", + "search_results.collections": "Verzamelingen", "search_results.hashtags": "Hashtags", "search_results.no_results": "Geen resultaten.", "search_results.no_search_yet": "Probeer te zoeken naar berichten, profielen of hashtags.", diff --git a/app/javascript/mastodon/locales/nn.json b/app/javascript/mastodon/locales/nn.json index f95af7bb5de..924973e0b3a 100644 --- a/app/javascript/mastodon/locales/nn.json +++ b/app/javascript/mastodon/locales/nn.json @@ -2,7 +2,7 @@ "about.blocks": "Modererte tenarar", "about.contact": "Kontakt:", "about.default_locale": "Standard", - "about.disclaimer": "Mastodon er gratis programvare med open kjeldekode, og eit varemerke frå Mastodon gGmbH.", + "about.disclaimer": "Mastodon er gratis programvare med open kjeldekode, og eit varemerke frå Mastodon GmbH.", "about.domain_blocks.no_reason_available": "Årsaka er ikkje tilgjengeleg", "about.domain_blocks.preamble": "Mastodon gjev deg som regel lov til å sjå innhald og samhandla med brukarar frå alle andre tenarar i allheimen. Dette er unntaka som er valde for akkurat denne tenaren.", "about.domain_blocks.silenced.explanation": "Med mindre du leiter den opp eller fylgjer profiler på tenaren, vil du vanlegvis ikkje sjå profilar og innhald frå denne tenaren.", @@ -86,6 +86,7 @@ "account.locked_info": "Denne kontoen er privat. Eigaren kan sjølv velja kven som kan fylgja han.", "account.media": "Media", "account.mention": "Nemn @{name}", + "account.menu.add_to_collection": "Legg til i samling…", "account.menu.add_to_list": "Legg til liste…", "account.menu.block": "Blokker konto", "account.menu.block_domain": "Blokker {domain}", @@ -327,11 +328,15 @@ "annual_report.summary.share_on_mastodon": "Del på Mastodon", "attachments_list.unprocessed": "(ubehandla)", "audio.hide": "Gøym lyd", + "block_modal.no_collections": "Ingen av dykk kan leggja kvarandre til i samlingar. Viss de har samlingar der den andre er med, vil de bli automatisk fjerna derifrå.", "block_modal.remote_users_caveat": "Me vil be tenaren {domain} om å respektera di avgjerd. Me kan ikkje garantera at det vert gjort, sidan nokre tenarar kan handtera blokkering ulikt. Offentlege innlegg kan framleis vera synlege for ikkje-innlogga brukarar.", "block_modal.show_less": "Vis mindre", "block_modal.show_more": "Vis meir", + "block_modal.they_cant_mention": "De kan ikkje nemna, fylgja eller sitera kvarandre.", + "block_modal.they_cant_see_posts": "Dei kan ikkje sjå innhaldet ditt, og du vil ikkje sjå deira.", "block_modal.they_will_know": "Dei kan sjå at dei er blokkerte.", "block_modal.title": "Blokker brukaren?", + "block_modal.you_wont_see_mentions": "Du kjem ikkje til å sjå innlegg frå andre som nemner dei.", "boost_modal.combo": "Du kan trykkja {combo} for å hoppa over dette neste gong", "boost_modal.reblog": "Framhev innlegget?", "boost_modal.undo_reblog": "Fjern framhevinga?", @@ -357,12 +362,19 @@ "closed_registrations_modal.find_another_server": "Finn ein annan tenar", "closed_registrations_modal.preamble": "Mastodon er desentralisert, så uansett kvar du opprettar ein konto, vil du kunne fylgje og samhandle med alle på denne tenaren. Du kan til og med ha din eigen tenar!", "closed_registrations_modal.title": "Registrer deg på Mastodon", + "collection.share_modal.share_link_label": "Del lenka", "collection.share_modal.share_via_post": "Legg ut på Mastodon", "collection.share_modal.share_via_system": "Del med…", "collection.share_modal.title": "Del ei samling", "collection.share_modal.title_new": "Del den nye samlinga di!", + "collection.share_template_other": "Sjekk denne samlinga:", + "collection.share_template_own": "Sjekk den nye samlinga mi:", "collections.account_count": "{count, plural, one {# konto} other {# kontoar}}", + "collections.accounts.empty_description": "Legg til opp til {count} kontoar", + "collections.accounts.empty_editor_title": "Det er ingen i denne samlinga enno", "collections.accounts.empty_title": "Denne samlinga er tom", + "collections.add_to_collection": "Legg til {name} i samlingar", + "collections.block_collection_owner": "Blokker konto", "collections.by_account": "av {account_handle}", "collections.collection_description": "Skildring", "collections.collection_language": "Språk", @@ -372,6 +384,8 @@ "collections.confirm_account_removal": "Er du sikker på at du vil fjerna denne brukarkontoen frå samlinga?", "collections.content_warning": "Innhaldsåtvaring", "collections.continue": "Hald fram", + "collections.copy_link": "Kopier lenka", + "collections.copy_link_confirmation": "Kopierte samlingslenka til utklippstavla", "collections.create.accounts_title": "Kven vil du leggja vekt på denne samlinga?", "collections.create.basic_details_title": "Grunnleggjande opplysingar", "collections.create.steps": "Steg {step}/{total}", @@ -382,23 +396,50 @@ "collections.detail.loading": "Lastar inn samling…", "collections.detail.revoke_inclusion": "Fjern meg", "collections.detail.sensitive_content": "Ømtolig innhald", + "collections.detail.sensitive_note": "Skildringa og kontoane er kanskje ikkje høvelege for alle lesarar.", "collections.detail.share": "Del denne samlinga", "collections.detail.you_are_in_this_collection": "Du er framheva i denne samlinga", "collections.edit_details": "Rediger detaljar", + "collections.error_loading_collections": "Noko gjekk gale då me prøvde å lasta desse samlingane.", + "collections.hidden_accounts_description": "Du har blokkert eller dempa {count, plural, one {denne brukaren} other {desse brukarane}}", + "collections.hidden_accounts_link": "{count, plural, one {# gøymd konto} other {# gøymde kontoar}}", + "collections.hints.accounts_counter": "{count}/{max} kontoar", "collections.last_updated_at": "Sist oppdatert: {date}", + "collections.list.collections_with_count": "{count, plural, one {# samling} other {# samlingar}}", + "collections.list.created_by_author": "Oppretta av {name}", + "collections.list.created_by_you": "Oppretta av deg", + "collections.list.featuring_you": "Med deg", "collections.manage_accounts": "Handter kontoar", "collections.mark_as_sensitive": "Merk som ømtolig", "collections.mark_as_sensitive_hint": "Gøymer skildringa og kontoane i samlinga bak ei innhaldsåtvaring. Namnet på samlinga blir framleis synleg.", + "collections.maximum_collection_count_description": "Tenaren din tillèt opp til {count} samlingar.", + "collections.maximum_collection_count_reached": "Du har nådd grensa for kor mange samlingar du kan ha", "collections.name_length_hint": "Maks 40 teikn", "collections.new_collection": "Ny samling", + "collections.pending_accounts.message": "Kontoar kan ha ventestatus når dei ventar på svar frå brukaren eller tenaren deira. Berre du kan sjå ventande kontoar.", + "collections.pending_accounts.title": "Kvifor ser eg ventande kontoar?", + "collections.remove_account": "Fjern", "collections.report_collection": "Rapporter denne samlinga", "collections.revoke_collection_inclusion": "Fjern meg frå denne samlinga", "collections.revoke_inclusion.confirmation": "Du er fjerna frå «{collection}»", "collections.revoke_inclusion.error": "Noko gjekk gale, prøv att seinare.", + "collections.search_accounts_label": "Søk etter ein brukarkonto å leggja til", "collections.search_accounts_max_reached": "Du har nådd grensa for kor mange kontoar du kan leggja til", "collections.sensitive": "Ømtolig", + "collections.share_short": "Del", + "collections.sort_alphabetical": "Alfabetisk", + "collections.sort_by": "Sorter etter:", + "collections.sort_date_added": "Dato lagt til", + "collections.sort_last_active": "Sist aktiv", + "collections.sort_most_followers": "Flest fylgjarar", + "collections.suggestions.can_not_add": "Kan ikkje leggjast til", + "collections.suggestions.can_not_add_desc": "Desse kontoane har kanskje valt å ikkje bli oppdaga, eller dei kan vera på ein tenar som ikkje støttar samlingar.", + "collections.suggestions.must_follow": "Må fylgja fyrst", + "collections.suggestions.must_follow_desc": "Desse kontoane går gjennom alle som vil fylgja dei. Fylgjarar kan leggja dei til i samlingar.", "collections.topic_hint": "Legg til ein emneknagg som hjelper andre å forstå hovudemnet for denne samlinga.", "collections.topic_special_chars_hint": "Spesialteikn vil bli fjerna ved lagring", + "collections.unlisted_collections_description": "Desse syner ikkje på på profilen din til andre. Alle med lenka kan oppdaga dei.", + "collections.unlisted_collections_with_count": "Ulista samlingar ({count})", "collections.view_collection": "Sjå samlinga", "collections.visibility_public": "Offentleg", "collections.visibility_public_hint": "Kan koma opp i søkjeresultat og andre stader der tilrådingar syner.", @@ -424,8 +465,10 @@ "column.lists": "Lister", "column.mutes": "Målbundne brukarar", "column.notifications": "Varsel", + "column.other_collections": "Samlingar av {name}", "column.pins": "Festa tut", "column.public": "Samla tidsline", + "column.your_collections": "Samlingane dine", "column_back_button.label": "Attende", "column_header.hide_settings": "Gøym innstillingane", "column_header.moveLeft_settings": "Flytt kolonne til venstre", @@ -490,6 +533,10 @@ "confirmations.follow_to_list.confirm": "Fylg og legg til lista", "confirmations.follow_to_list.message": "Du må fylgja {name} for å leggja dei til ei liste.", "confirmations.follow_to_list.title": "Vil du fylgja brukaren?", + "confirmations.hide_featured_tab.confirm": "Gøym fana", + "confirmations.hide_featured_tab.intro": "Du kan endra dette når som helst under Rediger profil > Innstillingar for profilfane.", + "confirmations.hide_featured_tab.message": "Dette gøymer fana for folk på {serverName} og andre tenarar som køyrer siste utgåva av Mastodon. Andre stader kan visinga variera.", + "confirmations.hide_featured_tab.title": "Gøym «framheva»-fana?", "confirmations.logout.confirm": "Logg ut", "confirmations.logout.message": "Er du sikker på at du vil logga ut?", "confirmations.logout.title": "Logg ut?", @@ -537,6 +584,12 @@ "copy_icon_button.copy_this_text": "Kopier til utklippstavla", "copypaste.copied": "Kopiert", "copypaste.copy_to_clipboard": "Kopier til utklippstavla", + "custom_homepage.about": "Om", + "custom_homepage.about_this_server": "Om denne tenaren", + "custom_homepage.administered_by": "Administrert av", + "custom_homepage.contact": "Kontakt:", + "custom_homepage.latest_activity": "Siste aktivitet", + "custom_homepage.these_are_the_latest_posts": "Her er dei siste 40 innlegga frå folk på denne tenaren.", "directory.federated": "Frå den kjende allheimen", "directory.local": "Berre frå {domain}", "directory.new_arrivals": "Nyleg tilkomne", @@ -581,7 +634,11 @@ "emoji_button.search_results": "Søkeresultat", "emoji_button.symbols": "Symbol", "emoji_button.travel": "Reise & stader", + "empty_column.account_featured.other": "{acct} har ikkje valt ut noko enno.", "empty_column.account_featured_self.no_collections_button": "Lag ei samling", + "empty_column.account_featured_self.no_collections_hide_tab": "Gøym denne fana i staden", + "empty_column.account_featured_self.showcase_accounts": "Syn fram favorittkontoane dine", + "empty_column.account_featured_self.showcase_accounts_desc": "Samlingar er handlaga lister over folk for å hjelpa andre å oppdaga meir av Allheimen.", "empty_column.account_featured_unknown.other": "Denne kontoen har ikkje valt ut noko enno.", "empty_column.account_hides_collections": "Denne brukaren har valt å ikkje gjere denne informasjonen tilgjengeleg", "empty_column.account_suspended": "Kontoen er utestengd", @@ -589,6 +646,8 @@ "empty_column.account_unavailable": "Profil ikkje tilgjengeleg", "empty_column.blocks": "Du har ikkje blokkert nokon enno.", "empty_column.bookmarked_statuses": "Du har ikkje lagra noko bokmerke enno. Når du set bokmerke på eit innlegg, dukkar det opp her.", + "empty_column.collections.featured_in": "Du er ikkje lagt til i nokon samlingar enno.", + "empty_column.collections.featured_in_undiscoverable": "For at folk skal kunna leggja deg til i samlingar, må du gje dei løyve til å oppdaga deg i Innstillingar > Personvern og rekkjevidd", "empty_column.community": "Den lokale tidslina er tom. Skriv noko offentleg å få ballen til å rulle!", "empty_column.direct": "Du har ingen private omtaler enda. Etter du har sendt eller mottatt en, så vil den dukke opp her.", "empty_column.disabled_feed": "Administratorane på tenaren din har skrudd av denne straumen.", @@ -734,6 +793,7 @@ "info_button.label": "Hjelp", "info_button.what_is_alt_text": "

Kva er alternativ tekst?

Alternativ eller skildrande tekst gjev ei skildring av biletet for menneske som har synsvanskar, sein nettilkopling eller dei som ser etter ekstra innhald.

Du gjer innhaldet ditt meir tilgjengeleg og forståeleg for alle ved å skriva klåre, presise og nøytrale alt-tekstar.

  • Skriv om viktige element
  • Oppsummer tekst i bilete
  • Skriv vanlege setningar
  • Unngå unyttige opplysingar
  • Legg vekt på hovudpunkta i innhaldsrike visuelle element, som grafar eller kart
", "interaction_modal.action": "For å handla med innlegget til {name}, må du logga inn på den Mastodon-tenaren du bruker.", + "interaction_modal.action_follow": "For å fylgja {name}, må du logga inn på den Mastodon-tenaren du bruker.", "interaction_modal.go": "Gå", "interaction_modal.no_account_yet": "Har du ikkje ein konto enno?", "interaction_modal.on_another_server": "På ein annan tenar", @@ -790,6 +850,7 @@ "lightbox.zoom_in": "Zoom til faktisk storleik", "lightbox.zoom_out": "Vis heile", "limited_account_hint.action": "Vis profilen likevel", + "limited_account_hint.title": "Moderatorane på {domain} har gøymt denne brukarprofilen eller tenaren.", "link_preview.author": "Av {name}", "link_preview.more_from_author": "Meir frå {name}", "link_preview.shares": "{count, plural,one {{counter} innlegg} other {{counter} innlegg}}", @@ -851,6 +912,7 @@ "navigation_bar.live_feed_local": "Direktestraum (lokal)", "navigation_bar.live_feed_public": "Direktestraum (allheimen)", "navigation_bar.logout": "Logg ut", + "navigation_bar.main": "Hovudmeny", "navigation_bar.moderation": "Moderering", "navigation_bar.more": "Meir", "navigation_bar.mutes": "Målbundne brukarar", @@ -864,6 +926,7 @@ "navigation_panel.expand_followed_tags": "Utvid menyen over emneknaggar du fylgjer", "navigation_panel.expand_lists": "Utvid listemenyen", "not_signed_in_indicator.not_signed_in": "Du må logga inn for å få tilgang til denne ressursen.", + "notification.added_to_collection": "{name} la deg til i ei samling", "notification.admin.report": "{name} rapporterte {target}", "notification.admin.report_account": "{name} rapporterte {count, plural, one {eitt innlegg} other {# innlegg}} frå {target} for {category}", "notification.admin.report_account_other": "{name} rapporterte {count, plural, one {eitt innlegg} other {# innlegg}} frå {target}", @@ -873,6 +936,7 @@ "notification.admin.sign_up.name_and_others": "{name} og {count, plural, one {# annan} other {# andre}} vart med", "notification.annual_report.message": "#Året ditt for {year} ventar! Sjå kva som skjedde i løpet av Mastodon-året ditt!", "notification.annual_report.view": "Sjå #Året ditt", + "notification.collection_update": "{name} redigerte ei samling du er med i", "notification.favourite": "{name} markerte innlegget ditt som favoritt", "notification.favourite.name_and_others_with_link": "{name} og {count, plural, one {# annan} other {# andre}} favorittmerka innlegget ditt", "notification.favourite_pm": "{name} favorittmerka den private omtalen din", @@ -934,6 +998,7 @@ "notifications.column_settings.admin.report": "Nye rapportar:", "notifications.column_settings.admin.sign_up": "Nyleg registrerte:", "notifications.column_settings.alert": "Skrivebordsvarsel", + "notifications.column_settings.collections": "Samlingar:", "notifications.column_settings.favourite": "Favorittar:", "notifications.column_settings.filter_bar.advanced": "Vis alle kategoriar", "notifications.column_settings.filter_bar.category": "Snøggfilterline", @@ -953,6 +1018,7 @@ "notifications.column_settings.update": "Redigeringar:", "notifications.filter.all": "Alle", "notifications.filter.boosts": "Framhevingar", + "notifications.filter.collections": "Samlingar", "notifications.filter.favourites": "Favorittar", "notifications.filter.follows": "Fylgjer", "notifications.filter.mentions": "Omtalar", @@ -1136,6 +1202,7 @@ "server_banner.active_users": "aktive brukarar", "server_banner.administered_by": "Administrert av:", "server_banner.is_one_of_many": "{domain} er ein av dei mange uavhengige Mastodon-tenarane du kan bruka til å delta i Allheimen.", + "server_banner.more_about_this_server": "Meir om denne tenaren", "server_banner.server_stats": "Tenarstatistikk:", "sign_in_banner.create_account": "Opprett konto", "sign_in_banner.follow_anyone": "Fylg kven som helst på tvers av Allheimen og sjå alt i kronologisk rekkjefylgje. Ingen algoritmar, reklame eller klikkfeller.", @@ -1245,6 +1312,7 @@ "tabs_bar.menu": "Meny", "tabs_bar.notifications": "Varsel", "tabs_bar.publish": "Nytt innlegg", + "tabs_bar.quick_links": "Hurtiglenkjer", "tabs_bar.search": "Søk", "tag.remove": "Fjern", "terms_of_service.effective_as_of": "I kraft frå {date}", diff --git a/app/javascript/mastodon/locales/no.json b/app/javascript/mastodon/locales/no.json index afb565e3c47..0761a9e9843 100644 --- a/app/javascript/mastodon/locales/no.json +++ b/app/javascript/mastodon/locales/no.json @@ -2,7 +2,6 @@ "about.blocks": "Modererte servere", "about.contact": "Kontakt:", "about.default_locale": "Standard", - "about.disclaimer": "Mastodon er gratis, åpen kildekode-programvare og et varemerke fra Mastodon gGmbH.", "about.domain_blocks.no_reason_available": "Årsak ikke tilgjengelig", "about.domain_blocks.preamble": "Mastodon lar deg normalt sett se innholdet fra og samhandle med brukere fra enhver annen server i fødiverset. Dette er unntakene som har blitt lagt inn på denne serveren.", "about.domain_blocks.silenced.explanation": "Du vil vanligvis ikke se profiler og innhold fra denne serveren, med mindre du eksplisitt søker dem opp eller velger å følge dem.", diff --git a/app/javascript/mastodon/locales/oc.json b/app/javascript/mastodon/locales/oc.json index 400f14ba0c1..deb5d449626 100644 --- a/app/javascript/mastodon/locales/oc.json +++ b/app/javascript/mastodon/locales/oc.json @@ -2,7 +2,6 @@ "about.blocks": "Servidors moderats", "about.contact": "Contacte :", "about.default_locale": "Per defaut", - "about.disclaimer": "Mastodon es gratuit, un logicial libre e una marca de Mastodon gGmbH.", "about.domain_blocks.no_reason_available": "Rason pas disponibla", "about.domain_blocks.silenced.title": "Limitats", "about.domain_blocks.suspended.title": "Suspenduts", diff --git a/app/javascript/mastodon/locales/pa.json b/app/javascript/mastodon/locales/pa.json index 5dcbc67c43b..2a35a00f95c 100644 --- a/app/javascript/mastodon/locales/pa.json +++ b/app/javascript/mastodon/locales/pa.json @@ -1,7 +1,6 @@ { "about.contact": "ਸੰਪਰਕ:", "about.default_locale": "ਮੂਲ", - "about.disclaimer": "ਮਸਟੋਡੋਨ ਇੱਕ ਆਜ਼ਾਦ, ਖੁੱਲ੍ਹੇ ਸਰੋਤ ਵਾਲਾ ਸਾਫਟਵੇਅਰ ਹੈ ਅਤੇ Mastodon gGmbH ਦਾ ਮਾਰਕਾ ਹੈ।", "about.domain_blocks.no_reason_available": "ਕਾਰਨ ਮੌਜੂਦ ਨਹੀਂ ਹੈ", "about.domain_blocks.silenced.title": "ਸੀਮਿਤ", "about.domain_blocks.suspended.title": "ਸਸਪੈਂਡ ਕੀਤਾ", diff --git a/app/javascript/mastodon/locales/pl.json b/app/javascript/mastodon/locales/pl.json index 4756b753eb6..14865249e7e 100644 --- a/app/javascript/mastodon/locales/pl.json +++ b/app/javascript/mastodon/locales/pl.json @@ -2,7 +2,7 @@ "about.blocks": "Serwery moderowane", "about.contact": "Kontakt:", "about.default_locale": "Domyślny", - "about.disclaimer": "Mastodon jest darmowym, otwartym oprogramowaniem i znakiem towarowym Mastodon gGmbH.", + "about.disclaimer": "Mastodon to wolne oprogramowanie o otwartym kodzie źródłowym, będące znakiem towarowym Mastodon GmbH.", "about.domain_blocks.no_reason_available": "Powód niedostępny", "about.domain_blocks.preamble": "Domyślnie Mastodon pozwala ci przeglądać i reagować na treści od innych użytkowników z jakiegokolwiek serwera w fediwersum. Poniżej znajduje się lista wyjątków, które zostały stworzone na tym konkretnym serwerze.", "about.domain_blocks.silenced.explanation": "Zazwyczaj nie zobaczysz profili i treści z tego serwera, chyba że wyraźnie go poszukasz lub zdecydujesz się go obserwować.", @@ -127,6 +127,9 @@ "account.unmute": "Nie wyciszaj @{name}", "account.unmute_notifications_short": "Nie wyciszaj powiadomień", "account.unmute_short": "Nie wyciszaj", + "account_edit.advanced_settings.bot_hint": "To konto wykonuje głównie zautomatyzowane działania i może nie być monitorowane", + "account_edit.advanced_settings.bot_label": "Konto prowadzone przez bota", + "account_edit.advanced_settings.title": "Ustawienia zaawansowane", "account_edit.bio.add_label": "Szczegóły profilu", "account_edit.bio.edit_label": "Edytuj szczegóły profilu", "account_edit.bio.placeholder": "Dodaj krótkie wprowadzenie, aby pomóc innym zidentyfikować cię.", @@ -171,6 +174,18 @@ "account_edit.image_edit.remove_button": "Usuń obraz", "account_edit.image_edit.replace_button": "Zastąp obraz", "account_edit.profile_tab.button_label": "Dostosuj", + "account_edit.profile_tab.hint.description": "Te ustawienia wpływają na to, co użytkownicy widzą na {server} w oficjalnych aplikacjach, ale mogą nie obowiązywać na innych serwerach i w aplikacjach zewnętrznych.", + "account_edit.profile_tab.hint.title": "Wyświetlanie może się różnić", + "account_edit.profile_tab.show_featured.description": "\"Wyróżnione\" to opcjonalna zakładka, na której możesz wyświetlać inne konta.", + "account_edit.profile_tab.show_featured.title": "Pokaż zakładkę \"Wyróżnione\"", + "account_edit.profile_tab.show_media.description": "\"Multimedia\" jest opcjonalną zakładką, która wyświetla Twoje wpisy zawierające zdjęcia lub filmy.", + "account_edit.profile_tab.show_media.title": "Pokaż zakładkę \"Multimedia\"", + "account_edit.profile_tab.show_media_replies.description": "Po włączeniu zakładka Multimedia pokazuje zarówno Twoje wpisy, jak i odpowiedzi na wpisy innych osób.", + "account_edit.profile_tab.show_media_replies.title": "Uwzględniaj odpowiedzi w zakładce \"Multimedia\"", + "account_edit.profile_tab.show_relations.description": "Pokazuje innym użytkownikom konta, które obserwujesz oraz Twoich obserwujących w Twoim profilu. Inni użytkownicy nadal będą mogli zobaczyć, czy ich obserwujesz.", + "account_edit.profile_tab.show_relations.title": "Pokaż \"Obserwujących\" i \"Obserwowanych\"", + "account_edit.profile_tab.subtitle": "Dostosuj wygląd i układ swojego profilu.", + "account_edit.profile_tab.title": "Ustawienia wyświetlania profilu", "account_edit.save": "Zapisz", "account_edit.upload_modal.back": "Wstecz", "account_edit.upload_modal.done": "Gotowe", @@ -258,6 +273,7 @@ "closed_registrations_modal.find_another_server": "Znajdź inny serwer", "closed_registrations_modal.preamble": "Mastodon jest zdecentralizowany, więc bez względu na to, gdzie się zarejestrujesz, będziesz w stanie obserwować i wchodzić w interakcje z innymi osobami na tym serwerze. Możesz nawet uruchomić własny serwer!", "closed_registrations_modal.title": "Rejestracja na Mastodonie", + "collections.last_updated_at": "Ostatnia aktualizacja: {date}", "column.about": "O serwerze", "column.blocks": "Zablokowani", "column.bookmarks": "Zakładki", @@ -335,6 +351,7 @@ "confirmations.follow_to_list.confirm": "Obserwuj i dodaj do listy", "confirmations.follow_to_list.message": "Musisz obserwować {name}, aby dodać do listy.", "confirmations.follow_to_list.title": "Zaobserwować?", + "confirmations.hide_featured_tab.title": "Ukryć zakładkę \"Wyróżnione\"?", "confirmations.logout.confirm": "Wyloguj", "confirmations.logout.message": "Czy na pewno chcesz się wylogować?", "confirmations.logout.title": "Wylogować?", @@ -488,6 +505,9 @@ "follow_suggestions.view_all": "Pokaż wszystkie", "follow_suggestions.who_to_follow": "Kogo warto obserwować", "followed_tags": "Obserwowane hasztagi", + "followers.title": "Obserwujący {name}", + "following.hide_other_following": "Ten użytkownik ukrył pozostałe obserwowane konta", + "following.title": "Obserwowani przez {name}", "footer.about": "O serwerze", "footer.about_mastodon": "O Mastodonie", "footer.about_server": "O {domain}", @@ -650,6 +670,7 @@ "navigation_bar.automated_deletion": "Automatyczne usuwanie postów", "navigation_bar.blocks": "Zablokowani", "navigation_bar.bookmarks": "Zakładki", + "navigation_bar.collections": "Kolekcje", "navigation_bar.direct": "Wzmianki bezpośrednie", "navigation_bar.domain_blocks": "Zablokowane domeny", "navigation_bar.favourites": "Polubione", @@ -745,6 +766,7 @@ "notifications.column_settings.admin.report": "Nowe zgłoszenia:", "notifications.column_settings.admin.sign_up": "Nowo zarejestrowani:", "notifications.column_settings.alert": "Powiadomienia na pulpicie", + "notifications.column_settings.collections": "Kolekcje:", "notifications.column_settings.favourite": "Polubione:", "notifications.column_settings.filter_bar.advanced": "Wyświetl wszystkie kategorie", "notifications.column_settings.filter_bar.category": "Szybkie filtrowanie", @@ -764,6 +786,7 @@ "notifications.column_settings.update": "Edycje:", "notifications.filter.all": "Wszystkie", "notifications.filter.boosts": "Podbicia", + "notifications.filter.collections": "Kolekcje", "notifications.filter.favourites": "Polubione", "notifications.filter.follows": "Obserwacje", "notifications.filter.mentions": "Wzmianki", @@ -828,6 +851,7 @@ "privacy.private.short": "Obserwujący", "privacy.public.long": "Każdy na i poza Mastodon", "privacy.public.short": "Publiczny", + "privacy.quote.anyone": "{visibility}, każdy może cytować", "privacy.quote.disabled": "{visibility}, cytaty wyłączone", "privacy.quote.limited": "{visibility}, cytaty ograniczone", "privacy.unlisted.additional": "Dostępny podobnie jak wpis publiczny, ale nie będzie widoczny w aktualnościach, hashtagach ani wyszukiwarce Mastodon, nawet jeśli twoje konto jest widoczne.", diff --git a/app/javascript/mastodon/locales/pt-BR.json b/app/javascript/mastodon/locales/pt-BR.json index c8b24dcd1be..8e60ac6a494 100644 --- a/app/javascript/mastodon/locales/pt-BR.json +++ b/app/javascript/mastodon/locales/pt-BR.json @@ -2,7 +2,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.disclaimer": "Mastodon é um software grátis de código aberto, também é marca registrada de Mastodon GmbH.", "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.", "about.domain_blocks.silenced.explanation": "Você geralmente não verá perfis e conteúdo deste servidor, a menos que você o procure explicitamente ou opte por seguir.", @@ -646,6 +646,7 @@ "empty_column.account_unavailable": "Perfil indisponível", "empty_column.blocks": "Nada aqui.", "empty_column.bookmarked_statuses": "Nada aqui. Quando você salvar uma publicação, ela aparecerá aqui.", + "empty_column.collections": "{acct} não criou nenhuma coleção ainda.", "empty_column.collections.featured_in": "Você ainda não foi adicionado a uma coleção.", "empty_column.collections.featured_in_undiscoverable": "Para as pessoas adicionarem você às coleções, você precisa permitir destaque de experiências de descoberta através de Preferências > Privacidade e alcance", "empty_column.community": "A linha local está vazia. Publique algo para começar!", @@ -787,19 +788,19 @@ "ignore_notifications_modal.ignore": "Ignorar notificações", "ignore_notifications_modal.limited_accounts_title": "Ignorar notificações de contas moderadas?", "ignore_notifications_modal.new_accounts_title": "Ignorar notificações de novas contas?", - "ignore_notifications_modal.not_followers_title": "Ignorar notificações de pessoas que não seguem você?", + "ignore_notifications_modal.not_followers_title": "Ignorar notificações de pessoas que não o sigam?", "ignore_notifications_modal.not_following_title": "Ignorar notificações de pessoas que você não segue?", "ignore_notifications_modal.private_mentions_title": "Ignorar notificações de menções privadas não solicitadas?", "info_button.label": "Ajuda", - "info_button.what_is_alt_text": "

O que é texto alternativo?

O texto alternativo fornece descrições de imagens para pessoas com deficiências visuais, conexões de internet de baixa largura de banda ou aquelas que buscam mais contexto.

Você pode melhorar a acessibilidade e a compreensão para todos escrevendo texto alternativo claro, conciso e objetivo.

  • Capture elementos importantes
  • Resuma textos em imagens
  • Use estrutura de frases regular
  • Evite informações redundantes
  • Foque em tendências e descobertas principais em visuais complexos (como diagramas ou mapas)
", - "interaction_modal.action": "Para interagir com o post de {name}, você precisa entrar em sua conta em qualquer servidor Mastodon que você use.", - "interaction_modal.action_follow": "Para seguir {name}, você deve fazer login em sua conta em auqlquer servidor Mastodon que você use.", + "info_button.what_is_alt_text": "

O que é texto alternativo?

O texto alternativo descreve imagens para pessoas com deficiências visuais, conexões lentas ou para quem necessita de contexto adicional.

Você pode melhorar a acessibilidade e compreensão de todos escrevendo um texto alternativo claro, conciso e objetivo.

  • Capture elementos importantes
  • Resuma o texto das imagens
  • Use uma estrutura regular de frases
  • Evite informações redundantes
  • Foque em tendências e buscas em visuais complexos (como diagramas e mapas)
", + "interaction_modal.action": "Para interagir com a publicação de {name}, você precisa registrar em sua conta em qualquer servidor do Mastodon.", + "interaction_modal.action_follow": "Para seguir {name}, você precisa registrar em sua conta em qualquer servidor do Mastodon.", "interaction_modal.go": "Ir", - "interaction_modal.no_account_yet": "Não possui uma conta ainda?", + "interaction_modal.no_account_yet": "Não tem uma conta ainda?", "interaction_modal.on_another_server": "Em um servidor diferente", "interaction_modal.on_this_server": "Neste servidor", - "interaction_modal.title": "Faça login para continuar", - "interaction_modal.username_prompt": "p. e.x.: {example}", + "interaction_modal.title": "Registre-se para continuar", + "interaction_modal.username_prompt": "Por exemplo: {example}", "intervals.full.days": "{number, plural, one {# dia} other {# dias}}", "intervals.full.hours": "{number, plural, one {# hora} other {# horas}}", "intervals.full.minutes": "{number, plural, one {# minuto} other {# minutos}}", @@ -812,15 +813,21 @@ "keyboard_shortcuts.direct": "Abrir coluna de menções privadas", "keyboard_shortcuts.down": "mover para baixo", "keyboard_shortcuts.enter": "Abrir publicação", - "keyboard_shortcuts.explore": "Abrir linha do tempo atual", + "keyboard_shortcuts.explore": "Abrir timeline em alta", "keyboard_shortcuts.favourite": "Favoritar publicação", "keyboard_shortcuts.favourites": "Abrir lista de favoritos", "keyboard_shortcuts.federated": "abrir linha global", "keyboard_shortcuts.heading": "Atalhos de teclado", "keyboard_shortcuts.home": "abrir página inicial", "keyboard_shortcuts.hotkey": "Atalho", + "keyboard_shortcuts.keys.alt": "Alt", + "keyboard_shortcuts.keys.backspace": "Backspace", + "keyboard_shortcuts.keys.enter": "Enter", + "keyboard_shortcuts.keys.esc": "Esc", + "keyboard_shortcuts.keys.page_down": "Page Down", + "keyboard_shortcuts.keys.page_up": "Page Up", "keyboard_shortcuts.legend": "mostrar estes atalhos", - "keyboard_shortcuts.load_more": "Focar \"Carregar mais\" botão", + "keyboard_shortcuts.load_more": "Focar no botão de Carregar mais", "keyboard_shortcuts.local": "abrir linha local", "keyboard_shortcuts.mention": "mencionar usuário", "keyboard_shortcuts.muted": "abrir usuários silenciados", @@ -839,7 +846,7 @@ "keyboard_shortcuts.toggle_sensitivity": "mostrar/ocultar mídia", "keyboard_shortcuts.toot": "Começar nova publicação", "keyboard_shortcuts.top": "Mover para o topo da lista", - "keyboard_shortcuts.translate": "para traduzir um post", + "keyboard_shortcuts.translate": "para traduzir uma publicação", "keyboard_shortcuts.unfocus": "Desfocar da área de composição/busca", "keyboard_shortcuts.up": "mover para cima", "learn_more_link.got_it": "Entendido", @@ -916,29 +923,29 @@ "navigation_bar.moderation": "Moderação", "navigation_bar.more": "Mais", "navigation_bar.mutes": "Usuários silenciados", - "navigation_bar.opened_in_classic_interface": "Publicações, contas e outras páginas específicas são abertas por padrão na interface 'web' clássica.", + "navigation_bar.opened_in_classic_interface": "As publicações, contas e outras páginas são abertas por padrão na interface web clássica.", "navigation_bar.preferences": "Preferências", "navigation_bar.privacy_and_reach": "Privacidade e alcance", "navigation_bar.search": "Buscar", "navigation_bar.search_trends": "Busca / Em alta", - "navigation_panel.collapse_followed_tags": "Recolher menu de hashtags seguidas", - "navigation_panel.collapse_lists": "Fechar lista de menu", - "navigation_panel.expand_followed_tags": "Expandir o menu de hashtags seguidas", - "navigation_panel.expand_lists": "Expandir lista de menu", - "not_signed_in_indicator.not_signed_in": "Você precisa se autenticar para acessar este recurso.", - "notification.added_to_collection": "{name} te adicionou a uma coleção", + "navigation_panel.collapse_followed_tags": "Recolher hashtags seguidas", + "navigation_panel.collapse_lists": "Recolher menu da lista", + "navigation_panel.expand_followed_tags": "Expandir hashtags seguidas", + "navigation_panel.expand_lists": "Expandir menu da lista", + "not_signed_in_indicator.not_signed_in": "É necessário registrar para acessar este recurso.", + "notification.added_to_collection": "{name} adicionou você a uma coleção", "notification.admin.report": "{name} denunciou {target}", "notification.admin.report_account": "{name} denunciou {count, plural, one {uma publicação} other {# publicações}} de {target} para {category}", "notification.admin.report_account_other": "{name} denunciou {count, plural, one {uma publicação} other {# publicações}} de {target}", - "notification.admin.report_statuses": "{name} Reportou {target} para {category}", + "notification.admin.report_statuses": "{name} denunciou {target} para {category}", "notification.admin.report_statuses_other": "{name} denunciou {target}", - "notification.admin.sign_up": "{name} se inscreveu", - "notification.admin.sign_up.name_and_others": "{name} e {count, plural, one {# outro} other {# outros}} se inscreveram", - "notification.annual_report.message": "O seu #Wrapstodon de {year} está esperando! Desvende seus destaques do ano e momentos memoráveis no Mastodon!", - "notification.annual_report.view": "Ver #Wrapstodon", + "notification.admin.sign_up": "{name} registrou-se", + "notification.admin.sign_up.name_and_others": "{name} e {count, plural, one {# other} other {# outros}}", + "notification.annual_report.message": "O #Wrapstodon de {year} lhe aguarda! Desvende seus destaques e momentos memoráveis do ano no Mastodon!", + "notification.annual_report.view": "Conferir #Wrapstodon", "notification.collection_update": "{name} editou uma coleção em que você está", "notification.favourite": "{name} favoritou sua publicação", - "notification.favourite.name_and_others_with_link": "{name} e {count, plural, one {# outro} other {# others}} favoritaram a publicação", + "notification.favourite.name_and_others_with_link": "{name} e {count, plural, one {# outro} other {# outros}} favoritam sua publicação", "notification.favourite_pm": "{name} favoritou sua menção privada", "notification.favourite_pm.name_and_others_with_link": "{name} e {count, plural, one {# outro} other {# outros}} favoritaram sua menção privada", "notification.follow": "{name} te seguiu", @@ -948,45 +955,45 @@ "notification.label.mention": "Menção", "notification.label.private_mention": "Menção privada", "notification.label.private_reply": "Resposta privada", - "notification.label.quote": "{name} Citou a sua publicação", + "notification.label.quote": "{name} citou sua publicação", "notification.label.reply": "Resposta", "notification.mention": "Menção", - "notification.mentioned_you": "{name} te mencionou", - "notification.moderation-warning.learn_more": "Aprender mais", + "notification.mentioned_you": "{name} mencionou você", + "notification.moderation-warning.learn_more": "Saiba mais", "notification.moderation_warning": "Você recebeu um aviso de moderação", - "notification.moderation_warning.action_delete_statuses": "Algumas das suas publicações foram removidas.", + "notification.moderation_warning.action_delete_statuses": "Algumas publicações suas foram removidas.", "notification.moderation_warning.action_disable": "Sua conta foi desativada.", - "notification.moderation_warning.action_mark_statuses_as_sensitive": "Algumas de suas publicações foram marcadas por ter conteúdo sensível.", + "notification.moderation_warning.action_mark_statuses_as_sensitive": "Algumas publicações suas foram marcadas como sensíveis.", "notification.moderation_warning.action_none": "Sua conta recebeu um aviso de moderação.", "notification.moderation_warning.action_sensitive": "Suas publicações serão marcadas como sensíveis a partir de agora.", "notification.moderation_warning.action_silence": "Sua conta foi limitada.", "notification.moderation_warning.action_suspend": "Sua conta foi suspensa.", "notification.own_poll": "Sua enquete terminou", - "notification.poll": "Uma enquete que você votou terminou", - "notification.quoted_update": "{name} editou uma pulicação que você citou", + "notification.poll": "Uma enquete que você votou encerrou", + "notification.quoted_update": "{name} editou uma publicação que você citou", "notification.reblog": "{name} impulsionou sua publicação", - "notification.reblog.name_and_others_with_link": "{name} e {count, plural, one {# outra} other {# outras}} impulsionaram a publicação", + "notification.reblog.name_and_others_with_link": "{name} e {count, plural, one {# outro} other {# outros}} impulsionaram sua publicação", "notification.relationships_severance_event": "Conexões perdidas com {name}", - "notification.relationships_severance_event.account_suspension": "Um administrador de {from} suspendeu {target}, o que significa que você não pode mais receber atualizações deles ou interagir com eles.", - "notification.relationships_severance_event.domain_block": "An admin from {from} has blocked {target}, including {followersCount} of your followers and {followingCount, plural, one {# account} other {# accounts}} you follow.", - "notification.relationships_severance_event.learn_more": "Saber mais", - "notification.relationships_severance_event.user_domain_block": "You have blocked {target}, removing {followersCount} of your followers and {followingCount, plural, one {# account} other {# accounts}} you follow.", + "notification.relationships_severance_event.account_suspension": "Um administrador de {from} suspendeu {target}, significando que você não receberá mais atualizações ou poderá interagir com ele.", + "notification.relationships_severance_event.domain_block": "Um administrador de {from} bloqueou {target}, incluindo {followersCount} de seus seguidores e {followingCount, plural, one {# conta} other {# contas}} que você segue.", + "notification.relationships_severance_event.learn_more": "Saiba mais", + "notification.relationships_severance_event.user_domain_block": "Você bloqueou {target}, removendo {followersCount} de seus seguidores e {followingCount, plural, one {# conta} other {# contas}} que você segue.", "notification.status": "{name} acabou de publicar", "notification.update": "{name} editou uma publicação", "notification_requests.accept": "Aceitar", - "notification_requests.accept_multiple": "{count, plural, one {Aceite # pedido…} other {Aceite # pedidos…}}", - "notification_requests.confirm_accept_multiple.button": "{count, plural, one {Aceite # pedido} other {Aceite # pedidos}}", - "notification_requests.confirm_accept_multiple.message": "Você está prestes a aceitar {count, plural, one {um pedido de notificação} other {# pedidos de notificação}}. Tem certeza de que deseja continuar?", - "notification_requests.confirm_accept_multiple.title": "Aceitar solicitações de notificação?", - "notification_requests.confirm_dismiss_multiple.button": "{count, plural, one {Dispensar pedido} other {Dispensar pedidos}}", - "notification_requests.confirm_dismiss_multiple.message": "Você está prestes a descartar {count, plural, one {um pedido de notificação} other {# pedidos de notificação}}. Você não será capaz de acessar facilmente{count, plural, one {} other {}} novamente. Tem certeza de que deseja continuar?", - "notification_requests.confirm_dismiss_multiple.title": "Descartar solicitações de notificação?", + "notification_requests.accept_multiple": "{count, plural, one {Aceitar # pedido…} other {Aceitar # pedidos…}}", + "notification_requests.confirm_accept_multiple.button": "{count, plural, one {Aceitar pedido} other {Aceitar pedidos}}", + "notification_requests.confirm_accept_multiple.message": "Você está prestes a aceitar {count, plural, one {um pedido de notificação} other {# pedidos de notificação}}. Deseja mesmo continuar?", + "notification_requests.confirm_accept_multiple.title": "Aceitar pedidos de notificação?", + "notification_requests.confirm_dismiss_multiple.button": "{count, plural, one {Rejeitar pedido} other {Rejeitar pedidos}}", + "notification_requests.confirm_dismiss_multiple.message": "Você está prestes a rejeitar {count, plural, one {um pedido de notificação} other {# pedidos de notificação}}. Você não conseguirá mais acessá{count, plural, one {-lo} other {-los}} facilmente de novo. Deseja mesmo continuar?", + "notification_requests.confirm_dismiss_multiple.title": "Rejeitar pedidos de notificação?", "notification_requests.dismiss": "Rejeitar", - "notification_requests.dismiss_multiple": "{count, plural, one {Dispensar # pedido…} other {Dispensar # pedidos…}}", + "notification_requests.dismiss_multiple": "{count, plural, one {Rejeitar # pedido…} other {Rejeitar # pedidos…}}", "notification_requests.edit_selection": "Editar", "notification_requests.exit_selection": "Concluído", "notification_requests.explainer_for_limited_account": "As notificações desta conta foram filtradas porque a conta foi limitada por um moderador.", - "notification_requests.explainer_for_limited_remote_account": "As notificações desta conta foram filtradas porque a conta ou o seu servidor foi limitado por um moderador.", + "notification_requests.explainer_for_limited_remote_account": "As notificações desta conta foram filtradas porque a conta ou o servidor foi limitado por um servidor.", "notification_requests.maximize": "Maximizar", "notification_requests.minimize_banner": "Minimizar banner de notificações filtradas", "notification_requests.notifications_from": "Notificações de {name}", @@ -996,15 +1003,15 @@ "notifications.clear_confirmation": "Você tem certeza de que deseja limpar todas as suas notificações?", "notifications.clear_title": "Limpar notificações?", "notifications.column_settings.admin.report": "Novas denúncias:", - "notifications.column_settings.admin.sign_up": "Novas inscrições:", + "notifications.column_settings.admin.sign_up": "Novos registros:", "notifications.column_settings.alert": "Notificações no computador", "notifications.column_settings.collections": "Coleções:", "notifications.column_settings.favourite": "Favoritos:", "notifications.column_settings.filter_bar.advanced": "Exibir todas as categorias", - "notifications.column_settings.filter_bar.category": "Barra de filtro rápido", + "notifications.column_settings.filter_bar.category": "Barra de filtros rápidos", "notifications.column_settings.follow": "Seguidores:", "notifications.column_settings.follow_request": "Seguidores pendentes:", - "notifications.column_settings.group": "Grupo", + "notifications.column_settings.group": "Agrupar", "notifications.column_settings.mention": "Menções:", "notifications.column_settings.poll": "Enquetes:", "notifications.column_settings.push": "Notificações push", @@ -1015,7 +1022,7 @@ "notifications.column_settings.status": "Novas publicações:", "notifications.column_settings.unread_notifications.category": "Notificações não lidas", "notifications.column_settings.unread_notifications.highlight": "Destacar notificações não lidas", - "notifications.column_settings.update": "Editar:", + "notifications.column_settings.update": "Edições:", "notifications.filter.all": "Tudo", "notifications.filter.boosts": "Impulsos", "notifications.filter.collections": "Coleções", @@ -1031,11 +1038,11 @@ "notifications.permission_denied_alert": "Verifique a permissão do navegador para ativar notificações no computador.", "notifications.permission_required": "Ativar notificações no computador exige permissão do navegador.", "notifications.policy.accept": "Aceitar", - "notifications.policy.accept_hint": "Mostrar nas notificações", + "notifications.policy.accept_hint": "Exibir nas notificações", "notifications.policy.drop": "Ignorar", - "notifications.policy.drop_hint": "Envie para o void, para nunca mais ser visto novamente", + "notifications.policy.drop_hint": "Enviar para o vácuo, para nunca mais ser visto", "notifications.policy.filter": "Filtrar", - "notifications.policy.filter_hint": "Enviar para caixa de notificações filtradas", + "notifications.policy.filter_hint": "Enviar para a caixa de notificações filtradas", "notifications.policy.filter_limited_accounts_hint": "Limitado pelos moderadores do servidor", "notifications.policy.filter_limited_accounts_title": "Contas moderadas", "notifications.policy.filter_new_accounts.hint": "Created within the past {days, plural, one {one day} other {# days}}", @@ -1192,6 +1199,7 @@ "search_popout.user": "usuário", "search_results.accounts": "Perfis", "search_results.all": "Tudo", + "search_results.collections": "Coleções", "search_results.hashtags": "Hashtags", "search_results.no_results": "Sem resultados.", "search_results.no_search_yet": "Tente buscar por publicações, perfis e hashtags.", diff --git a/app/javascript/mastodon/locales/pt-PT.json b/app/javascript/mastodon/locales/pt-PT.json index 3a93b7273b7..22a55d48c3b 100644 --- a/app/javascript/mastodon/locales/pt-PT.json +++ b/app/javascript/mastodon/locales/pt-PT.json @@ -2,7 +2,6 @@ "about.blocks": "Servidores moderados", "about.contact": "Contacto:", "about.default_locale": "Padrão", - "about.disclaimer": "O Mastodon é um 'software' livre, de código aberto e marca registada de Mastodon gGmbH.", "about.domain_blocks.no_reason_available": "Motivo não disponível", "about.domain_blocks.preamble": "O Mastodon, geralmente, permite-lhe ver conteúdo e interagir com utilizadores de qualquer outro servidor na fediverso. Estas são as exceções aplicadas neste servidor em particular.", "about.domain_blocks.silenced.explanation": "Normalmente não verá perfis e conteúdos deste servidor, a não ser que os procures explicitamente ou opte por segui-los.", diff --git a/app/javascript/mastodon/locales/ro.json b/app/javascript/mastodon/locales/ro.json index 07da3389c35..f1424f7d886 100644 --- a/app/javascript/mastodon/locales/ro.json +++ b/app/javascript/mastodon/locales/ro.json @@ -2,7 +2,6 @@ "about.blocks": "Servere moderate", "about.contact": "Contact:", "about.default_locale": "Standard", - "about.disclaimer": "Mastodon este o aplicație gratuită, cu sursă deschisă și o marcă înregistrată a Mastodon gGmbH.", "about.domain_blocks.no_reason_available": "Motivul nu este disponibil", "about.domain_blocks.preamble": "Mastodon îți permite în general să vezi conținut de la și să interacționezi cu utilizatori de pe oricare server în fediverse. Acestea sunt excepțiile care au fost făcute pe acest server.", "about.domain_blocks.silenced.explanation": "În general, nu vei vedea profiluri și conținut de pe acest server, cu excepția cazului în care îl cauți în mod explicit sau optezi pentru el prin urmărire.", diff --git a/app/javascript/mastodon/locales/ru.json b/app/javascript/mastodon/locales/ru.json index 56a4e98fe1c..d439a1e8b47 100644 --- a/app/javascript/mastodon/locales/ru.json +++ b/app/javascript/mastodon/locales/ru.json @@ -2,7 +2,6 @@ "about.blocks": "Модерируемые серверы", "about.contact": "Связаться:", "about.default_locale": "по умолчанию", - "about.disclaimer": "Mastodon — свободное программное обеспечение с открытым исходным кодом и торговая марка Mastodon gGmbH.", "about.domain_blocks.no_reason_available": "Причина не указана", "about.domain_blocks.preamble": "Обычно Mastodon даёт вам возможность просматривать содержимое с любых других серверов в федивёрсе и взаимодействовать с их пользователями. Вот исключения, сделанные конкретно для этого сервера:", "about.domain_blocks.silenced.explanation": "Как правило, вы не увидите профили и содержимое с этого сервера, если только вы не запросите их с помощью поиска или не подпишетесь на пользователя с этого сервера.", diff --git a/app/javascript/mastodon/locales/ry.json b/app/javascript/mastodon/locales/ry.json index b66497a7513..ea9a0e7fdf7 100644 --- a/app/javascript/mastodon/locales/ry.json +++ b/app/javascript/mastodon/locales/ry.json @@ -1,7 +1,6 @@ { "about.blocks": "Модеровані серверы", "about.contact": "Контакт:", - "about.disclaimer": "Mastodon є задарьнов проґрамов из удпертым кодом тай торговов значков Mastodon gGmbH.", "about.domain_blocks.no_reason_available": "Причины не ясні", "about.domain_blocks.preamble": "Майбульш Mastodon поволят вам позирати контент тай комуніковати из хосновачами из другых федерованых серверув. Туй лиш уняткы учинені про сись конкретный сервер.", "about.domain_blocks.silenced.explanation": "Вы майбульш не будете видіти профілі тай контент из сього сервера, кидь не будете го самі глядати авадь пудпишете ся на нього.", diff --git a/app/javascript/mastodon/locales/sa.json b/app/javascript/mastodon/locales/sa.json index d536301f603..7d2b25c2c6e 100644 --- a/app/javascript/mastodon/locales/sa.json +++ b/app/javascript/mastodon/locales/sa.json @@ -1,7 +1,6 @@ { "about.blocks": "प्रशमितानि सर्वरः", "about.contact": "सम्पर्कः:", - "about.disclaimer": "मास्तोडनस्ति निश्शुल्को विवृत्तस्तन्त्रांशः, मास्तोडन् gGmbH इत्यस्य च व्यापारमुद्रा।", "about.domain_blocks.no_reason_available": "कारणं न लभ्यते", "about.domain_blocks.preamble": "मास्तोडन्सामान्यतया फेडिभर्सि अन्यस्मात्सर्वरादुपयोक्तृभ्यस्सामग्रीं द्रष्टुम्, तैस्संवादं कर्तुञ्च शक्नोति । एतानि वर्जनानि अस्मिन्सर्वरि कृतास्सन्ति।", "about.domain_blocks.silenced.explanation": "सामान्यतया अस्मात्सर्वरात्प्रोफाइल्सामग्रीञ्च न पश्यसि, यावत्स्पष्टतया तन्न पश्यसि अथवा अनुसरणं कृत्वा तस्मिन्विकल्पं न करोति ।", diff --git a/app/javascript/mastodon/locales/sc.json b/app/javascript/mastodon/locales/sc.json index bb377da3842..d70791a0b6a 100644 --- a/app/javascript/mastodon/locales/sc.json +++ b/app/javascript/mastodon/locales/sc.json @@ -2,7 +2,6 @@ "about.blocks": "Serbidores moderados", "about.contact": "Cuntatu:", "about.default_locale": "Predefinidu", - "about.disclaimer": "Mastodon est software de còdighe lìberu e unu màrchiu de Mastodon gGmbH.", "about.domain_blocks.no_reason_available": "Peruna resone a disponimentu", "about.domain_blocks.preamble": "Mastodon ti permitit de bìdere su cuntenutu de utentes de cale si siat àteru serbidore de su fediversu. Custas sunt etzetziones fatas in custu serbidore ispetzìficu.", "about.domain_blocks.silenced.explanation": "As a bìdere profilos e cuntenutos dae custu serbidore isceti chi ddos chircas o detzides de ddu sighire.", diff --git a/app/javascript/mastodon/locales/sco.json b/app/javascript/mastodon/locales/sco.json index 59680e7c79e..7c0c8884569 100644 --- a/app/javascript/mastodon/locales/sco.json +++ b/app/javascript/mastodon/locales/sco.json @@ -1,7 +1,6 @@ { "about.blocks": "Moderatit servers", "about.contact": "Contack:", - "about.disclaimer": "Mastodon is free, open-soorced saftware, an a trademairk o Mastodon gGmbH.", "about.domain_blocks.no_reason_available": "Raison no available", "about.domain_blocks.preamble": "On the hail, Mastodon lats ye view content frae an interack wi uisers fae onie ither server in the fediverse.", "about.domain_blocks.silenced.explanation": "Ye'll generally no see profiles an content frae this server, unless ye explicitly luik it up or opt intae it bi follaein.", diff --git a/app/javascript/mastodon/locales/si.json b/app/javascript/mastodon/locales/si.json index 7506b049581..25f5f3858cf 100644 --- a/app/javascript/mastodon/locales/si.json +++ b/app/javascript/mastodon/locales/si.json @@ -2,7 +2,6 @@ "about.blocks": "මැදිහත්කරණ සේවාදායක", "about.contact": "සබඳතාව:", "about.default_locale": "Default", - "about.disclaimer": "මාස්ටඩන් යනු නිදහස් විවෘත මූලාශ්‍ර මෘදුකාංගයකි. එය මාස්ටඩන් gGmbH හි වෙළඳ නාමයකි.", "about.domain_blocks.no_reason_available": "හේතුව ලබා ගත නොහැක.", "about.domain_blocks.preamble": "Mastodon සාමාන්‍යයෙන් ඔබට fediverse හි වෙනත් ඕනෑම සේවාදායකයකින් අන්තර්ගතයන් බැලීමට සහ පරිශීලකයින් සමඟ අන්තර් ක්‍රියා කිරීමට ඉඩ සලසයි. මෙම විශේෂිත සේවාදායකයේ සිදු කර ඇති ව්‍යතිරේක මේවාය.", "about.domain_blocks.silenced.explanation": "ඔබ එය පැහැදිලිව සොයා බැලුවහොත් හෝ අනුගමනය කිරීමෙන් එයට සම්බන්ධ නොවන්නේ නම්, සාමාන්‍යයෙන් ඔබට මෙම සේවාදායකයෙන් පැතිකඩ සහ අන්තර්ගතයන් නොපෙනේ.", diff --git a/app/javascript/mastodon/locales/sk.json b/app/javascript/mastodon/locales/sk.json index 381e1948174..555a58b0ed0 100644 --- a/app/javascript/mastodon/locales/sk.json +++ b/app/javascript/mastodon/locales/sk.json @@ -2,7 +2,6 @@ "about.blocks": "Moderované servery", "about.contact": "Kontakt:", "about.default_locale": "Predvolený", - "about.disclaimer": "Mastodon je bezplatný open-source softvér s otvoreným zdrojovým kódom a ochranná známka spoločnosti Mastodon gGmbH.", "about.domain_blocks.no_reason_available": "Dôvod nebol uvedený", "about.domain_blocks.preamble": "Mastodon vo všeobecnosti umožňuje prezerať obsah a komunikovať s používateľmi z akéhokoľvek iného servera vo fediverze. Tu sú uvedené výnimky, ktoré boli urobené na tomto konkrétnom serveri.", "about.domain_blocks.silenced.explanation": "Vo všeobecnosti neuvidíte profily a obsah z tohto servera, pokiaľ si ich nevyhľadáte alebo sa neprihlásite k ich sledovaniu.", diff --git a/app/javascript/mastodon/locales/sl.json b/app/javascript/mastodon/locales/sl.json index 43e01d231c1..ec73501f475 100644 --- a/app/javascript/mastodon/locales/sl.json +++ b/app/javascript/mastodon/locales/sl.json @@ -2,7 +2,6 @@ "about.blocks": "Moderirani strežniki", "about.contact": "Stik:", "about.default_locale": "Privzeto", - "about.disclaimer": "Mastodon je prosto, odprtokodno programje in blagovna znamka podjetja Mastodon gGmbH.", "about.domain_blocks.no_reason_available": "Razlog ni na voljo", "about.domain_blocks.preamble": "Mastodon vam na splošno omogoča ogled vsebin in interakcijo z uporabniki z vseh drugih strežnikov v fediverzumu. Tu so navedene izjeme, ki jih postavlja ta strežnik.", "about.domain_blocks.silenced.explanation": "V splošnem ne boste videli profilov in vsebin s tega strežnika, razen če jih izrecno poiščete ali jim začnete slediti.", diff --git a/app/javascript/mastodon/locales/sq.json b/app/javascript/mastodon/locales/sq.json index 2456186445d..a020074e912 100644 --- a/app/javascript/mastodon/locales/sq.json +++ b/app/javascript/mastodon/locales/sq.json @@ -2,7 +2,7 @@ "about.blocks": "Shërbyes të moderuar", "about.contact": "Kontakt:", "about.default_locale": "Parazgjedhje", - "about.disclaimer": "Mastodon-i është software i lirë, me burim të hapët dhe shenjë tregtare e Mastodon gGmbH.", + "about.disclaimer": "Mastodon-i është “software” i lirë, me burim të hapët dhe shenjë tregtare e Mastodon GmbH-së.", "about.domain_blocks.no_reason_available": "S’ka arsye", "about.domain_blocks.preamble": "Mastodon-i ju lë përgjithësisht të shihni lëndë prej përdoruesish dhe të ndërveproni me ta nga cilido shërbyes tjetër qofshin në fedivers. Ka përjashtime që janë bërë në këtë shërbyes të dhënë.", "about.domain_blocks.silenced.explanation": "Përgjithësisht s’do të shihni profile dhe lëndë nga ky shërbyes, veç në i kërkofshi shprehimisht apo zgjidhni të bëhet kjo, duke i ndjekur.", @@ -641,6 +641,7 @@ "empty_column.account_unavailable": "Profil jashtë funksionimi", "empty_column.blocks": "S’keni bllokuar ende ndonjë përdorues.", "empty_column.bookmarked_statuses": "S’keni faqeruajtur ende ndonjë mesazh. Kur faqeruani një të tillë, ai do të shfaqet këtu.", + "empty_column.collections": "{acct} s’ka krijuar ende ndonjë koleksion.", "empty_column.collections.featured_in": "S’jeni shtuar ende te ndonjë koleksion.", "empty_column.collections.featured_in_undiscoverable": "Që njerëzit t’ju shtojnë te koleksione, lypset të lejoni shfaqjen si i zgjedhur në raste zbulimi, që nga Parapëlqime > Privatësi dhe shtrirje", "empty_column.community": "Rrjedha kohore vendore është e zbrazët. Shkruani diçka publikisht që t’i hyhet valles!", @@ -814,6 +815,12 @@ "keyboard_shortcuts.heading": "Shkurtore tastiere", "keyboard_shortcuts.home": "Për hapje rrjedhe kohore vetjake", "keyboard_shortcuts.hotkey": "Tast përkatës", + "keyboard_shortcuts.keys.alt": "Alt", + "keyboard_shortcuts.keys.backspace": "Backspace", + "keyboard_shortcuts.keys.enter": "Enter", + "keyboard_shortcuts.keys.esc": "Esc", + "keyboard_shortcuts.keys.page_down": "Page Down", + "keyboard_shortcuts.keys.page_up": "Page Up", "keyboard_shortcuts.legend": "Për shfaqje të kësaj legjende", "keyboard_shortcuts.load_more": "Kaloje fokusin te butoni “Ngarko më tepër”", "keyboard_shortcuts.local": "Për hapje rrjedhe kohore vendore", @@ -1187,6 +1194,7 @@ "search_popout.user": "përdorues", "search_results.accounts": "Profile", "search_results.all": "Krejt", + "search_results.collections": "Koleksione", "search_results.hashtags": "Hashtag-ë", "search_results.no_results": "S’ka përfundime.", "search_results.no_search_yet": "Provoni të kërkoni për postime, profile ose hashtag-ë.", diff --git a/app/javascript/mastodon/locales/sr-Latn.json b/app/javascript/mastodon/locales/sr-Latn.json index 841c8e54734..defab5c34da 100644 --- a/app/javascript/mastodon/locales/sr-Latn.json +++ b/app/javascript/mastodon/locales/sr-Latn.json @@ -1,7 +1,6 @@ { "about.blocks": "Moderirani serveri", "about.contact": "Kontakt:", - "about.disclaimer": "Mastodon je besplatan softver otvorenog koda i zaštićeni znak kompanije Mastodon gGmbH.", "about.domain_blocks.no_reason_available": "Razlog nije naveden", "about.domain_blocks.preamble": "Mastodon vam generalno omogućava da vidite sadržaj i komunicirate sa korisnicima sa bilo kog drugog servera u fediverzumu. Ovo su izuzeci koji su napravljeni na ovom serveru.", "about.domain_blocks.silenced.explanation": "Nećete videti profile i sadržaj sa ovog servera osim ako ih eksplicitno ne potražite ili ne zapratite neki profil sa servera.", diff --git a/app/javascript/mastodon/locales/sr.json b/app/javascript/mastodon/locales/sr.json index 93731afcfd6..87b50a6ecc4 100644 --- a/app/javascript/mastodon/locales/sr.json +++ b/app/javascript/mastodon/locales/sr.json @@ -1,7 +1,6 @@ { "about.blocks": "Модерирани сервери", "about.contact": "Контакт:", - "about.disclaimer": "Mastodon је бесплатан софтвер отвореног кода и заштићени знак компаније Mastodon gGmbH.", "about.domain_blocks.no_reason_available": "Разлог није наведен", "about.domain_blocks.preamble": "Mastodon вам генерално омогућава да видите садржај и комуницирате са корисницима са било ког другог сервера у федиверзуму. Ово су изузеци који су направљени на овом серверу.", "about.domain_blocks.silenced.explanation": "Нећете видети профиле и садржај са овог сервера осим ако их експлицитно не потражите или не запратите неки профил са сервера.", diff --git a/app/javascript/mastodon/locales/sv.json b/app/javascript/mastodon/locales/sv.json index a5cda9c93f3..6ffd62c62ae 100644 --- a/app/javascript/mastodon/locales/sv.json +++ b/app/javascript/mastodon/locales/sv.json @@ -2,7 +2,7 @@ "about.blocks": "Modererade servrar", "about.contact": "Kontakt:", "about.default_locale": "Standard", - "about.disclaimer": "Mastodon är fri programvara med öppen källkod och ett varumärke tillhörande Mastodon gGmbH.", + "about.disclaimer": "Mastodon är fri programvara med öppen källkod och ett varumärke som tillhör Mastodon GmbH.", "about.domain_blocks.no_reason_available": "Okänd orsak", "about.domain_blocks.preamble": "Som regel låter Mastodon dig interagera med användare från andra servrar i fediversumet och se deras innehåll. Detta är de undantag som gjorts på just denna server.", "about.domain_blocks.silenced.explanation": "Såvida du inte uttryckligen söker upp dem eller samtycker till att se dem genom att följa dem kommer du i allmänhet inte se profiler från den här servern, eller deras innehåll.", diff --git a/app/javascript/mastodon/locales/szl.json b/app/javascript/mastodon/locales/szl.json index a758170fa9f..65d5771415e 100644 --- a/app/javascript/mastodon/locales/szl.json +++ b/app/javascript/mastodon/locales/szl.json @@ -1,7 +1,6 @@ { "about.blocks": "Moderowane serwery", "about.contact": "Kōntakt:", - "about.disclaimer": "Mastodon je wolne a ôtwartozdrzōdłowe ôprogramowanie i towarowy znak ôd Mastodon gGmbH.", "about.domain_blocks.no_reason_available": "Brak prziczyny", "about.domain_blocks.preamble": "Mastodon z wiynksza dŏwŏ ôglōndać treści i kōmunikować sie ze używŏczami inkszych serwerōw we fediverse. To sōm wyjōntki, co fungujōm na tym kōnkretnym serwerze.", "about.domain_blocks.silenced.explanation": "Normalniy niy bydziesz widzieć profilōw a treściōw ze tygo serwera. Ôboczysz je ino jak specjalniy bydziesz ich szukać abo jak je zaôbserwujesz.", diff --git a/app/javascript/mastodon/locales/ta.json b/app/javascript/mastodon/locales/ta.json index 45a218ebbda..ae44902b596 100644 --- a/app/javascript/mastodon/locales/ta.json +++ b/app/javascript/mastodon/locales/ta.json @@ -1,7 +1,6 @@ { "about.blocks": "நடுநிலையான சேவையகங்கள்", "about.contact": "தொடர்பு:", - "about.disclaimer": "மாஸ்டோடன் இலவச, திறந்த மூல மென்பொருள் மற்றும் மாஸ்டோடன் gGmbH இன் வர்த்தக முத்திரை.", "about.domain_blocks.no_reason_available": "காரணம் கிடைக்கவில்லை", "about.domain_blocks.preamble": "மாஸ்டோடன் பொதுவாக நீங்கள் ஃபெடிவர்ஸில் உள்ள வேறு எந்தச் சர்வரிலிருந்தும் உள்ளடக்கத்தைப் பார்க்கவும், பயனர்களுடன் தொடர்பு கொள்ளவும் அனுமதிக்கிறது. இந்தக் குறிப்பிட்ட சர்வரில் செய்யப்பட்ட விதிவிலக்குகள் இவை.", "account.add_or_remove_from_list": "பட்டியல்களில் சேர்/நீக்கு", diff --git a/app/javascript/mastodon/locales/tai.json b/app/javascript/mastodon/locales/tai.json index c2f0a3ce5dc..189ae327922 100644 --- a/app/javascript/mastodon/locales/tai.json +++ b/app/javascript/mastodon/locales/tai.json @@ -1,7 +1,6 @@ { "about.blocks": "Siū kuán-tsè ê su-hāu-khì", "about.contact": "Liân-lo̍k:", - "about.disclaimer": "Ling-khí-tshiūnn sī tsi̍t-ê khai-guân nńg-thé,i ê siong-phiau sī Mastodon gGmbH.", "account.badges.bot": "Tsū-tōng-ê", "account.cancel_follow_request": "Mài-koh tui-tsong", "account.media": "Mûi-thé", diff --git a/app/javascript/mastodon/locales/th.json b/app/javascript/mastodon/locales/th.json index 64df55cd2cb..3c91b84f23b 100644 --- a/app/javascript/mastodon/locales/th.json +++ b/app/javascript/mastodon/locales/th.json @@ -2,7 +2,6 @@ "about.blocks": "เซิร์ฟเวอร์ที่ได้รับการกลั่นกรอง", "about.contact": "ติดต่อ:", "about.default_locale": "ค่าเริ่มต้น", - "about.disclaimer": "Mastodon เป็นซอฟต์แวร์เสรี โอเพนซอร์ส และเครื่องหมายการค้าของ Mastodon gGmbH", "about.domain_blocks.no_reason_available": "เหตุผลไม่พร้อมใช้งาน", "about.domain_blocks.preamble": "โดยทั่วไป Mastodon อนุญาตให้คุณดูเนื้อหาจากและโต้ตอบกับผู้ใช้จากเซิร์ฟเวอร์อื่นใดในจักรวาลสหพันธ์ นี่คือข้อยกเว้นที่ทำขึ้นในเซิร์ฟเวอร์นี้โดยเฉพาะ", "about.domain_blocks.silenced.explanation": "โดยทั่วไปคุณจะไม่เห็นโปรไฟล์และเนื้อหาจากเซิร์ฟเวอร์นี้ เว้นแต่คุณจะค้นหาเซิร์ฟเวอร์หรือเลือกรับเซิร์ฟเวอร์โดยการติดตามอย่างชัดเจน", diff --git a/app/javascript/mastodon/locales/tok.json b/app/javascript/mastodon/locales/tok.json index 265d5f422ee..b48d2532a49 100644 --- a/app/javascript/mastodon/locales/tok.json +++ b/app/javascript/mastodon/locales/tok.json @@ -2,7 +2,6 @@ "about.blocks": "ma lawa", "about.contact": "toki:", "about.default_locale": "ante ala", - "about.disclaimer": "ilo Mastodon la jan ale li lawa e ona li pana e pona tawa ona. kulupu esun Mastodon gGmbH li lawa e nimi ona.", "about.domain_blocks.no_reason_available": "mi sona ala e tan", "about.domain_blocks.preamble": "ilo Mastodon li ken e ni: sina lukin e toki jan pi ma ilo mute. sina ken toki tawa ona lon kulupu ma. taso, ma ni li ken ala e ni tawa ma ni:", "about.domain_blocks.silenced.explanation": "sina lukin ala e toki e jan tan ma ni. taso, sina wile la, sina ken ni.", diff --git a/app/javascript/mastodon/locales/tr.json b/app/javascript/mastodon/locales/tr.json index e1306a87fc5..efea49d3bfe 100644 --- a/app/javascript/mastodon/locales/tr.json +++ b/app/javascript/mastodon/locales/tr.json @@ -2,7 +2,7 @@ "about.blocks": "Denetlenen sunucular", "about.contact": "İletişim:", "about.default_locale": "Varsayılan", - "about.disclaimer": "Mastodon özgür, açık kaynak bir yazılımdır ve Mastodon gGmbH şirketinin ticari markasıdır.", + "about.disclaimer": "Mastodon özgür, açık kaynak bir yazılımdır ve Mastodon GmbH şirketinin ticari markasıdır.", "about.domain_blocks.no_reason_available": "Gerekçe mevcut değil", "about.domain_blocks.preamble": "Mastodon, genel olarak fediverse'teki herhangi bir sunucudan içerik görüntülemenize ve kullanıcılarıyla etkileşim kurmanıza izin verir. Bunlar, bu sunucuda yapılmış olan istisnalardır.", "about.domain_blocks.silenced.explanation": "Açık bir şekilde aramadığınız veya takip ederek abone olmadığınız sürece, bu sunucudaki profilleri veya içerikleri genelde göremeyeceksiniz.", diff --git a/app/javascript/mastodon/locales/tt.json b/app/javascript/mastodon/locales/tt.json index 9dabb0d2568..a1afa508ec8 100644 --- a/app/javascript/mastodon/locales/tt.json +++ b/app/javascript/mastodon/locales/tt.json @@ -2,7 +2,6 @@ "about.blocks": "Модерациялана торган серверлар", "about.contact": "Бәйләнеш:", "about.default_locale": "Килешү буенча", - "about.disclaimer": "Mastodon-бушлай ачык чыганак программасы һәм Mastodon gmbh сәүдә маркасы.", "about.domain_blocks.no_reason_available": "Сәбәбе юк", "about.domain_blocks.preamble": "Mastodon гадәттә сезгә бүтән fediverse серверыннан эчтәлекне карарга һәм аның белән кулланучылар белән аралашырга мөмкинлек бирә. Бу конкрет серверда ясалган искәрмәләр.", "about.domain_blocks.silenced.explanation": "Гадәттә, сез бу серверның профильләрен һәм эчтәлеген күрмәячәксез, әгәр сез аларны ачыктан-ачык карамасагыз яки бу адымнарны үтәп язылмасагыз.", diff --git a/app/javascript/mastodon/locales/ug.json b/app/javascript/mastodon/locales/ug.json index df88e266458..cf39b9193d5 100644 --- a/app/javascript/mastodon/locales/ug.json +++ b/app/javascript/mastodon/locales/ug.json @@ -2,7 +2,6 @@ "about.blocks": "باشقۇرۇلىدىغان مۇلازىمېتىر", "about.contact": "ئالاقە:", "about.default_locale": "كۆڭۈلدىكى", - "about.disclaimer": "Mastodon ھەقسىز، ئوچۇق كودلۇق يۇمشاق دېتال تاۋار ماركىسى Mastodon gGmbH غا تەۋە.", "about.domain_blocks.no_reason_available": "سەۋەبىنى ئىشلەتكىلى بولمايدۇ", "about.language_label": "تىل", "account.badges.bot": "ماشىنا ئادەم", diff --git a/app/javascript/mastodon/locales/uk.json b/app/javascript/mastodon/locales/uk.json index 54917fab1d3..9ad58bdaa3c 100644 --- a/app/javascript/mastodon/locales/uk.json +++ b/app/javascript/mastodon/locales/uk.json @@ -2,7 +2,6 @@ "about.blocks": "Модеровані сервери", "about.contact": "Контакти:", "about.default_locale": "За замовчуванням", - "about.disclaimer": "Mastodon — це вільне програмне забезпечення з відкритим кодом і торгова марка компанії Mastodon gGmbH.", "about.domain_blocks.no_reason_available": "Причина недоступна", "about.domain_blocks.preamble": "Mastodon зазвичай дозволяє вам взаємодіяти з користувачами будь-яких серверів у Федіверсі та переглядати їх вміст. Ось винятки, які було зроблено на цьому конкретному сервері.", "about.domain_blocks.silenced.explanation": "Ви загалом не будете бачити профілі та вміст цього сервера, якщо ви не шукаєте їх цілеспрямовано або не підписані на його користувачів.", diff --git a/app/javascript/mastodon/locales/ur.json b/app/javascript/mastodon/locales/ur.json index 1e518485a79..958c8060108 100644 --- a/app/javascript/mastodon/locales/ur.json +++ b/app/javascript/mastodon/locales/ur.json @@ -1,7 +1,6 @@ { "about.blocks": "معتدل سرورز", "about.contact": "رابطہ:", - "about.disclaimer": "میسٹادان مفت، اوپن سورس سافٹ ویئر ہے، اور میسٹادان غیر منافع بخش کا ٹریڈ مارک ہے۔", "about.domain_blocks.no_reason_available": "وجوہات نہیں دستیاب", "about.domain_blocks.silenced.title": "محدود", "about.domain_blocks.suspended.title": "معطل شدہ", diff --git a/app/javascript/mastodon/locales/uz.json b/app/javascript/mastodon/locales/uz.json index f0db658b5e7..bcbd6cc174a 100644 --- a/app/javascript/mastodon/locales/uz.json +++ b/app/javascript/mastodon/locales/uz.json @@ -1,7 +1,6 @@ { "about.blocks": "Moderatsiya qilingan serverlar", "about.contact": "Ulanish:", - "about.disclaimer": "Mastodon bepul, ochiq kodli dastur va Mastodon gGmbH kompaniyasining savdo belgisidir.", "about.domain_blocks.no_reason_available": "Sabab mavjud emas", "about.domain_blocks.preamble": "Mastodon odatda fediversedagi istalgan boshqa serverdagi foydalanuvchilar tarkibini ko'rish va ular bilan muloqot qilish imkonini beradi. Bu alohida serverda qilingan istisnolar.", "about.domain_blocks.silenced.explanation": "Bu serverdagi profillar va kontentni koʻrmaysiz, agar siz uni aniq koʻrib chiqmasangiz yoki unga amal qilish orqali kirishni xohlamasangiz.", diff --git a/app/javascript/mastodon/locales/vi.json b/app/javascript/mastodon/locales/vi.json index 973ecf626e2..9790d927f05 100644 --- a/app/javascript/mastodon/locales/vi.json +++ b/app/javascript/mastodon/locales/vi.json @@ -2,7 +2,7 @@ "about.blocks": "Kiểm duyệt máy chủ khác", "about.contact": "Liên lạc:", "about.default_locale": "Mặc định", - "about.disclaimer": "Mastodon là phần mềm tự do nguồn mở của Mastodon gGmbH.", + "about.disclaimer": "Mastodon là phần mềm tự do nguồn mở của Mastodon GmbH.", "about.domain_blocks.no_reason_available": "Lý do không được cung cấp", "about.domain_blocks.preamble": "Mastodon cho phép bạn đọc nội dung và giao tiếp với tài khoản từ bất kỳ máy chủ nào. Còn đây là những ngoại lệ trên máy chủ này.", "about.domain_blocks.silenced.explanation": "Nói chung, bạn sẽ không thấy tài khoản và nội dung từ máy chủ này, trừ khi bạn tự tìm kiếm hoặc tự theo dõi.", @@ -646,6 +646,7 @@ "empty_column.account_unavailable": "Tài khoản bị đình chỉ", "empty_column.blocks": "Bạn chưa chặn ai.", "empty_column.bookmarked_statuses": "Bạn chưa lưu tút nào. Nếu có, nó sẽ hiển thị ở đây.", + "empty_column.collections": "{acct} chưa tạo gói khởi đầu nào.", "empty_column.collections.featured_in": "Bạn chưa được thêm vào gói khởi đầu nào.", "empty_column.collections.featured_in_undiscoverable": "Để mọi người có thể thêm bạn vào gói khởi đầu, bạn cần cho phép hiển thị trong trải nghiệm khám phá ở Thiết lập > Riêng tư và tiếp cận", "empty_column.community": "Máy chủ của bạn chưa có tút nào công khai. Bạn hãy thử viết gì đó đi!", @@ -734,7 +735,7 @@ "footer.about_mastodon": "Về Mastodon", "footer.about_server": "Về {domain}", "footer.about_this_server": "Giới thiệu", - "footer.directory": "Danh bạ", + "footer.directory": "Chỉ mục", "footer.get_app": "Ứng dụng", "footer.keyboard_shortcuts": "Phím tắt", "footer.privacy_policy": "Bảo mật", @@ -819,6 +820,12 @@ "keyboard_shortcuts.heading": "Danh sách phím tắt", "keyboard_shortcuts.home": "mở trang chủ", "keyboard_shortcuts.hotkey": "Phím tắt", + "keyboard_shortcuts.keys.alt": "Alt", + "keyboard_shortcuts.keys.backspace": "Backspace", + "keyboard_shortcuts.keys.enter": "Enter", + "keyboard_shortcuts.keys.esc": "Esc", + "keyboard_shortcuts.keys.page_down": "Page Down", + "keyboard_shortcuts.keys.page_up": "Page Up", "keyboard_shortcuts.legend": "hiện bảng hướng dẫn này", "keyboard_shortcuts.load_more": "mở nút \"Tải thêm\"", "keyboard_shortcuts.local": "mở máy chủ của bạn", @@ -850,6 +857,7 @@ "lightbox.zoom_in": "Kích cỡ gốc", "lightbox.zoom_out": "Vừa màn hình", "limited_account_hint.action": "Vẫn cứ xem", + "limited_account_hint.title": "Tài khoản hoặc máy chủ đã bị quản trị viên {domain} ẩn.", "link_preview.author": "Bởi {name}", "link_preview.more_from_author": "Viết bởi {name}", "link_preview.shares": "{count, plural, other {{counter} lượt chia sẻ}}", @@ -1191,6 +1199,7 @@ "search_popout.user": "địa chỉ Mastodon", "search_results.accounts": "Mọi người", "search_results.all": "Toàn bộ", + "search_results.collections": "Gói khởi đầu", "search_results.hashtags": "Hashtag", "search_results.no_results": "Không có kết quả.", "search_results.no_search_yet": "Thử tìm tút, người dùng hoặc hashtag.", diff --git a/app/javascript/mastodon/locales/zh-CN.json b/app/javascript/mastodon/locales/zh-CN.json index 7312742aa28..15f0f42da20 100644 --- a/app/javascript/mastodon/locales/zh-CN.json +++ b/app/javascript/mastodon/locales/zh-CN.json @@ -2,7 +2,7 @@ "about.blocks": "被限制的服务器", "about.contact": "联系方式:", "about.default_locale": "默认", - "about.disclaimer": "Mastodon 是自由的开源软件,商标由 Mastodon gGmbH 持有。", + "about.disclaimer": "Mastodon 是自由的开源软件,商标由 Mastodon GmbH 持有。", "about.domain_blocks.no_reason_available": "原因不可用", "about.domain_blocks.preamble": "通常来说,在 Mastodon 上,你可以浏览联邦宇宙中任何一台服务器上的内容,并且和上面的用户互动。但其中一些在本服务器上被设置为例外。", "about.domain_blocks.silenced.explanation": "除非明确地搜索并关注对方,否则你不会看到来自此服务器的用户信息与内容。", @@ -646,6 +646,7 @@ "empty_column.account_unavailable": "个人资料不可用", "empty_column.blocks": "你还未屏蔽任何用户。", "empty_column.bookmarked_statuses": "你还没有给任何嘟文添加书签。添加书签后的嘟文会显示在这里。", + "empty_column.collections": "{acct} 尚未创建任何收藏列表。", "empty_column.collections.featured_in": "你还没有被添加到收藏列表过。", "empty_column.collections.featured_in_undiscoverable": "如果想让其他人将你添加到收藏列表,请前往偏好设置 > 隐私与可达性在发现功能中允许推荐", "empty_column.community": "本站时间线还没有内容,写点什么并公开发布,让它活跃起来吧!", @@ -819,6 +820,12 @@ "keyboard_shortcuts.heading": "快捷键列表", "keyboard_shortcuts.home": "打开主页时间线", "keyboard_shortcuts.hotkey": "快捷键", + "keyboard_shortcuts.keys.alt": "Alt", + "keyboard_shortcuts.keys.backspace": "Backspace", + "keyboard_shortcuts.keys.enter": "Enter", + "keyboard_shortcuts.keys.esc": "Esc", + "keyboard_shortcuts.keys.page_down": "Page Down", + "keyboard_shortcuts.keys.page_up": "Page Up", "keyboard_shortcuts.legend": "显示此列表", "keyboard_shortcuts.load_more": "将焦点移至“加载更多”按钮", "keyboard_shortcuts.local": "打开本站时间线", @@ -1167,7 +1174,7 @@ "report_notification.categories.legal": "法律义务", "report_notification.categories.legal_sentence": "非法内容", "report_notification.categories.other": "其他", - "report_notification.categories.other_sentence": "其它", + "report_notification.categories.other_sentence": "其他", "report_notification.categories.spam": "骚扰", "report_notification.categories.spam_sentence": "骚扰", "report_notification.categories.violation": "违反规则", @@ -1192,6 +1199,7 @@ "search_popout.user": "用户", "search_results.accounts": "用户", "search_results.all": "全部", + "search_results.collections": "收藏列表", "search_results.hashtags": "话题", "search_results.no_results": "未找到结果。", "search_results.no_search_yet": "不妨试下搜索嘟文、账号或话题。", @@ -1342,7 +1350,7 @@ "upload_form.edit": "编辑", "upload_progress.label": "上传中…", "upload_progress.processing": "正在处理…", - "username.taken": "此用户名已被占用。请换用其它用户名", + "username.taken": "此用户名已被占用。请换用其他用户名", "video.close": "关闭视频", "video.download": "下载文件", "video.exit_fullscreen": "退出全屏", diff --git a/app/javascript/mastodon/locales/zh-HK.json b/app/javascript/mastodon/locales/zh-HK.json index a64c3ada6e4..0232b867bf7 100644 --- a/app/javascript/mastodon/locales/zh-HK.json +++ b/app/javascript/mastodon/locales/zh-HK.json @@ -2,7 +2,6 @@ "about.blocks": "受管制的伺服器", "about.contact": "聯絡我們:", "about.default_locale": "預設", - "about.disclaimer": "Mastodon 是免費的開源軟件,為 Mastodon gGmbH 的商標。", "about.domain_blocks.no_reason_available": "沒有原因", "about.domain_blocks.preamble": "Mastodon 通常也讓你查看聯邦宇宙中各伺服器的內容,並與使用者互動。這些是發生在這個特定伺服器上的例外情況。", "about.domain_blocks.silenced.explanation": "一般來說您不會看到來自這個伺服器的個人檔案和內容,除非您明確地打開或著追蹤此個人檔案。", diff --git a/app/javascript/mastodon/locales/zh-TW.json b/app/javascript/mastodon/locales/zh-TW.json index 724ff38ce16..b3f4fc03219 100644 --- a/app/javascript/mastodon/locales/zh-TW.json +++ b/app/javascript/mastodon/locales/zh-TW.json @@ -2,7 +2,7 @@ "about.blocks": "受管制的伺服器", "about.contact": "聯絡我們:", "about.default_locale": "預設", - "about.disclaimer": "Mastodon 是一個自由的開源軟體,是 Mastodon gGmbH 之註冊商標。", + "about.disclaimer": "Mastodon 是自由的開源軟體,是 Mastodon GmbH 之註冊商標。", "about.domain_blocks.no_reason_available": "無法存取的原因", "about.domain_blocks.preamble": "Mastodon 基本上允許您瀏覽聯邦宇宙中任何伺服器的內容並與使用者互動。以下是於本伺服器上設定之例外。", "about.domain_blocks.silenced.explanation": "一般來說您不會看到來自這個伺服器的個人檔案與內容,除非您明確地檢視或著跟隨此個人檔案。", @@ -646,6 +646,7 @@ "empty_column.account_unavailable": "無法取得個人檔案", "empty_column.blocks": "您尚未封鎖任何使用者。", "empty_column.bookmarked_statuses": "您還沒有新增任何書籤。當您新增書籤時,它將於此顯示。", + "empty_column.collections": "{acct} 尚未建立任何收藏名單。", "empty_column.collections.featured_in": "您尚未被加入至任何收藏名單。", "empty_column.collections.featured_in_undiscoverable": "如欲被其他人將您加入至收藏名單,您必須於 偏好設定 > 隱私權與觸及 啟用探索相關功能", "empty_column.community": "本站時間軸是空的。快公開嘟些文搶頭香啊!", @@ -819,6 +820,12 @@ "keyboard_shortcuts.heading": "鍵盤快速鍵", "keyboard_shortcuts.home": "開啟首頁時間軸", "keyboard_shortcuts.hotkey": "快速鍵", + "keyboard_shortcuts.keys.alt": "Alt", + "keyboard_shortcuts.keys.backspace": "Backspace", + "keyboard_shortcuts.keys.enter": "Enter", + "keyboard_shortcuts.keys.esc": "ESC", + "keyboard_shortcuts.keys.page_down": "Page Down", + "keyboard_shortcuts.keys.page_up": "Page Up", "keyboard_shortcuts.legend": "顯示此說明選單", "keyboard_shortcuts.load_more": "將焦點移至「讀取更多」按鈕", "keyboard_shortcuts.local": "開啟本站時間軸", @@ -1192,6 +1199,7 @@ "search_popout.user": "使用者", "search_results.accounts": "個人檔案", "search_results.all": "全部", + "search_results.collections": "收藏名單", "search_results.hashtags": "主題標籤", "search_results.no_results": "沒有結果。", "search_results.no_search_yet": "嘗試搜尋嘟文、個人檔案或主題標籤。", diff --git a/config/locales/doorkeeper.pl.yml b/config/locales/doorkeeper.pl.yml index b11528aeee2..85b90137472 100644 --- a/config/locales/doorkeeper.pl.yml +++ b/config/locales/doorkeeper.pl.yml @@ -83,6 +83,8 @@ pl: access_denied: Właściciel zasobu lub serwer autoryzujący odrzuciły żądanie. credential_flow_not_configured: Ścieżka "Resource Owner Password Credentials" zakończyła się błędem, ponieważ Doorkeeper.configure.resource_owner_from_credentials nie został skonfigurowany. invalid_client: Autoryzacja klienta nie powiodła się z powodu nieznanego klienta, braku uwierzytelnienia klienta, lub niewspieranej metody uwierzytelniania. + invalid_code_challenge_method: + zero: Serwer autoryzacji nie obsługuje PKCE — brak akceptowanych wartości code_challenge_method. invalid_grant: Grant uwierzytelnienia jest niepoprawny, przeterminowany, unieważniony, nie pasuje do URI przekierowwania użytego w żądaniu uwierzytelnienia, lub został wystawiony przez innego klienta. invalid_redirect_uri: URI przekierowania jest nieprawidłowy. invalid_request: diff --git a/config/locales/nn.yml b/config/locales/nn.yml index b91de70f08d..a599917d50b 100644 --- a/config/locales/nn.yml +++ b/config/locales/nn.yml @@ -345,12 +345,20 @@ nn: updated_msg: Du oppdaterte kunngjeringa. collections: accounts: Kontoar + back_to_account: Tilbake til kontosida + back_to_report: Tilbake til rapporteringssida + batch: + add_to_report: 'Legg til rapport #%{id}' + remove_from_report: Fjern frå rapport + report: Rapporter collection_title: Samling av %{name} contents: Innhald + no_collection_selected: Ingen samlingar var valde, så ingen vart endra number_of_accounts: one: 1 konto other: "%{count} kontoar" open: Opna + title: Kontosamlingar - @%{name} view_publicly: Vis offentleg critical_update_pending: Kritisk oppdatering ventar custom_emojis: @@ -484,9 +492,76 @@ nn: title: Blokker nytt e-postdomene no_email_domain_block_selected: Blokkering av e-post-domene vart ikkje endra sidan ingen var valde not_permitted: Ikkje tillate + reset: Nullstill resolved_dns_records_hint_html: Domenenamnet gjer oppslag til desse MX-domena som til sist er ansvarlege for å motta e-post. Blokkering av eit MX-domene vil blokkere registreringar frå alle e-postadresser som bruker same MX-domene, sjølv om det synlege domenenamnet skulle vera noko anna. Pass på så du ikkje blokkerer dei store e-postleverandørane. resolved_through_html: Løyst gjennom %{domain} + search: Søk title: Blokkerte e-postdomene + email_subscriptions: + accounts: + account: Konto + active: Aktiv + empty: + hint: Ingen brukarkontoar har abonnentar enno. + no_lists_yet: Ingen lister enno + inactive: Ikkje aktiv + last_email: Siste epost + lead: Nedanfor vil du sjå brukarkontoar som har skrudd på dette og som har abonnentar. + status: Status + subscribers: Abonnentar + title: Epostlister + additional_footer_texts: + show: + title: Ekstra botntekst + compliance_settings: + additional_footer_text: + action: Administrer + hint: Valfri tekst du kan setja i botnteksten på epostutsendingar + title: Ekstra botntekst + lead: Nokre jurisdiksjonar ser på epost-nyhendebrev som marknadsføring, avhengig av kvar du driv tenaren. + privacy_policy: + action: Administrer + hint: Desse retningslinene står i botnteksten på kvar epost + title: Personvernsreglar + title: Samsvarsinnstillingar + danger_zone: + disable_feature: + action: Slå av + hint: Slå av funksjonen for alle kontoar + title: Skru av funksjonen + erase_all_data: + action: Slett data + hint: Slettar alle epostar frå alle epostlister + title: Slett alt innhald + title: Faresone + disabled_msg: Du har skrudd av epostabonnementa. + index: + disabled: + cannot_be_enabled: Den tekniske leverandøren din har ikkje teke i bruk denne funksjonen på tenaren din. + description: Med denne funksjonen kan du la dei gjevne brukarane få leggja til småprogram på profilane sine, slik at lesarar utan Mastodon-brukarkontoar kan få innlegga deira på epost. + get_started: Kom i gang + lead: Lat lesarar få innlegga frå utvalde folk på denne tenaren på epost. + title: Nytt på epost + purged_msg: Alle epost-abonnementa blir sletta. + roles: + accounts: Kontoar + edit_role: Rediger rolle + empty: + hint: Ingen har løyve til å bruka denne funksjonen. + no_roles_added: Ingen roller er lagde til + lead: Folk med desse rollene kan bruka denne funksjonen på profilane sine. + manage_roles: Handsam roller + role_name: Namn på rolla + title: Roller + setups: + show: + enable_feature: Skru på funksjonen + important_information: Viktig informasjon + list: + 1_permission_explanation: Når denne funksjonen er skrudd på, kan brukarar med løyve leggja til eit skjema for å samla inn epostadresser på profilane sine. + 2_feature_explanation: Når gjester registrerer seg på ei profilside og stadfestar abonnementet, får dei epostoppdateringar når kontoen legg ut nye offentlege innlegg. + 3_privacy_policy_warning: Tenaradministratorar får tilgang til innsamla PII (epostadresser). Difor må personvernretnignslinene og brukarvilkåra for tenaren oppdaterast før du kan bruka denne funksjonen. + 4_cost_warning: Nokre tenaroppsett gjev tilleggskostnader for epostutsending. Drøft med nettverten din før du skrur på funksjonen, fordi det kan føra med seg store mengder epostar frå tenaren din. export_domain_allows: new: title: Importer domenetillatingar @@ -671,6 +746,7 @@ nn: action_log: Tilsynslogg action_taken_by: Handling gjort av actions: + delete_description_html: Dei rapporterte innlegga og/eller samlingane vil bli sletta, og det vil bli lagra ein merknad slik at du kan handla raskare ved framtidige regelbrot frå same person. mark_as_sensitive_description_html: Mediene i dei rapporterte innlegga vil verte markerte som ømtolege, og ein merknad vil verte lagra for å hjelpe deg å eskalera ved framtidige regelbrot frå same konto. other_description_html: Sjå fleire alternativ når det gjeld kontroll av kontoåtferd og tilpassing av kommunikasjonen til den rapporterte kontoen. resolve_description_html: Ingen handling utføres mot den rapporterte kontoen, ingen advarsel gis, og rapporten lukkes. @@ -697,6 +773,7 @@ nn: confirm: Stadfest confirm_action: Stadfest at du vil moderera brukarkontoen @%{acct} created_at: Rapportert + delete_and_resolve: Slett innhald forwarded: Videresendt forwarded_replies_explanation: Denne rapporten gjeld innhald på ein annan nettstad. Rapporten er vidaresend til deg fordi det rapporterte innhaldet er eit svar på noko ein av brukarane på nettstaden din har skrive. forwarded_to: Videresendt til %{domain} diff --git a/config/locales/pl.yml b/config/locales/pl.yml index a7b1c1c24ef..5c912489de6 100644 --- a/config/locales/pl.yml +++ b/config/locales/pl.yml @@ -55,6 +55,7 @@ pl: label: Zmień rolę no_role: Brak roli title: Zmień rolę dla %{username} + collections: Kolekcje confirm: Potwierdź confirmed: Potwierdzono confirming: Potwierdzanie @@ -838,6 +839,9 @@ pl: preamble: Podaj szczegółowe informacje na temat sposobu działania, moderacji i finansowania serwera. rules_hint: Istnieje dedykowany obszar dla reguł, których twoi użytkownicy mają przestrzegać. title: O... + allow_referrer_origin: + desc: Gdy użytkownicy klikają w linki do zewnętrznych stron, ich przeglądarka może wysłać adres Twojego serwera Mastodona jako stronę odsyłającą. Wyłącz tę opcję, jeśli mogłoby to jednoznacznie zidentyfikować Twoich użytkowników, np. jeśli jest to osobisty serwer Mastodona. + title: Zezwalaj zewnętrznym stronom na rozpoznawanie Twojego serwera Mastodona jako źródła ruchu appearance: preamble: Dostosuj interfejs www Mastodon. title: Wygląd @@ -856,6 +860,7 @@ pl: title: Domyślnie żądaj nieindeksowania użytkowników przez wyszukiwarki discovery: follow_recommendations: Polecane konta + preamble: Prezentowanie ciekawych treści jest kluczowe przy wdrażaniu nowych użytkowników, którzy mogą jeszcze nikogo nie znać na Mastodonie. Tutaj kontrolujesz, jak działają różne funkcje odkrywania treści na Twoim serwerze. privacy: Prywatność profile_directory: Katalog profilów public_timelines: Publiczne osie czasu @@ -869,7 +874,7 @@ pl: users: Zalogowanym lokalnym użytkownikom feed_access: modes: - authenticated: tylko zalogowani użytkownicy + authenticated: Tylko zalogowani użytkownicy disabled: Wymagaj określonej roli użytkownika public: Wszyscy registrations: @@ -1330,9 +1335,9 @@ pl: invalid_password: Nieprawidłowe hasło prompt: Potwierdź hasło, aby kontynuować color_scheme: - auto: Automatyczne - dark: Ciemny - light: Jasny + auto: Automatyczna + dark: Ciemna + light: Jasna contrast: auto: Automatyczny high: Wysoki @@ -1406,6 +1411,9 @@ pl: your_appeal_rejected: Twoje odwołanie zostało odrzucone edit_profile: other: Inne + redesign_body: Profil możesz teraz edytować bezpośrednio ze swojej publicznej strony. + redesign_button: Przejdź do edycji + redesign_title: Nowy sposób edycji profilu emoji_styles: auto: Automatycznie native: Natywny @@ -1980,7 +1988,9 @@ pl: public: Każdy title: '%{name}: "%{quote}"' visibilities: + private: Tylko dla obserwujących public: Publiczne + public_long: Każdy na i poza Mastodon unlisted: Niewidoczny unlisted_long: Ukryte w wynikach wyszukiwania Mastodona, trendach i publicznych osiach czasu statuses_cleanup: diff --git a/config/locales/simple_form.pl.yml b/config/locales/simple_form.pl.yml index 1db5bdfaf11..2532957821a 100644 --- a/config/locales/simple_form.pl.yml +++ b/config/locales/simple_form.pl.yml @@ -60,6 +60,9 @@ pl: setting_default_quote_policy_private: Wpisy publikowane na Mastodonie wyłącznie dla obserwujących nie mogą być cytowane przez inne osoby. setting_default_quote_policy_unlisted: Kiedy ktoś cytuje twoje wpisy, będą one również ukryte na popularnych osiach czasu. setting_default_sensitive: Wrażliwe multimedia są domyślnie schowane i mogą być odkryte kliknięciem + setting_display_media_default: Ostrzegaj przed wyświetleniem multimediów oznaczonych jako wrażliwe + setting_display_media_hide_all: Ostrzegaj przed wyświetleniem wszystkich multimediów + setting_display_media_show_all: Pokazuj wszystkie multimedia bez ostrzeżenia, w tym multimedia oznaczone jako wrażliwe setting_emoji_style: Jak wyświetlić emotikony. "Auto" spróbuje użyć natywnych emoji, ale wróci do Twemoji dla starszych przeglądarek. setting_quick_boosting_html: Po włączeniu tej opcji kliknięcie ikonki %{boost_icon} spowoduje natychmiastowe podbicie zamiast otwarcia menu rozwijanego z opcją podbicia lub cytatu. Przenosi to akcję cytowania do menu %{options_icon} (Opcje). setting_system_scrollbars_ui: Stosuje się tylko do przeglądarek komputerowych opartych na Safari i Chrome @@ -145,6 +148,7 @@ pl: jurisdiction: Wymień państwo, w którym mieszkają osoby płacące rachunki. Jeżeli jest to spółka lub inny zarejestrowany podmiot, w zależności od przypadku podaj państwo, w którym jest zarejestrowany, a także miasto, region czy województwo. min_age: Nie powinien być niższy niż minimalny wiek wymagany przez prawo twojego państwa. user: + chosen_languages: Jeżeli zaznaczone, tylko wpisy w wybranych językach będą wyświetlane na publicznych osiach czasu. To ustawienie nie ma wpływu na Twoją główną oś czasu i listy. date_of_birth: few: Musimy upewnić się, że jesteś co najmniej %{count} aby użyć %{domain}. Nie będziemy tego przechowywać. many: Musimy upewnić się, że jesteś co najmniej %{count} aby użyć %{domain}. Nie będziemy tego przechowywać. @@ -231,6 +235,7 @@ pl: setting_always_send_emails: Zawsze wysyłaj powiadomienia e-mail setting_auto_play_gif: Automatycznie odtwarzaj animowane GIFy setting_boost_modal: Kontroluj widoczność podbić + setting_color_scheme: Kolorystyka setting_contrast: Kontrast setting_default_language: Język wpisów setting_default_privacy: Widoczność wpisów diff --git a/config/locales/simple_form.zh-CN.yml b/config/locales/simple_form.zh-CN.yml index 7e33b345003..7135bb359ec 100644 --- a/config/locales/simple_form.zh-CN.yml +++ b/config/locales/simple_form.zh-CN.yml @@ -90,7 +90,7 @@ zh-CN: backups_retention_period: 用户可以生成其嘟文存档以供之后下载。当该值被设为正值时,这些存档将在指定的天数后自动从你的存储中删除。 bootstrap_timeline_accounts: 这些账号将在新用户关注推荐中置顶显示。请提供以逗号分隔的账号列表。 closed_registrations_message: 在关闭注册时显示 - content_cache_retention_period: 来自其它实例的所有嘟文(包括转嘟与回复)都将在指定天数后被删除,不论本实例用户是否与这些嘟文产生过交互。这包括被本实例用户喜欢和收藏的嘟文。实例间用户的私下提及也将丢失并无法恢复。此设置针对的是特殊用途的实例,用于一般用途时会打破许多用户的期望。 + content_cache_retention_period: 来自其他实例的所有嘟文(包括转嘟与回复)都将在指定天数后被删除,不论本实例用户是否与这些嘟文产生过交互。这包括被本实例用户喜欢和收藏的嘟文。实例间用户的私下提及也将丢失并无法恢复。此设置针对的是特殊用途的实例,用于一般用途时会打破许多用户的期望。 custom_css: 你可以为网页版 Mastodon 应用自定义样式。 email_footer_text: 仅在电子报邮件页脚中显示的可选文本。 favicon: WEBP、PNG、GIF 或 JPG。使用自定义图标覆盖 Mastodon 的默认图标。 diff --git a/config/locales/zh-CN.yml b/config/locales/zh-CN.yml index d8255d01a18..46bffcefb67 100644 --- a/config/locales/zh-CN.yml +++ b/config/locales/zh-CN.yml @@ -1107,7 +1107,7 @@ zh-CN: history: 历史记录 live: 生效中 no_history: 尚无服务条款变更记录。 - no_terms_of_service_html: 你还没有设置任何服务条款。设置服务条款可以清晰地界定责任,并在与用户发生争议时有效保护您的权益。 + no_terms_of_service_html: 你还没有设置任何服务条款。设置服务条款可以清晰地界定责任,并在与用户发生争议时有效保护你的权益。 notified_on_html: 已于 %{date} 通知用户 notify_users: 通知用户 preview: @@ -1328,7 +1328,7 @@ zh-CN: description: prefix_invited_by_user: "@%{name} 邀请你加入这个Mastodon服务器!" prefix_sign_up: 现在就注册 Mastodon 吧! - suffix: 注册一个账号,你就可以关注他人、发布嘟文、并和其它任何 Mastodon 服务器上的用户交流,而且还有其它更多功能! + suffix: 注册一个账号,你就可以关注他人、发布嘟文、并和其他任何 Mastodon 服务器上的用户交流,而且还有其他更多功能! didnt_get_confirmation: 没有收到确认链接? dont_have_your_security_key: 没有你的安全密钥? forgot_password: 忘记密码? @@ -1593,7 +1593,7 @@ zh-CN: batch: remove: 从过滤规则中移除 index: - hint: 此过滤规则适用于选中的个别嘟文,不受其它条件限制。你可以通过网页界面向此过滤规则添加更多嘟文。 + hint: 此过滤规则适用于选中的个别嘟文,不受其他条件限制。你可以通过网页界面向此过滤规则添加更多嘟文。 title: 过滤的嘟文 generic: all: 全部 @@ -1746,7 +1746,7 @@ zh-CN: not_found: 找不到 on_cooldown: 你正处于冷却状态 followers_count: 迁移时的关注者 - incoming_migrations: 从其它账号迁入 + incoming_migrations: 从其他账号迁入 incoming_migrations_html: 要把另一个账号移动到本账号,首先你需要创建一个账号别名 。 moved_msg: 你的账号现在会跳转到 %{acct} ,同时关注者也会一并迁移 。 not_redirecting: 你的账号当前未跳转到其它账号。 @@ -2254,7 +2254,7 @@ zh-CN: edit_profile_title: 个性化你的个人资料 explanation: 下面是几个小贴士,希望它们能帮到你 feature_action: 详细了解 - feature_audience: Mastodon 为你提供了无需中间商即可管理受众的独特可能。Mastodon 可被部署在你自己的基础设施上,允许你关注其它任何 Mastodon 在线服务器的用户,或被任何其他在线 Mastodon 服务器的用户关注,并且不受你之外的任何人控制。 + feature_audience: Mastodon 为你提供了无需中间商即可管理受众的独特可能。Mastodon 可被部署在你自己的基础设施上,允许你关注其他任何 Mastodon 在线服务器的用户,或被任何其他在线 Mastodon 服务器的用户关注,并且不受你之外的任何人控制。 feature_audience_title: 自由吸引你的受众 feature_control: 你最清楚你想在你自己的主页中看到什么动态。没有算法或广告浪费你的时间。你可以用一个账号关注任何 Mastodon 服务器上的任何人,并按时间顺序获得他们发布的嘟文,让你的互联网的角落更合自己的心意。 feature_control_title: 掌控自己的时间线 diff --git a/config/locales/zh-TW.yml b/config/locales/zh-TW.yml index f83dbdaa071..ebe16757b67 100644 --- a/config/locales/zh-TW.yml +++ b/config/locales/zh-TW.yml @@ -1,7 +1,9 @@ --- zh-TW: about: - about_mastodon_html: Mastodon (長毛象)是一個自由、開放原始碼的社群網站。它是一個分散式的服務,避免您的通訊被單一商業機構壟斷操控。請您選擇一家您信任的 Mastodon 站點,於其建立帳號,您就能與任一 Mastodon 站點上的使用者互通,享受無縫的社群網路交流。 + about_mastodon_html: |- + 社交網路的未來:無廣告、無企業監控、道德 + 去中心化設計!加入 Mastodon,擁有您的資料! contact_missing: 未設定 contact_unavailable: 未公開 hosted_on: 於 %{domain} 託管之 Mastodon 站點 @@ -776,7 +778,7 @@ zh-TW: title: 備註 notes_description_html: 檢視及留下些給其他管理員與未來的自己的備註 processed_msg: '檢舉報告 #%{id} 已被成功處理' - quick_actions_description_html: 採取一個快速行動,或者下捲以檢視檢舉內容: + quick_actions_description_html: 採取快速行動,或者下捲以檢視檢舉內容: remote_user_placeholder: 來自 %{instance} 之遠端使用者 reopen: 重開檢舉 report: '檢舉 #%{id}' From 4b7cb59d16fbf4bd1b59530c493a2f53a0271cc3 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Fri, 5 Jun 2026 10:31:52 +0200 Subject: [PATCH 032/130] Update dependency axios to v1.17.0 (#39277) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- yarn.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/yarn.lock b/yarn.lock index 847501e2f41..b6b489b702a 100644 --- a/yarn.lock +++ b/yarn.lock @@ -5824,14 +5824,14 @@ __metadata: linkType: hard "axios@npm:^1.4.0": - version: 1.16.1 - resolution: "axios@npm:1.16.1" + version: 1.17.0 + resolution: "axios@npm:1.17.0" dependencies: follow-redirects: "npm:^1.16.0" form-data: "npm:^4.0.5" https-proxy-agent: "npm:^5.0.1" proxy-from-env: "npm:^2.1.0" - checksum: 10c0/2f77e37e6552bbff8a772d058fb09500198e9188c6b20dc799d82dbe12a8cb506f6eed4e4e62a9ba612a35cbab496faa26d68f9bff14a53af6d15c3e136391a7 + checksum: 10c0/c4fa19ff3a3a63bde48beec03ad816b133b9a6385cccffffe172577ab18c6a70e299280d57f12c80c867fe25df41f92cb91d3a8258708a6d2be3e9e085f92650 languageName: node linkType: hard From 20c535acc4ae21c50a236c9f2c33e7a5ece5f450 Mon Sep 17 00:00:00 2001 From: Shlee Date: Fri, 5 Jun 2026 18:03:15 +0930 Subject: [PATCH 033/130] Fix: Blocked Domains Persist in Elasticsearch InstancesIndex (#39109) --- app/workers/scheduler/instance_refresh_scheduler.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/workers/scheduler/instance_refresh_scheduler.rb b/app/workers/scheduler/instance_refresh_scheduler.rb index 818682a5d21..f39abd5d866 100644 --- a/app/workers/scheduler/instance_refresh_scheduler.rb +++ b/app/workers/scheduler/instance_refresh_scheduler.rb @@ -7,6 +7,6 @@ class Scheduler::InstanceRefreshScheduler def perform Instance.refresh - InstancesIndex.import if Chewy.enabled? + InstancesIndex.sync if Chewy.enabled? end end From 906ae955fb694588d3c948e8c774937e83933098 Mon Sep 17 00:00:00 2001 From: diondiondion Date: Fri, 5 Jun 2026 10:34:39 +0200 Subject: [PATCH 034/130] Prefetch collection accounts for statuses and notifications (#39291) --- .../mastodon/actions/importer/index.js | 7 ++++++ .../mastodon/actions/notification_groups.ts | 11 +++++++++ app/javascript/mastodon/actions/search.ts | 6 ++--- .../mastodon/reducers/slices/collections.ts | 24 ++++++++++--------- 4 files changed, 34 insertions(+), 14 deletions(-) diff --git a/app/javascript/mastodon/actions/importer/index.js b/app/javascript/mastodon/actions/importer/index.js index fe31b84bff0..efe63f02d5e 100644 --- a/app/javascript/mastodon/actions/importer/index.js +++ b/app/javascript/mastodon/actions/importer/index.js @@ -4,6 +4,7 @@ import { importAccounts } from './accounts'; import { importCustomEmoji } from './emoji'; import { normalizeStatus } from './normalizer'; import { importPolls } from './polls'; +import { fetchAccountsForCollectionPreview } from '@/mastodon/reducers/slices/collections'; export const STATUS_IMPORT = 'STATUS_IMPORT'; export const STATUSES_IMPORT = 'STATUSES_IMPORT'; @@ -61,6 +62,7 @@ export function importFetchedStatuses(statuses, options = {}) { const normalStatuses = []; const polls = []; const filters = []; + const collections = []; function processStatus(status) { pushUnique(normalStatuses, normalizeStatus(status, getState().getIn(['statuses', status.id]), options)); @@ -82,6 +84,10 @@ export function importFetchedStatuses(statuses, options = {}) { pushUnique(polls, createPollFromServerJSON(status.poll, getState().polls[status.poll.id])); } + if (status.tagged_collections.length) { + status.tagged_collections.forEach(collection => pushUnique(collections, collection)); + } + if (status.card) { status.card.authors.forEach(author => author.account && pushUnique(accounts, author.account)); } @@ -97,5 +103,6 @@ export function importFetchedStatuses(statuses, options = {}) { dispatch(importFetchedAccounts(accounts)); dispatch(importStatuses(normalStatuses)); dispatch(importFilters(filters)); + fetchAccountsForCollectionPreview(collections, dispatch); }; } diff --git a/app/javascript/mastodon/actions/notification_groups.ts b/app/javascript/mastodon/actions/notification_groups.ts index eddd6a93008..6d2f00ece8d 100644 --- a/app/javascript/mastodon/actions/notification_groups.ts +++ b/app/javascript/mastodon/actions/notification_groups.ts @@ -5,6 +5,7 @@ import { apiFetchNotificationGroups, } from 'mastodon/api/notifications'; import type { ApiAccountJSON } from 'mastodon/api_types/accounts'; +import type { ApiCollectionJSON } from 'mastodon/api_types/collections'; import type { ApiNotificationGroupJSON, ApiNotificationJSON, @@ -26,6 +27,8 @@ import { createDataLoadingThunk, } from 'mastodon/store/typed_functions'; +import { fetchAccountsForCollectionPreview } from '../reducers/slices/collections'; + import { importFetchedAccounts, importFetchedStatuses } from './importer'; import { NOTIFICATIONS_FILTER_SET } from './notifications'; import { saveSettings } from './settings'; @@ -70,6 +73,7 @@ function dispatchAssociatedRecords( ) { const fetchedAccounts: ApiAccountJSON[] = []; const fetchedStatuses: ApiStatusJSON[] = []; + const collections: ApiCollectionJSON[] = []; notifications.forEach((notification) => { if (notification.type === 'admin.report') { @@ -83,6 +87,10 @@ function dispatchAssociatedRecords( if ('status' in notification && notification.status) { fetchedStatuses.push(notification.status); } + + if ('collection' in notification) { + collections.push(notification.collection); + } }); if (fetchedAccounts.length > 0) @@ -90,6 +98,9 @@ function dispatchAssociatedRecords( if (fetchedStatuses.length > 0) dispatch(importFetchedStatuses(fetchedStatuses)); + + if (collections.length > 0) + void fetchAccountsForCollectionPreview(collections, dispatch); } function selectNotificationGroupedTypes(state: RootState) { diff --git a/app/javascript/mastodon/actions/search.ts b/app/javascript/mastodon/actions/search.ts index 4b97682a749..b3ec7df0eb0 100644 --- a/app/javascript/mastodon/actions/search.ts +++ b/app/javascript/mastodon/actions/search.ts @@ -13,7 +13,7 @@ import { } from 'mastodon/store/typed_functions'; import { - importAccountsForPreviewCard, + fetchAccountsForCollectionPreview, importFetchedCollections, } from '../reducers/slices/collections'; @@ -46,7 +46,7 @@ export const submitSearch = createDataLoadingThunk( if (data.collections.length > 0) { dispatch(importFetchedCollections(data.collections)); - await importAccountsForPreviewCard(data.collections, dispatch); + await fetchAccountsForCollectionPreview(data.collections, dispatch); } return data; @@ -82,7 +82,7 @@ export const expandSearch = createDataLoadingThunk( if (data.collections.length > 0) { dispatch(importFetchedCollections(data.collections)); - await importAccountsForPreviewCard(data.collections, dispatch); + await fetchAccountsForCollectionPreview(data.collections, dispatch); } return data; diff --git a/app/javascript/mastodon/reducers/slices/collections.ts b/app/javascript/mastodon/reducers/slices/collections.ts index 41bda5aa953..2f54cd256da 100644 --- a/app/javascript/mastodon/reducers/slices/collections.ts +++ b/app/javascript/mastodon/reducers/slices/collections.ts @@ -337,7 +337,7 @@ const collectionSlice = createSlice({ /** * Prefetch accounts whose avatars will be displayed in the collection list */ -export async function importAccountsForPreviewCard( +export async function fetchAccountsForCollectionPreview( collections: ApiCollectionJSON[], dispatch: AppDispatch, ) { @@ -347,15 +347,17 @@ export async function importAccountsForPreviewCard( ) .filter((id): id is string => !!id); - // fetchAccounts can only process up to 40 item ids, so we'll - // batch the list of ids - const batchedAccountIdLists = batchArray(previewAccountIds, 40); + if (previewAccountIds.length > 0) { + // fetchAccounts can only process up to 40 item ids, so we'll + // batch the list of ids + const batchedAccountIdLists = batchArray(previewAccountIds, 40); - await Promise.allSettled( - batchedAccountIdLists.map((accountIds) => - dispatch(fetchAccounts({ accountIds })), - ), - ); + await Promise.allSettled( + batchedAccountIdLists.map((accountIds) => + dispatch(fetchAccounts({ accountIds })), + ), + ); + } } export const fetchCollectionsCreatedByAccount = createDataLoadingThunk( @@ -363,7 +365,7 @@ export const fetchCollectionsCreatedByAccount = createDataLoadingThunk( ({ accountId }: { accountId: string }) => apiGetCollectionsCreatedByAccount(accountId), async ({ collections }, { dispatch }) => { - await importAccountsForPreviewCard(collections, dispatch); + await fetchAccountsForCollectionPreview(collections, dispatch); }, ); @@ -372,7 +374,7 @@ export const fetchCollectionsFeaturingAccount = createDataLoadingThunk( ({ accountId }: { accountId: string }) => apiGetCollectionsFeaturingAccount(accountId), async ({ collections }, { dispatch }) => { - await importAccountsForPreviewCard(collections, dispatch); + await fetchAccountsForCollectionPreview(collections, dispatch); }, ); From 09689103390d10d77de5146483cbbb8abb5c94c9 Mon Sep 17 00:00:00 2001 From: diondiondion Date: Fri, 5 Jun 2026 10:39:23 +0200 Subject: [PATCH 035/130] [Accessibility] Make post/feed navigation by hotkey more robust (#39270) --- app/javascript/mastodon/features/ui/index.jsx | 12 ++- .../mastodon/features/ui/util/focusUtils.ts | 76 ++++++++++++++++--- 2 files changed, 69 insertions(+), 19 deletions(-) diff --git a/app/javascript/mastodon/features/ui/index.jsx b/app/javascript/mastodon/features/ui/index.jsx index 22332eae6ef..73ff427e6f6 100644 --- a/app/javascript/mastodon/features/ui/index.jsx +++ b/app/javascript/mastodon/features/ui/index.jsx @@ -86,7 +86,7 @@ import { Quotes, } from './util/async-components'; import { ColumnsContextProvider } from './util/columns_context'; -import { focusColumn, getFocusedItemIndex, focusItemSibling, focusFirstItem } from './util/focusUtils'; +import { focusColumn, getFocusedItemIndex, focusItemSibling, focusFirstItem, getFocusedColumnIndex } from './util/focusUtils'; import { WrappedSwitch, WrappedRoute } from './util/react_router_helpers'; import { CustomHomepage } from 'mastodon/features/custom_homepage'; @@ -506,20 +506,18 @@ class UI extends PureComponent { handleMoveUp = () => { const currentItemIndex = getFocusedItemIndex(); if (currentItemIndex === -1) { - focusColumn(1); + return focusColumn(getFocusedColumnIndex()); } else { - const wasHandled = focusItemSibling(currentItemIndex, -1); - return wasHandled; + return focusItemSibling(currentItemIndex, -1); } }; handleMoveDown = () => { const currentItemIndex = getFocusedItemIndex(); if (currentItemIndex === -1) { - focusColumn(1); + return focusColumn(getFocusedColumnIndex()); } else { - const wasHandled = focusItemSibling(currentItemIndex, 1); - return wasHandled; + return focusItemSibling(currentItemIndex, 1); } }; diff --git a/app/javascript/mastodon/features/ui/util/focusUtils.ts b/app/javascript/mastodon/features/ui/util/focusUtils.ts index 80e9cb97683..6e6b8e24e09 100644 --- a/app/javascript/mastodon/features/ui/util/focusUtils.ts +++ b/app/javascript/mastodon/features/ui/util/focusUtils.ts @@ -62,18 +62,17 @@ export function focusColumn(index = 1) { function fallback() { focusColumnTitle(index + indexOffset, isMultiColumnLayout); + return false; } if (!column) { - fallback(); - return; + return fallback(); } const container = column.querySelector('.scrollable'); if (!container) { - fallback(); - return; + return fallback(); } const focusableItems = Array.from( @@ -86,8 +85,7 @@ export function focusColumn(index = 1) { const itemToFocus = findFirstVisibleWithRect(focusableItems); if (!itemToFocus) { - fallback(); - return; + return fallback(); } const viewportWidth = @@ -110,6 +108,7 @@ export function focusColumn(index = 1) { itemToFocus.item.scrollIntoView(true); } itemToFocus.item.focus(); + return true; } /** @@ -126,6 +125,18 @@ export function getFocusedItemIndex() { return items.indexOf(focusedItem); } +/** + * Get the index of the column that contains the user's focus + */ +export function getFocusedColumnIndex() { + const columnWithFocus = document.activeElement?.closest('.column'); + + if (!columnWithFocus) return 1; + + const allColumns = Array.from(document.querySelectorAll('.column')); + return allColumns.indexOf(columnWithFocus) + 1; +} + /** * Focus the topmost item of the column that currently has focus, * or the first column if none @@ -159,12 +170,7 @@ export function focusItemSibling(index: number, direction: 1 | -1) { ); if (!siblingItem) { - return false; - } - - // If sibling element is empty, we skip it - if (siblingItem.matches(':empty')) { - return focusItemSibling(index + direction, direction); + return focusListSibling(direction); } // Check if the sibling is a post or a 'follow suggestions' widget @@ -177,6 +183,52 @@ export function focusItemSibling(index: number, direction: 1 | -1) { targetElement = siblingItem; } + // If sibling element is empty, we skip it + if (!targetElement || siblingItem.matches(':empty')) { + return focusItemSibling(index + direction, direction); + } + + targetElement.scrollIntoView({ + block: 'start', + }); + + targetElement.focus(); + + return true; +} + +/** + * Finds the next or previous .item-list on the page or in the column, + * and focuses its first or last item. + */ +function focusListSibling(direction: 1 | -1) { + const container = document.activeElement?.closest('.item-list'); + + if (!container) { + return false; + } + + // Get all item lists in the current column or page + const currentColumn = container.closest('.column') ?? document; + + const columnItemLists = Array.from( + currentColumn.querySelectorAll('.item-list'), + ); + const currentListIndex = columnItemLists.indexOf(container); + + // Find the next or previous item-list + const listSibling = columnItemLists[currentListIndex + direction]; + + // Depending on the direction, find the first or last focusable in the list + let targetElement: HTMLElement | null | undefined; + if (direction > 0) { + targetElement = listSibling?.querySelector('.focusable'); + } else { + const allFocusables = + listSibling?.querySelectorAll('.focusable'); + targetElement = allFocusables?.[allFocusables.length - 1]; + } + if (targetElement) { targetElement.scrollIntoView({ block: 'start', From ff4d97180dfd247f5949176ecfd4c605f3ada8aa Mon Sep 17 00:00:00 2001 From: Matt Jankowski Date: Fri, 5 Jun 2026 04:39:33 -0400 Subject: [PATCH 036/130] Use bundler version 4.0.13 (#39106) --- Gemfile.lock | 46 +++++++++++++++++++++++++--------------------- 1 file changed, 25 insertions(+), 21 deletions(-) diff --git a/Gemfile.lock b/Gemfile.lock index 7e422766214..3a744a28c00 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -10,7 +10,7 @@ GIT GEM remote: https://rubygems.org/ specs: - action_text-trix (2.1.18) + action_text-trix (2.1.19) railties actioncable (8.1.3) actionpack (= 8.1.3) @@ -99,7 +99,7 @@ GEM ast (2.4.3) attr_required (1.0.2) aws-eventstream (1.4.0) - aws-partitions (1.1256.0) + aws-partitions (1.1257.0) aws-sdk-core (3.251.0) aws-eventstream (~> 1, >= 1.3.0) aws-partitions (~> 1, >= 1.992.0) @@ -132,7 +132,7 @@ GEM binding_of_caller (2.0.0) debug_inspector (>= 1.2.0) blurhash (0.1.8) - bootsnap (1.24.4) + bootsnap (1.24.6) msgpack (~> 1.2) brakeman (8.0.4) racc @@ -178,13 +178,14 @@ GEM bigdecimal rexml crass (1.0.6) - css_parser (2.1.0) + css_parser (3.0.0) addressable + ssrf_filter (~> 1.5) csv (3.3.5) database_cleaner-active_record (2.2.2) activerecord (>= 5.a) database_cleaner-core (~> 2.0) - database_cleaner-core (2.0.1) + database_cleaner-core (2.1.0) date (3.5.1) debug (1.11.1) irb (~> 1.10) @@ -228,7 +229,7 @@ GEM erubi (1.13.1) et-orbi (1.4.0) tzinfo - excon (1.4.2) + excon (1.5.0) logger fabrication (3.0.0) faker (3.8.0) @@ -246,7 +247,7 @@ GEM fast_blank (1.0.1) fastimage (2.4.1) ffi (1.17.4) - ffi-compiler (1.3.2) + ffi-compiler (1.4.2) ffi (>= 1.15.5) rake flatware (2.4.0) @@ -271,15 +272,15 @@ GEM formatador (1.2.3) reline forwardable (1.4.0) - fugit (1.12.1) + fugit (1.12.2) et-orbi (~> 1.4) raabro (~> 1.4) globalid (1.3.0) activesupport (>= 6.1) - google-protobuf (4.34.1) + google-protobuf (4.35.0) bigdecimal rake (~> 13.3) - googleapis-common-protos-types (1.22.0) + googleapis-common-protos-types (1.23.0) google-protobuf (~> 4.26) haml (7.2.0) temple (>= 0.8.2) @@ -354,7 +355,7 @@ GEM jmespath (1.6.2) json (2.19.8) json-canonicalization (1.0.0) - json-jwt (1.17.0) + json-jwt (1.17.1) activesupport (>= 4.2) aes_key_wrap base64 @@ -450,7 +451,7 @@ GEM minitest (6.0.6) drb (~> 2.0) prism (~> 1.5) - msgpack (1.8.0) + msgpack (1.8.1) multi_json (1.21.1) mutex_m (0.3.0) net-http (0.9.1) @@ -501,7 +502,7 @@ GEM tzinfo validate_url webfinger (~> 2.0) - openssl (4.0.1) + openssl (4.0.2) openssl-signature_algorithm (1.3.0) openssl (> 2.0) opentelemetry-api (1.10.0) @@ -520,7 +521,7 @@ GEM opentelemetry-helpers-sql-processor (0.5.0) opentelemetry-api (~> 1.0) opentelemetry-common (~> 0.21) - opentelemetry-instrumentation-action_mailer (0.8.0) + opentelemetry-instrumentation-action_mailer (0.8.1) opentelemetry-instrumentation-active_support (~> 0.10) opentelemetry-instrumentation-action_pack (0.18.0) opentelemetry-instrumentation-rack (~> 0.29) @@ -532,7 +533,7 @@ GEM opentelemetry-instrumentation-active_support (>= 0.7.0) opentelemetry-instrumentation-active_record (0.13.0) opentelemetry-instrumentation-base (~> 0.25) - opentelemetry-instrumentation-active_storage (0.5.0) + opentelemetry-instrumentation-active_storage (0.5.1) opentelemetry-instrumentation-active_support (~> 0.10) opentelemetry-instrumentation-active_support (0.12.0) opentelemetry-instrumentation-base (~> 0.25) @@ -579,7 +580,7 @@ GEM opentelemetry-common (~> 0.20) opentelemetry-registry (~> 0.2) opentelemetry-semantic_conventions - opentelemetry-semantic_conventions (1.37.1) + opentelemetry-semantic_conventions (1.39.0) opentelemetry-api (~> 1.0) orm_adapter (0.5.0) ostruct (0.6.3) @@ -617,11 +618,11 @@ GEM actionpack (>= 7.0.0) activesupport (>= 7.0.0) rack - psych (5.3.1) + psych (5.4.0) date stringio public_suffix (7.0.5) - puma (8.0.1) + puma (8.0.2) nio4r (~> 2.0) pundit (2.5.2) activesupport (>= 3.0.0) @@ -718,7 +719,8 @@ GEM railties (>= 7.0) rexml (3.4.4) rotp (6.3.0) - rouge (4.7.0) + rouge (5.0.0) + strscan (~> 3.1) rpam2 (4.0.2) rqrcode (3.2.0) chunky_png (~> 1.0) @@ -841,6 +843,7 @@ GEM simplecov-html (0.13.2) simplecov-lcov (0.9.0) simplecov_json_formatter (0.1.4) + ssrf_filter (1.5.0) stackprof (0.2.28) starry (0.2.0) base64 @@ -850,6 +853,7 @@ GEM stringio (3.2.0) strong_migrations (2.8.0) activerecord (>= 7.2) + strscan (3.1.8) swd (2.0.3) activesupport (>= 3) attr_required (>= 0.0.5) @@ -926,7 +930,7 @@ GEM crack (>= 0.3.2) hashdiff (>= 0.4.0, < 2.0.0) webrick (1.9.2) - websocket-driver (0.8.0) + websocket-driver (0.8.1) base64 websocket-extensions (>= 0.1.0) websocket-extensions (0.1.5) @@ -1097,4 +1101,4 @@ RUBY VERSION ruby 4.0.5 BUNDLED WITH - 4.0.11 + 4.0.13 From be3dce70b855f2866e61043bf306cbde447ba97e Mon Sep 17 00:00:00 2001 From: Matt Jankowski Date: Fri, 5 Jun 2026 05:22:05 -0400 Subject: [PATCH 037/130] Update doorkeeper to version 5.9.1 (#39132) --- Gemfile.lock | 2 +- config/application.rb | 3 --- config/initializers/doorkeeper.rb | 6 ++++++ 3 files changed, 7 insertions(+), 4 deletions(-) diff --git a/Gemfile.lock b/Gemfile.lock index 3a744a28c00..57eb2045b07 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -210,7 +210,7 @@ GEM activerecord (>= 7.0, < 9.0) docile (1.4.1) domain_name (0.6.20240107) - doorkeeper (5.9.0) + doorkeeper (5.9.1) railties (>= 5) dotenv (3.2.0) drb (2.2.3) diff --git a/config/application.rb b/config/application.rb index 09fe38065e3..5c5de3e23ac 100644 --- a/config/application.rb +++ b/config/application.rb @@ -111,9 +111,6 @@ module Mastodon end config.to_prepare do - Doorkeeper::Application.include ApplicationExtension - Doorkeeper::AccessGrant.include AccessGrantExtension - Doorkeeper::AccessToken.include AccessTokenExtension Devise::FailureApp.include AbstractController::Callbacks Devise::FailureApp.include Localized end diff --git a/config/initializers/doorkeeper.rb b/config/initializers/doorkeeper.rb index 908acb55033..2fb690032ab 100644 --- a/config/initializers/doorkeeper.rb +++ b/config/initializers/doorkeeper.rb @@ -179,3 +179,9 @@ Doorkeeper.configure do # WWW-Authenticate Realm (default "Doorkeeper"). # realm "Doorkeeper" end + +Rails.application.reloader.to_prepare do + Doorkeeper.config.application_model.include ApplicationExtension + Doorkeeper.config.access_grant_model.include AccessGrantExtension + Doorkeeper.config.access_token_model.include AccessTokenExtension +end From 0c78d1fd0f70bf233cd87445817122467d2c67c8 Mon Sep 17 00:00:00 2001 From: diondiondion Date: Fri, 5 Jun 2026 11:27:45 +0200 Subject: [PATCH 038/130] Remove outdated hint for "Use system scrollbar" preference (#39297) --- app/views/settings/preferences/appearance/show.html.haml | 2 +- config/locales/simple_form.en.yml | 1 - 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/app/views/settings/preferences/appearance/show.html.haml b/app/views/settings/preferences/appearance/show.html.haml index f521fd99b5e..202dd53103f 100644 --- a/app/views/settings/preferences/appearance/show.html.haml +++ b/app/views/settings/preferences/appearance/show.html.haml @@ -82,7 +82,7 @@ = ff.input :'web.disable_swiping', wrapper: :with_label, label: I18n.t('simple_form.labels.defaults.setting_disable_swiping') = ff.input :'web.disable_hover_cards', wrapper: :with_label, label: I18n.t('simple_form.labels.defaults.setting_disable_hover_cards') = ff.input :'web.use_system_font', wrapper: :with_label, label: I18n.t('simple_form.labels.defaults.setting_system_font_ui') - = ff.input :'web.use_system_scrollbars', wrapper: :with_label, hint: I18n.t('simple_form.hints.defaults.setting_system_scrollbars_ui'), label: I18n.t('simple_form.labels.defaults.setting_system_scrollbars_ui') + = ff.input :'web.use_system_scrollbars', wrapper: :with_label, label: I18n.t('simple_form.labels.defaults.setting_system_scrollbars_ui') %h2= t 'appearance.discovery' diff --git a/config/locales/simple_form.en.yml b/config/locales/simple_form.en.yml index c3fe3871b1c..4c9a3bce617 100644 --- a/config/locales/simple_form.en.yml +++ b/config/locales/simple_form.en.yml @@ -66,7 +66,6 @@ en: setting_display_media_show_all: Show all media without warning, including media marked as sensitive setting_emoji_style: How to display emojis. "Auto" will try using native emoji, but falls back to Twemoji for legacy browsers. setting_quick_boosting_html: When enabled, clicking on the %{boost_icon} Boost icon will immediately boost instead of opening the boost/quote dropdown menu. Relocates the quoting action to the %{options_icon} (Options) menu. - setting_system_scrollbars_ui: Applies only to desktop browsers based on Safari and Chrome setting_use_blurhash: Gradients are based on the colors of the hidden visuals but obfuscate any details setting_use_pending_items: Hide timeline updates behind a click instead of automatically scrolling the feed username: You can use letters, numbers, and underscores From 2d2a7ec8d63114ceac17f8af2d43ba5fd4eac1a9 Mon Sep 17 00:00:00 2001 From: diondiondion Date: Fri, 5 Jun 2026 11:28:28 +0200 Subject: [PATCH 039/130] Fix Collections editor allowing to add the same account multiple times (#39296) --- .../features/collections/editor/accounts.tsx | 47 +++++++++++-------- .../mastodon/hooks/useSearchAccounts.ts | 21 +++++---- 2 files changed, 40 insertions(+), 28 deletions(-) diff --git a/app/javascript/mastodon/features/collections/editor/accounts.tsx b/app/javascript/mastodon/features/collections/editor/accounts.tsx index c5d23bdf3ee..a27079164e6 100644 --- a/app/javascript/mastodon/features/collections/editor/accounts.tsx +++ b/app/javascript/mastodon/features/collections/editor/accounts.tsx @@ -208,6 +208,12 @@ export const CollectionAccounts: React.FC<{ const hasItems = editorItems.length > 0; const hasMaxItems = editorItems.length === MAX_COLLECTION_ACCOUNT_COUNT; + const wasAccountAdded = useCallback( + (account: ApiMutedAccountJSON) => + !!editorItems.find((item) => item.account_id === account.id), + [editorItems], + ); + const { accounts: suggestedAccounts, isLoading: isLoadingSuggestions, @@ -217,8 +223,7 @@ export const CollectionAccounts: React.FC<{ withRelationships: true, withDefaultFollows: searchValue === '', // Don't suggest accounts that were already added - filterResults: (account) => - !editorItems.find((item) => item.account_id === account.id), + filterResults: (account) => !wasAccountAdded(account), }); const relationships = useAppSelector((state) => state.relationships); @@ -256,23 +261,25 @@ export const CollectionAccounts: React.FC<{ const addAccountItem = useCallback( (item: ApiMutedAccountJSON) => { - dispatch( - updateCollectionEditorField({ - field: 'items', - value: [ - ...editorItems, - { - account_id: item.id, - state: - item.feature_approval.current_user === 'manual' - ? 'pending' - : 'accepted', - }, - ], - }), - ); + if (!wasAccountAdded(item)) { + dispatch( + updateCollectionEditorField({ + field: 'items', + value: [ + ...editorItems, + { + account_id: item.id, + state: + item.feature_approval.current_user === 'manual' + ? 'pending' + : 'accepted', + }, + ], + }), + ); + } }, - [editorItems, dispatch], + [editorItems, wasAccountAdded, dispatch], ); const instantRemoveAccountItem = useCallback( @@ -299,13 +306,13 @@ export const CollectionAccounts: React.FC<{ const instantAddAccountItem = useCallback( (item: ApiMutedAccountJSON) => { - if (id) { + if (id && !wasAccountAdded(item)) { void dispatch( addCollectionItem({ collectionId: id, accountId: item.id }), ); } }, - [dispatch, id], + [dispatch, id, wasAccountAdded], ); const handleRemoveAccountItem = useCallback( diff --git a/app/javascript/mastodon/hooks/useSearchAccounts.ts b/app/javascript/mastodon/hooks/useSearchAccounts.ts index b7e6ab9f52a..1c26fe19ae3 100644 --- a/app/javascript/mastodon/hooks/useSearchAccounts.ts +++ b/app/javascript/mastodon/hooks/useSearchAccounts.ts @@ -51,7 +51,7 @@ export function useSearchAccounts({ searchRequestRef.current = new AbortController(); try { - const data = await apiRequest( + const accounts = await apiRequest( 'GET', 'v1/accounts/search', { @@ -62,7 +62,6 @@ export function useSearchAccounts({ }, }, ); - const accounts = filterResults ? data.filter(filterResults) : data; const accountIds = accounts.map((a) => a.id); dispatch(importFetchedAccounts(accounts)); if (withRelationships) { @@ -95,6 +94,7 @@ export function useSearchAccounts({ const [defaultAccounts, setDefaultAccounts] = useState< ApiAccountJSON[] | null >(null); + useEffect(() => { if ( !currentUserId || @@ -108,12 +108,11 @@ export function useSearchAccounts({ async function doRequest() { setLoadingState('loading'); try { - const data = await apiRequest( + const accounts = await apiRequest( 'GET', `v1/accounts/${currentUserId}/following`, { params: { limit: 40 } }, ); - const accounts = filterResults ? data.filter(filterResults) : data; const accountIds = accounts.map((a) => a.id); dispatch(importFetchedAccounts(accounts)); if (withRelationships) { @@ -137,13 +136,19 @@ export function useSearchAccounts({ withDefaultFollows, ]); + const accountsToReturn = + accounts.length === 0 && withDefaultFollows + ? (defaultAccounts ?? []) + : accounts; + + const filteredAccounts = filterResults + ? accountsToReturn.filter(filterResults) + : accountsToReturn; + return { searchAccounts: startSearch, resetAccounts, - accounts: - accounts.length === 0 && withDefaultFollows - ? (defaultAccounts ?? []) - : accounts, + accounts: filteredAccounts, isLoading: loadingState === 'loading', isError: loadingState === 'error', }; From c08d13a65cc0434bb3c9d1c0e9ff03640cf77526 Mon Sep 17 00:00:00 2001 From: diondiondion Date: Fri, 5 Jun 2026 12:01:55 +0200 Subject: [PATCH 040/130] Fix missing null check when importing collections from notifications (#39300) --- app/javascript/mastodon/actions/notification_groups.ts | 2 +- app/javascript/mastodon/api_types/notifications.ts | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/app/javascript/mastodon/actions/notification_groups.ts b/app/javascript/mastodon/actions/notification_groups.ts index 6d2f00ece8d..8fc2f0d726e 100644 --- a/app/javascript/mastodon/actions/notification_groups.ts +++ b/app/javascript/mastodon/actions/notification_groups.ts @@ -88,7 +88,7 @@ function dispatchAssociatedRecords( fetchedStatuses.push(notification.status); } - if ('collection' in notification) { + if ('collection' in notification && notification.collection) { collections.push(notification.collection); } }); diff --git a/app/javascript/mastodon/api_types/notifications.ts b/app/javascript/mastodon/api_types/notifications.ts index 4836c37e6af..a06aab78844 100644 --- a/app/javascript/mastodon/api_types/notifications.ts +++ b/app/javascript/mastodon/api_types/notifications.ts @@ -90,22 +90,22 @@ interface ReportNotificationJSON extends BaseNotificationJSON { interface AddedToCollectionNotificationGroupJSON extends BaseNotificationGroupJSON { type: 'added_to_collection'; - collection: ApiCollectionJSON; + collection: ApiCollectionJSON | null; } interface AddedToCollectionNotificationJSON extends BaseNotificationJSON { type: 'added_to_collection'; - collection: ApiCollectionJSON; + collection: ApiCollectionJSON | null; } interface CollectionUpdateNotificationGroupJSON extends BaseNotificationGroupJSON { type: 'collection_update'; - collection: ApiCollectionJSON; + collection: ApiCollectionJSON | null; } interface CollectionUpdateNotificationJSON extends BaseNotificationJSON { type: 'collection_update'; - collection: ApiCollectionJSON; + collection: ApiCollectionJSON | null; } type SimpleNotificationTypes = 'follow' | 'follow_request' | 'admin.sign_up'; From 7cd824a9983e40dd098e5213aa9598d46b1d44df Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Fri, 5 Jun 2026 13:59:57 +0200 Subject: [PATCH 041/130] Update dependency chewy to v8.3.1 (#39298) 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 57eb2045b07..4aff8dc4169 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -159,7 +159,7 @@ GEM cbor (0.5.10.2) cgi (0.5.1) charlock_holmes (0.7.9) - chewy (8.3.0) + chewy (8.3.1) activesupport (>= 7.2) elasticsearch (>= 8.14, < 9.0) elasticsearch-dsl From 24609bf0418d8f3be7cd1869673eeeaeca6f1909 Mon Sep 17 00:00:00 2001 From: Claire Date: Fri, 5 Jun 2026 14:45:28 +0200 Subject: [PATCH 042/130] Change rule acceptance link to form (#39283) --- app/views/auth/registrations/rules.html.haml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/app/views/auth/registrations/rules.html.haml b/app/views/auth/registrations/rules.html.haml index 54c21e77987..69b42b993f0 100644 --- a/app/views/auth/registrations/rules.html.haml +++ b/app/views/auth/registrations/rules.html.haml @@ -4,7 +4,7 @@ - content_for :header_tags do = render partial: 'shared/og', locals: { description: description_for_sign_up(@invite) } -.simple_form += form_with class: :simple_form, method: :get, url: new_user_registration_path do |form| = render 'auth/shared/progress', stage: 'rules' - if @invite.present? && @invite.autofollow? @@ -20,6 +20,6 @@ = render collection: @rule_translations, partial: 'auth/rule_translations/rule_translation' .stacked-actions - - accept_path = @invite_code.present? ? public_invite_url(invite_code: @invite_code, accept: @accept_token) : new_user_registration_path(accept: @accept_token) - = link_to t('auth.rules.accept'), accept_path, class: 'button' + = form.hidden_field :invite_code, value: @invite_code if @invite_code.present? + = form.button t('auth.rules.accept'), name: :accept, type: :submit, class: :button, value: @accept_token = link_to t('auth.rules.back'), root_path, class: 'button button-secondary' From 472b28e5dd749d8bbdaf798cdd77d20bce464bf9 Mon Sep 17 00:00:00 2001 From: batumi14 Date: Fri, 5 Jun 2026 13:34:13 +0000 Subject: [PATCH 043/130] Add Lazuri, Mingrelian and Ottoman Turkish to languages helper (#38648) --- app/helpers/languages_helper.rb | 3 +++ 1 file changed, 3 insertions(+) diff --git a/app/helpers/languages_helper.rb b/app/helpers/languages_helper.rb index bc4287c7248..892249aab9b 100644 --- a/app/helpers/languages_helper.rb +++ b/app/helpers/languages_helper.rb @@ -199,8 +199,10 @@ module LanguagesHelper kab: ['Kabyle', 'Taqbaylit'].freeze, ldn: ['Láadan', 'Láadan'].freeze, lfn: ['Lingua Franca Nova', 'lingua franca nova'].freeze, + lzz: ['Lazuri', 'ლაზური ნენა'].freeze, moh: ['Mohawk', 'Kanienʼkéha'].freeze, nds: ['Low German', 'Plattdüütsch'].freeze, + ota: ['Ottoman Turkish', 'لسان عثمانی'].freeze, pdc: ['Pennsylvania Dutch', 'Pennsilfaani-Deitsch'].freeze, sco: ['Scots', 'Scots'].freeze, sma: ['Southern Sami', 'Åarjelsaemien Gïele'].freeze, @@ -209,6 +211,7 @@ module LanguagesHelper tok: ['Toki Pona', 'toki pona'].freeze, vai: ['Vai', 'ꕙꔤ'].freeze, xal: ['Kalmyk', 'Хальмг келн'].freeze, + xmf: ['Mingrelian', 'მარგალური ნინა'].freeze, zba: ['Balaibalan', 'باليبلن'].freeze, zgh: ['Standard Moroccan Tamazight', 'ⵜⴰⵎⴰⵣⵉⵖⵜ'].freeze, }.freeze From 2778eeffbaf86747c1da84929bdd9acb4adca814 Mon Sep 17 00:00:00 2001 From: Claire Date: Fri, 5 Jun 2026 16:24:42 +0200 Subject: [PATCH 044/130] =?UTF-8?q?Add=20link=20to=20profile=20editing=20f?= =?UTF-8?q?rom=20=E2=80=9CPrivacy=20and=20reach=E2=80=9D=20(#39309)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/javascript/styles/mastodon/admin.scss | 2 ++ app/views/settings/privacy/show.html.haml | 8 ++++++++ config/locales/en.yml | 1 + 3 files changed, 11 insertions(+) diff --git a/app/javascript/styles/mastodon/admin.scss b/app/javascript/styles/mastodon/admin.scss index 0abcefaa4b7..836c5c60ca5 100644 --- a/app/javascript/styles/mastodon/admin.scss +++ b/app/javascript/styles/mastodon/admin.scss @@ -487,6 +487,8 @@ $content-width: 840px; .title { font-weight: 600; margin-bottom: 8px; + font-size: inherit; + line-height: inherit; } a { diff --git a/app/views/settings/privacy/show.html.haml b/app/views/settings/privacy/show.html.haml index 67026a62e88..6de1bdfca8c 100644 --- a/app/views/settings/privacy/show.html.haml +++ b/app/views/settings/privacy/show.html.haml @@ -38,6 +38,14 @@ .fields-group = ff.input :show_application, wrapper: :with_label + %aside.callout + = material_symbol 'info' + .content + .body + %p.title= t('edit_profile.redesign_title') + %p= t('edit_profile.privacy_redesign_body') + = link_to t('edit_profile.redesign_button'), '/profile/edit' + - if Rails.application.config.x.email_subscriptions && Setting.email_subscriptions && current_user.can?(:manage_email_subscriptions) %h2= t('privacy.email_subscriptions') diff --git a/config/locales/en.yml b/config/locales/en.yml index 0ad0c8591a3..7bd0568fb9c 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -1501,6 +1501,7 @@ en: your_appeal_rejected: Your appeal has been rejected edit_profile: other: Other + privacy_redesign_body: The choice to show your follows and followers is now made directly from your profile. redesign_body: Profile editing can now be accessed directly from the profile page. redesign_button: Go there redesign_title: There’s a new profile editing experience From b3a40bb010c865ffbf90e00e0d0e4f956f13933e Mon Sep 17 00:00:00 2001 From: David Bento Date: Fri, 5 Jun 2026 15:45:01 +0100 Subject: [PATCH 045/130] Fix "change thumbnail" button being visible when it shouldn't (#35186) (#38467) --- .../alt_text_modal/__tests__/index-test.tsx | 91 +++++++++++++++++++ .../features/alt_text_modal/index.tsx | 4 +- 2 files changed, 94 insertions(+), 1 deletion(-) create mode 100644 app/javascript/mastodon/features/alt_text_modal/__tests__/index-test.tsx diff --git a/app/javascript/mastodon/features/alt_text_modal/__tests__/index-test.tsx b/app/javascript/mastodon/features/alt_text_modal/__tests__/index-test.tsx new file mode 100644 index 00000000000..709e0ff6c29 --- /dev/null +++ b/app/javascript/mastodon/features/alt_text_modal/__tests__/index-test.tsx @@ -0,0 +1,91 @@ +// app/javascript/mastodon/features/alt_text_modal/__tests__/index-test.tsx + +import { IntlProvider } from 'react-intl'; + +import { List, Map } from 'immutable'; + +import { render } from '@testing-library/react'; +import { vi } from 'vitest'; + +import type { RootState } from 'mastodon/store'; +import { useAppSelector } from 'mastodon/store'; + +import { AltTextModal } from '../index'; + +vi.mock('mastodon/store', () => ({ + useAppSelector: vi.fn(), + useAppDispatch: () => vi.fn(), +})); + +describe('', () => { + const mediaId = '123'; + const handleClose = vi.fn(); + + beforeEach(() => { + vi.clearAllMocks(); + }); + + const renderComponent = () => { + return render( + + + , + ); + }; + + it('renders thumbnail upload button when video is unattached', () => { + vi.mocked(useAppSelector).mockImplementation( + (selector: (state: RootState) => unknown) => { + const mockState = { + compose: Map({ + language: 'en', + media_attachments: List([ + Map({ + id: mediaId, + type: 'video', + unattached: true, + meta: Map({ focus: Map({ x: 0, y: 0 }) }), + }), + ]), + }), + accounts: Map(), + } as unknown as RootState; + + return selector(mockState); + }, + ); + + const { container } = renderComponent(); + + const uploadInput = container.querySelector('#upload-modal__thumbnail'); + expect(uploadInput).not.toBeNull(); + }); + + it('hides thumbnail upload button when video is attached', () => { + vi.mocked(useAppSelector).mockImplementation( + (selector: (state: RootState) => unknown) => { + const mockState = { + compose: Map({ + language: 'en', + media_attachments: List([ + Map({ + id: mediaId, + type: 'video', + unattached: false, + meta: Map({ focus: Map({ x: 0, y: 0 }) }), + }), + ]), + }), + accounts: Map(), + } as unknown as RootState; + + return selector(mockState); + }, + ); + + const { container } = renderComponent(); + + const uploadInput = container.querySelector('#upload-modal__thumbnail'); + expect(uploadInput).toBeNull(); + }); +}); diff --git a/app/javascript/mastodon/features/alt_text_modal/index.tsx b/app/javascript/mastodon/features/alt_text_modal/index.tsx index 3c54fa47249..fc00e60a51d 100644 --- a/app/javascript/mastodon/features/alt_text_modal/index.tsx +++ b/app/javascript/mastodon/features/alt_text_modal/index.tsx @@ -283,6 +283,7 @@ export const AltTextModal = forwardRef>( ); const type = media?.get('type') as string; const valid = length(description) <= MAX_LENGTH; + const unattached = media?.get('unattached') as boolean | undefined; const handleDescriptionChange = useCallback( (e: React.ChangeEvent) => { @@ -433,7 +434,8 @@ export const AltTextModal = forwardRef>( onPositionChange={handlePositionChange} /> - {(type === 'audio' || type === 'video') && ( + {/* This button is hidden for attached audio/video files, as they are already posted */} + {(type === 'audio' || type === 'video') && unattached && ( Date: Fri, 5 Jun 2026 18:02:20 +0200 Subject: [PATCH 046/130] fix naming of custom filter export param (#39304) --- app/models/export.rb | 2 +- spec/requests/settings/exports/custom_filters_spec.rb | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/app/models/export.rb b/app/models/export.rb index 94b27533755..2b92dc62008 100644 --- a/app/models/export.rb +++ b/app/models/export.rb @@ -62,7 +62,7 @@ class Export data_collection[:custom_filters] << { title: filter.title, - expire_at: filter.expires_at, + expires_at: filter.expires_at, context: filter.context, action: filter.action, keywords_attributes: keywords_attributes, diff --git a/spec/requests/settings/exports/custom_filters_spec.rb b/spec/requests/settings/exports/custom_filters_spec.rb index c9c7645ddb7..df5bbfdd039 100644 --- a/spec/requests/settings/exports/custom_filters_spec.rb +++ b/spec/requests/settings/exports/custom_filters_spec.rb @@ -17,7 +17,7 @@ RSpec.describe 'Settings / Exports / CustomFilters' do { 'custom_filters' => [ { 'title' => other_filter.phrase, - 'expire_at' => nil, + 'expires_at' => nil, 'context' => other_filter.context, 'action' => other_filter.action, 'keywords_attributes' => [{ @@ -31,7 +31,7 @@ RSpec.describe 'Settings / Exports / CustomFilters' do }, { 'title' => filter.phrase, - 'expire_at' => nil, + 'expires_at' => nil, 'context' => filter.context, 'action' => filter.action, 'keywords_attributes' => [{ From 033dae3001c85dc1cfc9deb15d248c9034ef533d Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 8 Jun 2026 09:04:33 +0200 Subject: [PATCH 047/130] Update dependency doorkeeper to v5.9.2 (#39308) 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 4aff8dc4169..dcbcb8d9b08 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -210,7 +210,7 @@ GEM activerecord (>= 7.0, < 9.0) docile (1.4.1) domain_name (0.6.20240107) - doorkeeper (5.9.1) + doorkeeper (5.9.2) railties (>= 5) dotenv (3.2.0) drb (2.2.3) From a5e763c33070e5594c229b8ddedecaa7dcbae3c3 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 8 Jun 2026 07:05:12 +0000 Subject: [PATCH 048/130] Update dependency ioredis to v5.11.1 (#39301) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- yarn.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/yarn.lock b/yarn.lock index b6b489b702a..48ba75487f8 100644 --- a/yarn.lock +++ b/yarn.lock @@ -8836,8 +8836,8 @@ __metadata: linkType: hard "ioredis@npm:^5.3.2": - version: 5.11.0 - resolution: "ioredis@npm:5.11.0" + version: 5.11.1 + resolution: "ioredis@npm:5.11.1" dependencies: "@ioredis/commands": "npm:1.10.0" cluster-key-slot: "npm:1.1.1" @@ -8846,7 +8846,7 @@ __metadata: redis-errors: "npm:1.2.0" redis-parser: "npm:3.0.0" standard-as-callback: "npm:2.1.0" - checksum: 10c0/6bba1eda256bafabf581089ec24c98bccc5af614b108f13fca6672ea707c36d67e7021c4f0965cbe0294e7a3964b6dbd897a95ed7f8fe82a175531219e91b84f + checksum: 10c0/a8b27043cf2c045dfc93f40a32ce24cf9f8b57799a37f4234c4b925c365ccf131629590f94a512f546fda2ba8ed034009c94c4933ecd44c50bc166636d929fd6 languageName: node linkType: hard From ea5b613796e2a933592697181d246227d77f2179 Mon Sep 17 00:00:00 2001 From: Eugen Rochko Date: Mon, 8 Jun 2026 09:05:27 +0200 Subject: [PATCH 049/130] Add ability to view individual newsletters in admin UI (#39271) --- .../accounts_controller.rb | 36 ++++++++ .../admin/email_subscriptions_controller.rb | 14 ++++ app/javascript/styles/mastodon/admin.scss | 58 +++++++++++++ app/javascript/styles/mastodon/tables.scss | 10 +++ app/policies/email_subscription_policy.rb | 4 + .../email_subscriptions/_accounts.html.haml | 9 +- .../email_subscriptions/_status.html.haml | 8 ++ .../accounts/show.html.haml | 84 +++++++++++++++++++ app/views/settings/privacy/show.html.haml | 6 +- config/locales/be.yml | 2 - config/locales/cs.yml | 1 - config/locales/cy.yml | 2 - config/locales/da.yml | 2 - config/locales/de.yml | 2 - config/locales/el.yml | 2 - config/locales/en.yml | 19 ++++- config/locales/es-AR.yml | 2 - config/locales/es-MX.yml | 2 - config/locales/es.yml | 2 - config/locales/et.yml | 2 - config/locales/fa.yml | 2 - config/locales/fi.yml | 2 - config/locales/fr-CA.yml | 2 - config/locales/fr.yml | 2 - config/locales/ga.yml | 2 - config/locales/gl.yml | 2 - config/locales/he.yml | 2 - config/locales/hu.yml | 2 - config/locales/is.yml | 2 - config/locales/it.yml | 2 - config/locales/kab.yml | 2 - config/locales/lad.yml | 1 - config/locales/nan-TW.yml | 2 - config/locales/nl.yml | 2 - config/locales/nn.yml | 2 - config/locales/pt-BR.yml | 2 - config/locales/ru.yml | 1 - config/locales/sq.yml | 2 - config/locales/sv.yml | 2 - config/locales/tr.yml | 2 - config/locales/vi.yml | 2 - config/locales/zh-CN.yml | 2 - config/locales/zh-TW.yml | 2 - config/routes/admin.rb | 9 +- 44 files changed, 248 insertions(+), 72 deletions(-) create mode 100644 app/controllers/admin/email_subscriptions/accounts_controller.rb create mode 100644 app/views/admin/email_subscriptions/_status.html.haml create mode 100644 app/views/admin/email_subscriptions/accounts/show.html.haml diff --git a/app/controllers/admin/email_subscriptions/accounts_controller.rb b/app/controllers/admin/email_subscriptions/accounts_controller.rb new file mode 100644 index 00000000000..a5ae9b39201 --- /dev/null +++ b/app/controllers/admin/email_subscriptions/accounts_controller.rb @@ -0,0 +1,36 @@ +# frozen_string_literal: true + +class Admin::EmailSubscriptions::AccountsController < Admin::BaseController + before_action :require_enabled! + before_action :set_account + + def show + authorize :email_subscription, :show? + @email_subscriptions_count = EmailSubscription.where(account: @account).count + @email_subscriptions = EmailSubscription.where(account: @account).page(params[:page]) + end + + def enable + authorize :email_subscription, :enable? + @account.user.settings['email_subscriptions'] = true + @account.user.save! + redirect_to admin_email_subscriptions_account_path(@account.id) + end + + def disable + authorize :email_subscription, :disable? + @account.user.settings['email_subscriptions'] = false + @account.user.save! + redirect_to admin_email_subscriptions_account_path(@account.id) + end + + private + + def require_enabled! + raise ActionController::RoutingError, 'Feature disabled' unless Rails.application.config.x.email_subscriptions + end + + def set_account + @account = Account.find(params[:id]) + end +end diff --git a/app/controllers/admin/email_subscriptions_controller.rb b/app/controllers/admin/email_subscriptions_controller.rb index af71eb70123..dae7d452b87 100644 --- a/app/controllers/admin/email_subscriptions_controller.rb +++ b/app/controllers/admin/email_subscriptions_controller.rb @@ -1,6 +1,8 @@ # frozen_string_literal: true class Admin::EmailSubscriptionsController < Admin::BaseController + before_action :set_email_subscription, only: :destroy + def index authorize :email_subscription, :index? @@ -9,6 +11,12 @@ class Admin::EmailSubscriptionsController < Admin::BaseController @accounts = Account.local.where.associated(:email_subscriptions).includes(:user) end + def destroy + authorize :email_subscription, :destroy? + @email_subscription.destroy! + redirect_to admin_email_subscriptions_account_path(@email_subscription.account_id) + end + def disable authorize :email_subscription, :disable? Setting.email_subscriptions = false @@ -20,4 +28,10 @@ class Admin::EmailSubscriptionsController < Admin::BaseController Admin::EmailSubscriptionsPurgeWorker.perform_async redirect_to admin_email_subscriptions_path, notice: I18n.t('admin.email_subscriptions.purged_msg') end + + private + + def set_email_subscription + @email_subscription = EmailSubscription.find(params[:id]) + end end diff --git a/app/javascript/styles/mastodon/admin.scss b/app/javascript/styles/mastodon/admin.scss index 836c5c60ca5..7e5798ae542 100644 --- a/app/javascript/styles/mastodon/admin.scss +++ b/app/javascript/styles/mastodon/admin.scss @@ -468,6 +468,22 @@ $content-width: 840px; background-color: var(--color-bg-brand-soft); } + &.variantWarning { + background-color: var(--color-bg-warning-softest); + + .icon { + background-color: var(--color-bg-warning-soft); + } + } + + &.variantError { + background-color: var(--color-bg-error-softest); + + .icon { + background-color: var(--color-bg-error-soft); + } + } + .content { display: flex; flex-direction: column; @@ -2451,4 +2467,46 @@ a.sparkline { background: var(--color-bg-success-softest); font-size: 13px; font-weight: 600; + + &.positive { + background: var(--color-bg-success-softest); + } + + &.negative { + background: var(--color-bg-error-softest); + } +} + +.metadata { + display: flex; + gap: 40px; + margin: 16px 0; + + & > div { + display: flex; + flex-direction: column; + gap: 4px; + flex-shrink: 0; + } + + dt { + font-size: 13px; + color: var(--color-text-secondary); + } + + dd { + font-size: 16px; + font-weight: 600; + line-height: 22.4px; + + .status-badge { + box-sizing: border-box; + padding: 4px; + font-size: inherit; + height: 24px; + display: flex; + align-items: center; + justify-content: center; + } + } } diff --git a/app/javascript/styles/mastodon/tables.scss b/app/javascript/styles/mastodon/tables.scss index 0023ea353c7..ff2935a46a6 100644 --- a/app/javascript/styles/mastodon/tables.scss +++ b/app/javascript/styles/mastodon/tables.scss @@ -129,6 +129,10 @@ color: var(--color-text-primary); font-weight: 600; } + + .status-badge { + padding: 0; + } } &.batch-table { @@ -194,6 +198,12 @@ a.table-action-link { justify-content: center; padding: 4px; aspect-ratio: 1; + + &.table-icon-link--danger { + border-radius: 8px; + border: 1px solid var(--color-border-primary); + color: var(--color-text-error); + } } .batch-table { diff --git a/app/policies/email_subscription_policy.rb b/app/policies/email_subscription_policy.rb index 201bd72c131..3da3eedb1da 100644 --- a/app/policies/email_subscription_policy.rb +++ b/app/policies/email_subscription_policy.rb @@ -10,4 +10,8 @@ class EmailSubscriptionPolicy < ApplicationPolicy alias disable? index? alias purge? index? + + alias show? index? + + alias destroy? index? end diff --git a/app/views/admin/email_subscriptions/_accounts.html.haml b/app/views/admin/email_subscriptions/_accounts.html.haml index 456455af4e2..0722453a0c7 100644 --- a/app/views/admin/email_subscriptions/_accounts.html.haml +++ b/app/views/admin/email_subscriptions/_accounts.html.haml @@ -32,14 +32,13 @@ %strong %bdi= display_name(account) %td.valign-middle - - if account.user_can?(:manage_email_subscriptions) && account.user_email_subscriptions_enabled? - %span.status-badge.positive= t('.active') - - else - %span.status-badge.negative= t('.inactive') + = render 'status', account: account %td.valign-middle = account.email_subscriptions.count %td.valign-middle - if account.last_status_at.present? = l account.last_status_at + - else + \- %td.valign-middle.align-end - = link_to material_symbol('chevron_right'), admin_account_path(account.id), class: 'table-icon-link' + = link_to material_symbol('chevron_right'), admin_email_subscriptions_account_path(account.id), class: 'table-icon-link' diff --git a/app/views/admin/email_subscriptions/_status.html.haml b/app/views/admin/email_subscriptions/_status.html.haml new file mode 100644 index 00000000000..d634a5d06b0 --- /dev/null +++ b/app/views/admin/email_subscriptions/_status.html.haml @@ -0,0 +1,8 @@ +- if account.user_can?(:manage_email_subscriptions) && account.user_email_subscriptions_enabled? + %span.status-badge.positive= t('email_subscriptions.active') +- elsif account.user_can?(:manage_email_subscriptions) && !account.user_email_subscriptions_enabled? + %span.status-badge.negative= t('email_subscriptions.disabled') +- elsif account.user_email_subscriptions_enabled? && !account.user_can?(:manage_email_subscriptions) + %span.status-badge.negative= t('email_subscriptions.no_access') +- else + %span.status-badge.negative= t('email_subscriptions.inactive') diff --git a/app/views/admin/email_subscriptions/accounts/show.html.haml b/app/views/admin/email_subscriptions/accounts/show.html.haml new file mode 100644 index 00000000000..8f22f82739b --- /dev/null +++ b/app/views/admin/email_subscriptions/accounts/show.html.haml @@ -0,0 +1,84 @@ +- content_for :page_title do + = t('.title', name: display_name(@account)) + +- content_for :heading do + .content__heading__row + .heading-with-lead + %h1= display_name(@account) + %p.lead= acct(@account) + .content__heading__actions + = link_to t('.view_account'), admin_account_path(@account.id), class: 'button button-secondary' + - if @account.user_can?(:manage_email_subscriptions) + - if @account.user_email_subscriptions_enabled? + = link_to t('.disable_feature'), + disable_admin_email_subscriptions_account_path(@account.id), + class: 'button button-secondary button--destructive', + data: { method: 'post', confirm: t('.confirm_disable_feature', name: display_name(@account)) } + - else + = link_to t('.enable_feature'), enable_admin_email_subscriptions_account_path(@account.id), class: 'button button-secondary', data: { method: 'post' } + +%dl.metadata + %div + %dt= t('email_subscriptions.status') + %dd= render 'admin/email_subscriptions/status', account: @account + %div + %dt= t('email_subscriptions.subscribers') + %dd= number_with_delimiter @email_subscriptions_count + %div + %dt= t('admin.email_subscriptions.accounts.last_email') + %dd + - if @account.last_status_at.present? + = l(@account.last_status_at) + - else + \- + +- if !@account.user_email_subscriptions_enabled? + %aside.callout.variantError + = material_symbol 'info' + .content + .body + %p= t('.disabled') +- elsif @account.user_email_subscriptions_enabled? && !@account.user_can?(:manage_email_subscriptions) + %aside.callout.variantError + = material_symbol 'info' + .content + .body + %p= t('.no_access_html', roles_path: admin_roles_path) +- else + %aside.callout.variantWarning + = material_symbol 'warning' + .content + .body + %p= t('.consent') + +.table-wrapper + - if @email_subscriptions.empty? + .empty-state + = emptyphaunt + + .empty-state__title-and-description + .empty-state__title-and-description__title + = t('.empty.no_subscribers_yet') + .empty-state__title-and-description__description + = t('.empty.hint') + - else + %table.table + %thead + %tr + %th= t('.email') + %th= t('.date') + %th + %tbody + - @email_subscriptions.each do |email_subscription| + %tr + %td.valign-middle + = email_subscription.email + %td.valign-middle + = l(email_subscription.created_at) + %td.valign-middle.align-end + = link_to material_symbol('delete'), + admin_email_subscription_path(email_subscription), + data: { method: 'delete', confirm: t('.confirm_remove_subscriber', email: email_subscription.email, name: display_name(@account)) }, + class: 'table-icon-link table-icon-link--danger' + += paginate @email_subscriptions diff --git a/app/views/settings/privacy/show.html.haml b/app/views/settings/privacy/show.html.haml index 6de1bdfca8c..c64a135597b 100644 --- a/app/views/settings/privacy/show.html.haml +++ b/app/views/settings/privacy/show.html.haml @@ -57,7 +57,11 @@ %tbody %tr %th= t('email_subscriptions.status') - %td= @account.user_email_subscriptions_enabled? ? t('email_subscriptions.active') : t('email_subscriptions.inactive') + %td + - if @account.user_email_subscriptions_enabled? + %span.status-badge.positive= t('email_subscriptions.active') + - else + %span.status-badge.negative= t('email_subscriptions.inactive') %tr %th= t('email_subscriptions.subscribers') %td= number_with_delimiter @email_subscriptions_count diff --git a/config/locales/be.yml b/config/locales/be.yml index 5193b6aae78..091bf2f4657 100644 --- a/config/locales/be.yml +++ b/config/locales/be.yml @@ -520,11 +520,9 @@ be: email_subscriptions: accounts: account: Уліковы запіс - active: Актыўны empty: hint: У ніводнага ўліковага запісу няма падпісчыкаў. no_lists_yet: Пакуль няма спісаў - inactive: Неактыўны last_email: Апошняя электронная пошта lead: Уліковыя запісы, якія ўключылі гэту функцыю і маюць падпісчыкаў, будуць паказаныя знізу. status: Стан diff --git a/config/locales/cs.yml b/config/locales/cs.yml index 803908b49eb..5aa8b45b1e0 100644 --- a/config/locales/cs.yml +++ b/config/locales/cs.yml @@ -508,7 +508,6 @@ cs: email_subscriptions: accounts: account: Účet - inactive: Neaktivní last_email: Poslední e-mail status: Status compliance_settings: diff --git a/config/locales/cy.yml b/config/locales/cy.yml index 6c1ba5f89d9..50a5fbd9556 100644 --- a/config/locales/cy.yml +++ b/config/locales/cy.yml @@ -540,11 +540,9 @@ cy: email_subscriptions: accounts: account: Cyfrif - active: Gweithredol empty: hint: Does gan unrhyw gyfrifon ddim tanysgrifwyr eto. no_lists_yet: Dim rhestrau eto - inactive: Anweithredol last_email: E-bost diwethaf lead: Bydd cyfrifon sydd wedi galluogi'r nodwedd ac sydd â thanysgrifwyr yn ymddangos isod. status: Statws diff --git a/config/locales/da.yml b/config/locales/da.yml index 0ff65b712e6..a60071bb5dc 100644 --- a/config/locales/da.yml +++ b/config/locales/da.yml @@ -500,11 +500,9 @@ da: email_subscriptions: accounts: account: Konto - active: Aktive empty: hint: Ingen konti har abonnenter endnu. no_lists_yet: Ingen lister endnu - inactive: Inaktive last_email: Seneste e-mail lead: Nedenfor vises de konti, der har aktiveret funktionen og har abonnenter. status: Status diff --git a/config/locales/de.yml b/config/locales/de.yml index 27a49b4d797..33224000e81 100644 --- a/config/locales/de.yml +++ b/config/locales/de.yml @@ -500,11 +500,9 @@ de: email_subscriptions: accounts: account: Konto - active: Aktiviert empty: hint: Bisher wurden keine Konten abonniert. no_lists_yet: Noch keine Listen vorhanden - inactive: Deaktiviert last_email: Letzte E-Mail lead: Konten, die die Funktion aktiviert haben und abonniert wurden, werden unten angezeigt. status: Status diff --git a/config/locales/el.yml b/config/locales/el.yml index 355af8693bc..11093770271 100644 --- a/config/locales/el.yml +++ b/config/locales/el.yml @@ -500,11 +500,9 @@ el: email_subscriptions: accounts: account: Λογαριασμός - active: Ενεργός empty: hint: Κανένας λογαριασμός δεν έχει συνδρομητές ακόμη. no_lists_yet: Καμία λίστα ακόμη - inactive: Ανενεργός last_email: Τελευταίο email lead: Λογαριασμοί που έχουν ενεργοποιήσει τη λειτουργία και έχουν συνδρομητές θα εμφανίζονται παρακάτω. status: Κατάσταση diff --git a/config/locales/en.yml b/config/locales/en.yml index 7bd0568fb9c..95631bd86b9 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -500,13 +500,26 @@ en: email_subscriptions: accounts: account: Account - active: Active empty: hint: No accounts have subscribers yet. no_lists_yet: No lists yet - inactive: Inactive last_email: Last email lead: Accounts who have enabled the feature and have subscribers will show below. + show: + confirm_disable_feature: Disable email newsletters for %{name}? Email updates will no longer be sent for this account. The user will still be able to re-enable the feature in their account settings. To permanently remove access to this feature, edit the account’s permission in Roles. + confirm_remove_subscriber: "%{email} will no longer receive emails from %{name}. This action cannot be undone." + consent: Subscribers have only consented to receiving posts via email. Do not use this list for other purposes. + date: Date of sign-up + disable_feature: Disable feature + disabled: The feature was disabled and emails are no longer being sent to this list. + email: Email address + empty: + hint: Nobody has subscribed to this account yet. + no_subscribers_yet: No subscribers yet + enable_feature: Enable feature + no_access_html: This account no longer has the permissions required to enable the feature. Change this in Roles. + title: Email newsletters of %{name} + view_account: View account status: Status subscribers: Subscribers title: Mailing lists @@ -1534,7 +1547,9 @@ en: success_html: You'll now start receiving emails when %{name} publishes new posts. Add %{sender} to your contacts so these posts don't end up in your Spam folder. title: You're signed up unsubscribe: Unsubscribe + disabled: Disabled inactive: Inactive + no_access: No access status: Status subscribers: Subscribers emoji_styles: diff --git a/config/locales/es-AR.yml b/config/locales/es-AR.yml index be98ad08d89..4ce9d037bd4 100644 --- a/config/locales/es-AR.yml +++ b/config/locales/es-AR.yml @@ -500,11 +500,9 @@ es-AR: email_subscriptions: accounts: account: Cuenta - active: Activa empty: hint: Aún no hay cuentas con suscriptores. no_lists_yet: Aún no hay listas - inactive: Inactiva last_email: Último correo electrónico lead: Las cuentas que habilitaron la función y tienen suscriptores se mostrarán a continuación. status: Estado diff --git a/config/locales/es-MX.yml b/config/locales/es-MX.yml index 746f64655b5..fc13d70dbeb 100644 --- a/config/locales/es-MX.yml +++ b/config/locales/es-MX.yml @@ -500,11 +500,9 @@ es-MX: email_subscriptions: accounts: account: Cuenta - active: Activa empty: hint: Ninguna cuenta tiene suscriptores todavía. no_lists_yet: No hay listas todavía - inactive: Inactiva last_email: Último correo electrónico lead: A continuación se mostrarán las cuentas que hayan activado la función y tengan suscriptores. status: Estado diff --git a/config/locales/es.yml b/config/locales/es.yml index 1740f424649..20d232b5e97 100644 --- a/config/locales/es.yml +++ b/config/locales/es.yml @@ -500,11 +500,9 @@ es: email_subscriptions: accounts: account: Cuenta - active: Activa empty: hint: Aún no hay cuentas con suscriptores. no_lists_yet: Aún no hay listas - inactive: Inactiva last_email: Último correo electrónico lead: Las cuentas que han habilitado la función y tienen suscriptores se mostrarán a continuación. status: Estado diff --git a/config/locales/et.yml b/config/locales/et.yml index 1c41ade363d..c5654dce02e 100644 --- a/config/locales/et.yml +++ b/config/locales/et.yml @@ -500,11 +500,9 @@ et: email_subscriptions: accounts: account: Konto - active: Aktiivne empty: hint: Ühelgi kontol pole veel tellijaid. no_lists_yet: Veel pole loetelusid - inactive: Mitteaktiivne last_email: Viimane e-post lead: Allpool kuvatakse kontod, kus see funktsioon on aktiveeritud ja millel on tellijaid. status: Olek diff --git a/config/locales/fa.yml b/config/locales/fa.yml index c9b2216a353..0f0e6c3e0d3 100644 --- a/config/locales/fa.yml +++ b/config/locales/fa.yml @@ -499,11 +499,9 @@ fa: email_subscriptions: accounts: account: حساب - active: فعّال empty: hint: هنوز هیچ حسابی مشترک نشده. no_lists_yet: هنوز سیاهه‌ای وجود ندارد - inactive: غیرفعّال last_email: آخرین رایانامه status: وضعیت subscribers: مشترکان diff --git a/config/locales/fi.yml b/config/locales/fi.yml index 536db62ae13..46117cb5561 100644 --- a/config/locales/fi.yml +++ b/config/locales/fi.yml @@ -500,11 +500,9 @@ fi: email_subscriptions: accounts: account: Tili - active: Käytössä empty: hint: Millään tilillä ei ole vielä tilaajia. no_lists_yet: Ei vielä listoja - inactive: Poissa käytöstä last_email: Viimeisin sähköpostiviesti lead: Alla näkyvät tilit, jotka ovat ottaneet ominaisuuden käyttöön ja joilla on tilaajia. status: Tila diff --git a/config/locales/fr-CA.yml b/config/locales/fr-CA.yml index 385791c40c8..afaa55e3ce8 100644 --- a/config/locales/fr-CA.yml +++ b/config/locales/fr-CA.yml @@ -500,11 +500,9 @@ fr-CA: email_subscriptions: accounts: account: Compte - active: Actif empty: hint: Aucun compte n'a d'abonné·e·s pour l'instant. no_lists_yet: Aucune liste pour l'instant - inactive: Inactif last_email: Dernier courriel lead: Les comptes ayant activé la fonctionnalité et qui ont des abonné·e·s apparaîtront ci-dessous. status: État diff --git a/config/locales/fr.yml b/config/locales/fr.yml index 7d2ab2e99a4..325ba3382be 100644 --- a/config/locales/fr.yml +++ b/config/locales/fr.yml @@ -500,11 +500,9 @@ fr: email_subscriptions: accounts: account: Compte - active: Actif empty: hint: Aucun compte n'a d'abonné·e·s pour l'instant. no_lists_yet: Aucune liste pour l'instant - inactive: Inactif last_email: Dernier courriel lead: Les comptes ayant activé la fonctionnalité et qui ont des abonné·e·s apparaîtront ci-dessous. status: État diff --git a/config/locales/ga.yml b/config/locales/ga.yml index 437fcd3d946..efd086f6863 100644 --- a/config/locales/ga.yml +++ b/config/locales/ga.yml @@ -530,11 +530,9 @@ ga: email_subscriptions: accounts: account: Cuntas - active: Gníomhach empty: hint: Níl aon síntiúsóirí ag aon chuntas go fóill. no_lists_yet: Gan aon liostaí fós - inactive: Neamhghníomhach last_email: Ríomhphost deireanach lead: Taispeánfar thíos cuntais a bhfuil an ghné cumasaithe acu agus a bhfuil síntiúsóirí acu. status: Stádas diff --git a/config/locales/gl.yml b/config/locales/gl.yml index 1f6849df951..22df0fe8d66 100644 --- a/config/locales/gl.yml +++ b/config/locales/gl.yml @@ -500,11 +500,9 @@ gl: email_subscriptions: accounts: account: Conta - active: Activa empty: hint: Aínda non hai contas con subscritoras. no_lists_yet: Aínda non hai listas - inactive: Inactiva last_email: Último correo lead: Aquí móstranse as contas que activaron esta ferramenta e teñen subscritoras. status: Estado diff --git a/config/locales/he.yml b/config/locales/he.yml index c754a48df6d..0d0d706409c 100644 --- a/config/locales/he.yml +++ b/config/locales/he.yml @@ -520,11 +520,9 @@ he: email_subscriptions: accounts: account: חשבון - active: פעילים empty: hint: עדיין אין מנוי לאף חשבון. no_lists_yet: אין רשימות עדיין - inactive: לא פעילים last_email: הודעת דואל אחרונה lead: חשבונות שבהם הופעלה האפשרות ויש להם מנויים יופיעו להלן. status: מצב diff --git a/config/locales/hu.yml b/config/locales/hu.yml index 8049aee3b9a..9614ae84662 100644 --- a/config/locales/hu.yml +++ b/config/locales/hu.yml @@ -500,11 +500,9 @@ hu: email_subscriptions: accounts: account: Fiók - active: Aktív empty: hint: Egyik fióknak sincs feliratkozója. no_lists_yet: Még nincsenek listák - inactive: Inaktív last_email: Legutóbbi e-mail lead: A fiókok, melyek bekapcsolták a funkciót, és vannak feliratkozóik, itt fognak megjelenni alább. status: Állapot diff --git a/config/locales/is.yml b/config/locales/is.yml index 4099b1307ef..540072beb63 100644 --- a/config/locales/is.yml +++ b/config/locales/is.yml @@ -500,11 +500,9 @@ is: email_subscriptions: accounts: account: Aðgangur - active: Virkur empty: hint: Engir aðgangar eru ennþá með neina áskrifendur. no_lists_yet: Ennþá engir listar - inactive: Óvirkur last_email: Síðasti tölvupóstur lead: Aðgangar sem hafa virkjað eiginleikann og eru með áskrifendur munu birtast hér fyrir neðan. status: Staða diff --git a/config/locales/it.yml b/config/locales/it.yml index 491a5e909f8..c0c7df81753 100644 --- a/config/locales/it.yml +++ b/config/locales/it.yml @@ -500,11 +500,9 @@ it: email_subscriptions: accounts: account: Account - active: Attivo empty: hint: Non ci sono ancora account con iscritti. no_lists_yet: Non ci sono ancora liste - inactive: Inattivo last_email: Ultima email lead: Di seguito verranno visualizzati gli account che hanno attivato la funzionalità e che hanno degli iscritti. status: Stato diff --git a/config/locales/kab.yml b/config/locales/kab.yml index 7a90eab7ba2..d16c4b65a68 100644 --- a/config/locales/kab.yml +++ b/config/locales/kab.yml @@ -290,8 +290,6 @@ kab: email_subscriptions: accounts: account: Amiḍan - active: D urmid - inactive: D arurmid last_email: Imayl aneggaru status: Addad compliance_settings: diff --git a/config/locales/lad.yml b/config/locales/lad.yml index 271bf909efb..01496e3607e 100644 --- a/config/locales/lad.yml +++ b/config/locales/lad.yml @@ -471,7 +471,6 @@ lad: email_subscriptions: accounts: account: Kuento - active: Aktivo danger_zone: disable_feature: action: Inkapasita diff --git a/config/locales/nan-TW.yml b/config/locales/nan-TW.yml index 320c7db564e..587cb4a49c1 100644 --- a/config/locales/nan-TW.yml +++ b/config/locales/nan-TW.yml @@ -490,11 +490,9 @@ nan-TW: email_subscriptions: accounts: account: 口座 - active: 有效ê empty: hint: Iáu無半ê口座有訂ê lâng。 no_lists_yet: Iáu無列單 - inactive: 停止使用ah last_email: 上新ê電子phue箱 lead: 有啟用tsit ê功能koh有訂ê lâng ê口座ē展示佇下kha。 status: 狀態 diff --git a/config/locales/nl.yml b/config/locales/nl.yml index 09e152237f6..9a3c7a68dfb 100644 --- a/config/locales/nl.yml +++ b/config/locales/nl.yml @@ -500,11 +500,9 @@ nl: email_subscriptions: accounts: account: Account - active: Actief empty: hint: Geen enkel account heeft nog abonnees. no_lists_yet: Nog geen lijsten - inactive: Inactief last_email: Meest recente e-mail lead: Accounts die deze functionaliteit hebben ingeschakeld en abonnees hebben, worden hieronder getoond. status: Status diff --git a/config/locales/nn.yml b/config/locales/nn.yml index a599917d50b..7c0bc6104b2 100644 --- a/config/locales/nn.yml +++ b/config/locales/nn.yml @@ -500,11 +500,9 @@ nn: email_subscriptions: accounts: account: Konto - active: Aktiv empty: hint: Ingen brukarkontoar har abonnentar enno. no_lists_yet: Ingen lister enno - inactive: Ikkje aktiv last_email: Siste epost lead: Nedanfor vil du sjå brukarkontoar som har skrudd på dette og som har abonnentar. status: Status diff --git a/config/locales/pt-BR.yml b/config/locales/pt-BR.yml index d2decc54500..4fdf40888e8 100644 --- a/config/locales/pt-BR.yml +++ b/config/locales/pt-BR.yml @@ -500,11 +500,9 @@ pt-BR: email_subscriptions: accounts: account: Conta - active: Ativas empty: hint: Não há contas com inscritos ainda. no_lists_yet: Não há listas ainda - inactive: Inativas last_email: Último email lead: Contas que ativaram o recurso e têm inscritos aparecerão abaixo. status: Estado diff --git a/config/locales/ru.yml b/config/locales/ru.yml index a5418c13788..ee3a8cfa963 100644 --- a/config/locales/ru.yml +++ b/config/locales/ru.yml @@ -506,7 +506,6 @@ ru: email_subscriptions: accounts: account: Аккаунт - active: Актив status: Статус subscribers: Подписчики danger_zone: diff --git a/config/locales/sq.yml b/config/locales/sq.yml index 7fab3b09eee..243f9b8a10f 100644 --- a/config/locales/sq.yml +++ b/config/locales/sq.yml @@ -500,11 +500,9 @@ sq: email_subscriptions: accounts: account: Llogari - active: Aktive empty: hint: Ende s’ka llogari me pajtimtarë. no_lists_yet: Ende pa lista - inactive: Joaktive last_email: Email-i i fundit lead: Llogaritë që kanë aktivizuar veçorinë dhe kanë pajtimtarë do të shfaqen më poshtë. status: Gjendje diff --git a/config/locales/sv.yml b/config/locales/sv.yml index 2c33894f820..4434278bb0f 100644 --- a/config/locales/sv.yml +++ b/config/locales/sv.yml @@ -500,11 +500,9 @@ sv: email_subscriptions: accounts: account: Konto - active: Aktiv empty: hint: Inga konton har prenumeranter ännu. no_lists_yet: Inga listor ännu - inactive: Inaktiv last_email: Senaste e-post lead: Konton som har aktiverat funktionen och har prenumeranter kommer att visas nedan. status: Status diff --git a/config/locales/tr.yml b/config/locales/tr.yml index 96b924c0ad6..6115fdbdf95 100644 --- a/config/locales/tr.yml +++ b/config/locales/tr.yml @@ -500,11 +500,9 @@ tr: email_subscriptions: accounts: account: Hesap - active: Etkin empty: hint: Henüz hiçbir hesabın abonesi yok. no_lists_yet: Henüz liste yok - inactive: Etkin değil last_email: Son e-posta lead: Bu özelliği etkinleştirmiş ve abonesi olan hesaplar aşağıda gösterilecektir. status: Durum diff --git a/config/locales/vi.yml b/config/locales/vi.yml index 5476b43cf95..0363073bfb5 100644 --- a/config/locales/vi.yml +++ b/config/locales/vi.yml @@ -490,11 +490,9 @@ vi: email_subscriptions: accounts: account: Tài khoản - active: Hoạt động empty: hint: Hiện chưa có tài khoản nào có người đăng ký đọc. no_lists_yet: Chưa có danh sách nào - inactive: Không hoạt động last_email: Email gần nhất lead: Các tài khoản đã kích hoạt tính năng này và có người đăng ký sẽ hiển thị bên dưới. status: Trạng thái diff --git a/config/locales/zh-CN.yml b/config/locales/zh-CN.yml index 46bffcefb67..966dc99de27 100644 --- a/config/locales/zh-CN.yml +++ b/config/locales/zh-CN.yml @@ -490,11 +490,9 @@ zh-CN: email_subscriptions: accounts: account: 账号 - active: 已生效 empty: hint: 目前还没有账号拥有订阅者。 no_lists_yet: 尚无列表 - inactive: 未生效 last_email: 最新电子邮件 lead: 已启用此功能并拥有订阅者的账号会在下方显示。 status: 状态 diff --git a/config/locales/zh-TW.yml b/config/locales/zh-TW.yml index ebe16757b67..5f0b9fd7c87 100644 --- a/config/locales/zh-TW.yml +++ b/config/locales/zh-TW.yml @@ -492,11 +492,9 @@ zh-TW: email_subscriptions: accounts: account: 帳號 - active: 生效中 empty: hint: 尚無任何擁有訂閱者之帳號。 no_lists_yet: 尚無列表 - inactive: 已停用 last_email: 最新電子郵件地址 lead: 已啟用此功能並擁有訂閱者之帳號將於下方顯示。 status: 狀態 diff --git a/config/routes/admin.rb b/config/routes/admin.rb index a48defb3b93..ee2ec7c4664 100644 --- a/config/routes/admin.rb +++ b/config/routes/admin.rb @@ -26,7 +26,7 @@ namespace :admin do resources :email_domain_blocks, only: [:index, :new, :create], concerns: :batch - resources :email_subscriptions, only: [:index] do + resources :email_subscriptions, only: [:index, :destroy] do collection do post :purge post :disable @@ -36,6 +36,13 @@ namespace :admin do namespace :email_subscriptions do resource :setup, only: [:show, :create] resource :additional_footer_text, only: [:show, :update] + + resources :accounts, only: :show do + member do + post :enable + post :disable + end + end end resources :action_logs, only: [:index] From a3c6a521178027cbcccd45a909453c69900ede62 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Mon, 8 Jun 2026 10:23:55 +0200 Subject: [PATCH 050/130] New Crowdin Translations (automated) (#39314) Co-authored-by: GitHub Actions --- app/javascript/mastodon/locales/en-GB.json | 31 ++ app/javascript/mastodon/locales/es-MX.json | 4 +- app/javascript/mastodon/locales/he.json | 9 + app/javascript/mastodon/locales/hu.json | 9 + app/javascript/mastodon/locales/is.json | 8 + app/javascript/mastodon/locales/it.json | 8 + app/javascript/mastodon/locales/ko.json | 302 +++++++++++++++++++- app/javascript/mastodon/locales/nan-TW.json | 10 + app/javascript/mastodon/locales/nn.json | 8 + app/javascript/mastodon/locales/pl.json | 27 +- app/javascript/mastodon/locales/sv.json | 9 + config/locales/activerecord.ko.yml | 2 + config/locales/activerecord.pl.yml | 6 + config/locales/da.yml | 1 + config/locales/de.yml | 1 + config/locales/doorkeeper.pl.yml | 2 + config/locales/doorkeeper.pt-BR.yml | 16 +- config/locales/el.yml | 1 + config/locales/es-AR.yml | 1 + config/locales/es-MX.yml | 1 + config/locales/es.yml | 1 + config/locales/fi.yml | 1 + config/locales/fr-CA.yml | 1 + config/locales/fr.yml | 1 + config/locales/ga.yml | 1 + config/locales/gl.yml | 1 + config/locales/he.yml | 1 + config/locales/is.yml | 1 + config/locales/it.yml | 1 + config/locales/ko.yml | 180 ++++++++++++ config/locales/lv.yml | 7 +- config/locales/nan-TW.yml | 6 + config/locales/nl.yml | 1 + config/locales/nn.yml | 4 + config/locales/pl.yml | 3 +- config/locales/pt-BR.yml | 57 ++-- config/locales/simple_form.ar.yml | 1 - config/locales/simple_form.az.yml | 1 - config/locales/simple_form.be.yml | 1 - config/locales/simple_form.bg.yml | 1 - config/locales/simple_form.ca.yml | 1 - config/locales/simple_form.cs.yml | 1 - config/locales/simple_form.cy.yml | 1 - config/locales/simple_form.da.yml | 1 - config/locales/simple_form.de.yml | 1 - config/locales/simple_form.el.yml | 1 - config/locales/simple_form.en-GB.yml | 1 - config/locales/simple_form.eo.yml | 1 - config/locales/simple_form.es-AR.yml | 1 - config/locales/simple_form.es-MX.yml | 1 - config/locales/simple_form.es.yml | 1 - config/locales/simple_form.et.yml | 1 - config/locales/simple_form.eu.yml | 1 - config/locales/simple_form.fa.yml | 1 - config/locales/simple_form.fi.yml | 1 - config/locales/simple_form.fo.yml | 1 - config/locales/simple_form.fr-CA.yml | 1 - config/locales/simple_form.fr.yml | 1 - config/locales/simple_form.fy.yml | 1 - config/locales/simple_form.ga.yml | 1 - config/locales/simple_form.gd.yml | 1 - config/locales/simple_form.gl.yml | 1 - config/locales/simple_form.he.yml | 1 - config/locales/simple_form.hu.yml | 1 - config/locales/simple_form.ia.yml | 1 - config/locales/simple_form.io.yml | 1 - config/locales/simple_form.is.yml | 1 - config/locales/simple_form.it.yml | 1 - config/locales/simple_form.ja.yml | 1 - config/locales/simple_form.ko.yml | 25 +- config/locales/simple_form.lt.yml | 1 - config/locales/simple_form.lv.yml | 1 - config/locales/simple_form.nl.yml | 1 - config/locales/simple_form.nn.yml | 1 - config/locales/simple_form.pl.yml | 1 - config/locales/simple_form.pt-BR.yml | 1 - config/locales/simple_form.pt-PT.yml | 1 - config/locales/simple_form.ru.yml | 1 - config/locales/simple_form.si.yml | 1 - config/locales/simple_form.sk.yml | 1 - config/locales/simple_form.sl.yml | 1 - config/locales/simple_form.sq.yml | 1 - config/locales/simple_form.sv.yml | 1 - config/locales/simple_form.tr.yml | 1 - config/locales/simple_form.uk.yml | 1 - config/locales/simple_form.vi.yml | 1 - config/locales/simple_form.zh-CN.yml | 1 - config/locales/simple_form.zh-TW.yml | 1 - config/locales/sq.yml | 1 + config/locales/sv.yml | 3 + config/locales/vi.yml | 1 + config/locales/zh-CN.yml | 1 + config/locales/zh-TW.yml | 1 + 93 files changed, 710 insertions(+), 96 deletions(-) diff --git a/app/javascript/mastodon/locales/en-GB.json b/app/javascript/mastodon/locales/en-GB.json index e8cb9675f33..dd92c9c3787 100644 --- a/app/javascript/mastodon/locales/en-GB.json +++ b/app/javascript/mastodon/locales/en-GB.json @@ -2,6 +2,7 @@ "about.blocks": "Moderated servers", "about.contact": "Contact:", "about.default_locale": "Default", + "about.disclaimer": "Mastodon is free, open-source software, and a trademark of Mastodon GmbH.", "about.domain_blocks.no_reason_available": "Reason not available", "about.domain_blocks.preamble": "Mastodon generally allows you to view content from and interact with users from any other server in the Fediverse. These are the exceptions that have been made on this particular server.", "about.domain_blocks.silenced.explanation": "You will generally not see profiles and content from this server, unless you explicitly look it up or opt into it by following.", @@ -85,6 +86,7 @@ "account.locked_info": "This account privacy status is set to locked. The owner manually reviews who can follow them.", "account.media": "Media", "account.mention": "Mention @{name}", + "account.menu.add_to_collection": "Add to collection…", "account.menu.add_to_list": "Add to list…", "account.menu.block": "Block account", "account.menu.block_domain": "Block {domain}", @@ -365,10 +367,13 @@ "collection.share_modal.share_via_system": "Share to…", "collection.share_modal.title": "Share collection", "collection.share_modal.title_new": "Share your new collection!", + "collection.share_template_other": "Check out this cool collection:", + "collection.share_template_own": "Check out my new collection:", "collections.account_count": "{count, plural, one {# account} other {# accounts}}", "collections.accounts.empty_description": "Add up to {count} accounts", "collections.accounts.empty_editor_title": "No one is in this collection yet", "collections.accounts.empty_title": "This collection is empty", + "collections.add_to_collection": "Add {name} to collections", "collections.block_collection_owner": "Block account", "collections.by_account": "by {account_handle}", "collections.collection_description": "Description", @@ -391,6 +396,7 @@ "collections.detail.loading": "Loading collection…", "collections.detail.revoke_inclusion": "Remove me", "collections.detail.sensitive_content": "Sensitive content", + "collections.detail.sensitive_note": "The description and accounts may not be suitable for all viewers.", "collections.detail.share": "Share this collection", "collections.detail.you_are_in_this_collection": "You're featured in this collection", "collections.edit_details": "Edit details", @@ -421,6 +427,11 @@ "collections.search_accounts_max_reached": "You have added the maximum number of accounts", "collections.sensitive": "Sensitive", "collections.share_short": "Share", + "collections.sort_alphabetical": "Alphabetical", + "collections.sort_by": "Sort by:", + "collections.sort_date_added": "Date added", + "collections.sort_last_active": "Last active", + "collections.sort_most_followers": "Most followers", "collections.suggestions.can_not_add": "Can’t be added", "collections.suggestions.can_not_add_desc": "These accounts may have opted out of discovery, or they might be on a server that doesn’t support collections.", "collections.suggestions.must_follow": "Must follow first", @@ -573,6 +584,12 @@ "copy_icon_button.copy_this_text": "Copy link to clipboard", "copypaste.copied": "Copied", "copypaste.copy_to_clipboard": "Copy to clipboard", + "custom_homepage.about": "About", + "custom_homepage.about_this_server": "About this server", + "custom_homepage.administered_by": "Administered by", + "custom_homepage.contact": "Contact:", + "custom_homepage.latest_activity": "Latest activity", + "custom_homepage.these_are_the_latest_posts": "These are the latest 40 posts from accounts on this server.", "directory.federated": "From known fediverse", "directory.local": "From {domain} only", "directory.new_arrivals": "New arrivals", @@ -629,7 +646,9 @@ "empty_column.account_unavailable": "Profile unavailable", "empty_column.blocks": "You haven't blocked any users yet.", "empty_column.bookmarked_statuses": "You don't have any bookmarked posts yet. When you bookmark one, it will show up here.", + "empty_column.collections": "{acct} has not created any collections yet.", "empty_column.collections.featured_in": "You have not been added to any collections yet.", + "empty_column.collections.featured_in_undiscoverable": "In order for people to add you to collections, you need to allow featuring in discovery experiences from Preferences > Privacy and reach", "empty_column.community": "The local timeline is empty. Write something publicly to get the ball rolling!", "empty_column.direct": "You don't have any private mentions yet. When you send or receive one, it will show up here.", "empty_column.disabled_feed": "This feed has been disabled by your server administrators.", @@ -801,6 +820,12 @@ "keyboard_shortcuts.heading": "Keyboard Shortcuts", "keyboard_shortcuts.home": "Open home timeline", "keyboard_shortcuts.hotkey": "Hotkey", + "keyboard_shortcuts.keys.alt": "Alt", + "keyboard_shortcuts.keys.backspace": "Backspace", + "keyboard_shortcuts.keys.enter": "Enter", + "keyboard_shortcuts.keys.esc": "Esc", + "keyboard_shortcuts.keys.page_down": "Page Down", + "keyboard_shortcuts.keys.page_up": "Page Up", "keyboard_shortcuts.legend": "to display this legend", "keyboard_shortcuts.load_more": "Focus \"Load more\" button", "keyboard_shortcuts.local": "to open local timeline", @@ -832,6 +857,7 @@ "lightbox.zoom_in": "Zoom to actual size", "lightbox.zoom_out": "Zoom to fit", "limited_account_hint.action": "Show profile anyway", + "limited_account_hint.title": "This profile or server has been hidden by the moderators of {domain}.", "link_preview.author": "By {name}", "link_preview.more_from_author": "More from {name}", "link_preview.shares": "{count, plural, one {{counter} post} other {{counter} posts}}", @@ -893,6 +919,7 @@ "navigation_bar.live_feed_local": "Live feed (local)", "navigation_bar.live_feed_public": "Live feed (public)", "navigation_bar.logout": "Logout", + "navigation_bar.main": "Main", "navigation_bar.moderation": "Moderation", "navigation_bar.more": "More", "navigation_bar.mutes": "Muted users", @@ -978,6 +1005,7 @@ "notifications.column_settings.admin.report": "New reports:", "notifications.column_settings.admin.sign_up": "New sign-ups:", "notifications.column_settings.alert": "Desktop notifications", + "notifications.column_settings.collections": "Collections:", "notifications.column_settings.favourite": "Favourites:", "notifications.column_settings.filter_bar.advanced": "Display all categories", "notifications.column_settings.filter_bar.category": "Quick filter bar", @@ -997,6 +1025,7 @@ "notifications.column_settings.update": "Edits:", "notifications.filter.all": "All", "notifications.filter.boosts": "Boosts", + "notifications.filter.collections": "Collections", "notifications.filter.favourites": "Favourites", "notifications.filter.follows": "Follows", "notifications.filter.mentions": "Mentions", @@ -1170,6 +1199,7 @@ "search_popout.user": "user", "search_results.accounts": "Profiles", "search_results.all": "All", + "search_results.collections": "Collections", "search_results.hashtags": "Hashtags", "search_results.no_results": "No results.", "search_results.no_search_yet": "Try searching for posts, profiles, or hashtags.", @@ -1290,6 +1320,7 @@ "tabs_bar.menu": "Menu", "tabs_bar.notifications": "Notifications", "tabs_bar.publish": "New Post", + "tabs_bar.quick_links": "Quick links", "tabs_bar.search": "Search", "tag.remove": "Remove", "terms_of_service.effective_as_of": "Effective as of {date}", diff --git a/app/javascript/mastodon/locales/es-MX.json b/app/javascript/mastodon/locales/es-MX.json index eacd2dce513..d41fb39106c 100644 --- a/app/javascript/mastodon/locales/es-MX.json +++ b/app/javascript/mastodon/locales/es-MX.json @@ -646,7 +646,7 @@ "empty_column.account_unavailable": "Perfil no disponible", "empty_column.blocks": "Aún no has bloqueado a ningún usuario.", "empty_column.bookmarked_statuses": "Aún no tienes ninguna publicación guardada como marcador. Cuando guardes una, se mostrará aquí.", - "empty_column.collections": "{acct} aún no ha creado ninguna colección.", + "empty_column.collections": "{acct} todavía no ha creado ninguna colección.", "empty_column.collections.featured_in": "Aún no te han añadido a ninguna colección.", "empty_column.collections.featured_in_undiscoverable": "Para que los usuarios puedan añadirte a sus colecciones, debes habilitar la opción de aparecer en las experiencias de descubrimiento desde Preferencias > Privacidad y alcance", "empty_column.community": "La cronología local está vacía. ¡Escribe algo públicamente para ponerla en marcha!", @@ -821,7 +821,7 @@ "keyboard_shortcuts.home": "Abrir cronología principal", "keyboard_shortcuts.hotkey": "Tecla de acceso rápido", "keyboard_shortcuts.keys.alt": "Alt", - "keyboard_shortcuts.keys.backspace": "Retroceso", + "keyboard_shortcuts.keys.backspace": "Espacio", "keyboard_shortcuts.keys.enter": "Enter", "keyboard_shortcuts.keys.esc": "Escape", "keyboard_shortcuts.keys.page_down": "Re Pág", diff --git a/app/javascript/mastodon/locales/he.json b/app/javascript/mastodon/locales/he.json index 39991d3bc70..ef7ac819fe1 100644 --- a/app/javascript/mastodon/locales/he.json +++ b/app/javascript/mastodon/locales/he.json @@ -2,6 +2,7 @@ "about.blocks": "שרתים תחת פיקוח תוכן", "about.contact": "יצירת קשר:", "about.default_locale": "ברירת המחדל", + "about.disclaimer": "מסטודון היא תוכנת קוד פתוח חינמית וסימן מסחרי של Mastodon GmbH.", "about.domain_blocks.no_reason_available": "הסיבה אינה זמינה", "about.domain_blocks.preamble": "ככלל מסטודון מאפשרת לך לצפות בתוכן ולתקשר עם משתמשים מכל שרת בפדיברס. אלו הם היוצאים מן הכלל שהוגדרו עבור השרת המסוים הזה.", "about.domain_blocks.silenced.explanation": "ככלל פרופילים ותוכן משרת זה לא יוצגו, אלא אם חיפשת אותם באופן מפורש או בחרת להשתתף בו על ידי מעקב.", @@ -645,6 +646,7 @@ "empty_column.account_unavailable": "פרופיל לא זמין", "empty_column.blocks": "עדיין לא חסמתם משתמשים אחרים.", "empty_column.bookmarked_statuses": "אין עדיין הודעות שחיבבת. כשתחבב את הראשונה, היא תופיע כאן.", + "empty_column.collections": "{acct} עוד לא יצרו אוספים.", "empty_column.collections.featured_in": "עוד לא הוסיפו אותך לאף אוסף.", "empty_column.collections.featured_in_undiscoverable": "כדי שאחרים יוכלו להוסיפך לאוספים, עליך לאפשר להופיע ב\"תגליות\" תחת העדפות > פרטיות ומידת חשיפה", "empty_column.community": "פיד השרת המקומי ריק. יש לפרסם משהו כדי שדברים יתרחילו להתגלגל!", @@ -818,6 +820,12 @@ "keyboard_shortcuts.heading": "מקשי קיצור במקלדת", "keyboard_shortcuts.home": "פתיחת ציר זמן אישי", "keyboard_shortcuts.hotkey": "מקש קיצור", + "keyboard_shortcuts.keys.alt": "Alt", + "keyboard_shortcuts.keys.backspace": "מחיקה אחורה", + "keyboard_shortcuts.keys.enter": "Enter", + "keyboard_shortcuts.keys.esc": "Esc", + "keyboard_shortcuts.keys.page_down": "Page Down", + "keyboard_shortcuts.keys.page_up": "דיפדוף מעלה", "keyboard_shortcuts.legend": "הצגת מקרא", "keyboard_shortcuts.load_more": "התמקדות בכפתור \"טען עוד\"", "keyboard_shortcuts.local": "פתיחת ציר זמן קהילתי", @@ -1191,6 +1199,7 @@ "search_popout.user": "משתמש(ת)", "search_results.accounts": "פרופילים", "search_results.all": "כל התוצאות", + "search_results.collections": "אוספים", "search_results.hashtags": "תגיות", "search_results.no_results": "אין תוצאות.", "search_results.no_search_yet": "נסו לחפש אחר הודעות, פרופילי משתמשים או תגיות.", diff --git a/app/javascript/mastodon/locales/hu.json b/app/javascript/mastodon/locales/hu.json index dfa722d2d7d..5bed9715ec9 100644 --- a/app/javascript/mastodon/locales/hu.json +++ b/app/javascript/mastodon/locales/hu.json @@ -2,6 +2,7 @@ "about.blocks": "Moderált kiszolgálók", "about.contact": "Kapcsolat:", "about.default_locale": "Alapértelmezett", + "about.disclaimer": "A Mastodon szabad és nyílt forráskódú szoftver, a Mastodon GmbH védjegye.", "about.domain_blocks.no_reason_available": "Nem áll rendelkezésre indoklás", "about.domain_blocks.preamble": "A Mastodon általában mindenféle tartalomcserét és interakciót lehetővé tesz bármelyik másik kiszolgálóval a födiverzumban. Ezek azok a kivételek, amelyek a mi kiszolgálónkon érvényben vannak.", "about.domain_blocks.silenced.explanation": "Általában nem fogsz profilokat és tartalmat látni erről a kiszolgálóról, hacsak közvetlenül fel nem keresed vagy követed.", @@ -645,6 +646,7 @@ "empty_column.account_unavailable": "A profil nem érhető el", "empty_column.blocks": "Még senkit sem tiltottál le.", "empty_column.bookmarked_statuses": "Még nincs egyetlen könyvjelzőzött bejegyzésed sem. Ha könyvjelzőzöl egyet, itt fog megjelenni.", + "empty_column.collections": "{acct} még nem hozott létre gyűjteményt.", "empty_column.collections.featured_in": "Még nem adtak hozzá egyetlen gyűjteményhez sem.", "empty_column.collections.featured_in_undiscoverable": "Hogy mások hozzáadhassanak gyűjteményekhez, engedélyezned kell a kiemelést a felfedezési élményekben a Beállítások > Adatvédelem és elérés alatt", "empty_column.community": "A helyi idővonal üres. Tégy közzé valamit nyilvánosan, hogy elindítsd az eseményeket!", @@ -818,6 +820,12 @@ "keyboard_shortcuts.heading": "Gyorsbillentyűk", "keyboard_shortcuts.home": "Saját idővonal megnyitása", "keyboard_shortcuts.hotkey": "Gyorsbillentyű", + "keyboard_shortcuts.keys.alt": "Alt", + "keyboard_shortcuts.keys.backspace": "Backspace", + "keyboard_shortcuts.keys.enter": "Enter", + "keyboard_shortcuts.keys.esc": "Esc", + "keyboard_shortcuts.keys.page_down": "Page Down", + "keyboard_shortcuts.keys.page_up": "Page Up", "keyboard_shortcuts.legend": "Jelmagyarázat megjelenítése", "keyboard_shortcuts.load_more": "Fókuszálás a „Több betöltése” gombra", "keyboard_shortcuts.local": "Helyi idővonal megnyitása", @@ -1191,6 +1199,7 @@ "search_popout.user": "felhasználó", "search_results.accounts": "Profilok", "search_results.all": "Összes", + "search_results.collections": "Gyűjtemények", "search_results.hashtags": "Hashtagek", "search_results.no_results": "Nincs találat.", "search_results.no_search_yet": "Próbálj meg bejegyzések, profilok vagy címkék után keresni.", diff --git a/app/javascript/mastodon/locales/is.json b/app/javascript/mastodon/locales/is.json index bce1167c117..47fc04c035c 100644 --- a/app/javascript/mastodon/locales/is.json +++ b/app/javascript/mastodon/locales/is.json @@ -646,6 +646,7 @@ "empty_column.account_unavailable": "Notandasnið ekki tiltækt", "empty_column.blocks": "Þú hefur ekki ennþá útilokað neina notendur.", "empty_column.bookmarked_statuses": "Þú ert ekki ennþá með neinar bókamerktar færslur. Þegar þú bókamerkir færslu, mun það birtast hér.", + "empty_column.collections": "{acct} hefur enn ekki útbúið nein söfn.", "empty_column.collections.featured_in": "Þér hefur enn ekki verið bætt við nein söfn.", "empty_column.collections.featured_in_undiscoverable": "Til þess að fólk geti bætt þér í söfn þá þarftu að leyfa að þú komir upp í leitum, en það er gert í Kjörstillingar > Gagnaleynd og útbreiðsla", "empty_column.community": "Staðværa tímalínan er tóm. Skrifaðu eitthvað opinberlega til að láta boltann fara að rúlla!", @@ -819,6 +820,12 @@ "keyboard_shortcuts.heading": "Flýtileiðir á lyklaborði", "keyboard_shortcuts.home": "Opna heimatímalínu", "keyboard_shortcuts.hotkey": "Flýtilykill", + "keyboard_shortcuts.keys.alt": "Alt", + "keyboard_shortcuts.keys.backspace": "Baklykill", + "keyboard_shortcuts.keys.enter": "Enter", + "keyboard_shortcuts.keys.esc": "Esc", + "keyboard_shortcuts.keys.page_down": "Síða niður", + "keyboard_shortcuts.keys.page_up": "Síða upp", "keyboard_shortcuts.legend": "Birta þessa skýringu", "keyboard_shortcuts.load_more": "Gera \"Hlaða inn meiru\"-hnappinn virkan", "keyboard_shortcuts.local": "Opna staðværa tímalínu", @@ -1192,6 +1199,7 @@ "search_popout.user": "notandi", "search_results.accounts": "Notendasnið", "search_results.all": "Allt", + "search_results.collections": "Söfn", "search_results.hashtags": "Myllumerki", "search_results.no_results": "Engar niðurstöður.", "search_results.no_search_yet": "Prófaðu að leita að færslum, notendum eða myllumerkjum.", diff --git a/app/javascript/mastodon/locales/it.json b/app/javascript/mastodon/locales/it.json index 3c7dadd248f..7fd6b8a425e 100644 --- a/app/javascript/mastodon/locales/it.json +++ b/app/javascript/mastodon/locales/it.json @@ -646,6 +646,7 @@ "empty_column.account_unavailable": "Profilo non disponibile", "empty_column.blocks": "Non hai ancora bloccato alcun utente.", "empty_column.bookmarked_statuses": "Non hai ancora salvato nei segnalibri alcun post. Quando lo farai, apparirà qui.", + "empty_column.collections": "{acct} non ha ancora creato alcuna collezione.", "empty_column.collections.featured_in": "Non sei ancora stato/a aggiunto/a ad alcuna collezione.", "empty_column.collections.featured_in_undiscoverable": "Affinché le persone possano aggiungerti alle collezioni, è necessario consentire che il profilo sia visibile nelle esperienze di scoperta tramite Preferenze > Privacy e visibilità", "empty_column.community": "La cronologia locale è vuota. Scrivi qualcosa pubblicamente per dare inizio alla festa!", @@ -819,6 +820,12 @@ "keyboard_shortcuts.heading": "Scorciatoie da tastiera", "keyboard_shortcuts.home": "Apre la cronologia domestica", "keyboard_shortcuts.hotkey": "Tasto di scelta rapida", + "keyboard_shortcuts.keys.alt": "Alt", + "keyboard_shortcuts.keys.backspace": "Spazio", + "keyboard_shortcuts.keys.enter": "Invio", + "keyboard_shortcuts.keys.esc": "Esc", + "keyboard_shortcuts.keys.page_down": "Pagina giù", + "keyboard_shortcuts.keys.page_up": "Pagina su", "keyboard_shortcuts.legend": "Mostra questa legenda", "keyboard_shortcuts.load_more": "Evidenzia il pulsante \"Carica altro\"", "keyboard_shortcuts.local": "Apre la cronologia locale", @@ -1192,6 +1199,7 @@ "search_popout.user": "utente", "search_results.accounts": "Profili", "search_results.all": "Tutto", + "search_results.collections": "Collezioni", "search_results.hashtags": "Hashtag", "search_results.no_results": "Nessun risultato.", "search_results.no_search_yet": "Prova a cercare post, profili o hashtag.", diff --git a/app/javascript/mastodon/locales/ko.json b/app/javascript/mastodon/locales/ko.json index 4b7be7ebaf6..b6fbcb711c6 100644 --- a/app/javascript/mastodon/locales/ko.json +++ b/app/javascript/mastodon/locales/ko.json @@ -2,6 +2,7 @@ "about.blocks": "제한된 서버들", "about.contact": "연락처:", "about.default_locale": "기본", + "about.disclaimer": "Mastodon은 자유 오픈소스 소프트웨어이며, Mastodon GmbH의 상표입니다.", "about.domain_blocks.no_reason_available": "사유를 밝히지 않음", "about.domain_blocks.preamble": "마스토돈은 일반적으로 연합우주에 있는 어떤 서버의 사용자와도 게시물을 보고 응답을 할 수 있도록 허용합니다. 다음 항목들은 특정한 서버에 대해 만들어 진 예외사항입니다.", "about.domain_blocks.silenced.explanation": "명시적으로 찾아보거나 팔로우를 하기 전까지는, 이 서버에 있는 프로필이나 게시물 등을 일반적으로 볼 수 없습니다.", @@ -41,6 +42,8 @@ "account.familiar_followers_two": "{name1}, {name2} 님이 팔로우함", "account.featured": "추천", "account.featured.accounts": "프로필", + "account.featured.collections": "컬렉션", + "account.featured.new_collection": "새 컬렉션", "account.field_overflow": "내용 전체 보기", "account.filters.all": "모든 활동", "account.filters.boosts_toggle": "부스트 보기", @@ -66,17 +69,31 @@ "account.go_to_profile": "프로필로 이동", "account.hide_reblogs": "@{name}의 부스트를 숨기기", "account.in_memoriam": "고인의 계정입니다.", + "account.join_modal.day": "일", + "account.join_modal.me": "{server}에 가입한 날", + "account.join_modal.me_anniversary": "연합기념일을 축하합니다! {server}에 가입한 날은", + "account.join_modal.me_today": "내가 {server}에 처음 온 날입니다!", + "account.join_modal.other": "{name}이 {server}에 가입한 날", + "account.join_modal.other_today": "{name} 님이 {server}에 처음 온 날입니다!", + "account.join_modal.share.celebrate": "기념 게시물 공유", + "account.join_modal.share.intro": "소개 게시물 공유", + "account.join_modal.share.welcome": "환영 게시물 공유", + "account.join_modal.years": "{number, plural, other {년}}", "account.joined_short": "가입", "account.languages": "구독한 언어 변경", + "account.last_active": "최근 활동", "account.link_verified_on": "{date}에 이 링크의 소유권이 확인 됨", "account.locked_info": "이 계정의 프라이버시 설정은 잠금으로 설정되어 있습니다. 계정 소유자가 수동으로 팔로워를 승인합니다.", "account.media": "미디어", "account.mention": "@{name} 님에게 멘션", + "account.menu.add_to_collection": "컬렉션에 추가…", "account.menu.add_to_list": "리스트에 추가…", "account.menu.block": "계정 차단", "account.menu.block_domain": "{domain} 차단", "account.menu.copied": "계정 링크를 복사했습니다", "account.menu.copy": "링크 복사하기", + "account.menu.direct": "개인 멘션", + "account.menu.hide_reblogs": "타임라인에서 부스트 숨기기", "account.menu.mention": "멘션", "account.menu.mute": "계정 뮤트", "account.menu.note.description": "나에게만 보입니다", @@ -84,17 +101,35 @@ "account.menu.remove_follower": "팔로워 제거", "account.menu.report": "계정 신고", "account.menu.share": "공유하기…", + "account.menu.show_reblogs": "타임라인에 부스트 보여주기", + "account.menu.unblock": "차단 해제", + "account.menu.unblock_domain": "{domain} 차단 해제", + "account.menu.unmute": "뮤트 해제", "account.moved_to": "{name} 님은 자신의 새 계정이 다음과 같다고 표시했습니다:", "account.mute": "@{name} 뮤트", "account.mute_notifications_short": "알림 뮤트", "account.mute_short": "뮤트", "account.muted": "뮤트됨", "account.mutual": "서로 팔로우", + "account.name.copy": "핸들 복사", + "account.name.help.domain": "{domain}은 사용자의 프로필과 게시물을 호스트하는 서버입니다.", + "account.name.help.domain_self": "{domain}은 내 프로필과 게시물을 호스트하는 서버입니다.", + "account.name.help.footer": "다른 이메일 제공자를 사용하는 사람에게 이메일을 보낼 수 있듯이, 다른 마스토돈 서버에 있는 사람들과 소통할 수 있으며 다른 페디버스 앱의 누구와도 소통할 수 있습니다.", + "account.name.help.header": "핸들은 이메일과 비슷합니다", + "account.name.help.username": "{username}은 해당 서버에 있는 이 계정의 사용자명입니다. 다른 서버에 있는 누군가는 같은 사용자명을 사용할 수도 있습니다.", + "account.name.help.username_self": "{username}은 내 사용자명입니다. 다른 서버에 있는 누군가는 같은 사용자명을 사용할 수도 있습니다.", + "account.name_info": "이것은 무엇을 의미하나요?", "account.no_bio": "제공된 설명이 없습니다.", + "account.node_modal.callout": "개인 메모는 나에게만 보입니다.", + "account.node_modal.edit_title": "개인 메모 편집", + "account.node_modal.error_unknown": "메모를 저장할 수 없습니다", + "account.node_modal.field_label": "개인 노트", "account.node_modal.save": "저장", "account.node_modal.title": "개인 메모 추가", "account.note.edit_button": "편집", + "account.note.title": "개인 메모 (나에게만 보입니다)", "account.open_original_page": "원본 페이지 열기", + "account.pending": "대기 중", "account.posts": "게시물", "account.remove_from_followers": "팔로워에서 {name} 제거", "account.report": "@{name} 신고", @@ -102,6 +137,8 @@ "account.share": "@{name}의 프로필 공유", "account.show_reblogs": "@{name}의 부스트 보기", "account.statuses_counter": "{count, plural, other {게시물 {counter}개}}", + "account.timeline.pinned": "고정됨", + "account.timeline.pinned.view_all": "고정된 게시물 모두 보기", "account.unblock": "차단 해제", "account.unblock_domain": "도메인 {domain} 차단 해제", "account.unblock_domain_short": "차단 해제", @@ -111,11 +148,114 @@ "account.unmute": "@{name} 뮤트 해제", "account.unmute_notifications_short": "알림 뮤트 해제", "account.unmute_short": "뮤트 해제", + "account_edit.advanced_settings.bot_hint": "이 계정이 대부분 자동으로 작업을 수행하고 잘 확인하지 않는다는 것을 알립니다", + "account_edit.advanced_settings.bot_label": "자동화된 계정", + "account_edit.advanced_settings.title": "고급 설정", + "account_edit.bio.add_label": "자기소개 추가", + "account_edit.bio.edit_label": "자기소개 편집", + "account_edit.bio.placeholder": "다른 사람들이 나를 알아볼 수 있도록 짧은 소개를 추가하세요.", "account_edit.bio.title": "자기소개", "account_edit.bio_modal.add_title": "자기소개 추가", "account_edit.bio_modal.edit_title": "자기소개 편집", "account_edit.column_button": "완료", "account_edit.column_title": "프로필 편집", + "account_edit.custom_fields.add_label": "필드 추가", + "account_edit.custom_fields.edit_label": "필드 편집", + "account_edit.custom_fields.placeholder": "내 호칭, 외부 링크, 혹은 공유하기를 원하는 무엇이든지 추가하세요.", + "account_edit.custom_fields.reorder_button": "필드 순서 변경", + "account_edit.custom_fields.tip_content": "내가 소유한 웹사이트 링크를 추가하여 마스토돈 계정의 신뢰도를 손쉽게 높일 수 있습니다.", + "account_edit.custom_fields.tip_title": "팁: 인증된 링크 추가", + "account_edit.custom_fields.title": "사용자 정의 필드", + "account_edit.custom_fields.verified_hint": "어떻게 인증된 링크를 추가하나요?", + "account_edit.display_name.add_label": "표시되는 이름 추가", + "account_edit.display_name.edit_label": "표시되는 이름 수정", + "account_edit.display_name.placeholder": "표시되는 이름은 내 프로필과 타임라인에서 나타날 내 이름입니다.", + "account_edit.display_name.title": "표시되는 이름", + "account_edit.featured_hashtags.edit_label": "해시태그 추가", + "account_edit.featured_hashtags.placeholder": "내가 좋아하는 주제를 다른 사람들이 쉽게 찾아보고 접근할 수 있도록 해보세요.", + "account_edit.featured_hashtags.title": "추천 해시태그", + "account_edit.field_actions.delete": "필드 삭제", + "account_edit.field_actions.edit": "필드 편집", + "account_edit.field_delete_modal.confirm": "정말로 이 커스텀 필드를 삭제할까요? 이 작업은 되돌릴 수 없습니다.", + "account_edit.field_delete_modal.delete_button": "삭제", + "account_edit.field_delete_modal.title": "사용자 지정 필드를 삭제할까요?", + "account_edit.field_edit_modal.add_title": "사용자 지정 필드 추가", + "account_edit.field_edit_modal.discard_confirm": "저장 안함", + "account_edit.field_edit_modal.discard_message": "저장되지 않은 변경사항이 있습니다. 정말로 폐기하시겠습니까?", + "account_edit.field_edit_modal.edit_title": "사용자 지정 필드 편집", + "account_edit.field_edit_modal.length_warning": "추천하는 글자수 제한을 초과했습니다. 모바일 사용자는 내 프로필 전체를 볼 수 없을 수도 있습니다.", + "account_edit.field_edit_modal.link_emoji_warning": "커스텀 에모지와 url을 섞어 사용하는 것을 권장하지 않습니다. 둘 다 포함된 커스텀 필드는 사용자 혼동을 막기 위해 링크 대신 텍스트로만 보여질 것입니다.", + "account_edit.field_edit_modal.name_hint": "예시: \"개인 웹사이트\"", + "account_edit.field_edit_modal.name_label": "라벨", + "account_edit.field_edit_modal.url_warning": "링크를 추가하려면 {protocol}을 앞에 추가하세요.", + "account_edit.field_edit_modal.value_hint": "예시: \"https://example.me\"", + "account_edit.field_edit_modal.value_label": "내용", + "account_edit.field_reorder_modal.drag_cancel": "드래그가 취소되었습니다. 필드 {item}은 이동되지 않았습니다.", + "account_edit.field_reorder_modal.drag_end": "\"{item}\" 필드가 드랍되었습니다.", + "account_edit.field_reorder_modal.drag_instructions": "커스텀 필드를 재정렬하려면 스페이스나 엔터를 누르세요. 드래그 하는 동안 방향키를 이용해 위아래로 이동할 수 있습니다. 스페이스나 엔터를 다시 눌러 새 위치에 놓거나 ESC를 이용해 취소할 수 있습니다.", + "account_edit.field_reorder_modal.drag_move": "\"{item}\" 필드가 이동되었습니다.", + "account_edit.field_reorder_modal.drag_over": "필드 \"{item}\"가 \"{over}\" 위로 옮겨졌습니다.", + "account_edit.field_reorder_modal.drag_start": "\"{item}\" 필드를 집었습니다.", + "account_edit.field_reorder_modal.handle_label": "\"{item}\" 필드 드래그", + "account_edit.field_reorder_modal.title": "필드 순서 바꾸기", + "account_edit.image_alt_modal.add_title": "대체 텍스트 추가", + "account_edit.image_alt_modal.details_content": "이렇게 하세요:
  • 사진의 나를 설명하세요
  • 3인칭을 사용하세요(예: \"나\" 대신 \"철수\")
  • 간결하게 – 보통 몇 마디면 충분합니다
하지 마세요:
  • \"사진\" 같은 단어를 쓰지 마세요 – 스크린 리더에게 중복된 정보를 전달합니다
예시:
  • \"철수가 초록 셔츠를 입고 안경을 쓰고 있음\"
", + "account_edit.image_alt_modal.details_title": "팁: 프로필 사진을 위한 대체텍스트", + "account_edit.image_alt_modal.edit_title": "대체 텍스트 편집", + "account_edit.image_alt_modal.text_hint": "대체 텍스트는 스크린 리더를 쓰는 사용자가 내 컨텐츠를 이해하는데 도움이 됩니다.", + "account_edit.image_alt_modal.text_label": "대체 텍스트", + "account_edit.image_delete_modal.confirm": "이 이미지를 삭제하시겠습니까? 이 작업은 취소할 수 없습니다.", + "account_edit.image_delete_modal.delete_button": "삭제", + "account_edit.image_delete_modal.title": "이미지를 삭제할까요?", + "account_edit.image_edit.add_button": "이미지 추가", + "account_edit.image_edit.alt_add_button": "대체 텍스트 추가", + "account_edit.image_edit.alt_edit_button": "대체 텍스트 수정", + "account_edit.image_edit.remove_button": "이미지 삭제", + "account_edit.image_edit.replace_button": "이미지 변경", + "account_edit.item_list.delete": "{name} 삭제", + "account_edit.item_list.edit": "{name} 편집", + "account_edit.name_modal.add_title": "표시되는 이름 추가", + "account_edit.name_modal.edit_title": "표시되는 이름 수정", + "account_edit.profile_tab.button_label": "사용자 지정", + "account_edit.profile_tab.hint.description": "이 설정은 공식 앱을 사용하는 {server} 사용자가 보는 내용을 설정하지만 다른 서버나 서드파티 앱 사용자에게는 다르게 나타날 수 있습니다.", + "account_edit.profile_tab.hint.title": "환경에 따라 다르게 보일 수 있습니다", + "account_edit.profile_tab.show_featured.description": "'추천'은 다른 계정을 소개할 수 있는 선택적인 탭입니다.", + "account_edit.profile_tab.show_featured.title": "'추천' 탭 표시", + "account_edit.profile_tab.show_media.description": "'미디어' 탭은 이미지나 비디오가 들어간 게시물을 보여주는 선택적인 탭입니다.", + "account_edit.profile_tab.show_media.title": "'미디어' 탭 표시", + "account_edit.profile_tab.show_media_replies.description": "활성화 하면 미디어 탭은 내 게시물과 다른 사람에게 한 답글을 모두 보여줍니다.", + "account_edit.profile_tab.show_media_replies.title": "'미디어' 탭에 답글 포함", + "account_edit.profile_tab.show_relations.title": "팔로워와 팔로잉 표시", + "account_edit.profile_tab.subtitle": "내 프로필이 어떻게 보여질지를 원하는대로 꾸며보세요.", + "account_edit.profile_tab.title": "프로필 표시 설정", + "account_edit.save": "저장", + "account_edit.upload_modal.back": "뒤로가기", + "account_edit.upload_modal.done": "완료", + "account_edit.upload_modal.next": "다음", + "account_edit.upload_modal.step_crop.zoom": "줌", + "account_edit.upload_modal.step_upload.button": "파일 탐색", + "account_edit.upload_modal.step_upload.dragging": "드롭하여 업로드", + "account_edit.upload_modal.step_upload.header": "이미지 선택", + "account_edit.upload_modal.step_upload.hint": "WEBP, PNG, GIF 또는 JPG 형식으로 {limit}MB까지.{br}이미지는 {width}*{height}픽셀로 크기가 변경됩니다.", + "account_edit.upload_modal.title_add.avatar": "프로필 사진 추가", + "account_edit.upload_modal.title_add.header": "커버 사진 추가", + "account_edit.upload_modal.title_replace.avatar": "프로필 사진 바꾸기", + "account_edit.upload_modal.title_replace.header": "커버 사진 바꾸기", + "account_edit.verified_modal.details": "개인 웹사이트를 인증하여 마스토돈 프로필의 신뢰도를 높여보세요. 이렇게 동작합니다:", + "account_edit.verified_modal.invisible_link.details": "링크를 헤더에 추가하세요. 중요한 것은 사용자 컨텐츠를 통해 도용하는 것을 막는 rel=\"me\" 부분입니다. {tag} 대신 링크 태그를 헤더에 넣을 수도 있습니다. 하지만 HTML 코드는 자바스크립트 실행 없이 접근이 가능해야 합니다.", + "account_edit.verified_modal.invisible_link.summary": "링크를 안 보이게 할 수 있나요?", + "account_edit.verified_modal.step1.header": "아래 HTML 코드를 복사하여 웹사이트 헤더에 붙여넣으세요", + "account_edit.verified_modal.step2.details": "이미 커스텀 필드에 웹사이트를 추가했다면 다시 인증을 실행하기 위해 삭제하고 다시 추가해야 합니다.", + "account_edit.verified_modal.step2.header": "웹사이트를 커스텀 필드로 추가하세요", + "account_edit.verified_modal.title": "인증된 링크 추가하는 방법", + "account_edit_tags.add_tag": "#{tagName} 추가", + "account_edit_tags.column_title": "태그 편집", + "account_edit_tags.max_tags_reached": "추천 해시태그 최대 개수를 초과합니다.", + "account_edit_tags.search_placeholder": "해시태그를 입력하세요…", + "account_edit_tags.suggestions": "제안:", + "account_edit_tags.tag_status_count": "{count, plural, other {# 게시물}}", + "account_list.hidden_notice": "나에게만 보입니다. 남들에게 이 목록을 보여주려면 {page} > {modal} > {field}에서 설정하세요.", + "account_list.total": "{total, plural, other {#}} 계정", "admin.dashboard.daily_retention": "가입 후 일별 사용자 유지율", "admin.dashboard.monthly_retention": "가입 후 월별 사용자 유지율", "admin.dashboard.retention.average": "평균", @@ -169,12 +309,15 @@ "annual_report.summary.archetype.title_self": "당신의 특성", "annual_report.summary.close": "닫기", "annual_report.summary.copy_link": "링크 복사하기", + "annual_report.summary.followers.new_followers": "{count, plural, other {새 팔로워}}", "annual_report.summary.highlighted_post.boost_count": "이 게시물은 {count, plural,other {# 번}} 부스트되었습니다.", "annual_report.summary.highlighted_post.favourite_count": "이 게시물은 {count, plural,other {# 번}} 마음에 들었습니다.", "annual_report.summary.highlighted_post.reply_count": "이 게시물은 {count, plural, other {# 개}}의 답글을 받았습니다.", "annual_report.summary.highlighted_post.title": "가장 인기있는 게시물", "annual_report.summary.most_used_app.most_used_app": "가장 많이 사용한 앱", "annual_report.summary.most_used_hashtag.most_used_hashtag": "가장 많이 사용한 해시태그", + "annual_report.summary.most_used_hashtag.used_count": "{count, plural, other {#개의 게시물}}에서 이 해시태그를 사용했습니다.", + "annual_report.summary.most_used_hashtag.used_count_public": "{name} 님은 이 해시태그를 {count, plural,other {# 개의 게시물}}에서 사용했습니다.", "annual_report.summary.new_posts.new_posts": "새 게시물", "annual_report.summary.percentile.text": "{domain} 사용자의 상위입니다.", "annual_report.summary.percentile.we_wont_tell_bernie": "종부세는 안 걷을게요", @@ -183,11 +326,15 @@ "annual_report.summary.share_on_mastodon": "마스토돈에 공유하기", "attachments_list.unprocessed": "(처리 안 됨)", "audio.hide": "소리 숨기기", + "block_modal.no_collections": "서로를 컬렉션에 추가할 수 없습니다. 이미 존재하는 경우 해당 컬렉션에서 삭제됩니다.", "block_modal.remote_users_caveat": "우리는 {domain} 서버가 당신의 결정을 존중해 주길 부탁할 것입니다. 하지만 몇몇 서버는 차단을 다르게 취급할 수 있기 때문에 규정이 준수되는 것을 보장할 수는 없습니다. 공개 게시물은 로그인 하지 않은 사용자들에게 여전히 보여질 수 있습니다.", "block_modal.show_less": "간략히 보기", "block_modal.show_more": "더 보기", + "block_modal.they_cant_mention": "서로 멘션하거나, 팔로우하거나, 인용할 수 없습니다.", + "block_modal.they_cant_see_posts": "상대방이 내 컨텐츠를 볼 수 없게 되며 나도 상대방의 컨텐츠를 볼 수 없게 됩니다.", "block_modal.they_will_know": "자신이 차단 당했다는 사실을 확인할 수 있습니다.", "block_modal.title": "사용자를 차단할까요?", + "block_modal.you_wont_see_mentions": "해당 사용자를 멘션한 다른 사용자의 게시물을 보지 않게 됩니다.", "boost_modal.combo": "다음엔 {combo}를 눌러서 이 과정을 건너뛸 수 있습니다", "boost_modal.reblog": "게시물을 부스트할까요?", "boost_modal.undo_reblog": "게시물을 부스트 취소할까요?", @@ -203,21 +350,98 @@ "bundle_modal_error.close": "닫기", "bundle_modal_error.message": "화면을 불러오는 동안 오류가 발생했습니다.", "bundle_modal_error.retry": "다시 시도", + "callout.dismiss": "무시", "carousel.current": "페이지 {current, number} / {max, number}", "carousel.slide": "{max, number} 중 {current, number} 페이지", + "character_counter.recommended": "{currentLength}/{maxLength} 권장 글자", + "character_counter.required": "{currentLength}/{maxLength} 글자", "closed_registrations.other_server_instructions": "마스토돈은 분산화 되어 있기 때문에, 다른 서버에서 계정을 만들더라도 이 서버와 상호작용 할 수 있습니다.", "closed_registrations_modal.description": "{domain}은 현재 가입이 불가능합니다. 하지만 마스토돈을 이용하기 위해 꼭 {domain}을 사용할 필요는 없다는 사실을 인지해 두세요.", "closed_registrations_modal.find_another_server": "다른 서버 찾기", "closed_registrations_modal.preamble": "마스토돈은 분산화 되어 있습니다, 그렇기 때문에 어디에서 계정을 생성하든, 이 서버에 있는 누구와도 팔로우와 상호작용을 할 수 있습니다. 심지어는 스스로 서버를 만드는 것도 가능합니다!", "closed_registrations_modal.title": "마스토돈에서 가입", + "collection.share_modal.share_link_label": "링크 공유", + "collection.share_modal.share_via_post": "마스토돈에 게시", + "collection.share_modal.share_via_system": "공유…", + "collection.share_modal.title": "컬렉션 공유", + "collection.share_modal.title_new": "새 컬렉션을 공유하세요!", + "collection.share_template_other": "이 엄청난 컬렉션을 확인해보세요:", + "collection.share_template_own": "내 새로운 컬렉션을 확인해보세요:", + "collections.account_count": "{count, plural, other {# 계정}}", + "collections.accounts.empty_description": "최대 {count} 개의 계정 추가", + "collections.accounts.empty_editor_title": "이 컬렉션엔 아직 아무도 없습니다", + "collections.accounts.empty_title": "이 컬렉션은 비어 있습니다", + "collections.add_to_collection": "컬렉션에 {name} 님 추가", + "collections.block_collection_owner": "계정 차단", + "collections.by_account": "{account_handle} 작성", "collections.collection_description": "설명", - "collections.collection_topic": "화제", + "collections.collection_language": "언어", + "collections.collection_language_none": "없음", + "collections.collection_name": "이름", + "collections.collection_topic": "주제", + "collections.confirm_account_removal": "정말로 이 계정을 컬렉션에서 제거할까요?", + "collections.content_warning": "열람 주의", + "collections.continue": "계속", + "collections.copy_link": "링크 복사", + "collections.copy_link_confirmation": "컬렉션 링크를 복사했습니다", + "collections.create.accounts_title": "누구를 이 컬렉션에서 추천할까요?", + "collections.create.basic_details_title": "기본 정보", + "collections.create.steps": "{step}/{total} 단계", "collections.create_collection": "컬렉션 만들기", "collections.delete_collection": "컬렉션 지우기", + "collections.description_length_hint": "100 글자 제한", + "collections.detail.author_added_you_on_date": "{author} 님이 {date}에 나를 추가했습니다", + "collections.detail.loading": "컬렉션 로딩…", + "collections.detail.revoke_inclusion": "나를 제거하기", + "collections.detail.sensitive_content": "민감한 컨텐츠", + "collections.detail.sensitive_note": "정보와 계정들이 모든 사용자가 보기에 적합하지 않을 수 있습니다.", + "collections.detail.share": "이 컬렉션 공유", + "collections.detail.you_are_in_this_collection": "이 컬렉션에 추천되었습니다", + "collections.edit_details": "세부 정보 편집", + "collections.error_loading_collections": "컬렉션을 로딩하는 도중 에러가 발생하였습니다.", + "collections.hidden_accounts_description": "{count, plural, other {사용자를}} 뮤트하거나 차단했습니다", + "collections.hidden_accounts_link": "{count, plural, other {#개의 숨겨진 계정}}", + "collections.hints.accounts_counter": "계정 {count}/{max}개", + "collections.last_updated_at": "마지막 업데이트: {date}", + "collections.list.collections_with_count": "{count, plural, other {컬렉션 #개}}", + "collections.list.created_by_author": "{name} 님이 생성함", + "collections.list.created_by_you": "내가 생성함", + "collections.list.featuring_you": "나를 추천", "collections.manage_accounts": "계정 관리하기", + "collections.mark_as_sensitive": "민감함으로 설정", + "collections.mark_as_sensitive_hint": "열람 주의문구 뒤에 이 컬렉션의 설명과 계정을 숨깁니다. 컬렉션의 이름은 항상 보여집니다.", + "collections.maximum_collection_count_description": "이 서버는 {count} 개의 컬렉션 생성을 허용합니다.", + "collections.maximum_collection_count_reached": "컬렉션의 최대 개수에 도달하였습니다", + "collections.name_length_hint": "40 글자 제한", "collections.new_collection": "새 컬렉션", + "collections.pending_accounts.message": "해당 사용자나 서버의 응답을 기다리고 있는 경우 대기중으로 나타날 수 있습니다. 대기중인 계정은 나만 볼 수 있습니다.", + "collections.pending_accounts.title": "왜 대기중인 계정이 있나요?", + "collections.remove_account": "제거", + "collections.report_collection": "이 컬렉션 신고", + "collections.revoke_collection_inclusion": "이 컬렉션에서 나를 제거", + "collections.revoke_inclusion.confirmation": "\"{collection}\"에서 내가 제거되었습니다", + "collections.revoke_inclusion.error": "오류가 발생했습니다. 나중에 다시 시도하세요.", + "collections.search_accounts_label": "추가할 계정 검색", + "collections.search_accounts_max_reached": "이미 너무 많은 계정을 추가했습니다", + "collections.sensitive": "민감함", + "collections.share_short": "공유", + "collections.sort_alphabetical": "가나다순", + "collections.sort_by": "정렬:", + "collections.sort_date_added": "추가된 날짜", + "collections.sort_last_active": "최근 활동", + "collections.sort_most_followers": "팔로워 많은순", + "collections.suggestions.can_not_add": "추가할 수 없음", + "collections.suggestions.must_follow": "먼저 팔로우해야합니다", + "collections.topic_hint": "이 컬렉션의 주제가 무엇인지 다른 사용자들이 이해할 수 있도록 해시태그를 추가하세요.", + "collections.topic_special_chars_hint": "특수문자는 저장할 때 삭제됩니다", + "collections.unlisted_collections_description": "내 프로필에 나타나지 않습니다. 링크를 가진 누구나 볼 수 있습니다.", + "collections.unlisted_collections_with_count": "미등재된 컬렉션 ({count})", "collections.view_collection": "컬렉션 보기", "collections.visibility_public": "공개", + "collections.visibility_public_hint": "검색 결과나 추천이 등장하는 다른 곳에 나타날 수 있습니다.", + "collections.visibility_title": "공개범위", + "collections.visibility_unlisted": "미등재", + "collections.visibility_unlisted_hint": "링크를 가진 모두에게 보여집니다. 검색이나 추천에서 제외됩니다.", "column.about": "정보", "column.blocks": "차단한 사용자", "column.bookmarks": "북마크", @@ -237,8 +461,10 @@ "column.lists": "리스트", "column.mutes": "뮤트한 사용자", "column.notifications": "알림", + "column.other_collections": "{name} 님의 컬렉션", "column.pins": "고정된 게시물", "column.public": "연합 타임라인", + "column.your_collections": "내 컬렉션", "column_back_button.label": "돌아가기", "column_header.hide_settings": "설정 숨기기", "column_header.moveLeft_settings": "컬럼을 왼쪽으로 이동", @@ -247,7 +473,11 @@ "column_header.show_settings": "설정 보이기", "column_header.unpin": "고정 해제", "column_search.cancel": "취소", + "combobox.close_results": "결과 닫기", "combobox.loading": "불러오는 중", + "combobox.no_results_found": "검색 결과가 없습니다", + "combobox.open_results": "결과 열기", + "combobox.results_available": "{count, plural, other {#개의 추천}}이 사용 가능합니다. 위 아래 방향키를 사용하여 이동하고 엔터키로 선택하세요.", "community.column_settings.local_only": "로컬만", "community.column_settings.media_only": "미디어만", "community.column_settings.remote_only": "원격지만", @@ -281,6 +511,9 @@ "confirmations.delete.confirm": "삭제", "confirmations.delete.message": "정말로 이 게시물을 삭제하시겠습니까?", "confirmations.delete.title": "게시물을 삭제할까요?", + "confirmations.delete_collection.confirm": "삭제", + "confirmations.delete_collection.message": "이 작업은 되돌릴 수 없습니다.", + "confirmations.delete_collection.title": "\"{name}\"을 삭제할까요?", "confirmations.delete_list.confirm": "삭제", "confirmations.delete_list.message": "정말로 이 리스트를 영구적으로 삭제하시겠습니까?", "confirmations.delete_list.title": "리스트를 삭제할까요?", @@ -296,6 +529,10 @@ "confirmations.follow_to_list.confirm": "팔로우하고 리스트에 추가", "confirmations.follow_to_list.message": "리스트에 추가하려면 {name} 님을 팔로우해야 합니다.", "confirmations.follow_to_list.title": "팔로우할까요?", + "confirmations.hide_featured_tab.confirm": "탭 숨기기", + "confirmations.hide_featured_tab.intro": "언제든지 프로필 수정 > 프로필 탭 설정에서 변경할 수 있습니다.", + "confirmations.hide_featured_tab.message": "{serverName}과 마스토돈 최신 버전을 사용하는 다른 서버에서 탭을 숨깁니다. 다른 환경에선 다르게 보일 수 있습니다.", + "confirmations.hide_featured_tab.title": "\"추천\" 탭을 제거할까요?", "confirmations.logout.confirm": "로그아웃", "confirmations.logout.message": "정말로 로그아웃 하시겠습니까?", "confirmations.logout.title": "로그아웃 할까요?", @@ -319,6 +556,9 @@ "confirmations.remove_from_followers.confirm": "팔로워 제거", "confirmations.remove_from_followers.message": "{name} 님이 나를 팔로우하지 않게 됩니다. 계속할까요?", "confirmations.remove_from_followers.title": "팔로워를 제거할까요?", + "confirmations.revoke_collection_inclusion.confirm": "나를 제거하기", + "confirmations.revoke_collection_inclusion.message": "이 작업은 영구적이며 큐레이터는 나를 앞으로 다시 추가할 수 없습니다.", + "confirmations.revoke_collection_inclusion.title": "나를 이 컬렉션에서 제거할까요?", "confirmations.revoke_quote.confirm": "게시물 삭제", "confirmations.revoke_quote.message": "이 작업은 되돌릴 수 없습니다.", "confirmations.revoke_quote.title": "게시물을 지울까요?", @@ -331,13 +571,21 @@ "content_warning.hide": "게시물 숨기기", "content_warning.show": "무시하고 보기", "content_warning.show_more": "더 보기", + "content_warning.show_short": "보기", "conversation.delete": "대화 삭제", "conversation.mark_as_read": "읽은 상태로 표시", "conversation.open": "대화 보기", "conversation.with": "{names} 님과", "copy_icon_button.copied": "클립보드에 복사됨", + "copy_icon_button.copy_this_text": "클립보드에 링크 복사", "copypaste.copied": "복사됨", "copypaste.copy_to_clipboard": "클립보드에 복사", + "custom_homepage.about": "정보", + "custom_homepage.about_this_server": "이 서버에 대해", + "custom_homepage.administered_by": "관리자", + "custom_homepage.contact": "연락처:", + "custom_homepage.latest_activity": "최근 활동", + "custom_homepage.these_are_the_latest_posts": "이것은 이 서버에 있는 계정들의 최근 40개의 게시물입니다.", "directory.federated": "알려진 연합우주로부터", "directory.local": "{domain}에서만", "directory.new_arrivals": "새로운 사람들", @@ -357,6 +605,11 @@ "domain_block_modal.you_will_lose_relationships": "이 서버의 팔로워와 팔로우를 모두 잃게 됩니다.", "domain_block_modal.you_wont_see_posts": "이 서버 사용자의 게시물이나 알림을 보지 않게 됩니다.", "dropdown.empty": "옵션 선택", + "email_subscriptions.email": "이메일", + "email_subscriptions.form.action": "구독", + "email_subscriptions.submitted.title": "한 단계 더", + "email_subscriptions.validation.email.blocked": "차단된 이메일 공급자", + "email_subscriptions.validation.email.invalid": "이메일 주소가 올바르지 않습니다", "embed.instructions": "아래 코드를 복사하여 이 게시물을 사용자님의 웹사이트에 임베드하세요.", "embed.preview": "이렇게 표시됩니다:", "emoji_button.activity": "활동", @@ -374,12 +627,21 @@ "emoji_button.search_results": "검색 결과", "emoji_button.symbols": "기호", "emoji_button.travel": "여행과 장소", + "empty_column.account_featured.other": "{acct} 님은 아직 아무 것도 추천하지 않았습니다.", + "empty_column.account_featured_self.no_collections_button": "컬렉션 생성", + "empty_column.account_featured_self.no_collections_hide_tab": "대신 탭 숨기기", + "empty_column.account_featured_self.showcase_accounts": "좋아하는 계정을 남들에게 소개하세요", + "empty_column.account_featured_self.showcase_accounts_desc": "컬렉션은 다른 사람들이 페디버스에서 더 많은 것을 발견할 수 있도록 선별된 계정 목록입니다.", + "empty_column.account_featured_unknown.other": "이 계정은 아직 아무 것도 추천하지 않았습니다.", "empty_column.account_hides_collections": "이 사용자는 이 정보를 사용할 수 없도록 설정했습니다", "empty_column.account_suspended": "계정 정지됨", "empty_column.account_timeline": "이곳에는 게시물이 없습니다!", "empty_column.account_unavailable": "프로필 사용 불가", "empty_column.blocks": "아직 아무도 차단하지 않았습니다.", "empty_column.bookmarked_statuses": "아직 북마크에 저장한 게시물이 없습니다. 게시물을 북마크 지정하면 여기에 나타납니다.", + "empty_column.collections": "{acct} 님은 아직 컬렉션을 생성하지 않았습니다.", + "empty_column.collections.featured_in": "아직 어떤 컬렉션에도 추가되지 않았습니다.", + "empty_column.collections.featured_in_undiscoverable": "사람들이 나를 컬렉션에 추가하려면 그 전에 설정 > 개인정보와 도달에서 나를 발견하기 기능에서 추천하도록 허용해야 합니다", "empty_column.community": "로컬 타임라인에 아무것도 없습니다. 아무거나 적어 보세요!", "empty_column.direct": "개인 멘션이 없습니다. 보내거나 받으면 여기에 표시됩니다.", "empty_column.disabled_feed": "이 피드는 서버 관리자에 의해 비활성화되었습니다.", @@ -396,6 +658,7 @@ "empty_column.notification_requests": "깔끔합니다! 여기엔 아무 것도 없습니다. 알림을 받게 되면 설정에 따라 여기에 나타나게 됩니다.", "empty_column.notifications": "아직 알림이 없습니다. 다른 사람들이 당신에게 반응했을 때, 여기에서 볼 수 있습니다.", "empty_column.public": "여기엔 아직 아무 것도 없습니다! 공개적으로 무언가 포스팅하거나, 다른 서버의 사용자를 팔로우 해서 채워보세요", + "empty_state.no_results": "결과 없음", "error.no_hashtag_feed_access": "이 해시태그를 확인하고 팔로우하려면 가입 또는 로그인하세요.", "error.unexpected_crash.explanation": "버그 혹은 브라우저 호환성 문제로 이 페이지를 불러올 수 없습니다.", "error.unexpected_crash.explanation_addons": "이 페이지를 불러올 수 없습니다. 브라우저 확장 프로그램이나 자동 번역 도구로 인해 발생된 오류일 수 있습니다.", @@ -411,6 +674,11 @@ "featured_carousel.current": "게시물 {current, number} / {max, number}", "featured_carousel.header": "{count, plural, other {고정된 게시물}}", "featured_carousel.slide": "{max, number} 중 {current, number} 번째 게시물", + "featured_tags.more_items": "+{count}", + "featured_tags.suggestions": "최근에 {items}에 대해 게시했습니다. 이것들을 추천 해시태그에 추가할까요?", + "featured_tags.suggestions.add": "추가", + "featured_tags.suggestions.added": "언제든지 프로필 수정 > 추천 해시태그에서 추천 해시태그를 관리할 수 있습니다.", + "featured_tags.suggestions.dismiss": "괜찮습니다", "filter_modal.added.context_mismatch_explanation": "이 필터 카테고리는 당신이 이 게시물에 접근한 문맥에 적용되지 않습니다. 만약 이 문맥에서도 필터되길 원한다면, 필터를 수정해야 합니다.", "filter_modal.added.context_mismatch_title": "문맥 불일치!", "filter_modal.added.expired_explanation": "이 필터 카테고리는 만료되었습니다, 적용하려면 만료 일자를 변경할 필요가 있습니다.", @@ -452,6 +720,9 @@ "follow_suggestions.view_all": "모두 보기", "follow_suggestions.who_to_follow": "팔로우할 만한 사람", "followed_tags": "팔로우 중인 해시태그", + "followers.title": "{name} 님을 팔로우합니다", + "following.hide_other_following": "이 사용자는 팔로우 중인 다른 사용자 목록을 보여주지 않기로 했습니다", + "following.title": "{name} 님이 팔로우", "footer.about": "정보", "footer.about_mastodon": "마스토돈 정보", "footer.about_server": "{domain} 소개", @@ -463,6 +734,8 @@ "footer.source_code": "소스코드 보기", "footer.status": "상태", "footer.terms_of_service": "이용 약관", + "form_error.blank": "필드는 공백으로 둘 수 없습니다.", + "form_field.optional": "(선택사항)", "getting_started.heading": "시작하기", "hashtag.admin_moderation": "#{name}에 대한 중재화면 열기", "hashtag.browse": "#{hashtag}의 게시물 둘러보기", @@ -513,6 +786,7 @@ "info_button.label": "도움말", "info_button.what_is_alt_text": "

대체 텍스트가 무엇인가요?

대체 텍스트는 저시력자, 낮은 인터넷 대역폭 사용자, 더 자세한 문맥을 위해 이미지에 대한 설명을 제공하는 것입니다.

깔끔하고 간결하고 객관적인 대체 텍스트를 작성해 모두가 이해하기 쉽게 만들고 접근성이 높아질 수 있습니다.

  • 중요한 요소에 중점을 두세요
  • 이미지 안의 글자를 요약하세요
  • 정형화된 문장 구조를 사용하세요
  • 중복된 정보를 피하세요
  • 복잡한 시각자료(도표나 지도 같은)에선 추세와 주요 결과에 중점을 두세요
", "interaction_modal.action": "{name} 님의 게시물과 상호작용하려면 이용 중인 마스토돈 서버 계정으로 로그인하세요.", + "interaction_modal.action_follow": "{name} 님을 팔로우하려면 사용중인 마스토돈 서버 계정으로 로그인해야 합니다.", "interaction_modal.go": "이동", "interaction_modal.no_account_yet": "아직 계정이 없나요?", "interaction_modal.on_another_server": "다른 서버에", @@ -528,14 +802,22 @@ "keyboard_shortcuts.column": "해당 컬럼에 포커스", "keyboard_shortcuts.compose": "작성창에 포커스", "keyboard_shortcuts.description": "설명", + "keyboard_shortcuts.direct": "개인 멘션 컬럼 열기", "keyboard_shortcuts.down": "리스트에서 아래로 이동", "keyboard_shortcuts.enter": "게시물 열기", + "keyboard_shortcuts.explore": "유행 타임라인 열기", "keyboard_shortcuts.favourite": "게시물 좋아요", "keyboard_shortcuts.favourites": "좋아요 목록 열기", "keyboard_shortcuts.federated": "연합 타임라인 열기", "keyboard_shortcuts.heading": "키보드 단축키", "keyboard_shortcuts.home": "홈 타임라인 열기", "keyboard_shortcuts.hotkey": "핫키", + "keyboard_shortcuts.keys.alt": "Alt", + "keyboard_shortcuts.keys.backspace": "백스페이스", + "keyboard_shortcuts.keys.enter": "엔터", + "keyboard_shortcuts.keys.esc": "ESC", + "keyboard_shortcuts.keys.page_down": "페이지 다운", + "keyboard_shortcuts.keys.page_up": "페이지 업", "keyboard_shortcuts.legend": "이 개요 표시", "keyboard_shortcuts.load_more": "\"더 보기\" 버튼에 포커스", "keyboard_shortcuts.local": "로컬 타임라인 열기", @@ -567,6 +849,7 @@ "lightbox.zoom_in": "실제 크기에 맞춰 보기", "lightbox.zoom_out": "화면 크기에 맞춰 보기", "limited_account_hint.action": "그래도 프로필 보기", + "limited_account_hint.title": "이 프로필 또는 서버는 {domain}의 중재자에 의해 숨겨졌습니다.", "link_preview.author": "{name}", "link_preview.more_from_author": "{name} 프로필 보기", "link_preview.shares": "{count, plural, other {{counter} 개의 게시물}}", @@ -615,6 +898,7 @@ "navigation_bar.automated_deletion": "게시물 자동 삭제", "navigation_bar.blocks": "차단한 사용자", "navigation_bar.bookmarks": "북마크", + "navigation_bar.collections": "컬렉션", "navigation_bar.direct": "개인 멘션", "navigation_bar.domain_blocks": "차단한 도메인", "navigation_bar.favourites": "좋아요", @@ -627,6 +911,7 @@ "navigation_bar.live_feed_local": "라이브 피드 (로컬)", "navigation_bar.live_feed_public": "라이브 피드 (공개)", "navigation_bar.logout": "로그아웃", + "navigation_bar.main": "메인", "navigation_bar.moderation": "중재", "navigation_bar.more": "더 보기", "navigation_bar.mutes": "뮤트한 사용자", @@ -640,6 +925,7 @@ "navigation_panel.expand_followed_tags": "팔로우 중인 해시태그 메뉴 펼치기", "navigation_panel.expand_lists": "리스트 메뉴 펼치기", "not_signed_in_indicator.not_signed_in": "이 정보에 접근하려면 로그인을 해야 합니다.", + "notification.added_to_collection": "{name} 님이 나를 컬렉션에 추가했습니다", "notification.admin.report": "{name} 님이 {target}를 신고했습니다", "notification.admin.report_account": "{name} 님이 {target}의 게시물 {count, plural, other {# 개}}를 {category} 사유로 신고했습니다", "notification.admin.report_account_other": "{name} 님이 {target}의 게시물 {count, plural, other {# 개}}를 신고했습니다", @@ -649,6 +935,7 @@ "notification.admin.sign_up.name_and_others": "{name} 외 {count, plural, other {# 명}}이 가입했습니다", "notification.annual_report.message": "{year} #Wrapstodon 이 기다리고 있습니다! 올 해 마스토돈에서 있었던 최고의 순간과 기억들을 열어보세요!", "notification.annual_report.view": "#Wrapstodon 보기", + "notification.collection_update": "{name} 님이 내가 있는 컬렉션을 수정했습니다", "notification.favourite": "{name} 님이 내 게시물을 좋아합니다", "notification.favourite.name_and_others_with_link": "{name} 외 {count, plural, other {# 명}}이 내 게시물을 좋아합니다", "notification.favourite_pm": "{name} 님이 내 개인 멘션을 마음에 들어합니다", @@ -710,6 +997,7 @@ "notifications.column_settings.admin.report": "새 신고:", "notifications.column_settings.admin.sign_up": "새로운 가입:", "notifications.column_settings.alert": "데스크탑 알림", + "notifications.column_settings.collections": "컬렉션:", "notifications.column_settings.favourite": "좋아요:", "notifications.column_settings.filter_bar.advanced": "모든 범주 표시", "notifications.column_settings.filter_bar.category": "빠른 필터 막대", @@ -729,6 +1017,7 @@ "notifications.column_settings.update": "수정내역:", "notifications.filter.all": "모두", "notifications.filter.boosts": "부스트", + "notifications.filter.collections": "컬렉션", "notifications.filter.favourites": "좋아요", "notifications.filter.follows": "팔로우", "notifications.filter.mentions": "멘션", @@ -762,12 +1051,14 @@ "notifications_permission_banner.title": "아무것도 놓치지 마세요", "onboarding.follows.back": "뒤로가기", "onboarding.follows.empty": "안타깝지만 아직은 아무 것도 보여드릴 수 없습니다. 검색을 이용하거나 둘러보기 페이지에서 팔로우 할 사람을 찾을 수 있습니다. 아니면 잠시 후에 다시 시도하세요.", + "onboarding.follows.next": "다음: 프로필 설정", "onboarding.follows.search": "검색", "onboarding.follows.title": "사람들을 팔로우하기", "onboarding.profile.discoverable": "내 프로필을 발견 가능하도록 설정", "onboarding.profile.discoverable_hint": "마스토돈의 발견하기 기능에 참여하면 게시물이 검색 결과와 유행 란에 표시될 수 있고, 비슷한 관심사를 가진 사람들에게 자신의 프로필이 추천될 수 있습니다.", "onboarding.profile.display_name": "표시되는 이름", "onboarding.profile.display_name_hint": "진짜 이름 또는 재미난 이름…", + "onboarding.profile.finish": "완료", "onboarding.profile.note": "자기소개", "onboarding.profile.note_hint": "남을 @mention 하거나 #hashtag 태그를 달 수 있습니다…", "onboarding.profile.title": "프로필 설정", @@ -839,6 +1130,7 @@ "report.category.title_account": "프로필", "report.category.title_status": "게시물", "report.close": "완료", + "report.collection_comment": "이 컬렉션을 신고하려는 이유가 무엇인가요?", "report.comment.title": "우리가 더 알아야 할 내용이 있나요?", "report.forward": "{target}에 전달", "report.forward_hint": "이 계정은 다른 서버에 있습니다. 익명화 된 사본을 해당 서버에도 전송할까요?", @@ -860,6 +1152,8 @@ "report.rules.title": "어떤 규칙을 위반했나요?", "report.statuses.subtitle": "해당하는 사항을 모두 선택", "report.statuses.title": "이 신고에 대해서 더 참고해야 할 게시물이 있나요?", + "report.submission_error": "신고를 제출할 수 없습니다", + "report.submission_error_details": "네트워크 연결을 확인하고 다시 시도해주세요.", "report.submit": "신고하기", "report.target": "{target} 신고하기", "report.thanks.take_action": "마스토돈에서 나에게 보이는 것을 조절하기 위한 몇 가지 선택사항들이 존재합니다:", @@ -897,6 +1191,7 @@ "search_popout.user": "사용자", "search_results.accounts": "프로필", "search_results.all": "전부", + "search_results.collections": "컬렉션", "search_results.hashtags": "해시태그", "search_results.no_results": "결과가 없습니다.", "search_results.no_search_yet": "게시물, 프로필, 해시태그를 검색해보세요.", @@ -907,12 +1202,15 @@ "server_banner.active_users": "활성 사용자", "server_banner.administered_by": "관리자:", "server_banner.is_one_of_many": "{domain}은 페디버스를 통해 참여할 수 있는 많은 마스토돈 서버들 중 하나입니다", + "server_banner.more_about_this_server": "이 서버에 대한 더 많은 정보", "server_banner.server_stats": "서버 통계:", "sign_in_banner.create_account": "계정 생성", "sign_in_banner.follow_anyone": "페디버스를 통해 누구든지 팔로우하고 시간순으로 게시물을 받아보세요. 알고리즘도, 광고도, 클릭을 유도하는 것들도 없습니다.", "sign_in_banner.mastodon_is": "마스토돈은 무엇이 일어나는지 받아보는 가장 좋은 수단입니다.", "sign_in_banner.sign_in": "로그인", "sign_in_banner.sso_redirect": "로그인 또는 가입하기", + "skip_links.hotkey": "단축키 {hotkey}", + "skip_links.skip_to_content": "주 내용으로 건너뛰기", "status.admin_account": "@{name}에 대한 중재 화면 열기", "status.admin_domain": "{domain}에 대한 중재 화면 열기", "status.admin_status": "중재 화면에서 이 게시물 열기", @@ -1013,7 +1311,9 @@ "tabs_bar.menu": "메뉴", "tabs_bar.notifications": "알림", "tabs_bar.publish": "새 게시물", + "tabs_bar.quick_links": "빠른 링크", "tabs_bar.search": "검색", + "tag.remove": "제거", "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/nan-TW.json b/app/javascript/mastodon/locales/nan-TW.json index cd93bc69d1c..3b7ae6f4fc2 100644 --- a/app/javascript/mastodon/locales/nan-TW.json +++ b/app/javascript/mastodon/locales/nan-TW.json @@ -2,6 +2,7 @@ "about.blocks": "Siū 管制 ê 服侍器", "about.contact": "聯絡方法:", "about.default_locale": "預設", + "about.disclaimer": "Mastodon是自由、開放原始碼ê軟體,mā是Mastodon GmbH ê商標。", "about.domain_blocks.no_reason_available": "原因bē-tàng用", "about.domain_blocks.preamble": "Mastodon一般ē允准lí看別ê fediverse 服侍器來ê聯絡人kap hām用者交流。Tsiah ê 是本服侍器建立ê例外。", "about.domain_blocks.silenced.explanation": "Lí一般buē-tàng tuì tsit ê服侍器看用戶ê紹介kap內容,除非lí明白tshiau-tshuē á是跟tuè伊。", @@ -645,6 +646,7 @@ "empty_column.account_unavailable": "個人資料bē當看", "empty_column.blocks": "Lí iáu無封鎖任何用者。", "empty_column.bookmarked_statuses": "Lí iáu無加添任何冊籤。Nā是lí加添冊籤,伊ē佇tsia顯示。", + "empty_column.collections": "{acct} iáu bē建立任何收藏。", "empty_column.collections.featured_in": "Lí iáu buē加添kàu任何收藏。", "empty_column.collections.featured_in_undiscoverable": "若beh予lâng kā lí加入去收藏,lí需要kàu偏愛ê設定 > 隱私kap資訊ê及至佇探索經驗允准推薦", "empty_column.community": "本站時間線是空ê。緊來公開PO文oh!", @@ -818,6 +820,12 @@ "keyboard_shortcuts.heading": "鍵盤ê快速key", "keyboard_shortcuts.home": "Phah開tshù ê時間線", "keyboard_shortcuts.hotkey": "快速key", + "keyboard_shortcuts.keys.alt": "Alt", + "keyboard_shortcuts.keys.backspace": "Backspace", + "keyboard_shortcuts.keys.enter": "Enter", + "keyboard_shortcuts.keys.esc": "ESC", + "keyboard_shortcuts.keys.page_down": "Page Down", + "keyboard_shortcuts.keys.page_up": "Page Up", "keyboard_shortcuts.legend": "顯示tsit篇說明", "keyboard_shortcuts.load_more": "Kā焦點suá kàu「載入其他」ê鈕仔", "keyboard_shortcuts.local": "Phah開本站ê時間線", @@ -849,6 +857,7 @@ "lightbox.zoom_in": "Tshūn-kiu kàu實際ê sài-suh", "lightbox.zoom_out": "Tshūn-kiu kàu適當ê sài-suh", "limited_account_hint.action": "一直顯示個人資料", + "limited_account_hint.title": "Tsit ê 個人資料iah是服侍器予 {domain} ê管理員tshàng起來ah。", "link_preview.author": "Tuì {name}", "link_preview.more_from_author": "看 {name} ê其他內容", "link_preview.shares": "{count, plural, one {{counter} 篇} other {{counter} 篇}}PO文", @@ -1190,6 +1199,7 @@ "search_popout.user": "用者", "search_results.accounts": "個人資料", "search_results.all": "全部", + "search_results.collections": "收藏", "search_results.hashtags": "Hashtag", "search_results.no_results": "無結果。", "search_results.no_search_yet": "請試tshiau-tshuē PO文、個人資料á是hashtag。", diff --git a/app/javascript/mastodon/locales/nn.json b/app/javascript/mastodon/locales/nn.json index 924973e0b3a..6b023be0705 100644 --- a/app/javascript/mastodon/locales/nn.json +++ b/app/javascript/mastodon/locales/nn.json @@ -646,6 +646,7 @@ "empty_column.account_unavailable": "Profil ikkje tilgjengeleg", "empty_column.blocks": "Du har ikkje blokkert nokon enno.", "empty_column.bookmarked_statuses": "Du har ikkje lagra noko bokmerke enno. Når du set bokmerke på eit innlegg, dukkar det opp her.", + "empty_column.collections": "{acct} har ikkje laga nokon samlingar enno.", "empty_column.collections.featured_in": "Du er ikkje lagt til i nokon samlingar enno.", "empty_column.collections.featured_in_undiscoverable": "For at folk skal kunna leggja deg til i samlingar, må du gje dei løyve til å oppdaga deg i Innstillingar > Personvern og rekkjevidd", "empty_column.community": "Den lokale tidslina er tom. Skriv noko offentleg å få ballen til å rulle!", @@ -819,6 +820,12 @@ "keyboard_shortcuts.heading": "Snøggtastar", "keyboard_shortcuts.home": "Opne heimetidslina", "keyboard_shortcuts.hotkey": "Snøggtast", + "keyboard_shortcuts.keys.alt": "Alt", + "keyboard_shortcuts.keys.backspace": "Rettetast", + "keyboard_shortcuts.keys.enter": "Enter", + "keyboard_shortcuts.keys.esc": "Esc", + "keyboard_shortcuts.keys.page_down": "Page Down", + "keyboard_shortcuts.keys.page_up": "Page Up", "keyboard_shortcuts.legend": "Vis denne forklaringa", "keyboard_shortcuts.load_more": "Fokuser på «Last meir»-knappen", "keyboard_shortcuts.local": "Opne lokal tidsline", @@ -1192,6 +1199,7 @@ "search_popout.user": "brukar", "search_results.accounts": "Profiler", "search_results.all": "Alt", + "search_results.collections": "Samlingar", "search_results.hashtags": "Emneknaggar", "search_results.no_results": "Ingen resultat.", "search_results.no_search_yet": "Prøv å søkja etter innlegg, profilar eller emneknaggar.", diff --git a/app/javascript/mastodon/locales/pl.json b/app/javascript/mastodon/locales/pl.json index 14865249e7e..6c62ad4ccf4 100644 --- a/app/javascript/mastodon/locales/pl.json +++ b/app/javascript/mastodon/locales/pl.json @@ -68,8 +68,12 @@ "account.go_to_profile": "Przejdź do profilu", "account.hide_reblogs": "Ukryj podbicia od @{name}", "account.in_memoriam": "Ku pamięci.", + "account.join_modal.me": "Dołączyłeś(aś) na {server}", + "account.join_modal.me_today": "To Twój pierwszy dzień na {server}!", + "account.join_modal.other": "{name} dołączył(a) na {server}", "account.joined_short": "Dołączył(a)", "account.languages": "Zmień subskrybowane języki", + "account.last_active": "Ostatnia aktywność", "account.link_verified_on": "Własność tego odnośnika została potwierdzona {date}", "account.locked_info": "To konto jest prywatne. Właściciel ręcznie wybiera kto może go obserwować.", "account.media": "Multimedia", @@ -98,6 +102,13 @@ "account.mute_short": "Wycisz", "account.muted": "Wyciszony", "account.mutual": "Obserwujecie się wzajemnie", + "account.name.copy": "Kopiuj odnośnik", + "account.name.help.domain": "{domain} to serwer, na którym znajduje się profil i wpisy tego użytkownika.", + "account.name.help.domain_self": "{domain} to Twój serwer, na którym znajduje się Twój profil i wpisy.", + "account.name.help.footer": "Tak samo jak możesz wysyłać e-maile do osób korzystających z różnych dostawców poczty, możesz wchodzić w interakcje z osobami na innych serwerach Mastodona oraz z każdym, kto korzysta z innych aplikacji Fediwersum.", + "account.name.help.header": "Identyfikator jest jak adres e-mail", + "account.name.help.username": "{username} to nazwa użytkownika tego konta na jego serwerze. Ktoś na innym serwerze może mieć taką samą nazwę użytkownika.", + "account.name.help.username_self": "{username} to Twoja nazwa użytkownika na tym serwerze. Ktoś na innym serwerze może mieć taką samą nazwę użytkownika.", "account.name_info": "Co to oznacza?", "account.no_bio": "Brak opisu.", "account.node_modal.callout": "Osobiste notatki są widoczne tylko dla Ciebie.", @@ -157,7 +168,7 @@ "account_edit.field_actions.edit": "Edytuj pole", "account_edit.field_delete_modal.confirm": "Czy na pewno chcesz usunąć to pole niestandardowe? Tej czynności nie można cofnąć.", "account_edit.field_delete_modal.delete_button": "Usuń", - "account_edit.field_delete_modal.title": "Usuń pole niestandardowe ", + "account_edit.field_delete_modal.title": "Usuń pole niestandardowe?", "account_edit.field_edit_modal.add_title": "Dodaj pole niestandardowe", "account_edit.field_edit_modal.discard_confirm": "Odrzuć", "account_edit.field_edit_modal.discard_message": "Masz niezapisane zmiany. Czy na pewno chcesz je odrzucić?", @@ -173,6 +184,7 @@ "account_edit.image_edit.alt_edit_button": "Dodaj tekst alternatywny", "account_edit.image_edit.remove_button": "Usuń obraz", "account_edit.image_edit.replace_button": "Zastąp obraz", + "account_edit.item_list.delete": "Usuń {name}", "account_edit.profile_tab.button_label": "Dostosuj", "account_edit.profile_tab.hint.description": "Te ustawienia wpływają na to, co użytkownicy widzą na {server} w oficjalnych aplikacjach, ale mogą nie obowiązywać na innych serwerach i w aplikacjach zewnętrznych.", "account_edit.profile_tab.hint.title": "Wyświetlanie może się różnić", @@ -191,6 +203,15 @@ "account_edit.upload_modal.done": "Gotowe", "account_edit.upload_modal.next": "Następne", "account_edit.upload_modal.step_crop.zoom": "Powiększenie", + "account_edit.upload_modal.step_upload.button": "Wybierz pliki", + "account_edit.upload_modal.step_upload.header": "Wybierz obraz", + "account_edit.upload_modal.step_upload.hint": "WEBP, PNG, GIF lub JPG, maksymalnie {limit} MB.{br}Obraz zostanie przeskalowany do {width}x{height} px.", + "account_edit.upload_modal.title_add.avatar": "Dodaj zdjęcie profilowe", + "account_edit.upload_modal.title_add.header": "Dodaj zdjęcie nagłówka", + "account_edit.upload_modal.title_replace.avatar": "Zmień zdjęcie profilowe", + "account_edit.upload_modal.title_replace.header": "Zmień zdjęcie nagłówka", + "account_edit_tags.add_tag": "Dodaj #{tagName}", + "account_edit_tags.search_placeholder": "Dodaj hashtag...", "admin.dashboard.daily_retention": "Wskaźnik utrzymania użytkowników według dni od rejestracji", "admin.dashboard.monthly_retention": "Wskaźnik utrzymania użytkowników według miesięcy od rejestracji", "admin.dashboard.retention.average": "Średnia", @@ -238,6 +259,8 @@ "annual_report.summary.close": "Zamknij", "annual_report.summary.copy_link": "Skopiuj adres", "annual_report.summary.followers.new_followers": "{count, plural, one {{counter} obserwujący} few {{counter} obserwujących} many {{counter} obserwujących} other {{counter} obserwujących}}", + "annual_report.summary.highlighted_post.favourite_count": "Ten post został polubiony {count, plural, one {raz} few {# razy} many {# razy} other {# razy}}.", + "annual_report.summary.highlighted_post.reply_count": "Ten post ma {count, plural, one {jedną odpowiedź} few {# odpowiedzi} many {# odpowiedzi} other {# odpowiedzi}}.", "annual_report.summary.most_used_app.most_used_app": "najczęściej używana aplikacja", "annual_report.summary.most_used_hashtag.most_used_hashtag": "najczęściej używany hashtag", "annual_report.summary.new_posts.new_posts": "nowe wpisy", @@ -274,6 +297,7 @@ "closed_registrations_modal.preamble": "Mastodon jest zdecentralizowany, więc bez względu na to, gdzie się zarejestrujesz, będziesz w stanie obserwować i wchodzić w interakcje z innymi osobami na tym serwerze. Możesz nawet uruchomić własny serwer!", "closed_registrations_modal.title": "Rejestracja na Mastodonie", "collections.last_updated_at": "Ostatnia aktualizacja: {date}", + "collections.remove_account": "Usuń", "column.about": "O serwerze", "column.blocks": "Zablokowani", "column.bookmarks": "Zakładki", @@ -430,6 +454,7 @@ "emoji_button.search_results": "Wyniki wyszukiwania", "emoji_button.symbols": "Symbole", "emoji_button.travel": "Podróże i miejsca", + "empty_column.account_featured_self.no_collections_button": "Stwórz kolekcję", "empty_column.account_hides_collections": "Ta osoba postanowiła nie udostępniać tych informacji", "empty_column.account_suspended": "Konto zawieszone", "empty_column.account_timeline": "Brak wpisów!", diff --git a/app/javascript/mastodon/locales/sv.json b/app/javascript/mastodon/locales/sv.json index 6ffd62c62ae..e021787225f 100644 --- a/app/javascript/mastodon/locales/sv.json +++ b/app/javascript/mastodon/locales/sv.json @@ -646,6 +646,7 @@ "empty_column.account_unavailable": "Profilen ej tillgänglig", "empty_column.blocks": "Du har ännu ej blockerat några användare.", "empty_column.bookmarked_statuses": "Du har inte bokmärkt några inlägg än. När du bokmärker ett inlägg kommer det synas här.", + "empty_column.collections": "{acct} har ännu inte skapat några samlingar.", "empty_column.collections.featured_in": "Du har inte lagts till i några samlingar än.", "empty_column.collections.featured_in_undiscoverable": "För att personer ska kunna lägga till dig i samlingar, måste du tillåta att inkluderas i upptäcktsupplevelser från Inställningar> Sekretess och räckvidd", "empty_column.community": "Den lokala tidslinjen är tom. Skriv något offentligt för att sätta bollen i rullning!", @@ -819,6 +820,12 @@ "keyboard_shortcuts.heading": "Tangentbordsgenvägar", "keyboard_shortcuts.home": "Öppna Hemtidslinjen", "keyboard_shortcuts.hotkey": "Kommando", + "keyboard_shortcuts.keys.alt": "Alt", + "keyboard_shortcuts.keys.backspace": "Backsteg", + "keyboard_shortcuts.keys.enter": "Retur", + "keyboard_shortcuts.keys.esc": "Esc", + "keyboard_shortcuts.keys.page_down": "Sida ned", + "keyboard_shortcuts.keys.page_up": "Sida upp", "keyboard_shortcuts.legend": "Visa denna översikt", "keyboard_shortcuts.load_more": "Fokusera \"Ladda mer\"-knappen", "keyboard_shortcuts.local": "Öppna lokal tidslinje", @@ -850,6 +857,7 @@ "lightbox.zoom_in": "Zooma till faktisk storlek", "lightbox.zoom_out": "Zooma för att passa", "limited_account_hint.action": "Visa profil ändå", + "limited_account_hint.title": "Denna profil eller server har dolts av {domain}s moderatorer.", "link_preview.author": "Av {name}", "link_preview.more_from_author": "Mer från {name}", "link_preview.shares": "{count, plural, one {{counter} inlägg} other {{counter} inlägg}}", @@ -1191,6 +1199,7 @@ "search_popout.user": "användare", "search_results.accounts": "Profiler", "search_results.all": "Alla", + "search_results.collections": "Samlingar", "search_results.hashtags": "Hashtaggar", "search_results.no_results": "Inga resultat.", "search_results.no_search_yet": "Prova att söka efter inlägg, profiler eller hashtags.", diff --git a/config/locales/activerecord.ko.yml b/config/locales/activerecord.ko.yml index 05be3155831..9d3cc012348 100644 --- a/config/locales/activerecord.ko.yml +++ b/config/locales/activerecord.ko.yml @@ -34,6 +34,8 @@ ko: invalid: 올바른 URL이 아닙니다 collection: attributes: + collection_items: + too_many: 너무 많습니다. %{count}개를 초과할 수 없습니다 tag: unusable: 사용할 수 없음 doorkeeper/application: diff --git a/config/locales/activerecord.pl.yml b/config/locales/activerecord.pl.yml index 29cace6db53..9eb587f2b53 100644 --- a/config/locales/activerecord.pl.yml +++ b/config/locales/activerecord.pl.yml @@ -32,6 +32,12 @@ pl: attributes: url: invalid: nie jest poprawnym adresem URL + collection: + attributes: + collection_items: + too_many: jest zbyt wiele, nie więcej niż %{count} dozwolone + tag: + unusable: nie mogą być użyte doorkeeper/application: attributes: website: diff --git a/config/locales/da.yml b/config/locales/da.yml index a60071bb5dc..bfc9d3857e8 100644 --- a/config/locales/da.yml +++ b/config/locales/da.yml @@ -1499,6 +1499,7 @@ da: your_appeal_rejected: Din appel er afvist edit_profile: other: Andre + privacy_redesign_body: Beslutningen om at vise dine følgere og dem, du følger, træffes nu direkte fra din profil. redesign_body: Profilredigering kan nu tilgås direkte fra profilsiden. redesign_button: Gå dertil redesign_title: Der er en ny måde at redigere sin profil på diff --git a/config/locales/de.yml b/config/locales/de.yml index 33224000e81..512d02ad7cd 100644 --- a/config/locales/de.yml +++ b/config/locales/de.yml @@ -1499,6 +1499,7 @@ de: your_appeal_rejected: Dein Einspruch wurde abgelehnt edit_profile: other: Andere + privacy_redesign_body: Die Option, deine Follower und „Folge ich“ allen anzuzeigen oder sie vor allen zu verbergen, findest du jetzt auch direkt in deinen Profileinstellungen. redesign_body: Dein Profil kannst du jetzt direkt auf deiner Profilseite bearbeiten. redesign_button: Loslegen redesign_title: Es gibt eine brandneue Möglichkeit, das Profil zu bearbeiten diff --git a/config/locales/doorkeeper.pl.yml b/config/locales/doorkeeper.pl.yml index 85b90137472..67a0d624643 100644 --- a/config/locales/doorkeeper.pl.yml +++ b/config/locales/doorkeeper.pl.yml @@ -84,6 +84,8 @@ pl: credential_flow_not_configured: Ścieżka "Resource Owner Password Credentials" zakończyła się błędem, ponieważ Doorkeeper.configure.resource_owner_from_credentials nie został skonfigurowany. invalid_client: Autoryzacja klienta nie powiodła się z powodu nieznanego klienta, braku uwierzytelnienia klienta, lub niewspieranej metody uwierzytelniania. invalid_code_challenge_method: + one: Parametr code_challenge_method musi mieć wartość %{challenge_methods}. + other: Parametr code_challenge_method musi być jednym z %{challenge_methods}. zero: Serwer autoryzacji nie obsługuje PKCE — brak akceptowanych wartości code_challenge_method. invalid_grant: Grant uwierzytelnienia jest niepoprawny, przeterminowany, unieważniony, nie pasuje do URI przekierowwania użytego w żądaniu uwierzytelnienia, lub został wystawiony przez innego klienta. invalid_redirect_uri: URI przekierowania jest nieprawidłowy. diff --git a/config/locales/doorkeeper.pt-BR.yml b/config/locales/doorkeeper.pt-BR.yml index 1e4efbea786..3ade5378701 100644 --- a/config/locales/doorkeeper.pt-BR.yml +++ b/config/locales/doorkeeper.pt-BR.yml @@ -156,17 +156,17 @@ pt-BR: admin:read:accounts: ler informações sensíveis de todas as contas admin:read:canonical_email_blocks: ler informações sensíveis de todos os blocos de e-mail canônicos admin:read:domain_allows: ler informações sensíveis de todos os domínios permitidos - admin:read:domain_blocks: ler informações sensíveis de todos os domínios bloqueados - admin:read:email_domain_blocks: ler informações sensíveis de todos os domínios de e-mail bloqueados - admin:read:ip_blocks: ler informações sensíveis de todos os endereços de IP bloqueados + admin:read:domain_blocks: ler informações sensíveis de todos os bloqueios de domínio + admin:read:email_domain_blocks: ler informações sensíveis de todos os bloqueios de domínios de e-mail + admin:read:ip_blocks: ler informações sensíveis de todos os bloqueios de endereço IP admin:read:reports: ler informações sensíveis de todas as denúncias e contas denunciadas admin:write: alterar todos os dados no servidor admin:write:accounts: executar ações de moderação em contas - admin:write:canonical_email_blocks: executar ações de moderação em blocos canônicos de e-mail - admin:write:domain_allows: executar ações de moderação em domínios permitidos - admin:write:domain_blocks: executar ações de moderação em domínios bloqueados - admin:write:email_domain_blocks: executar ações de moderação em domínios de e-mail bloqueados - admin:write:ip_blocks: executar ações de moderação em IPs bloqueados + admin:write:canonical_email_blocks: executar ações de moderação em bloqueios de e-mail canônicos + admin:write:domain_allows: executar ações de moderação na permissão de domínios + admin:write:domain_blocks: executar ações de moderação em bloqueios de domínio + admin:write:email_domain_blocks: executar ações de moderação em bloqueios de domínios de e-mail + admin:write:ip_blocks: executar ações de moderação em bloqueios de endereço IP admin:write:reports: executar ações de moderação em denúncias crypto: usar criptografia de ponta a ponta follow: alterar o relacionamento das contas diff --git a/config/locales/el.yml b/config/locales/el.yml index 11093770271..66679cecdf8 100644 --- a/config/locales/el.yml +++ b/config/locales/el.yml @@ -1499,6 +1499,7 @@ el: your_appeal_rejected: Η έφεση σου απορρίφθηκε edit_profile: other: Άλλο + privacy_redesign_body: Η επιλογή να εμφανίζεις αυτούς που ακολουθείς και τους ακολούθους σου γίνεται τώρα απευθείας από το προφίλ σου. redesign_body: Η επεξεργασία προφίλ μπορεί τώρα να προσεγγιστεί απευθείας από τη σελίδα του προφίλ. redesign_button: Πηγαίνετε εκεί redesign_title: Υπάρχει μια νέα εμπειρία επεξεργασίας προφίλ diff --git a/config/locales/es-AR.yml b/config/locales/es-AR.yml index 4ce9d037bd4..db9c1e0d767 100644 --- a/config/locales/es-AR.yml +++ b/config/locales/es-AR.yml @@ -1499,6 +1499,7 @@ es-AR: your_appeal_rejected: Se rechazó tu apelación edit_profile: other: Otros + privacy_redesign_body: La opción de mostrar tus seguidores y seguidores ahora se hace directamente a partir de tu perfil. redesign_body: Ahora podés acceder a la edición del perfil desde la propia página de perfil. redesign_button: Ir allí redesign_title: Hay una nueva experiencia de edición de perfil diff --git a/config/locales/es-MX.yml b/config/locales/es-MX.yml index fc13d70dbeb..5525f212cd3 100644 --- a/config/locales/es-MX.yml +++ b/config/locales/es-MX.yml @@ -1499,6 +1499,7 @@ es-MX: your_appeal_rejected: Tu apelación ha sido rechazada edit_profile: other: Otro + privacy_redesign_body: Ahora puedes elegir si quieres mostrar a tus seguidores y a quiénes sigues directamente desde tu perfil. redesign_body: Ahora se puede acceder a la edición del perfil directamente desde la página del perfil. redesign_button: Llévame allí redesign_title: Hay una nueva experiencia de edición de perfil diff --git a/config/locales/es.yml b/config/locales/es.yml index 20d232b5e97..ddcc6ab07d2 100644 --- a/config/locales/es.yml +++ b/config/locales/es.yml @@ -1499,6 +1499,7 @@ es: your_appeal_rejected: Tu apelación ha sido rechazada edit_profile: other: Otros + privacy_redesign_body: La opción de mostrar tus perfiles seguidos y seguidores ahora se hace directamente desde tu perfil. redesign_body: Ahora puedes acceder a la edición del perfil desde la propia página de perfil. redesign_button: Llévame allí redesign_title: Hay una nueva experiencia de edición de perfil diff --git a/config/locales/fi.yml b/config/locales/fi.yml index 46117cb5561..76fb59f90c8 100644 --- a/config/locales/fi.yml +++ b/config/locales/fi.yml @@ -1491,6 +1491,7 @@ fi: your_appeal_rejected: Valituksesi on hylätty edit_profile: other: Muut + privacy_redesign_body: Valinta seurattavien ja seurattujen näyttämiseksi tehdään nyt suoraan profiilista. redesign_body: Profiilia pääsee muokkaamaan nyt suoraan profiilisivulta. redesign_button: Siirry sinne redesign_title: Profiilin muokkauskokemus on uudistunut diff --git a/config/locales/fr-CA.yml b/config/locales/fr-CA.yml index afaa55e3ce8..3199e2ed97c 100644 --- a/config/locales/fr-CA.yml +++ b/config/locales/fr-CA.yml @@ -1499,6 +1499,7 @@ fr-CA: your_appeal_rejected: Votre appel a été rejeté edit_profile: other: Autre + privacy_redesign_body: Le choix de montrer vos abonnements et vos abonné·e·s est maintenant fait directement depuis votre profil. redesign_body: La modification du profil est maintenant accessible directement depuis la page de profil. redesign_button: Accéder redesign_title: Nouvelle expérience de modification du profil diff --git a/config/locales/fr.yml b/config/locales/fr.yml index 325ba3382be..6813e5aa2cd 100644 --- a/config/locales/fr.yml +++ b/config/locales/fr.yml @@ -1499,6 +1499,7 @@ fr: your_appeal_rejected: Votre appel a été rejeté edit_profile: other: Autre + privacy_redesign_body: Le choix de montrer vos abonnements et vos abonné·e·s est maintenant fait directement depuis votre profil. redesign_body: La modification du profil est maintenant accessible directement depuis la page de profil. redesign_button: Accéder redesign_title: Nouvelle expérience de modification du profil diff --git a/config/locales/ga.yml b/config/locales/ga.yml index efd086f6863..9ca81055914 100644 --- a/config/locales/ga.yml +++ b/config/locales/ga.yml @@ -1564,6 +1564,7 @@ ga: your_appeal_rejected: Diúltaíodh do d'achomharc edit_profile: other: Eile + privacy_redesign_body: Déantar an rogha chun do leanúna agus do leanúna a thaispeáint go díreach ó do phróifíl anois. redesign_body: Is féidir rochtain a fháil ar eagarthóireacht próifíle go díreach ón leathanach próifíle anois. redesign_button: Téigh ann redesign_title: Tá taithí nua eagarthóireachta próifíle ann diff --git a/config/locales/gl.yml b/config/locales/gl.yml index 22df0fe8d66..475ffa70a0a 100644 --- a/config/locales/gl.yml +++ b/config/locales/gl.yml @@ -1499,6 +1499,7 @@ gl: your_appeal_rejected: A apelación foi rexeitada edit_profile: other: Outros + privacy_redesign_body: A opción para mostrar a quen segues e quen te segue agora está no teu perfil. redesign_body: Agora podes acceder á edición do perfil directamente desde a páxina do perfil. redesign_button: Ir á edición redesign_title: Hai novidades no xeito en que podes editar o perfil diff --git a/config/locales/he.yml b/config/locales/he.yml index 0d0d706409c..59617180e26 100644 --- a/config/locales/he.yml +++ b/config/locales/he.yml @@ -1541,6 +1541,7 @@ he: your_appeal_rejected: ערעורך נדחה edit_profile: other: אחר + privacy_redesign_body: הבחירה אם להראות את העוקבים והנעקבים שלך עברה להפעלה ישירה מהפרופיל שלך. redesign_body: ניתן להגיע לעריכת הפרופיל ישירות מעמוד הפרופיל. redesign_button: לך לשם redesign_title: מעתה מוצעת חוויית עריכת פרופיל חדשה diff --git a/config/locales/is.yml b/config/locales/is.yml index 540072beb63..34b740247ac 100644 --- a/config/locales/is.yml +++ b/config/locales/is.yml @@ -1503,6 +1503,7 @@ is: your_appeal_rejected: Áfrýjun þinni hefur verið hafnað edit_profile: other: Annað + privacy_redesign_body: Valkosturinn að birta fylgjendur þína og það sem þú fylgist með er núna framkvæmdur beint í notandasniðinu þínu. redesign_body: Núna er hægt að breyta notandasíðunni sinni beint á þeirri síðu. redesign_button: Fara þangað redesign_title: Núna er ný aðferð við að breyta notandasíðunni sinni diff --git a/config/locales/it.yml b/config/locales/it.yml index c0c7df81753..c532c596d89 100644 --- a/config/locales/it.yml +++ b/config/locales/it.yml @@ -1499,6 +1499,7 @@ it: your_appeal_rejected: Il tuo appello è stato respinto edit_profile: other: Altro + privacy_redesign_body: Ora puoi scegliere se mostrare i tuoi account seguiti e i follower direttamente dal tuo profilo. redesign_body: Ora è possibile modificare il profilo direttamente dalla pagina del profilo stesso. redesign_button: Vai lì redesign_title: È disponibile una nuova esperienza di modifica del profilo diff --git a/config/locales/ko.yml b/config/locales/ko.yml index e1eb5472364..be8f0f71b37 100644 --- a/config/locales/ko.yml +++ b/config/locales/ko.yml @@ -53,6 +53,7 @@ ko: label: 역할 변경 no_role: 역할 없음 title: "%{username}의 역할 변경" + collections: 컬렉션 confirm: 신원 확인 confirmed: 확인됨 confirming: 확인 중 @@ -262,6 +263,7 @@ ko: demote_user_html: "%{name} 님이 사용자 %{target} 님을 강등했습니다" destroy_announcement_html: "%{name} 님이 공지 %{target}을 삭제했습니다" destroy_canonical_email_block_html: "%{name} 님이 %{target} 해시를 가진 이메일을 차단 해제했습니다" + destroy_collection_html: "%{name} 님이 %{target} 님의 컬렉션을 삭제했습니다" destroy_custom_emoji_html: "%{name} 님이 에모지 %{target}를 삭제했습니다" destroy_domain_allow_html: "%{name} 님이 %{target} 도메인과의 연합을 금지했습니다" destroy_domain_block_html: "%{name} 님이 도메인 %{target}의 차단을 해제했습니다" @@ -301,6 +303,7 @@ ko: unsilence_account_html: "%{name} 님이 %{target}의 계정에 대한 제한을 해제했습니다" unsuspend_account_html: "%{name} 님이 %{target}의 계정에 대한 정지를 해제했습니다" update_announcement_html: "%{name} 님이 공지사항 %{target}을 갱신했습니다" + update_collection_html: "%{name} 님이 %{target} 님의 컬렉션을 수정했습니다" update_custom_emoji_html: "%{name} 님이 에모지 %{target}를 업데이트 했습니다" update_domain_block_html: "%{name} 님이 %{target}에 대한 도메인 차단을 갱신했습니다" update_ip_block_html: "%{name} 님이 IP 규칙 %{target}을 수정했습니다" @@ -336,6 +339,22 @@ ko: unpublish: 게시 취소 unpublished_msg: 공지가 성공적으로 발행 취소되었습니다! updated_msg: 공지가 성공적으로 업데이트되었습니다! + collections: + accounts: 계정 + back_to_account: 계정 페이지로 돌아가기 + back_to_report: 신고 페이지로 돌아가기 + batch: + add_to_report: '신고 #%{id}에 추가' + remove_from_report: 신고에서 제거 + report: 신고 + collection_title: "%{name}의 컬렉션" + contents: 컨텐츠 + no_collection_selected: 아무 것도 선택되지 않아 어떤 컬렉션도 바뀌지 않았습니다 + number_of_accounts: + other: 계정 %{count}개 + open: 열기 + title: 계정 컬렉션 - @%{name} + view_publicly: 공개시점으로 보기 critical_update_pending: 긴급 업데이트 보류 중 custom_emojis: assign_category: 분류 지정 @@ -465,9 +484,68 @@ ko: title: 새 이메일 도메인 차단 no_email_domain_block_selected: 아무 것도 선택 되지 않아 어떤 이메일 도메인 차단도 변경되지 않았습니다 not_permitted: 허용하지 않음 + reset: 초기화 resolved_dns_records_hint_html: 도메인 네임은 다음의 MX 도메인으로 연결되어 있으며, 이메일을 받는데 필수적입니다. MX 도메인을 차단하면 같은 MX 도메인을 사용하는 어떤 이메일이라도 가입할 수 없게 되며, 보여지는 도메인이 다르더라도 적용됩니다. 주요 이메일 제공자를 차단하지 않도록 조심하세요. resolved_through_html: "%{domain}을 통해 리졸빙됨" + search: 검색 title: 차단된 이메일 도메인 + email_subscriptions: + accounts: + account: 계정 + active: 활성 + empty: + hint: 구독자를 가진 계정이 없습니다. + no_lists_yet: 리스트가 없습니다 + inactive: 비활성 + last_email: 최근 이메일 + status: 상태 + subscribers: 구독자 + title: 메일링 리스트 + additional_footer_texts: + show: + title: 추가 하단 텍스트 + compliance_settings: + additional_footer_text: + action: 관리 + hint: 뉴스레터 이메일의 최하단에만 보여지는 선택적인 텍스트 + title: 추가 하단 텍스트 + lead: 이메일 뉴스레터는 운영하는 지역에 따라 마케팅 이메일로 분류될 수 있습니다. + privacy_policy: + action: 관리 + hint: 이 정책은 모든 메일 하단에 링크됩니다 + title: 개인정보처리방침 + title: 법적 규정 준수 설정 + danger_zone: + disable_feature: + action: 비활성화 + hint: 모든 계정에 대해 기능 비활성화 + title: 기능 비활성화 + erase_all_data: + action: 데이터 삭제 + hint: 메일링 리스트에 있는 이메일을 영구적으로 삭제합니다 + title: 데이터 모두 삭제 + title: 위험한 영역 + index: + disabled: + cannot_be_enabled: 이 서버의 기술제공자가 이 기능을 활성화하지 않았습니다. + description: 이 기능은 지정된 계정들이 프로필에 위젯을 추가해 마스토돈 계정 없이도 이메일을 통해 게시물을 받아볼 수 있도록 허용합니다. + get_started: 시작하기 + title: 이메일 뉴스레터 + roles: + accounts: 계정 + edit_role: 역할 편집 + empty: + hint: 이 기능을 사용할 수 있는 권한을 가진 사람이 없습니다. + no_roles_added: 역할 추가되지 않음 + manage_roles: 역할 관리 + role_name: 역할 이름 + title: 역할 + setups: + show: + enable_feature: 기능 활성화 + important_information: 중요한 정보 + list: + 1_permission_explanation: 이 기능이 활성화 되면 관련 권한을 가진 계정은 프로필에 이메일 컬렉션을 추가할 수 있게 됩니다. export_domain_allows: new: title: 도메인 허용 목록 불러오기 @@ -648,6 +726,7 @@ ko: action_log: 감사 로그 action_taken_by: 신고 처리자 actions: + delete_description_html: 신고된 게시물 또는 컬렉션은 삭제될 것이며 이 처벌기록은 같은 계정의 향후 규정 위반에 대해 참고사항으로 쓰일 수 있도록 저장됩니다. mark_as_sensitive_description_html: 신고된 게시물의 미디어는 민감함으로 표시될 것이며 이 처벌기록은 같은 계정의 향후 규정 위반에 대해 참고사항으로 쓰일 수 있도록 저장됩니다. other_description_html: 계정 동작을 제어하고 신고된 계정과의 의사소통을 사용자 지정하기 위한 추가 옵션을 봅니다. resolve_description_html: 신고된 계정에 대해 아무런 동작도 취하지 않으며, 처벌기록이 남지 않으며, 신고는 처리됨으로 변경됩니다. @@ -667,12 +746,14 @@ ko: cancel: 취소 category: 카테고리 category_description_html: 이 계정 또는 게시물이 신고된 이유는 신고된 계정과의 의사소통 과정에 인용됩니다 + collections: 컬렉션(%{count}개) comment: none: 없음 comment_description_html: '더 많은 정보를 위해, %{name} 님이 작성했습니다:' confirm: 확정 confirm_action: "@%{acct}에 취할 중재 결정에 대한 확인" created_at: 신고 시각 + delete_and_resolve: 컨텐츠 삭제 forwarded: 전달됨 forwarded_replies_explanation: 이 신고는 리모트 사용자가 리모트 컨텐츠에 대해 신고한 것입니다. 이것은 신고된 내용이 로컬 사용자에 대한 답글이기 때문에 첨부되었습니다. forwarded_to: "%{domain}에게 전달됨" @@ -695,11 +776,13 @@ ko: report: '신고 #%{id}' reported_account: 신고 대상 계정 reported_by: 신고자 + reported_content: 신고된 컨텐츠 reported_with_application: 신고에 사용된 앱 resolved: 해결 resolved_msg: 신고를 잘 해결했습니다! skip_to_actions: 작업으로 건너뛰기 status: 상태 + statuses: 게시물 (%{count}) statuses_description_html: 문제가 되는 콘텐츠는 신고된 계정에게 인용되어 전달됩니다 summary: action_preambles: @@ -733,6 +816,7 @@ ko: categories: administration: 관리 devops: 데브옵스 + email: 이메일 invites: 초대 moderation: 중재 special: 특수 @@ -748,6 +832,7 @@ ko: administrator_description: 이 권한을 가진 사용자는 모든 권한을 우회합니다 delete_user_data: 사용자 데이터 삭제 delete_user_data_description: 사용자가 다른 사용자의 데이터를 지체 없이 삭제할 수 있도록 허용 + invite_bypass_approval: 심사 없이 사용자 초대 invite_users: 사용자 초대 invite_users_description: 사용자가 다른 사람들을 서버에 초대할 수 있도록 허용 manage_announcements: 공지 관리 @@ -758,6 +843,8 @@ ko: manage_blocks_description: 사용자가 이메일 제공자와 IP 주소를 차단할 수 있도록 허용 manage_custom_emojis: 커스텀 에모지 관리 manage_custom_emojis_description: 사용자가 서버의 커스텀 에모지를 관리할 수 있도록 허용 + manage_email_subscriptions: 이메일 구독 관리 + manage_email_subscriptions_description: 이 권한을 가진 계정들이 본인들의 계정에 이메일 뉴스레터를 활성화할 수 있도록 허용합니다 manage_federation: 연합 관리 manage_federation_description: 사용자가 다른 도메인과의 연합을 차단하거나 허용할 수 있도록 하고, 전달 가능 여부를 조정할 수 있도록 허용 manage_invites: 초대 관리 @@ -786,6 +873,7 @@ ko: view_devops_description: Sidekiq과 pgHero 대시보드에 접근할 수 있도록 허용 view_feeds: 실시간 및 화제 피드 보기 view_feeds_description: 서버 설정에 관계 없이 실시간과 해시태그 피드에 접근할 수 있도록 허용 + requires_2fa: 2단계 인증 필요 title: 역할 rules: add_new: 규칙 추가 @@ -827,6 +915,7 @@ ko: title: 사용자들이 기본적으로 검색엔진에 인덱싱되지 않도록 합니다 discovery: follow_recommendations: 팔로우 추천 + preamble: 흥미로운 콘텐츠를 노출하는 것은 마스토돈을 알지 못할 수도 있는 신규 사용자를 유입시키는 데 중요합니다. 이 서버에서 작동하는 다양한 발견하기 기능을 제어합니다. privacy: 개인정보 profile_directory: 프로필 책자 public_timelines: 공개 타임라인 @@ -843,6 +932,17 @@ ko: authenticated: 로그인한 사용자들만 disabled: 특정한 사용자 역할 필요 public: 모두 + landing_page: + hints: + about_html: 이 서버의 설명, 연락처, 규칙과 기타 정보들을 보여주는 페이지. + local_feed_html: 이 서버 사용자의 최신 게시물을 보여주는 페이지. + overview_html: 이 서버 사용자의 최근 게시물과 함께 서버의 정보를 보여주는 페이지. + trends_html: 이 서버에서 지금 인기를 얻고 있는 것들을 보여주는 페이지. + values: + about: 정보 페이지 + local_feed: 로컬 실시간 피드 + overview: 개요 + trends: 유행중 registrations: moderation_recommandation: 모두에게 가입을 열기 전에 적절하고 반응이 빠른 중재 팀을 데리고 있는지 확인해 주세요! preamble: 누가 이 서버에 계정을 만들 수 있는지 제어합니다. @@ -862,6 +962,7 @@ ko: site_uploads: delete: 업로드한 파일 삭제 destroyed_msg: 사이트 업로드를 성공적으로 삭제했습니다! + skip_to_content: 내용으로 건너뛰기 software_updates: critical_update: 긴급 — 빠른 업데이트 요망 description: 최신 수정 사항과 기능을 활용하기 위해 Mastodon 설치를 최신 상태로 유지하기를 권장합니다. 더욱이, 때로는 보안 문제를 피하기 위해 Mastodon을 적절한 시점에 긴급 업데이트해야 하는 경우도 있습니다. 따라서 Mastodon은 30분마다 업데이트를 확인하며, 이메일 알림 환경설정에 따라 사용자에게 알려드립니다. @@ -1236,6 +1337,7 @@ ko: progress: confirm: 이메일 확인 details: 세부사항 + list: 가입 절차 review: 심사 결과 rules: 규정을 수락합니다. providers: @@ -1251,6 +1353,7 @@ ko: invited_by: '당신이 받은 초대장 덕분에 %{domain}에 가입할 수 있습니다:' preamble: 다음은 %{domain}의 중재자들에 의해 설정되고 적용되는 규칙들입니다. preamble_invited: 계속하기 전에, %{domain}의 중재자들이 정해놓은 규칙들을 검토해주세요. + read_more: 더 보기 title: 몇 개의 규칙이 있습니다. title_invited: 초대를 받았습니다. security: 보안 @@ -1370,6 +1473,31 @@ ko: your_appeal_rejected: 소명이 기각되었습니다 edit_profile: other: 기타 + redesign_body: 프로필 편집은 이제 프로필 페이지에서 바로 접근할 수 있습니다. + redesign_button: 이동 + redesign_title: 새로운 프로필 편집 경험이 기다립니다 + email_subscription_mailer: + confirmation: + action: 이메일 주소 확인 + subject: 이메일 주소 확인 + notification: + create_account: 마스토돈 계정 생성 + subject: + plural: "%{name}의 새 게시물" + singular: '새 게시물: "%{excerpt}"' + title: + plural: "%{name}의 새 게시물" + singular: '새 게시물: "%{excerpt}"' + email_subscriptions: + active: 활성 + confirmations: + show: + changed_your_mind: 마음이 바뀌었나요? + title: 가입되었습니다 + unsubscribe: 구독 해제 + inactive: 비활성 + status: 상태 + subscribers: 구독자 emoji_styles: auto: 자동 native: 시스템 기본 @@ -1403,7 +1531,9 @@ ko: blocks: 차단 bookmarks: 북마크 csv: CSV + custom_filters: 필터 domain_blocks: 도메인 차단 + json: JSON lists: 리스트 mutes: 뮤트 storage: 미디어 @@ -1627,6 +1757,26 @@ ko: copy_account_note_text: '이 사용자는 %{acct}로부터 이동하였습니다. 당신의 이전 노트는 이렇습니다:' navigation: toggle_menu: 토글 메뉴 + notification_fallbacks: + added_to_collection: + title_html: "%{name} 님이 나를 컬렉션에 추가했습니다" + admin_report: + title_html: "%{name} 님이 %{target}을 신고했습니다" + admin_sign_up: + title_and_others_html: + other: "%{name} 님 외 %{count} 명이 가입했습니다" + title_html: "%{name} 님이 가입했습니다" + collection_update: + title_html: "%{name} 님이 내가 있는 컬렉션을 수정했습니다" + generic: + sign_in: 마스토돈 웹 앱으로 로그인 + summary_html: 최신 마스토돈 버전을 지원하지 않는 앱을 사용 중입니다. 모든 기능을 이용하려면 %{link}. + moderation_warning: + summary_html: 최신 마스토돈 버전을 지원하지 않는 앱을 사용 중입니다. %{link}. + title: 중재 경고를 받았습니다. + severed_relationships: + summary_html: "%{from}의 관리자가 %{target}를 정지했기 때문에 더이상 새로운 정보를 받아보거나 상호작용할 수 없습니다. %{link}를 통해 잃어버린 관계 목록을 받아볼 수 있습니다." + title: "%{name} 님과의 연결이 끊어졌습니다" notification_mailer: admin: report: @@ -1651,16 +1801,22 @@ ko: body: "%{name} 님이 나를 멘션했습니다:" subject: "%{name} 님의 멘션" title: 새 답글 + moderation_warning: + subject: 중재 경고를 받았습니다 poll: subject: "%{name}의 설문이 종료됨" quote: body: '당신의 게시물을 %{name} 님이 인용했습니다:' subject: "%{name} 님이 내 게시물을 인용했습니다" title: 새 인용 + quoted_update: + subject: "%{name} 님이 내가 인용한 게시물을 수정했습니다" reblog: body: '당신의 게시물을 %{name} 님이 부스트 했습니다:' subject: "%{name} 님이 내 게시물을 부스트 했습니다" title: 새 부스트 + severed_relationships: + subject: 중재 결정으로 인해 연결이 끊어졌습니다 status: subject: "%{name} 님이 방금 게시물을 올렸습니다" update: @@ -1713,6 +1869,7 @@ ko: posting_defaults: 게시물 기본설정 public_timelines: 공개 타임라인 privacy: + email_subscriptions: 이메일로 게시물 보내기 hint_html: "내 프로필과 게시물이 어떻게 발견될지를 제어합니다. 활성화 하면 마스토돈의 다양한 기능들이 내가 더 많은 사람에게 도달할 수 있도록 도와줍니다. 이 설정이 내 용도에 맞는지 잠시 검토하세요." privacy: 개인정보 privacy_hint_html: 다른 이들을 위해 노출할 수 있는 정보의 양을 조절합니다. 누군가는 다른 이들의 팔로우를 둘러보고 어떤 앱에서 게시물을 올렸는지 살피면서 흥미로운 프로필과 멋진 앱을 발견할 수 있지만, 누군가는 이를 숨기고 싶을 수도 있겠죠. @@ -1898,9 +2055,11 @@ ko: enabled: 오래된 게시물 자동 삭제 enabled_hint: 아래의 예외 목록에 해당하지 않는다면, 명시된 기한 이후 당신의 게시물을 자동으로 삭제합니다 exceptions: 예외 + explanation: 자동 삭제는 낮은 우선순위로 동작합니다. 임계값에 다다르고 삭제되는 사이엔 지연이 존재할 수 있습니다. ignore_favs: 좋아요 무시 ignore_reblogs: 부스트 무시 interaction_exceptions: 상호작용에 기반한 예외들 + interaction_exceptions_explanation: 잠깐동안 즐겨찾기나 부스트 임계값을 넘긴 경우 나중에 값이 감소하더라도 게시물이 남아있을 수 있습니다. keep_direct: 다이렉트 메시지 유지 keep_direct_hint: 다이렉트 메시지를 삭제하지 않습니다 keep_media: 미디어가 있는 게시물 유지 @@ -1967,7 +2126,27 @@ ko: recovery_codes: 복구 코드 recovery_codes_regenerated: 복구 코드가 다시 생성되었습니다 recovery_instructions_html: 휴대전화를 분실한 경우, 아래 복구 코드 중 하나를 사용해 계정에 접근할 수 있습니다. 복구 코드는 안전하게 보관해 주십시오. 이 코드를 인쇄해 중요한 서류와 함께 보관하는 것도 좋습니다. + resume_app_authorization: 앱 인증으로 돌아가기 + role_requirement: "%{domain}은 마스토돈을 사용하기 전에 2단계 인증을 필수로 설정해야 합니다." webauthn: 보안 키 + unsubscriptions: + create: + action: 서버 홈페이지로 이동 + email_subscription: + confirmation_html: "%{name}로부터 더이상 메일을 받지 않게 됩니다." + title: 구독이 해지되었습니다 + notification_emails: + favourite: 좋아요 알림 이메일 + follow: 팔로우 알림 이메일 + follow_request: 팔로우 요청 이메일 + mention: 멘션 알림 이메일 + reblog: 부스트 알림 이메일 + show: + action: 구독 해지 + email_subscription: + title: "%{name} 구독을 해지할까요?" + user: + title: "%{type} 구독을 해지할까요?" user_mailer: announcement_published: description: "%{domain}의 관리자가 공지사항을 게시했습니다:" @@ -2116,4 +2295,5 @@ ko: otp_required: 보안 키를 사용하기 위해서는 2단계 인증을 먼저 활성화 해 주세요 registered_on: "%{date}에 등록됨" wrapstodon: + description: "%{name} 님이 마스토돈을 어떻게 사용했는지 확인해봅시다!" title: "%{name} 님의 %{year} 랩스토돈" diff --git a/config/locales/lv.yml b/config/locales/lv.yml index 2bce60de228..68515865c42 100644 --- a/config/locales/lv.yml +++ b/config/locales/lv.yml @@ -709,7 +709,7 @@ lv: actions: delete_html: Noņemt aizskarošos ierakstus mark_as_sensitive_html: Atzīmēt aizskarošo ierakstu informācijas nesējus kā jūtīgus - silence_html: Ievērojami ierobežo @%{acct} sasniedzamību, padarot viņa profilu un saturu redzamu tikai cilvēkiem, kas jau seko tam vai pašrocīgi uzmeklē profilu + silence_html: Ievērojami ierobežo @%{acct} sasniedzamību, padarot profilu un saturu redzamu tikai cilvēkiem, kas jau seko vai pašrocīgi uzmeklē profilu suspend_html: apturēs @%{acct} darbību, padarot profilu un saturu nepieejamu un neiespējamu mijiedarboties ar to; close_report: 'Atzīmēt ziņojumu #%{id} kā atrisinātu' close_reports_html: atzīmēs visus ziņojumus par @%{acct} kā atrisinātus; @@ -1114,8 +1114,8 @@ lv: rotate_secret: Pagriezt noslēpumu secret: Paraksta noslēpums status: Stāvoklis - title: Tīmekļa āķi - webhook: Tīmekļa āķis + title: Tīmekļa aizķeres + webhook: Tīmekļa aizķere admin_mailer: auto_close_registrations: body: Nesenu satura pārraudzības darbību trūkuma dēļ reģistrācija %{instance} ir automātiski pārslēgta nepieciešamība pēc pašrocīgas izskatīšanas, lai novērstu %{instance} izmantošana kā platformu iespējami sliktiem dalībniekiem. Jebkurā brīdī var ieslēgt atpakaļ atvērtu reģistrēšanos. @@ -2003,6 +2003,7 @@ lv: agreement: Ar %{domain} izmantošanas tuprināšanu tiek piekrists šiem noteikumiem. Ja ir iebildumi pret atjauninātajiem noteikumiem, savu piekrišanu var atcelt jebkurā laikā ar sava konta izdzēšanu. changelog: 'Šeit īsumā ir aprakstīts, ko šis atjauninājums nozīmē:' description: 'Šis e-pasta ziņojums tika saņemts, jo mēs veicam dažas izmaiņas savos pakalpojuma izmantošanas noteikumos %{domain}. Šie atjauninājumi stāsies spēkā %{date}. Mēs aicinām pārskatīt pilnus atjauninātos noteikumus šeit:' + description_html: Šis e-pasta ziņojums tika saņemts, jo mēs veicam dažas izmaiņas savos pakalpojuma izmantošanas noteikumos %{domain}. Šie atjauninājumi stāsies spēkā %{date}. Mēs aicinām pārskatīt pilnus atjauninātos noteikumus šeit. sign_off: "%{domain} komanda" subject: Mūsu pakalpojuma izmantošanas noteikumu atjauninājumi subtitle: Mainās %{domain} pakalpojuma izmantošanas noteikumi diff --git a/config/locales/nan-TW.yml b/config/locales/nan-TW.yml index 587cb4a49c1..f47c4622899 100644 --- a/config/locales/nan-TW.yml +++ b/config/locales/nan-TW.yml @@ -730,6 +730,7 @@ nan-TW: action_log: 審查日誌 action_taken_by: 操作由 actions: + delete_description_html: 受檢舉ê PO文(以及/á是)收藏ē thâi掉,而且ē用tsi̍t ue̍h橫tsuā記錄,幫tsān lí提升kâng tsi̍t ê用戶未來ê違規。 mark_as_sensitive_description_html: 受檢舉ê PO文內ê媒體ē標做敏感,而且ē用tsi̍t ue̍h橫tsuā記錄,幫tsān lí提升kâng tsi̍t ê用戶未來ê違規。 other_description_html: 看其他控制tsit ê口座ê所行,kap自訂聯絡受檢舉ê口座ê選項。 resolve_description_html: Buē用行動控制受檢舉ê口座,mā無用橫tsuā記錄,而且tsit ê報告ē關掉。 @@ -756,6 +757,7 @@ nan-TW: confirm: 確認 confirm_action: 確認kā %{acct} 管理ê動作 created_at: 檢舉tī + delete_and_resolve: Thâi掉內容 forwarded: 轉送ah forwarded_replies_explanation: 本報告是tuì別站ê用者送ê,關係別站ê內容。本報告轉hōo lí,因為受檢舉ê內容是回應lí ê服侍器ê用者。 forwarded_to: 有轉送kàu %{domain} @@ -935,6 +937,10 @@ nan-TW: authenticated: Kan-ta hōo登入ê用者 disabled: 愛特別ê用者角色 public: Ta̍k lâng + landing_page: + hints: + about_html: 關係tsit臺服侍器ê敘述、聯絡資訊、規則kap其他資訊ê頁。 + local_feed_html: 展示tsit臺服侍器用者ê上新PO文ê即時內容。 registrations: moderation_recommandation: 佇開放hōo ta̍k ê lâng註冊進前,請確認lí有夠額koh主動反應ê管理團隊! preamble: 控制ē當佇lí ê服侍器註冊ê人。 diff --git a/config/locales/nl.yml b/config/locales/nl.yml index 9a3c7a68dfb..6caa2d68a27 100644 --- a/config/locales/nl.yml +++ b/config/locales/nl.yml @@ -1499,6 +1499,7 @@ nl: your_appeal_rejected: Jouw bezwaar is afgewezen edit_profile: other: Overige + privacy_redesign_body: Je kunt nu direct op je profiel de keuze maken om jouw volgers en wie jij volgt wel of niet te tonen. redesign_body: Het bewerken van je profiel is nu toegankelijk vanaf de profielpagina. redesign_button: Ga erheen redesign_title: Er is een nieuwe manier om je profiel te bewerken diff --git a/config/locales/nn.yml b/config/locales/nn.yml index 7c0bc6104b2..cce7429ef82 100644 --- a/config/locales/nn.yml +++ b/config/locales/nn.yml @@ -865,6 +865,7 @@ nn: manage_custom_emojis: Handtere tilpassa emojiar manage_custom_emojis_description: Let brukarar handtere tilpassa emojiar på tenaren manage_email_subscriptions: Handter epostabonnement + manage_email_subscriptions_description: Lat folk med dette løyvet få bruke epostbrev-funksjonen på kontoen sin manage_federation: Handtere føderasjon manage_federation_description: Let brukarar blokkera eller tillata føderasjon med andre domener, samt styra kva som skal leverast manage_invites: Handsam innbydingar @@ -952,6 +953,9 @@ nn: authenticated: Berre godkjende brukarar disabled: Krev ei spesifikk brukarrolle public: Alle + landing_page: + hints: + about_html: Ei side med skildring, kontaktopplysingar, reglar og andre opplysingar om denne tenaren. registrations: moderation_recommandation: Pass på at du har mange og kjappe redaktørar og moderatorar på laget ditt før du opnar for allmenn registrering! preamble: Kontroller kven som kan oppretta konto på tenaren din. diff --git a/config/locales/pl.yml b/config/locales/pl.yml index 5c912489de6..3d83a2cb84b 100644 --- a/config/locales/pl.yml +++ b/config/locales/pl.yml @@ -1718,6 +1718,7 @@ pl: disabled_account: Twoje obecne konto nie będzie później całkowicie użyteczne. Możesz jednak uzyskać dostęp do eksportu danych i ponownie aktywować je. followers: To działanie przeniesie wszystkich Twoich obserwujących z obecnego konta na nowe only_redirect_html: Możesz też po prostu skonfigurować przekierowanie na swój profil. + other_data: Żadne inne dane nie zostaną automatycznie przeniesione (w tym Twoje posty i konta, które obserwujesz) redirect: Twoje obecne konto zostanie uaktualnione o informację o przeniesieniu i wyłączone z wyszukiwania moderation: title: Moderacja @@ -1875,7 +1876,7 @@ pl: edge: Microsoft Edge electron: Electron firefox: Firefox - generic: nieznana przeglądarka + generic: Nieznana przeglądarka huawei_browser: Przeglądarka Huawei ie: Internet Explorer micro_messenger: MicroMessenger diff --git a/config/locales/pt-BR.yml b/config/locales/pt-BR.yml index 4fdf40888e8..ad71ba1dde3 100644 --- a/config/locales/pt-BR.yml +++ b/config/locales/pt-BR.yml @@ -31,7 +31,7 @@ pt-BR: action: Efetuar uma ação already_silenced: Esta conta já foi limitada. already_suspended: Esta conta já foi suspensa. - title: Moderar %{acct} + title: Executar ação de moderação em %{acct} account_moderation_notes: create: Deixar nota created_msg: Nota de moderação criada! @@ -53,30 +53,30 @@ pt-BR: change_role: changed_msg: Cargo alterado com sucesso! edit_roles: Gerenciar cargos do usuário - label: Alterar função + label: Alterar cargo no_role: Nenhum cargo title: Alterar cargo de %{username} collections: Coleções confirm: Confirmar confirmed: Confirmado confirming: Confirmando - custom: Personalizar + custom: Personalizado delete: Excluir dados deleted: Excluído demote: Rebaixar destroyed_msg: Os dados de %{username} estão na fila para serem excluídos em breve disable: Congelar - disable_sign_in_token_auth: Desativar autenticação via token por email + disable_sign_in_token_auth: Desativar token de autenticação por e-mail disable_two_factor_authentication: Desativar autenticação de dois fatores - disabled: Congelada + disabled: Desativada display_name: Nome de exibição domain: Domínio edit: Editar email: E-mail email_status: Estado do e-mail enable: Descongelar - enable_sign_in_token_auth: Ativar autenticação via token por email - enabled: Ativada + enable_sign_in_token_auth: Ativar token de autenticação por e-mail + enabled: Ativado enabled_msg: A conta de %{username} foi descongelada followers: Seguidores follows: Seguindo @@ -93,9 +93,9 @@ pt-BR: title: Localização login_status: Situação da conta media_attachments: Anexos de mídia - memorialize: Converter em memorial - memorialized: Convertidas em memorial - memorialized_msg: A conta de %{username} foi transformada em uma conta memorial + memorialize: Converter em memoriam + memorialized: Convertidas em memoriam + memorialized_msg: "%{username} transformada com sucesso em uma conta memorial" moderation: active: Ativa all: Todas @@ -129,8 +129,8 @@ pt-BR: remote_suspension_reversible_hint_html: A conta foi suspensa em seu servidor, e todos os dados serão removidos em %{date}. Até lá, o servidor remoto pode restaurar essa conta sem nenhum efeito negativo. Se você quer remover todos os dados desta conta imediatamente, você pode fazer isso abaixo. remove_avatar: Remover imagem de perfil remove_header: Remover capa - removed_avatar_msg: A imagem de perfil de %{username} foi removida - removed_header_msg: A capa de %{username} foi removida + removed_avatar_msg: Imagem de perfil de %{username} removida com sucesso + removed_header_msg: Imagem de capa de %{username} removida com sucesso resend_confirmation: already_confirmed: Este usuário já está confirmado send: Reenviar link de confirmação @@ -146,8 +146,8 @@ pt-BR: security_measures: only_password: Apenas senha password_and_2fa: Senha e autenticação de dois fatores - sensitive: Sensíveis - sensitized: Marcadas como sensíveis + sensitive: Marcar como sensível + sensitized: Marcada como sensível shared_inbox_url: Link da caixa de entrada compartilhada show: created_reports: Denúncias criadas @@ -165,11 +165,11 @@ pt-BR: unblock_email: Desbloquear endereço de e-mail unblocked_email_msg: O endereço de e-mail de %{username} foi desbloqueado unconfirmed_email: E-mail não confirmado - undo_sensitized: Desfazer sensível - undo_silenced: Desfazer silêncio + undo_sensitized: Desmarcar como sensível + undo_silenced: Dessilenciar undo_suspension: Desfazer suspensão - unsilenced_msg: As limitações da conta de %{username} foram removidas - unsubscribe: Cancelar inscrição + unsilenced_msg: "%{username} dessilenciado com sucesso" + unsubscribe: Desinscrever unsuspended_msg: A suspensão da conta de %{username} foi removida username: Nome de usuário view_domain: Ver resumo para o domínio @@ -186,22 +186,22 @@ pt-BR: confirm_user: Confirmar usuário create_account_warning: Criar aviso create_announcement: Criar anúncio - create_canonical_email_block: Criar bloqueio de Email + create_canonical_email_block: Criar bloqueio de e-mail create_custom_emoji: Criar emoji personalizado - create_domain_allow: Permitir domínio - create_domain_block: Bloquear domínio - create_email_domain_block: Criar Bloqueio de Domínio de Email + create_domain_allow: Criar permissão de domínio + create_domain_block: Criar bloqueio de domínio + create_email_domain_block: Criar bloqueio de domínio de e-mail create_ip_block: Criar regra de IP - create_relay: Criar Retransmissão + create_relay: Criar retransmissor create_unavailable_domain: Criar domínio indisponível - create_user_role: Criar função + create_user_role: Criar cargo create_username_block: Criar regra de usuário demote_user: Rebaixar usuário destroy_announcement: Excluir anúncio - destroy_canonical_email_block: Deletar bloqueio de Email + destroy_canonical_email_block: Excluir bloqueio de e-mail destroy_custom_emoji: Excluir emoji personalizado - destroy_domain_allow: Excluir domínio permitido - destroy_domain_block: Desbloquear domínio + destroy_domain_allow: Excluir permissão de domínio + destroy_domain_block: Excluir bloqueio de domínio destroy_email_domain_block: Deletar bloqueio de domínio Email destroy_instance: Limpar domínio destroy_ip_block: Excluir regra de IP @@ -391,7 +391,7 @@ pt-BR: title: Emojis personalizados uncategorized: Não categorizado unlist: Não listar - unlisted: Não-listado + unlisted: Não listado update_failed_msg: Não foi possível atualizar esse emoji updated_msg: Emoji atualizado! upload: Enviar @@ -1499,6 +1499,7 @@ pt-BR: your_appeal_rejected: Sua revisão foi rejeitada edit_profile: other: Outro + privacy_redesign_body: A escolha de exibir seu seguindo e seguidores agora é feita diretamente de seu perfil. redesign_body: A edição de perfil pode ser acessada diretamente a partir da página de perfil. redesign_button: Ir para lá redesign_title: Há uma nova experiência de edição de perfil diff --git a/config/locales/simple_form.ar.yml b/config/locales/simple_form.ar.yml index e28e4c38a15..fd5c90cafb1 100644 --- a/config/locales/simple_form.ar.yml +++ b/config/locales/simple_form.ar.yml @@ -56,7 +56,6 @@ ar: setting_aggregate_reblogs: لا تقم بعرض المشارَكات الجديدة لمنشورات قد قُمتَ بمشاركتها سابقا (هذا الإجراء يعني المشاركات الجديدة فقط التي تلقيتَها) setting_always_send_emails: عادة لن تُرسَل إليك إشعارات البريد الإلكتروني عندما تكون نشطًا على ماستدون setting_default_sensitive: تُخفى الوسائط الحساسة تلقائيا ويمكن اظهارها عن طريق النقر عليها - setting_system_scrollbars_ui: ينطبق فقط على متصفحات سطح المكتب البنية على محرك كروم وسفاري setting_use_blurhash: الألوان التدرّجية مبنية على ألوان المرئيات المخفية ولكنها تحجب كافة التفاصيل setting_use_pending_items: إخفاء تحديثات الخط وراء نقرة بدلًا مِن التمرير التلقائي للموجزات username: يمكنك استخدام الأحرف والأرقام والسطور السفلية diff --git a/config/locales/simple_form.az.yml b/config/locales/simple_form.az.yml index 44044e9dbb6..c9edd4be9b6 100644 --- a/config/locales/simple_form.az.yml +++ b/config/locales/simple_form.az.yml @@ -10,7 +10,6 @@ az: setting_aggregate_reblogs: Təzəlikcə təkrar paylaşılmış göndərişlər üçün yeni təkrar paylaşımlar göstərilməsin (yalnız yeni alınan təkrar paylaşımlara təsir edir). setting_always_send_emails: Normalda, Mastodon-u aktiv olaraq istifadə etdiyiniz zaman e-poçt bildirişləri göndərilməyəcək setting_default_sensitive: Həssas media, ilkin olaraq gizlədilir və bir kliklə göstərilə bilər - setting_system_scrollbars_ui: Yalnız Safari və Chrome əaslı masaüstü brauzerlərinə tətbiq olunur setting_use_blurhash: Meyillər, gizli vizualların rənglərinə əsaslanır, ancaq detalları gizlədir setting_use_pending_items: Lenti avtomatik diyirləmək əvəzinə, zaman xətti güncəlləmələrini tək bir kliklə gizlət domain_allow: diff --git a/config/locales/simple_form.be.yml b/config/locales/simple_form.be.yml index 31d00427a27..eeb5619af4e 100644 --- a/config/locales/simple_form.be.yml +++ b/config/locales/simple_form.be.yml @@ -66,7 +66,6 @@ be: setting_display_media_show_all: Паказваць усе медыя без папярэджання, у тым ліку пазначаныя як адчувальныя setting_emoji_style: Як паказваць эмодзі. "Аўтаматычны" будзе намагацца выкарыстоўваць мясцовыя эмодзі, але для састарэлых браўзераў — Twemoji. setting_quick_boosting_html: Калі ўключана, націсканне на %{boost_icon} значок пашырэння адразу пашырыць допіс замест адкрыцця меню пашырэння/цытавання. Перасоўвае дзеянне цытавання ў меню %{options_icon} (выбару). - setting_system_scrollbars_ui: Працуе толькі ў камп'ютарных браўзерах на аснове Safari і Chrome setting_use_blurhash: Градыенты заснаваны на колерах схаваных выяў, але размываюць дэталі setting_use_pending_items: Схаваць абнаўленні стужкі за клікам замест аўтаматычнага пракручвання стужкі username: Вы можаце выкарыстоўваць літары, лічбы і падкрэсліванне diff --git a/config/locales/simple_form.bg.yml b/config/locales/simple_form.bg.yml index e9f1344789e..71f2be0ef7f 100644 --- a/config/locales/simple_form.bg.yml +++ b/config/locales/simple_form.bg.yml @@ -57,7 +57,6 @@ bg: setting_always_send_emails: Обикновено известията по имейл няма да са изпратени при дейна употреба на Mastodon setting_default_sensitive: Деликатната мултимедия е скрита по подразбиране и може да се разкрие с едно щракване setting_emoji_style: Как се показват емоджита. "Автоматично" ще опита да използва естествените за системата емоджита, но се връща към Twemoji за остарели браузъри. - setting_system_scrollbars_ui: Прилага се само към настолни браузъри, основаващи се на Safari и Chrome setting_use_blurhash: Преливането е въз основа на цветовете на скритите визуализации, но се замъгляват подробностите setting_use_pending_items: Да се показват обновявания на часовата ос само след щракване вместо автоматично превъртане на инфоканала username: Може да ползвате букви, цифри и долни черти diff --git a/config/locales/simple_form.ca.yml b/config/locales/simple_form.ca.yml index 57cd5387e95..cde6a8c56d1 100644 --- a/config/locales/simple_form.ca.yml +++ b/config/locales/simple_form.ca.yml @@ -59,7 +59,6 @@ ca: setting_default_quote_policy_unlisted: Quan la gent et citi la seva publicació estarà amagada de les línies de temps de tendències. setting_default_sensitive: El contingut sensible està ocult per defecte i es pot mostrar fent-hi clic setting_emoji_style: Com mostrar els emojis. "Automàtic" provarà de fer servir els emojis nadius, però revertirà a twemojis en els navegadors antics. - setting_system_scrollbars_ui: S'aplica només als navegadors d'escriptori basats en Safari i Chrome setting_use_blurhash: Els degradats es basen en els colors de les imatges ocultes, però n'enfosqueixen els detalls setting_use_pending_items: Amaga les actualitzacions de la línia de temps després de fer un clic, en lloc de desplaçar-les automàticament username: Pots emprar lletres, números i subratllats diff --git a/config/locales/simple_form.cs.yml b/config/locales/simple_form.cs.yml index 0741ab2a017..b5d51d7ce86 100644 --- a/config/locales/simple_form.cs.yml +++ b/config/locales/simple_form.cs.yml @@ -62,7 +62,6 @@ cs: setting_default_sensitive: Citlivá média jsou ve výchozím stavu skryta a mohou být zobrazena kliknutím setting_emoji_style: Jak se budou zobrazovat emoji. "Auto" zkusí použít výchozí emoji, ale pro starší prohlížeče použije Twemoji. setting_quick_boosting_html: Pokud je povoleno, kliknutím na %{boost_icon} Boost ikonu okamžitě boostnete místo otevření rozbalovací nabídky boost/citace. Přemístí citaci do nabídky %{options_icon} (Možnosti). - setting_system_scrollbars_ui: Platí pouze pro desktopové prohlížeče založené na Safari nebo Chrome setting_use_blurhash: Gradienty jsou vytvořeny na základě barvev skrytých médií, ale zakrývají veškeré detaily setting_use_pending_items: Aktualizovat časovou osu až po kliknutí namísto automatického rolování kanálu username: Pouze písmena, číslice a podtržítka diff --git a/config/locales/simple_form.cy.yml b/config/locales/simple_form.cy.yml index b1cbd97ef86..7def2ed55ef 100644 --- a/config/locales/simple_form.cy.yml +++ b/config/locales/simple_form.cy.yml @@ -66,7 +66,6 @@ cy: setting_display_media_show_all: Dangos yr holl gyfryngau heb rybudd, gan gynnwys cyfryngau sydd wedi'u marcio fel rhai sensitif setting_emoji_style: Sut i arddangos emojis. Bydd "Awto" yn ceisio defnyddio emoji cynhenid, ond mae'n disgyn yn ôl i Twemoji ar gyfer porwyr traddodiadol. setting_quick_boosting_html: Pan fydd wedi'i alluogi, bydd clicio ar yr eicon Hwb %{boost_icon} yn rhoi hwb ar unwaith yn lle agor y gwymplen hwb/dyfynnu. Mae'n symud y weithred dyfynnu i'r ddewislen %{options_icon} (Dewisiadau). - setting_system_scrollbars_ui: Yn berthnasol i borwyr bwrdd gwaith yn seiliedig ar Safari a Chrome yn unig setting_use_blurhash: Mae graddiannau wedi'u seilio ar liwiau'r delweddau cudd ond maen nhw'n cuddio unrhyw fanylion setting_use_pending_items: Cuddio diweddariadau llinell amser y tu ôl i glic yn lle sgrolio'n awtomatig username: Gallwch ddefnyddio nodau, rhifau a thanlinellau diff --git a/config/locales/simple_form.da.yml b/config/locales/simple_form.da.yml index 6f6c3352fa8..e48d12c05d2 100644 --- a/config/locales/simple_form.da.yml +++ b/config/locales/simple_form.da.yml @@ -66,7 +66,6 @@ da: setting_display_media_show_all: Vis alle medier uden advarsel, inklusive medier markeret som følsomme setting_emoji_style: Hvordan emojis skal vises. "Auto" vil forsøge at bruge indbyggede emojis, men skifter tilbage til Twemoji i ældre webbrowsere. setting_quick_boosting_html: Når aktiveret, vil klik på %{boost_icon} fremhæv-ikonet straks fremhæve i stedet for at åbne fremhæv/citér-foldudmenuen. Flytter citeringshandlingen til %{options_icon} menuen (Indstillinger). - setting_system_scrollbars_ui: Gælder kun for desktop-browsere baseret på Safari og Chrome setting_use_blurhash: Gradienter er baseret på de skjulte grafikelementers farver, men slører alle detaljer setting_use_pending_items: Skjul tidslinjeopdateringer bag et klik i stedet for brug af auto-feedrulning username: Bogstaver, cifre og understregningstegn kan benyttes diff --git a/config/locales/simple_form.de.yml b/config/locales/simple_form.de.yml index fb562719f18..fc1609442c2 100644 --- a/config/locales/simple_form.de.yml +++ b/config/locales/simple_form.de.yml @@ -66,7 +66,6 @@ de: setting_display_media_show_all: Alle Medien anzeigen – auch Medien, die eine Inhaltswarnung enthalten setting_emoji_style: 'Wie Emojis dargestellt werden: „Automatisch“ verwendet native Emojis, für veraltete Browser wird jedoch Twemoji verwendet.' setting_quick_boosting_html: Dadurch wird der Beitrag beim Anklicken des %{boost_icon} Teilen-Symbols sofort geteilt, anstatt das Drop-down-Menü zu öffnen. Die Möglichkeit zum Zitieren wird dabei in %{options_icon} Mehr verschoben. - setting_system_scrollbars_ui: Betrifft nur Desktop-Browser, die auf Chrome oder Safari basieren setting_use_blurhash: Der Farbverlauf basiert auf den Farben der ausgeblendeten Medien, verschleiert aber jegliche Details setting_use_pending_items: Neue Beiträge hinter einem Klick verstecken, anstatt automatisch zu scrollen username: Du kannst Buchstaben, Zahlen und Unterstriche verwenden diff --git a/config/locales/simple_form.el.yml b/config/locales/simple_form.el.yml index 346b9e320f8..91803cff7b8 100644 --- a/config/locales/simple_form.el.yml +++ b/config/locales/simple_form.el.yml @@ -66,7 +66,6 @@ el: setting_display_media_show_all: Εμφάνιση όλων των πολυμέσων χωρίς προειδοποίηση, συμπεριλαμβανομένων των πολυμέσων που σημαίνονται ως ευαίσθητα setting_emoji_style: Πώς να εμφανίσετε emojis. Το "Αυτόματο" θα προσπαθήσει να χρησιμοποιήσει εγγενή emoji, αλλά πέφτει πίσω στο Twemoji για προγράμματα περιήγησης παλαιού τύπου. setting_quick_boosting_html: Όταν ενεργοποιηθεί, κάνοντας κλικ στο εικονίδιο %{boost_icon} Ενίσχυση θα ενισχύσει αμέσως αντί να ανοίξει το αναπτυσσόμενο μενού ενίσχυσης/παράθεσης. Μετακινεί την ενέργεια παράθεσης στο μενού %{options_icon} (Επιλογές). - setting_system_scrollbars_ui: Ισχύει μόνο για προγράμματα περιήγησης για υπολογιστή με βάση το Safari και το Chrome setting_use_blurhash: Οι διαβαθμίσεις βασίζονται στα χρώματα του κρυμμένου πολυμέσου αλλά θολώνουν τις λεπτομέρειες setting_use_pending_items: Εμφάνιση ενημερώσεων ροής μετά από κλικ αντί για αυτόματη κύλιση της ροής username: Μπορείς να χρησιμοποιήσεις γράμματα, αριθμούς και κάτω παύλες diff --git a/config/locales/simple_form.en-GB.yml b/config/locales/simple_form.en-GB.yml index 3e819c02f0f..bf65caab4fd 100644 --- a/config/locales/simple_form.en-GB.yml +++ b/config/locales/simple_form.en-GB.yml @@ -66,7 +66,6 @@ en-GB: setting_display_media_show_all: Show all media without warning, including media marked as sensitive setting_emoji_style: How to display emojis. "Auto" will try using native emoji, but falls back to Twemoji for legacy browsers. setting_quick_boosting_html: When enabled, clicking on the %{boost_icon} Boost icon will immediately boost instead of opening the boost/quote dropdown menu. Relocates the quoting action to the %{options_icon} (Options) menu. - setting_system_scrollbars_ui: Applies only to desktop browsers based on Safari and Chrome setting_use_blurhash: Gradients are based on the colours of the hidden visuals but obfuscate any details setting_use_pending_items: Hide timeline updates behind a click instead of automatically scrolling the feed username: You can use letters, numbers, and underscores diff --git a/config/locales/simple_form.eo.yml b/config/locales/simple_form.eo.yml index d7acbff0b57..e2864be64f6 100644 --- a/config/locales/simple_form.eo.yml +++ b/config/locales/simple_form.eo.yml @@ -59,7 +59,6 @@ eo: setting_default_quote_policy_unlisted: Kiam homoj citas vin, ilia afiŝo ankaŭ estos kaŝita de tendencaj templinioj. setting_default_sensitive: La tiklaj vidaŭdaĵoj estas implicite kaŝitaj kaj povas esti malkaŝitaj per alklako setting_emoji_style: Kiel montri emoĝiojn. "Aŭtomata" provos uzi denaskajn emoĝiojn, sed uzas Twemoji por malnovaj retumiloj. - setting_system_scrollbars_ui: Aplikas nur por surtablaj retumiloj baziĝas de Safari kaj Chrome setting_use_blurhash: Transirojn estas bazita sur la koloroj de la kaŝitaj aŭdovidaĵoj sed ne montri iun ajn detalon setting_use_pending_items: Kaŝi tempoliniajn ĝisdatigojn malantaŭ klako anstataŭ aŭtomate rulumi la fluon username: Vi povas uzi literojn, ciferojn kaj substrekojn diff --git a/config/locales/simple_form.es-AR.yml b/config/locales/simple_form.es-AR.yml index 178a0b5700f..932f70c2365 100644 --- a/config/locales/simple_form.es-AR.yml +++ b/config/locales/simple_form.es-AR.yml @@ -66,7 +66,6 @@ es-AR: setting_display_media_show_all: Mostrar todos los medios sin advertir, incluyendo los medios marcados como sensibles setting_emoji_style: Cómo se mostrarán los emojis. "Automático" intentará usar emojis nativos, cambiando a Twemoji en navegadores antiguos. setting_quick_boosting_html: Al estar habilitado, haciendo clic en el ícono de adhesión %{boost_icon} vas a adherir al mensaje inmediatamente, en lugar de abrir el menú desplegable de adhesión/citas. Esto cambia la acción de citas al menú de opciones %{options_icon}. - setting_system_scrollbars_ui: Solo aplica para navegadores web de escritorio basados en Safari y Chrome setting_use_blurhash: Los gradientes se basan en los colores de las imágenes ocultas pero haciendo borrosos los detalles setting_use_pending_items: Ocultar actualizaciones de la línea temporal detrás de un clic en lugar de desplazar automáticamente el flujo username: Podés usar letras, números y subguiones ("_") diff --git a/config/locales/simple_form.es-MX.yml b/config/locales/simple_form.es-MX.yml index 631dbb4f011..489c7f19cbd 100644 --- a/config/locales/simple_form.es-MX.yml +++ b/config/locales/simple_form.es-MX.yml @@ -66,7 +66,6 @@ es-MX: setting_display_media_show_all: Mostrar todos los archivos multimedia sin advertir, incluidos los marcados como sensibles setting_emoji_style: Cómo se muestran los emojis. «Automático» intentará usar emojis nativos, pero vuelve a Twemoji para los navegadores antiguos. setting_quick_boosting_html: Cuando está activado, pulsar en el icono %{boost_icon} Impulsar impulsará inmediatamente en lugar de abrir el menú desplegable Impulsar/Citas. Mueve la acción de citar al menú %{options_icon} (Opciones). - setting_system_scrollbars_ui: Solo se aplica a los navegadores de escritorio basados en Safari y Chrome setting_use_blurhash: Los degradados se basan en los colores de los elementos visuales ocultos, pero ocultan cualquier detalle setting_use_pending_items: Ocultar las actualizaciones de la línea de tiempo con un clic, en lugar de que la cronología se desplace automáticamente username: Puedes usar letras, números y guiones bajos diff --git a/config/locales/simple_form.es.yml b/config/locales/simple_form.es.yml index e173cb48f3d..fcc0c384012 100644 --- a/config/locales/simple_form.es.yml +++ b/config/locales/simple_form.es.yml @@ -66,7 +66,6 @@ es: setting_display_media_show_all: Mostrar toda la multimedia sin avisos, incluyendo la marcada como sensible setting_emoji_style: Cómo se mostrarán los emojis. "Auto" intentará usar emojis nativos, cambiando a Twemoji en navegadores antiguos. setting_quick_boosting_html: Cuando está activado, pulsar en el icono %{boost_icon} Impulsar impulsará inmediatamente en lugar de abrir el menú desplegable Impulsar/Citas. Mueve la acción de citar al menú %{options_icon} (Opciones). - setting_system_scrollbars_ui: Solo aplica para navegadores de escritorio basados en Safari y Chrome setting_use_blurhash: Los gradientes se basan en los colores de las imágenes ocultas pero haciendo borrosos los detalles setting_use_pending_items: Ocultar nuevas publicaciones detrás de un clic en lugar de desplazar automáticamente el feed username: Puedes usar letras, números y guiones bajos diff --git a/config/locales/simple_form.et.yml b/config/locales/simple_form.et.yml index 9866920cc1f..329679adad5 100644 --- a/config/locales/simple_form.et.yml +++ b/config/locales/simple_form.et.yml @@ -66,7 +66,6 @@ et: setting_display_media_show_all: Näita alati meediat ilma hoiatuseta, ka tundlikuks märgitud meediat setting_emoji_style: See määrab emojide kuvamise viisi. Automaatse valiku puhul üritatakse kasutada platvormi või klientrakenduse oma emojisid, kuid varuvariandina jääb toimima Twemoji (näiteks vanade veebibrauserite puhul). setting_quick_boosting_html: Selle eelistuse kasutamisel, Hooandmise ikooni %{boost_icon} teeb toimingu kohe ilma avamata Hooandmise/Tsiteerimise menüüvalikut. Sel puhul tsiteerimise link leidub %{options_icon} (Valikud) menüüs. - setting_system_scrollbars_ui: Kehtib vaid Safaril ja Chrome'il põhinevatel tavaarvuti veebibrauserite puhul setting_use_blurhash: Värvid põhinevad peidetud visuaalidel, kuid hägustavad igasuguseid detaile setting_use_pending_items: Voo automaatse kerimise asemel peida ajajoone uuendused kliki taha username: Võid kasutada ladina tähti, numbreid ja allkriipsu diff --git a/config/locales/simple_form.eu.yml b/config/locales/simple_form.eu.yml index 0fa8290d6d4..bf8e378c897 100644 --- a/config/locales/simple_form.eu.yml +++ b/config/locales/simple_form.eu.yml @@ -61,7 +61,6 @@ eu: setting_default_quote_policy_unlisted: Jendeak aipatzen zaituenean, bere bidalketa ere joeren denbora-lerro publikoetatik ezkutatuko da. setting_default_sensitive: Multimedia hunkigarria lehenetsita ezkutatzen da, eta sakatuz ikusi daiteke setting_emoji_style: Nola bistaratu emojiak. "Automatikoki" aukeran emoji natiboak erabiltzen saiatuko dira, baina Twemojira itzuliko dira arakatzaile zaharretarako. - setting_system_scrollbars_ui: Safari eta Chrome-n oinarritutako mahaigaineko nabigatzaileei bakarrik aplikatzen zaie setting_use_blurhash: Gradienteak ezkutatutakoaren koloreetan oinarritzen dira, baina xehetasunak ezkutatzen dituzte setting_use_pending_items: Ezkutatu denbora-lerroko eguneraketak klik baten atzean jarioa automatikoki korritu ordez username: Hizkiak, zenbakiak eta azpimarrak erabil ditzakezu diff --git a/config/locales/simple_form.fa.yml b/config/locales/simple_form.fa.yml index 09bb0ead79c..2a7c2b8e508 100644 --- a/config/locales/simple_form.fa.yml +++ b/config/locales/simple_form.fa.yml @@ -66,7 +66,6 @@ fa: setting_display_media_show_all: نمایش همهٔ رسانه‌ها بدون هشدار از جمله رسانه‌های علامت خورده به عنوان حسّاس setting_emoji_style: چگونگی نمایش شکلک‌ها. «خودکار» تلاش خواهد کرد از شکلک‌های بومی استفاده کند؛ ولی برای مرورگرهای قدیمی به توییموجی برخواهد گشت. setting_quick_boosting_html: هنگام به کار افتادن، زدن روی %{boost_icon} نقشک تقویت به جای گشودنِ فهرست پایین افتادنی تقویت و نقل، بلافاصله تقویت خواهد کرد. کنشِ نقل قول را به فهرست %{options_icon} (گزینه‌ها) منتقل می‌کند. - setting_system_scrollbars_ui: فقط برای مرورگرهای دسکتاپ مبتنی بر سافاری و کروم اعمال می شود setting_use_blurhash: سایه‌ها بر اساس رنگ‌های به‌کاررفته در تصویر پنهان‌شده ساخته می‌شوند ولی جزئیات تصویر در آن‌ها آشکار نیست setting_use_pending_items: به جای پیش‌رفتن خودکار در فهرست، به‌روزرسانی فهرست نوشته‌ها را پشت یک کلیک پنهان کن username: تنها می‌توانید از حروف، اعداد، و زیرخط استفاده کنید diff --git a/config/locales/simple_form.fi.yml b/config/locales/simple_form.fi.yml index e870e27e586..7d7ce8578c3 100644 --- a/config/locales/simple_form.fi.yml +++ b/config/locales/simple_form.fi.yml @@ -66,7 +66,6 @@ fi: setting_display_media_show_all: Näytä kaikki mediasisältö varoittamatta, mukaan lukien arkaluonteiseksi merkitty sisältö setting_emoji_style: Miten emojit näkyvät. ”Automaattinen” pyrkii käyttämään natiiveja emojeita, mutta Twemoji-emojeita käytetään varavaihtoehtoina vanhoissa selaimissa. setting_quick_boosting_html: Kun käytössä, %{boost_icon} Tehosta-kuvakkeen painaminen tehostaa välittömästi sen sijaan, että Tehosta/Lainaa-pudotusvalikko avautuisi. Siirtää lainaustoiminnon %{options_icon} (Valinnat) -⁠valikkoon. - setting_system_scrollbars_ui: Koskee vain Safari- ja Chrome-pohjaisia työpöytäselaimia setting_use_blurhash: Liukuvärit perustuvat piilotettujen kuvien väreihin mutta sumentavat yksityiskohdat setting_use_pending_items: Piilota aikajanan päivitykset napsautuksen taakse syötteen automaattisen vierityksen sijaan username: Voit käyttää kirjaimia, numeroita ja alaviivoja diff --git a/config/locales/simple_form.fo.yml b/config/locales/simple_form.fo.yml index 0361c075c98..01eac89c4d1 100644 --- a/config/locales/simple_form.fo.yml +++ b/config/locales/simple_form.fo.yml @@ -62,7 +62,6 @@ fo: setting_default_sensitive: Viðkvæmar miðlafílur eru fjaldar og kunnu avdúkast við einum klikki setting_emoji_style: Hvussu kenslutekn vera víst. "Sjálvvirkandi" roynir at brúka upprunalig kenslutekn, men fellir aftur á Twitter kenslutekn í eldri kagum. setting_quick_boosting_html: Tá hetta er virkið, hendir stimbranin beinanvegin tá trýst verður á %{boost_icon} Stimbranar-ímyndin, í staðin fyri at stimbranar/siterings-valmyndin verður latin um. Flytir siteringsmøguleikan til %{options_icon} (Valmøguleikar) valmyndina. - setting_system_scrollbars_ui: Er einans viðkomandi fyri skriviborðskagar grundaðir á Safari og Chrome setting_use_blurhash: Gradientar eru grundaðir á litirnar av fjaldu myndunum, men grugga allar smálutir setting_use_pending_items: Fjal tíðarlinjudagføringar aftan fyri eitt klikk heldur enn at skrulla tilføringina sjálvvirkandi username: Tú kanst brúka bókstavir, tøl og botnstrikur diff --git a/config/locales/simple_form.fr-CA.yml b/config/locales/simple_form.fr-CA.yml index 7bb41766079..ff01570280b 100644 --- a/config/locales/simple_form.fr-CA.yml +++ b/config/locales/simple_form.fr-CA.yml @@ -66,7 +66,6 @@ fr-CA: setting_display_media_show_all: Afficher tous les médias sans avertissement, y compris ceux marqués comme sensibles setting_emoji_style: Manière d'afficher les émojis. Utiliser « Auto » pour essayer d'utiliser les émojis natifs, mais Twemoji sera utilisé pour les anciens navigateurs. setting_quick_boosting_html: Lorsque cette option est activée, cliquer sur l'icône de partage %{boost_icon} va immédiatement partager le message au lieu d'ouvrir le menu déroulant Partage/Citation. L'action de citation est déplacée dans le menu %{options_icon} (options). - setting_system_scrollbars_ui: S'applique uniquement aux navigateurs basés sur Safari et Chrome setting_use_blurhash: Les dégradés sont basés sur les couleurs des images cachées mais n’en montrent pas les détails setting_use_pending_items: Cacher les mises à jour des fils d’actualités derrière un clic, au lieu de les afficher automatiquement username: Vous pouvez utiliser des lettres, des chiffres, et des tirets bas diff --git a/config/locales/simple_form.fr.yml b/config/locales/simple_form.fr.yml index d682488b9e1..85ab495ea0d 100644 --- a/config/locales/simple_form.fr.yml +++ b/config/locales/simple_form.fr.yml @@ -66,7 +66,6 @@ fr: setting_display_media_show_all: Afficher tous les médias sans avertissement, y compris ceux marqués comme sensibles setting_emoji_style: Manière d'afficher les émojis. Utiliser « Auto » pour essayer d'utiliser les émojis natifs, mais Twemoji sera utilisé pour les anciens navigateurs. setting_quick_boosting_html: Lorsque cette option est activée, cliquer sur l'icône de partage %{boost_icon} va immédiatement partager le message au lieu d'ouvrir le menu déroulant Partage/Citation. L'action de citation est déplacée dans le menu %{options_icon} (options). - setting_system_scrollbars_ui: S'applique uniquement aux navigateurs basés sur Safari et Chrome setting_use_blurhash: Les dégradés sont basés sur les couleurs des images cachées mais n’en montrent pas les détails setting_use_pending_items: Cacher les mises à jour des fils d’actualités derrière un clic, au lieu de les afficher automatiquement username: Vous pouvez utiliser des lettres, des chiffres, et des tirets bas diff --git a/config/locales/simple_form.fy.yml b/config/locales/simple_form.fy.yml index f2588ff3e18..bd0f663a9f0 100644 --- a/config/locales/simple_form.fy.yml +++ b/config/locales/simple_form.fy.yml @@ -57,7 +57,6 @@ fy: setting_always_send_emails: Normaliter wurde der gjin e-mailmeldingen ferstjoerd wannear’t jo aktyf Mastodon brûke setting_default_sensitive: Gefoelige media wurdt standert ferstoppe en kin mei ien klik toand wurde setting_emoji_style: Wêrmei moatte emojis werjûn wurde. ‘Automatysk’ probearret de systeemeigen emojis te brûken, mar falt werom op Twemoji foar âldere browsers. - setting_system_scrollbars_ui: Allinnich fan tapassing op desktopbrowsers basearre op Safari en Chromium setting_use_blurhash: Dizige kleuroergongen binne basearre op de kleuren fan de ferstoppe media, wêrmei elk detail ferdwynt setting_use_pending_items: De tiidline wurdt bywurke troch op it oantal nije items te klikken, yn stee fan dat dizze automatysk bywurke wurdt username: Jo kinne letters, sifers en ûnderstreekjes brûke diff --git a/config/locales/simple_form.ga.yml b/config/locales/simple_form.ga.yml index a7c94a91a71..b534c7acedf 100644 --- a/config/locales/simple_form.ga.yml +++ b/config/locales/simple_form.ga.yml @@ -66,7 +66,6 @@ ga: setting_display_media_show_all: Taispeáin na meáin go léir gan rabhadh, lena n-áirítear meáin atá marcáilte mar íogair setting_emoji_style: Conas emojis a thaispeáint. Déanfaidh "Auto" iarracht emoji dúchasacha a úsáid, ach titeann sé ar ais go Twemoji le haghaidh seanbhrabhsálaithe. setting_quick_boosting_html: Nuair a bhíonn sé cumasaithe, má chliceálann tú ar an deilbhín Treisithe %{boost_icon}, treiseofar láithreach é in ionad an roghchlár anuas treisithe/lua a oscailt. Bogann sé seo an gníomh lua go dtí an roghchlár %{options_icon} (Roghanna). - setting_system_scrollbars_ui: Ní bhaineann sé ach le brabhsálaithe deisce bunaithe ar Safari agus Chrome setting_use_blurhash: Tá grádáin bunaithe ar dhathanna na n-amharcanna ceilte ach cuireann siad salach ar aon mhionsonraí setting_use_pending_items: Folaigh nuashonruithe amlíne taobh thiar de chlic seachas an fotha a scrollú go huathoibríoch username: Is féidir leat litreacha, uimhreacha, agus béim a úsáid diff --git a/config/locales/simple_form.gd.yml b/config/locales/simple_form.gd.yml index 29c16760959..21757feef1e 100644 --- a/config/locales/simple_form.gd.yml +++ b/config/locales/simple_form.gd.yml @@ -66,7 +66,6 @@ gd: setting_display_media_show_all: Seall meadhan sam bith gun rabhadh, a’ gabhail a-staigh nam meadhanan ris a bheil comharra gu bheil iad frionasach setting_emoji_style: An dòigh air an dèid emojis a shealltainn. Feuchaidh “Fèin-obrachail” ris na h-emojis tùsail a chleachdadh ach thèid Twemoji a chleachdadh ’nan àite air seann-bhrabhsairean. setting_quick_boosting_html: Ma tha seo an comas, ma nì thu briogadh air ìomhaigheag %{boost_icon} a’ bhrosnachaidh, thèid a bhrosnachadh sa bhad seach a bhith a’ fosgladh clàr-taice teàrnach a’ bhrosnachaidh/luaidh. Thèid gnìomh an luaidh a ghluasad gu clàr-taice %{options_icon} nan roghainnean. - setting_system_scrollbars_ui: Chan obraich seo ach air brabhsairean desktop stèidhichte air Safari ’s Chrome setting_use_blurhash: Tha caiseadan stèidhichte air dathan nan nithean lèirsinneach a chaidh fhalach ach chan fhaicear am mion-fhiosrachadh setting_use_pending_items: Falaich ùrachaidhean na loidhne-ama air cùlaibh briogaidh seach a bhith a’ sgroladh nam postaichean gu fèin-obrachail username: Faodaidh tu litrichean, àireamhan is fo-loidhnichean a chleachdadh diff --git a/config/locales/simple_form.gl.yml b/config/locales/simple_form.gl.yml index 85cbacc70ad..7b1acf51edd 100644 --- a/config/locales/simple_form.gl.yml +++ b/config/locales/simple_form.gl.yml @@ -66,7 +66,6 @@ gl: setting_display_media_show_all: Mostrar todo o multimedia sen avisar, incluíndo o multimedia marcado como sensible setting_emoji_style: Forma de mostrar emojis. «Auto» intentará usar os emojis nativos, e se falla recurrirase a Twemoji en navegadores antigos. setting_quick_boosting_html: Se está activo, ao premer na icona %{boost_icon} Promover farase automáticamente a promoción no lugar de abrir o menú despregable promover/citar. Sitúa a acción de citar no menú %{options_icon} (Opcións). - setting_system_scrollbars_ui: Aplícase só en navegadores de escritorio baseados en Safari e Chrome setting_use_blurhash: Os gradientes toman as cores da imaxe oculta pero esvaecendo tódolos detalles setting_use_pending_items: Agochar actualizacións da cronoloxía tras un click no lugar de desprazar automáticamente os comentarios username: Podes usar letras, números e trazos baixos diff --git a/config/locales/simple_form.he.yml b/config/locales/simple_form.he.yml index 4292748e302..d004a2115ec 100644 --- a/config/locales/simple_form.he.yml +++ b/config/locales/simple_form.he.yml @@ -66,7 +66,6 @@ he: setting_display_media_show_all: הצג את כל תכני המדיה ללא אזהרה, גם אם סומנו כרגישים setting_emoji_style: כיצד להציג רגישונים. "אוטומטי" ינסה להציג מסט האימוג'י המקומי, אבל נופל לערכת Twemoji כברירת מחדל עבור דפדפנים ישנים. setting_quick_boosting_html: כשמאופשר, לחיצה על %{boost_icon} איקון הדהוד ייצור הדהוד מיידי במקום לפתוח את תיבת הבחירה הדהוד/ציטוט. מעביר את פעולת הציטוט אל %{options_icon} תפריט אפשרויות. - setting_system_scrollbars_ui: נוגע רק לגבי דפדפני דסקטופ מבוססים ספארי וכרום setting_use_blurhash: הגראדיינטים מבוססים על תוכן התמונה המוסתרת, אבל מסתירים את כל הפרטים setting_use_pending_items: הסתר עדכוני פיד מאחורי קליק במקום לגלול את הפיד אוטומטית username: ניתן להשתמש בספרות, אותיות לטיניות ומקף תחתון diff --git a/config/locales/simple_form.hu.yml b/config/locales/simple_form.hu.yml index 6b2d3d16a3a..b7ca9a07504 100644 --- a/config/locales/simple_form.hu.yml +++ b/config/locales/simple_form.hu.yml @@ -66,7 +66,6 @@ hu: setting_display_media_show_all: Figyelmeztetés minden média megjelenítése esetén, köztük a kényesnek jelöltek esetén is setting_emoji_style: Az emodzsik megjelenítési módja. Az „Automatikus” megpróbálja a natív emodzsikat használni, de az örökölt böngészők esetén a Twemojira vált vissza. setting_quick_boosting_html: Ha engedélyezve van, akkor a %{boost_icon} Megtolás azonnal megtörténik, ahelyett hogy megnyitná a megtolás/idézés legördülő menüje. Az idézési műveletet áthelyezi a %{options_icon} (Beállítások) menübe. - setting_system_scrollbars_ui: Csak Chrome és Safari alapú asztali böngészőkre vonatkozik setting_use_blurhash: A kihomályosítás az eredeti képből történik, de minden részletet elrejt setting_use_pending_items: Idővonal frissítése csak kattintásra automatikus görgetés helyett username: Betűk, számok és alávonások használhatók diff --git a/config/locales/simple_form.ia.yml b/config/locales/simple_form.ia.yml index b1718009b4c..d02c49156e2 100644 --- a/config/locales/simple_form.ia.yml +++ b/config/locales/simple_form.ia.yml @@ -62,7 +62,6 @@ ia: setting_default_sensitive: Le medios sensibile es celate de ordinario e pote esser revelate con un clic setting_emoji_style: Como monstrar emojis. “Automatic” tentara usar emojis native, ma recurre al Twemojis pro navigatores ancian. setting_quick_boosting_html: Si isto es activate, un clic sur le icone %{boost_icon} Impulsar impulsara immediatemente le message in loco de aperir le menu disrolante de impulsar/citar. Isto tamben colloca le action de citar in le menu %{options_icon} (Optiones). - setting_system_scrollbars_ui: Se applica solmente al navigatores de scriptorio basate sur Safari e Chrome setting_use_blurhash: Le imagines degradate se basa sur le colores del visuales celate, ma illos offusca tote le detalios setting_use_pending_items: Requirer un clic pro monstrar nove messages in vice de rolar automaticamente le fluxo username: Tu pote usar litteras, numeros e tractos de sublineamento diff --git a/config/locales/simple_form.io.yml b/config/locales/simple_form.io.yml index 387471ed1bb..40086531a6f 100644 --- a/config/locales/simple_form.io.yml +++ b/config/locales/simple_form.io.yml @@ -56,7 +56,6 @@ io: setting_aggregate_reblogs: Ne montrez nova repeti di posti qui ja repetesis recente (nur efektigas repeti recevata nove) setting_always_send_emails: Normale retpostoavizi ne sendesas kande vu aktiva uzas Mastodon setting_default_sensitive: Trublema audvidaji originala celesas e povas descelesar per kliko - setting_system_scrollbars_ui: Nur ye tablokomputilretumili qua bazita ye Safario e Kromeo setting_use_blurhash: Inklini esas segun kolori di celesis vidaji ma kovras irga detali setting_use_pending_items: Celez tempolinetildatigo dop kliko vice automatike ruligar la fluo username: Vu darfas uzar literi, nombri, e sublinei diff --git a/config/locales/simple_form.is.yml b/config/locales/simple_form.is.yml index 8556716840d..520aa18d238 100644 --- a/config/locales/simple_form.is.yml +++ b/config/locales/simple_form.is.yml @@ -66,7 +66,6 @@ is: setting_display_media_show_all: Birta allt myndefni án aðvörunar, líka það sem merkt er viðkvæmt setting_emoji_style: Hvernig birta skal lyndistákn (emoji). "Sjálfvirkt" mun reyna að nota innbyggð lyndistákn, en til vara verða notuð Twemoji-tákn fyrir eldri vafra. setting_quick_boosting_html: Þegar þetta er virkt, sé smellt á %{boost_icon}-endurbirtingartáknið mun endurbirting eiga sér stað strax í stað þess að opna endurbirta/tilvitnun fellivalmyndina. Tilvitnunaraðgerðin færist þá yfir í %{options_icon} (Options) valmyndina. - setting_system_scrollbars_ui: Á einungis við um vafra fyrir vinnutölvur sem byggjast á Safari og Chrome setting_use_blurhash: Litstiglarnir byggja á litunum í földu myndunum, en gera öll smáatriði óskýr setting_use_pending_items: Fela uppfærslur tímalínu þar til smellt er, í stað þess að hún skruni streyminu sjálfvirkt username: Þú mátt nota bókstafi, tölur og undirstrik diff --git a/config/locales/simple_form.it.yml b/config/locales/simple_form.it.yml index 116d3d94d49..d3ab8e3c2e3 100644 --- a/config/locales/simple_form.it.yml +++ b/config/locales/simple_form.it.yml @@ -66,7 +66,6 @@ it: setting_display_media_show_all: Mostra tutti i contenuti multimediali senza preavviso, inclusi quelli contrassegnati come sensibili setting_emoji_style: Come visualizzare gli emoji. "Automatico" proverà a usare gli emoji nativi, ma per i browser più vecchi ricorrerà a Twemoji. setting_quick_boosting_html: Se abilitato, cliccando sull'icona Boost %{boost_icon}, il potenziamento verrà immediatamente attivato, anziché aprire il menu a discesa potenziamento/citazione. Sposta l'azione della citazione nel menu %{options_icon} (Opzioni). - setting_system_scrollbars_ui: Si applica solo ai browser desktop basati su Safari e Chrome setting_use_blurhash: I gradienti sono basati sui colori delle immagini nascoste ma offuscano tutti i dettagli setting_use_pending_items: Fare clic per mostrare i nuovi messaggi invece di aggiornare la timeline automaticamente username: Puoi usare lettere, numeri e caratteri di sottolineatura diff --git a/config/locales/simple_form.ja.yml b/config/locales/simple_form.ja.yml index db1c162be5b..c366d3787be 100644 --- a/config/locales/simple_form.ja.yml +++ b/config/locales/simple_form.ja.yml @@ -62,7 +62,6 @@ ja: setting_default_sensitive: 閲覧注意状態のメディアはデフォルトでは内容が伏せられ、クリックして初めて閲覧できるようになります setting_emoji_style: 絵文字の表示方法。「自動」の場合、可能ならネイティブの絵文字を使用し、レガシーなブラウザではTwemojiで代替します。 setting_quick_boosting_html: 有効にすると、%{boost_icon} ブーストアイコンのクリックで即座にブーストされます。ブースト/引用ドロップダウンは開きません。引用アクションは %{options_icon} (オプション) メニューに移されます。 - setting_system_scrollbars_ui: Safari/Chromeベースのデスクトップブラウザーでのみ有効です setting_use_blurhash: ぼかしはメディアの色を元に生成されますが、細部は見えにくくなっています setting_use_pending_items: 新着があってもタイムラインを自動的にスクロールしないようにします username: アルファベット大文字と小文字、数字、アンダーバー「_」が使えます diff --git a/config/locales/simple_form.ko.yml b/config/locales/simple_form.ko.yml index 84bed22cbac..ef6a3d5a962 100644 --- a/config/locales/simple_form.ko.yml +++ b/config/locales/simple_form.ko.yml @@ -4,6 +4,7 @@ ko: hints: account: attribution_domains: 한 줄에 하나씩. 가짜 기여로부터 보호합니다. + discoverable: 다른 사람이 생성한 컬렉션에 추천될 수 있습니다. 나와 내 공개 게시물 또한 다른 마스토돈의 발견하기 기능을 통해 다른 사용자에게 추천될 수 있습니다. display_name: 진짜 이름 또는 재미난 이름. fields: 홈페이지, 호칭, 나이, 뭐든지 적고 싶은 것들. indexable: 내 공개 게시물이 마스토돈의 검색 결과에 나타날 수 있습니다. 내 게시물과 상호작용했던 사람들은 이 설정과 관계 없이 그 게시물을 검색할 수 있습니다. @@ -60,9 +61,11 @@ ko: setting_default_quote_policy_private: 마스토돈에서 작성된 팔로워 전용 게시물은 다른 사용자가 인용할 수 없습니다. setting_default_quote_policy_unlisted: 사람들에게 인용된 경우, 인용한 게시물도 유행 타임라인에서 감추게 됩니다. setting_default_sensitive: 민감한 미디어는 기본적으로 가려져 있으며 클릭해서 볼 수 있습니다 + setting_display_media_default: 민감함으로 설정된 미디어를 보여주기 전에 경고하기 + setting_display_media_hide_all: 모든 미디어를 보여주기 전 경고 + setting_display_media_show_all: 민감함으로 표시된 미디어를 포함하여 모든 미디어를 경고 없이 보여줍니다 setting_emoji_style: 에모지 표현 방식. "자동"은 시스템 기본 에모지를 적용하고 그렇지 못하는 오래된 브라우저의 경우 트웨모지를 사용합니다. setting_quick_boosting_html: 활성화하면 %{boost_icon}부스트 아이콘을 클릭했을 때 부스트/인용 드롭다운 메뉴가 뜨지 않고 바로 부스트하게 됩니다. 인용은 %{options_icon} (옵션) 메뉴 안으로 이동합니다. - setting_system_scrollbars_ui: 사파리와 크롬 기반의 데스크탑 브라우저만 적용됩니다 setting_use_blurhash: 그라디언트는 숨겨진 내용의 색상을 기반으로 하지만 상세 내용은 보이지 않게 합니다 setting_use_pending_items: 타임라인의 새 게시물을 자동으로 보여 주는 대신, 클릭해서 나타내도록 합니다 username: 문자, 숫자, 밑줄을 사용할 수 있습니다 @@ -84,10 +87,13 @@ ko: activity_api_enabled: 주별 로컬에 게시된 글, 활성 사용자 및 새로운 가입자 수 app_icon: WEBP, PNG, GIF 또는 JPG. 모바일 기기에 쓰이는 기본 아이콘을 대체합니다. backups_retention_period: 사용자들은 나중에 다운로드하기 위해 게시물 아카이브를 생성할 수 있습니다. 양수로 설정된 경우 이 아카이브들은 지정된 일수가 지난 후에 저장소에서 자동으로 삭제될 것입니다. + bootstrap_timeline_accounts: 이 계정들은 새 계정의 팔로우 추천에 고정됩니다. 콤마로 구분된 계정 목록을 제공하세요. closed_registrations_message: 새 가입을 차단했을 때 표시됩니다 content_cache_retention_period: "(부스트 및 답글 포함) 다른 서버의 모든 게시물은 해당 게시물에 대한 로컬 사용자의 상호 작용과 관계없이 지정된 일수가 지나면 삭제됩니다. 여기에는 로컬 사용자가 북마크 또는 즐겨찾기로 표시한 게시물도 포함됩니다. 다른 인스턴스 사용자와 주고 받은 개인 멘션도 손실되며 복원할 수 없습니다. 이 설정은 특수 목적의 인스턴스를 위한 것이며 일반적인 용도의 많은 사용자의 예상이 빗나가게 됩니다." custom_css: 사용자 지정 스타일을 웹 버전의 마스토돈에 지정할 수 있습니다. + email_footer_text: 뉴스레터 이메일의 최하단에만 보여지는 선택적인 텍스트. favicon: WEBP, PNG, GIF 또는 JPG. 기본 파비콘을 대체합니다. + landing_page: 새 방문자가 내 서버에 처음 도달했을 때 보여줄 페이지를 선택하세요. "유행"을 선택하려면 설정에서 유행이 활성화되어있어야 합니다. "로컬 피드"로 설정하려면 "로컬 게시물 실시간 피드 접근" 권한이 "모두에게"로 설정되어있어야 합니다. mascot: 고급 웹 인터페이스의 그림을 대체합니다. media_cache_retention_period: 원격 사용자가 작성한 글의 미디어 파일은 이 서버에 캐시됩니다. 양수로 설정하면 지정된 일수 후에 미디어가 삭제됩니다. 삭제된 후에 미디어 데이터를 요청하면 원본 콘텐츠를 사용할 수 있는 경우 다시 다운로드됩니다. 링크 미리 보기 카드가 타사 사이트를 폴링하는 빈도에 제한이 있으므로 이 값을 최소 14일로 설정하는 것이 좋으며, 그렇지 않으면 그 이전에는 링크 미리 보기 카드가 제때 업데이트되지 않을 것입니다. min_age: 사용자들은 가입할 때 생일을 확인받게 됩니다 @@ -103,8 +109,10 @@ ko: status_page_url: 이 서버가 중단된 동안 사람들이 서버의 상태를 볼 수 있는 페이지 URL theme: 로그인 하지 않은 사용자나 새로운 사용자가 보게 될 테마. thumbnail: 대략 2:1 비율의 이미지가 서버 정보 옆에 표시됩니다. + thumbnail_description: 이미지에 대한 설명은 시각에 문제가 있는 사람들이 내용을 이해하는데 도움이 됩니다. trendable_by_default: 유행하는 콘텐츠에 대한 수동 승인을 건너뜁니다. 이 설정이 적용된 이후에도 각각의 항목들을 삭제할 수 있습니다. trends: 트렌드는 어떤 게시물, 해시태그 그리고 뉴스 기사가 이 서버에서 인기를 끌고 있는지 보여줍니다. + wrapstodon: 로컬 사용자가 한 해의 요약을 생성하도록 제안합니다. 이 기능은 매 년 12월 10일과 31일 사이에 사용 가능하고, 올 해 최소 한 개의 공개 또는 미등재 게시물을 게시하고 하나 이상의 해시태그를 사용한 사용자에게 제안됩니다. form_challenge: current_password: 당신은 보안 구역에 진입하고 있습니다 imports: @@ -127,6 +135,7 @@ ko: otp: '휴대전화에서 생성된 이중 인증 코드를 입력하거나, 복구 코드 중 하나를 사용하세요:' webauthn: USB 키라면 삽입했는지 확인하고, 필요하다면 누르세요. settings: + email_subscriptions: 비활성화하면 기존 구독자는 유지되지만 더이상 이메일을 보내지 않습니다. indexable: 내 프로필 페이지가 구글, 빙 등의 검색엔진에 표시될 수 있습니다. show_application: 나 자신은 이 설정과 관계 없이 어떤 앱으로 게시물을 작성했는지 볼 수 있습니다. tag: @@ -146,17 +155,21 @@ ko: jurisdiction: 요금을 지불하는 사람이 거주하는 국가를 기재하세요. 회사나 기타 법인인 경우 해당 법인이 설립된 국가와 도시, 지역, 영토 또는 주를 적절히 기재하세요. min_age: 관할지역의 법률에서 요구하는 최저 연령보다 작으면 안 됩니다. user: + chosen_languages: 체크하면 선택된 언어들만 공개 타임라인에 보여집니다. 이 설정은 홈 타임라인과 리스트에는 적용되지 않습니다. date_of_birth: other: "%{domain}을 이용하려면 %{count}세 이상임을 확인해야 합니다. 이 정보는 저장되지 않습니다." role: 역할은 사용자가 어떤 권한을 가지게 될 지 결정합니다. user_role: + collection_limit: 이 역할을 가진 사용자가 생성할 수 있는 컬렉션 개수의 한도를 지정합니다. 이 값을 줄이는 경우 이미 그 값을 초과한 사용자가 컬렉션을 잃어버리지는 않습니다. 하지만 새 컬렉션을 추가할 수는 없게 됩니다. color: 색상은 사용자 인터페이스에서 역할을 나타내기 위해 사용되며, RGB 16진수 형식입니다 highlighted: 이 역할이 공개적으로 보이도록 설정합니다 name: 역할이 배지로 표시될 경우, 그 역할에 대한 공개적인 이름입니다 permissions_as_keys: 이 역할을 가진 사용자는 다음에 접근할 수 있게 됩니다... position: 특정 상황에서 충돌이 발생할 경우 더 높은 역할이 충돌을 해결합니다. 특정 작업은 우선순위가 낮은 역할에 대해서만 수행될 수 있습니다 + require_2fa: 이 역할을 가진 사용자는 2단계 인증을 설정해야만 마스토돈을 사용할 수 있습니다 username_block: allow_with_approval: 바로 가입을 막는 대신, 일치하는 가입에 승인을 요구합니다 + comparison: 부분일치를 사용할 땐 의도치 않은 차단에 주의하세요 username: 대소문자와 관계 없고 "4"를 "a"로, "3"을 "e"로 사용하는 등의 보편적으로 사용되는 비슷한 문자까지 매치됩니다 webhook: events: 전송할 이벤트를 선택하세요 @@ -165,6 +178,7 @@ ko: labels: account: attribution_domains: 나를 기여자로 올릴 수 있도록 허용된 웹사이트들 + discoverable: 나를 발견하기 기능에서 추천 fields: name: 라벨 value: 내용 @@ -212,6 +226,7 @@ ko: email: 이메일 주소 expires_in: 만기 fields: 부가 필드 + filter_action: 필터 동작 header: 헤더 사진 honeypot: "%{label} (채우지 마시오)" inbox_url: 릴레이 서버의 inbox URL @@ -278,6 +293,7 @@ ko: closed_registrations_message: 가입이 불가능 할 때의 사용자 지정 메시지 content_cache_retention_period: 리모트 콘텐츠 보유 기간 custom_css: 사용자 정의 CSS + email_footer_text: 추가 하단 텍스트 favicon: 파비콘 landing_page: 새 방문자를 위한 랜딩 페이지 local_live_feed_access: 로컬 게시물에 대한 실시간 피드 접근 @@ -302,9 +318,13 @@ ko: status_page_url: 상태 페이지 URL theme: 기본 테마 thumbnail: 서버 썸네일 + thumbnail_description: 썸네일 대체 텍스트 trendable_by_default: 사전 리뷰 없이 트렌드에 오르는 것을 허용 trends: 유행 활성화 wrapstodon: 랩스토돈 활성화 + form_email_subscriptions_confirmation: + agreement_email_volume: 이 기능을 활성화하면 발송되는 이메일의 양이 크게 증가할 수 있으며 이에 대한 책임은 전적으로 본인에게 있음을 이해했습니다. + agreement_privacy_and_terms: 개인정보처리방침과 이용약관을 업데이트 했습니다. interactions: must_be_follower: 나를 팔로우 하지 않는 사람에게서 온 알림을 차단 must_be_following: 내가 팔로우 하지 않는 사람에게서 온 알림을 차단 @@ -343,6 +363,7 @@ ko: hint: 추가 정보 text: 규칙 settings: + email_subscriptions: 이메일 구독 활성화 indexable: 검색엔진에 프로필 페이지 포함하기 show_application: 어떤 앱으로 게시물을 보냈는지 표시 tag: @@ -371,11 +392,13 @@ ko: role: 역할 time_zone: 시간대 user_role: + collection_limit: 사용자당 최대 컬렉션 개수 color: 배지 색상 highlighted: 역할 배지를 사용자 프로필에 표시 name: 이름 permissions_as_keys: 권한 position: 우선순위 + require_2fa: 2단계 인증 필요 username_block: allow_with_approval: 승인을 통한 가입 허용 comparison: 비교 방식 diff --git a/config/locales/simple_form.lt.yml b/config/locales/simple_form.lt.yml index 4d5b72c7b02..3250e42f7a7 100644 --- a/config/locales/simple_form.lt.yml +++ b/config/locales/simple_form.lt.yml @@ -62,7 +62,6 @@ lt: setting_default_sensitive: Jautrioji medija pagal numatytuosius nustatymus yra paslėpta ir gali būti atskleista spustelėjus. setting_emoji_style: Kaip rodyti emodžius. „Auto“ bandys naudoti vietinius jaustukus, bet senesnėse naršyklėse grįš prie Tvejaustukų. setting_quick_boosting_html: Kai ši funkcija įjungta, paspaudus ant %{boost_icon} Paryškinimo piktogramos, įrašas bus iškart paryškintas, o ne atidarytas išskleidžiamasis meniu „paryškinti/cituoti“. Citavimo veiksmas perkeliamas į %{options_icon} meniu. - setting_system_scrollbars_ui: Taikoma tik darbalaukio naršyklėms, karkasiniais „Safari“ ir „Chrome“. setting_use_blurhash: Gradientai pagrįsti paslėptų vizualizacijų spalvomis, bet užgožia bet kokias detales. setting_use_pending_items: Slėpti laiko skalės naujienas po paspaudimo, vietoj automatinio srauto slinkimo. username: Gali naudoti raides, skaičius ir pabraukimus diff --git a/config/locales/simple_form.lv.yml b/config/locales/simple_form.lv.yml index 96a5b9344ac..7cc0a2ee322 100644 --- a/config/locales/simple_form.lv.yml +++ b/config/locales/simple_form.lv.yml @@ -56,7 +56,6 @@ lv: setting_aggregate_reblogs: Nerādīt jaunus pastiprinājumus ierakstiem, kas nesen tikuši pastiprināti (ietekmēs tikai turpmāk saņemtos pastiprinājumus) setting_always_send_emails: Parasti e-pasta paziņojumi netiek sūtīti, kad aktīvi izmantojat Mastodon setting_default_sensitive: Pēc noklusējuma jūtīgi informācijas nesēji ir paslēpti, un tos var atklāt ar klikšķi - setting_system_scrollbars_ui: Attiecas tikai uz darbvirsmas pārlūkiem, kuru pamatā ir Safari vai Chrome setting_use_blurhash: Pāreju pamatā ir paslēpto uzskatāmo līdzekļu krāsas, bet saturs tiek padarīts neskaidrs setting_use_pending_items: Paslēpt laika skalas atjauninājumus aiz klikšķa, nevis ar automātisku plūsmas ritināšanu username: Tu vari lietot burtus, ciparus un zemsvītras diff --git a/config/locales/simple_form.nl.yml b/config/locales/simple_form.nl.yml index ac3833af5f8..18d6145db45 100644 --- a/config/locales/simple_form.nl.yml +++ b/config/locales/simple_form.nl.yml @@ -66,7 +66,6 @@ nl: setting_display_media_show_all: Geef geen waarschuwing bij het tonen van alle media, inclusief als gevoelig gemarkeerde media setting_emoji_style: Waarmee moeten emojis worden weergegeven. ‘Auto’ probeert de systeemeigen emojis te gebruiken, maar valt terug op Twemoji voor oudere webbrowsers. setting_quick_boosting_html: Wanneer dit is ingeschakeld, boost je in één keer wanneer je op het %{boost_icon} boostpictogram klikt en verplaatst de citeeroptie zich naar het %{options_icon} optiemenu. Wanneer dit is uitgeschakeld krijg je gelijk de mogelijkheid om te boosten of te citeren. - setting_system_scrollbars_ui: Alleen van toepassing op desktopbrowsers gebaseerd op Safari en Chrome setting_use_blurhash: Wazige kleurovergangen zijn gebaseerd op de kleuren van de verborgen media, waarmee elk detail verdwijnt setting_use_pending_items: De tijdlijn wordt bijgewerkt door op het aantal nieuwe items te klikken, in plaats van dat deze automatisch wordt bijgewerkt username: Je kunt letters, cijfers en underscores gebruiken diff --git a/config/locales/simple_form.nn.yml b/config/locales/simple_form.nn.yml index 5bcb37107a5..cc7dae3ee8b 100644 --- a/config/locales/simple_form.nn.yml +++ b/config/locales/simple_form.nn.yml @@ -62,7 +62,6 @@ nn: setting_default_sensitive: Sensitive media vert gøymde som standard, og du syner dei ved å klikka på dei setting_emoji_style: Korleis du skal visa smilefjes. «Auto» prøver å visa innebygde smilefjes, men bruker Twemoji som reserveløysing for eldre nettlesarar. setting_quick_boosting_html: Når dette er skrudd på og du klikkar på %{boost_icon} framhev-ikonet, vil du framheva innlegget med ein gong i staden for å opna framhev/siter-menyen. Du finn siteringa i %{options_icon} (Val)-menyen. - setting_system_scrollbars_ui: Gjeld berre skrivebordsnettlesarar som er bygde på Safari og Chrome setting_use_blurhash: Overgangar er basert på fargane til skjulte grafikkelement, men gjer detaljar utydelege setting_use_pending_items: Gøym tidslineoppdateringar bak eit klikk, i staden for å rulla ned automatisk username: Du kan bruka bokstavar, tal og understrekar diff --git a/config/locales/simple_form.pl.yml b/config/locales/simple_form.pl.yml index 2532957821a..82f4fe5d5a1 100644 --- a/config/locales/simple_form.pl.yml +++ b/config/locales/simple_form.pl.yml @@ -65,7 +65,6 @@ pl: setting_display_media_show_all: Pokazuj wszystkie multimedia bez ostrzeżenia, w tym multimedia oznaczone jako wrażliwe setting_emoji_style: Jak wyświetlić emotikony. "Auto" spróbuje użyć natywnych emoji, ale wróci do Twemoji dla starszych przeglądarek. setting_quick_boosting_html: Po włączeniu tej opcji kliknięcie ikonki %{boost_icon} spowoduje natychmiastowe podbicie zamiast otwarcia menu rozwijanego z opcją podbicia lub cytatu. Przenosi to akcję cytowania do menu %{options_icon} (Opcje). - setting_system_scrollbars_ui: Stosuje się tylko do przeglądarek komputerowych opartych na Safari i Chrome setting_use_blurhash: Gradienty są oparte na kolorach ukrywanej zawartości, ale uniewidaczniają wszystkie szczegóły setting_use_pending_items: Ukryj aktualizacje osi czasu za kliknięciem, zamiast automatycznego przewijania strumienia username: Możesz używać liter, cyfr i podkreślników diff --git a/config/locales/simple_form.pt-BR.yml b/config/locales/simple_form.pt-BR.yml index 01d311208c5..b48afcad48f 100644 --- a/config/locales/simple_form.pt-BR.yml +++ b/config/locales/simple_form.pt-BR.yml @@ -66,7 +66,6 @@ pt-BR: setting_display_media_show_all: Mostre todas as mídias sem aviso, incluindo mídias marcadas como conteúdo sensível setting_emoji_style: Como exibir emojis. "Automáticos" tentará usar emojis nativos, mas voltará para o Twemoji para navegadores legados. setting_quick_boosting_html: Quando ativado, clicar no ícone de impulsionamento %{boost_icon} impulsionará imediatamente o texto, em vez de abrir o menu suspenso de impulsionamento/citação. Move a ação de citação para o menu %{options_icon} (Opções). - setting_system_scrollbars_ui: Se aplica apenas para navegadores de computador baseado no Safari e Chrome setting_use_blurhash: O blur é baseado nas cores da imagem oculta, ofusca a maioria dos detalhes setting_use_pending_items: Ocultar atualizações da linha do tempo atrás de um clique ao invés de rolar automaticamente username: Você pode usar letras, números e underlines diff --git a/config/locales/simple_form.pt-PT.yml b/config/locales/simple_form.pt-PT.yml index d9ea99131fd..f2fa0268a8d 100644 --- a/config/locales/simple_form.pt-PT.yml +++ b/config/locales/simple_form.pt-PT.yml @@ -66,7 +66,6 @@ pt-PT: setting_display_media_show_all: Mostrar toda a media sem aviso, incluindo media marcada como sensível setting_emoji_style: Como apresentar emojis. "Auto" tenta usar emojis nativos, mas reverte para Twemoji em navegadores mais antigos. setting_quick_boosting_html: Quando ativado, clicar no ícone %{boost_icon} Partilhar irá de imediato partilhar ao invés de abrir o menu de Partilhar/Citar. Relocaliza a ação Citar para o menu %{options_icon} (Opções). - setting_system_scrollbars_ui: Aplica-se apenas a navegadores de desktop baseados no Safari e Chrome setting_use_blurhash: Os gradientes são baseados nas cores das imagens escondidas, mas ofuscam quaisquer pormenores setting_use_pending_items: Ocultar as atualizações da cronologia após um clique em vez de percorrer automaticamente a cronologia username: Podes utilizar letras, números e traços inferiores (_) diff --git a/config/locales/simple_form.ru.yml b/config/locales/simple_form.ru.yml index c5a73b07cdd..554d23a0491 100644 --- a/config/locales/simple_form.ru.yml +++ b/config/locales/simple_form.ru.yml @@ -64,7 +64,6 @@ ru: setting_display_media_hide_all: Показывать предупреждение перед отображением любого контента setting_emoji_style: Как отображать эмодзи. Если выбран вариант «Автоматически», то будут использованы системные эмодзи, а для устаревших браузеров — Twemoji. setting_quick_boosting_html: Отметьте флажок, чтобы при нажатии на кнопку %{boost_icon} Продвинуть не выбирать между продвижением и цитированием, а сразу продвигать пост. Цитирование будет доступно из меню поста (%{options_icon}). - setting_system_scrollbars_ui: Работает только в браузерах для ПК на основе Safari или Chrome setting_use_blurhash: Градиенты основаны на цветах скрытых медиа, но размывают любые детали setting_use_pending_items: Отметьте флажок, чтобы выключить автоматическую прокрутку, и тогда обновления в лентах будут вам показаны только по нажатию username: Вы можете использовать буквы, цифры и символы подчёркивания diff --git a/config/locales/simple_form.si.yml b/config/locales/simple_form.si.yml index 28e2cc24e63..1a6a6d43290 100644 --- a/config/locales/simple_form.si.yml +++ b/config/locales/simple_form.si.yml @@ -56,7 +56,6 @@ si: setting_aggregate_reblogs: මෑතකදී වැඩි කරන ලද පළ කිරීම් සඳහා නව වැඩි කිරීම් නොපෙන්වන්න (අලුතින් ලැබුණු වැඩි කිරීම් වලට පමණක් බලපායි) setting_always_send_emails: ඔබ නිතර මාස්ටඩන් භාවිතා කරන විට වි-තැපැල් දැනුම්දීම් නොලැබෙයි setting_default_sensitive: සංවේදී මාධ්‍ය පෙරනිමියෙන් සඟවා ඇති අතර ක්ලික් කිරීමකින් හෙළිදරව් කළ හැක - setting_system_scrollbars_ui: Safari සහ Chrome මත පදනම් වූ ඩෙස්ක්ටොප් බ්‍රව්සර් සඳහා පමණක් අදාළ වේ. setting_use_blurhash: අනුක්‍රමණ සැඟවුණු දෘශ්‍යවල වර්ණ මත පදනම් වන නමුත් ඕනෑම විස්තරයක් අපැහැදිලි කරයි setting_use_pending_items: සංග්‍රහය ස්වයංක්‍රීයව අනුචලනය කරනවා වෙනුවට ක්ලික් කිරීමක් පිටුපස කාලරේඛා යාවත්කාලීන සඟවන්න username: ඔබට අකුරු, අංක සහ යටි ඉරි භාවිතා කළ හැකිය. diff --git a/config/locales/simple_form.sk.yml b/config/locales/simple_form.sk.yml index cdfa965c36c..bcbfba16806 100644 --- a/config/locales/simple_form.sk.yml +++ b/config/locales/simple_form.sk.yml @@ -41,7 +41,6 @@ sk: setting_aggregate_reblogs: Nezobrazovať nové zdieľania pre nedávno zdieľané príspevky (týka sa iba nových zdieľaní) setting_always_send_emails: Pri bežnom používaní Mastodonu nebudete dostávať e-mailové upozornenia setting_default_sensitive: Citlivé médiá sú predvolene ukryté a môžu byť zobrazené kliknutím - setting_system_scrollbars_ui: Platí len pre počítačové prehliadače využívajúce technológiu Chrome alebo Safari setting_use_blurhash: Prechody sú založené na farbách skrytých vizuálov, ale skrývajú akékoľvek podrobnosti setting_use_pending_items: Časová os bude aktualizovaná až po kliknutí, feed sa nebúde posúvať automaticky whole_word: Ak je kľúčové slovo, alebo fráza poskladaná iba s písmen a čísel, bude použité iba ak sa zhoduje s celým výrazom diff --git a/config/locales/simple_form.sl.yml b/config/locales/simple_form.sl.yml index d08352516d6..c925c64de3b 100644 --- a/config/locales/simple_form.sl.yml +++ b/config/locales/simple_form.sl.yml @@ -57,7 +57,6 @@ sl: setting_aggregate_reblogs: Ne prikažite novih izpostavitev za objave, ki so bile nedavno izpostavljene (vpliva samo na novo prejete izpostavitve) setting_always_send_emails: Običajno e-obvestila ne bodo poslana, če ste na Mastodonu dejavni setting_default_sensitive: Občutljivi mediji so privzeto skriti in jih je mogoče razkriti s klikom - setting_system_scrollbars_ui: Velja zgolj za namizne brskalnike, ki temeljijo na Safariju in Chromeu setting_use_blurhash: Prelivi temeljijo na barvah skrite vizualne slike, vendar zakrivajo vse podrobnosti setting_use_pending_items: Skrij posodobitev časovnice za klikom namesto samodejnega posodabljanja username: Uporabite lahko črke, števke in podčrtaje. diff --git a/config/locales/simple_form.sq.yml b/config/locales/simple_form.sq.yml index b513e66deec..97f4e5bdd25 100644 --- a/config/locales/simple_form.sq.yml +++ b/config/locales/simple_form.sq.yml @@ -65,7 +65,6 @@ sq: setting_display_media_hide_all: Sinjalizo, para shfaqjes së çfarëdo medieje setting_display_media_show_all: Shfaq krejt mediat pa sinjalizuar, përfshi media të shënuar si me spec setting_quick_boosting_html: Kur aktivizohet, klikimi mbi ikonën e Përforcimeve %{boost_icon} do të bëjë menjëherë përforcimin, në vend se të hapet menuja hapmbyll e përforcimeve/citimeve. E rikalon veprimin e citimit te menuja %{options_icon} (Mundësi). - setting_system_scrollbars_ui: Ka vend vetëm për shfletues desktop bazuar në Safari dhe Chrome setting_use_blurhash: Gradientët bazohen në ngjyrat e elementëve pamorë të fshehur, por errësojnë çfarëdo hollësie setting_use_pending_items: Fshihi përditësimet e rrjedhës kohore pas një klikimi, në vend të rrëshqitjes automatike nëpër prurje username: Mund të përdorni shkronja, numra dhe nënvija diff --git a/config/locales/simple_form.sv.yml b/config/locales/simple_form.sv.yml index fca43a84b22..0782838615a 100644 --- a/config/locales/simple_form.sv.yml +++ b/config/locales/simple_form.sv.yml @@ -66,7 +66,6 @@ sv: setting_display_media_show_all: Visa alla medier utan varning, inklusive media markerad som känslig setting_emoji_style: Hur emojier visas. "Automatiskt" kommer att försöka använda webbläsarens emojier, men faller tillbaka till Twemoji för äldre webbläsare. setting_quick_boosting_html: När aktiverad, klicka på %{boost_icon} Boost-ikonen för att omedelbart boosta istället för att öppna boost/citera-rullgardinsmenyn. Flyttar citering till %{options_icon} (Alternativ)-menyn. - setting_system_scrollbars_ui: Gäller endast för webbläsare som är baserade på Safari och Chrome setting_use_blurhash: Gradienter är baserade på färgerna av de dolda objekten men fördunklar alla detaljer setting_use_pending_items: Dölj tidslinjeuppdateringar bakom ett klick istället för att automatiskt bläddra i flödet username: Du kan använda bokstäver, siffror och understreck diff --git a/config/locales/simple_form.tr.yml b/config/locales/simple_form.tr.yml index 282d7a6463c..41a618bcd88 100644 --- a/config/locales/simple_form.tr.yml +++ b/config/locales/simple_form.tr.yml @@ -66,7 +66,6 @@ tr: setting_display_media_show_all: Hassas olarak işaretlenmiş medya dahil olmak üzere tüm medyayı uyarı vermeden göster setting_emoji_style: Emojiler nasıl görüntülensin. "Otomatik" seçeneği yerel emojileri kullanmaya çalışır, ancak eski tarayıcılar için Twemoji'yi kullanır. setting_quick_boosting_html: Etkinleştirildiğinde, %{boost_icon} Öne Çıkar simgesine tıklandığında, öne çıkar/alıntı açılır menüsünü görüntüleme yerine hemen öne çıkarma işlemi gerçekleştirilir. Alıntı işlevi %{options_icon} (Seçenekler) menüsüne taşınır. - setting_system_scrollbars_ui: Yalnızca Safari ve Chrome tabanlı masaüstü tarayıcılar için geçerlidir setting_use_blurhash: Gradyenler gizli görsellerin renklerine dayanır, ancak detayları gizler setting_use_pending_items: Akışı otomatik olarak kaydırmak yerine, zaman çizelgesi güncellemelerini tek bir tıklamayla gizleyin username: Harfleri, sayıları veya alt çizgi kullanabilirsiniz diff --git a/config/locales/simple_form.uk.yml b/config/locales/simple_form.uk.yml index 489dff3d515..8323ca9ac99 100644 --- a/config/locales/simple_form.uk.yml +++ b/config/locales/simple_form.uk.yml @@ -62,7 +62,6 @@ uk: setting_default_sensitive: Делікатні медіа типово приховані та можуть бути розкриті натисканням setting_emoji_style: Як показувати емоджі. «Авто» — використовувати емоджі браузера, а за їхньої відсутності — Twemoji. setting_quick_boosting_html: Якщо увімкнено, натиск на піктограму %{boost_icon} Поширити призводитиме до негайного поширення, а не відкриватиме меню поширення й цитування. Кнопку цитування буде переміщено до меню %{options_icon} Більше. - setting_system_scrollbars_ui: Застосовується лише для настільних браузерів на основі Safari та Chrome setting_use_blurhash: Градієнти, що базуються на кольорах прихованих медіа, але роблять нерозрізненними будь-які деталі setting_use_pending_items: Не додавати нові повідомлення до стрічок миттєво, показувати лише після додаткового клацання username: Можна використовувати літери, цифри та підкреслення diff --git a/config/locales/simple_form.vi.yml b/config/locales/simple_form.vi.yml index a5ffe49c44c..548c9cbae60 100644 --- a/config/locales/simple_form.vi.yml +++ b/config/locales/simple_form.vi.yml @@ -66,7 +66,6 @@ vi: setting_display_media_show_all: Hiện tất cả phương tiện mà không cảnh báo, kể cả phương tiện đánh dấu nhạy cảm setting_emoji_style: '"Tự động" sẽ dùng biểu tượng cảm xúc nguyên bản, nhưng đối với các trình duyệt cũ sẽ chuyển thành Twemoji.' setting_quick_boosting_html: Nếu bật, nhấn biểu tượng %{boost_icon} Đăng lại sẽ đăng lại lập tức, thay vì mở menu xổ xuống đăng lại/trích dẫn. Chuyển vị trí hành động trích dẫn sang menu %{options_icon} (Tùy chọn). - setting_system_scrollbars_ui: Chỉ áp dụng trình duyệt Chrome và Safari bản desktop setting_use_blurhash: Phủ lớp màu làm nhòe đi hình ảnh nhạy cảm setting_use_pending_items: Dồn lại toàn bộ tút mới và chỉ hiển thị khi nhấn vào username: Chỉ dùng ký tự, số và dấu gạch dưới diff --git a/config/locales/simple_form.zh-CN.yml b/config/locales/simple_form.zh-CN.yml index 7135bb359ec..83dd55aecd9 100644 --- a/config/locales/simple_form.zh-CN.yml +++ b/config/locales/simple_form.zh-CN.yml @@ -66,7 +66,6 @@ zh-CN: setting_display_media_show_all: 显示所有媒体而不显示警告,包括被标记为敏感内容的媒体 setting_emoji_style: 如何显示Emoji表情符号。选择“自动”将尝试使用原生Emoji,但在旧浏览器中会备选使用Twemoji。 setting_quick_boosting_html: 如果启用,点击 %{boost_icon} 转嘟图标将立即转嘟,而非开启“转嘟/引用”的下拉式菜单。这会使引用嘟文操作的按钮移动到 %{options_icon} (选项)菜单中。 - setting_system_scrollbars_ui: 仅对基于 Safari 或 Chromium 内核的桌面端浏览器有效 setting_use_blurhash: 渐变是基于模糊后的隐藏内容生成的 setting_use_pending_items: 点击查看时间线更新,而非自动滚动更新动态。 username: 你只能使用字母、数字和下划线 diff --git a/config/locales/simple_form.zh-TW.yml b/config/locales/simple_form.zh-TW.yml index 7747a034465..a13a3c3a127 100644 --- a/config/locales/simple_form.zh-TW.yml +++ b/config/locales/simple_form.zh-TW.yml @@ -66,7 +66,6 @@ zh-TW: setting_display_media_show_all: 不警告並顯示所有多媒體內容,包括標記為敏感內容者 setting_emoji_style: 如何顯示 emoji 表情符號。「自動」將嘗試使用原生 emoji ,但於老式瀏覽器使用 Twemoji。 setting_quick_boosting_html: 當啟用時,點擊 %{boost_icon} 轉嘟圖示將立即轉嘟而非開啟轉嘟/引用之下拉選單。將引用嘟文操作移至 %{options_icon} (選項)選單中。 - setting_system_scrollbars_ui: 僅套用至基於 Safari 或 Chrome 之桌面瀏覽器 setting_use_blurhash: 彩色漸層圖樣是基於隱藏媒體內容顏色產生,所有細節將變得模糊 setting_use_pending_items: 關閉自動捲動更新,時間軸僅於點擊後更新 username: 您可以使用字幕、數字與底線 diff --git a/config/locales/sq.yml b/config/locales/sq.yml index 243f9b8a10f..e4cdf0e993e 100644 --- a/config/locales/sq.yml +++ b/config/locales/sq.yml @@ -1488,6 +1488,7 @@ sq: your_appeal_rejected: Apelimi juaj është hedhur poshtë edit_profile: other: Tjetër + privacy_redesign_body: Zgjedhja për shfaqjen e ndjekjeve dhe ndjekësve tuaj tanimë bëhet drejt e nga profili juaj. redesign_body: Përpunimi i profilit tanimë mund të kryhet drejt e nga faqja e profilit. redesign_button: Kalo atje redesign_title: Ka një rrugë të re përpunimi profili diff --git a/config/locales/sv.yml b/config/locales/sv.yml index 4434278bb0f..28f7fb5894d 100644 --- a/config/locales/sv.yml +++ b/config/locales/sv.yml @@ -744,6 +744,7 @@ sv: action_log: Granskningslogg action_taken_by: Åtgärder vidtagna av actions: + delete_description_html: De rapporterade inläggen och/eller samlingarna kommer raderas och en markör kommer registreras för att hjälpa dig att eskalera framtida överträdelser från samma konto. mark_as_sensitive_description_html: Medierna i de rapporterade inläggen kommer markeras som känsliga och en prick kommer registreras för att hjälpa dig eskalera framtida överträdelser av samma konto. other_description_html: Se fler alternativ för att kontrollera kontots beteende och anpassa kommunikationen till det rapporterade kontot. resolve_description_html: Ingen åtgärd vidtas mot det rapporterade kontot, ingen prick registreras och rapporten stängs. @@ -770,6 +771,7 @@ sv: confirm: Bekräfta confirm_action: Bekräfta modereringsåtgärd mot @%{acct} created_at: Anmäld + delete_and_resolve: Radera innehåll forwarded: Vidarebefordrad forwarded_replies_explanation: Den här rapporten är från en annans instans användare och handlar om annans instans inlägg. Det har vidarebefordrats till dig eftersom det rapporterade innehållet är som svar till en av dina användare. forwarded_to: Vidarebefordrad till %{domain} @@ -1497,6 +1499,7 @@ sv: your_appeal_rejected: Din överklagan har avvisats edit_profile: other: Övrigt + privacy_redesign_body: Valet att visa dina följare och vilka du följer görs nu direkt från din profil. redesign_body: Profilredigering kan nu nås direkt från profilsidan. redesign_button: Gå dit redesign_title: Det finns en ny profilredigeringsupplevelse diff --git a/config/locales/vi.yml b/config/locales/vi.yml index 0363073bfb5..44d247e2acd 100644 --- a/config/locales/vi.yml +++ b/config/locales/vi.yml @@ -1478,6 +1478,7 @@ vi: your_appeal_rejected: Khiếu nại của bạn bị từ chối edit_profile: other: Khác + privacy_redesign_body: Lựa chọn hiện lượt theo dõi và người theo dõi bạn giờ có thể điều chỉnh trực tiếp trên hồ sơ. redesign_body: Giờ đây, hồ sơ đã có thể chỉnh sửa trực tiếp từ trang hồ sơ. redesign_button: Tới đó redesign_title: Đã có trải nghiệm sửa hồ sơ mới diff --git a/config/locales/zh-CN.yml b/config/locales/zh-CN.yml index 966dc99de27..8a41d98676d 100644 --- a/config/locales/zh-CN.yml +++ b/config/locales/zh-CN.yml @@ -1478,6 +1478,7 @@ zh-CN: your_appeal_rejected: 你的申诉已被驳回 edit_profile: other: 其他 + privacy_redesign_body: 现在可以直接在个人资料页设置是否展示你的关注者和你关注的人。 redesign_body: 个人资料编辑功能现在可以直接在个人资料页面访问。 redesign_button: 前往 redesign_title: 全新个人资料编辑体验现已到来 diff --git a/config/locales/zh-TW.yml b/config/locales/zh-TW.yml index 5f0b9fd7c87..99647d575f1 100644 --- a/config/locales/zh-TW.yml +++ b/config/locales/zh-TW.yml @@ -1482,6 +1482,7 @@ zh-TW: your_appeal_rejected: 您的申訴已被駁回 edit_profile: other: 其他 + privacy_redesign_body: 您現在能直接於個人資料檔案頁面中選擇是否顯示您的跟隨中與跟隨者。 redesign_body: 個人檔案編輯功能現在能自個人檔案頁面直接存取。 redesign_button: 前往 redesign_title: 全新個人檔案編輯體驗 From 87024b9e1cf7f0945eae457501899216d79c9073 Mon Sep 17 00:00:00 2001 From: diondiondion Date: Mon, 8 Jun 2026 11:08:00 +0200 Subject: [PATCH 051/130] Fix alignment of icon and text in Callout component (#39324) --- .../components/callout/callout.stories.tsx | 19 ++++++++++++++----- .../components/callout/styles.module.css | 5 +++-- app/javascript/styles/mastodon/admin.scss | 5 +++-- 3 files changed, 20 insertions(+), 9 deletions(-) diff --git a/app/javascript/mastodon/components/callout/callout.stories.tsx b/app/javascript/mastodon/components/callout/callout.stories.tsx index f9bba1ec141..bb973ab71f1 100644 --- a/app/javascript/mastodon/components/callout/callout.stories.tsx +++ b/app/javascript/mastodon/components/callout/callout.stories.tsx @@ -34,6 +34,15 @@ export const Default: Story = { }, }; +export const NoTitle: Story = { + args: { + title: '', + primaryLabel: '', + secondaryLabel: '', + onClose: undefined, + }, +}; + export const NoIcon: Story = { args: { icon: false, @@ -56,11 +65,11 @@ export const OnlyText: Story = { }, }; -// export const Subtle: Story = { -// args: { -// variant: 'subtle', -// }, -// }; +export const Subtle: Story = { + args: { + variant: 'subtle', + }, +}; export const Feature: Story = { args: { diff --git a/app/javascript/mastodon/components/callout/styles.module.css b/app/javascript/mastodon/components/callout/styles.module.css index fc05e57ab3a..dd2c7535257 100644 --- a/app/javascript/mastodon/components/callout/styles.module.css +++ b/app/javascript/mastodon/components/callout/styles.module.css @@ -7,6 +7,7 @@ color: var(--color-text-primary); border-radius: 12px; font-size: 15px; + line-height: 1.3333; } .icon { @@ -14,7 +15,7 @@ border-radius: 9999px; width: 1rem; height: 1rem; - margin-top: -2px; + margin-block: -2px; } .content, @@ -46,7 +47,7 @@ h3 { font-weight: 500; - margin-bottom: 5px; + margin-bottom: 3px; } } diff --git a/app/javascript/styles/mastodon/admin.scss b/app/javascript/styles/mastodon/admin.scss index 7e5798ae542..5917f64963d 100644 --- a/app/javascript/styles/mastodon/admin.scss +++ b/app/javascript/styles/mastodon/admin.scss @@ -457,6 +457,7 @@ $content-width: 840px; color: var(--color-text-primary); border-radius: 12px; font-size: 15px; + line-height: 1.3333; margin-bottom: 30px; .icon { @@ -464,7 +465,7 @@ $content-width: 840px; border-radius: 9999px; width: 1rem; height: 1rem; - margin-top: -2px; + margin-block: -2px; background-color: var(--color-bg-brand-soft); } @@ -502,7 +503,7 @@ $content-width: 840px; .title { font-weight: 600; - margin-bottom: 8px; + margin-bottom: 6px; font-size: inherit; line-height: inherit; } From bcafd7d0c7c929f5e90fa1f64c881632a145f8b8 Mon Sep 17 00:00:00 2001 From: diondiondion Date: Mon, 8 Jun 2026 12:16:33 +0200 Subject: [PATCH 052/130] Accessibility: Move column extra buttons out of h1 column heading (#39305) --- .../mastodon/components/column_header.tsx | 17 +++++++---------- app/javascript/styles/mastodon/components.scss | 6 +++++- 2 files changed, 12 insertions(+), 11 deletions(-) diff --git a/app/javascript/mastodon/components/column_header.tsx b/app/javascript/mastodon/components/column_header.tsx index 076ca3085e9..ac0624788b5 100644 --- a/app/javascript/mastodon/components/column_header.tsx +++ b/app/javascript/mastodon/components/column_header.tsx @@ -152,7 +152,7 @@ export const ColumnHeader: React.FC = ({ active, }); - const buttonClassName = classNames('column-header', { + const headingClassName = classNames('column-header', { active, }); @@ -276,16 +276,14 @@ export const ColumnHeader: React.FC = ({ ); - const HeadingElement = hasTitle ? 'h1' : 'div'; - const component = (
- +
{hasTitle && ( - <> +

{backButton} - {onClick && ( + {onClick ? ( - )} - {!onClick && ( + ) : ( = ({ {titleContents} )} - +

)} {!hasTitle && backButton} @@ -313,7 +310,7 @@ export const ColumnHeader: React.FC = ({ {extraButton} {collapseButton}
-
+
Date: Mon, 8 Jun 2026 13:14:10 +0200 Subject: [PATCH 053/130] fix remove unused translation keys (#39326) --- config/locales/ko.yml | 2 -- 1 file changed, 2 deletions(-) diff --git a/config/locales/ko.yml b/config/locales/ko.yml index be8f0f71b37..345c9190344 100644 --- a/config/locales/ko.yml +++ b/config/locales/ko.yml @@ -492,11 +492,9 @@ ko: email_subscriptions: accounts: account: 계정 - active: 활성 empty: hint: 구독자를 가진 계정이 없습니다. no_lists_yet: 리스트가 없습니다 - inactive: 비활성 last_email: 최근 이메일 status: 상태 subscribers: 구독자 From 94918dfcd12da38e0485d47c8db811a7f2440199 Mon Sep 17 00:00:00 2001 From: Noelle Leigh <5957867+noelleleigh@users.noreply.github.com> Date: Mon, 8 Jun 2026 08:58:42 -0400 Subject: [PATCH 054/130] Fix inconsistent `keyboard_shortcuts.translate` string (#39328) --- app/javascript/mastodon/locales/en.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/javascript/mastodon/locales/en.json b/app/javascript/mastodon/locales/en.json index 3b64aeb6ded..511ae3503cb 100644 --- a/app/javascript/mastodon/locales/en.json +++ b/app/javascript/mastodon/locales/en.json @@ -846,7 +846,7 @@ "keyboard_shortcuts.toggle_sensitivity": "Show/hide media", "keyboard_shortcuts.toot": "Start a new post", "keyboard_shortcuts.top": "Move to top of list", - "keyboard_shortcuts.translate": "to translate a post", + "keyboard_shortcuts.translate": "Translate a post", "keyboard_shortcuts.unfocus": "Unfocus compose textarea/search", "keyboard_shortcuts.up": "Move up in the list", "learn_more_link.got_it": "Got it", From 51a956b6bc0eae8ebf7c7ee7bb62a167b4d18319 Mon Sep 17 00:00:00 2001 From: diondiondion Date: Mon, 8 Jun 2026 15:07:01 +0200 Subject: [PATCH 055/130] Fix tiny checkboxes and radio buttons in Safari (#39332) --- app/javascript/styles/mastodon/forms.scss | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/app/javascript/styles/mastodon/forms.scss b/app/javascript/styles/mastodon/forms.scss index d3fdf2fb214..5791b4fc001 100644 --- a/app/javascript/styles/mastodon/forms.scss +++ b/app/javascript/styles/mastodon/forms.scss @@ -500,6 +500,8 @@ code { input[type='radio'] { accent-color: var(--color-text-brand); + width: 15px; + height: 15px; } } @@ -533,6 +535,8 @@ code { label.checkbox { input[type='checkbox'] { accent-color: var(--color-text-brand); + width: 15px; + height: 15px; } } From 5553448678a8a9f4ef970948b6fb7f013e9a4238 Mon Sep 17 00:00:00 2001 From: diondiondion Date: Mon, 8 Jun 2026 15:30:10 +0200 Subject: [PATCH 056/130] [Accessibility] Patch over a11y issues caused by "simple" ruby gems (#39325) --- app/javascript/entrypoints/public.tsx | 84 ++++++++++++++++++++++ app/views/auth/registrations/new.html.haml | 6 +- 2 files changed, 87 insertions(+), 3 deletions(-) diff --git a/app/javascript/entrypoints/public.tsx b/app/javascript/entrypoints/public.tsx index 4e5b35b9734..5563b8324e6 100644 --- a/app/javascript/entrypoints/public.tsx +++ b/app/javascript/entrypoints/public.tsx @@ -181,6 +181,8 @@ async function loaded() { truncateRuleHints(); + applyRailsA11yPatches(); + const reactComponents = document.querySelectorAll('[data-component]'); if (reactComponents.length > 0) { @@ -515,6 +517,88 @@ on('click', '.rules-list button', ({ target }) => { } }); +/** + * Patch accessibility issues caused by Ruby Gems that + * don't produce accessible markup (simple-forms & simple-navigation) + */ +function applyRailsA11yPatches() { + /** + * Mark current navigation item with aria-current + */ + const activeNavLink = document.querySelector( + '.simple-navigation-active-leaf a.selected', + ); + activeNavLink?.setAttribute('aria-current', 'page'); + + /** + * Hides the asterisk added to labels of required form fields + * from assistive tech. (Those fields already have the `required` attribute) + */ + document + .querySelectorAll('.simple_form label.required abbr') + .forEach((element) => { + element.setAttribute('aria-hidden', 'true'); + }); + + /** + * Associate form field hints with their inputs via aria-describedby + */ + document + .querySelectorAll('.simple_form .field_with_hint') + .forEach((field) => { + const inputs = field.querySelectorAll< + HTMLInputElement | HTMLTextAreaElement + >("input[type='text'], input[type='checkbox'], textarea"); + + const hint = field.querySelector('.hint'); + + // Bail out if there are more than one input as + // the association can't be safely made. + if (inputs.length !== 1 || !inputs[0] || !hint) { + return; + } + + const input = inputs[0]; + const inputId = input.getAttribute('id'); + const hintId = `${inputId}_hint`; + + input.setAttribute('aria-describedby', hintId); + hint.setAttribute('id', hintId); + }); + + /** + * Add fieldset-like group labels ("legends") to the date-of-birth selector + * and groups of radio buttons + */ + const groups = document.querySelectorAll( + '.simple_form .date_of_birth, .simple_form .input.with_label.radio_buttons', + ); + groups.forEach((groupWrapper) => { + // This is the element serving as the label of the group. + const groupLabel = groupWrapper.querySelector('label'); + const labelWithId = + groupWrapper.querySelector('label[for]'); + const groupHint = groupWrapper.querySelector('.hint'); + + // We need a unique ID to generate the aria associations. If `groupLabel` + // doesn't have one, we just take the first label with a `for` attribute + // that we can find, which is fine because we'll modify it before use. + const inputId = + groupLabel?.getAttribute('for') ?? labelWithId?.getAttribute('for'); + const labelId = `${inputId}_label`; + const hintId = `${inputId}_hint`; + + groupLabel?.setAttribute('id', labelId); + groupHint?.setAttribute('id', hintId); + + groupWrapper.setAttribute('role', 'group'); + groupWrapper.setAttribute('aria-labelledby', labelId); + if (groupHint) { + groupWrapper.setAttribute('aria-describedby', hintId); + } + }); +} + function main() { ready(loaded).catch((error: unknown) => { console.error(error); diff --git a/app/views/auth/registrations/new.html.haml b/app/views/auth/registrations/new.html.haml index 6695160f58d..15e1bed973f 100644 --- a/app/views/auth/registrations/new.html.haml +++ b/app/views/auth/registrations/new.html.haml @@ -21,17 +21,17 @@ = f.simple_fields_for :account do |ff| = ff.input :username, append: "@#{site_hostname}", - input_html: { autocomplete: 'off', pattern: '[a-zA-Z0-9_]+', maxlength: Account::USERNAME_LENGTH_LIMIT, placeholder: ' ' }, + input_html: { autocomplete: 'off', pattern: '[a-zA-Z0-9_]+', maxlength: Account::USERNAME_LENGTH_LIMIT }, required: true, wrapper: :with_label = f.input :email, hint: false, - input_html: { autocomplete: 'username', placeholder: ' ' }, + input_html: { autocomplete: 'username' }, required: true, wrapper: :with_label = f.input :password, hint: false, - input_html: { autocomplete: 'new-password', minlength: User.password_length.first, maxlength: User.password_length.last, placeholder: ' ' }, + input_html: { autocomplete: 'new-password', minlength: User.password_length.first, maxlength: User.password_length.last }, required: true, wrapper: :with_label = f.input :password_confirmation, From 1bfdfcae7b695811d021412d9d3abe6a833df7e9 Mon Sep 17 00:00:00 2001 From: diondiondion Date: Mon, 8 Jun 2026 15:45:28 +0200 Subject: [PATCH 057/130] Fix broken column header layout after heading refactor (#39331) --- .../mastodon/components/column_header.tsx | 13 +++++++------ app/javascript/styles/mastodon/components.scss | 11 ++++++----- 2 files changed, 13 insertions(+), 11 deletions(-) diff --git a/app/javascript/mastodon/components/column_header.tsx b/app/javascript/mastodon/components/column_header.tsx index ac0624788b5..36ed239a477 100644 --- a/app/javascript/mastodon/components/column_header.tsx +++ b/app/javascript/mastodon/components/column_header.tsx @@ -276,17 +276,20 @@ export const ColumnHeader: React.FC = ({ ); + const titleClassNames = classNames('column-header__title', { + 'column-header__title--with-back-button': !!backButton, + }); + const component = (
+ {backButton} {hasTitle && (

- {backButton} - {onClick ? ( ) : ( @@ -304,8 +307,6 @@ export const ColumnHeader: React.FC = ({

)} - {!hasTitle && backButton} -
{extraButton} {collapseButton} diff --git a/app/javascript/styles/mastodon/components.scss b/app/javascript/styles/mastodon/components.scss index bf87acf0965..2ebe9473378 100644 --- a/app/javascript/styles/mastodon/components.scss +++ b/app/javascript/styles/mastodon/components.scss @@ -4639,14 +4639,15 @@ a.status-card { outline: 0; &__title-wrapper { + display: flex; flex-grow: 1; } &__title { display: flex; align-items: center; - width: 100%; gap: 5px; + flex-grow: 1; margin: 0; border: 0; padding: 13px; @@ -4659,6 +4660,10 @@ a.status-card { overflow: hidden; white-space: nowrap; + &--with-back-button { + padding-inline-start: 0; + } + &:focus-visible { outline: var(--outline-focus-default); } @@ -4668,10 +4673,6 @@ a.status-card { } } - .column-header__back-button + &__title { - padding-inline-start: 0; - } - .column-header__back-button { flex: 1; color: var(--color-text-brand); From 37a9048cdfc967714903ea6d0ab2bf4b25c59db9 Mon Sep 17 00:00:00 2001 From: Matt Jankowski Date: Mon, 8 Jun 2026 10:03:43 -0400 Subject: [PATCH 058/130] Remove outdated dependency comment (#39307) --- app/validators/email_address_validator.rb | 6 ------ 1 file changed, 6 deletions(-) diff --git a/app/validators/email_address_validator.rb b/app/validators/email_address_validator.rb index 7cc303a6369..48856518649 100644 --- a/app/validators/email_address_validator.rb +++ b/app/validators/email_address_validator.rb @@ -1,11 +1,5 @@ # frozen_string_literal: true -# NOTE: I initially wrote this as `EmailValidator` but it ended up clashing -# with an indirect dependency of ours, `validate_email`, which, turns out, -# has the same approach as we do, but with an extra check disallowing -# single-label domains. Decided to not switch to `validate_email` because -# we do want to allow at least `localhost`. - class EmailAddressValidator < ActiveModel::EachValidator def validate_each(record, attribute, value) value = value.strip From c4ea89dfd952e05da6edd0d47473fd4bd4834dae Mon Sep 17 00:00:00 2001 From: Claire Date: Mon, 8 Jun 2026 16:03:56 +0200 Subject: [PATCH 059/130] Change media attachment limit to 10000 characters (#39306) --- app/javascript/mastodon/features/alt_text_modal/index.tsx | 3 ++- app/models/media_attachment.rb | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/app/javascript/mastodon/features/alt_text_modal/index.tsx b/app/javascript/mastodon/features/alt_text_modal/index.tsx index fc00e60a51d..fafd4609477 100644 --- a/app/javascript/mastodon/features/alt_text_modal/index.tsx +++ b/app/javascript/mastodon/features/alt_text_modal/index.tsx @@ -54,7 +54,8 @@ const messages = defineMessages({ }, }); -const MAX_LENGTH = 1500; +// TODO: use `description_limit` from the `/api/v2/instance` response +const MAX_LENGTH = 10000; type FocalPoint = [number, number]; diff --git a/app/models/media_attachment.rb b/app/models/media_attachment.rb index 1a65a447529..5ba5277d33d 100644 --- a/app/models/media_attachment.rb +++ b/app/models/media_attachment.rb @@ -40,7 +40,7 @@ class MediaAttachment < ApplicationRecord SHORTCODE_LENGTH = 19 - MAX_DESCRIPTION_LENGTH = 1_500 + MAX_DESCRIPTION_LENGTH = 10_000 MAX_DESCRIPTION_HARD_LENGTH_LIMIT = 10_000 IMAGE_LIMIT = 16.megabytes From cf092479452434c125e6cf98b80843002d52dce6 Mon Sep 17 00:00:00 2001 From: David Roetzel Date: Mon, 8 Jun 2026 17:03:23 +0200 Subject: [PATCH 060/130] Check type of featured item and skip unsupported ones (#39327) --- .../process_featured_item_service.rb | 19 ++++++++++-- .../process_featured_item_service_spec.rb | 30 +++++++++++++++++-- 2 files changed, 45 insertions(+), 4 deletions(-) diff --git a/app/services/activitypub/process_featured_item_service.rb b/app/services/activitypub/process_featured_item_service.rb index c1470beeffb..b9769cc037e 100644 --- a/app/services/activitypub/process_featured_item_service.rb +++ b/app/services/activitypub/process_featured_item_service.rb @@ -15,6 +15,7 @@ class ActivityPub::ProcessFeaturedItemService @approval_uri = value_or_id(@item_json['featureAuthorization']) return if non_matching_uri_hosts?(@collection.uri, @item_json['id']) return if non_matching_actor_and_approval_uris? + return if non_supported_object_type? with_redis_lock("collection_item:#{@item_json['id']}") do @collection_item = existing_item || pre_approved_item || new_item @@ -39,7 +40,7 @@ class ActivityPub::ProcessFeaturedItemService def pre_approved_item # This is a local account that has authorized this item already - local_account = ActivityPub::TagManager.instance.uris_to_local_accounts([@item_json['featuredObject']]).first + local_account = ActivityPub::TagManager.instance.uris_to_local_accounts([@actor_uri]).first @collection.collection_items.accepted_partial(local_account).first if local_account.present? end @@ -49,12 +50,26 @@ class ActivityPub::ProcessFeaturedItemService ) end + def local_actor_uri? + return @local_actor_uri if instance_variable_defined?(:@local_actor_uri) + + @local_actor_uri = ActivityPub::TagManager.instance.local_uri?(@actor_uri) + end + def non_matching_actor_and_approval_uris? - return false if ActivityPub::TagManager.instance.local_uri?(@actor_uri) + return false if local_actor_uri? non_matching_uri_hosts?(@actor_uri, @approval_uri) end + def non_supported_object_type? + return false if local_actor_uri? + return false if Account.exists?(uri: @actor_uri) + + object_json = fetch_resource(@actor_uri, true) + (Array(object_json['type']) & ActivityPub::FetchRemoteActorService::SUPPORTED_TYPES).empty? + end + def verify_authorization! ActivityPub::VerifyFeaturedItemService.new.call(@collection_item, @approval_uri, request_id: @request_id) rescue Mastodon::RecursionLimitExceededError, Mastodon::UnexpectedResponseError, *Mastodon::HTTP_CONNECTION_ERRORS diff --git a/spec/services/activitypub/process_featured_item_service_spec.rb b/spec/services/activitypub/process_featured_item_service_spec.rb index 637c06c5ac0..5f071e364e7 100644 --- a/spec/services/activitypub/process_featured_item_service_spec.rb +++ b/spec/services/activitypub/process_featured_item_service_spec.rb @@ -9,7 +9,8 @@ RSpec.describe ActivityPub::ProcessFeaturedItemService do let(:collection) { Fabricate(:remote_collection, uri: 'https://other.example.com/collection/1') } let(:position) { 3 } - let(:featured_object_uri) { 'https://example.com/actor/1' } + let(:account) { Fabricate(:remote_account, uri: 'https://example.com/actor/1') } + let(:featured_object_uri) { account.uri } let(:feature_authorization_uri) { 'https://example.com/auth/1' } let(:featured_item_json) do { @@ -42,7 +43,6 @@ RSpec.describe ActivityPub::ProcessFeaturedItemService do end context 'when the actor URI does not match the approval URI' do - let(:featured_object_uri) { 'https://example.com/actor/1' } let(:feature_authorization_uri) { 'https://other.example.com/auth/1' } it 'does not create a collection item and returns `nil`' do @@ -117,6 +117,32 @@ RSpec.describe ActivityPub::ProcessFeaturedItemService do expect(collection_item.reload.uri).to eq 'https://other.example.com/featured_item/1' end end + + context 'when featured object is of an unsupported type' do + let(:hashtag_json) do + { + 'id' => 'https://example.com/hashtags/people', + 'type' => 'Hashtag', + 'name' => '#people', + } + end + let(:featured_object_uri) { hashtag_json['id'] } + + before do + stub_request(:get, featured_object_uri) + .to_return_json( + status: 200, + body: hashtag_json, + headers: { 'Content-Type' => 'application/activity+json' } + ) + end + + it 'does not create a collection item and returns `nil`' do + expect do + expect(subject.call(collection, object, position:)).to be_nil + end.to_not change(CollectionItem, :count) + end + end end context 'when only the id of the collection item is given' do From bc7e0543a3051ebc052d64e1bd2ae2b4549e51b8 Mon Sep 17 00:00:00 2001 From: Matt Jankowski Date: Mon, 8 Jun 2026 11:04:02 -0400 Subject: [PATCH 061/130] Add coverage for email subscription account controls (#39333) --- .../email_subscriptions/accounts_spec.rb | 26 ++++++++++++ .../email_subscriptions/accounts_spec.rb | 42 +++++++++++++++++++ 2 files changed, 68 insertions(+) create mode 100644 spec/requests/admin/email_subscriptions/accounts_spec.rb create mode 100644 spec/system/admin/email_subscriptions/accounts_spec.rb diff --git a/spec/requests/admin/email_subscriptions/accounts_spec.rb b/spec/requests/admin/email_subscriptions/accounts_spec.rb new file mode 100644 index 00000000000..6e609e356db --- /dev/null +++ b/spec/requests/admin/email_subscriptions/accounts_spec.rb @@ -0,0 +1,26 @@ +# frozen_string_literal: true + +require 'rails_helper' + +RSpec.describe 'Admin Email Subscriptions Accounts' do + let(:user) { Fabricate(:admin_user) } + let(:account) { Fabricate :account } + + before { sign_in user } + + context 'when feature is disabled' do + around do |example| + original = Rails.application.config.x.email_subscriptions + Rails.application.config.x.email_subscriptions = false + example.run + Rails.application.config.x.email_subscriptions = original + end + + it 'returns not found' do + get admin_email_subscriptions_account_path(account.id) + + expect(response) + .to have_http_status(404) + end + end +end diff --git a/spec/system/admin/email_subscriptions/accounts_spec.rb b/spec/system/admin/email_subscriptions/accounts_spec.rb new file mode 100644 index 00000000000..e164da2bffe --- /dev/null +++ b/spec/system/admin/email_subscriptions/accounts_spec.rb @@ -0,0 +1,42 @@ +# frozen_string_literal: true + +require 'rails_helper' + +RSpec.describe 'Admin Email Subscriptions Accounts' do + let(:account) { Fabricate :account, user: Fabricate(:user, role:) } + let(:role) { Fabricate(:user_role, permissions: UserRole::FLAGS[:manage_email_subscriptions]) } + let(:user) { Fabricate(:admin_user) } + + before { sign_in user } + + context 'when feature is enabled' do + around do |example| + original = Rails.application.config.x.email_subscriptions + Rails.application.config.x.email_subscriptions = true + example.run + Rails.application.config.x.email_subscriptions = original + end + + describe 'Managing the email subscription feature for an account' do + before { Fabricate :email_subscription, account: } + + it 'views setting status and toggles enabled' do + visit admin_email_subscriptions_account_path(account.id) + expect(page) + .to have_title(/Email newsletters of/) + + # Change from disabled to enabled + expect { click_on I18n.t('admin.email_subscriptions.accounts.show.enable_feature') } + .to change { account.reload.user_email_subscriptions_enabled? }.from(false).to(true) + + # Change back from enabled to disabled + expect { click_on I18n.t('admin.email_subscriptions.accounts.show.disable_feature') } + .to change { account.reload.user_email_subscriptions_enabled? }.from(true).to(false) + + # Delete the subscription + expect { find('.table-icon-link').click } + .to change(account.email_subscriptions, :count).by(-1) + end + end + end +end From 4ee21a6c14e97a7f8ccbab22a1de5e91dae4f042 Mon Sep 17 00:00:00 2001 From: diondiondion Date: Mon, 8 Jun 2026 17:12:56 +0200 Subject: [PATCH 062/130] [Accessibility] Allow alerts ("toasts") to be announced by assistive tech (#39335) --- app/javascript/mastodon/components/alert/index.tsx | 1 + app/javascript/mastodon/components/alerts_controller.tsx | 9 +++------ app/javascript/styles/mastodon/components.scss | 4 ++++ 3 files changed, 8 insertions(+), 6 deletions(-) diff --git a/app/javascript/mastodon/components/alert/index.tsx b/app/javascript/mastodon/components/alert/index.tsx index 8bee99130f5..3eb42ba1c61 100644 --- a/app/javascript/mastodon/components/alert/index.tsx +++ b/app/javascript/mastodon/components/alert/index.tsx @@ -53,6 +53,7 @@ export const Alert: React.FC<{ className='notification-bar__action' onClick={onActionClick} type='button' + aria-hidden='true' > {action} diff --git a/app/javascript/mastodon/components/alerts_controller.tsx b/app/javascript/mastodon/components/alerts_controller.tsx index aa97feeca58..90a222e89d0 100644 --- a/app/javascript/mastodon/components/alerts_controller.tsx +++ b/app/javascript/mastodon/components/alerts_controller.tsx @@ -11,6 +11,7 @@ import type { } from 'mastodon/models/alert'; import { useAppSelector, useAppDispatch } from 'mastodon/store'; +import { A11yLiveRegion } from './a11y_live_region'; import { Alert } from './alert'; const formatIfNeeded = ( @@ -75,12 +76,8 @@ const TimedAlert: React.FC<{ export const AlertsController: React.FC = () => { const alerts = useAppSelector((state) => state.alerts); - if (alerts.length === 0) { - return null; - } - return ( -
+ {alerts.map((alert, idx) => ( { dismissAfter={5000 + idx * 1000} /> ))} -
+ ); }; diff --git a/app/javascript/styles/mastodon/components.scss b/app/javascript/styles/mastodon/components.scss index 2ebe9473378..cb2e6e9eb21 100644 --- a/app/javascript/styles/mastodon/components.scss +++ b/app/javascript/styles/mastodon/components.scss @@ -9843,6 +9843,10 @@ noscript { display: flex; flex-direction: column; gap: 4px; + + &:empty { + display: none; + } } .notification-bar { From fc64804b4db558ba45f412d60bb1cc2ff3200af2 Mon Sep 17 00:00:00 2001 From: Matt Jankowski Date: Mon, 8 Jun 2026 11:27:34 -0400 Subject: [PATCH 063/130] Update rubocop-rspec to version 3.10.1 (#39303) --- Gemfile.lock | 7 ++++--- .../concerns/web_app_controller_concern_spec.rb | 4 ++-- spec/helpers/admin/filter_helper_spec.rb | 4 ++-- spec/helpers/application_helper_spec.rb | 6 +++--- spec/helpers/theme_helper_spec.rb | 2 +- spec/lib/emoji_formatter_spec.rb | 8 ++++---- spec/locales/i18n_spec.rb | 4 ++-- spec/requests/api/v1/statuses_spec.rb | 2 +- spec/requests/remote_interaction_helper_spec.rb | 2 +- spec/serializers/rest/admin/cohort_serializer_spec.rb | 2 +- spec/views/statuses/show.html.haml_spec.rb | 4 ++-- spec/workers/import/row_worker_spec.rb | 1 + 12 files changed, 24 insertions(+), 22 deletions(-) diff --git a/Gemfile.lock b/Gemfile.lock index dcbcb8d9b08..1ab5362854e 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -778,15 +778,16 @@ GEM lint_roller (~> 1.1) rubocop (>= 1.75.0, < 2.0) rubocop-ast (>= 1.47.1, < 2.0) - rubocop-rails (2.35.3) + rubocop-rails (2.35.4) activesupport (>= 4.2.0) lint_roller (~> 1.1) rack (>= 1.1) rubocop (>= 1.75.0, < 2.0) rubocop-ast (>= 1.44.0, < 2.0) - rubocop-rspec (3.9.0) + rubocop-rspec (3.10.2) lint_roller (~> 1.1) - rubocop (~> 1.81) + regexp_parser (>= 2.0) + rubocop (~> 1.86, >= 1.86.2) rubocop-rspec_rails (2.32.0) lint_roller (~> 1.1) rubocop (~> 1.72, >= 1.72.1) diff --git a/spec/controllers/concerns/web_app_controller_concern_spec.rb b/spec/controllers/concerns/web_app_controller_concern_spec.rb index 2e7c20a0fe1..e526720facd 100644 --- a/spec/controllers/concerns/web_app_controller_concern_spec.rb +++ b/spec/controllers/concerns/web_app_controller_concern_spec.rb @@ -31,7 +31,7 @@ RSpec.describe WebAppControllerConcern do expect(response) .to have_http_status(:success) expect(response.body) - .to match(/show/) + .to include('show') end end @@ -47,7 +47,7 @@ RSpec.describe WebAppControllerConcern do expect(response) .to have_http_status(:success) expect(response.body) - .to match(/show/) + .to include('show') end end diff --git a/spec/helpers/admin/filter_helper_spec.rb b/spec/helpers/admin/filter_helper_spec.rb index d07a6e1bb75..72cb8863c9f 100644 --- a/spec/helpers/admin/filter_helper_spec.rb +++ b/spec/helpers/admin/filter_helper_spec.rb @@ -10,12 +10,12 @@ RSpec.describe Admin::FilterHelper do allow(helper).to receive_messages(params: params, url_for: '/test') result = helper.filter_link_to('text', { resolved: true }) - expect(result).to match(/text/) + expect(result).to include('text') end it 'Uses table_link_to to create icon links' do result = helper.table_link_to 'icon', 'text', 'path' - expect(result).to match(/text/) + expect(result).to include('text') end end diff --git a/spec/helpers/application_helper_spec.rb b/spec/helpers/application_helper_spec.rb index 1b95be1d33c..cff79a7c73b 100644 --- a/spec/helpers/application_helper_spec.rb +++ b/spec/helpers/application_helper_spec.rb @@ -16,8 +16,8 @@ RSpec.describe ApplicationHelper do it 'uses the current theme and user settings classes in the result' do expect(helper.html_classes) - .to match(/system-font/) - .and match(/reduce-motion/) + .to include('system-font') + .and include('reduce-motion') end private @@ -38,7 +38,7 @@ RSpec.describe ApplicationHelper do helper.content_for(:body_classes) { 'admin' } expect(helper.body_classes) - .to match(/admin/) + .to include('admin') end end end diff --git a/spec/helpers/theme_helper_spec.rb b/spec/helpers/theme_helper_spec.rb index b6b50a7bfa5..28ae6fdddb7 100644 --- a/spec/helpers/theme_helper_spec.rb +++ b/spec/helpers/theme_helper_spec.rb @@ -12,7 +12,7 @@ RSpec.describe ThemeHelper do it 'returns the default stylesheet' do expect(html_links.last.attributes.symbolize_keys) .to include( - href: have_attributes(value: match(/default/)) + href: have_attributes(value: include('default')) ) end end diff --git a/spec/lib/emoji_formatter_spec.rb b/spec/lib/emoji_formatter_spec.rb index e5accfbb0cb..e5a0efa20f2 100644 --- a/spec/lib/emoji_formatter_spec.rb +++ b/spec/lib/emoji_formatter_spec.rb @@ -26,7 +26,7 @@ RSpec.describe EmojiFormatter do let(:text) { preformat_text(':coolcat: Beep boop') } it 'converts the shortcode to an image tag' do - expect(subject).to match(/:coolcat: be_a(Array).and( all(include('date' => match_api_datetime_format)) ), - 'period' => match(/2024-01-01/).and(match_api_datetime_format) + 'period' => include('2024-01-01').and(match_api_datetime_format) ) end end diff --git a/spec/views/statuses/show.html.haml_spec.rb b/spec/views/statuses/show.html.haml_spec.rb index 02b1fe73842..1b592320349 100644 --- a/spec/views/statuses/show.html.haml_spec.rb +++ b/spec/views/statuses/show.html.haml_spec.rb @@ -23,13 +23,13 @@ RSpec.describe 'statuses/show.html.haml' do expect(header_tags) .to match(//) - .and match(//) + .and include('') .and match(//) .and match(%r{}) expect(header_tags) .to match(%r{}) - .and match(//) + .and include('') end def header_tags diff --git a/spec/workers/import/row_worker_spec.rb b/spec/workers/import/row_worker_spec.rb index f173d497068..20de7831f84 100644 --- a/spec/workers/import/row_worker_spec.rb +++ b/spec/workers/import/row_worker_spec.rb @@ -20,6 +20,7 @@ RSpec.describe Import::RowWorker do shared_context 'when service errors' do let(:service_double) { instance_double(BulkImportRowService) } + before { allow(service_double).to receive(:call).and_raise('dummy error') } end From 4a5a915e86a7eb3ccef4206ce69a8b89d9672c2b Mon Sep 17 00:00:00 2001 From: Nicholas La Roux Date: Mon, 8 Jun 2026 18:01:20 +0200 Subject: [PATCH 064/130] Migrate a few tests to use `NotificationAssertions` (#38098) --- spec/lib/request_pool_spec.rb | 10 ++++++++-- spec/models/setting_spec.rb | 15 ++++++--------- spec/rails_helper.rb | 1 + 3 files changed, 15 insertions(+), 11 deletions(-) diff --git a/spec/lib/request_pool_spec.rb b/spec/lib/request_pool_spec.rb index 2e8c785de8b..8df73391566 100644 --- a/spec/lib/request_pool_spec.rb +++ b/spec/lib/request_pool_spec.rb @@ -52,11 +52,17 @@ RSpec.describe RequestPool do end it 'closes the connections' do - subject.with('http://example.com') do |http_client| - http_client.get('/').flush + notifications = capture_notifications('with.request_pool') do + subject.with('http://example.com') do |http_client| + http_client.get('/').flush + end end expect { reaper_observes_idle_timeout }.to change(subject, :size).from(1).to(0) + + expect(notifications.size).to eq(1) + expect(notifications.first.payload[:host]).to eq('http://example.com') + expect(notifications.first.payload[:miss]).to be(true) end def reaper_observes_idle_timeout diff --git a/spec/models/setting_spec.rb b/spec/models/setting_spec.rb index a1e24e83507..d4b06612178 100644 --- a/spec/models/setting_spec.rb +++ b/spec/models/setting_spec.rb @@ -36,14 +36,12 @@ RSpec.describe Setting do context 'when the setting has been saved to database' do it 'returns the value from database' do - callback = double - allow(callback).to receive(:call) - - ActiveSupport::Notifications.subscribed callback, 'sql.active_record' do + notifications = capture_notifications('sql.active_record') do expect(described_class[key]).to eq 42 end - expect(callback).to have_received(:call) + expect(notifications.size).to eq(1) + expect(notifications.first.payload[:name]).to eq('Setting Load') end end @@ -62,12 +60,11 @@ RSpec.describe Setting do end it 'does not query the database' do - callback = double - allow(callback).to receive(:call) - ActiveSupport::Notifications.subscribed callback, 'sql.active_record' do + notifications = capture_notifications('sql.active_record') do described_class[key] end - expect(callback).to_not have_received(:call) + + expect(notifications).to be_empty end it 'returns the cached value' do diff --git a/spec/rails_helper.rb b/spec/rails_helper.rb index 02bd2ef25ec..55ad344b80a 100644 --- a/spec/rails_helper.rb +++ b/spec/rails_helper.rb @@ -82,6 +82,7 @@ RSpec.configure do |config| config.include Devise::Test::IntegrationHelpers, type: :request config.include ActionMailer::TestHelper config.include Paperclip::Shoulda::Matchers + config.include ActiveSupport::Testing::NotificationAssertions config.include ActiveSupport::Testing::TimeHelpers config.include Chewy::Rspec::Helpers config.include Redisable From 481e51b81e4009ad14192ba6ee3f896bfe77d28f Mon Sep 17 00:00:00 2001 From: Claire Date: Tue, 9 Jun 2026 10:30:43 +0200 Subject: [PATCH 065/130] Put Elasticsearch search queries behind a Stoplight (#39323) --- app/services/account_search_service.rb | 6 ++++-- app/services/concerns/search_stoplight.rb | 15 +++++++++++++++ app/services/statuses_search_service.rb | 6 ++++-- 3 files changed, 23 insertions(+), 4 deletions(-) create mode 100644 app/services/concerns/search_stoplight.rb diff --git a/app/services/account_search_service.rb b/app/services/account_search_service.rb index 6c24c5da8d4..64defd31c32 100644 --- a/app/services/account_search_service.rb +++ b/app/services/account_search_service.rb @@ -1,6 +1,8 @@ # frozen_string_literal: true class AccountSearchService < BaseService + include SearchStoplight + attr_reader :query, :limit, :offset, :options, :account MENTION_ONLY_RE = /\A#{Account::MENTION_RE}\z/i @@ -251,12 +253,12 @@ class AccountSearchService < BaseService end end - records = query_builder.build.limit(limit_for_non_exact_results).offset(offset).objects.compact + records = elastic_stoplight_wrapper.run { query_builder.build.limit(limit_for_non_exact_results).offset(offset).objects.compact } ActiveRecord::Associations::Preloader.new(records: records, associations: [:account_stat, { user: :role }]).call records - rescue Faraday::ConnectionFailed, Parslet::ParseFailed, Errno::ENETUNREACH + rescue Stoplight::Error::RedLight, Faraday::ConnectionFailed, Parslet::ParseFailed, Errno::ENETUNREACH, OpenSSL::SSL::SSLError, Elastic::Transport::Transport::Error nil end diff --git a/app/services/concerns/search_stoplight.rb b/app/services/concerns/search_stoplight.rb new file mode 100644 index 00000000000..c7f12a3becc --- /dev/null +++ b/app/services/concerns/search_stoplight.rb @@ -0,0 +1,15 @@ +# frozen_string_literal: true + +module SearchStoplight + STOPLIGHT_COOL_OFF_TIME = 5.minutes.seconds + STOPLIGHT_THRESHOLD = 10 + + def elastic_stoplight_wrapper + Stoplight( + 'search:elasticsearch', + cool_off_time: STOPLIGHT_COOL_OFF_TIME, + threshold: STOPLIGHT_THRESHOLD, + tracked_errors: [Faraday::ConnectionFailed, Errno::ENETUNREACH, OpenSSL::SSL::SSLError, Elastic::Transport::Transport::Error] + ) + end +end diff --git a/app/services/statuses_search_service.rb b/app/services/statuses_search_service.rb index 3147349d707..8eda1a14306 100644 --- a/app/services/statuses_search_service.rb +++ b/app/services/statuses_search_service.rb @@ -1,6 +1,8 @@ # frozen_string_literal: true class StatusesSearchService < BaseService + include SearchStoplight + def call(query, account = nil, options = {}) MastodonOTELTracer.in_span('StatusesSearchService#call') do |span| @query = query&.strip @@ -26,14 +28,14 @@ class StatusesSearchService < BaseService def status_search_results request = parsed_query.request - results = request.collapse(field: :id).order(id: { order: :desc }).limit(@limit).offset(@offset).objects.compact + results = elastic_stoplight_wrapper.run { request.collapse(field: :id).order(id: { order: :desc }).limit(@limit).offset(@offset).objects.compact } account_ids = results.map(&:account_id) account_domains = results.map(&:account_domain) @account.preload_relations!(account_ids, account_domains) results.reject { |status| StatusFilter.new(status, @account).filtered? } - rescue Faraday::ConnectionFailed, Parslet::ParseFailed, Errno::ENETUNREACH + rescue Stoplight::Error::RedLight, Faraday::ConnectionFailed, Parslet::ParseFailed, Errno::ENETUNREACH, OpenSSL::SSL::SSLError, Elastic::Transport::Transport::Error [] end From 0b0cdd7a77639b30766b19976a6b9fd3277db6bb Mon Sep 17 00:00:00 2001 From: Claire Date: Tue, 9 Jun 2026 10:30:48 +0200 Subject: [PATCH 066/130] Remove doorkeeper workaround (#39336) --- config/application.rb | 3 +++ config/initializers/doorkeeper.rb | 6 ------ 2 files changed, 3 insertions(+), 6 deletions(-) diff --git a/config/application.rb b/config/application.rb index 5c5de3e23ac..09fe38065e3 100644 --- a/config/application.rb +++ b/config/application.rb @@ -111,6 +111,9 @@ module Mastodon end config.to_prepare do + Doorkeeper::Application.include ApplicationExtension + Doorkeeper::AccessGrant.include AccessGrantExtension + Doorkeeper::AccessToken.include AccessTokenExtension Devise::FailureApp.include AbstractController::Callbacks Devise::FailureApp.include Localized end diff --git a/config/initializers/doorkeeper.rb b/config/initializers/doorkeeper.rb index 2fb690032ab..908acb55033 100644 --- a/config/initializers/doorkeeper.rb +++ b/config/initializers/doorkeeper.rb @@ -179,9 +179,3 @@ Doorkeeper.configure do # WWW-Authenticate Realm (default "Doorkeeper"). # realm "Doorkeeper" end - -Rails.application.reloader.to_prepare do - Doorkeeper.config.application_model.include ApplicationExtension - Doorkeeper.config.access_grant_model.include AccessGrantExtension - Doorkeeper.config.access_token_model.include AccessTokenExtension -end From 422d0e4e202bab642703792d0644556af28a3928 Mon Sep 17 00:00:00 2001 From: Claire Date: Tue, 9 Jun 2026 10:30:53 +0200 Subject: [PATCH 067/130] Add duration to ActivityPub representation of media attachments (#38061) --- app/serializers/activitypub/note_serializer.rb | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/app/serializers/activitypub/note_serializer.rb b/app/serializers/activitypub/note_serializer.rb index a8e1315beef..d67770933b8 100644 --- a/app/serializers/activitypub/note_serializer.rb +++ b/app/serializers/activitypub/note_serializer.rb @@ -257,6 +257,7 @@ class ActivityPub::NoteSerializer < ActivityPub::Serializer attribute :focal_point, if: :focal_point? attribute :width, if: :width? attribute :height, if: :height? + attribute :duration, if: :duration? has_one :icon, serializer: ActivityPub::ImageSerializer, if: :thumbnail? @@ -300,6 +301,10 @@ class ActivityPub::NoteSerializer < ActivityPub::Serializer object.file.meta&.dig('original', 'height').present? end + def duration? + object.file.meta&.dig('original', 'duration').present? + end + def width object.file.meta.dig('original', 'width') end @@ -307,6 +312,10 @@ class ActivityPub::NoteSerializer < ActivityPub::Serializer def height object.file.meta.dig('original', 'height') end + + def duration + object.file.meta.dig('original', 'duration').seconds.iso8601 + end end class MentionSerializer < ActivityPub::Serializer From 4f062c8c7bf4d4c8b6d4f575c63f1e00b53fc2e3 Mon Sep 17 00:00:00 2001 From: Matt Jankowski Date: Tue, 9 Jun 2026 04:52:38 -0400 Subject: [PATCH 068/130] Fix intermittent failure with order dependent RankedTrend `locales` pluck (#39338) --- spec/support/examples/models/concerns/ranked_trend.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spec/support/examples/models/concerns/ranked_trend.rb b/spec/support/examples/models/concerns/ranked_trend.rb index 827165cc836..723674bf5f1 100644 --- a/spec/support/examples/models/concerns/ranked_trend.rb +++ b/spec/support/examples/models/concerns/ranked_trend.rb @@ -34,7 +34,7 @@ RSpec.shared_examples 'RankedTrend' do it 'returns unique set of languages' do expect(described_class.locales) - .to eq(['en', 'es']) + .to contain_exactly('en', 'es') end end From 7b858ec3e6efe642cbecaa2e52078f82c9851d64 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Tue, 9 Jun 2026 11:25:45 +0200 Subject: [PATCH 069/130] New Crowdin Translations (automated) (#39341) Co-authored-by: GitHub Actions --- app/javascript/mastodon/locales/ar.json | 1 - app/javascript/mastodon/locales/az.json | 1 - app/javascript/mastodon/locales/be.json | 2 +- app/javascript/mastodon/locales/bg.json | 1 - app/javascript/mastodon/locales/br.json | 1 - app/javascript/mastodon/locales/ca.json | 1 - app/javascript/mastodon/locales/cs.json | 1 - app/javascript/mastodon/locales/cy.json | 1 - app/javascript/mastodon/locales/da.json | 2 +- app/javascript/mastodon/locales/el.json | 2 +- app/javascript/mastodon/locales/en-GB.json | 1 - app/javascript/mastodon/locales/eo.json | 1 - app/javascript/mastodon/locales/es-AR.json | 2 +- app/javascript/mastodon/locales/es-MX.json | 2 +- app/javascript/mastodon/locales/es.json | 2 +- app/javascript/mastodon/locales/et.json | 1 - app/javascript/mastodon/locales/eu.json | 1 - app/javascript/mastodon/locales/fa.json | 1 - app/javascript/mastodon/locales/fi.json | 1 + app/javascript/mastodon/locales/fo.json | 1 - app/javascript/mastodon/locales/fr-CA.json | 2 +- app/javascript/mastodon/locales/fr.json | 2 +- app/javascript/mastodon/locales/fy.json | 1 - app/javascript/mastodon/locales/ga.json | 2 +- app/javascript/mastodon/locales/gd.json | 1 - app/javascript/mastodon/locales/gl.json | 1 - app/javascript/mastodon/locales/he.json | 1 - app/javascript/mastodon/locales/ia.json | 1 - app/javascript/mastodon/locales/io.json | 1 - app/javascript/mastodon/locales/is.json | 2 +- app/javascript/mastodon/locales/it.json | 2 +- app/javascript/mastodon/locales/ja.json | 1 - app/javascript/mastodon/locales/kab.json | 1 - app/javascript/mastodon/locales/ko.json | 1 - app/javascript/mastodon/locales/lad.json | 1 - app/javascript/mastodon/locales/lt.json | 1 - app/javascript/mastodon/locales/lv.json | 12 ++++++++---- app/javascript/mastodon/locales/nan-TW.json | 1 - app/javascript/mastodon/locales/nl.json | 2 +- app/javascript/mastodon/locales/nn.json | 1 - app/javascript/mastodon/locales/no.json | 1 - app/javascript/mastodon/locales/pa.json | 1 - app/javascript/mastodon/locales/pl.json | 1 - app/javascript/mastodon/locales/pt-BR.json | 2 +- app/javascript/mastodon/locales/pt-PT.json | 1 - app/javascript/mastodon/locales/ru.json | 1 - app/javascript/mastodon/locales/sc.json | 1 - app/javascript/mastodon/locales/si.json | 1 - app/javascript/mastodon/locales/sk.json | 1 - app/javascript/mastodon/locales/sl.json | 1 - app/javascript/mastodon/locales/sq.json | 1 - app/javascript/mastodon/locales/sv.json | 1 - app/javascript/mastodon/locales/th.json | 1 - app/javascript/mastodon/locales/tok.json | 1 - app/javascript/mastodon/locales/tr.json | 10 +++++++++- app/javascript/mastodon/locales/uk.json | 1 - app/javascript/mastodon/locales/vi.json | 1 - config/locales/da.yml | 17 +++++++++++++++++ config/locales/doorkeeper.lv.yml | 2 +- config/locales/el.yml | 17 +++++++++++++++++ config/locales/es-AR.yml | 17 +++++++++++++++++ config/locales/es-MX.yml | 19 +++++++++++++++++++ config/locales/es.yml | 21 ++++++++++++++++++++- config/locales/fi.yml | 19 +++++++++++++++++++ config/locales/fr-CA.yml | 17 +++++++++++++++++ config/locales/fr.yml | 17 +++++++++++++++++ config/locales/ga.yml | 17 +++++++++++++++++ config/locales/hu.yml | 18 ++++++++++++++++++ config/locales/is.yml | 12 ++++++++++++ config/locales/it.yml | 17 +++++++++++++++++ config/locales/lv.yml | 12 ++++++------ config/locales/nl.yml | 17 +++++++++++++++++ config/locales/pt-BR.yml | 17 +++++++++++++++++ config/locales/simple_form.lv.yml | 8 ++++---- config/locales/tr.yml | 18 ++++++++++++++++++ config/locales/zh-CN.yml | 17 +++++++++++++++++ config/locales/zh-TW.yml | 17 +++++++++++++++++ 77 files changed, 335 insertions(+), 71 deletions(-) diff --git a/app/javascript/mastodon/locales/ar.json b/app/javascript/mastodon/locales/ar.json index 839ab07a37c..34395087774 100644 --- a/app/javascript/mastodon/locales/ar.json +++ b/app/javascript/mastodon/locales/ar.json @@ -761,7 +761,6 @@ "keyboard_shortcuts.toggle_hidden": "لعرض أو إخفاء النص مِن وراء التحذير", "keyboard_shortcuts.toggle_sensitivity": "لعرض/إخفاء الوسائط", "keyboard_shortcuts.toot": "للشروع في تحرير منشور جديد", - "keyboard_shortcuts.translate": "لترجمة منشور", "keyboard_shortcuts.unfocus": "لإلغاء التركيز على حقل النص أو نافذة البحث", "keyboard_shortcuts.up": "للانتقال إلى أعلى القائمة", "learn_more_link.got_it": "مفهوم", diff --git a/app/javascript/mastodon/locales/az.json b/app/javascript/mastodon/locales/az.json index 4be0facc60e..95c6cd5bce3 100644 --- a/app/javascript/mastodon/locales/az.json +++ b/app/javascript/mastodon/locales/az.json @@ -535,7 +535,6 @@ "keyboard_shortcuts.toggle_hidden": "CW arxasındakı mətni göstər/gizlət", "keyboard_shortcuts.toggle_sensitivity": "Medianı göstər/gizlət", "keyboard_shortcuts.toot": "Yeni bir göndəriş başlat", - "keyboard_shortcuts.translate": "bir göndərişi tərcümə etmək üçün", "keyboard_shortcuts.unfocus": "Fokusu göndəriş yazma xanasından/axtarışdan götür", "keyboard_shortcuts.up": "Siyahıda yuxarı daşı", "learn_more_link.got_it": "Anladım", diff --git a/app/javascript/mastodon/locales/be.json b/app/javascript/mastodon/locales/be.json index 06c7f961aea..cfef805f01e 100644 --- a/app/javascript/mastodon/locales/be.json +++ b/app/javascript/mastodon/locales/be.json @@ -846,7 +846,7 @@ "keyboard_shortcuts.toggle_sensitivity": "Паказаць/схаваць медыя", "keyboard_shortcuts.toot": "Стварыць новы допіс", "keyboard_shortcuts.top": "Перайсці да вяршыні спіса", - "keyboard_shortcuts.translate": "каб перакласці допіс", + "keyboard_shortcuts.translate": "Перакласці допіс", "keyboard_shortcuts.unfocus": "Расфакусіраваць тэкставую вобласць/пошукавы радок", "keyboard_shortcuts.up": "Перамясціцца ўверх па спісе", "learn_more_link.got_it": "Зразумеў(-ла)", diff --git a/app/javascript/mastodon/locales/bg.json b/app/javascript/mastodon/locales/bg.json index d7e48086bcc..89c317c9ab7 100644 --- a/app/javascript/mastodon/locales/bg.json +++ b/app/javascript/mastodon/locales/bg.json @@ -452,7 +452,6 @@ "keyboard_shortcuts.toggle_hidden": "Показване/скриване на текст зад предупреждение на съдържание", "keyboard_shortcuts.toggle_sensitivity": "Показване/скриване на мултимедията", "keyboard_shortcuts.toot": "Начало на нова публикация", - "keyboard_shortcuts.translate": "за превод на публикация", "keyboard_shortcuts.unfocus": "Разфокусиране на текстовото поле за съставяне/търсене", "keyboard_shortcuts.up": "Преместване нагоре в списъка", "learn_more_link.got_it": "Разбрах", diff --git a/app/javascript/mastodon/locales/br.json b/app/javascript/mastodon/locales/br.json index a852e98cea8..85fc6cd9337 100644 --- a/app/javascript/mastodon/locales/br.json +++ b/app/javascript/mastodon/locales/br.json @@ -432,7 +432,6 @@ "keyboard_shortcuts.toggle_hidden": "da guzhat/ziguzhat an desten a-dreñv CW", "keyboard_shortcuts.toggle_sensitivity": "da guzhat/ziguzhat ur media", "keyboard_shortcuts.toot": "Kregiñ gant un embannadur nevez", - "keyboard_shortcuts.translate": "da dreiñ un embannadur", "keyboard_shortcuts.unfocus": "Difokus an dachenn testenn/klask", "keyboard_shortcuts.up": "Pignat er roll", "learn_more_link.got_it": "Mat eo", diff --git a/app/javascript/mastodon/locales/ca.json b/app/javascript/mastodon/locales/ca.json index f8a00143b4f..2497189b410 100644 --- a/app/javascript/mastodon/locales/ca.json +++ b/app/javascript/mastodon/locales/ca.json @@ -547,7 +547,6 @@ "keyboard_shortcuts.toggle_sensitivity": "Mostra/amaga contingut", "keyboard_shortcuts.toot": "Escriu un nou tut", "keyboard_shortcuts.top": "Mou al capdamunt de la llista", - "keyboard_shortcuts.translate": "per a traduir una publicació", "keyboard_shortcuts.unfocus": "Descentra l'àrea de composició de text/cerca", "keyboard_shortcuts.up": "Apuja a la llista", "learn_more_link.got_it": "Entesos", diff --git a/app/javascript/mastodon/locales/cs.json b/app/javascript/mastodon/locales/cs.json index c2515f037b6..2bff4a8da22 100644 --- a/app/javascript/mastodon/locales/cs.json +++ b/app/javascript/mastodon/locales/cs.json @@ -607,7 +607,6 @@ "keyboard_shortcuts.toggle_sensitivity": "Zobrazit/skrýt média", "keyboard_shortcuts.toot": "Začít nový příspěvek", "keyboard_shortcuts.top": "Přesunout na začátek seznamu", - "keyboard_shortcuts.translate": "k přeložení příspěvku", "keyboard_shortcuts.unfocus": "Zrušit zaměření na nový příspěvek/hledání", "keyboard_shortcuts.up": "Posunout v seznamu nahoru", "learn_more_link.got_it": "Rozumím", diff --git a/app/javascript/mastodon/locales/cy.json b/app/javascript/mastodon/locales/cy.json index fdd35c3a95e..d919fda4bd4 100644 --- a/app/javascript/mastodon/locales/cy.json +++ b/app/javascript/mastodon/locales/cy.json @@ -828,7 +828,6 @@ "keyboard_shortcuts.toggle_sensitivity": "Dangos/cuddio cyfryngau", "keyboard_shortcuts.toot": "Dechrau post newydd", "keyboard_shortcuts.top": "Symud i frig y rhestr", - "keyboard_shortcuts.translate": "i gyfieithu postiad", "keyboard_shortcuts.unfocus": "Dad-ffocysu ardal cyfansoddi testun/chwilio", "keyboard_shortcuts.up": "Symud yn uwch yn y rhestr", "learn_more_link.got_it": "Iawn", diff --git a/app/javascript/mastodon/locales/da.json b/app/javascript/mastodon/locales/da.json index 96e2fcb5df6..172923513f4 100644 --- a/app/javascript/mastodon/locales/da.json +++ b/app/javascript/mastodon/locales/da.json @@ -846,7 +846,7 @@ "keyboard_shortcuts.toggle_sensitivity": "Vis/skjul medier", "keyboard_shortcuts.toot": "Påbegynd nyt indlæg", "keyboard_shortcuts.top": "Flyt til toppen af listen", - "keyboard_shortcuts.translate": "for at oversætte et indlæg", + "keyboard_shortcuts.translate": "Oversæt et indlæg", "keyboard_shortcuts.unfocus": "Fjern fokus fra tekstskrivningsområde/søgning", "keyboard_shortcuts.up": "Flyt opad på listen", "learn_more_link.got_it": "Forstået", diff --git a/app/javascript/mastodon/locales/el.json b/app/javascript/mastodon/locales/el.json index 76ad93350f8..0d7850f09c5 100644 --- a/app/javascript/mastodon/locales/el.json +++ b/app/javascript/mastodon/locales/el.json @@ -846,7 +846,7 @@ "keyboard_shortcuts.toggle_sensitivity": "Εμφάνιση/απόκρυψη πολυμέσων", "keyboard_shortcuts.toot": "Δημιουργία νέας ανάρτησης", "keyboard_shortcuts.top": "Μετακίνηση στην κορυφή της λίστας", - "keyboard_shortcuts.translate": "για να μεταφραστεί μια ανάρτηση", + "keyboard_shortcuts.translate": "Μετάφραση μιας ανάρτησης", "keyboard_shortcuts.unfocus": "Αποεστίαση του πεδίου σύνθεσης/αναζήτησης", "keyboard_shortcuts.up": "Μετακίνηση προς τα πάνω στη λίστα", "learn_more_link.got_it": "Το κατάλαβα", diff --git a/app/javascript/mastodon/locales/en-GB.json b/app/javascript/mastodon/locales/en-GB.json index dd92c9c3787..613c8d04911 100644 --- a/app/javascript/mastodon/locales/en-GB.json +++ b/app/javascript/mastodon/locales/en-GB.json @@ -846,7 +846,6 @@ "keyboard_shortcuts.toggle_sensitivity": "Show/hide media", "keyboard_shortcuts.toot": "to start a brand new post", "keyboard_shortcuts.top": "Move to top of list", - "keyboard_shortcuts.translate": "to translate a post", "keyboard_shortcuts.unfocus": "to un-focus compose textarea/search", "keyboard_shortcuts.up": "Move up in the list", "learn_more_link.got_it": "Got it", diff --git a/app/javascript/mastodon/locales/eo.json b/app/javascript/mastodon/locales/eo.json index fa90d2d54c2..dcd95629adc 100644 --- a/app/javascript/mastodon/locales/eo.json +++ b/app/javascript/mastodon/locales/eo.json @@ -466,7 +466,6 @@ "keyboard_shortcuts.toggle_hidden": "Montri/kaŝi tekston malantaŭ CW", "keyboard_shortcuts.toggle_sensitivity": "Montri/kaŝi vidaŭdaĵojn", "keyboard_shortcuts.toot": "Komencu novan afiŝon", - "keyboard_shortcuts.translate": "Traduki afiŝon", "keyboard_shortcuts.unfocus": "Senfokusigi verki tekstareon/serĉon", "keyboard_shortcuts.up": "Movu supren en la listo", "learn_more_link.got_it": "Komprenite", diff --git a/app/javascript/mastodon/locales/es-AR.json b/app/javascript/mastodon/locales/es-AR.json index c4ac658b686..30540fa0a93 100644 --- a/app/javascript/mastodon/locales/es-AR.json +++ b/app/javascript/mastodon/locales/es-AR.json @@ -846,7 +846,7 @@ "keyboard_shortcuts.toggle_sensitivity": "Mostrar/ocultar medios", "keyboard_shortcuts.toot": "Comenzar un mensaje nuevo", "keyboard_shortcuts.top": "Mover al principio de la lista", - "keyboard_shortcuts.translate": "para traducir un mensaje", + "keyboard_shortcuts.translate": "Traducir una publicación", "keyboard_shortcuts.unfocus": "Quitar el foco del área de texto de redacción o de búsqueda", "keyboard_shortcuts.up": "Subir en la lista", "learn_more_link.got_it": "Entendido", diff --git a/app/javascript/mastodon/locales/es-MX.json b/app/javascript/mastodon/locales/es-MX.json index d41fb39106c..e09e8edf58c 100644 --- a/app/javascript/mastodon/locales/es-MX.json +++ b/app/javascript/mastodon/locales/es-MX.json @@ -846,7 +846,7 @@ "keyboard_shortcuts.toggle_sensitivity": "Mostrar/ocultar multimedia", "keyboard_shortcuts.toot": "Comenzar una nueva publicación", "keyboard_shortcuts.top": "Mover al principio de la lista", - "keyboard_shortcuts.translate": "para traducir una publicación", + "keyboard_shortcuts.translate": "Traducir una publicación", "keyboard_shortcuts.unfocus": "Desenfocar área de redacción/búsqueda", "keyboard_shortcuts.up": "Ascender en la lista", "learn_more_link.got_it": "Entendido", diff --git a/app/javascript/mastodon/locales/es.json b/app/javascript/mastodon/locales/es.json index f00bf988324..2b9aca3c47c 100644 --- a/app/javascript/mastodon/locales/es.json +++ b/app/javascript/mastodon/locales/es.json @@ -846,7 +846,7 @@ "keyboard_shortcuts.toggle_sensitivity": "Mostrar/ocultar multimedia", "keyboard_shortcuts.toot": "Comenzar una nueva publicación", "keyboard_shortcuts.top": "Mover al principio de la lista", - "keyboard_shortcuts.translate": "para traducir una publicación", + "keyboard_shortcuts.translate": "Traducir una publicación", "keyboard_shortcuts.unfocus": "Quitar el foco de la caja de redacción/búsqueda", "keyboard_shortcuts.up": "Moverse hacia arriba en la lista", "learn_more_link.got_it": "Entendido", diff --git a/app/javascript/mastodon/locales/et.json b/app/javascript/mastodon/locales/et.json index f8eabe8f6fc..9d5e833803a 100644 --- a/app/javascript/mastodon/locales/et.json +++ b/app/javascript/mastodon/locales/et.json @@ -838,7 +838,6 @@ "keyboard_shortcuts.toggle_sensitivity": "Näita/peida meediat", "keyboard_shortcuts.toot": "Alusta uut postitust", "keyboard_shortcuts.top": "Tõsta loendi algusesse", - "keyboard_shortcuts.translate": "postituse tõlkimiseks", "keyboard_shortcuts.unfocus": "Fookus tekstialalt/otsingult ära", "keyboard_shortcuts.up": "Liigu loetelus üles", "learn_more_link.got_it": "Sain aru", diff --git a/app/javascript/mastodon/locales/eu.json b/app/javascript/mastodon/locales/eu.json index 11f140560c8..7a8b23ed4d3 100644 --- a/app/javascript/mastodon/locales/eu.json +++ b/app/javascript/mastodon/locales/eu.json @@ -515,7 +515,6 @@ "keyboard_shortcuts.toggle_sensitivity": "multimedia erakutsi/ezkutatzeko", "keyboard_shortcuts.toot": "Hasi bidalketa berri bat", "keyboard_shortcuts.top": "Mugitu zerrendaren hasierara", - "keyboard_shortcuts.translate": "bidalketa itzultzeko", "keyboard_shortcuts.unfocus": "testua konposatzeko area / bilaketatik fokua kentzea", "keyboard_shortcuts.up": "zerrendan gora mugitzea", "learn_more_link.got_it": "Ulertuta", diff --git a/app/javascript/mastodon/locales/fa.json b/app/javascript/mastodon/locales/fa.json index f73d5044755..c341c05d322 100644 --- a/app/javascript/mastodon/locales/fa.json +++ b/app/javascript/mastodon/locales/fa.json @@ -821,7 +821,6 @@ "keyboard_shortcuts.toggle_sensitivity": "نمایش/نهفتن رسانه", "keyboard_shortcuts.toot": "شروع یک فرستهٔ جدید", "keyboard_shortcuts.top": "جابه‌جایی به بالای سیاهه", - "keyboard_shortcuts.translate": "برای ترجمه یک پست", "keyboard_shortcuts.unfocus": "برداشتن تمرکز از ناحیهٔ نوشتن یا جست‌وجو", "keyboard_shortcuts.up": "بالا بردن در سیاهه", "learn_more_link.got_it": "متوجه شدم", diff --git a/app/javascript/mastodon/locales/fi.json b/app/javascript/mastodon/locales/fi.json index 9831a52c26a..d3940571daa 100644 --- a/app/javascript/mastodon/locales/fi.json +++ b/app/javascript/mastodon/locales/fi.json @@ -919,6 +919,7 @@ "navigation_bar.live_feed_local": "Livesyöte (paikallinen)", "navigation_bar.live_feed_public": "Livesyöte (julkinen)", "navigation_bar.logout": "Kirjaudu ulos", + "navigation_bar.main": "Pääosio", "navigation_bar.moderation": "Moderointi", "navigation_bar.more": "Lisää", "navigation_bar.mutes": "Mykistetyt käyttäjät", diff --git a/app/javascript/mastodon/locales/fo.json b/app/javascript/mastodon/locales/fo.json index 4f4df1d18ee..561ff6259b8 100644 --- a/app/javascript/mastodon/locales/fo.json +++ b/app/javascript/mastodon/locales/fo.json @@ -650,7 +650,6 @@ "keyboard_shortcuts.toggle_sensitivity": "Vís ella fjal innihald", "keyboard_shortcuts.toot": "Byrja nýggjan post", "keyboard_shortcuts.top": "Flyt til ovast á listanum", - "keyboard_shortcuts.translate": "at umseta ein post", "keyboard_shortcuts.unfocus": "Tak skrivi-/leiti-økið úr miðdeplinum", "keyboard_shortcuts.up": "Flyt upp á listanum", "learn_more_link.got_it": "Eg skilji", diff --git a/app/javascript/mastodon/locales/fr-CA.json b/app/javascript/mastodon/locales/fr-CA.json index 839796ffdfe..f422a4e1be3 100644 --- a/app/javascript/mastodon/locales/fr-CA.json +++ b/app/javascript/mastodon/locales/fr-CA.json @@ -846,7 +846,7 @@ "keyboard_shortcuts.toggle_sensitivity": "Afficher/cacher médias", "keyboard_shortcuts.toot": "Commencer un nouveau message", "keyboard_shortcuts.top": "Mettre en tête de liste", - "keyboard_shortcuts.translate": "traduire un message", + "keyboard_shortcuts.translate": "Traduire un message", "keyboard_shortcuts.unfocus": "Ne plus se concentrer sur la zone de rédaction/barre de recherche", "keyboard_shortcuts.up": "Monter dans la liste", "learn_more_link.got_it": "Compris", diff --git a/app/javascript/mastodon/locales/fr.json b/app/javascript/mastodon/locales/fr.json index d4dcae1f966..bcc90a26208 100644 --- a/app/javascript/mastodon/locales/fr.json +++ b/app/javascript/mastodon/locales/fr.json @@ -846,7 +846,7 @@ "keyboard_shortcuts.toggle_sensitivity": "Afficher/cacher les médias", "keyboard_shortcuts.toot": "Commencer un nouveau message", "keyboard_shortcuts.top": "Mettre en tête de liste", - "keyboard_shortcuts.translate": "traduire un message", + "keyboard_shortcuts.translate": "Traduire un message", "keyboard_shortcuts.unfocus": "Quitter la zone de rédaction/barre de recherche", "keyboard_shortcuts.up": "Monter dans la liste", "learn_more_link.got_it": "Compris", diff --git a/app/javascript/mastodon/locales/fy.json b/app/javascript/mastodon/locales/fy.json index 8930e18ba02..f1f9be4754f 100644 --- a/app/javascript/mastodon/locales/fy.json +++ b/app/javascript/mastodon/locales/fy.json @@ -433,7 +433,6 @@ "keyboard_shortcuts.toggle_hidden": "Tekst efter CW-fjild ferstopje/toane", "keyboard_shortcuts.toggle_sensitivity": "Media ferstopje/toane", "keyboard_shortcuts.toot": "Nij berjocht skriuwe", - "keyboard_shortcuts.translate": "om in berjocht oer te setten", "keyboard_shortcuts.unfocus": "to un-focus compose textarea/search", "keyboard_shortcuts.up": "Nei boppe yn list ferpleatse", "lightbox.close": "Slute", diff --git a/app/javascript/mastodon/locales/ga.json b/app/javascript/mastodon/locales/ga.json index 7375e57ef52..8ef61e60df2 100644 --- a/app/javascript/mastodon/locales/ga.json +++ b/app/javascript/mastodon/locales/ga.json @@ -846,7 +846,7 @@ "keyboard_shortcuts.toggle_sensitivity": "Taispeáin / cuir i bhfolach meáin", "keyboard_shortcuts.toot": "Cuir tús le postáil nua", "keyboard_shortcuts.top": "Bog go barr an liosta", - "keyboard_shortcuts.translate": "post a aistriú", + "keyboard_shortcuts.translate": "Aistrigh post", "keyboard_shortcuts.unfocus": "Unfocus cum textarea/search", "keyboard_shortcuts.up": "Bog suas ar an liosta", "learn_more_link.got_it": "Tuigim é", diff --git a/app/javascript/mastodon/locales/gd.json b/app/javascript/mastodon/locales/gd.json index 3cd3821e467..c1cfd0a2cf4 100644 --- a/app/javascript/mastodon/locales/gd.json +++ b/app/javascript/mastodon/locales/gd.json @@ -812,7 +812,6 @@ "keyboard_shortcuts.toggle_sensitivity": "Seall/Falaich na meadhanan", "keyboard_shortcuts.toot": "Tòisich air post ùr", "keyboard_shortcuts.top": "Gluais gu bàrr na liosta", - "keyboard_shortcuts.translate": "airson post eadar-theangachadh", "keyboard_shortcuts.unfocus": "Thoir am fòcas far raon teacsa an sgrìobhaidh/an luirg", "keyboard_shortcuts.up": "Gluais suas air an liosta", "learn_more_link.got_it": "Tha mi agaibh", diff --git a/app/javascript/mastodon/locales/gl.json b/app/javascript/mastodon/locales/gl.json index 3d0843525b0..b4da525cf91 100644 --- a/app/javascript/mastodon/locales/gl.json +++ b/app/javascript/mastodon/locales/gl.json @@ -846,7 +846,6 @@ "keyboard_shortcuts.toggle_sensitivity": "Para amosar/agochar contido multimedia", "keyboard_shortcuts.toot": "Para escribir unha nova publicación", "keyboard_shortcuts.top": "Mover arriba de todo", - "keyboard_shortcuts.translate": "para traducir unha publicación", "keyboard_shortcuts.unfocus": "Para deixar de destacar a área de escritura/procura", "keyboard_shortcuts.up": "Para mover cara arriba na listaxe", "learn_more_link.got_it": "Entendo", diff --git a/app/javascript/mastodon/locales/he.json b/app/javascript/mastodon/locales/he.json index ef7ac819fe1..2cb0b076973 100644 --- a/app/javascript/mastodon/locales/he.json +++ b/app/javascript/mastodon/locales/he.json @@ -846,7 +846,6 @@ "keyboard_shortcuts.toggle_sensitivity": "הצגת/הסתרת מדיה", "keyboard_shortcuts.toot": "להתחיל חיצרוץ חדש", "keyboard_shortcuts.top": "העברה לראש הרשימה", - "keyboard_shortcuts.translate": "לתרגם הודעה", "keyboard_shortcuts.unfocus": "לצאת מתיבת חיבור/חיפוש", "keyboard_shortcuts.up": "לנוע במעלה הרשימה", "learn_more_link.got_it": "הבנתי", diff --git a/app/javascript/mastodon/locales/ia.json b/app/javascript/mastodon/locales/ia.json index 55cc89f1383..3604a44c608 100644 --- a/app/javascript/mastodon/locales/ia.json +++ b/app/javascript/mastodon/locales/ia.json @@ -471,7 +471,6 @@ "keyboard_shortcuts.toggle_hidden": "Monstrar/celar texto detra advertimento de contento", "keyboard_shortcuts.toggle_sensitivity": "Monstrar/celar multimedia", "keyboard_shortcuts.toot": "Initiar un nove message", - "keyboard_shortcuts.translate": "a traducer un message", "keyboard_shortcuts.unfocus": "Disfocalisar le area de composition de texto/de recerca", "keyboard_shortcuts.up": "Displaciar in alto in le lista", "learn_more_link.got_it": "Comprendite", diff --git a/app/javascript/mastodon/locales/io.json b/app/javascript/mastodon/locales/io.json index 660747bcce1..748530ceb82 100644 --- a/app/javascript/mastodon/locales/io.json +++ b/app/javascript/mastodon/locales/io.json @@ -514,7 +514,6 @@ "keyboard_shortcuts.toggle_hidden": "to show/hide text behind CW", "keyboard_shortcuts.toggle_sensitivity": "Montrar/celar audvidaji", "keyboard_shortcuts.toot": "to start a brand new toot", - "keyboard_shortcuts.translate": "por tradukar mesajo", "keyboard_shortcuts.unfocus": "to un-focus compose textarea/search", "keyboard_shortcuts.up": "to move up in the list", "lightbox.close": "Klozar", diff --git a/app/javascript/mastodon/locales/is.json b/app/javascript/mastodon/locales/is.json index 47fc04c035c..ed5fc9bffbc 100644 --- a/app/javascript/mastodon/locales/is.json +++ b/app/javascript/mastodon/locales/is.json @@ -846,7 +846,7 @@ "keyboard_shortcuts.toggle_sensitivity": "Birta/fela myndir", "keyboard_shortcuts.toot": "Byrja nýja færslu", "keyboard_shortcuts.top": "Færa efst á listann", - "keyboard_shortcuts.translate": "að þýða færslu", + "keyboard_shortcuts.translate": "Þýða færslu", "keyboard_shortcuts.unfocus": "Taka virkni úr textainnsetningarreit eða leit", "keyboard_shortcuts.up": "Fara ofar í listanum", "learn_more_link.got_it": "Náði því", diff --git a/app/javascript/mastodon/locales/it.json b/app/javascript/mastodon/locales/it.json index 7fd6b8a425e..3382a02b923 100644 --- a/app/javascript/mastodon/locales/it.json +++ b/app/javascript/mastodon/locales/it.json @@ -846,7 +846,7 @@ "keyboard_shortcuts.toggle_sensitivity": "Mostra/Nasconde media", "keyboard_shortcuts.toot": "Crea un nuovo post", "keyboard_shortcuts.top": "Sposta all'inizio della lista", - "keyboard_shortcuts.translate": "Traduce un post", + "keyboard_shortcuts.translate": "Traduci un post", "keyboard_shortcuts.unfocus": "Rimuove il focus sull'area di composizione testuale/ricerca", "keyboard_shortcuts.up": "Scorre in su nell'elenco", "learn_more_link.got_it": "Ho capito", diff --git a/app/javascript/mastodon/locales/ja.json b/app/javascript/mastodon/locales/ja.json index cc7271c3e2a..febbe810f83 100644 --- a/app/javascript/mastodon/locales/ja.json +++ b/app/javascript/mastodon/locales/ja.json @@ -533,7 +533,6 @@ "keyboard_shortcuts.toggle_hidden": "CWで隠れた文を見る/隠す", "keyboard_shortcuts.toggle_sensitivity": "非表示のメディアを見る/隠す", "keyboard_shortcuts.toot": "新規投稿", - "keyboard_shortcuts.translate": "投稿を翻訳する", "keyboard_shortcuts.unfocus": "投稿の入力欄・検索欄から離れる", "keyboard_shortcuts.up": "カラム内一つ上に移動", "learn_more_link.got_it": "了解", diff --git a/app/javascript/mastodon/locales/kab.json b/app/javascript/mastodon/locales/kab.json index 73f0859251b..f0233d40116 100644 --- a/app/javascript/mastodon/locales/kab.json +++ b/app/javascript/mastodon/locales/kab.json @@ -592,7 +592,6 @@ "keyboard_shortcuts.toggle_hidden": "i uskan/tuffra n uḍris deffir CW", "keyboard_shortcuts.toggle_sensitivity": "i teskent/tuffra n yimidyaten", "keyboard_shortcuts.toot": "i wakken attebdud tajewwaqt tamaynut", - "keyboard_shortcuts.translate": "i usuqel n tsuffeɣt", "keyboard_shortcuts.unfocus": "to un-focus compose textarea/search", "keyboard_shortcuts.up": "i tulin ɣer d asawen n tebdart", "learn_more_link.got_it": "Gziɣ-t", diff --git a/app/javascript/mastodon/locales/ko.json b/app/javascript/mastodon/locales/ko.json index b6fbcb711c6..559ef06f478 100644 --- a/app/javascript/mastodon/locales/ko.json +++ b/app/javascript/mastodon/locales/ko.json @@ -838,7 +838,6 @@ "keyboard_shortcuts.toggle_sensitivity": "미디어 보이기/숨기기", "keyboard_shortcuts.toot": "새 게시물 작성", "keyboard_shortcuts.top": "목록의 최상단으로 이동", - "keyboard_shortcuts.translate": "게시물 번역", "keyboard_shortcuts.unfocus": "작성창에서 포커스 해제", "keyboard_shortcuts.up": "리스트에서 위로 이동", "learn_more_link.got_it": "확인", diff --git a/app/javascript/mastodon/locales/lad.json b/app/javascript/mastodon/locales/lad.json index f655a6e0032..d654559c3f1 100644 --- a/app/javascript/mastodon/locales/lad.json +++ b/app/javascript/mastodon/locales/lad.json @@ -478,7 +478,6 @@ "keyboard_shortcuts.toggle_hidden": "Amostra/eskonde teksto detras de avertensya de kontenido (CW)", "keyboard_shortcuts.toggle_sensitivity": "Amostra/eskonde multimedia", "keyboard_shortcuts.toot": "Eskrive mueva publikasyon", - "keyboard_shortcuts.translate": "para trezladar una puvlikasyon", "keyboard_shortcuts.unfocus": "No enfoka en el area de eskrivir/bushkeda", "keyboard_shortcuts.up": "Move verso arriva en la lista", "learn_more_link.got_it": "Entyendo", diff --git a/app/javascript/mastodon/locales/lt.json b/app/javascript/mastodon/locales/lt.json index a1409be70b8..20b857e2478 100644 --- a/app/javascript/mastodon/locales/lt.json +++ b/app/javascript/mastodon/locales/lt.json @@ -508,7 +508,6 @@ "keyboard_shortcuts.toggle_sensitivity": "Rodyti / slėpti mediją", "keyboard_shortcuts.toot": "Pradėti naują įrašą", "keyboard_shortcuts.top": "Perkelti į sąrašo viršų", - "keyboard_shortcuts.translate": "išversti įrašą", "keyboard_shortcuts.unfocus": "Nebefokusuoti rengykles teksto sritį / paiešką", "keyboard_shortcuts.up": "Perkelti į viršų sąraše", "learn_more_link.got_it": "Supratau", diff --git a/app/javascript/mastodon/locales/lv.json b/app/javascript/mastodon/locales/lv.json index 34558d6ca52..f1f25285f13 100644 --- a/app/javascript/mastodon/locales/lv.json +++ b/app/javascript/mastodon/locales/lv.json @@ -2,6 +2,7 @@ "about.blocks": "Moderētie serveri", "about.contact": "Kontakts:", "about.default_locale": "Noklusējums", + "about.disclaimer": "Mastodon ir brīva, atvērtā pirmkoda programmatūra un Mastodon GmbH prečzīme.", "about.domain_blocks.no_reason_available": "Iemesls nav norādīts", "about.domain_blocks.preamble": "Mastodon parasti ļauj apskatīt saturu un mijiedarboties ar lietotājiem no jebkura cita fediversa servera. Šie ir izņēmumi, kas veikti tieši šajā serverī.", "about.domain_blocks.silenced.explanation": "Parasti tu neredzēsi profilus un saturu no šī servera, ja vien tu nepārprotami izvēlēsies to pārskatīt vai sekot.", @@ -14,6 +15,7 @@ "about.rules": "Servera noteikumi", "account.account_note_header": "Personīga piezīme", "account.activity": "Darbības", + "account.add_note": "Pievienot personīgu piezīmi", "account.add_or_remove_from_list": "Pievienot vai Noņemt no sarakstiem", "account.badges.admin": "Pārvaldītājs", "account.badges.blocked": "Liegts", @@ -30,6 +32,7 @@ "account.copy": "Ievietot saiti uz profilu starpliktuvē", "account.direct": "Pieminēt @{name} privāti", "account.disable_notifications": "Pārtraukt man paziņot, kad @{name} izveido ierakstu", + "account.edit_note": "Labot personīgu piezīmi", "account.edit_profile": "Labot profilu", "account.edit_profile_short": "Labot", "account.enable_notifications": "Paziņot man, kad @{name} izveido ierakstu", @@ -71,7 +74,7 @@ "account.joined_short": "Pievienojās", "account.languages": "Mainīt abonētās valodas", "account.link_verified_on": "Šīs saites piederība tika pārbaudīta {date}", - "account.locked_info": "Šī konta privātuma statuss ir slēgts. Īpašnieks izskatīs, kurš viņam drīkst sekot.", + "account.locked_info": "Šī konta privātuma stāvoklis ir iestatīts kā slēgts. Īpašnieks izvērtē, kurš viņam drīkst sekot.", "account.media": "Multivide", "account.mention": "Pieminēt @{name}", "account.menu.add_to_list": "Pievienot sarakstam…", @@ -139,6 +142,7 @@ "account_edit.upload_modal.title_add.header": "Pievienot titullapas fotoattēlu", "account_edit.upload_modal.title_replace.avatar": "Nomainīt profila fotoattēlu", "account_edit.upload_modal.title_replace.header": "Nomainīt titullapas fotoattēlu", + "account_edit.verified_modal.invisible_link.summary": "Kā saiti padarīt neredzamu?", "account_edit_tags.suggestions": "Ieteikumi:", "admin.dashboard.daily_retention": "Lietotāju saglabāšanas rādītājs dienā pēc reģistrēšanās", "admin.dashboard.monthly_retention": "Lietotāju saglabāšanas rādītājs mēnesī pēc reģistrēšanās", @@ -299,7 +303,7 @@ "confirmations.missing_alt_text.title": "Pievienot aprakstošo tekstu?", "confirmations.mute.confirm": "Apklusināt", "confirmations.private_quote_notify.cancel": "Atgriezties pie labošanas", - "confirmations.private_quote_notify.confirm": "Publicēt ierakstu", + "confirmations.private_quote_notify.confirm": "Ievietot ierakstu", "confirmations.private_quote_notify.do_not_show_again": "Nerādīt vairāk šo paziņojumu", "confirmations.private_quote_notify.title": "Dalīties ar sekotājiem un pieminētajiem lietotājiem?", "confirmations.quiet_post_quote_info.got_it": "Sapratu", @@ -426,6 +430,7 @@ "follow_suggestions.view_all": "Skatīt visu", "follow_suggestions.who_to_follow": "Kam sekot", "followed_tags": "Sekojamie tēmturi", + "followers.hide_other_followers": "Šis lietotājs izvēlējās nepadarīt savus citus sekotājus redzamus", "footer.about": "Par", "footer.about_this_server": "Par", "footer.directory": "Profilu direktorija", @@ -433,7 +438,7 @@ "footer.keyboard_shortcuts": "Īsinājumtaustiņi", "footer.privacy_policy": "Privātuma politika", "footer.source_code": "Skatīt pirmkodu", - "footer.status": "Statuss", + "footer.status": "Stāvoklis", "footer.terms_of_service": "Pakalpojuma noteikumi", "getting_started.heading": "Darba sākšana", "hashtag.admin_moderation": "Atvērt #{name} satura pārraudzības saskarni", @@ -514,7 +519,6 @@ "keyboard_shortcuts.toggle_hidden": "Rādīt/slēpt tekstu aiz satura brīdinājuma", "keyboard_shortcuts.toggle_sensitivity": "Rādīt/slēpt multividi", "keyboard_shortcuts.toot": "Uzsākt jaunu ierakstu", - "keyboard_shortcuts.translate": "tulkot ierakstu", "keyboard_shortcuts.unfocus": "Atfokusēt veidojamā teksta/meklēšanas lauku", "keyboard_shortcuts.up": "Pārvietoties augšup sarakstā", "learn_more_link.got_it": "Sapratu", diff --git a/app/javascript/mastodon/locales/nan-TW.json b/app/javascript/mastodon/locales/nan-TW.json index 3b7ae6f4fc2..a894af522b8 100644 --- a/app/javascript/mastodon/locales/nan-TW.json +++ b/app/javascript/mastodon/locales/nan-TW.json @@ -846,7 +846,6 @@ "keyboard_shortcuts.toggle_sensitivity": "顯示/tshàng媒體", "keyboard_shortcuts.toot": "PO新PO文", "keyboard_shortcuts.top": "Súa kàu列單ê頭", - "keyboard_shortcuts.translate": "kā PO文翻譯", "keyboard_shortcuts.unfocus": "離開輸入框仔/tshiau-tshuē格仔", "keyboard_shortcuts.up": "佇列單內kā suá khah面頂", "learn_more_link.got_it": "知矣", diff --git a/app/javascript/mastodon/locales/nl.json b/app/javascript/mastodon/locales/nl.json index 1d71409ced2..fda805366fc 100644 --- a/app/javascript/mastodon/locales/nl.json +++ b/app/javascript/mastodon/locales/nl.json @@ -846,7 +846,7 @@ "keyboard_shortcuts.toggle_sensitivity": "Media tonen/verbergen", "keyboard_shortcuts.toot": "Nieuw bericht schrijven", "keyboard_shortcuts.top": "Naar het begin van de lijst verplaatsen", - "keyboard_shortcuts.translate": "om een bericht te vertalen", + "keyboard_shortcuts.translate": "Een bericht vertalen", "keyboard_shortcuts.unfocus": "Tekst- en zoekveld ontfocussen", "keyboard_shortcuts.up": "Naar boven in de lijst bewegen", "learn_more_link.got_it": "Begrepen", diff --git a/app/javascript/mastodon/locales/nn.json b/app/javascript/mastodon/locales/nn.json index 6b023be0705..fb3cff77c31 100644 --- a/app/javascript/mastodon/locales/nn.json +++ b/app/javascript/mastodon/locales/nn.json @@ -846,7 +846,6 @@ "keyboard_shortcuts.toggle_sensitivity": "Vis/gøym media", "keyboard_shortcuts.toot": "Lag nytt tut", "keyboard_shortcuts.top": "Flytt til toppen av lista", - "keyboard_shortcuts.translate": "å omsetje eit innlegg", "keyboard_shortcuts.unfocus": "for å fokusere vekk skrive-/søkefeltet", "keyboard_shortcuts.up": "Flytt opp på lista", "learn_more_link.got_it": "Forstått", diff --git a/app/javascript/mastodon/locales/no.json b/app/javascript/mastodon/locales/no.json index 0761a9e9843..9a8f9528c12 100644 --- a/app/javascript/mastodon/locales/no.json +++ b/app/javascript/mastodon/locales/no.json @@ -518,7 +518,6 @@ "keyboard_shortcuts.toggle_hidden": "Vis/skjul tekst bak innholdsvarsel", "keyboard_shortcuts.toggle_sensitivity": "Vis/skjul media", "keyboard_shortcuts.toot": "Start et nytt innlegg", - "keyboard_shortcuts.translate": "for å oversette et innlegg", "keyboard_shortcuts.unfocus": "Fjern fokus fra komponerings-/søkefeltet", "keyboard_shortcuts.up": "Flytt oppover i listen", "lightbox.close": "Lukk", diff --git a/app/javascript/mastodon/locales/pa.json b/app/javascript/mastodon/locales/pa.json index 2a35a00f95c..614e5b570c6 100644 --- a/app/javascript/mastodon/locales/pa.json +++ b/app/javascript/mastodon/locales/pa.json @@ -407,7 +407,6 @@ "keyboard_shortcuts.toggle_hidden": "to show/hide text behind CW", "keyboard_shortcuts.toggle_sensitivity": "ਮੀਡੀਆ ਦਿਖਾਉਣ/ਲੁਕਾਉਣ ਲਈ", "keyboard_shortcuts.toot": "ਨਵੀਂ ਪੋਸਟ ਸ਼ੁਰੂ ਕਰੋ", - "keyboard_shortcuts.translate": "ਪੋਸਟ ਨੂੰ ਅਨੁਵਾਦ ਕਰਨ ਲਈ", "keyboard_shortcuts.unfocus": "to un-focus compose textarea/search", "keyboard_shortcuts.up": "ਸੂਚੀ ਵਿੱਚ ਉੱਤੇ ਭੇਜੋ", "learn_more_link.got_it": "ਸਮਝ ਗਏ", diff --git a/app/javascript/mastodon/locales/pl.json b/app/javascript/mastodon/locales/pl.json index 6c62ad4ccf4..39f141965cd 100644 --- a/app/javascript/mastodon/locales/pl.json +++ b/app/javascript/mastodon/locales/pl.json @@ -636,7 +636,6 @@ "keyboard_shortcuts.toggle_hidden": "Pokaż lub ukryj tekst z ostrzeżeniem", "keyboard_shortcuts.toggle_sensitivity": "Pokaż lub ukryj multimedia", "keyboard_shortcuts.toot": "Stwórz nowy wpis", - "keyboard_shortcuts.translate": "aby przetłumaczyć wpis", "keyboard_shortcuts.unfocus": "Opuść pole tekstowe", "keyboard_shortcuts.up": "Przesuń w górę na liście", "learn_more_link.got_it": "Rozumiem", diff --git a/app/javascript/mastodon/locales/pt-BR.json b/app/javascript/mastodon/locales/pt-BR.json index 8e60ac6a494..987ddc21016 100644 --- a/app/javascript/mastodon/locales/pt-BR.json +++ b/app/javascript/mastodon/locales/pt-BR.json @@ -846,7 +846,7 @@ "keyboard_shortcuts.toggle_sensitivity": "mostrar/ocultar mídia", "keyboard_shortcuts.toot": "Começar nova publicação", "keyboard_shortcuts.top": "Mover para o topo da lista", - "keyboard_shortcuts.translate": "para traduzir uma publicação", + "keyboard_shortcuts.translate": "Traduzir uma publicação", "keyboard_shortcuts.unfocus": "Desfocar da área de composição/busca", "keyboard_shortcuts.up": "mover para cima", "learn_more_link.got_it": "Entendido", diff --git a/app/javascript/mastodon/locales/pt-PT.json b/app/javascript/mastodon/locales/pt-PT.json index 22a55d48c3b..63da90f799a 100644 --- a/app/javascript/mastodon/locales/pt-PT.json +++ b/app/javascript/mastodon/locales/pt-PT.json @@ -788,7 +788,6 @@ "keyboard_shortcuts.toggle_sensitivity": "Mostrar / Ocultar media", "keyboard_shortcuts.toot": "criar uma nova publicação", "keyboard_shortcuts.top": "Mover para o topo da lista", - "keyboard_shortcuts.translate": "traduzir uma publicação", "keyboard_shortcuts.unfocus": "remover o foco da área de texto / pesquisa", "keyboard_shortcuts.up": "mover para cima na lista", "learn_more_link.got_it": "Entendido", diff --git a/app/javascript/mastodon/locales/ru.json b/app/javascript/mastodon/locales/ru.json index d439a1e8b47..972df5bd6b7 100644 --- a/app/javascript/mastodon/locales/ru.json +++ b/app/javascript/mastodon/locales/ru.json @@ -757,7 +757,6 @@ "keyboard_shortcuts.toggle_hidden": "показать/скрыть текст за предупреждением", "keyboard_shortcuts.toggle_sensitivity": "показать/скрыть медиа", "keyboard_shortcuts.toot": "начать писать новый пост", - "keyboard_shortcuts.translate": "перевести пост", "keyboard_shortcuts.unfocus": "убрать фокус с поля ввода/поиска", "keyboard_shortcuts.up": "вверх по списку", "learn_more_link.got_it": "Понятно", diff --git a/app/javascript/mastodon/locales/sc.json b/app/javascript/mastodon/locales/sc.json index d70791a0b6a..eed637b2370 100644 --- a/app/javascript/mastodon/locales/sc.json +++ b/app/javascript/mastodon/locales/sc.json @@ -377,7 +377,6 @@ "keyboard_shortcuts.toggle_hidden": "Ammustra o cua su testu de is AC", "keyboard_shortcuts.toggle_sensitivity": "Ammustra/cua elementos multimediales", "keyboard_shortcuts.toot": "Cumintza a iscrìere una publicatzione noa", - "keyboard_shortcuts.translate": "pro tradùere una publicatzione", "keyboard_shortcuts.unfocus": "Essi de s'àrea de cumpositzione de testu o de chirca", "keyboard_shortcuts.up": "Move in susu in sa lista", "lightbox.close": "Serra", diff --git a/app/javascript/mastodon/locales/si.json b/app/javascript/mastodon/locales/si.json index 25f5f3858cf..99ba5457b1a 100644 --- a/app/javascript/mastodon/locales/si.json +++ b/app/javascript/mastodon/locales/si.json @@ -421,7 +421,6 @@ "keyboard_shortcuts.toggle_hidden": "CW පිටුපස පෙළ පෙන්වන්න/සඟවන්න", "keyboard_shortcuts.toggle_sensitivity": "මාධ්‍ය පෙන්වන්න/සඟවන්න", "keyboard_shortcuts.toot": "නව ලිපියක් අරඹන්න", - "keyboard_shortcuts.translate": "සටහනක් පරිවර්තනය කිරීමට", "keyboard_shortcuts.unfocus": "පෙළ ප්‍රදේශය/සෙවීම රචනා කිරීම නාභිගත නොකරන්න", "keyboard_shortcuts.up": "ලැයිස්තුවේ ඉහළට ගෙනයන්න", "lightbox.close": "වසන්න", diff --git a/app/javascript/mastodon/locales/sk.json b/app/javascript/mastodon/locales/sk.json index 555a58b0ed0..be8ff1dbf3a 100644 --- a/app/javascript/mastodon/locales/sk.json +++ b/app/javascript/mastodon/locales/sk.json @@ -447,7 +447,6 @@ "keyboard_shortcuts.toggle_hidden": "Zobraziť/skryť text za varovaním o obsahu", "keyboard_shortcuts.toggle_sensitivity": "Zobraziť/skryť médiá", "keyboard_shortcuts.toot": "Vytvoriť nový príspevok", - "keyboard_shortcuts.translate": "Preložiť príspevok", "keyboard_shortcuts.unfocus": "Odísť z textového poľa", "keyboard_shortcuts.up": "Posunúť sa vyššie v zozname", "learn_more_link.got_it": "Mám to", diff --git a/app/javascript/mastodon/locales/sl.json b/app/javascript/mastodon/locales/sl.json index ec73501f475..0f368c592a1 100644 --- a/app/javascript/mastodon/locales/sl.json +++ b/app/javascript/mastodon/locales/sl.json @@ -477,7 +477,6 @@ "keyboard_shortcuts.toggle_sensitivity": "Pokaži/skrij predstavnosti", "keyboard_shortcuts.toot": "Začni povsem novo objavo", "keyboard_shortcuts.top": "Premakni na vrh seznama", - "keyboard_shortcuts.translate": "za prevod objave", "keyboard_shortcuts.unfocus": "Odstrani pozornost z območja za sestavljanje besedila/iskanje", "keyboard_shortcuts.up": "Premakni navzgor po seznamu", "learn_more_link.got_it": "Razumem", diff --git a/app/javascript/mastodon/locales/sq.json b/app/javascript/mastodon/locales/sq.json index a020074e912..d2803adfd10 100644 --- a/app/javascript/mastodon/locales/sq.json +++ b/app/javascript/mastodon/locales/sq.json @@ -841,7 +841,6 @@ "keyboard_shortcuts.toggle_sensitivity": "Për shfaqje/fshehje mediash", "keyboard_shortcuts.toot": "Për të filluar një mesazh të ri", "keyboard_shortcuts.top": "Shpjere në krye të listës", - "keyboard_shortcuts.translate": "për të përkthyer një postim", "keyboard_shortcuts.unfocus": "Për heqjen e fokusit nga fusha e hartimit të mesazheve apo kërkimeve", "keyboard_shortcuts.up": "Për ngjitje sipër nëpër listë", "learn_more_link.got_it": "E mora vesh", diff --git a/app/javascript/mastodon/locales/sv.json b/app/javascript/mastodon/locales/sv.json index e021787225f..6e703d5f4f5 100644 --- a/app/javascript/mastodon/locales/sv.json +++ b/app/javascript/mastodon/locales/sv.json @@ -846,7 +846,6 @@ "keyboard_shortcuts.toggle_sensitivity": "Visa/gömma media", "keyboard_shortcuts.toot": "Starta nytt inlägg", "keyboard_shortcuts.top": "Flytta till början av listan", - "keyboard_shortcuts.translate": "för att översätta ett inlägg", "keyboard_shortcuts.unfocus": "Avfokusera skrivfält/sökfält", "keyboard_shortcuts.up": "Flytta uppåt i listan", "learn_more_link.got_it": "Jag förstår", diff --git a/app/javascript/mastodon/locales/th.json b/app/javascript/mastodon/locales/th.json index 3c91b84f23b..600d1586858 100644 --- a/app/javascript/mastodon/locales/th.json +++ b/app/javascript/mastodon/locales/th.json @@ -463,7 +463,6 @@ "keyboard_shortcuts.toggle_hidden": "แสดง/ซ่อนข้อความที่อยู่หลังคำเตือนเนื้อหา", "keyboard_shortcuts.toggle_sensitivity": "แสดง/ซ่อนสื่อ", "keyboard_shortcuts.toot": "เริ่มโพสต์ใหม่", - "keyboard_shortcuts.translate": "เพื่อแปลโพสต์", "keyboard_shortcuts.unfocus": "เลิกโฟกัสพื้นที่เขียนข้อความ/การค้นหา", "keyboard_shortcuts.up": "ย้ายขึ้นในรายการ", "learn_more_link.got_it": "เข้าใจแล้ว", diff --git a/app/javascript/mastodon/locales/tok.json b/app/javascript/mastodon/locales/tok.json index b48d2532a49..fa31738f38c 100644 --- a/app/javascript/mastodon/locales/tok.json +++ b/app/javascript/mastodon/locales/tok.json @@ -390,7 +390,6 @@ "keyboard_shortcuts.toggle_hidden": "o lukin ala lukin e toki len", "keyboard_shortcuts.toggle_sensitivity": "o lukin ala lukin e sitelen", "keyboard_shortcuts.toot": "o toki sin", - "keyboard_shortcuts.translate": "o ante e toki lipu", "keyboard_shortcuts.up": "o tawa sewi lon lipu", "learn_more_link.got_it": "sona", "lightbox.close": "o pini", diff --git a/app/javascript/mastodon/locales/tr.json b/app/javascript/mastodon/locales/tr.json index efea49d3bfe..be22775ca7a 100644 --- a/app/javascript/mastodon/locales/tr.json +++ b/app/javascript/mastodon/locales/tr.json @@ -646,6 +646,7 @@ "empty_column.account_unavailable": "Profil kullanılamıyor", "empty_column.blocks": "Henüz herhangi bir kullanıcıyı engellemedin.", "empty_column.bookmarked_statuses": "Henüz yer imine eklediğin toot yok. Bir tanesi yer imine eklendiğinde burada görünür.", + "empty_column.collections": "{acct} henüz bir koleksiyon oluşturmadı.", "empty_column.collections.featured_in": "Henüz herhangi bir koleksiyona eklenmediniz.", "empty_column.collections.featured_in_undiscoverable": "Kullanıcıların sizi koleksiyonlarına ekleyebilmesi için, Tercihler > Gizlilik ve erişim bölümünden keşif deneyimlerinde öne çıkarılmaya izin vermeniz gerekir", "empty_column.community": "Yerel zaman çizelgesi boş. Daha fazla eğlence için herkese açık bir gönderi paylaşın!", @@ -819,6 +820,12 @@ "keyboard_shortcuts.heading": "Klavye kısayolları", "keyboard_shortcuts.home": "Ana sayfa akışını aç", "keyboard_shortcuts.hotkey": "Kısayol tuşu", + "keyboard_shortcuts.keys.alt": "Alt", + "keyboard_shortcuts.keys.backspace": "Geri al tuşu", + "keyboard_shortcuts.keys.enter": "Enter", + "keyboard_shortcuts.keys.esc": "Esc", + "keyboard_shortcuts.keys.page_down": "Sayfa Aşağı", + "keyboard_shortcuts.keys.page_up": "Sayfa Yukarı", "keyboard_shortcuts.legend": "Bu efsaneyi görüntülemek için", "keyboard_shortcuts.load_more": "\"Daha fazlası\" düğmesine odaklan", "keyboard_shortcuts.local": "Yerel akışı aç", @@ -839,7 +846,7 @@ "keyboard_shortcuts.toggle_sensitivity": "Medyayı göstermek/gizlemek için", "keyboard_shortcuts.toot": "Yeni bir gönderi başlat", "keyboard_shortcuts.top": "Listenin üstüne taşı", - "keyboard_shortcuts.translate": "bir gönderiyi çevirmek için", + "keyboard_shortcuts.translate": "Bir gönderiyi çevir", "keyboard_shortcuts.unfocus": "Aramada bir gönderiye odaklanmamak için", "keyboard_shortcuts.up": "Listede yukarıya çıkmak için", "learn_more_link.got_it": "Anladım", @@ -1192,6 +1199,7 @@ "search_popout.user": "kullanıcı", "search_results.accounts": "Profiller", "search_results.all": "Tümü", + "search_results.collections": "Koleksiyonlar", "search_results.hashtags": "Etiketler", "search_results.no_results": "Sonuç yok.", "search_results.no_search_yet": "Gönderiler, profiller veya etiketler için aramayı deneyin.", diff --git a/app/javascript/mastodon/locales/uk.json b/app/javascript/mastodon/locales/uk.json index 9ad58bdaa3c..0cb94e1fc8b 100644 --- a/app/javascript/mastodon/locales/uk.json +++ b/app/javascript/mastodon/locales/uk.json @@ -505,7 +505,6 @@ "keyboard_shortcuts.toggle_hidden": "Показати/приховати текст під попередженням про вміст", "keyboard_shortcuts.toggle_sensitivity": "Показати/приховати медіа", "keyboard_shortcuts.toot": "Створити новий допис", - "keyboard_shortcuts.translate": "перекласти допис", "keyboard_shortcuts.unfocus": "Розфокусуватися з нового допису чи пошуку", "keyboard_shortcuts.up": "Рухатися вгору списком", "learn_more_link.got_it": "Зрозуміло", diff --git a/app/javascript/mastodon/locales/vi.json b/app/javascript/mastodon/locales/vi.json index 9790d927f05..745f89d1592 100644 --- a/app/javascript/mastodon/locales/vi.json +++ b/app/javascript/mastodon/locales/vi.json @@ -846,7 +846,6 @@ "keyboard_shortcuts.toggle_sensitivity": "ẩn/hiện ảnh hoặc video", "keyboard_shortcuts.toot": "soạn tút mới", "keyboard_shortcuts.top": "di chuyển đến đầu danh sách", - "keyboard_shortcuts.translate": "dịch tút", "keyboard_shortcuts.unfocus": "đưa con trỏ ra khỏi ô soạn thảo hoặc ô tìm kiếm", "keyboard_shortcuts.up": "di chuyển lên trên danh sách", "learn_more_link.got_it": "Đã hiểu", diff --git a/config/locales/da.yml b/config/locales/da.yml index bfc9d3857e8..c5dd1dd7465 100644 --- a/config/locales/da.yml +++ b/config/locales/da.yml @@ -505,6 +505,21 @@ da: no_lists_yet: Ingen lister endnu last_email: Seneste e-mail lead: Nedenfor vises de konti, der har aktiveret funktionen og har abonnenter. + show: + confirm_disable_feature: Vil du deaktivere e-mail-nyhedsbreve for %{name}? Der vil ikke længere blive sendt e-mail-opdateringer for denne konto. Brugeren kan stadig genaktivere funktionen i sine kontoindstillinger. Hvis du vil fjerne adgangen til denne funktion permanent, skal du redigere kontoens tilladelser under Roller. + confirm_remove_subscriber: "%{email} vil ikke længere modtage e-mails fra %{name}. Denne handling kan ikke fortrydes." + consent: Abonnenter har kun givet samtykke til at modtage indlæg via e-mail. Brug ikke denne liste til andre formål. + date: Dato for tilmelding + disable_feature: Deaktivér funktion + disabled: Funktionen blev deaktiveret og e-mails bliver ikke længere sendt til denne liste. + email: E-mailadresse + empty: + hint: Ingen har abonneret på denne konto endnu. + no_subscribers_yet: Ingen abonnenter endnu + enable_feature: Aktivér funktion + no_access_html: Denne konto har ikke længere de tilladelser, der kræves for at aktivere funktionen. Ændr dette i Roller. + title: E-mail-nyhedsbreve for %{name} + view_account: Vis konto status: Status subscribers: Abonnenter title: Mailinglister @@ -1532,7 +1547,9 @@ da: success_html: Du vil nu begynde at modtage e-mails, når %{name} offentliggør nye indlæg. Tilføj %{sender} til dine kontakter, så disse indlæg ikke ender i din spam-mappe. title: Du er tilmeldt unsubscribe: Afmeld + disabled: Deaktiveret inactive: Inaktive + no_access: Ingen adgang status: Status subscribers: Abonnenter emoji_styles: diff --git a/config/locales/doorkeeper.lv.yml b/config/locales/doorkeeper.lv.yml index 537e0291f2e..4e8bb32ac61 100644 --- a/config/locales/doorkeeper.lv.yml +++ b/config/locales/doorkeeper.lv.yml @@ -194,4 +194,4 @@ lv: write:mutes: apklusini cilvēkus un sarunas write:notifications: notīri savus paziņojumus write:reports: ziņo par citiem cilvēkiem - write:statuses: publicē ziņas + write:statuses: pievienot ierakstus diff --git a/config/locales/el.yml b/config/locales/el.yml index 66679cecdf8..f116b942a9a 100644 --- a/config/locales/el.yml +++ b/config/locales/el.yml @@ -505,6 +505,21 @@ el: no_lists_yet: Καμία λίστα ακόμη last_email: Τελευταίο email lead: Λογαριασμοί που έχουν ενεργοποιήσει τη λειτουργία και έχουν συνδρομητές θα εμφανίζονται παρακάτω. + show: + confirm_disable_feature: Απενεργοποιήστε τα ενημερωτικά δελτία email για τον/την %{name}; Οι ενημερώσεις μέσω email δεν θα αποστέλλονται πλέον για αυτόν τον λογαριασμό. Ο χρήστης θα εξακολουθεί να είναι σε θέση να ενεργοποιήσει εκ νέου τη λειτουργία στις ρυθμίσεις του λογαριασμού του. Για να καταργήσετε μόνιμα την πρόσβαση σε αυτή τη λειτουργία, επεξεργαστείτε τα δικαιώματα του λογαριασμού στους Ρόλους. + confirm_remove_subscriber: Το %{email} δεν θα λαμβάνει πλέον μηνύματα email από τον/την %{name}. Αυτή η ενέργεια δεν μπορεί να αναιρεθεί. + consent: Οι συνδρομητές έχουν συναινέσει μόνο στη λήψη αναρτήσεων μέσω email. Μην χρησιμοποιείτε αυτήν τη λίστα για άλλους σκοπούς. + date: Ημερομηνία εγγραφής + disable_feature: Απενεργοποίηση λειτουργίας + disabled: Η λειτουργία απενεργοποιήθηκε και τα email δεν αποστέλλονται πλέον σε αυτήν τη λίστα. + email: Διεύθυνση email + empty: + hint: Κανείς δεν έχει εγγραφεί σε αυτόν τον λογαριασμό ακόμη. + no_subscribers_yet: Κανένας συνδρομητής ακόμη + enable_feature: Ενεργοποίηση λειτουργίας + no_access_html: Αυτός ο λογαριασμός δεν έχει πλέον τα απαιτούμενα δικαιώματα για την ενεργοποίηση της λειτουργίας. Αλλάξτε το αυτό στους Ρόλους. + title: Ενημερωτικά δελτία του/της %{name} + view_account: Προβολή λογαριασμού status: Κατάσταση subscribers: Συνδρομητές title: Λίστες αλληλογραφίας @@ -1532,7 +1547,9 @@ el: success_html: Τώρα θα αρχίσετε να λαμβάνετε email όταν ο χρήστης %{name} δημοσιεύει νέες αναρτήσεις. Προσθέστε το %{sender} στις επαφές σας, έτσι ώστε αυτές οι αναρτήσεις να μην καταλήγουν στο φάκελο Ανεπιθύμητα. title: Έχετε εγγραφεί unsubscribe: Κατάργηση συνδρομής + disabled: Απενεργοποιημένη inactive: Ανενεργή + no_access: Χωρίς πρόσβαση status: Κατάσταση subscribers: Συνδρομητές emoji_styles: diff --git a/config/locales/es-AR.yml b/config/locales/es-AR.yml index db9c1e0d767..57aa9c821bf 100644 --- a/config/locales/es-AR.yml +++ b/config/locales/es-AR.yml @@ -505,6 +505,21 @@ es-AR: no_lists_yet: Aún no hay listas last_email: Último correo electrónico lead: Las cuentas que habilitaron la función y tienen suscriptores se mostrarán a continuación. + show: + confirm_disable_feature: "¿Deshabilitar boletines de correo electrónico para %{name}? Las actualizaciones de correo electrónico ya no se enviarán a esta cuenta. El usuario todavía podrá volver a activar la función en la configuración de su cuenta. Para eliminar permanentemente el acceso a esta función, editá el permiso de la cuenta en Roles." + confirm_remove_subscriber: "%{email} ya no recibirá correos electrónicos de %{name}. Esta acción no se puede deshacer." + consent: Los suscriptores solo aceptaron recibir mensajes por correo electrónico. No usés esta lista para otros propósitos. + date: Fecha de registro + disable_feature: Deshabilitar función + disabled: La función fue deshabilitada y los correos electrónicos ya no están siendo enviados a esta lista. + email: Dirección de correo electrónico + empty: + hint: Todavía nadie se suscribió a esta cuenta. + no_subscribers_yet: Aún no hay suscriptores + enable_feature: Habilitar función + no_access_html: Esta cuenta ya no tiene los permisos requeridos para habilitar la función. Cambiá esto en Roles. + title: Boletines de noticias de %{name} + view_account: Ver cuenta status: Estado subscribers: Suscriptores title: Listas de correo @@ -1532,7 +1547,9 @@ es-AR: success_html: Ahora vas a empezar a recibir correos electrónicos cuando %{name} publique algo nuevo. Agregá a %{sender} a tus contactos para que estas publicaciones no terminen en tu carpeta de spam o correo no deseado. title: Te suscribiste unsubscribe: Desuscribirse + disabled: Deshabilitada inactive: Inactiva + no_access: Sin acceso status: Estado subscribers: Suscriptores emoji_styles: diff --git a/config/locales/es-MX.yml b/config/locales/es-MX.yml index 5525f212cd3..da7eaf1480d 100644 --- a/config/locales/es-MX.yml +++ b/config/locales/es-MX.yml @@ -505,6 +505,23 @@ es-MX: no_lists_yet: No hay listas todavía last_email: Último correo electrónico lead: A continuación se mostrarán las cuentas que hayan activado la función y tengan suscriptores. + show: + confirm_disable_feature: |- + ¿Desactivar boletines de correo electrónico de %{name}? No se enviarán actualizaciones por correo electrónico para esta cuenta. El usuario aún podrá reactivar esta función en los ajustes de su cuenta. + Para eliminar el acceso a esta función permanentemente, modifica los permisos de la cuenta en Roles. + confirm_remove_subscriber: "%{email} no recibirá más correos electrónicos de %{name}. Esta acción no se puede deshacer." + consent: Los subscriptores solo han autorizado recibir publicaciones por email. No utilices esta lista para otros propósitos. + date: Fecha de suscripción + disable_feature: Desactivar función + disabled: La función ha sido desactivada y ya no se enviarán correos electrónicos a esta lista. + email: Dirección de correo electrónico + empty: + hint: Nadie se ha suscrito a esta cuenta aún. + no_subscribers_yet: Sin suscriptores aún + enable_feature: Activar función + no_access_html: Esta cuenta ya no tiene los permisos necesarios para activar la función. Modifica esto en Roles. + title: Boletines de correo electrónico de %{name} + view_account: Ver cuenta status: Estado subscribers: Suscriptores title: Listas de correo @@ -1532,7 +1549,9 @@ es-MX: success_html: A partir de ahora, recibirás correos electrónicos cada vez que %{name} haga nuevas publicaciones. Añade a %{sender} a tus contactos para que estas publicaciones no terminen en tu carpeta de spam. title: Ya estás registrado unsubscribe: Cancelar suscripción + disabled: Desactivado inactive: Inactiva + no_access: Sin acceso status: Estado subscribers: Suscriptores emoji_styles: diff --git a/config/locales/es.yml b/config/locales/es.yml index ddcc6ab07d2..2dba7af9a38 100644 --- a/config/locales/es.yml +++ b/config/locales/es.yml @@ -505,6 +505,23 @@ es: no_lists_yet: Aún no hay listas last_email: Último correo electrónico lead: Las cuentas que han habilitado la función y tienen suscriptores se mostrarán a continuación. + show: + confirm_disable_feature: |- + ¿Desactivar boletines de correo electrónico de %{name}? No se enviarán actualizaciones por correo electrónico para esta cuenta. El usuario aún podrá reactivar esta función en los ajustes de su cuenta. + Para eliminar el acceso a esta función permanentemente, modifica los permisos de la cuenta en Roles. + confirm_remove_subscriber: "%{email} no recibirá más correos electrónicos de %{name}. Esta acción no se puede deshacer." + consent: Los subscriptores solo han autorizado recibir publicaciones por email. No utilices esta lista para otros propósitos. + date: Fecha de suscripción + disable_feature: Desactivar función + disabled: La función ha sido desactivada y ya no se enviarán correos electrónicos a esta lista. + email: Dirección de correo electrónico + empty: + hint: Nadie se ha suscrito a esta cuenta aún. + no_subscribers_yet: Sin suscriptores aún + enable_feature: Activar función + no_access_html: Esta cuenta ya no tiene los permisos necesarios para activar la función. Modifica esto en Roles. + title: Boletines de correo electrónico de %{name} + view_account: Ver cuenta status: Estado subscribers: Suscriptores title: Listas de correo @@ -1499,7 +1516,7 @@ es: your_appeal_rejected: Tu apelación ha sido rechazada edit_profile: other: Otros - privacy_redesign_body: La opción de mostrar tus perfiles seguidos y seguidores ahora se hace directamente desde tu perfil. + privacy_redesign_body: La opción de mostrar a quién sigues y tus seguidores ahora está directamente en tu perfil. redesign_body: Ahora puedes acceder a la edición del perfil desde la propia página de perfil. redesign_button: Llévame allí redesign_title: Hay una nueva experiencia de edición de perfil @@ -1532,7 +1549,9 @@ es: success_html: Ahora empezarás a recibir correos electrónicos cuando %{name} publique algo nuevo. Añade %{sender} a tus contactos para que estas publicaciones no terminen en tu carpeta de Spam. title: Estás suscrito unsubscribe: Cancelar suscripición + disabled: Desactivado inactive: Inactiva + no_access: Sin acceso status: Estado subscribers: Suscriptores emoji_styles: diff --git a/config/locales/fi.yml b/config/locales/fi.yml index 76fb59f90c8..6b98c1f4bb5 100644 --- a/config/locales/fi.yml +++ b/config/locales/fi.yml @@ -505,6 +505,21 @@ fi: no_lists_yet: Ei vielä listoja last_email: Viimeisin sähköpostiviesti lead: Alla näkyvät tilit, jotka ovat ottaneet ominaisuuden käyttöön ja joilla on tilaajia. + show: + confirm_disable_feature: Poistetaanko tilin %{name} sähköpostiuutiskirjeet käytöstä? Tätä tiliä koskevia sähköpostipäivityksiä ei enää lähetetä. Käyttäjä voi yhä ottaa tämän ominaisuuden uudelleen käyttöön tilinsä asetuksista. Jotta voit pysyvästi poistaa pääsyn tähän ominaisuuteen, muokkaa tilin käyttöoikeuksia kohdassa Roolit. + confirm_remove_subscriber: "%{email} ei vastedes vastaanota sähköpostia tililtä %{name}. Tätä toimintoa ei voi peruuttaa." + consent: Tilaajat ovat suostuneet vain vastaanottamaan julkaisuja sähköpostitse. Älä käytä tätä listaa muihin tarkoituksiin. + date: Tilauspäivä + disable_feature: Poista ominaisuus käytöstä + disabled: Tämä ominaisuus on poistettu käytöstä, eikä sähköpostia enää lähetetä tälle listalle. + email: Sähköpostiosoite + empty: + hint: Kukaan ei ole vielä tilannut tätä tiliä. + no_subscribers_yet: Ei vielä tilaajia + enable_feature: Ota ominaisuus käyttöön + no_access_html: Tällä tilillä ei ole enää ominaisuuden käyttöönottoon vaadittavia käyttöoikeuksia. Muuta tämä kohdassa Roolit. + title: Tilin %{name} sähköpostiuutiskirjeet + view_account: Näytä tili status: Tila subscribers: Tilaajia title: Postituslistat @@ -535,7 +550,9 @@ fi: index: disabled: cannot_be_enabled: Tekninen palveluntarjoajasi ei ole ottanut tätä omainaisuutta käyttöön palvelimellasi. + description: Tämä omainaisuus antaa määrättyjen käyttäjien lisätä profiiliinsa pienoisohjelman, jolloin vierailijat, joilla ei ole Mastodon-tiliä, voivat vastaanottaa hänen julkaisunsa sähköpostitse. get_started: Aloita + lead: Salli vierailijoiden vastaanottaa määrättyjen tämän palvelimen tilien julkaisut sähköpostitse. title: Sähköpostiuutiskirjeet purged_msg: Kaikki sähköpostitilausten tiedot hävitetään. roles: @@ -1524,7 +1541,9 @@ fi: success_html: Alat nyt saada sähköpostia, kun %{name} julkaisee uutta. Lisää %{sender} yhteystietoihisi, jotta nämä julkaisut eivät joudu roskapostikansioon. title: Olet aloittanut tilauksen unsubscribe: Peruuta tilaus + disabled: Poissa käytöstä inactive: Poissa käytöstä + no_access: Ei käyttöoikeutta status: Tila subscribers: Tilaajia emoji_styles: diff --git a/config/locales/fr-CA.yml b/config/locales/fr-CA.yml index 3199e2ed97c..14aa6424cbc 100644 --- a/config/locales/fr-CA.yml +++ b/config/locales/fr-CA.yml @@ -505,6 +505,21 @@ fr-CA: no_lists_yet: Aucune liste pour l'instant last_email: Dernier courriel lead: Les comptes ayant activé la fonctionnalité et qui ont des abonné·e·s apparaîtront ci-dessous. + show: + confirm_disable_feature: Désactiver les courriels d'information pour %{name} ? Les notifications par courriel ne seront plus envoyées pour ce compte. L'utilisateur·rice pourra toujours réactiver la fonctionnalité dans les paramètres de son compte. Pour supprimer définitivement l'accès à cette fonction, modifiez les permissions du compte dans Rôles. + confirm_remove_subscriber: "%{email} ne recevra plus de courriels de %{name}. Cette action ne peut pas être annulée." + consent: Les abonné·e·s ont uniquement consenti à recevoir des messages par courriels. N'utilisez pas cette liste à d'autres fins. + date: Date d'inscription + disable_feature: Désactiver la fonctionnalité + disabled: La fonctionnalité a été désactivée et les courriels ne sont plus envoyés à cette liste. + email: Adresse de courriel + empty: + hint: Personne ne s'est abonné à ce compte pour l'instant. + no_subscribers_yet: Pas d'abonné·e pour l'instant + enable_feature: Activer la fonctionnalité + no_access_html: Ce compte n'a plus l'autorisation nécessaire pour activer la fonctionnalité. Changez cela dans Rôles. + title: Lettres d'information par courriel de %{name} + view_account: Afficher le compte status: État subscribers: Abonné·e·s title: Listes de diffusion @@ -1532,7 +1547,9 @@ fr-CA: success_html: Vous allez maintenant commencer à recevoir des courriels quand %{name} publie de nouveaux messages. Ajoutez %{sender} à vos contacts pour que ces messages ne soient pas considérés comme des courriels indésirables. title: Vous êtes abonné·e unsubscribe: Se désabonner + disabled: Désactivé inactive: Inactif + no_access: Pas d'accès status: État subscribers: Abonné·e·s emoji_styles: diff --git a/config/locales/fr.yml b/config/locales/fr.yml index 6813e5aa2cd..7f5deae4d45 100644 --- a/config/locales/fr.yml +++ b/config/locales/fr.yml @@ -505,6 +505,21 @@ fr: no_lists_yet: Aucune liste pour l'instant last_email: Dernier courriel lead: Les comptes ayant activé la fonctionnalité et qui ont des abonné·e·s apparaîtront ci-dessous. + show: + confirm_disable_feature: Désactiver les courriels d'information pour %{name} ? Les notifications par courriel ne seront plus envoyées pour ce compte. L'utilisateur·rice pourra toujours réactiver la fonctionnalité dans les paramètres de son compte. Pour supprimer définitivement l'accès à cette fonction, modifiez les permissions du compte dans Rôles. + confirm_remove_subscriber: "%{email} ne recevra plus de courriels de %{name}. Cette action ne peut pas être annulée." + consent: Les abonné·e·s ont uniquement consenti à recevoir des messages par courriels. N'utilisez pas cette liste à d'autres fins. + date: Date d'inscription + disable_feature: Désactiver la fonctionnalité + disabled: La fonctionnalité a été désactivée et les courriels ne sont plus envoyés à cette liste. + email: Adresse de courriel + empty: + hint: Personne ne s'est abonné à ce compte pour l'instant. + no_subscribers_yet: Pas d'abonné·e pour l'instant + enable_feature: Activer la fonctionnalité + no_access_html: Ce compte n'a plus l'autorisation nécessaire pour activer la fonctionnalité. Changez cela dans Rôles. + title: Lettres d'information par courriel de %{name} + view_account: Afficher le compte status: État subscribers: Abonné·e·s title: Listes de diffusion @@ -1532,7 +1547,9 @@ fr: success_html: Vous allez maintenant commencer à recevoir des courriels quand %{name} publie de nouveaux messages. Ajoutez %{sender} à vos contacts pour que ces messages ne soient pas considérés comme des courriels indésirables. title: Vous êtes abonné·e unsubscribe: Se désabonner + disabled: Désactivé inactive: Inactif + no_access: Pas d'accès status: État subscribers: Abonné·e·s emoji_styles: diff --git a/config/locales/ga.yml b/config/locales/ga.yml index 9ca81055914..88791e38ad4 100644 --- a/config/locales/ga.yml +++ b/config/locales/ga.yml @@ -535,6 +535,21 @@ ga: no_lists_yet: Gan aon liostaí fós last_email: Ríomhphost deireanach lead: Taispeánfar thíos cuntais a bhfuil an ghné cumasaithe acu agus a bhfuil síntiúsóirí acu. + show: + confirm_disable_feature: An bhfuil tú ag iarraidh nuachtlitreacha ríomhphoist a dhíchumasú do %{name}? Ní sheolfar nuashonruithe ríomhphoist don chuntas seo a thuilleadh. Beidh an t-úsáideoir fós in ann an ghné a athchumasú ina socruithe cuntais. Chun rochtain ar an ngné seo a bhaint go buan, cuir cead an chuntais in eagar i Róil. + confirm_remove_subscriber: Ní bhfaighidh %{email} ríomhphoist ó %{name} a thuilleadh. Ní féidir an gníomh seo a chealú. + consent: Níor thoiligh síntiúsóirí ach le poist a fháil trí ríomhphost. Ná húsáid an liosta seo chun críocha eile. + date: Dáta an chláraithe + disable_feature: Díchumasaigh gné + disabled: Díchumasaíodh an ghné agus níl ríomhphoist á seoladh chuig an liosta seo a thuilleadh. + email: Seoladh ríomhphoist + empty: + hint: Níl aon duine cláraithe leis an gcuntas seo go fóill. + no_subscribers_yet: Gan aon síntiúsóirí fós + enable_feature: Cumasaigh gné + no_access_html: Níl na ceadanna riachtanacha ag an gcuntas seo a thuilleadh chun an ghné a chumasú. Athraigh seo i Róil. + title: Nuachtlitreacha ríomhphoist ó %{name} + view_account: Féach ar an gcuntas status: Stádas subscribers: Síntiúsóirí title: Liostaí poist @@ -1600,7 +1615,9 @@ ga: success_html: Tosóidh tú ag fáil ríomhphoist anois nuair a fhoilseoidh %{name} poist nua. Cuir %{sender} le do theagmhálaithe ionas nach gcríochnóidh na poist seo i do fhillteán Turscair. title: Tá tú cláraithe unsubscribe: Díliostáil + disabled: Míchumasaithe inactive: Neamhghníomhach + no_access: Gan rochtain status: Stádas subscribers: Síntiúsóirí emoji_styles: diff --git a/config/locales/hu.yml b/config/locales/hu.yml index 9614ae84662..150893f94b3 100644 --- a/config/locales/hu.yml +++ b/config/locales/hu.yml @@ -505,6 +505,21 @@ hu: no_lists_yet: Még nincsenek listák last_email: Legutóbbi e-mail lead: A fiókok, melyek bekapcsolták a funkciót, és vannak feliratkozóik, itt fognak megjelenni alább. + show: + confirm_disable_feature: Letiltod %{name} e-mailes hírleveleit? Az e-mailek ettől kezdve nem lesznek elküldve ennek a fióknak. A felhasználó továbbra is újra be tudja kapcsolni a funkciót a fiókbeállításaiban. A funkció elérésének végleges eltávolításához szerkeszd a fiók jogosultságait a Szerepekben. + confirm_remove_subscriber: 'A(z) %{email} már nem fog leveleket kapni a következőtől: %{name}. Ez a művelet nem vonható vissza.' + consent: A feliratkozók csak abba egyeztek bele, hogy levélben megkapják a bejegyzéseket. Ezt a listát ne használd más célokra. + date: Regisztráció dátuma + disable_feature: Funkció kikapcsolása + disabled: A funkció ki lett kapcsolva, és az e-mailek már nem kerülnek elküldésre erre a listára. + email: E-mail-cím + empty: + hint: Még senki sem iratkozott fel erre a fiókra. + no_subscribers_yet: Még nincsenek feliratkozók + enable_feature: Funkció bekapcsolása + no_access_html: A fióknak már nincs meg a szükséges jogosultsága a funkció bekapcsolásához. Módosítsd a Szerepekben. + title: "%{name} e-mailes hírlevelei" + view_account: Fiók megtekintése status: Állapot subscribers: Feliratkozók title: Levelezőlisták @@ -1499,6 +1514,7 @@ hu: your_appeal_rejected: A fellebbezésedet visszautasították edit_profile: other: Egyéb + privacy_redesign_body: A döntés, hogy megjeleníted-e a követettjeidet és követőidet, most már közvetlenül a profilodon tehető meg. redesign_body: A profil szerkesztése most már közvetlenül elérhető a profiloldalon. redesign_button: Ugrás oda redesign_title: Az új profilszerkesztési élmény @@ -1531,7 +1547,9 @@ hu: success_html: Mostantól levelet fogsz kapni, ha %{name} új bejegyzést tesz közzé. Add hozzá a feladót (%{sender}) a névjegyeidhez, hogy ne kerüljön a Levélszemét mappádba. title: Feliratkoztál unsubscribe: Leiratkozás + disabled: Kikapcsolva inactive: Inaktív + no_access: Nincs hozzáférés status: Állapot subscribers: Feliratkozók emoji_styles: diff --git a/config/locales/is.yml b/config/locales/is.yml index 34b740247ac..835c3e560cd 100644 --- a/config/locales/is.yml +++ b/config/locales/is.yml @@ -505,6 +505,16 @@ is: no_lists_yet: Ennþá engir listar last_email: Síðasti tölvupóstur lead: Aðgangar sem hafa virkjað eiginleikann og eru með áskrifendur munu birtast hér fyrir neðan. + show: + date: Dagsetning skráningar + disable_feature: Gera eiginleika óvirkan + email: Tölvupóstfang + empty: + hint: Enginn hefur enn gerst áskrifandi að þessum notandaaðgangi. + no_subscribers_yet: Engir áskrifendur ennþá + enable_feature: Virkja eiginleika + title: Tölvupóstfréttir frá %{name} + view_account: Skoða notandaaðgang status: Staða subscribers: Áskrifendur title: Póstlistar @@ -1536,7 +1546,9 @@ is: success_html: Þú munt núna fara að fá tölvupósta þegar %{name} birtir nýjar færslur. Bættu %{sender} í tengiliðina þína svo þessir póstar lendi ekki í ruslpóstmöppunni þinni. title: Þú hefur skráð þig unsubscribe: Hætta í áskrift + disabled: Óvirkt inactive: Óvirkur + no_access: Enginn aðgangur status: Staða subscribers: Áskrifendur emoji_styles: diff --git a/config/locales/it.yml b/config/locales/it.yml index c532c596d89..41fe6885a99 100644 --- a/config/locales/it.yml +++ b/config/locales/it.yml @@ -505,6 +505,21 @@ it: no_lists_yet: Non ci sono ancora liste last_email: Ultima email lead: Di seguito verranno visualizzati gli account che hanno attivato la funzionalità e che hanno degli iscritti. + show: + confirm_disable_feature: Disabilitare le newsletter per %{name}? Gli aggiornamenti via email non verranno più inviati per questo account. L'utente potrà comunque riattivare la funzione nelle impostazioni del proprio account. Per rimuovere definitivamente l'accesso a questa funzione, modificare le autorizzazioni dell'account in Ruoli. + confirm_remove_subscriber: "%{email} non riceverà più email da %{name}. Questa azione non può essere annullata." + consent: Gli iscritti hanno acconsentito esclusivamente a ricevere i post via email. Non utilizzare questa lista per altri scopi. + date: Data di iscrizione + disable_feature: Disabilita la funzionalità + disabled: La funzionalità è stata disabilitata e le email non vengono più inviate a questa lista. + email: Indirizzo email + empty: + hint: Nessuno si è ancora iscritto a questo account. + no_subscribers_yet: Ancora nessun iscritto + enable_feature: Abilita la funzionalità + no_access_html: Questo account non dispone più delle autorizzazioni necessarie per abilitare la funzionalità. Modifica questa impostazione in Ruoli. + title: Newsletter via email da %{name} + view_account: Visualizza l'account status: Stato subscribers: Iscritti title: Mailing list @@ -1532,7 +1547,9 @@ it: success_html: Ora inizierai a ricevere email quando %{name} pubblicherà nuovi post. Aggiungi %{sender} ai tuoi contatti in modo che questi post non finiscano nella cartella Spam. title: Ti sei registrato/a unsubscribe: Disiscriviti + disabled: Disabilitata inactive: Inattiva + no_access: Nessun accesso status: Stato subscribers: Iscritti emoji_styles: diff --git a/config/locales/lv.yml b/config/locales/lv.yml index 68515865c42..3b4341c3a52 100644 --- a/config/locales/lv.yml +++ b/config/locales/lv.yml @@ -321,10 +321,10 @@ lv: publish: Publicēt published_msg: Paziņojums sekmīgi publicēts. scheduled_for: Plānots uz %{time} - scheduled_msg: Paziņojums ieplānots publicēšanai! + scheduled_msg: Paziņojums ierindots publicēšanai. title: Paziņojumi unpublish: Atcelt publicēšanu - unpublished_msg: Paziņojuma publicēšana sekmīgi atcelta! + unpublished_msg: Paziņojuma publicēšana sekmīgi atcelta. updated_msg: Paziņojums sekmīgi atjaunināts! critical_update_pending: Gaida kritisko atjauninājumu custom_emojis: @@ -894,7 +894,7 @@ lv: reblogs: Reblogi replied_to_html: Atbildēja %{acct_link} status_changed: Ieraksts izmainīts - status_title: Publicēja @%{name} + status_title: Ievietoja @%{name} title: Konta ieraksti - @%{name} trending: Aktuāli view_publicly: Skatīt publiski @@ -1205,7 +1205,7 @@ lv: description: prefix_invited_by_user: "@%{name} aicina tevi pievienoties šim Mastodon serverim!" prefix_sign_up: Reģistrējies Mastodon jau šodien! - suffix: Izmantojot kontu, tu varēsi sekot cilvēkiem, publicēt atjauninājumus un apmainīties ar ziņojumiem ar lietotājiem no jebkura Mastodon servera un daudz ko citu! + suffix: Ar kontu varēsi sekot cilvēkiem, ievietot atjauninājumus un apmainīties ar ziņojumiem ar lietotājiem no jebkura Mastodon servera un daudz ko citu. didnt_get_confirmation: Vai nesaņēmi apstiprinājuma saiti? dont_have_your_security_key: Vai tev nav drošības atslēgas? forgot_password: Aizmirsi paroli? @@ -1666,7 +1666,7 @@ lv: subject: "%{name} izcēla tavu ziņu" title: Jauns izcēlums status: - subject: "%{name} tikko publicēja" + subject: "%{name} tikko pievienoja ierakstu" update: subject: "%{name} laboja ierakstu" notifications: @@ -1711,7 +1711,7 @@ lv: too_many_options: nevar saturēt vairāk par %{max} vienumiem preferences: other: Citi - posting_defaults: Publicēšanas noklusējuma iestatījumi + posting_defaults: Ierakstu pievienošanas noklusējumi public_timelines: Publiskās ziņu lentas privacy: hint_html: "Pielāgo, kā vēlies atrast savu profilu un ziņas. Dažādas Mastodon funkcijas var palīdzēt sasniegt plašāku auditoriju, ja tās ir iespējotas. Velti laiku, lai pārskatītu šos iestatījumus, lai pārliecinātos, ka tie atbilst tavam lietošanas gadījumam." diff --git a/config/locales/nl.yml b/config/locales/nl.yml index 6caa2d68a27..91e61810c4b 100644 --- a/config/locales/nl.yml +++ b/config/locales/nl.yml @@ -505,6 +505,21 @@ nl: no_lists_yet: Nog geen lijsten last_email: Meest recente e-mail lead: Accounts die deze functionaliteit hebben ingeschakeld en abonnees hebben, worden hieronder getoond. + show: + confirm_disable_feature: E-mailnieuwsbrieven voor %{name} uitschakelen? E-mailupdates voor dit account worden niet langer verzonden. De gebruiker kan deze functionaliteit nog steeds in diens accountinstellingen inschakelen. Om de toegang tot deze functie permanent te verwijderen, wijzig dan de rechten van het account onder 'Beheer > rollen'. + confirm_remove_subscriber: "%{email} ontvangt niet langer e-mails van %{name}. Deze actie kan niet ongedaan worden gemaakt." + consent: Abonnees hebben alleen toestemming gegeven om berichten via e-mail te ontvangen. Gebruik deze lijst niet voor andere doeleinden. + date: Datum van abonneren + disable_feature: Functionaliteit uitschakelen + disabled: De functionaliteit is uitgeschakeld en e-mails worden niet meer naar deze lijst verzonden. + email: E-mailadres + empty: + hint: Niemand heeft zich nog op dit account geabonneerd. + no_subscribers_yet: Nog geen abonnees + enable_feature: Functionaliteit inschakelen + no_access_html: Dit account is niet langer gemachtigd om de functionaliteit in te schakelen. Wijzig dit onder 'Beheer > rollen'. + title: E-mailnieuwsbrieven van %{name} + view_account: Account bekijken status: Status subscribers: Abonnees title: Mailinglijsten @@ -1532,7 +1547,9 @@ nl: success_html: Je ontvangt nu e-mails wanneer %{name} nieuwe berichten publiceert. Voeg %{sender} toe aan je contactpersonen, zodat deze berichten niet in je spam terechtkomen. title: Je bent ingeschreven unsubscribe: Afmelden + disabled: Uitgeschakeld inactive: Inactief + no_access: Geen toegang status: Status subscribers: Abonnees emoji_styles: diff --git a/config/locales/pt-BR.yml b/config/locales/pt-BR.yml index ad71ba1dde3..4dce9394129 100644 --- a/config/locales/pt-BR.yml +++ b/config/locales/pt-BR.yml @@ -505,6 +505,21 @@ pt-BR: no_lists_yet: Não há listas ainda last_email: Último email lead: Contas que ativaram o recurso e têm inscritos aparecerão abaixo. + show: + confirm_disable_feature: Desativar e-mails de notícia de %{name}? Os e-mails de notícia não serão mais enviados a esta conta. O usuário poderá reativar este recurso através das opções da conta. Para remover acesso permanente a este recurso, edite as permissões da conta em Cargos. + confirm_remove_subscriber: "%{email} não receberá mais e-mails de %{name}. Esta ação não pode ser desfeita." + consent: Os inscritos só permitiram receber publicações por e-mail. Não use esta lista para outra coisa. + date: Data de registro + disable_feature: Desativar recurso + disabled: O recurso foi desativado e os e-mails não são mais enviados a esta lista. + email: Endereço de e-mail + empty: + hint: Ninguém ainda se inscreveu a esta conta. + no_subscribers_yet: Nenhum inscrito ainda + enable_feature: Ativar recurso + no_access_html: Esta conta não tem mais as permissões necessárias para ativar o recurso. Altere isso em Cargos. + title: E-mails de notícia de %{name} + view_account: Ver conta status: Estado subscribers: Inscritos title: Listas de envio @@ -1532,7 +1547,9 @@ pt-BR: success_html: Agora você começará a receber e-mails quando %{name} publicar novas postagens. Adicione %{sender} para seus contatos para que essas publicações não apareçam em sua caixa de Spam. title: Você está registrado unsubscribe: Cancelar inscrição + disabled: Desativado inactive: Inativo + no_access: Sem acesso status: Situação subscribers: Inscritos emoji_styles: diff --git a/config/locales/simple_form.lv.yml b/config/locales/simple_form.lv.yml index 7cc0a2ee322..13699f7a993 100644 --- a/config/locales/simple_form.lv.yml +++ b/config/locales/simple_form.lv.yml @@ -32,7 +32,7 @@ lv: announcement: all_day: Atzīmējot šo opciju, tiks parādīti tikai laika diapazona datumi ends_at: Neobligāts. Paziņojums šoreiz tiks automātiski atcelts - scheduled_at: Lai nekavējoties publicētu paziņojumu, atstāj tukšu + scheduled_at: Atstāt tukšu, lai nekavējoties publicētu paziņojumu starts_at: Neobligāts. Ja tavs paziņojums ir saistīts ar noteiktu laika diapazonu text: Varari izmantot ziņu sintaksi. Lūdzu, apdomā lauku, ko paziņojums aizņems lietotāja ekrānā appeal: @@ -73,7 +73,7 @@ lv: hide: Paslēp filtrēto saturu pilnībā, izturoties tā, it kā tas neeksistētu warn: Paslēp filtrēto saturu aiz brīdinājuma, kurā minēts filtra nosaukums form_admin_settings: - activity_api_enabled: Vietēji publicēto ziņu, aktīvo lietotāju un jauno reģistrāciju skaits nedēļas kopās + activity_api_enabled: Vietēji pievienoto ierakstu, darbīgo lietotāju un jauno reģistrāciju skaits iknedēļas kopās app_icon: WEBP, PNG, GIF vai JPG. Mobilajās ierīcēs aizstāj noklusējuma lietotnes ikonu ar pielāgotu. backups_retention_period: Lietotājiem ir iespēja izveidot savu ierakstu arhīvu lejupielādēšanai vēlāk. Kad iestatīta pozitīva vērtība, šie arhīvi tiks automātiski izdzēsti no krātuves pēc norādītā dienu skaita. closed_registrations_message: Tiek rādīts, kad reģistrēšanās ir slēgta @@ -120,7 +120,7 @@ lv: webauthn: Ja tā ir USB atslēga, noteikti ievieto to un, ja nepieciešams, pieskaries tai. settings: indexable: Tava profila lapa var tikt parādīta Google, Bing un citu meklēšanas dzinēju rezultātos. - show_application: Tu vienmēr varēsi redzēt, kura lietotne publicēja tavu ziņu. + show_application: Tu vienmēr varēsi redzēt, kura lietotne pievienoja Tavu ierakstu. tag: name: Tu vari mainīt tikai burtu lielumu, piemēram, lai tie būtu vieglāk lasāmi terms_of_service: @@ -208,7 +208,7 @@ lv: setting_aggregate_reblogs: Grupēt pastiprinājumus ierakstu lentās setting_always_send_emails: Vienmēr sūtīt e-pasta paziņojumus setting_auto_play_gif: Automātiski atskaņot animētos GIF - setting_default_language: Publicēšanas valoda + setting_default_language: Ierakstu pievienošanas valoda setting_default_quote_policy: Kas var citēt setting_default_sensitive: Vienmēr atzīmēt informācijas nesējus kā jūtīgus setting_disable_hover_cards: Atspējot profila priekšskatījumu pēc kursora novietošanas diff --git a/config/locales/tr.yml b/config/locales/tr.yml index 6115fdbdf95..4365046e057 100644 --- a/config/locales/tr.yml +++ b/config/locales/tr.yml @@ -505,6 +505,21 @@ tr: no_lists_yet: Henüz liste yok last_email: Son e-posta lead: Bu özelliği etkinleştirmiş ve abonesi olan hesaplar aşağıda gösterilecektir. + show: + confirm_disable_feature: "%{name} için e-posta bültenlerini devre dışı bırakmak ister misiniz? Bu hesap için artık e-posta güncellemeleri gönderilmeyecektir. Kullanıcı, hesap ayarlarından bu özelliği yeniden etkinleştirebilir. Bu özelliğe erişimi kalıcı olarak kaldırmak için, Roller bölümünden hesabın izinlerini düzenleyin." + confirm_remove_subscriber: "%{email} artık %{name}'den e-posta almayacaktır. Bu işlem geri alınamaz." + consent: Aboneler yalnızca e-posta yoluyla mesaj almayı kabul etmişlerdir. Bu listeyi başka amaçlarla kullanmayınız. + date: Kayıt tarihi + disable_feature: Özelliği devre dışı bırak + disabled: Bu özellik devre dışı bırakıldı ve artık bu listeye e-posta gönderilmiyor. + email: E-posta adresi + empty: + hint: Henüz kimse bu hesaba abone olmamış. + no_subscribers_yet: Henüz abone yok + enable_feature: Özelliği etkinleştir + no_access_html: Bu hesap, özelliği etkinleştirmek için gereken izinlere artık sahip değil. Bu ayarı Roller bölümünden değiştirin. + title: "%{name}'in e-posta bültenleri" + view_account: Hesabı görüntüle status: Durum subscribers: Aboneler title: E-posta listeleri @@ -1499,6 +1514,7 @@ tr: your_appeal_rejected: İtirazınız reddedildi edit_profile: other: Diğer + privacy_redesign_body: Takip ettiğiniz kişileri ve takipçilerinizi gösterme seçeneği artık doğrudan profilinizden yapılmaktadır. redesign_body: Profil düzenlemeye şimdi doğrudan profil sayfasından da erişilebilir. redesign_button: Git redesign_title: Yeni bir profile düzenleme deneyimi var @@ -1531,7 +1547,9 @@ tr: success_html: "%{name} yeni bir yazı yayınladığında artık e-posta almaya başlayacaksınız. Bu yazılar spam klasörüne düşmesin diye %{sender}'ı kişi listenize ekleyin." title: Abone oldunuz unsubscribe: Abonelikten çık + disabled: Devre dışı inactive: Etkin değil + no_access: Erişim yok status: Durum subscribers: Aboneler emoji_styles: diff --git a/config/locales/zh-CN.yml b/config/locales/zh-CN.yml index 8a41d98676d..97eb4e83c93 100644 --- a/config/locales/zh-CN.yml +++ b/config/locales/zh-CN.yml @@ -495,6 +495,21 @@ zh-CN: no_lists_yet: 尚无列表 last_email: 最新电子邮件 lead: 已启用此功能并拥有订阅者的账号会在下方显示。 + show: + confirm_disable_feature: 禁用 %{name} 的邮件电子报吗?此后将不再执行此账号的电子邮件推送。该用户仍可以在账号设置中重新启用此功能。要永久移除此功能的访问权限,请在“角色”设置中编辑账号权限。 + confirm_remove_subscriber: "%{email} 将不会再收到来自 %{name} 的电子邮件。此操作无法撤销。" + consent: 此列表中的订阅者仅同意通过电子邮件接受嘟文。请不要将此列表用作其他目的。 + date: 订阅注册日期 + disable_feature: 禁用功能 + disabled: 此功能已被禁用,邮件已不再向此列表内发送。 + email: 电子邮件地址 + empty: + hint: 暂时没有人订阅这个账号。 + no_subscribers_yet: 尚无订阅者 + enable_feature: 启用功能 + no_access_html: 此账号不再拥有启用该功能所需的权限。请在角色设置处更改。 + title: "%{name}的邮件电子报" + view_account: 查看账号 status: 状态 subscribers: 订阅者 title: 邮件列表 @@ -1510,7 +1525,9 @@ zh-CN: success_html: 现在开始当 %{name} 发布新嘟文时你会收到邮件提醒。记得将 %{sender} 添加到邮箱联系人中,以免嘟文推送被丢入垃圾邮件文件夹。 title: 你已成功订阅 unsubscribe: 取消订阅 + disabled: 已禁用 inactive: 未生效 + no_access: 没有权限 status: 状态 subscribers: 订阅者 emoji_styles: diff --git a/config/locales/zh-TW.yml b/config/locales/zh-TW.yml index 99647d575f1..b6dcd7720da 100644 --- a/config/locales/zh-TW.yml +++ b/config/locales/zh-TW.yml @@ -497,6 +497,21 @@ zh-TW: no_lists_yet: 尚無列表 last_email: 最新電子郵件地址 lead: 已啟用此功能並擁有訂閱者之帳號將於下方顯示。 + show: + confirm_disable_feature: 是否替 %{name} 停用電子報功能?電子報郵件將不被寄至此帳號。該使用者仍能於帳號設定中重新啟用此功能。如欲永久禁用此功能,請於角色設定中編輯該帳號之權限。 + confirm_remove_subscriber: "%{email} 將不再收到來自 %{name} 之電子郵件。此動作無法回復。" + consent: 訂閱者僅同意透過電子郵件接收嘟文。請勿將此名單用於其他用途。 + date: 註冊日期 + disable_feature: 停用功能 + disabled: 此功能已停用且電子郵件將不被寄至此列表。 + email: 電子郵件地址 + empty: + hint: 尚無任何人訂閱此帳號。 + no_subscribers_yet: 尚無訂閱者 + enable_feature: 啟用功能 + no_access_html: 此帳號不再擁有啟用此功能所需之權限。請於 角色設定中修改此設定。 + title: "%{name} 之電子報" + view_account: 檢視帳號 status: 狀態 subscribers: 訂閱者 title: 電子郵件列表 @@ -1514,7 +1529,9 @@ zh-TW: success_html: 您將開始收到當 %{name} 發表新嘟文之電子郵件。請新增 %{sender} 至您的通訊錄使這些嘟文不被分類至垃圾信件夾。 title: 已完成註冊 unsubscribe: 取消訂閱 + disabled: 已停用 inactive: 已停用 + no_access: 無法存取 status: 狀態 subscribers: 訂閱者 emoji_styles: From da1d731cb496153f3e24b6dad71adbbce1278024 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Tue, 9 Jun 2026 11:54:10 +0200 Subject: [PATCH 070/130] Update actions/checkout digest to df4cb1c (#39321) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- .github/workflows/build-container-image.yml | 4 ++-- .github/workflows/build-push-pr.yml | 2 +- .github/workflows/build-releases.yml | 2 +- .github/workflows/bundler-audit.yml | 2 +- .github/workflows/check-i18n.yml | 2 +- .github/workflows/chromatic.yml | 4 ++-- .github/workflows/codeql.yml | 2 +- .github/workflows/crowdin-download-stable.yml | 2 +- .github/workflows/crowdin-download.yml | 2 +- .github/workflows/crowdin-upload.yml | 2 +- .github/workflows/format-check.yml | 2 +- .github/workflows/lint-css.yml | 2 +- .github/workflows/lint-haml.yml | 2 +- .github/workflows/lint-js.yml | 2 +- .github/workflows/lint-ruby.yml | 2 +- .github/workflows/test-js.yml | 2 +- .github/workflows/test-migrations.yml | 2 +- .github/workflows/test-ruby.yml | 8 ++++---- 18 files changed, 23 insertions(+), 23 deletions(-) diff --git a/.github/workflows/build-container-image.yml b/.github/workflows/build-container-image.yml index 82947dd2592..8db68a7cda2 100644 --- a/.github/workflows/build-container-image.yml +++ b/.github/workflows/build-container-image.yml @@ -35,7 +35,7 @@ jobs: - linux/arm64 steps: - - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6 + - uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6 - name: Prepare env: @@ -120,7 +120,7 @@ jobs: PUSH_TO_IMAGES: ${{ inputs.push_to_images }} steps: - - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6 + - uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6 - name: Download digests uses: actions/download-artifact@37930b1c2abaa49bbe596cd826c3c89aef350131 # v7 diff --git a/.github/workflows/build-push-pr.yml b/.github/workflows/build-push-pr.yml index e9953b9ffec..70e4db1fa36 100644 --- a/.github/workflows/build-push-pr.yml +++ b/.github/workflows/build-push-pr.yml @@ -18,7 +18,7 @@ jobs: steps: # Repository needs to be cloned so `git rev-parse` below works - name: Clone repository - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6 + uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6 - id: version_vars run: | echo mastodon_version_metadata=pr-${{ github.event.pull_request.number }}-$(git rev-parse --short ${{github.event.pull_request.head.sha}}) >> $GITHUB_OUTPUT diff --git a/.github/workflows/build-releases.yml b/.github/workflows/build-releases.yml index 3307fe97fad..d4d16737090 100644 --- a/.github/workflows/build-releases.yml +++ b/.github/workflows/build-releases.yml @@ -16,7 +16,7 @@ jobs: steps: # Repository needs to be cloned to list branches - name: Clone repository - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6 + uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6 with: fetch-depth: 0 diff --git a/.github/workflows/bundler-audit.yml b/.github/workflows/bundler-audit.yml index dc79d872646..e28552f40ac 100644 --- a/.github/workflows/bundler-audit.yml +++ b/.github/workflows/bundler-audit.yml @@ -29,7 +29,7 @@ jobs: steps: - name: Clone repository - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6 + uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6 - name: Set up Ruby uses: ruby/setup-ruby@afeafc3d1ab54a631816aba4c914a0081c12ff2f # v1 diff --git a/.github/workflows/check-i18n.yml b/.github/workflows/check-i18n.yml index 3a0c5dc36a8..4b221df123e 100644 --- a/.github/workflows/check-i18n.yml +++ b/.github/workflows/check-i18n.yml @@ -22,7 +22,7 @@ jobs: timeout-minutes: 15 steps: - - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6 + - uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6 - name: Set up Ruby environment uses: ./.github/actions/setup-ruby diff --git a/.github/workflows/chromatic.yml b/.github/workflows/chromatic.yml index 05f88df81c0..7e6514673d4 100644 --- a/.github/workflows/chromatic.yml +++ b/.github/workflows/chromatic.yml @@ -17,7 +17,7 @@ jobs: changed: ${{ steps.filter.outputs.src }} steps: - name: Checkout code - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6 + uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6 with: fetch-depth: 0 @@ -44,7 +44,7 @@ jobs: if: github.repository == 'mastodon/mastodon' && needs.pathcheck.outputs.changed == 'true' steps: - name: Checkout code - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6 + uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6 with: fetch-depth: 0 diff --git a/.github/workflows/codeql.yml b/.github/workflows/codeql.yml index bc796d828ce..0ba1d244dd7 100644 --- a/.github/workflows/codeql.yml +++ b/.github/workflows/codeql.yml @@ -32,7 +32,7 @@ jobs: steps: - name: Checkout repository - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6 + uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6 # Initializes the CodeQL tools for scanning. - name: Initialize CodeQL diff --git a/.github/workflows/crowdin-download-stable.yml b/.github/workflows/crowdin-download-stable.yml index 65e8cc7f80a..5c52fd61f8b 100644 --- a/.github/workflows/crowdin-download-stable.yml +++ b/.github/workflows/crowdin-download-stable.yml @@ -13,7 +13,7 @@ jobs: steps: - name: Checkout - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6 + uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6 - name: Increase Git http.postBuffer # This is needed due to a bug in Ubuntu's cURL version? diff --git a/.github/workflows/crowdin-download.yml b/.github/workflows/crowdin-download.yml index 4c4fe9688cf..17f2ffbf562 100644 --- a/.github/workflows/crowdin-download.yml +++ b/.github/workflows/crowdin-download.yml @@ -15,7 +15,7 @@ jobs: steps: - name: Checkout - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6 + uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6 - name: Increase Git http.postBuffer # This is needed due to a bug in Ubuntu's cURL version? diff --git a/.github/workflows/crowdin-upload.yml b/.github/workflows/crowdin-upload.yml index 2b9a4c899bd..c781bd4f138 100644 --- a/.github/workflows/crowdin-upload.yml +++ b/.github/workflows/crowdin-upload.yml @@ -23,7 +23,7 @@ jobs: steps: - name: Checkout - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6 + uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6 - name: crowdin action uses: crowdin/github-action@8868a33591d21088edfc398968173a3b98d51706 # v2 diff --git a/.github/workflows/format-check.yml b/.github/workflows/format-check.yml index cca26ed5b09..5d06f81ee2a 100644 --- a/.github/workflows/format-check.yml +++ b/.github/workflows/format-check.yml @@ -14,7 +14,7 @@ jobs: steps: - name: Clone repository - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6 + uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6 - name: Set up Javascript environment uses: ./.github/actions/setup-javascript diff --git a/.github/workflows/lint-css.yml b/.github/workflows/lint-css.yml index 59c69f836cb..dbd9fc6182b 100644 --- a/.github/workflows/lint-css.yml +++ b/.github/workflows/lint-css.yml @@ -31,7 +31,7 @@ jobs: steps: - name: Clone repository - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6 + uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6 - name: Set up Javascript environment uses: ./.github/actions/setup-javascript diff --git a/.github/workflows/lint-haml.yml b/.github/workflows/lint-haml.yml index 9534eb22545..d212a280bf7 100644 --- a/.github/workflows/lint-haml.yml +++ b/.github/workflows/lint-haml.yml @@ -32,7 +32,7 @@ jobs: steps: - name: Clone repository - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6 + uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6 - name: Set up Ruby uses: ruby/setup-ruby@afeafc3d1ab54a631816aba4c914a0081c12ff2f # v1 diff --git a/.github/workflows/lint-js.yml b/.github/workflows/lint-js.yml index 4fa08283684..93cbb2d73d8 100644 --- a/.github/workflows/lint-js.yml +++ b/.github/workflows/lint-js.yml @@ -37,7 +37,7 @@ jobs: steps: - name: Clone repository - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6 + uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6 - name: Set up Javascript environment uses: ./.github/actions/setup-javascript diff --git a/.github/workflows/lint-ruby.yml b/.github/workflows/lint-ruby.yml index ffecf17a765..a308149d61d 100644 --- a/.github/workflows/lint-ruby.yml +++ b/.github/workflows/lint-ruby.yml @@ -34,7 +34,7 @@ jobs: steps: - name: Clone repository - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6 + uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6 - name: Set up Ruby uses: ruby/setup-ruby@afeafc3d1ab54a631816aba4c914a0081c12ff2f # v1 diff --git a/.github/workflows/test-js.yml b/.github/workflows/test-js.yml index f9ba34e32b9..5a78fd2997d 100644 --- a/.github/workflows/test-js.yml +++ b/.github/workflows/test-js.yml @@ -35,7 +35,7 @@ jobs: steps: - name: Clone repository - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6 + uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6 - name: Set up Javascript environment uses: ./.github/actions/setup-javascript diff --git a/.github/workflows/test-migrations.yml b/.github/workflows/test-migrations.yml index 52fefbe053e..4d0c4b811a8 100644 --- a/.github/workflows/test-migrations.yml +++ b/.github/workflows/test-migrations.yml @@ -73,7 +73,7 @@ jobs: BUNDLE_RETRY: 3 steps: - - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6 + - uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6 - name: Set up Ruby environment uses: ./.github/actions/setup-ruby diff --git a/.github/workflows/test-ruby.yml b/.github/workflows/test-ruby.yml index e4c6c1aa916..ce13d49ffdb 100644 --- a/.github/workflows/test-ruby.yml +++ b/.github/workflows/test-ruby.yml @@ -33,7 +33,7 @@ jobs: SECRET_KEY_BASE_DUMMY: 1 steps: - - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6 + - uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6 - name: Set up Ruby environment uses: ./.github/actions/setup-ruby @@ -130,7 +130,7 @@ jobs: - '3.4' - '.ruby-version' steps: - - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6 + - uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6 - uses: actions/download-artifact@37930b1c2abaa49bbe596cd826c3c89aef350131 # v7 with: @@ -225,7 +225,7 @@ jobs: - '.ruby-version' steps: - - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6 + - uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6 - uses: actions/download-artifact@37930b1c2abaa49bbe596cd826c3c89aef350131 # v7 with: @@ -364,7 +364,7 @@ jobs: search-image: opensearchproject/opensearch:2 steps: - - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6 + - uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6 - uses: actions/download-artifact@37930b1c2abaa49bbe596cd826c3c89aef350131 # v7 with: From fef5a501cc442c735c8ecf1ea8e93446b5cedddf Mon Sep 17 00:00:00 2001 From: Matt Jankowski Date: Tue, 9 Jun 2026 05:54:38 -0400 Subject: [PATCH 071/130] Add coverage for rules acceptance and invite code handling (#39310) --- spec/system/auth/registrations_spec.rb | 22 +++++++++++++++++++++- 1 file changed, 21 insertions(+), 1 deletion(-) diff --git a/spec/system/auth/registrations_spec.rb b/spec/system/auth/registrations_spec.rb index e3b5683aa0e..2cf0dfe46f3 100644 --- a/spec/system/auth/registrations_spec.rb +++ b/spec/system/auth/registrations_spec.rb @@ -6,13 +6,33 @@ RSpec.describe 'Auth Registration' do context 'when there are server rules' do let!(:rule) { Fabricate :rule, text: 'You must be seven meters tall' } let!(:rule_translation) { Fabricate :rule_translation, rule:, hint: 'Rule translation hint', text: rule.text } + let(:invite) { Fabricate :invite, autofollow: true } it 'shows rules page before proceeding with sign up' do - visit new_user_registration_path + visit new_user_registration_path(invite_code: invite.code) expect(page) .to have_title(I18n.t('auth.register')) .and have_text(rule.text) .and have_text(rule_translation.hint) + + click_on I18n.t('auth.rules.accept') + expect(page) + .to have_text(I18n.t('auth.sign_up.preamble')) + .and have_text(I18n.t('invites.invited_by')) + end + end + + context 'when an invite code was previously followed' do + let(:older_invite) { Fabricate :invite, autofollow: true } + let(:invite) { Fabricate :invite, autofollow: true } + + before { visit new_user_registration_path(invite_code: older_invite.code) } + + it 'honors the newer invitation' do + visit new_user_registration_path(invite_code: invite.code) + expect(page) + .to have_text(I18n.t('invites.invited_by')) + .and have_text(invite.user.account.username) end end From 4fcb28e081658dec5dc91925086a624c6369b18a Mon Sep 17 00:00:00 2001 From: David Roetzel Date: Tue, 9 Jun 2026 12:31:58 +0200 Subject: [PATCH 072/130] Collections API: Set a maximum for the pagination `limit` param (#39342) --- app/controllers/api/v1/collections_controller.rb | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/app/controllers/api/v1/collections_controller.rb b/app/controllers/api/v1/collections_controller.rb index 9acd535f465..50a825aface 100644 --- a/app/controllers/api/v1/collections_controller.rb +++ b/app/controllers/api/v1/collections_controller.rb @@ -4,6 +4,7 @@ class Api::V1::CollectionsController < Api::BaseController include Authorization DEFAULT_COLLECTIONS_LIMIT = 40 + MAX_COLLECTIONS_LIMIT = 100 rescue_from ActiveRecord::RecordInvalid, Mastodon::ValidationError do |e| render json: { error: ValidationErrorFormatter.new(e).as_json }, status: 422 @@ -73,7 +74,7 @@ class Api::V1::CollectionsController < Api::BaseController .with_tag .order(created_at: :desc) .offset(offset_param) - .limit(limit_param(DEFAULT_COLLECTIONS_LIMIT)) + .limit(limit_param(DEFAULT_COLLECTIONS_LIMIT, MAX_COLLECTIONS_LIMIT)) @collections = @collections.discoverable unless @account == current_account end From 9c493c20b931474d94e2e8ea8a0ce55925df51eb Mon Sep 17 00:00:00 2001 From: Evan Prodromou Date: Tue, 9 Jun 2026 08:28:53 -0400 Subject: [PATCH 073/130] Add policy to filter notifications from bots (#38494) (#38809) --- .../v1/notifications/policies_controller.rb | 3 +- .../v2/notifications/policies_controller.rb | 3 +- .../api_types/notification_policies.ts | 1 + .../components/policy_controls.tsx | 25 ++++ .../components/ignore_notifications_modal.jsx | 3 + app/javascript/mastodon/locales/en.json | 3 + app/models/notification_policy.rb | 6 + .../rest/notification_policy_serializer.rb | 1 + .../rest/v1/notification_policy_serializer.rb | 5 + app/services/notify_service.rb | 18 ++- ...3_add_for_bots_to_notification_policies.rb | 7 ++ db/schema.rb | 1 + spec/models/notification_policy_spec.rb | 29 +++++ .../api/v1/notifications/policies_spec.rb | 7 ++ .../api/v2/notifications/policies_spec.rb | 11 ++ spec/services/notify_service_spec.rb | 110 ++++++++++++++++++ 16 files changed, 229 insertions(+), 4 deletions(-) create mode 100644 db/migrate/20260425144553_add_for_bots_to_notification_policies.rb diff --git a/app/controllers/api/v1/notifications/policies_controller.rb b/app/controllers/api/v1/notifications/policies_controller.rb index 9d70c283bec..0cad5fe0b8c 100644 --- a/app/controllers/api/v1/notifications/policies_controller.rb +++ b/app/controllers/api/v1/notifications/policies_controller.rb @@ -31,7 +31,8 @@ class Api::V1::Notifications::PoliciesController < Api::BaseController :filter_not_following, :filter_not_followers, :filter_new_accounts, - :filter_private_mentions + :filter_private_mentions, + :filter_bots ) end end diff --git a/app/controllers/api/v2/notifications/policies_controller.rb b/app/controllers/api/v2/notifications/policies_controller.rb index 637587967fe..de20dd071e9 100644 --- a/app/controllers/api/v2/notifications/policies_controller.rb +++ b/app/controllers/api/v2/notifications/policies_controller.rb @@ -32,7 +32,8 @@ class Api::V2::Notifications::PoliciesController < Api::BaseController :for_not_followers, :for_new_accounts, :for_private_mentions, - :for_limited_accounts + :for_limited_accounts, + :for_bots ) end end diff --git a/app/javascript/mastodon/api_types/notification_policies.ts b/app/javascript/mastodon/api_types/notification_policies.ts index 1c3970782cb..40ca89e78fb 100644 --- a/app/javascript/mastodon/api_types/notification_policies.ts +++ b/app/javascript/mastodon/api_types/notification_policies.ts @@ -8,6 +8,7 @@ export interface NotificationPolicyJSON { for_new_accounts: NotificationPolicyValue; for_private_mentions: NotificationPolicyValue; for_limited_accounts: NotificationPolicyValue; + for_bots: NotificationPolicyValue; summary: { pending_requests_count: number; pending_notifications_count: number; diff --git a/app/javascript/mastodon/features/notifications/components/policy_controls.tsx b/app/javascript/mastodon/features/notifications/components/policy_controls.tsx index a4743b0c221..03fb3530ca7 100644 --- a/app/javascript/mastodon/features/notifications/components/policy_controls.tsx +++ b/app/javascript/mastodon/features/notifications/components/policy_controls.tsx @@ -88,6 +88,13 @@ export const PolicyControls: React.FC = () => { [dispatch], ); + const handleFilterBots = useCallback( + (value: string) => { + changeFilter(dispatch, 'for_bots', value); + }, + [dispatch], + ); + if (!notificationPolicy) return null; const options = [ @@ -209,6 +216,24 @@ export const PolicyControls: React.FC = () => { /> } /> + + + } + hint={ + + } + />
); diff --git a/app/javascript/mastodon/features/ui/components/ignore_notifications_modal.jsx b/app/javascript/mastodon/features/ui/components/ignore_notifications_modal.jsx index 3ef771ed768..d6962152c52 100644 --- a/app/javascript/mastodon/features/ui/components/ignore_notifications_modal.jsx +++ b/app/javascript/mastodon/features/ui/components/ignore_notifications_modal.jsx @@ -48,6 +48,9 @@ export const IgnoreNotificationsModal = ({ filterType }) => { case 'for_limited_accounts': title = ; break; + case 'for_bots': + title = ; + break; } return ( diff --git a/app/javascript/mastodon/locales/en.json b/app/javascript/mastodon/locales/en.json index 511ae3503cb..b6ccc679f1c 100644 --- a/app/javascript/mastodon/locales/en.json +++ b/app/javascript/mastodon/locales/en.json @@ -780,6 +780,7 @@ "home.pending_critical_update.link": "See updates", "home.pending_critical_update.title": "Critical security update available!", "home.show_announcements": "Show announcements", + "ignore_notifications_modal.bots_title": "Ignore notifications from bots?", "ignore_notifications_modal.disclaimer": "Mastodon cannot inform users that you've ignored their notifications. Ignoring notifications will not stop the messages themselves from being sent.", "ignore_notifications_modal.filter_instead": "Filter instead", "ignore_notifications_modal.filter_to_act_users": "You'll still be able to accept, reject, or report users", @@ -1042,6 +1043,8 @@ "notifications.policy.drop": "Ignore", "notifications.policy.drop_hint": "Send to the void, never to be seen again", "notifications.policy.filter": "Filter", + "notifications.policy.filter_bots_hint": "Accounts marked as automated", + "notifications.policy.filter_bots_title": "Bots", "notifications.policy.filter_hint": "Send to filtered notifications inbox", "notifications.policy.filter_limited_accounts_hint": "Limited by server moderators", "notifications.policy.filter_limited_accounts_title": "Moderated accounts", diff --git a/app/models/notification_policy.rb b/app/models/notification_policy.rb index 73a13b92a87..cf850999f91 100644 --- a/app/models/notification_policy.rb +++ b/app/models/notification_policy.rb @@ -5,6 +5,7 @@ # Table name: notification_policies # # id :bigint(8) not null, primary key +# for_bots :integer default("accept"), not null # for_limited_accounts :integer default("filter"), not null # for_new_accounts :integer default("accept"), not null # for_not_followers :integer default("accept"), not null @@ -36,6 +37,7 @@ class NotificationPolicy < ApplicationRecord enum :for_new_accounts, { accept: 0, filter: 1, drop: 2 }, suffix: :new_accounts enum :for_private_mentions, { accept: 0, filter: 1, drop: 2 }, suffix: :private_mentions enum :for_limited_accounts, { accept: 0, filter: 1, drop: 2 }, suffix: :limited_accounts + enum :for_bots, { accept: 0, filter: 1, drop: 2 }, suffix: :bots def summarize! @pending_requests_count = pending_notification_requests.first @@ -59,6 +61,10 @@ class NotificationPolicy < ApplicationRecord self.for_private_mentions = value ? :filter : :accept end + def filter_bots=(value) + self.for_bots = value ? :filter : :accept + end + private def pending_notification_requests diff --git a/app/serializers/rest/notification_policy_serializer.rb b/app/serializers/rest/notification_policy_serializer.rb index 3902c1a04a2..d3256e49a9a 100644 --- a/app/serializers/rest/notification_policy_serializer.rb +++ b/app/serializers/rest/notification_policy_serializer.rb @@ -8,6 +8,7 @@ class REST::NotificationPolicySerializer < ActiveModel::Serializer :for_new_accounts, :for_private_mentions, :for_limited_accounts, + :for_bots, :summary def summary diff --git a/app/serializers/rest/v1/notification_policy_serializer.rb b/app/serializers/rest/v1/notification_policy_serializer.rb index e1bbdc44ff1..8e06af45585 100644 --- a/app/serializers/rest/v1/notification_policy_serializer.rb +++ b/app/serializers/rest/v1/notification_policy_serializer.rb @@ -5,6 +5,7 @@ class REST::V1::NotificationPolicySerializer < ActiveModel::Serializer :filter_not_followers, :filter_new_accounts, :filter_private_mentions, + :filter_bots, :summary def summary @@ -29,4 +30,8 @@ class REST::V1::NotificationPolicySerializer < ActiveModel::Serializer def filter_private_mentions !object.accept_private_mentions? end + + def filter_bots + !object.accept_bots? + end end diff --git a/app/services/notify_service.rb b/app/services/notify_service.rb index af2f74ce562..9d62b2e5050 100644 --- a/app/services/notify_service.rb +++ b/app/services/notify_service.rb @@ -97,6 +97,10 @@ class NotifyService < BaseService WHERE ancestors.mention_id IS NOT NULL AND s.account_id = :recipient_id AND s.visibility = 3 SQL end + + def from_bot? + @sender.bot? + end end class DropCondition < BaseCondition @@ -120,7 +124,8 @@ class NotifyService < BaseService blocked_by_not_following_policy? || blocked_by_not_followers_policy? || blocked_by_new_accounts_policy? || - blocked_by_private_mentions_policy? + blocked_by_private_mentions_policy? || + blocked_by_bots_policy? end private @@ -160,6 +165,10 @@ class NotifyService < BaseService def blocked_by_limited_accounts_policy? @policy.drop_limited_accounts? && (@options[:silenced] || @sender.silenced?) && not_following? end + + def blocked_by_bots_policy? + @policy.drop_bots? && from_bot? + end end class FilterCondition < BaseCondition @@ -172,7 +181,8 @@ class NotifyService < BaseService filtered_by_not_following_policy? || filtered_by_not_followers_policy? || filtered_by_new_accounts_policy? || - filtered_by_private_mentions_policy? + filtered_by_private_mentions_policy? || + filtered_by_bots_policy? end private @@ -196,6 +206,10 @@ class NotifyService < BaseService def filtered_by_limited_accounts_policy? @policy.filter_limited_accounts? && (@options[:silenced] || @sender.silenced?) && not_following? end + + def filtered_by_bots_policy? + @policy.filter_bots? && from_bot? + end end def call(recipient, type, activity, **options) diff --git a/db/migrate/20260425144553_add_for_bots_to_notification_policies.rb b/db/migrate/20260425144553_add_for_bots_to_notification_policies.rb new file mode 100644 index 00000000000..e31f4e4bf9b --- /dev/null +++ b/db/migrate/20260425144553_add_for_bots_to_notification_policies.rb @@ -0,0 +1,7 @@ +# frozen_string_literal: true + +class AddForBotsToNotificationPolicies < ActiveRecord::Migration[8.1] + def change + add_column :notification_policies, :for_bots, :integer, default: 0, null: false + end +end diff --git a/db/schema.rb b/db/schema.rb index 51e2cef103b..3341b513d16 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -818,6 +818,7 @@ ActiveRecord::Schema[8.1].define(version: 2026_05_05_155103) do create_table "notification_policies", force: :cascade do |t| t.bigint "account_id", null: false t.datetime "created_at", null: false + t.integer "for_bots", default: 0, null: false t.integer "for_limited_accounts", default: 1, null: false t.integer "for_new_accounts", default: 0, null: false t.integer "for_not_followers", default: 0, null: false diff --git a/spec/models/notification_policy_spec.rb b/spec/models/notification_policy_spec.rb index 7d1b494dd53..a6ea32758d8 100644 --- a/spec/models/notification_policy_spec.rb +++ b/spec/models/notification_policy_spec.rb @@ -28,4 +28,33 @@ RSpec.describe NotificationPolicy do ) end end + + describe 'for_bots attribute' do + subject { Fabricate(:notification_policy) } + + it 'defaults to accept' do + expect(subject.for_bots).to eq 'accept' + end + + it 'can be set to filter' do + subject.update!(for_bots: 'filter') + expect(subject.reload.for_bots).to eq 'filter' + end + + it 'can be set to drop' do + subject.update!(for_bots: 'drop') + expect(subject.reload.for_bots).to eq 'drop' + end + + it 'can be set to accept' do + subject.update!(for_bots: 'accept') + expect(subject.reload.for_bots).to eq 'accept' + end + + it 'validates input' do + expect do + subject.update!(for_bots: 'block') + end.to raise_error(ArgumentError, "'block' is not a valid for_bots") + end + end end diff --git a/spec/requests/api/v1/notifications/policies_spec.rb b/spec/requests/api/v1/notifications/policies_spec.rb index ac24501526f..6d6b8d5a67f 100644 --- a/spec/requests/api/v1/notifications/policies_spec.rb +++ b/spec/requests/api/v1/notifications/policies_spec.rb @@ -33,6 +33,7 @@ RSpec.describe 'Policies' do filter_not_followers: false, filter_new_accounts: false, filter_private_mentions: true, + filter_bots: false, summary: a_hash_including( pending_requests_count: 1, pending_notifications_count: 0 @@ -63,11 +64,17 @@ RSpec.describe 'Policies' do filter_not_followers: false, filter_new_accounts: false, filter_private_mentions: true, + filter_bots: false, summary: a_hash_including( pending_requests_count: 0, pending_notifications_count: 0 ) ) end + + it 'updates filter_bots' do + put '/api/v1/notifications/policy', headers: headers, params: { filter_bots: true } + expect(response.parsed_body).to include(filter_bots: true) + end end end diff --git a/spec/requests/api/v2/notifications/policies_spec.rb b/spec/requests/api/v2/notifications/policies_spec.rb index f080bc730fd..73383163c3d 100644 --- a/spec/requests/api/v2/notifications/policies_spec.rb +++ b/spec/requests/api/v2/notifications/policies_spec.rb @@ -34,6 +34,7 @@ RSpec.describe 'Policies' do for_new_accounts: 'accept', for_private_mentions: 'filter', for_limited_accounts: 'filter', + for_bots: 'accept', summary: a_hash_including( pending_requests_count: 1, pending_notifications_count: 0 @@ -66,6 +67,7 @@ RSpec.describe 'Policies' do for_new_accounts: 'accept', for_private_mentions: 'filter', for_limited_accounts: 'drop', + for_bots: 'accept', summary: a_hash_including( pending_requests_count: 0, pending_notifications_count: 0 @@ -73,4 +75,13 @@ RSpec.describe 'Policies' do ) end end + + describe 'updating bots policy' do + it 'accepts for_bots parameter' do + put '/api/v2/notifications/policy', headers: headers, params: { for_bots: 'filter' } + + expect(response).to have_http_status(200) + expect(response.parsed_body).to include(for_bots: 'filter') + end + end end diff --git a/spec/services/notify_service_spec.rb b/spec/services/notify_service_spec.rb index 9927fa9f049..df51bce8bf2 100644 --- a/spec/services/notify_service_spec.rb +++ b/spec/services/notify_service_spec.rb @@ -272,6 +272,61 @@ RSpec.describe NotifyService do expect(subject.drop?).to be true end end + + context 'with bot policies' do + let(:bot_sender) { Fabricate(:account, bot: true) } + let(:human_sender) { Fabricate(:account, bot: false) } + let(:original_status) { Fabricate(:status) } + let(:recipient) { Fabricate(:account) } + + def reblog_notification(from) + activity = Fabricate(:status, account: from, reblog: original_status) + Fabricate(:notification, type: :reblog, activity: activity, from_account: from, account: recipient) + end + + before do + recipient.create_notification_policy!( + for_not_following: :accept, + for_not_followers: :accept, + for_new_accounts: :accept, + for_private_mentions: :accept, + for_limited_accounts: :accept, + for_bots: bots_policy + ) + end + + context 'when recipient is dropping bots' do + let(:bots_policy) { :drop } + + it 'drops bot reblogs' do + notification = reblog_notification(bot_sender) + expect(described_class.new(notification).drop?).to be true + end + + it 'keeps human reblogs' do + notification = reblog_notification(human_sender) + expect(described_class.new(notification).drop?).to be false + end + end + + context 'when recipient is filtering bots' do + let(:bots_policy) { :filter } + + it 'does not drop bot reblogs' do + notification = reblog_notification(bot_sender) + expect(described_class.new(notification).drop?).to be false + end + end + + context 'when recipient is accepting bots' do + let(:bots_policy) { :accept } + + it 'does not drop bot reblogs' do + notification = reblog_notification(bot_sender) + expect(described_class.new(notification).drop?).to be false + end + end + end end end @@ -518,6 +573,61 @@ RSpec.describe NotifyService do end end end + + context 'with bot policies' do + let(:bot_sender) { Fabricate(:account, bot: true) } + let(:human_sender) { Fabricate(:account, bot: false) } + let(:original_status) { Fabricate(:status) } + let(:recipient) { Fabricate(:account) } + + def reblog_notification(from) + activity = Fabricate(:status, account: from, reblog: original_status) + Fabricate(:notification, type: :reblog, activity: activity, from_account: from, account: recipient) + end + + before do + recipient.create_notification_policy!( + for_not_following: :accept, + for_not_followers: :accept, + for_new_accounts: :accept, + for_private_mentions: :accept, + for_limited_accounts: :accept, + for_bots: bots_policy + ) + end + + context 'when recipient is dropping bots' do + let(:bots_policy) { :drop } + + it 'does not filter bot reblogs' do + notification = reblog_notification(bot_sender) + expect(described_class.new(notification).filter?).to be false + end + end + + context 'when recipient is filtering bots' do + let(:bots_policy) { :filter } + + it 'filters bot reblogs' do + notification = reblog_notification(bot_sender) + expect(described_class.new(notification).filter?).to be true + end + + it 'keeps human reblogs' do + notification = reblog_notification(human_sender) + expect(described_class.new(notification).filter?).to be false + end + end + + context 'when recipient is accepting bots' do + let(:bots_policy) { :accept } + + it 'does not filter bot reblogs' do + notification = reblog_notification(bot_sender) + expect(described_class.new(notification).filter?).to be false + end + end + end end end end From fba4775ef6f9900bfaefc649bf480d62db8e51f5 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Tue, 9 Jun 2026 14:32:41 +0200 Subject: [PATCH 074/130] Update codecov/codecov-action digest to fb8b358 (#39322) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- .github/workflows/test-ruby.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/test-ruby.yml b/.github/workflows/test-ruby.yml index ce13d49ffdb..e27f11eaf12 100644 --- a/.github/workflows/test-ruby.yml +++ b/.github/workflows/test-ruby.yml @@ -169,7 +169,7 @@ jobs: - name: Upload coverage reports to Codecov if: matrix.ruby-version == '.ruby-version' - uses: codecov/codecov-action@e79a6962e0d4c0c17b229090214935d2e33f8354 # v6 + uses: codecov/codecov-action@fb8b3582c8e4def4969c97caa2f19720cb33a72f # v6 with: files: coverage/lcov/*.lcov env: From a2064d4c7f99d44a3a8df0a31ca0793ed64e4b04 Mon Sep 17 00:00:00 2001 From: Shlee Date: Tue, 9 Jun 2026 22:19:42 +0930 Subject: [PATCH 075/130] Add sign? methods to the Quote and CollectionItem models (#39047) --- app/models/collection_item.rb | 4 ++++ app/models/quote.rb | 4 ++++ 2 files changed, 8 insertions(+) diff --git a/app/models/collection_item.rb b/app/models/collection_item.rb index f37e67e8fdf..5c890dc86d4 100644 --- a/app/models/collection_item.rb +++ b/app/models/collection_item.rb @@ -64,6 +64,10 @@ class CollectionItem < ApplicationRecord :featured_item end + def sign? + true + end + private def set_position diff --git a/app/models/quote.rb b/app/models/quote.rb index c49a66c2783..7c453a097e5 100644 --- a/app/models/quote.rb +++ b/app/models/quote.rb @@ -79,6 +79,10 @@ class Quote < ApplicationRecord ActivityPub::QuoteRefreshWorker.perform_in(rand(REFRESH_DEADLINE), id) end + def sign? + true + end + private def reset_parent_cache! From e9697922c1d660337980ecf0d5d957b16d725fc6 Mon Sep 17 00:00:00 2001 From: Matt Jankowski Date: Tue, 9 Jun 2026 08:58:45 -0400 Subject: [PATCH 076/130] Handle offset relative to TZ in options list (#39334) --- app/helpers/settings_helper.rb | 4 ++++ .../preferences/appearance/show.html.haml | 2 +- spec/helpers/settings_helper_spec.rb | 16 ++++++++++++++++ 3 files changed, 21 insertions(+), 1 deletion(-) diff --git a/app/helpers/settings_helper.rb b/app/helpers/settings_helper.rb index 196eac52d55..11786b22fe7 100644 --- a/app/helpers/settings_helper.rb +++ b/app/helpers/settings_helper.rb @@ -57,6 +57,10 @@ module SettingsHelper end end + def time_zone_options + ActiveSupport::TimeZone.all.map { |tz| ["(GMT#{tz.now.formatted_offset}) #{tz.name}", tz.tzinfo.name] } + end + private def links_for_featured_tags(tags) diff --git a/app/views/settings/preferences/appearance/show.html.haml b/app/views/settings/preferences/appearance/show.html.haml index 202dd53103f..94889727051 100644 --- a/app/views/settings/preferences/appearance/show.html.haml +++ b/app/views/settings/preferences/appearance/show.html.haml @@ -16,7 +16,7 @@ wrapper: :with_label .fields-group.fields-row__column.fields-row__column-6 = f.input :time_zone, - collection: ActiveSupport::TimeZone.all.map { |tz| ["(GMT#{tz.formatted_offset}) #{tz.name}", tz.tzinfo.name] }, + collection: time_zone_options, hint: false, selected: current_user.time_zone || Time.zone.tzinfo.name, wrapper: :with_label diff --git a/spec/helpers/settings_helper_spec.rb b/spec/helpers/settings_helper_spec.rb index 63773634e94..d45940b57bb 100644 --- a/spec/helpers/settings_helper_spec.rb +++ b/spec/helpers/settings_helper_spec.rb @@ -50,4 +50,20 @@ RSpec.describe SettingsHelper do end end end + + describe '#time_zone_options' do + subject { helper.time_zone_options } + + context 'when summer time is in effect' do + before { travel_to(Date.new(2026, 6, 1)) } + + it { is_expected.to include(['(GMT-08:00) Alaska', 'America/Juneau']) } + end + + context 'when summer time is not in effect' do + before { travel_to(Date.new(2025, 12, 1)) } + + it { is_expected.to include(['(GMT-09:00) Alaska', 'America/Juneau']) } + end + end end From 4ee893461df76dd485b7acbe0d3e435fd0ca2206 Mon Sep 17 00:00:00 2001 From: Claire Date: Tue, 9 Jun 2026 16:17:36 +0200 Subject: [PATCH 077/130] Change i18n unused strings check to only check English strings (#39347) --- .github/workflows/check-i18n.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/check-i18n.yml b/.github/workflows/check-i18n.yml index 4b221df123e..ea5ab4bb7e8 100644 --- a/.github/workflows/check-i18n.yml +++ b/.github/workflows/check-i18n.yml @@ -39,7 +39,7 @@ jobs: run: bin/i18n-tasks check-normalized - name: Check for unused strings - run: bin/i18n-tasks unused + run: bin/i18n-tasks unused -l en - name: Check for missing strings in English YML run: | From 200fda1cdc7457b539a7c4e1050f6901bb3245bd Mon Sep 17 00:00:00 2001 From: David Roetzel Date: Tue, 9 Jun 2026 16:22:21 +0200 Subject: [PATCH 078/130] Add collection reach finder (#39346) --- app/lib/activitypub/activity/accept.rb | 2 +- app/lib/collection_reach_finder.rb | 18 ++++++++++ app/models/collection.rb | 1 + .../add_account_to_collection_service.rb | 2 +- app/services/create_collection_service.rb | 2 +- .../delete_collection_item_service.rb | 2 +- app/services/delete_collection_service.rb | 8 +++-- .../revoke_collection_item_service.rb | 2 +- app/services/update_collection_service.rb | 2 +- .../collection_raw_distribution_worker.rb | 15 ++++++++ spec/lib/activitypub/activity/accept_spec.rb | 4 +-- spec/lib/activitypub/activity/delete_spec.rb | 2 +- spec/lib/collection_reach_finder_spec.rb | 35 +++++++++++++++++++ .../add_account_to_collection_service_spec.rb | 4 +-- .../create_collection_service_spec.rb | 2 +- .../delete_collection_item_service_spec.rb | 4 +-- .../delete_collection_service_spec.rb | 7 +++- .../revoke_collection_item_service_spec.rb | 2 +- .../update_collection_service_spec.rb | 4 +-- 19 files changed, 98 insertions(+), 20 deletions(-) create mode 100644 app/lib/collection_reach_finder.rb create mode 100644 app/workers/activitypub/collection_raw_distribution_worker.rb create mode 100644 spec/lib/collection_reach_finder_spec.rb diff --git a/app/lib/activitypub/activity/accept.rb b/app/lib/activitypub/activity/accept.rb index a76b79a6d87..67f211f8a15 100644 --- a/app/lib/activitypub/activity/accept.rb +++ b/app/lib/activitypub/activity/accept.rb @@ -53,7 +53,7 @@ class ActivityPub::Activity::Accept < ActivityPub::Activity collection_item.update!(approval_uri:, state: :accepted) activity_json = ActiveModelSerializers::SerializableResource.new(collection_item, serializer: ActivityPub::AddFeaturedItemSerializer, adapter: ActivityPub::Adapter).to_json - ActivityPub::AccountRawDistributionWorker.perform_async(activity_json, collection_item.collection.account_id) + ActivityPub::CollectionRawDistributionWorker.perform_async(activity_json, collection_item.collection_id) end def accept_quote!(quote) diff --git a/app/lib/collection_reach_finder.rb b/app/lib/collection_reach_finder.rb new file mode 100644 index 00000000000..3f2829c55ef --- /dev/null +++ b/app/lib/collection_reach_finder.rb @@ -0,0 +1,18 @@ +# frozen_string_literal: true + +class CollectionReachFinder < AccountReachFinder + def initialize(collection) + @collection = collection + super(@collection.account) + end + + def inboxes + (super + collection_member_inboxes).uniq + end + + private + + def collection_member_inboxes + @collection.accounts.inboxes + end +end diff --git a/app/models/collection.rb b/app/models/collection.rb index ac763316598..337126b1456 100644 --- a/app/models/collection.rb +++ b/app/models/collection.rb @@ -32,6 +32,7 @@ class Collection < ApplicationRecord has_many :collection_items, dependent: :delete_all has_many :accepted_collection_items, -> { accepted }, class_name: 'CollectionItem', inverse_of: :collection # rubocop:disable Rails/HasManyOrHasOneDependent has_many :collection_reports, dependent: :delete_all + has_many :accounts, -> { merge(CollectionItem.pending_or_accepted) }, through: :collection_items validates :name, presence: true validates :name, length: { maximum: 40 }, if: :local? diff --git a/app/services/add_account_to_collection_service.rb b/app/services/add_account_to_collection_service.rb index 3c2ecacf4f4..f5438a6f9e4 100644 --- a/app/services/add_account_to_collection_service.rb +++ b/app/services/add_account_to_collection_service.rb @@ -30,7 +30,7 @@ class AddAccountToCollectionService end def distribute_add_activity - ActivityPub::AccountRawDistributionWorker.perform_async(add_activity_json, @collection.account_id) + ActivityPub::CollectionRawDistributionWorker.perform_async(add_activity_json, @collection.id) end def distribute_feature_request_activity diff --git a/app/services/create_collection_service.rb b/app/services/create_collection_service.rb index 1c46b405306..4e88108ca07 100644 --- a/app/services/create_collection_service.rb +++ b/app/services/create_collection_service.rb @@ -19,7 +19,7 @@ class CreateCollectionService private def distribute_add_activity - ActivityPub::AccountRawDistributionWorker.perform_async(activity_json, @account.id) + ActivityPub::CollectionRawDistributionWorker.perform_async(activity_json, @collection.id) end def distribute_feature_request_activities diff --git a/app/services/delete_collection_item_service.rb b/app/services/delete_collection_item_service.rb index 3f91ea0c3b1..04ff4b12639 100644 --- a/app/services/delete_collection_item_service.rb +++ b/app/services/delete_collection_item_service.rb @@ -16,7 +16,7 @@ class DeleteCollectionItemService private def distribute_remove_activity - ActivityPub::AccountRawDistributionWorker.perform_async(activity_json, @collection.account.id) + ActivityPub::CollectionRawDistributionWorker.perform_async(activity_json, @collection.id) end def activity_json diff --git a/app/services/delete_collection_service.rb b/app/services/delete_collection_service.rb index c2cc6ebd6c3..0414d269807 100644 --- a/app/services/delete_collection_service.rb +++ b/app/services/delete_collection_service.rb @@ -3,6 +3,7 @@ class DeleteCollectionService def call(collection) @collection = collection + @account_ids = @collection.account_ids @collection.destroy! distribute_remove_activity @@ -11,10 +12,13 @@ class DeleteCollectionService private def distribute_remove_activity - ActivityPub::AccountRawDistributionWorker.perform_async(activity_json, @collection.account.id) + @account_ids.each do |account_id| + ActivityPub::DeliveryWorker.perform_async(activity_json, account_id, @collection.account.inbox_url) + end + ActivityPub::AccountRawDistributionWorker.perform_async(activity_json, @collection.account_id) end def activity_json - ActiveModelSerializers::SerializableResource.new(@collection, serializer: ActivityPub::RemoveFeaturedCollectionSerializer, adapter: ActivityPub::Adapter).to_json + @activity_json ||= ActiveModelSerializers::SerializableResource.new(@collection, serializer: ActivityPub::RemoveFeaturedCollectionSerializer, adapter: ActivityPub::Adapter).to_json end end diff --git a/app/services/revoke_collection_item_service.rb b/app/services/revoke_collection_item_service.rb index 0b3c2c709e1..a5222d2b621 100644 --- a/app/services/revoke_collection_item_service.rb +++ b/app/services/revoke_collection_item_service.rb @@ -17,7 +17,7 @@ class RevokeCollectionItemService < BaseService def distribute_stamp_deletion! ActivityPub::DeliveryWorker.perform_async(signed_activity_json, @account.id, @collection.account.inbox_url) - ActivityPub::AccountRawDistributionWorker.perform_async(signed_activity_json, @collection.account_id) + ActivityPub::CollectionRawDistributionWorker.perform_async(signed_activity_json, @collection.id) end def signed_activity_json diff --git a/app/services/update_collection_service.rb b/app/services/update_collection_service.rb index 5ffb4bad815..041666d0818 100644 --- a/app/services/update_collection_service.rb +++ b/app/services/update_collection_service.rb @@ -16,7 +16,7 @@ class UpdateCollectionService def distribute_update_activity return unless relevant_attributes_changed? - ActivityPub::AccountRawDistributionWorker.perform_async(activity_json, @collection.account.id) + ActivityPub::CollectionRawDistributionWorker.perform_async(activity_json, @collection.id) end def notify_about_update diff --git a/app/workers/activitypub/collection_raw_distribution_worker.rb b/app/workers/activitypub/collection_raw_distribution_worker.rb new file mode 100644 index 00000000000..6ddb3807dde --- /dev/null +++ b/app/workers/activitypub/collection_raw_distribution_worker.rb @@ -0,0 +1,15 @@ +# frozen_string_literal: true + +class ActivityPub::CollectionRawDistributionWorker < ActivityPub::RawDistributionWorker + def perform(json, collection_id, exclude_inboxes = []) + @collection = Collection.find(collection_id) + + super(json, @collection.account_id, exclude_inboxes) + end + + private + + def inboxes + @inboxes ||= CollectionReachFinder.new(@collection).inboxes + end +end diff --git a/spec/lib/activitypub/activity/accept_spec.rb b/spec/lib/activitypub/activity/accept_spec.rb index 7775143e88f..6e176597e92 100644 --- a/spec/lib/activitypub/activity/accept_spec.rb +++ b/spec/lib/activitypub/activity/accept_spec.rb @@ -194,7 +194,7 @@ RSpec.describe ActivityPub::Activity::Accept do expect(collection_item.reload).to be_accepted expect(collection_item.approval_uri).to eq 'https://example.com/stamps/1' - expect(ActivityPub::AccountRawDistributionWorker) + expect(ActivityPub::CollectionRawDistributionWorker) .to have_enqueued_sidekiq_job end end @@ -206,7 +206,7 @@ RSpec.describe ActivityPub::Activity::Accept do expect(collection_item.reload).to_not be_accepted expect(collection_item.approval_uri).to be_nil - expect(ActivityPub::AccountRawDistributionWorker) + expect(ActivityPub::CollectionRawDistributionWorker) .to_not have_enqueued_sidekiq_job end end diff --git a/spec/lib/activitypub/activity/delete_spec.rb b/spec/lib/activitypub/activity/delete_spec.rb index 7e5d5f85746..260aadb54ec 100644 --- a/spec/lib/activitypub/activity/delete_spec.rb +++ b/spec/lib/activitypub/activity/delete_spec.rb @@ -139,7 +139,7 @@ RSpec.describe ActivityPub::Activity::Delete do subject.perform expect(collection_item.reload).to be_revoked - expect(ActivityPub::AccountRawDistributionWorker).to have_enqueued_sidekiq_job + expect(ActivityPub::CollectionRawDistributionWorker).to have_enqueued_sidekiq_job end end end diff --git a/spec/lib/collection_reach_finder_spec.rb b/spec/lib/collection_reach_finder_spec.rb new file mode 100644 index 00000000000..74c6b675382 --- /dev/null +++ b/spec/lib/collection_reach_finder_spec.rb @@ -0,0 +1,35 @@ +# frozen_string_literal: true + +require 'rails_helper' + +RSpec.describe CollectionReachFinder do + let(:account) { Fabricate(:account) } + let(:collection) { Fabricate(:collection, account:) } + + let(:follower_example_com) { Fabricate(:account, protocol: :activitypub, inbox_url: 'https://example.com/inbox-1', domain: 'example.com') } + let(:follower_with_shared) { Fabricate(:account, protocol: :activitypub, inbox_url: 'https://foo.bar/users/a/inbox', domain: 'foo.bar', shared_inbox_url: 'https://foo.bar/inbox') } + + let(:collection_member_with_shared) { Fabricate(:account, protocol: :activitypub, inbox_url: 'https://foo.bar/users/b/inbox', domain: 'foo.bar', shared_inbox_url: 'https://foo.bar/inbox') } + let(:collection_member_example_org) { Fabricate(:account, protocol: :activitypub, inbox_url: 'https://example.org/inbox-2', domain: 'example.org') } + + before do + follower_example_com.follow!(account) + follower_with_shared.follow!(account) + + [follower_example_com, collection_member_with_shared, collection_member_example_org].each do |collection_member| + Fabricate(:collection_item, collection:, account: collection_member, activity_uri: "https://#{collection_member.domain}/activity", approval_uri: "https://#{collection_member.domain}/approval") + end + end + + describe '#inboxes' do + subject { described_class.new(collection).inboxes } + + it 'includes unique inbox URIs of followers and collection members respecting shared inbox URIs where present' do + expect(subject).to contain_exactly( + 'https://example.com/inbox-1', + 'https://foo.bar/inbox', + 'https://example.org/inbox-2' + ) + end + end +end diff --git a/spec/services/add_account_to_collection_service_spec.rb b/spec/services/add_account_to_collection_service_spec.rb index dd7983ca622..2e033ea239e 100644 --- a/spec/services/add_account_to_collection_service_spec.rb +++ b/spec/services/add_account_to_collection_service_spec.rb @@ -25,9 +25,9 @@ RSpec.describe AddAccountToCollectionService do it 'federates an `Add` activity and schedules a notification' do subject.call(collection, account) - expect(ActivityPub::AccountRawDistributionWorker) + expect(ActivityPub::CollectionRawDistributionWorker) .to have_enqueued_sidekiq_job - .with(anything, collection.account_id) + .with(anything, collection.id) expect(LocalNotificationWorker) .to have_enqueued_sidekiq_job .with(account.id, anything, 'CollectionItem', 'added_to_collection') diff --git a/spec/services/create_collection_service_spec.rb b/spec/services/create_collection_service_spec.rb index 67acb3b7ae1..4e93134034e 100644 --- a/spec/services/create_collection_service_spec.rb +++ b/spec/services/create_collection_service_spec.rb @@ -32,7 +32,7 @@ RSpec.describe CreateCollectionService do it 'federates an `Add` activity' do subject.call(base_params, author) - expect(ActivityPub::AccountRawDistributionWorker).to have_enqueued_sidekiq_job + expect(ActivityPub::CollectionRawDistributionWorker).to have_enqueued_sidekiq_job end context 'when given account ids' do diff --git a/spec/services/delete_collection_item_service_spec.rb b/spec/services/delete_collection_item_service_spec.rb index f9a235b902e..2f42584158c 100644 --- a/spec/services/delete_collection_item_service_spec.rb +++ b/spec/services/delete_collection_item_service_spec.rb @@ -17,7 +17,7 @@ RSpec.describe DeleteCollectionItemService do it 'federates a `Remove` activity' do subject.call(collection_item) - expect(ActivityPub::AccountRawDistributionWorker).to have_enqueued_sidekiq_job + expect(ActivityPub::CollectionRawDistributionWorker).to have_enqueued_sidekiq_job end context 'when `revoke` is set to true' do @@ -36,7 +36,7 @@ RSpec.describe DeleteCollectionItemService do it 'destroys the collection withouth federating anything' do expect { subject.call(collection_item, revoke: true) }.to change(collection.collection_items, :count).by(-1) - expect(ActivityPub::AccountRawDistributionWorker).to_not have_enqueued_sidekiq_job + expect(ActivityPub::CollectionRawDistributionWorker).to_not have_enqueued_sidekiq_job end end end diff --git a/spec/services/delete_collection_service_spec.rb b/spec/services/delete_collection_service_spec.rb index 06ed82b21db..e2b85fe9240 100644 --- a/spec/services/delete_collection_service_spec.rb +++ b/spec/services/delete_collection_service_spec.rb @@ -7,15 +7,20 @@ RSpec.describe DeleteCollectionService do let!(:collection) { Fabricate(:collection) } + before do + Fabricate.times(2, :collection_item, collection:) + end + describe '#call' do it 'destroys the collection' do expect { subject.call(collection) }.to change(Collection, :count).by(-1) end - it 'federates a `Remove` activity' do + it "federates a `Remove` activity to the account's reach plus each collection member" do subject.call(collection) expect(ActivityPub::AccountRawDistributionWorker).to have_enqueued_sidekiq_job + expect(ActivityPub::DeliveryWorker).to have_enqueued_sidekiq_job.exactly(2).times end end end diff --git a/spec/services/revoke_collection_item_service_spec.rb b/spec/services/revoke_collection_item_service_spec.rb index 18357f53ddf..760c9038b9e 100644 --- a/spec/services/revoke_collection_item_service_spec.rb +++ b/spec/services/revoke_collection_item_service_spec.rb @@ -21,7 +21,7 @@ RSpec.describe RevokeCollectionItemService do subject.call(collection_item) expect(ActivityPub::DeliveryWorker).to have_enqueued_sidekiq_job.with(instance_of(String), collection_item.account_id, 'https://example.com/actor/1/inbox') - expect(ActivityPub::AccountRawDistributionWorker).to have_enqueued_sidekiq_job + expect(ActivityPub::CollectionRawDistributionWorker).to have_enqueued_sidekiq_job end end end diff --git a/spec/services/update_collection_service_spec.rb b/spec/services/update_collection_service_spec.rb index 088d5768ed0..2899b301b20 100644 --- a/spec/services/update_collection_service_spec.rb +++ b/spec/services/update_collection_service_spec.rb @@ -14,14 +14,14 @@ RSpec.describe UpdateCollectionService do expect { subject.call(collection, { name: 'Newly updated name' }) } .to change(collection, :name).to('Newly updated name') .and enqueue_sidekiq_job(LocalNotificationWorker).with(collection_item.account_id, collection.id, collection.class.name, 'collection_update') - .and enqueue_sidekiq_job(ActivityPub::AccountRawDistributionWorker) + .and enqueue_sidekiq_job(ActivityPub::CollectionRawDistributionWorker) end context 'when nothing changed' do it 'does not federate an activity' do subject.call(collection, { name: collection.name }) - expect(ActivityPub::AccountRawDistributionWorker).to_not have_enqueued_sidekiq_job + expect(ActivityPub::CollectionRawDistributionWorker).to_not have_enqueued_sidekiq_job expect(LocalNotificationWorker).to_not have_enqueued_sidekiq_job end end From e0fc0858a19c7bb25d25b9c4077e58500839448d Mon Sep 17 00:00:00 2001 From: Matt Jankowski Date: Tue, 9 Jun 2026 11:39:24 -0400 Subject: [PATCH 079/130] Use http POST on rules acceptance button during registration (#39345) --- app/controllers/auth/acceptances_controller.rb | 13 +++++++++++++ app/views/auth/registrations/rules.html.haml | 2 +- config/routes.rb | 1 + 3 files changed, 15 insertions(+), 1 deletion(-) create mode 100644 app/controllers/auth/acceptances_controller.rb diff --git a/app/controllers/auth/acceptances_controller.rb b/app/controllers/auth/acceptances_controller.rb new file mode 100644 index 00000000000..ba03a327e7b --- /dev/null +++ b/app/controllers/auth/acceptances_controller.rb @@ -0,0 +1,13 @@ +# frozen_string_literal: true + +class Auth::AcceptancesController < ApplicationController + def create + redirect_to new_user_registration_path(registration_params) + end + + private + + def registration_params + params.permit(:accept, :invite_code).compact_blank + end +end diff --git a/app/views/auth/registrations/rules.html.haml b/app/views/auth/registrations/rules.html.haml index 69b42b993f0..961b1b1e1bf 100644 --- a/app/views/auth/registrations/rules.html.haml +++ b/app/views/auth/registrations/rules.html.haml @@ -4,7 +4,7 @@ - content_for :header_tags do = render partial: 'shared/og', locals: { description: description_for_sign_up(@invite) } -= form_with class: :simple_form, method: :get, url: new_user_registration_path do |form| += form_with class: :simple_form, url: auth_acceptance_path do |form| = render 'auth/shared/progress', stage: 'rules' - if @invite.present? && @invite.autofollow? diff --git a/config/routes.rb b/config/routes.rb index 8538635124c..ca5a9a2fb91 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -74,6 +74,7 @@ Rails.application.routes.draw do resource :unsubscribe, only: [:show, :create], controller: :unsubscriptions namespace :auth do + resource :acceptance, only: [:create] resource :setup, only: [:show, :update], controller: :setup resource :challenge, only: [:create] post 'captcha_confirmation', to: 'confirmations#confirm_captcha', as: :captcha_confirmation From b48f907b20e2c9909665a484041845697d26f17c Mon Sep 17 00:00:00 2001 From: David Roetzel Date: Tue, 9 Jun 2026 17:40:01 +0200 Subject: [PATCH 080/130] Add `Deprecation` headers to collections alpha API (#39349) --- app/controllers/api/base_controller.rb | 4 ++++ .../api/v1/collection_items_controller.rb | 3 +++ .../api/v1/collections_controller.rb | 3 +++ spec/requests/api/v1/collection_items_spec.rb | 20 +++++++++++++------ spec/requests/api/v1/collections_spec.rb | 8 ++++++++ 5 files changed, 32 insertions(+), 6 deletions(-) diff --git a/app/controllers/api/base_controller.rb b/app/controllers/api/base_controller.rb index 68c4f3962a8..601b8e79853 100644 --- a/app/controllers/api/base_controller.rb +++ b/app/controllers/api/base_controller.rb @@ -100,4 +100,8 @@ class Api::BaseController < ApplicationController def respond_with_error(code) render json: { error: Rack::Utils::HTTP_STATUS_CODES[code] }, status: code end + + def alpha_path? + request.path.starts_with?('/api/v1_alpha') + end end diff --git a/app/controllers/api/v1/collection_items_controller.rb b/app/controllers/api/v1/collection_items_controller.rb index 3ec5e18ed95..6b7db97b069 100644 --- a/app/controllers/api/v1/collection_items_controller.rb +++ b/app/controllers/api/v1/collection_items_controller.rb @@ -2,6 +2,9 @@ class Api::V1::CollectionItemsController < Api::BaseController include Authorization + include DeprecationConcern + + deprecate_api '2026-06-10', if: :alpha_path? before_action -> { doorkeeper_authorize! :write, :'write:collections' } diff --git a/app/controllers/api/v1/collections_controller.rb b/app/controllers/api/v1/collections_controller.rb index 50a825aface..08453a7ed6a 100644 --- a/app/controllers/api/v1/collections_controller.rb +++ b/app/controllers/api/v1/collections_controller.rb @@ -2,6 +2,7 @@ class Api::V1::CollectionsController < Api::BaseController include Authorization + include DeprecationConcern DEFAULT_COLLECTIONS_LIMIT = 40 MAX_COLLECTIONS_LIMIT = 100 @@ -10,6 +11,8 @@ class Api::V1::CollectionsController < Api::BaseController render json: { error: ValidationErrorFormatter.new(e).as_json }, status: 422 end + deprecate_api '2026-06-10', if: :alpha_path? + before_action -> { authorize_if_got_token! :read, :'read:collections' }, only: [:index, :show] before_action -> { doorkeeper_authorize! :write, :'write:collections' }, only: [:create, :update, :destroy] diff --git a/spec/requests/api/v1/collection_items_spec.rb b/spec/requests/api/v1/collection_items_spec.rb index 93d4f70ad52..30dba0ccedc 100644 --- a/spec/requests/api/v1/collection_items_spec.rb +++ b/spec/requests/api/v1/collection_items_spec.rb @@ -5,9 +5,9 @@ require 'rails_helper' RSpec.describe 'Api::V1Alpha::CollectionItems' do include_context 'with API authentication', oauth_scopes: 'read:collections write:collections' - describe 'POST /api/v1_alpha/collections/:collection_id/items' do + describe 'POST /api/v1/collections/:collection_id/items' do subject do - post "/api/v1_alpha/collections/#{collection.id}/items", headers: headers, params: params + post "/api/v1/collections/#{collection.id}/items", headers: headers, params: params end let(:collection) { Fabricate(:collection, account: user.account) } @@ -28,6 +28,14 @@ RSpec.describe 'Api::V1Alpha::CollectionItems' do expect(response).to have_http_status(200) expect(response.parsed_body).to have_key('collection_item') end + + it 'features a deprecation header when requested via the alpha route' do + subject + expect(response.headers['Deprecation']).to be_nil + + post "/api/v1_alpha/collections/#{collection.id}/items", headers: headers, params: params + expect(response.headers['Deprecation']).to eq '@1781049600' + end end context 'with invalid params' do @@ -54,9 +62,9 @@ RSpec.describe 'Api::V1Alpha::CollectionItems' do end end - describe 'DELETE /api/v1_alpha/collections/:collection_id/items/:id' do + describe 'DELETE /api/v1/collections/:collection_id/items/:id' do subject do - delete "/api/v1_alpha/collections/#{collection.id}/items/#{item.id}", headers: headers + delete "/api/v1/collections/#{collection.id}/items/#{item.id}", headers: headers end let(:collection) { Fabricate(:collection, account: user.account) } @@ -103,9 +111,9 @@ RSpec.describe 'Api::V1Alpha::CollectionItems' do end end - describe 'POST /api/v1_alpha/collections/:collection_id/items/:id/revoke' do + describe 'POST /api/v1/collections/:collection_id/items/:id/revoke' do subject do - post "/api/v1_alpha/collections/#{collection.id}/items/#{item.id}/revoke", headers: headers + post "/api/v1/collections/#{collection.id}/items/#{item.id}/revoke", headers: headers end let(:collection) { Fabricate(:collection) } diff --git a/spec/requests/api/v1/collections_spec.rb b/spec/requests/api/v1/collections_spec.rb index b6bb17319db..d47a8265f46 100644 --- a/spec/requests/api/v1/collections_spec.rb +++ b/spec/requests/api/v1/collections_spec.rb @@ -23,6 +23,14 @@ RSpec.describe 'Api::V1::Collections' do expect(response.parsed_body[:collections].size).to eq 3 end + it 'features a deprecation header when requested via the alpha route' do + subject + expect(response.headers['Deprecation']).to be_nil + + get "/api/v1_alpha/accounts/#{account.id}/collections", headers: headers, params: params + expect(response.headers['Deprecation']).to eq '@1781049600' + end + context 'with limit param' do let(:params) { { limit: '1' } } From e697d441448453fb6b33b8a7aebca39149581cb3 Mon Sep 17 00:00:00 2001 From: Claire Date: Wed, 10 Jun 2026 10:46:36 +0200 Subject: [PATCH 081/130] Fix avatar and profile header descriptions not being serialized over ActivityPub (#39352) --- app/serializers/activitypub/actor_serializer.rb | 14 ++++++++++++-- app/serializers/activitypub/image_serializer.rb | 9 +++++++++ .../activitypub/actor_serializer_spec.rb | 10 ++++++++++ 3 files changed, 31 insertions(+), 2 deletions(-) diff --git a/app/serializers/activitypub/actor_serializer.rb b/app/serializers/activitypub/actor_serializer.rb index 38b0878b1a4..4244f4f1775 100644 --- a/app/serializers/activitypub/actor_serializer.rb +++ b/app/serializers/activitypub/actor_serializer.rb @@ -44,6 +44,16 @@ class ActivityPub::ActorSerializer < ActivityPub::Serializer end end + class ImageWithDescription < SimpleDelegator + attr_reader :description + + def initialize(object, description) + super(object) + + @description = description + end + end + has_one :endpoints, serializer: EndpointsSerializer has_one :icon, serializer: ActivityPub::ImageSerializer, if: :avatar_exists? @@ -120,11 +130,11 @@ class ActivityPub::ActorSerializer < ActivityPub::Serializer end def icon - object.avatar + ImageWithDescription.new(object.avatar, object.avatar_description) end def image - object.header + ImageWithDescription.new(object.header, object.header_description) end def public_key diff --git a/app/serializers/activitypub/image_serializer.rb b/app/serializers/activitypub/image_serializer.rb index 1060f969149..c6513c4dc44 100644 --- a/app/serializers/activitypub/image_serializer.rb +++ b/app/serializers/activitypub/image_serializer.rb @@ -7,6 +7,7 @@ class ActivityPub::ImageSerializer < ActivityPub::Serializer attributes :type, :media_type, :url attribute :focal_point, if: :focal_point? + attribute :summary, if: :summary? def type 'Image' @@ -27,4 +28,12 @@ class ActivityPub::ImageSerializer < ActivityPub::Serializer def focal_point [object.meta['focus']['x'], object.meta['focus']['y']] end + + def summary? + object.respond_to?(:description) && object.description.present? + end + + def summary + object.description + end end diff --git a/spec/serializers/activitypub/actor_serializer_spec.rb b/spec/serializers/activitypub/actor_serializer_spec.rb index 661890f33b6..1c8542a7d34 100644 --- a/spec/serializers/activitypub/actor_serializer_spec.rb +++ b/spec/serializers/activitypub/actor_serializer_spec.rb @@ -74,4 +74,14 @@ RSpec.describe ActivityPub::ActorSerializer do end end end + + describe 'avatar description' do + let(:record) { Fabricate(:account, avatar: attachment_fixture('avatar.gif'), avatar_description: 'test') } + + it 'includes an `icon` with the appropraite `summary`' do + expect(subject).to include('icon' => a_hash_including( + 'summary' => 'test' + )) + end + end end From 6432fa6649ddb99121225d26654b62b127f3aa06 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Wed, 10 Jun 2026 11:03:15 +0200 Subject: [PATCH 082/130] New Crowdin Translations (automated) (#39351) Co-authored-by: GitHub Actions --- app/javascript/mastodon/locales/be.json | 3 +++ app/javascript/mastodon/locales/da.json | 3 +++ app/javascript/mastodon/locales/de.json | 3 +++ app/javascript/mastodon/locales/el.json | 27 ++++++++++++---------- app/javascript/mastodon/locales/es-AR.json | 3 +++ app/javascript/mastodon/locales/es-MX.json | 3 +++ app/javascript/mastodon/locales/es.json | 3 +++ app/javascript/mastodon/locales/fi.json | 3 +++ app/javascript/mastodon/locales/ga.json | 3 +++ app/javascript/mastodon/locales/gl.json | 4 ++++ app/javascript/mastodon/locales/he.json | 4 ++++ app/javascript/mastodon/locales/is.json | 3 +++ app/javascript/mastodon/locales/it.json | 3 +++ app/javascript/mastodon/locales/pl.json | 13 +++++++++++ app/javascript/mastodon/locales/pt-BR.json | 3 +++ app/javascript/mastodon/locales/sq.json | 1 + app/javascript/mastodon/locales/vi.json | 4 ++++ app/javascript/mastodon/locales/zh-CN.json | 3 +++ app/javascript/mastodon/locales/zh-TW.json | 3 +++ config/locales/be.yml | 18 +++++++++++++++ config/locales/gl.yml | 17 ++++++++++++++ config/locales/he.yml | 17 ++++++++++++++ config/locales/is.yml | 5 ++++ config/locales/sq.yml | 17 ++++++++++++++ config/locales/vi.yml | 17 ++++++++++++++ 25 files changed, 171 insertions(+), 12 deletions(-) diff --git a/app/javascript/mastodon/locales/be.json b/app/javascript/mastodon/locales/be.json index cfef805f01e..2b824becb5e 100644 --- a/app/javascript/mastodon/locales/be.json +++ b/app/javascript/mastodon/locales/be.json @@ -780,6 +780,7 @@ "home.pending_critical_update.link": "Прагледзець абнаўленні", "home.pending_critical_update.title": "Даступна крытычнае абнаўленне бяспекі!", "home.show_announcements": "Паказаць аб'явы", + "ignore_notifications_modal.bots_title": "Ігнараваць апавяшчэнні ад ботаў?", "ignore_notifications_modal.disclaimer": "Mastodon не можа паведамляць карыстальнікам, што Вы праігнаравалі апавяшчэнні ад іх. Ігнараванне апавяшчэнняў не спыніць адпраўку саміх паведамленняў.", "ignore_notifications_modal.filter_instead": "Замест гэтага адфільтраваць", "ignore_notifications_modal.filter_to_act_users": "Вы па-ранейшаму зможаце прымаць, адхіляць ці скардзіцца на карыстальнікаў", @@ -1042,6 +1043,8 @@ "notifications.policy.drop": "Iгнараваць", "notifications.policy.drop_hint": "Адправіць у бездань, адкуль больш ніколі не ўбачыце", "notifications.policy.filter": "Фільтраваць", + "notifications.policy.filter_bots_hint": "Уліковыя запісы, пазначаныя як аўтаматычныя", + "notifications.policy.filter_bots_title": "Боты", "notifications.policy.filter_hint": "Адправіць у скрыню адфільтраваных апавяшчэнняў", "notifications.policy.filter_limited_accounts_hint": "Абмежавана мадэратарамі сервера", "notifications.policy.filter_limited_accounts_title": "Уліковыя запісы пад мадэрацыяй", diff --git a/app/javascript/mastodon/locales/da.json b/app/javascript/mastodon/locales/da.json index 172923513f4..df249a9d19d 100644 --- a/app/javascript/mastodon/locales/da.json +++ b/app/javascript/mastodon/locales/da.json @@ -780,6 +780,7 @@ "home.pending_critical_update.link": "Se opdateringer", "home.pending_critical_update.title": "Kritisk sikkerhedsopdatering tilgængelig!", "home.show_announcements": "Vis bekendtgørelser", + "ignore_notifications_modal.bots_title": "Ignorér notifikationer fra bots?", "ignore_notifications_modal.disclaimer": "Mastodon kan ikke informere brugere om, at du har ignoreret deres notifikationer. At ignorere notifikationer forhindrer ikke selve beskederne i at blive sendt.", "ignore_notifications_modal.filter_instead": "Filtrér i stedet", "ignore_notifications_modal.filter_to_act_users": "Du vil stadig kunne acceptere, afvise eller anmelde brugere", @@ -1042,6 +1043,8 @@ "notifications.policy.drop": "Ignorér", "notifications.policy.drop_hint": "Send til intetheden, for aldrig at blive set igen", "notifications.policy.filter": "Filter", + "notifications.policy.filter_bots_hint": "Konti markeret som automatiseret", + "notifications.policy.filter_bots_title": "Bots", "notifications.policy.filter_hint": "Send til filtrerede notifikationsindbakke", "notifications.policy.filter_limited_accounts_hint": "Begrænset af servermoderatorer", "notifications.policy.filter_limited_accounts_title": "Modererede konti", diff --git a/app/javascript/mastodon/locales/de.json b/app/javascript/mastodon/locales/de.json index 214f34ffa69..6efabc91e03 100644 --- a/app/javascript/mastodon/locales/de.json +++ b/app/javascript/mastodon/locales/de.json @@ -780,6 +780,7 @@ "home.pending_critical_update.link": "Updates ansehen", "home.pending_critical_update.title": "Kritisches Sicherheitsupdate verfügbar!", "home.show_announcements": "Ankündigungen anzeigen", + "ignore_notifications_modal.bots_title": "Benachrichtigungen von Bots ignorieren?", "ignore_notifications_modal.disclaimer": "Mastodon kann anderen Nutzer*innen nicht mitteilen, dass du deren Benachrichtigungen ignorierst. Das Ignorieren von Benachrichtigungen wird nicht das Absenden der Nachricht selbst unterbinden.", "ignore_notifications_modal.filter_instead": "Stattdessen filtern", "ignore_notifications_modal.filter_to_act_users": "Du wirst weiterhin die Möglichkeit haben, andere Nutzer*innen zu akzeptieren, abzulehnen oder zu melden", @@ -1042,6 +1043,8 @@ "notifications.policy.drop": "Ignorieren", "notifications.policy.drop_hint": "Ins Nirwana befördern und auf Nimmerwiedersehen!", "notifications.policy.filter": "Filtern", + "notifications.policy.filter_bots_hint": "Als automatisiert gekennzeichnete Konten", + "notifications.policy.filter_bots_title": "Bots", "notifications.policy.filter_hint": "Im separaten Feed „Gefilterte Benachrichtigungen“ anzeigen", "notifications.policy.filter_limited_accounts_hint": "Durch Server-Moderator*innen eingeschränkte Profile", "notifications.policy.filter_limited_accounts_title": "eingeschränkten Konten", diff --git a/app/javascript/mastodon/locales/el.json b/app/javascript/mastodon/locales/el.json index 0d7850f09c5..ed53be42011 100644 --- a/app/javascript/mastodon/locales/el.json +++ b/app/javascript/mastodon/locales/el.json @@ -577,7 +577,7 @@ "content_warning.show_more": "Εμφάνιση περισσότερων", "content_warning.show_short": "Εμφάνιση", "conversation.delete": "Διαγραφή συνομιλίας", - "conversation.mark_as_read": "Σήμανση ως αναγνωσμένη", + "conversation.mark_as_read": "Σήμανση ως διαβασμένη", "conversation.open": "Προβολή συνομιλίας", "conversation.with": "Με {names}", "copy_icon_button.copied": "Αντιγράφηκε στο πρόχειρο", @@ -780,6 +780,7 @@ "home.pending_critical_update.link": "Δείτε ενημερώσεις", "home.pending_critical_update.title": "Κρίσιμη ενημέρωση ασφαλείας διαθέσιμη!", "home.show_announcements": "Εμφάνιση ανακοινώσεων", + "ignore_notifications_modal.bots_title": "Αγνόηση ειδοποιήσεων από bots;", "ignore_notifications_modal.disclaimer": "Το Mastodon δε μπορεί να ενημερώσει τους χρήστες ότι αγνόησες τις ειδοποιήσεις του. Η αγνόηση ειδοποιήσεων δεν θα εμποδίσει την αποστολή των ίδιων των μηνυμάτων.", "ignore_notifications_modal.filter_instead": "Φίλτρο αντ' αυτού", "ignore_notifications_modal.filter_to_act_users": "Θα μπορείς ακόμη να αποδεχθείς, να απορρίψεις ή να αναφέρεις χρήστες", @@ -1011,41 +1012,43 @@ "notifications.column_settings.filter_bar.category": "Μπάρα γρήγορου φίλτρου", "notifications.column_settings.follow": "Νέοι ακόλουθοι:", "notifications.column_settings.follow_request": "Νέο αίτημα ακολούθησης:", - "notifications.column_settings.group": "Ομάδα", + "notifications.column_settings.group": "Ομαδοποίηση", "notifications.column_settings.mention": "Επισημάνσεις:", "notifications.column_settings.poll": "Αποτελέσματα δημοσκόπησης:", "notifications.column_settings.push": "Ειδοποιήσεις Push", "notifications.column_settings.quote": "Παραθέσεις:", "notifications.column_settings.reblog": "Ενισχύσεις:", - "notifications.column_settings.show": "Εμφάνισε σε στήλη", + "notifications.column_settings.show": "Εμφάνιση σε στήλη", "notifications.column_settings.sound": "Αναπαραγωγή ήχου", "notifications.column_settings.status": "Νέες αναρτήσεις:", - "notifications.column_settings.unread_notifications.category": "Μη αναγνωσμένες ειδοποιήσεις", - "notifications.column_settings.unread_notifications.highlight": "Επισήμανση μη αναγνωσμένων ειδοποιήσεων", + "notifications.column_settings.unread_notifications.category": "Αδιάβαστες ειδοποιήσεις", + "notifications.column_settings.unread_notifications.highlight": "Επισήμανση αδιάβαστων ειδοποιήσεων", "notifications.column_settings.update": "Επεξεργασίες:", "notifications.filter.all": "Όλες", "notifications.filter.boosts": "Προωθήσεις", "notifications.filter.collections": "Συλλογές", "notifications.filter.favourites": "Αγαπημένα", - "notifications.filter.follows": "Ακολουθείς", + "notifications.filter.follows": "Νέοι ακόλουθοι", "notifications.filter.mentions": "Επισημάνσεις", "notifications.filter.polls": "Αποτελέσματα δημοσκόπησης", "notifications.filter.statuses": "Ενημερώσεις από όσους ακολουθείς", "notifications.grant_permission": "Χορήγηση άδειας.", "notifications.group": "{count} ειδοποιήσεις", - "notifications.mark_as_read": "Σήμανε όλες τις ειδοποιήσεις ως αναγνωσμένες", + "notifications.mark_as_read": "Σήμανε όλες τις ειδοποιήσεις ως διαβασμένες", "notifications.permission_denied": "Οι ειδοποιήσεις για υπολογιστή δεν είναι διαθέσιμες διότι έχει απορριφθεί κάποιο προηγούμενο αίτημα άδειας", - "notifications.permission_denied_alert": "Δεν είναι δυνατή η ενεργοποίηση των ειδοποιήσεων για υπολογιστή, καθώς η άδεια του προγράμματος περιήγησης έχει απορριφθεί προηγουμένων", + "notifications.permission_denied_alert": "Δεν είναι δυνατή η ενεργοποίηση των ειδοποιήσεων για υπολογιστή, καθώς η άδεια του προγράμματος περιήγησης έχει απορριφθεί προηγουμένως", "notifications.permission_required": "Οι ειδοποιήσεις για υπολογιστή δεν είναι διαθέσιμες επειδή δεν έχει δοθεί η απαιτούμενη άδεια.", "notifications.policy.accept": "Αποδοχή", "notifications.policy.accept_hint": "Εμφάνιση στις ειδοποιήσεις", "notifications.policy.drop": "Αγνόηση", - "notifications.policy.drop_hint": "Στείλε τες στο υπερπέραν, για να μην τις ξαναδείτε", - "notifications.policy.filter": "Φίλτρο", + "notifications.policy.drop_hint": "Στείλε τες στο υπερπέραν, για να μην τις ξαναδείς", + "notifications.policy.filter": "Φιλτράρισμα", + "notifications.policy.filter_bots_hint": "Λογαριασμοί σημασμένοι ως αυτοματοποιημένοι", + "notifications.policy.filter_bots_title": "Bots", "notifications.policy.filter_hint": "Αποστολή στα εισερχόμενα φιλτραρισμένων ειδοποιήσεων", - "notifications.policy.filter_limited_accounts_hint": "Περιορισμένη από συντονιστές διακομιστή", + "notifications.policy.filter_limited_accounts_hint": "Περιορισμένοι από συντονιστές διακομιστή", "notifications.policy.filter_limited_accounts_title": "Συντονισμένοι λογαριασμοί", - "notifications.policy.filter_new_accounts.hint": "Δημιουργήθηκε εντός {days, plural, one {της τελευταίας ημέρας} other {των τελευταίων # ημερών}}", + "notifications.policy.filter_new_accounts.hint": "Δημιουργημένοι εντός {days, plural, one {της τελευταίας ημέρας} other {των τελευταίων # ημερών}}", "notifications.policy.filter_new_accounts_title": "Νέοι λογαριασμοί", "notifications.policy.filter_not_followers_hint": "Συμπεριλαμβανομένων των ατόμων που σας έχουν ακολουθήσει λιγότερο από {days, plural, one {μια ημέρα} other {# ημέρες}} πριν", "notifications.policy.filter_not_followers_title": "Άτομα που δε σε ακολουθούν", diff --git a/app/javascript/mastodon/locales/es-AR.json b/app/javascript/mastodon/locales/es-AR.json index 30540fa0a93..3a68fb4731e 100644 --- a/app/javascript/mastodon/locales/es-AR.json +++ b/app/javascript/mastodon/locales/es-AR.json @@ -780,6 +780,7 @@ "home.pending_critical_update.link": "Ver actualizaciones", "home.pending_critical_update.title": "¡Actualización de seguridad crítica disponible!", "home.show_announcements": "Mostrar anuncios", + "ignore_notifications_modal.bots_title": "¿Ignorar notificaciones de bots?", "ignore_notifications_modal.disclaimer": "Mastodon no puede informar a los usuarios que ignoraste sus notificaciones. Ignorar notificaciones no impedirá que se sigan enviando los mensajes.", "ignore_notifications_modal.filter_instead": "Filtrar en vez de ignorar", "ignore_notifications_modal.filter_to_act_users": "Aún podrás aceptar, rechazar o denunciar a usuarios", @@ -1042,6 +1043,8 @@ "notifications.policy.drop": "Ignorar", "notifications.policy.drop_hint": "Enviar al vacío, no volver a mostrar nunca", "notifications.policy.filter": "Filtrar", + "notifications.policy.filter_bots_hint": "Cuentas marcadas como automatizadas", + "notifications.policy.filter_bots_title": "Botes", "notifications.policy.filter_hint": "Enviar a la bandeja de entrada de notificaciones filtradas", "notifications.policy.filter_limited_accounts_hint": "Limitada por los moderadores del servidor", "notifications.policy.filter_limited_accounts_title": "Cuentas moderadas", diff --git a/app/javascript/mastodon/locales/es-MX.json b/app/javascript/mastodon/locales/es-MX.json index e09e8edf58c..0d35307a8db 100644 --- a/app/javascript/mastodon/locales/es-MX.json +++ b/app/javascript/mastodon/locales/es-MX.json @@ -780,6 +780,7 @@ "home.pending_critical_update.link": "Ver actualizaciones", "home.pending_critical_update.title": "¡Actualización de seguridad crítica disponible!", "home.show_announcements": "Mostrar anuncios", + "ignore_notifications_modal.bots_title": "¿Ignorar notificaciones de bots?", "ignore_notifications_modal.disclaimer": "Mastodon no puede informar a los usuarios que has ignorado sus notificaciones. Ignorar notificaciones no impedirá que se sigan enviando los mensajes.", "ignore_notifications_modal.filter_instead": "Filtrar en su lugar", "ignore_notifications_modal.filter_to_act_users": "Aún podrás aceptar, rechazar o reportar usuarios", @@ -1042,6 +1043,8 @@ "notifications.policy.drop": "Ignorar", "notifications.policy.drop_hint": "Enviar al vacío, no volver a mostrar nunca", "notifications.policy.filter": "Filtrar", + "notifications.policy.filter_bots_hint": "Cuentas etiquetadas como automatizadas", + "notifications.policy.filter_bots_title": "Bots", "notifications.policy.filter_hint": "Enviar a la bandeja de entrada de notificaciones filtradas", "notifications.policy.filter_limited_accounts_hint": "Limitadas por los moderadores del servidor", "notifications.policy.filter_limited_accounts_title": "Cuentas moderadas", diff --git a/app/javascript/mastodon/locales/es.json b/app/javascript/mastodon/locales/es.json index 2b9aca3c47c..948e4f52cda 100644 --- a/app/javascript/mastodon/locales/es.json +++ b/app/javascript/mastodon/locales/es.json @@ -780,6 +780,7 @@ "home.pending_critical_update.link": "Ver actualizaciones", "home.pending_critical_update.title": "¡Actualización de seguridad crítica disponible!", "home.show_announcements": "Mostrar comunicaciones", + "ignore_notifications_modal.bots_title": "¿Ignorar notificaciones de bots?", "ignore_notifications_modal.disclaimer": "Mastodon no puede informar a los usuarios de que has ignorado sus notificaciones. Ignorar notificaciones no impedirá que se sigan enviando los mensajes.", "ignore_notifications_modal.filter_instead": "Filtrar en vez de ignorar", "ignore_notifications_modal.filter_to_act_users": "Aún podrás aceptar, rechazar o reportar usuarios", @@ -1042,6 +1043,8 @@ "notifications.policy.drop": "Ignorar", "notifications.policy.drop_hint": "Enviar al vacío, no volver a mostrar nunca", "notifications.policy.filter": "Filtrar", + "notifications.policy.filter_bots_hint": "Cuentas etiquetadas como automatizadas", + "notifications.policy.filter_bots_title": "Bots", "notifications.policy.filter_hint": "Enviar a la bandeja de entrada de notificaciones filtradas", "notifications.policy.filter_limited_accounts_hint": "Limitadas por los moderadores del servidor", "notifications.policy.filter_limited_accounts_title": "Cuentas moderadas", diff --git a/app/javascript/mastodon/locales/fi.json b/app/javascript/mastodon/locales/fi.json index d3940571daa..11785a20500 100644 --- a/app/javascript/mastodon/locales/fi.json +++ b/app/javascript/mastodon/locales/fi.json @@ -780,6 +780,7 @@ "home.pending_critical_update.link": "Tutustu päivityssisältöihin", "home.pending_critical_update.title": "Kriittinen tietoturvapäivitys saatavilla!", "home.show_announcements": "Näytä tiedotteet", + "ignore_notifications_modal.bots_title": "Sivuutetaanko ilmoitukset boteilta?", "ignore_notifications_modal.disclaimer": "Mastodon ei voi ilmoittaa käyttäjille, että olet sivuuttanut heidän ilmoituksensa. Ilmoitusten sivuuttaminen ei lopeta itse viestien lähetystä.", "ignore_notifications_modal.filter_instead": "Suodata sen sijaan", "ignore_notifications_modal.filter_to_act_users": "Voit kuitenkin yhä hyväksyä, hylätä tai raportoida käyttäjiä", @@ -1042,6 +1043,8 @@ "notifications.policy.drop": "Sivuuta", "notifications.policy.drop_hint": "Lähetä tyhjyyteen, jotta et näe niitä enää koskaan", "notifications.policy.filter": "Suodata", + "notifications.policy.filter_bots_hint": "Automatisoiduiksi merkityt tilit", + "notifications.policy.filter_bots_title": "Botit", "notifications.policy.filter_hint": "Lähetä suodatettuihin ilmoituksiin", "notifications.policy.filter_limited_accounts_hint": "Palvelimen moderaattorien rajoittamat", "notifications.policy.filter_limited_accounts_title": "Moderoidut tilit", diff --git a/app/javascript/mastodon/locales/ga.json b/app/javascript/mastodon/locales/ga.json index 8ef61e60df2..0f06aabfccf 100644 --- a/app/javascript/mastodon/locales/ga.json +++ b/app/javascript/mastodon/locales/ga.json @@ -780,6 +780,7 @@ "home.pending_critical_update.link": "Féach nuashonruithe", "home.pending_critical_update.title": "Nuashonrú slándála ríthábhachtach ar fáil!", "home.show_announcements": "Taispeáin fógraí", + "ignore_notifications_modal.bots_title": "Neamhaird a dhéanamh d’fhógraí ó bhotaí?", "ignore_notifications_modal.disclaimer": "Ní féidir le Mastodon úsáideoirí a chur ar an eolas gur thug tú neamhaird dá bhfógraí. Má dhéantar neamhaird de fhógraí, ní stopfar na teachtaireachtaí iad féin a sheoladh.", "ignore_notifications_modal.filter_instead": "Scag ina ionad sin", "ignore_notifications_modal.filter_to_act_users": "Beidh tú fós in ann glacadh le húsáideoirí, iad a dhiúltú nó a thuairisciú", @@ -1042,6 +1043,8 @@ "notifications.policy.drop": "Déan neamhaird de", "notifications.policy.drop_hint": "Seol chuig an neamhní, gan a bheith le feiceáil arís", "notifications.policy.filter": "Scagaire", + "notifications.policy.filter_bots_hint": "Cuntais atá marcáilte mar uathoibrithe", + "notifications.policy.filter_bots_title": "Botanna", "notifications.policy.filter_hint": "Seol chuig an mbosca isteach fógraí scagtha", "notifications.policy.filter_limited_accounts_hint": "Teoranta ag modhnóirí freastalaí", "notifications.policy.filter_limited_accounts_title": "Cuntais mhodhnaithe", diff --git a/app/javascript/mastodon/locales/gl.json b/app/javascript/mastodon/locales/gl.json index b4da525cf91..7982e694ca7 100644 --- a/app/javascript/mastodon/locales/gl.json +++ b/app/javascript/mastodon/locales/gl.json @@ -780,6 +780,7 @@ "home.pending_critical_update.link": "Mira as actualizacións", "home.pending_critical_update.title": "Hai una actualización crítica de seguridade!", "home.show_announcements": "Amosar anuncios", + "ignore_notifications_modal.bots_title": "Ignorar as notificacións dos robots?", "ignore_notifications_modal.disclaimer": "Mastodon non pode informar ás usuarias de que ignoraches as súas notificacións. Ao ignorar as notificacións non evitarás que as mensaxes sexan enviadas igualmente.", "ignore_notifications_modal.filter_instead": "Filtrar igualmente", "ignore_notifications_modal.filter_to_act_users": "Poderás seguir aceptando, rexeitando e denunciando usuarias", @@ -846,6 +847,7 @@ "keyboard_shortcuts.toggle_sensitivity": "Para amosar/agochar contido multimedia", "keyboard_shortcuts.toot": "Para escribir unha nova publicación", "keyboard_shortcuts.top": "Mover arriba de todo", + "keyboard_shortcuts.translate": "Traducir unha publicación", "keyboard_shortcuts.unfocus": "Para deixar de destacar a área de escritura/procura", "keyboard_shortcuts.up": "Para mover cara arriba na listaxe", "learn_more_link.got_it": "Entendo", @@ -1041,6 +1043,8 @@ "notifications.policy.drop": "Ignorar", "notifications.policy.drop_hint": "Esquecer isto, non volver a velo", "notifications.policy.filter": "Filtrar", + "notifications.policy.filter_bots_hint": "Contas marcadas como automatizadas", + "notifications.policy.filter_bots_title": "Robots", "notifications.policy.filter_hint": "Enviar á caixa de notificacións filtradas", "notifications.policy.filter_limited_accounts_hint": "Limitada pola moderación do servidor", "notifications.policy.filter_limited_accounts_title": "Contas moderadas", diff --git a/app/javascript/mastodon/locales/he.json b/app/javascript/mastodon/locales/he.json index 2cb0b076973..e26b6e5f46e 100644 --- a/app/javascript/mastodon/locales/he.json +++ b/app/javascript/mastodon/locales/he.json @@ -780,6 +780,7 @@ "home.pending_critical_update.link": "צפיה בעדכונים", "home.pending_critical_update.title": "יצא עדכון אבטחה חשוב!", "home.show_announcements": "הצג הכרזות", + "ignore_notifications_modal.bots_title": "להתעלם מהתראות מחשבונות רובוטיים?", "ignore_notifications_modal.disclaimer": "מסטודון אינו יכול ליידע משתמשים שהתעלמתם מהתראותיהם. התעלמות מהתראות לא תחסום את ההודעות עצמן מלהשלח.", "ignore_notifications_modal.filter_instead": "לסנן במקום", "ignore_notifications_modal.filter_to_act_users": "עדיין ביכולתך לקבל, לדחות ולדווח על משתמשים אחרים", @@ -846,6 +847,7 @@ "keyboard_shortcuts.toggle_sensitivity": "הצגת/הסתרת מדיה", "keyboard_shortcuts.toot": "להתחיל חיצרוץ חדש", "keyboard_shortcuts.top": "העברה לראש הרשימה", + "keyboard_shortcuts.translate": "לתרגם הודעה", "keyboard_shortcuts.unfocus": "לצאת מתיבת חיבור/חיפוש", "keyboard_shortcuts.up": "לנוע במעלה הרשימה", "learn_more_link.got_it": "הבנתי", @@ -1041,6 +1043,8 @@ "notifications.policy.drop": "להתעלם", "notifications.policy.drop_hint": "שליחה אל מצולות הנשיה, ולא יוודעו אודותיה לעולם", "notifications.policy.filter": "מסנן", + "notifications.policy.filter_bots_hint": "חשבונות המסומנים כאוטומטיים", + "notifications.policy.filter_bots_title": "בוטים", "notifications.policy.filter_hint": "שליחה לתיבה נכנסת מסוננת", "notifications.policy.filter_limited_accounts_hint": "הוגבל על ידי מנהלי הדיונים", "notifications.policy.filter_limited_accounts_title": "חשבומות תחת ניהול תוכן", diff --git a/app/javascript/mastodon/locales/is.json b/app/javascript/mastodon/locales/is.json index ed5fc9bffbc..a5fbd1b8457 100644 --- a/app/javascript/mastodon/locales/is.json +++ b/app/javascript/mastodon/locales/is.json @@ -780,6 +780,7 @@ "home.pending_critical_update.link": "Skoða uppfærslur", "home.pending_critical_update.title": "Áríðandi öryggisuppfærsla er tiltæk!", "home.show_announcements": "Birta auglýsingar", + "ignore_notifications_modal.bots_title": "Hunsa tilkynningar frá yrkjum?", "ignore_notifications_modal.disclaimer": "Mastodon getur ekki upplýst notendur um að þú hunsir tilkynningar frá þeim. Hunsun tilkynninga kemur ekki í veg fyrir að sjálf skilaboðin verði send.", "ignore_notifications_modal.filter_instead": "Sía frekar", "ignore_notifications_modal.filter_to_act_users": "Þú munt áfram geta samþykkt, hafnað eða kært notendur", @@ -1042,6 +1043,8 @@ "notifications.policy.drop": "Hunsa", "notifications.policy.drop_hint": "Senda út í tómið, svo það sjáist aldrei framar", "notifications.policy.filter": "Sía", + "notifications.policy.filter_bots_hint": "Aðgangar merktir fyrir yrki", + "notifications.policy.filter_bots_title": "Yrki", "notifications.policy.filter_hint": "Senda í pósthólf fyrir síaðar tilkynningar", "notifications.policy.filter_limited_accounts_hint": "Takmarkað af umsjónarmönnum netþjóns", "notifications.policy.filter_limited_accounts_title": "Aðgangar í umsjón", diff --git a/app/javascript/mastodon/locales/it.json b/app/javascript/mastodon/locales/it.json index 3382a02b923..8667f342bb5 100644 --- a/app/javascript/mastodon/locales/it.json +++ b/app/javascript/mastodon/locales/it.json @@ -780,6 +780,7 @@ "home.pending_critical_update.link": "Visualizza aggiornamenti", "home.pending_critical_update.title": "Aggiornamento critico di sicurezza disponibile!", "home.show_announcements": "Mostra annunci", + "ignore_notifications_modal.bots_title": "Ignorare le notifiche dai bot?", "ignore_notifications_modal.disclaimer": "Mastodon non può informare gli utenti che hai ignorato le loro notifiche. Ignorare le notifiche non impedirà l'invio dei messaggi stessi.", "ignore_notifications_modal.filter_instead": "Filtra invece", "ignore_notifications_modal.filter_to_act_users": "Potrai comunque accettare, rifiutare o segnalare gli utenti", @@ -1042,6 +1043,8 @@ "notifications.policy.drop": "Ignora", "notifications.policy.drop_hint": "Scarta definitivamente, per non essere mai più visto", "notifications.policy.filter": "Filtrare", + "notifications.policy.filter_bots_hint": "Account contrassegnati come automatizzati", + "notifications.policy.filter_bots_title": "Bot", "notifications.policy.filter_hint": "Invia alla casella in arrivo delle notifiche filtrate", "notifications.policy.filter_limited_accounts_hint": "Limitato dai moderatori del server", "notifications.policy.filter_limited_accounts_title": "Account moderati", diff --git a/app/javascript/mastodon/locales/pl.json b/app/javascript/mastodon/locales/pl.json index 39f141965cd..dd88b2e587b 100644 --- a/app/javascript/mastodon/locales/pl.json +++ b/app/javascript/mastodon/locales/pl.json @@ -43,6 +43,7 @@ "account.featured": "Wyróżnione", "account.featured.accounts": "Profile", "account.featured.collections": "Kolekcje", + "account.featured.new_collection": "Nowa kolekcja", "account.field_overflow": "Pokaż całą zawartość", "account.filters.all": "Wszystkie aktywności", "account.filters.boosts_toggle": "Pokaż ulepszenia", @@ -68,9 +69,13 @@ "account.go_to_profile": "Przejdź do profilu", "account.hide_reblogs": "Ukryj podbicia od @{name}", "account.in_memoriam": "Ku pamięci.", + "account.join_modal.day": "Dzień", "account.join_modal.me": "Dołączyłeś(aś) na {server}", "account.join_modal.me_today": "To Twój pierwszy dzień na {server}!", "account.join_modal.other": "{name} dołączył(a) na {server}", + "account.join_modal.share.celebrate": "Udostępnij uroczysty post", + "account.join_modal.share.intro": "Udostępnij post wprowadzający", + "account.join_modal.share.welcome": "Udostępnij post powitalny", "account.joined_short": "Dołączył(a)", "account.languages": "Zmień subskrybowane języki", "account.last_active": "Ostatnia aktywność", @@ -120,6 +125,7 @@ "account.note.edit_button": "Edytuj", "account.note.title": "Osobista notatka (widoczna tylko dla Ciebie)", "account.open_original_page": "Otwórz stronę oryginalną", + "account.pending": "Oczekuje", "account.posts": "Wpisy", "account.remove_from_followers": "Usuń {name} z obserwujących", "account.report": "Zgłoś @{name}", @@ -173,9 +179,12 @@ "account_edit.field_edit_modal.discard_confirm": "Odrzuć", "account_edit.field_edit_modal.discard_message": "Masz niezapisane zmiany. Czy na pewno chcesz je odrzucić?", "account_edit.field_edit_modal.edit_title": "Edytuj dodatkowe pole", + "account_edit.field_edit_modal.name_hint": "Np. Strona osobista", "account_edit.field_edit_modal.name_label": "Etykieta", "account_edit.field_edit_modal.value_label": "Wartość", "account_edit.image_alt_modal.add_title": "Dodaj tekst alternatywny", + "account_edit.image_alt_modal.edit_title": "Edytuj tekst alternatywny", + "account_edit.image_alt_modal.text_hint": "Tekst alternatywny pomaga użytkownikom czytników ekranu zrozumieć twoją treść.", "account_edit.image_alt_modal.text_label": "Tekst alternatywny", "account_edit.image_delete_modal.delete_button": "Usuń", "account_edit.image_delete_modal.title": "Usunąć obraz?", @@ -185,6 +194,8 @@ "account_edit.image_edit.remove_button": "Usuń obraz", "account_edit.image_edit.replace_button": "Zastąp obraz", "account_edit.item_list.delete": "Usuń {name}", + "account_edit.name_modal.add_title": "Dodaj nazwę wyświetlaną", + "account_edit.name_modal.edit_title": "Edytuj nazwę wyświetlaną", "account_edit.profile_tab.button_label": "Dostosuj", "account_edit.profile_tab.hint.description": "Te ustawienia wpływają na to, co użytkownicy widzą na {server} w oficjalnych aplikacjach, ale mogą nie obowiązywać na innych serwerach i w aplikacjach zewnętrznych.", "account_edit.profile_tab.hint.title": "Wyświetlanie może się różnić", @@ -204,12 +215,14 @@ "account_edit.upload_modal.next": "Następne", "account_edit.upload_modal.step_crop.zoom": "Powiększenie", "account_edit.upload_modal.step_upload.button": "Wybierz pliki", + "account_edit.upload_modal.step_upload.dragging": "Upuść, aby przesłać", "account_edit.upload_modal.step_upload.header": "Wybierz obraz", "account_edit.upload_modal.step_upload.hint": "WEBP, PNG, GIF lub JPG, maksymalnie {limit} MB.{br}Obraz zostanie przeskalowany do {width}x{height} px.", "account_edit.upload_modal.title_add.avatar": "Dodaj zdjęcie profilowe", "account_edit.upload_modal.title_add.header": "Dodaj zdjęcie nagłówka", "account_edit.upload_modal.title_replace.avatar": "Zmień zdjęcie profilowe", "account_edit.upload_modal.title_replace.header": "Zmień zdjęcie nagłówka", + "account_edit.verified_modal.invisible_link.summary": "Co zrobić, aby link był niewidoczny?", "account_edit_tags.add_tag": "Dodaj #{tagName}", "account_edit_tags.search_placeholder": "Dodaj hashtag...", "admin.dashboard.daily_retention": "Wskaźnik utrzymania użytkowników według dni od rejestracji", diff --git a/app/javascript/mastodon/locales/pt-BR.json b/app/javascript/mastodon/locales/pt-BR.json index 987ddc21016..cb74515a8ac 100644 --- a/app/javascript/mastodon/locales/pt-BR.json +++ b/app/javascript/mastodon/locales/pt-BR.json @@ -780,6 +780,7 @@ "home.pending_critical_update.link": "Ver atualizações", "home.pending_critical_update.title": "Atualização de segurança crítica disponível!", "home.show_announcements": "Mostrar anúncios", + "ignore_notifications_modal.bots_title": "Ignorar notificações de robôs?", "ignore_notifications_modal.disclaimer": "O Mastodon não informa os usuários se você ignorar as notificações deles. Ignorar notificações não impedirá as mensagens de serem enviadas.", "ignore_notifications_modal.filter_instead": "Filtrar em vez disso", "ignore_notifications_modal.filter_to_act_users": "Você ainda poderá aceitar, rejeitar ou denunciar", @@ -1042,6 +1043,8 @@ "notifications.policy.drop": "Ignorar", "notifications.policy.drop_hint": "Enviar para o vácuo, para nunca mais ser visto", "notifications.policy.filter": "Filtrar", + "notifications.policy.filter_bots_hint": "Contas marcadas como automáticas", + "notifications.policy.filter_bots_title": "Robôs", "notifications.policy.filter_hint": "Enviar para a caixa de notificações filtradas", "notifications.policy.filter_limited_accounts_hint": "Limitado pelos moderadores do servidor", "notifications.policy.filter_limited_accounts_title": "Contas moderadas", diff --git a/app/javascript/mastodon/locales/sq.json b/app/javascript/mastodon/locales/sq.json index d2803adfd10..3c3d0074e3e 100644 --- a/app/javascript/mastodon/locales/sq.json +++ b/app/javascript/mastodon/locales/sq.json @@ -841,6 +841,7 @@ "keyboard_shortcuts.toggle_sensitivity": "Për shfaqje/fshehje mediash", "keyboard_shortcuts.toot": "Për të filluar një mesazh të ri", "keyboard_shortcuts.top": "Shpjere në krye të listës", + "keyboard_shortcuts.translate": "Përkthe një postim", "keyboard_shortcuts.unfocus": "Për heqjen e fokusit nga fusha e hartimit të mesazheve apo kërkimeve", "keyboard_shortcuts.up": "Për ngjitje sipër nëpër listë", "learn_more_link.got_it": "E mora vesh", diff --git a/app/javascript/mastodon/locales/vi.json b/app/javascript/mastodon/locales/vi.json index 745f89d1592..3f34087d528 100644 --- a/app/javascript/mastodon/locales/vi.json +++ b/app/javascript/mastodon/locales/vi.json @@ -780,6 +780,7 @@ "home.pending_critical_update.link": "Xem bản cập nhật", "home.pending_critical_update.title": "Có bản cập nhật bảo mật quan trọng!", "home.show_announcements": "Xem thông báo máy chủ", + "ignore_notifications_modal.bots_title": "Bỏ qua thông báo từ các tài khoản bot?", "ignore_notifications_modal.disclaimer": "Mastodon sẽ không thông báo cho tài khoản rằng bạn đã bỏ qua thông báo của họ. Họ sẽ vẫn có thể tương tác với bạn.", "ignore_notifications_modal.filter_instead": "Lọc thay thế", "ignore_notifications_modal.filter_to_act_users": "Bạn vẫn có thể chấp nhận, từ chối hoặc báo cáo tài khoản khác", @@ -846,6 +847,7 @@ "keyboard_shortcuts.toggle_sensitivity": "ẩn/hiện ảnh hoặc video", "keyboard_shortcuts.toot": "soạn tút mới", "keyboard_shortcuts.top": "di chuyển đến đầu danh sách", + "keyboard_shortcuts.translate": "Dịch tút", "keyboard_shortcuts.unfocus": "đưa con trỏ ra khỏi ô soạn thảo hoặc ô tìm kiếm", "keyboard_shortcuts.up": "di chuyển lên trên danh sách", "learn_more_link.got_it": "Đã hiểu", @@ -1041,6 +1043,8 @@ "notifications.policy.drop": "Bỏ qua", "notifications.policy.drop_hint": "Bỏ qua vĩnh viễn", "notifications.policy.filter": "Lọc", + "notifications.policy.filter_bots_hint": "Những tài khoản đánh dấu là tự động", + "notifications.policy.filter_bots_title": "Bot", "notifications.policy.filter_hint": "Cho vào mục thông báo đã lọc", "notifications.policy.filter_limited_accounts_hint": "Chỉ dành cho kiểm duyệt viên", "notifications.policy.filter_limited_accounts_title": "Kiểm duyệt tài khoản", diff --git a/app/javascript/mastodon/locales/zh-CN.json b/app/javascript/mastodon/locales/zh-CN.json index 15f0f42da20..2d57e6f49f6 100644 --- a/app/javascript/mastodon/locales/zh-CN.json +++ b/app/javascript/mastodon/locales/zh-CN.json @@ -780,6 +780,7 @@ "home.pending_critical_update.link": "查看更新", "home.pending_critical_update.title": "有紧急安全更新!", "home.show_announcements": "显示公告", + "ignore_notifications_modal.bots_title": "是否忽略来自机器人账号的通知?", "ignore_notifications_modal.disclaimer": "Mastodon无法通知对方用户你忽略了他们的通知。忽略通知不会阻止消息本身的发送。", "ignore_notifications_modal.filter_instead": "改为过滤", "ignore_notifications_modal.filter_to_act_users": "你仍然可以接受、拒绝或举报用户", @@ -1042,6 +1043,8 @@ "notifications.policy.drop": "忽略", "notifications.policy.drop_hint": "送入虚空,再也不查看", "notifications.policy.filter": "过滤", + "notifications.policy.filter_bots_hint": "被标记为自动化的账号", + "notifications.policy.filter_bots_title": "机器人", "notifications.policy.filter_hint": "发送到被过滤通知列表", "notifications.policy.filter_limited_accounts_hint": "被服务器管理员限制的账号", "notifications.policy.filter_limited_accounts_title": "受限账号", diff --git a/app/javascript/mastodon/locales/zh-TW.json b/app/javascript/mastodon/locales/zh-TW.json index b3f4fc03219..263afc29e1d 100644 --- a/app/javascript/mastodon/locales/zh-TW.json +++ b/app/javascript/mastodon/locales/zh-TW.json @@ -780,6 +780,7 @@ "home.pending_critical_update.link": "檢視更新內容", "home.pending_critical_update.title": "有可取得的重要安全性更新!", "home.show_announcements": "顯示公告", + "ignore_notifications_modal.bots_title": "是否忽略來自機器人帳號之推播通知?", "ignore_notifications_modal.disclaimer": "Mastodon 無法通知您已忽略推播通知之使用者。忽略通知不會阻止訊息本身的發送。", "ignore_notifications_modal.filter_instead": "改為過濾", "ignore_notifications_modal.filter_to_act_users": "您仍能接受、拒絕、或檢舉使用者", @@ -1042,6 +1043,8 @@ "notifications.policy.drop": "忽略", "notifications.policy.drop_hint": "送至黑洞,永不相見", "notifications.policy.filter": "過濾器", + "notifications.policy.filter_bots_hint": "自動化帳號", + "notifications.policy.filter_bots_title": "機器人", "notifications.policy.filter_hint": "送至已過濾推播通知收件夾", "notifications.policy.filter_limited_accounts_hint": "已被伺服器管理員限制", "notifications.policy.filter_limited_accounts_title": "受管制帳號", diff --git a/config/locales/be.yml b/config/locales/be.yml index 091bf2f4657..5d09fbdc444 100644 --- a/config/locales/be.yml +++ b/config/locales/be.yml @@ -525,6 +525,21 @@ be: no_lists_yet: Пакуль няма спісаў last_email: Апошняя электронная пошта lead: Уліковыя запісы, якія ўключылі гэту функцыю і маюць падпісчыкаў, будуць паказаныя знізу. + show: + confirm_disable_feature: Адключыць рассылку па электроннай пошце для %{name}? Абнаўленні больш не будуць прыходзіць на пошту гэтага ўліковага запісу. Карыстальнік усё яшчэ зможа ўключыць гэту функцыю нанова ў наладах уліковага запісу. Каб назаўсёды прыбраць доступ да гэтай функцыі, змяніце дазволы ўліковага запісу ў Ролях. + confirm_remove_subscriber: "%{email} больш не будзе атрымліваць электронныя лісты ад %{name}. Гэтае дзеянне незваротнае." + consent: Падпісчыкі пагадзіліся толькі атрымліваць допісы на электронную пошту. Не карыстайцеся гэтым спісам у іншых мэтах. + date: Дата рэгістрацыі + disable_feature: Адключыць функцыю + disabled: Функцыя была адключаная і электронныя лісты больш не будуць дасылацца гэтаму спісу. + email: Адрас электроннай пошты + empty: + hint: Ніхто яшчэ не аформіў падпіску на гэты ўліковы запіс. + no_subscribers_yet: Пакуль няма падпісчыкаў + enable_feature: Уключыць функцыю + no_access_html: У гэтага ўліковага запісу больш няма дазволаў, патрэбных, каб уключыць гэту функцыю. Змяніце гэта ў Ролях. + title: Паштовая рассылка %{name} + view_account: Прагл. уліковы запіс status: Стан subscribers: Падпісчыкі title: Спісы рассылкі @@ -1541,6 +1556,7 @@ be: your_appeal_rejected: Ваша абскарджанне было адхілена edit_profile: other: Іншае + privacy_redesign_body: Уключыць ці адключыць паказ Вашых падпісчыкаў і падпісак цяпер можна прама ў Вашым профілі. redesign_body: Рэдагаванне профілю цяпер даступнае наўпрост са старонкі профілю. redesign_button: Перайсці туды redesign_title: Адбыліся змены ў рэдагаванні профілю @@ -1575,7 +1591,9 @@ be: success_html: Вы цяпер пачняце атрымліваць электронныя лісты, калі %{name} будзе рабіць новыя допісы. Дадайце %{sender} у свае кантакты, каб гэтыя допісы не траплялі ў папку са спамам. title: Вы падпісаліся праз эл. пошту unsubscribe: Адпісацца + disabled: Адключана inactive: Неактыўная + no_access: Няма доступу status: Стан subscribers: Падпісчыкі па эл.пошце emoji_styles: diff --git a/config/locales/gl.yml b/config/locales/gl.yml index 475ffa70a0a..bcf6cdba8cb 100644 --- a/config/locales/gl.yml +++ b/config/locales/gl.yml @@ -505,6 +505,21 @@ gl: no_lists_yet: Aínda non hai listas last_email: Último correo lead: Aquí móstranse as contas que activaron esta ferramenta e teñen subscritoras. + show: + confirm_disable_feature: Desactivar o boletín para %{name}? Non se van enviar máis novidades desta conta por correo. A usuaria poderá reactivar esta ferramenta nos axustes da súa conta. Para quitar de xeito permanente o acceso á ferramenta, edita os permisos da conta en Roles. + confirm_remove_subscriber: "%{email} non vai seguir recibindo correos de %{name}. Esta acción non é reversible." + consent: As subscritoras consentiron exclusivamente recibir no correo as publicacións. Non uses esta lista para outros propósitos. + date: Data da subscrición + disable_feature: Desactivar a ferramenta + disabled: Esta ferramenta desactivouse e non se van seguir enviando correos a esta lista. + email: Enderezo de correo + empty: + hint: Aínda non hai subscricións a esta conta. + no_subscribers_yet: Sen subscricións + enable_feature: Activar a ferramenta + no_access_html: Esta conta xa non ten os permisos requeridos para activar a ferramenta. Cambiaos en Roles. + title: Boletín por correo de %{name} + view_account: Ver conta status: Estado subscribers: Subscritoras title: Listas de correo @@ -1532,7 +1547,9 @@ gl: success_html: Vas comezar a recibir correos cando %{name} publique novas publicacións. Engade %{sender} á túa libreta de enderezos para que os correos non vaian directamente ao cartafol de Spam. title: Subscribícheste unsubscribe: Anular subscrición + disabled: Desactivado inactive: Inactiva + no_access: Sen acceso status: Estado subscribers: Subscritoras emoji_styles: diff --git a/config/locales/he.yml b/config/locales/he.yml index 59617180e26..cb0e3e7d42f 100644 --- a/config/locales/he.yml +++ b/config/locales/he.yml @@ -525,6 +525,21 @@ he: no_lists_yet: אין רשימות עדיין last_email: הודעת דואל אחרונה lead: חשבונות שבהם הופעלה האפשרות ויש להם מנויים יופיעו להלן. + show: + confirm_disable_feature: להשבית מנשרי דוא"ל של %{name}? עדכוני דוא"ל לא ישלחו עוד מטעם חשבון זה. המשתמשת תוכל לאפשר מחדש את התכונה מהעדפות החשבון שלה. כדי לכבות לצמיתות גישה לתכונה הזו, יש לערוך את הרשאות החשבון תחת תפקידים. + confirm_remove_subscriber: '%{email} לא יקבלו יותר דוא"ל מאת %{name}. פעולה זו לא בלתי הפיכה.' + consent: מנויים הסכימו רק לקבלת הודעות דרך דוא"ל. אין להשתש ברשימה זו לאף מטרה אחרת. + date: תאריך ההצטרפות + disable_feature: כיבוי תכונה + disabled: תכונה זו הושבתה והודעות דוא"ל לא נשלחות יותר אל רשימה זו. + email: כתובת דוא"ל + empty: + hint: אין לחשבון זה נרשמים עדיין. + no_subscribers_yet: אין מנויים עדיין + enable_feature: אפשר תכונה + no_access_html: לחשבון זה אין יותר את ההרשאות הדרושות להפעלת התכונה. שנו זאת תחת תפקידים. + title: מנשרי דוא"ל של %{name} + view_account: הצג חשבון status: מצב subscribers: מנויים title: רשימות תפוצה @@ -1576,7 +1591,9 @@ he: success_html: מעתה תקבלנה דוא"ל כאשר %{name} יפרסמו הודעות חדשות. הוספנה את %{sender} לאנשי הקשר כדי שההודעות האלו לא יגיעו אל פח הספאם שלכן. title: נרשמת unsubscribe: ביטול ההרשמה + disabled: כבוי inactive: לא פעילים + no_access: אין גישה status: מצב subscribers: מנויים emoji_styles: diff --git a/config/locales/is.yml b/config/locales/is.yml index 835c3e560cd..887574ecdde 100644 --- a/config/locales/is.yml +++ b/config/locales/is.yml @@ -506,13 +506,18 @@ is: last_email: Síðasti tölvupóstur lead: Aðgangar sem hafa virkjað eiginleikann og eru með áskrifendur munu birtast hér fyrir neðan. show: + confirm_disable_feature: Á að gera óvirkar fréttir í tölvupósti frá %{name}? Færslur verða ekki lengur sendar í tölvupósti frá þessum notandaaðgangi. Notandinn mun samt geta virkjað aftur þennan eiginleika í stillingunum sínum. Til að fjarlægja endanlega aðgang að þessum eiginleika skaltu breyta heimildum aðgangsins í gegnum 'Hlutverk'. + confirm_remove_subscriber: "%{email} mun ekki lengur fá tölvupósta frá %{name}. Ekki er hægt að afturkalla þessa aðgerð." + consent: Áskrifendur hafa einungis samþykkt að fá sendar færslur í tölvupósti. Ekki nota þennan lista í neinum öðrum tilgangi. date: Dagsetning skráningar disable_feature: Gera eiginleika óvirkan + disabled: Eiginleikinn var gerður óvirkur og eru tölvupóstar ekki lengur sendir á þenna lista. email: Tölvupóstfang empty: hint: Enginn hefur enn gerst áskrifandi að þessum notandaaðgangi. no_subscribers_yet: Engir áskrifendur ennþá enable_feature: Virkja eiginleika + no_access_html: Þessi aðgangur hefur ekki lengur heimild til að virkja þennan eiginleika. Breyttu því í Hlutverk. title: Tölvupóstfréttir frá %{name} view_account: Skoða notandaaðgang status: Staða diff --git a/config/locales/sq.yml b/config/locales/sq.yml index e4cdf0e993e..191f74de777 100644 --- a/config/locales/sq.yml +++ b/config/locales/sq.yml @@ -505,6 +505,21 @@ sq: no_lists_yet: Ende pa lista last_email: Email-i i fundit lead: Llogaritë që kanë aktivizuar veçorinë dhe kanë pajtimtarë do të shfaqen më poshtë. + show: + confirm_disable_feature: Të çaktivizohen buletine me email për %{name}? Për këtë llogari s’do të dërgohen më përditësime me email. Përdoruesi do të jetë prapëseprapë në gjendje të riaktivizojë veçorinë që nga rregullimet e llogarisë të vet. Për të hequr përgjithnjë përdorimin e kësaj veçorie, përpunoni lejen e llogarisë te Role. + confirm_remove_subscriber: "%{email} s’do të marrë më email-e nga %{name}. Ky veprim s’mund të zhbëhet." + consent: Pajtimtarët kanë pranuar vetëm të marrin postime përmes email-i. Mos e përdorni këtë listë për qëllime të tjera. + date: Datë e regjistrimit + disable_feature: Çaktivizoje veçorinë + disabled: Veçoria qe çaktivizuar dhe te kjo listë s’dërgohen më email-e. + email: Adresë email + empty: + hint: Te kjo llogari s’është pajtuar ende dikush. + no_subscribers_yet: Ende pa pajtimtarë + enable_feature: Aktivizoje veçorinë + no_access_html: Kjo llogari s’ka më lejet e domosdoshme për aktivizimin e veçorisë. Ndryshojeni këtë që nga Role. + title: Buletine me email nga %{name} + view_account: Shiheni llogarinë status: Gjendje subscribers: Pajtimtarë title: Lista postimesh @@ -1521,7 +1536,9 @@ sq: success_html: Tani do të filloni të merrni email-e, kur %{name} boton postime të reja. Shtojeni %{sender} te kontaktet tuaj, që këto postime të mos përfundojnë te dosja juaj e Të padëshiruarve. title: U regjistruat unsubscribe: Shpajtohuni + disabled: E çaktivizuar inactive: Joaktiv + no_access: S’lejohet përdorim status: Gjendje subscribers: Pajtimtarë errors: diff --git a/config/locales/vi.yml b/config/locales/vi.yml index 44d247e2acd..f3b20dfafea 100644 --- a/config/locales/vi.yml +++ b/config/locales/vi.yml @@ -495,6 +495,21 @@ vi: no_lists_yet: Chưa có danh sách nào last_email: Email gần nhất lead: Các tài khoản đã kích hoạt tính năng này và có người đăng ký sẽ hiển thị bên dưới. + show: + confirm_disable_feature: Tắt bản tin email cho %{name}? Bản tin cập nhật qua email sẽ không còn được gửi cho tài khoản này nữa. Người dùng vẫn có thể bật lại tính năng này trong cài đặt tài khoản của họ. Để xóa vĩnh viễn quyền truy cập vào tính năng này, hãy chỉnh sửa quyền của tài khoản trong mục Vai trò. + confirm_remove_subscriber: "%{email} sẽ không còn nhận được email từ %{name} nữa. Hành động này không thể hoàn tác." + consent: Người đăng ký chỉ đồng ý nhận bài viết qua email. Vui lòng không sử dụng danh sách này cho mục đích khác. + date: Ngày đăng ký + disable_feature: Tắt tính năng + disabled: Tính năng này đã bị vô hiệu hóa và email không còn được gửi đến danh sách này nữa. + email: Địa chỉ email + empty: + hint: Hiện chưa có ai đăng ký theo dõi tài khoản này. + no_subscribers_yet: Chưa có đăng ký theo dõi + enable_feature: Bật tính năng + no_access_html: Tài khoản này không còn quyền hạn cần thiết để kích hoạt tính năng này nữa. Thay đổi trong Vai trò. + title: Bản tin email của %{name} + view_account: Xem tài khoản status: Trạng thái subscribers: Người đăng ký đọc title: Danh sách gửi thư @@ -1510,7 +1525,9 @@ vi: success_html: Bạn sẽ bắt đầu nhận được email khi %{name} đăng tút mới. Thêm %{sender} vào danh bạ của bạn để những tút này không bị chuyển vào thư mục Spam. title: Bạn đã đăng ký đọc unsubscribe: Hủy đăng ký đọc + disabled: Đã tắt inactive: Không hoạt động + no_access: Không có quyền status: Trạng thái subscribers: Người đăng ký đọc emoji_styles: From 885a9f1d84c7afb1980e33f82aac11109be688e7 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 10 Jun 2026 09:04:23 +0000 Subject: [PATCH 083/130] Update dependency libvips to v8.18.3 (#39344) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Dockerfile b/Dockerfile index 6f44c4c3e10..0799a7b66f0 100644 --- a/Dockerfile +++ b/Dockerfile @@ -210,7 +210,7 @@ FROM media-build AS libvips # libvips version to compile, change with [--build-arg VIPS_VERSION="8.15.2"] # renovate: datasource=github-releases depName=libvips packageName=libvips/libvips -ARG VIPS_VERSION=8.18.2 +ARG VIPS_VERSION=8.18.3 # libvips download URL, change with [--build-arg VIPS_URL="https://github.com/libvips/libvips/releases/download"] ARG VIPS_URL=https://github.com/libvips/libvips/releases/download From c51eb56a9029f28f277fb30886cd0fb2f864ae47 Mon Sep 17 00:00:00 2001 From: Matt Jankowski Date: Wed, 10 Jun 2026 05:27:07 -0400 Subject: [PATCH 084/130] Clarify preview card CLI command handles media only (#39348) --- lib/mastodon/cli/preview_cards.rb | 17 ++++++++--------- spec/lib/mastodon/cli/preview_cards_spec.rb | 6 +++--- 2 files changed, 11 insertions(+), 12 deletions(-) diff --git a/lib/mastodon/cli/preview_cards.rb b/lib/mastodon/cli/preview_cards.rb index c0e207ad596..c09fb9d2c7d 100644 --- a/lib/mastodon/cli/preview_cards.rb +++ b/lib/mastodon/cli/preview_cards.rb @@ -11,18 +11,17 @@ module Mastodon::CLI option :verbose, type: :boolean, aliases: [:v] option :dry_run, type: :boolean, default: false option :link, type: :boolean, default: false - desc 'remove', 'Remove preview cards' + desc 'remove', 'Remove preview card media' long_desc <<-DESC Removes local thumbnails for preview cards. - The --days option specifies how old preview cards have to be before - they are removed. It defaults to 180 days. Since preview cards will - not be re-fetched unless the link is re-posted after 2 weeks from - last time, it is not recommended to delete preview cards within the - last 14 days. + The --days option sets the age a preview card must be before attached + media will be removed. Preview cards will not be re-fetched unless the + link is posted again two weeks after the last usage, so it is not + recommended to delete preview card media from within the last 14 days. - With the --link option, only link-type preview cards will be deleted, - leaving video and photo cards untouched. + With the --link option, only media from link-type preview cards will be + deleted, skipping video and photo cards. DESC def remove time_ago = options[:days].days.ago @@ -44,7 +43,7 @@ module Mastodon::CLI size end - say("Removed #{processed} #{link}preview cards (approx. #{number_to_human_size(aggregate)})#{dry_run_mode_suffix}", :green, true) + say("Removed media from #{processed} #{link}preview cards (approx. #{number_to_human_size(aggregate)})#{dry_run_mode_suffix}", :green, true) end end end diff --git a/spec/lib/mastodon/cli/preview_cards_spec.rb b/spec/lib/mastodon/cli/preview_cards_spec.rb index 949787a7590..ddbb206ef87 100644 --- a/spec/lib/mastodon/cli/preview_cards_spec.rb +++ b/spec/lib/mastodon/cli/preview_cards_spec.rb @@ -26,7 +26,7 @@ RSpec.describe Mastodon::CLI::PreviewCards do it 'deletes thumbnails for local preview cards' do expect { subject } .to output_results( - 'Removed 2 preview cards', + 'Removed media from 2 preview cards', 'approx. 119 KB' ) end @@ -38,7 +38,7 @@ RSpec.describe Mastodon::CLI::PreviewCards do it 'deletes thumbnails for local preview cards' do expect { subject } .to output_results( - 'Removed 1 link-type preview cards', + 'Removed media from 1 link-type preview cards', 'approx. 59.6 KB' ) end @@ -50,7 +50,7 @@ RSpec.describe Mastodon::CLI::PreviewCards do it 'deletes thumbnails for local preview cards' do expect { subject } .to output_results( - 'Removed 1 preview cards', + 'Removed media from 1 preview cards', 'approx. 59.6 KB' ) end From f2094164c4046822dc455ae56f8d1847e88dc129 Mon Sep 17 00:00:00 2001 From: matrix07012 <8049717+matrix07012@users.noreply.github.com> Date: Wed, 10 Jun 2026 11:27:38 +0200 Subject: [PATCH 085/130] Fix being unable to unmark media as sensitive when "always mark media as sensitive" is enabled (#39339) --- .../features/compose/components/compose_form.jsx | 4 +++- app/javascript/mastodon/reducers/compose.js | 10 +++++++--- 2 files changed, 10 insertions(+), 4 deletions(-) diff --git a/app/javascript/mastodon/features/compose/components/compose_form.jsx b/app/javascript/mastodon/features/compose/components/compose_form.jsx index 2cc1f7915a5..f2beaed8471 100644 --- a/app/javascript/mastodon/features/compose/components/compose_form.jsx +++ b/app/javascript/mastodon/features/compose/components/compose_form.jsx @@ -220,7 +220,9 @@ class ComposeForm extends ImmutablePureComponent { } else if(prevProps.isSubmitting && !this.props.isSubmitting) { this.textareaRef.current.focus(); } else if (this.props.spoiler !== prevProps.spoiler) { - if (this.props.spoiler) { + const mediaJustAdded = this.props.anyMedia && !prevProps.anyMedia; + + if (this.props.spoiler && !mediaJustAdded) { this.spoilerText.input.focus(); } else if (prevProps.spoiler) { this.textareaRef.current.focus(); diff --git a/app/javascript/mastodon/reducers/compose.js b/app/javascript/mastodon/reducers/compose.js index 3606eea4e66..ce9ef9cbdaa 100644 --- a/app/javascript/mastodon/reducers/compose.js +++ b/app/javascript/mastodon/reducers/compose.js @@ -155,6 +155,10 @@ function appendMedia(state, media, file) { if (prevSize === 0 && (state.get('default_sensitive') || state.get('spoiler'))) { map.set('sensitive', true); + + if (state.get('default_sensitive')) { + map.set('spoiler', true); + } } }); } @@ -400,7 +404,7 @@ export const composeReducer = (state = initialState, action) => { map.set('spoiler', !state.get('spoiler')); map.set('idempotencyKey', uuid()); - if (state.get('media_attachments').size >= 1 && !state.get('default_sensitive')) { + if (state.get('media_attachments').size >= 1) { map.set('sensitive', !state.get('spoiler')); } }); @@ -545,7 +549,7 @@ export const composeReducer = (state = initialState, action) => { map.set('spoiler', true); map.set('spoiler_text', action.status.get('spoiler_text')); } else { - map.set('spoiler', false); + map.set('spoiler', action.status.get('sensitive') && action.status.get('media_attachments').size > 0); map.set('spoiler_text', ''); } @@ -582,7 +586,7 @@ export const composeReducer = (state = initialState, action) => { map.set('spoiler', true); map.set('spoiler_text', action.spoiler_text); } else { - map.set('spoiler', false); + map.set('spoiler', action.status.get('sensitive') && action.status.get('media_attachments').size > 0); map.set('spoiler_text', ''); } From b2996dcbbc5f6bf7350dd01a2bb22a5cb97a800a Mon Sep 17 00:00:00 2001 From: diondiondion Date: Wed, 10 Jun 2026 11:59:03 +0200 Subject: [PATCH 086/130] Fix font size of `Callout` component actions in Safari (#39354) --- app/javascript/mastodon/components/callout/styles.module.css | 1 + 1 file changed, 1 insertion(+) diff --git a/app/javascript/mastodon/components/callout/styles.module.css b/app/javascript/mastodon/components/callout/styles.module.css index dd2c7535257..f049f25e983 100644 --- a/app/javascript/mastodon/components/callout/styles.module.css +++ b/app/javascript/mastodon/components/callout/styles.module.css @@ -62,6 +62,7 @@ background: none; border: none; color: inherit; + font: inherit; font-weight: 500; padding: 0; text-wrap: nowrap; From 9f7e2d0002a65f9b77d32e7a12640dce0ae479ce Mon Sep 17 00:00:00 2001 From: Echo Date: Wed, 10 Jun 2026 12:40:48 +0200 Subject: [PATCH 087/130] Emoji substring search (#39353) --- .../mastodon/actions/importer/emoji.ts | 2 +- .../mastodon/features/emoji/database.test.ts | 4 ++ .../mastodon/features/emoji/database.ts | 39 ++++++++++- .../mastodon/features/emoji/db-schema.ts | 5 +- .../mastodon/features/emoji/emoji_picker.tsx | 2 + .../mastodon/features/emoji/index.ts | 68 ++++++++++--------- .../mastodon/features/emoji/normalize.test.ts | 31 ++++++++- .../mastodon/features/emoji/normalize.ts | 5 ++ .../mastodon/features/emoji/picker.ts | 17 ++++- .../mastodon/features/emoji/types.ts | 10 +++ .../mastodon/features/emoji/utils.ts | 3 + .../mastodon/features/emoji/worker.ts | 25 ++++--- .../mastodon/utils/__tests__/cache.test.ts | 8 ++- app/javascript/mastodon/utils/cache.ts | 4 +- 14 files changed, 169 insertions(+), 54 deletions(-) diff --git a/app/javascript/mastodon/actions/importer/emoji.ts b/app/javascript/mastodon/actions/importer/emoji.ts index e9356ab6215..36fb04b51e1 100644 --- a/app/javascript/mastodon/actions/importer/emoji.ts +++ b/app/javascript/mastodon/actions/importer/emoji.ts @@ -18,7 +18,7 @@ export async function importCustomEmoji(emojis: ApiCustomEmojiJSON[]) { ); // If there's a mismatch, re-import all custom emojis. - if (existingEmojis.length < emojis.length) { + if (existingEmojis.length > 0 && existingEmojis.length < emojis.length) { await clearCache('custom'); await loadCustomEmoji(); diff --git a/app/javascript/mastodon/features/emoji/database.test.ts b/app/javascript/mastodon/features/emoji/database.test.ts index e272ec2dea5..cbbbf9f1650 100644 --- a/app/javascript/mastodon/features/emoji/database.test.ts +++ b/app/javascript/mastodon/features/emoji/database.test.ts @@ -22,6 +22,10 @@ function rawEmojiFactory(data: Partial = {}): CompactEmoji { } describe('emoji database', () => { + beforeEach(async () => { + await testGet(); // Loads the database schema. + }); + afterEach(() => { testClear(); indexedDB = new IDBFactory(); diff --git a/app/javascript/mastodon/features/emoji/database.ts b/app/javascript/mastodon/features/emoji/database.ts index 3dd2f95858a..2ba20029bf4 100644 --- a/app/javascript/mastodon/features/emoji/database.ts +++ b/app/javascript/mastodon/features/emoji/database.ts @@ -143,7 +143,28 @@ export async function search({ return intersection; }) .values(), - ).toSorted((a, b) => a.score - b.score); + ); + + // If there are no results, try a cursor-based custom emoji search instead. + if (results.length === 0) { + const trx = db.transaction('custom', 'readonly'); + const foundEmojis = new Set(); + for await (const cursor of trx.store) { + const emoji = cursor.value; + const score = getScoreForEmoji(emoji, query, false); + if (score === null || foundEmojis.has(emoji.shortcode)) { + continue; + } + + results.push({ ...emoji, score }); + foundEmojis.add(emoji.shortcode); + } + log('cursor search found %d results for "%s"', foundEmojis.size, query); + await trx.done; + } + + // Sort by score, descending. + results.sort((a, b) => a.score - b.score); const time = performance.measure('emoji-search-end', 'emoji-search-start'); log( @@ -159,14 +180,19 @@ export async function search({ return results; } -function getScoreForEmoji(emoji: AnyEmojiData, query: string) { +function getScoreForEmoji( + emoji: AnyEmojiData, + query: string, + checkTokens = true, +) { const id = 'shortcode' in emoji ? emoji.shortcode : emoji.label; if (id === query) { return 0; } let index = 1; - for (const token of [id, ...emoji.tokens]) { + const searchTokens = checkTokens ? [id, ...emoji.tokens] : [id]; + for (const token of searchTokens) { const tokenIndex = token.indexOf(query); if (tokenIndex !== -1) { return index + tokenIndex / token.length; @@ -246,6 +272,13 @@ export async function clearCache(key: CacheKey) { log('Cleared cache for %s', key); } +export async function resetDatabase() { + const db = await loadDB(); + const storeNames = [...db.objectStoreNames]; + await Promise.all(storeNames.map((storeName) => db.clear(storeName))); + log(storeNames, 'Reset emoji database stores:'); +} + export async function loadEmojiByHexcode( hexcode: string, localeString: string, diff --git a/app/javascript/mastodon/features/emoji/db-schema.ts b/app/javascript/mastodon/features/emoji/db-schema.ts index 7f4d09fd0b0..f31ac96f810 100644 --- a/app/javascript/mastodon/features/emoji/db-schema.ts +++ b/app/javascript/mastodon/features/emoji/db-schema.ts @@ -10,6 +10,7 @@ import type { StoreNames, } from 'idb'; +import { resetDatabase } from './database'; import type { CustomEmojiData, CacheKey, UnicodeEmojiData } from './types'; import { emojiLogger } from './utils'; @@ -57,7 +58,7 @@ type Transaction = export type Database = IDBPDatabase; -const SCHEMA_VERSION = 3; +const SCHEMA_VERSION = 4; export async function openEmojiDB() { const db = await openDB('mastodon-emoji', SCHEMA_VERSION, { @@ -98,6 +99,8 @@ export async function openEmojiDB() { }); deleteOldIndexes(shortcodeTable, ['hexcode']); + void resetDatabase(); + log( 'Upgraded emoji database from version %d to %d', oldVersion, diff --git a/app/javascript/mastodon/features/emoji/emoji_picker.tsx b/app/javascript/mastodon/features/emoji/emoji_picker.tsx index 233c451aadd..3661a7193b8 100644 --- a/app/javascript/mastodon/features/emoji/emoji_picker.tsx +++ b/app/javascript/mastodon/features/emoji/emoji_picker.tsx @@ -57,6 +57,8 @@ export const Emoji: FC = ({ const { mode } = useEmojiAppState(); return ( 0) { + log('loaded %d custom emojis', customEmojis.length); + await reloadCustomEmojis(); + } const shortcodes = await importLegacyShortcodes(); if (shortcodes?.length) { log('loaded %d legacy shortcodes', shortcodes.length); } - await loadEmojiLocale(userLocale); -} -async function loadEmojiLocale(localeString: string) { - const locale = toSupportedLocale(localeString); - const { importEmojiData } = await import('./loader'); - - if (worker) { - log('asking worker to load locale %s', locale); - messageWorker(locale); - } else { - const emojis = await importEmojiData(locale); - if (emojis) { - log('loaded %d emojis to locale %s', emojis.length, locale); - } + const emojis = await importEmojiData(userLocale); + if (emojis) { + log('loaded %d emojis to locale %s', emojis.length, userLocale); } } @@ -96,11 +97,16 @@ export async function loadCustomEmoji() { } } -function messageWorker( - locale: LocaleOrCustom | typeof EMOJI_DB_NAME_SHORTCODES, -) { +function messageWorker(data: EmojiWorkerMessage | string) { if (!worker) { return; } - worker.postMessage({ locale }); + if (typeof data === 'string') { + worker.postMessage({ + type: 'load', + storeName: data, + } satisfies EmojiWorkerMessage); + } else { + worker.postMessage(data); + } } diff --git a/app/javascript/mastodon/features/emoji/normalize.test.ts b/app/javascript/mastodon/features/emoji/normalize.test.ts index 8c6346709b8..08587138c67 100644 --- a/app/javascript/mastodon/features/emoji/normalize.test.ts +++ b/app/javascript/mastodon/features/emoji/normalize.test.ts @@ -4,7 +4,7 @@ import { basename, resolve } from 'path'; import { flattenEmojiData } from 'emojibase'; import unicodeRawEmojis from 'emojibase-data/en/data.json'; -import { unicodeToTwemojiHex } from './normalize'; +import { extractTokens, unicodeToTwemojiHex } from './normalize'; const emojiSVGFiles = await readdir( // This assumes tests are run from project root @@ -33,3 +33,32 @@ describe('unicodeToTwemojiHex', () => { expect(svgFileNamesWithoutBorder).toContain(result); }); }); + +describe('extractTokens', () => { + test('returns an empty array for blank input', () => { + expect(extractTokens(' ', null)).toEqual([]); + }); + + test('check token word breaking with Intl.Segmenter', () => { + const segmenter = new Intl.Segmenter('en', { granularity: 'word' }); + + expect( + extractTokens('thumbs_up smiling-face camelCase', segmenter), + ).toEqual(['thumbs', 'up', 'smiling', 'face', 'camel', 'case']); + }); + + test('check token word breaking with regex', () => { + expect(extractTokens('Smile_face joy-test A ok 7 z', null)).toEqual([ + 'smile', + 'face', + 'joy', + 'test', + 'ok', + ]); + }); + + test('ensure +1 and -1 are preserved', () => { + expect(extractTokens('+1', null)).toEqual(['+1']); + expect(extractTokens('-1', null)).toEqual(['-1']); + }); +}); diff --git a/app/javascript/mastodon/features/emoji/normalize.ts b/app/javascript/mastodon/features/emoji/normalize.ts index 257cddfcb65..3583d178eba 100644 --- a/app/javascript/mastodon/features/emoji/normalize.ts +++ b/app/javascript/mastodon/features/emoji/normalize.ts @@ -214,6 +214,11 @@ export function extractTokens( } const tokens: string[] = []; + // Handle the edge case of thumbs up and down emoticons. + if (input === '+1' || input === '-1') { + return [input]; + } + // Prefer to use Intl.Segmenter if available for better locale support. if (segmenter) { for (const { isWordLike, segment } of segmenter.segment( diff --git a/app/javascript/mastodon/features/emoji/picker.ts b/app/javascript/mastodon/features/emoji/picker.ts index fccf6769c37..7acf878f51c 100644 --- a/app/javascript/mastodon/features/emoji/picker.ts +++ b/app/javascript/mastodon/features/emoji/picker.ts @@ -3,6 +3,7 @@ import { useEffect, useState } from 'react'; import type { CategoryName, CustomEmoji } from 'emoji-mart'; import { autoPlayGif } from '@/mastodon/initial_state'; +import { createLimitedCache } from '@/mastodon/utils/cache'; import { emojiLogger } from './utils'; @@ -21,6 +22,8 @@ let customCategories = [ 'flags', ] as CategoryName[]; +const searchCache = createLimitedCache({ maxSize: 10, log }); + export async function fetchCustomEmojiData() { if (customEmojis !== null) { return customEmojis; @@ -89,6 +92,7 @@ export async function reloadCustomEmojis() { await import('@/mastodon/hooks/useCustomEmojis'); await Promise.all([fetchCustomEmojiData(), loadEmojisIntoCache()]); + searchCache.clear(); } // Replicates the old legacy search function. @@ -102,16 +106,25 @@ export async function emojiMartSearch( return []; } + const cacheKey = `${query}|${locale}|${limit}`; + const cachedResult = searchCache.get(cacheKey); + if (cachedResult) { + return cachedResult; + } + const { search } = await import('./database'); const results = await search({ query, locale, limit }); - return results.map((emoji) => + const legacyResults = results.map((emoji) => 'shortcode' in emoji - ? { id: emoji.shortcode, custom: true } + ? ({ id: emoji.shortcode, custom: true } as const) : { id: emoji.label.replaceAll(' ', '_').toLowerCase(), native: emoji.unicode, }, ); + searchCache.set(cacheKey, legacyResults); + + return legacyResults; } export function usePickerEmojis() { diff --git a/app/javascript/mastodon/features/emoji/types.ts b/app/javascript/mastodon/features/emoji/types.ts index 2eb0c0f2327..5c9dc6e5c66 100644 --- a/app/javascript/mastodon/features/emoji/types.ts +++ b/app/javascript/mastodon/features/emoji/types.ts @@ -80,3 +80,13 @@ export type ExtraCustomEmojiMap = Record< string, Pick >; + +export type EmojiWorkerMessage = + | { + type: 'load'; + storeName: string; + } + | { + type: 'debug'; + debugValue: string; + }; diff --git a/app/javascript/mastodon/features/emoji/utils.ts b/app/javascript/mastodon/features/emoji/utils.ts index 670e63a3c30..1722cde08cb 100644 --- a/app/javascript/mastodon/features/emoji/utils.ts +++ b/app/javascript/mastodon/features/emoji/utils.ts @@ -5,6 +5,9 @@ import { emojiRegexPolyfill } from '@/mastodon/polyfills'; import { VARIATION_SELECTOR_CODE } from './constants'; export function emojiLogger(segment: string) { + if (typeof window === 'undefined') { + return debug(`emojis:worker:${segment}`); + } return debug(`emojis:${segment}`); } diff --git a/app/javascript/mastodon/features/emoji/worker.ts b/app/javascript/mastodon/features/emoji/worker.ts index 5602577dbe9..d4f002daf6f 100644 --- a/app/javascript/mastodon/features/emoji/worker.ts +++ b/app/javascript/mastodon/features/emoji/worker.ts @@ -1,31 +1,36 @@ +import debug from 'debug'; + import { EMOJI_DB_NAME_SHORTCODES, EMOJI_TYPE_CUSTOM } from './constants'; import { importCustomEmojiData, importEmojiData, importLegacyShortcodes, } from './loader'; +import type { EmojiWorkerMessage } from './types'; addEventListener('message', handleMessage); self.postMessage('ready'); // After the worker is ready, notify the main thread -function handleMessage(event: MessageEvent<{ locale: string }>) { - const { - data: { locale }, - } = event; - void loadData(locale); +function handleMessage(event: MessageEvent) { + const { data } = event; + if (data.type === 'debug') { + debug.enable(data.debugValue); + } else { + void loadData(data.storeName); + } } -async function loadData(locale: string) { +async function loadData(storeName: string) { let importCount: number | undefined; - if (locale === EMOJI_TYPE_CUSTOM) { + if (storeName === EMOJI_TYPE_CUSTOM) { importCount = (await importCustomEmojiData())?.length; - } else if (locale === EMOJI_DB_NAME_SHORTCODES) { + } else if (storeName === EMOJI_DB_NAME_SHORTCODES) { importCount = (await importLegacyShortcodes())?.length; } else { - importCount = (await importEmojiData(locale))?.length; + importCount = (await importEmojiData(storeName))?.length; } if (importCount) { - self.postMessage(`loaded ${importCount} emojis into ${locale}`); + self.postMessage(`loaded ${importCount} emojis into ${storeName}`); } } diff --git a/app/javascript/mastodon/utils/__tests__/cache.test.ts b/app/javascript/mastodon/utils/__tests__/cache.test.ts index 340a51fdb4b..8d9d9c78ad0 100644 --- a/app/javascript/mastodon/utils/__tests__/cache.test.ts +++ b/app/javascript/mastodon/utils/__tests__/cache.test.ts @@ -40,11 +40,13 @@ describe('createCache', () => { }); test('removes oldest item cached if it exceeds a set size', () => { - const cache = createLimitedCache({ maxSize: 1 }); + const cache = createLimitedCache({ maxSize: 2 }); cache.set('test1', 1); cache.set('test2', 2); + cache.set('test3', 3); expect(cache.get('test1')).toBeUndefined(); expect(cache.get('test2')).toBe(2); + expect(cache.get('test3')).toBe(3); }); test('retrieving a value bumps up last access', () => { @@ -63,13 +65,13 @@ describe('createCache', () => { const cache = createLimitedCache({ maxSize: 1, log }); cache.set('test1', 1); expect(log).toHaveBeenLastCalledWith( - 'Added %s to cache, now size %d', + 'Added %o to cache, now size %d', 'test1', 1, ); cache.set('test2', 1); expect(log).toHaveBeenLastCalledWith( - 'Added %s and deleted %s from cache, now size %d', + 'Added %o and deleted %o from cache, now size %d', 'test2', 'test1', 1, diff --git a/app/javascript/mastodon/utils/cache.ts b/app/javascript/mastodon/utils/cache.ts index 2e3d21bfed4..d00b6fc9e06 100644 --- a/app/javascript/mastodon/utils/cache.ts +++ b/app/javascript/mastodon/utils/cache.ts @@ -43,13 +43,13 @@ export function createLimitedCache({ cacheMap.delete(lastKey); cacheKeys.delete(lastKey); log( - 'Added %s and deleted %s from cache, now size %d', + 'Added %o and deleted %o from cache, now size %d', key, lastKey, cacheMap.size, ); } else { - log('Added %s to cache, now size %d', key, cacheMap.size); + log('Added %o to cache, now size %d', key, cacheMap.size); } }, clear: () => { From bff9f0eb6ddfec989a7f316dc7e9b0a7cc9b5086 Mon Sep 17 00:00:00 2001 From: diondiondion Date: Wed, 10 Jun 2026 14:03:47 +0200 Subject: [PATCH 088/130] Fix uncontained text overflow in column header (#39356) --- app/javascript/mastodon/components/column_header.tsx | 2 +- app/javascript/styles/mastodon/components.scss | 11 ++++++++--- 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/app/javascript/mastodon/components/column_header.tsx b/app/javascript/mastodon/components/column_header.tsx index 36ed239a477..676ae019190 100644 --- a/app/javascript/mastodon/components/column_header.tsx +++ b/app/javascript/mastodon/components/column_header.tsx @@ -272,7 +272,7 @@ export const ColumnHeader: React.FC = ({ {!backButton && hasIcon && ( )} - {title} + {title} ); diff --git a/app/javascript/styles/mastodon/components.scss b/app/javascript/styles/mastodon/components.scss index cb2e6e9eb21..badbcba385e 100644 --- a/app/javascript/styles/mastodon/components.scss +++ b/app/javascript/styles/mastodon/components.scss @@ -4641,6 +4641,7 @@ a.status-card { &__title-wrapper { display: flex; flex-grow: 1; + min-width: 0; } &__title { @@ -4656,9 +4657,7 @@ a.status-card { background: transparent; font: inherit; text-align: start; - text-overflow: ellipsis; - overflow: hidden; - white-space: nowrap; + min-width: 0; &--with-back-button { padding-inline-start: 0; @@ -4673,6 +4672,12 @@ a.status-card { } } + &__text { + text-overflow: ellipsis; + overflow: hidden; + white-space: nowrap; + } + .column-header__back-button { flex: 1; color: var(--color-text-brand); From bcb8553e01270bdb56827a701c4359d39643aa2c Mon Sep 17 00:00:00 2001 From: diondiondion Date: Wed, 10 Jun 2026 14:34:48 +0200 Subject: [PATCH 089/130] [Accessibility] Manage focus on navigation (#39350) --- app/javascript/mastodon/actions/modal.ts | 1 + .../mastodon/components/column_header.tsx | 8 +- .../mastodon/components/modal_root.jsx | 12 +- .../navigation_focus_target/index.tsx | 145 ++++++++++++++++++ app/javascript/mastodon/components/router.tsx | 5 + app/javascript/mastodon/components/status.jsx | 5 +- .../mastodon/containers/mastodon.jsx | 5 +- .../mastodon/features/about/index.jsx | 7 +- .../account_edit/components/field_actions.tsx | 1 + .../mastodon/features/account_edit/index.tsx | 20 ++- .../account_timeline/modals/field_modal.tsx | 15 +- .../closed_registrations_modal/index.jsx | 9 +- .../collections/components/share_modal.tsx | 5 +- .../mastodon/features/collections/index.tsx | 5 +- .../features/interaction_modal/index.tsx | 5 +- .../components/embedded_status.tsx | 3 +- .../mastodon/features/status/index.jsx | 11 +- .../ui/components/__tests__/column-test.jsx | 15 +- .../confirmation_modal.tsx | 9 +- app/javascript/mastodon/features/ui/index.jsx | 2 +- app/javascript/mastodon/reducers/modal.ts | 8 +- .../styles/mastodon/components.scss | 6 + 22 files changed, 265 insertions(+), 37 deletions(-) create mode 100644 app/javascript/mastodon/components/navigation_focus_target/index.tsx diff --git a/app/javascript/mastodon/actions/modal.ts b/app/javascript/mastodon/actions/modal.ts index 49af176a111..0978c326581 100644 --- a/app/javascript/mastodon/actions/modal.ts +++ b/app/javascript/mastodon/actions/modal.ts @@ -10,6 +10,7 @@ interface OpenModalPayload { modalType: ModalType; modalProps: ModalProps; previousModalProps?: ModalProps; + ignoreFocus?: boolean; } export const openModal = createAction('MODAL_OPEN'); diff --git a/app/javascript/mastodon/components/column_header.tsx b/app/javascript/mastodon/components/column_header.tsx index 676ae019190..77cba09fbe7 100644 --- a/app/javascript/mastodon/components/column_header.tsx +++ b/app/javascript/mastodon/components/column_header.tsx @@ -19,6 +19,7 @@ import { useIdentity } from 'mastodon/identity_context'; import { useColumnIndexContext } from '../features/ui/components/columns_area'; import { getColumnSkipLinkId } from '../features/ui/components/skip_links'; +import { NavigationFocusTarget } from './navigation_focus_target'; import { useAppHistory } from './router'; export const messages = defineMessages({ @@ -285,7 +286,10 @@ export const ColumnHeader: React.FC = ({
{backButton} {hasTitle && ( -

+ {onClick ? (

+ )}
diff --git a/app/javascript/mastodon/components/modal_root.jsx b/app/javascript/mastodon/components/modal_root.jsx index 61ff19256f8..c2f51a56731 100644 --- a/app/javascript/mastodon/components/modal_root.jsx +++ b/app/javascript/mastodon/components/modal_root.jsx @@ -7,6 +7,7 @@ import { multiply } from 'color-blend'; import { createBrowserHistory } from 'history'; import { WithOptionalRouterPropTypes, withOptionalRouter } from 'mastodon/utils/react_router'; +import { IGNORE_FOCUS_ON_OPEN } from '../reducers/modal'; class ModalRoot extends PureComponent { @@ -21,7 +22,10 @@ class ModalRoot extends PureComponent { b: PropTypes.number, }), ]), - ignoreFocus: PropTypes.bool, + ignoreFocus: PropTypes.oneOfType([ + PropTypes.bool, + PropTypes.string, // 'on-open', see IGNORE_FOCUS_ON_OPEN + ]), ...WithOptionalRouterPropTypes, }; @@ -118,7 +122,11 @@ class ModalRoot extends PureComponent { _ensureHistoryBuffer () { const { pathname, search, hash, state } = this.history.location; if (!state || state.mastodonModalKey !== this._modalHistoryKey) { - this.history.push({ pathname, search, hash }, { ...state, mastodonModalKey: this._modalHistoryKey }); + this.history.push({ pathname, search, hash }, { + ...state, + focusTarget: this.props.ignoreFocus !== IGNORE_FOCUS_ON_OPEN, + mastodonModalKey: this._modalHistoryKey, + }); } } diff --git a/app/javascript/mastodon/components/navigation_focus_target/index.tsx b/app/javascript/mastodon/components/navigation_focus_target/index.tsx new file mode 100644 index 00000000000..f4b42926a81 --- /dev/null +++ b/app/javascript/mastodon/components/navigation_focus_target/index.tsx @@ -0,0 +1,145 @@ +import { + createContext, + useContext, + useRef, + useLayoutEffect, + useCallback, +} from 'react'; + +import { useLocation } from 'react-router-dom'; + +import { polymorphicForwardRef } from '@/types/polymorphic'; + +import type { MastodonLocation } from '../router'; + +export const FOCUS_TARGET = { + POST: 'detailed-status', +} as const; + +export type FocusTarget = + | boolean + | (typeof FOCUS_TARGET)[keyof typeof FOCUS_TARGET]; + +const FocusTargetContext = + createContext | null>(null); + +/** + * `FocusTargetProvider` keeps track of whether focus should be + * set after a navigation. By default, any navigation will set the + * current value of `focusTargetRef` to `true`, which will cause + * the `NavigationFocusTarget` component to focus itself when it mounts. + * + * To disable this behaviour for a navigation, the focus target can be + * set to `false` using location state, for example: + * ``` + * location.push(url, { focusTarget: false }); + * ``` + * + * If the target page contains multiple `NavigationFocusTarget` components + * (e.g. a main heading and a post that should be focused), give the more + * specific `NavigationFocusTarget` instance a name, and pass the same name + * via location state: + * ``` + * location.push(url, { focusTarget: 'detailed-status' }); + * ``` + */ + +export const FocusTargetProvider: React.FC<{ + children: React.ReactNode; +}> = ({ children }) => { + const focusTargetRef = useRef(false); + const previousLocationRef = useRef< + | (Pick & { + focusTarget?: FocusTarget; + }) + | null + >(null); + + const { + pathname, + search, + state = {}, + } = useLocation<{ focusTarget?: FocusTarget } | undefined>(); + + const { focusTarget } = state; + + useLayoutEffect(() => { + // We never want to set focus on page load, so we keep + // track of whether a manual navigation has occurred by comparing + // our current with the previous location: + const previous = previousLocationRef.current; + + // Bail out on the first render, populate previousLocationRef + if (previous === null) { + previousLocationRef.current = { pathname, search, focusTarget }; + return; + } + + // Bail out if location hasn't changed + if ( + previous.pathname === pathname && + previous.search === search && + previous.focusTarget === focusTarget + ) { + return; + } + + // Location has changed: + // - Set focusTarget + // – Store current location as previous + // (We store `focusTarget` as `false` to allow overriding it.) + previousLocationRef.current = { pathname, search, focusTarget: false }; + focusTargetRef.current = focusTarget ?? true; + }, [pathname, search, focusTarget]); + + return ( + + {children} + + ); +}; + +export function useFocusOnNavigation(targetName?: string) { + const focusTargetRef = useContext(FocusTargetContext); + + if (focusTargetRef === null) { + throw Error( + 'useFocusTargetContext must be used inside of a FocusTargetProvider', + ); + } + + return useCallback( + (element: HTMLElement | null) => { + const focusTarget = focusTargetRef.current; + + // Bail out if focusTarget was set to `false` + if (!element || !focusTarget) { + return; + } + + if (focusTarget === true || focusTarget === targetName) { + setTimeout(() => { + element.focus({ preventScroll: true }); + }, 0); + } + }, + [focusTargetRef, targetName], + ); +} + +interface FocusTargetElementProps extends React.ComponentPropsWithoutRef<'h1'> { + focusTargetName?: string; +} + +export const NavigationFocusTarget = polymorphicForwardRef< + 'h1', + FocusTargetElementProps +>(({ as: Component = 'h1', focusTargetName, children, ...otherProps }) => { + const focusOnNavigation = useFocusOnNavigation(focusTargetName); + + return ( + + {children} + + ); +}); diff --git a/app/javascript/mastodon/components/router.tsx b/app/javascript/mastodon/components/router.tsx index bd6e4b568f0..2a53d6dff43 100644 --- a/app/javascript/mastodon/components/router.tsx +++ b/app/javascript/mastodon/components/router.tsx @@ -14,9 +14,14 @@ import { createBrowserHistory } from 'history'; import { layoutFromWindow } from 'mastodon/is_mobile'; import { isDevelopment } from 'mastodon/utils/environment'; +import type { FocusTarget } from './navigation_focus_target'; + interface MastodonLocationState { fromMastodon?: boolean; mastodonModalKey?: string; + // Controls which element is focused after a navigation. + // Set to `false` to prevent navigation focus. + focusTarget?: FocusTarget; // Prevent the rightmost column in advanced UI from scrolling // into view on location changes preventMultiColumnAutoScroll?: string; diff --git a/app/javascript/mastodon/components/status.jsx b/app/javascript/mastodon/components/status.jsx index 808f4d73bfc..2f66f154059 100644 --- a/app/javascript/mastodon/components/status.jsx +++ b/app/javascript/mastodon/components/status.jsx @@ -33,6 +33,7 @@ import StatusContent from './status_content'; import { StatusThreadLabel } from './status_thread_label'; import { CollectionPreviewCard } from '../features/collections/components/collection_preview_card'; import { compareUrls } from '../utils/compare_urls'; +import { FOCUS_TARGET } from './navigation_focus_target'; const domParser = new DOMParser(); @@ -311,9 +312,9 @@ class Status extends ImmutablePureComponent { window.open(path, '_blank', 'noopener'); } else { if (history.location.pathname.replace('/deck/', '/') === path) { - history.replace(path); + history.replace(path, {focusTarget: FOCUS_TARGET.POST}); } else { - history.push(path); + history.push(path, {focusTarget: FOCUS_TARGET.POST}); } } }; diff --git a/app/javascript/mastodon/containers/mastodon.jsx b/app/javascript/mastodon/containers/mastodon.jsx index d6df09db49e..4f87a1b823c 100644 --- a/app/javascript/mastodon/containers/mastodon.jsx +++ b/app/javascript/mastodon/containers/mastodon.jsx @@ -8,6 +8,7 @@ import { Provider as ReduxProvider } from 'react-redux'; import { hydrateStore } from 'mastodon/actions/store'; import { connectUserStream } from 'mastodon/actions/streaming'; import ErrorBoundary from 'mastodon/components/error_boundary'; +import { FocusTargetProvider } from '@/mastodon/components/navigation_focus_target'; import { Router } from 'mastodon/components/router'; import UI from 'mastodon/features/ui'; import { IdentityContext, createIdentityContext } from 'mastodon/identity_context'; @@ -49,7 +50,9 @@ export default class Mastodon extends PureComponent { - + + + diff --git a/app/javascript/mastodon/features/about/index.jsx b/app/javascript/mastodon/features/about/index.jsx index 83f5bf60258..d60ef9e6107 100644 --- a/app/javascript/mastodon/features/about/index.jsx +++ b/app/javascript/mastodon/features/about/index.jsx @@ -8,10 +8,13 @@ import { Helmet } from '@unhead/react/helmet'; import ImmutablePropTypes from 'react-immutable-proptypes'; import { connect } from 'react-redux'; +import { domain } from 'mastodon/initial_state'; + import { injectIntl } from '@/mastodon/components/intl'; import { fetchServer, fetchExtendedDescription, fetchDomainBlocks } from 'mastodon/actions/server'; import { Account } from 'mastodon/components/account'; import Column from 'mastodon/components/column'; +import { NavigationFocusTarget } from 'mastodon/components/navigation_focus_target'; import { ServerHeroImage } from 'mastodon/components/server_hero_image'; import { Skeleton } from 'mastodon/components/skeleton'; import { LinkFooter} from 'mastodon/features/ui/components/link_footer'; @@ -91,7 +94,9 @@ class About extends PureComponent { srcSet={Object.keys(server.item?.thumbnail.versions ?? {}).map((key) => `${server.item?.thumbnail.versions && server.item.thumbnail.versions[key]} ${key.replace('@', '')}`).join(', ')} className='about__header__hero' /> -

{isLoading ? : server.domain}

+ + {isLoading ? : domain} +

Mastodon }} />

diff --git a/app/javascript/mastodon/features/account_edit/components/field_actions.tsx b/app/javascript/mastodon/features/account_edit/components/field_actions.tsx index fecdcb8effc..028f4dc8036 100644 --- a/app/javascript/mastodon/features/account_edit/components/field_actions.tsx +++ b/app/javascript/mastodon/features/account_edit/components/field_actions.tsx @@ -26,6 +26,7 @@ export const AccountFieldActions: FC<{ id: string }> = ({ id }) => { openModal({ modalType: 'ACCOUNT_EDIT_FIELD_EDIT', modalProps: { fieldKey: id }, + ignoreFocus: true, }), ); }, [dispatch, id]); diff --git a/app/javascript/mastodon/features/account_edit/index.tsx b/app/javascript/mastodon/features/account_edit/index.tsx index d00473043e1..6ef8997f7be 100644 --- a/app/javascript/mastodon/features/account_edit/index.tsx +++ b/app/javascript/mastodon/features/account_edit/index.tsx @@ -137,16 +137,28 @@ export const AccountEdit: FC = () => { ); const handleOpenModal = useCallback( - (type: ModalType, props?: Record) => { - dispatch(openModal({ modalType: type, modalProps: props ?? {} })); + ( + type: ModalType, + { + modalProps = {}, + ignoreFocus = false, + }: { modalProps?: Record; ignoreFocus?: boolean } = {}, + ) => { + dispatch( + openModal({ + modalType: type, + modalProps, + ignoreFocus, + }), + ); }, [dispatch], ); const handleNameEdit = useCallback(() => { - handleOpenModal('ACCOUNT_EDIT_NAME'); + handleOpenModal('ACCOUNT_EDIT_NAME', { ignoreFocus: true }); }, [handleOpenModal]); const handleBioEdit = useCallback(() => { - handleOpenModal('ACCOUNT_EDIT_BIO'); + handleOpenModal('ACCOUNT_EDIT_BIO', { ignoreFocus: true }); }, [handleOpenModal]); const handleCustomFieldAdd = useCallback(() => { handleOpenModal('ACCOUNT_EDIT_FIELD_EDIT'); diff --git a/app/javascript/mastodon/features/account_timeline/modals/field_modal.tsx b/app/javascript/mastodon/features/account_timeline/modals/field_modal.tsx index baf0c70f762..abb0a28ee33 100644 --- a/app/javascript/mastodon/features/account_timeline/modals/field_modal.tsx +++ b/app/javascript/mastodon/features/account_timeline/modals/field_modal.tsx @@ -10,6 +10,7 @@ import { ModalShellActions, ModalShellBody, } from '@/mastodon/components/modal_shell'; +import { NavigationFocusTarget } from '@/mastodon/components/navigation_focus_target'; import { useFieldHtml } from '../hooks/useFieldHtml'; @@ -24,12 +25,14 @@ export const AccountFieldModal: FC<{ return ( - + + + ({ message: state.getIn(['server', 'server', 'item', 'registrations', 'message']), @@ -42,7 +43,9 @@ class ClosedRegistrationsModal extends ImmutablePureComponent { return (
-

+ + +

-

+

{closedRegistrationsMessage}
-

+

-

+ {isNew ? ( )} -

+
-

{pageTitleHtml}

+ + {pageTitleHtml} + {intl.formatMessage(createdByTabMessage, { diff --git a/app/javascript/mastodon/features/interaction_modal/index.tsx b/app/javascript/mastodon/features/interaction_modal/index.tsx index ef1d3e1111b..128fb3ff5e1 100644 --- a/app/javascript/mastodon/features/interaction_modal/index.tsx +++ b/app/javascript/mastodon/features/interaction_modal/index.tsx @@ -8,6 +8,7 @@ import { escapeRegExp } from 'lodash'; import { useDebouncedCallback } from 'use-debounce'; import { DisplayName } from '@/mastodon/components/display_name'; +import { NavigationFocusTarget } from '@/mastodon/components/navigation_focus_target'; import { openModal, closeModal } from 'mastodon/actions/modal'; import { apiRequest } from 'mastodon/api'; import { Button } from 'mastodon/components/button'; @@ -474,12 +475,12 @@ const InteractionModal: React.FC<{ return (
-

+ -

+

{intent === 'follow' ? ( = ({ const path = `/@${account.acct}/${statusId}`; if (button === 0 && !(ctrlKey || metaKey)) { - history.push(path); + history.push(path, { focusTarget: FOCUS_TARGET.POST }); } else if (button === 1 || (button === 0 && (ctrlKey || metaKey))) { window.open(path, '_blank', 'noopener'); } diff --git a/app/javascript/mastodon/features/status/index.jsx b/app/javascript/mastodon/features/status/index.jsx index db18964a3b9..69a62a36635 100644 --- a/app/javascript/mastodon/features/status/index.jsx +++ b/app/javascript/mastodon/features/status/index.jsx @@ -72,6 +72,7 @@ import ActionBar from './components/action_bar'; import { DetailedStatus } from './components/detailed_status'; import { RefreshController } from './components/refresh_controller'; import { quoteComposeById } from '@/mastodon/actions/compose_typed'; +import { FOCUS_TARGET, NavigationFocusTarget } from '@/mastodon/components/navigation_focus_target'; const messages = defineMessages({ revealAll: { id: 'status.show_more_all', defaultMessage: 'Show more for all' }, @@ -585,7 +586,13 @@ class Status extends ImmutablePureComponent { {ancestors} -

+ -
+ {descendants} diff --git a/app/javascript/mastodon/features/ui/components/__tests__/column-test.jsx b/app/javascript/mastodon/features/ui/components/__tests__/column-test.jsx index d4e248f4436..1a63c756124 100644 --- a/app/javascript/mastodon/features/ui/components/__tests__/column-test.jsx +++ b/app/javascript/mastodon/features/ui/components/__tests__/column-test.jsx @@ -1,6 +1,7 @@ import { render, fireEvent, screen } from '@/testing/rendering'; import Column from '../column'; +import { FocusTargetProvider } from '@/mastodon/components/navigation_focus_target'; const fakeIcon = () => ; @@ -9,9 +10,11 @@ describe('', () => { it('runs the scroll animation if the column contains scrollable content', () => { const scrollToMock = vi.fn(); const { container } = render( - -
- , + + +
+ + , ); container.querySelector('.scrollable').scrollTo = scrollToMock; fireEvent.click(screen.getByText('notifications')); @@ -19,7 +22,11 @@ describe('', () => { }); it('does not try to scroll if there is no scrollable content', () => { - render(); + render( + + + + ); fireEvent.click(screen.getByText('notifications')); }); }); diff --git a/app/javascript/mastodon/features/ui/components/confirmation_modals/confirmation_modal.tsx b/app/javascript/mastodon/features/ui/components/confirmation_modals/confirmation_modal.tsx index 1dbc19ea3bf..3dfd3124d11 100644 --- a/app/javascript/mastodon/features/ui/components/confirmation_modals/confirmation_modal.tsx +++ b/app/javascript/mastodon/features/ui/components/confirmation_modals/confirmation_modal.tsx @@ -2,6 +2,7 @@ import { useCallback } from 'react'; import { FormattedMessage } from 'react-intl'; +import { NavigationFocusTarget } from '@/mastodon/components/navigation_focus_target'; import { Button } from 'mastodon/components/button'; import { ModalShell, @@ -67,7 +68,13 @@ export const ConfirmationModal: React.FC< return ( -

{title}

+ {noFocusButton ? ( + + {title} + + ) : ( +

{title}

+ )} {message &&

{message}

} {extraContent ?? children} diff --git a/app/javascript/mastodon/features/ui/index.jsx b/app/javascript/mastodon/features/ui/index.jsx index 73ff427e6f6..06692d54ee8 100644 --- a/app/javascript/mastodon/features/ui/index.jsx +++ b/app/javascript/mastodon/features/ui/index.jsx @@ -187,7 +187,7 @@ class SwitchingColumnsArea extends PureComponent { - + {singleColumn ? : null} {singleColumn && pathName.startsWith('/deck/') ? : null} diff --git a/app/javascript/mastodon/reducers/modal.ts b/app/javascript/mastodon/reducers/modal.ts index dfdff7cf037..a8d771f4bf5 100644 --- a/app/javascript/mastodon/reducers/modal.ts +++ b/app/javascript/mastodon/reducers/modal.ts @@ -17,8 +17,10 @@ const Modal = ImmutableRecord({ modalProps: ImmutableRecord({})(), }); +export const IGNORE_FOCUS_ON_OPEN = 'on-open'; + interface ModalState { - ignoreFocus: boolean; + ignoreFocus: boolean | typeof IGNORE_FOCUS_ON_OPEN; stack: Stack>; } @@ -53,9 +55,10 @@ const pushModal = ( modalType: ModalType, modalProps: ModalProps, previousModalProps?: ModalProps, + ignoreFocusOnOpen = false, ): State => { return state.withMutations((record) => { - record.set('ignoreFocus', false); + record.set('ignoreFocus', ignoreFocusOnOpen ? IGNORE_FOCUS_ON_OPEN : false); record.update('stack', (stack) => { let tmp = stack; @@ -92,6 +95,7 @@ export const modalReducer: Reducer = (state = initialState, action) => { action.payload.modalType, action.payload.modalProps, action.payload.previousModalProps, + action.payload.ignoreFocus, ); else if (closeModal.match(action)) return popModal(state, action.payload); // TODO: type those actions diff --git a/app/javascript/styles/mastodon/components.scss b/app/javascript/styles/mastodon/components.scss index badbcba385e..f228fcf0df3 100644 --- a/app/javascript/styles/mastodon/components.scss +++ b/app/javascript/styles/mastodon/components.scss @@ -9146,6 +9146,8 @@ noscript { padding-bottom: 32px; } + h1, + h2, h3 { font-size: 22px; line-height: 33px; @@ -9176,6 +9178,8 @@ noscript { &__lead { margin-bottom: 20px; + h1, + h2, h3 { margin-bottom: 15px; } @@ -9251,6 +9255,8 @@ noscript { flex: 1; box-sizing: border-box; + h1, + h2, h3 { margin-bottom: 20px; } From 70bb70c2e62ce672e50ce6db823a6f75c0137027 Mon Sep 17 00:00:00 2001 From: David Roetzel Date: Wed, 10 Jun 2026 15:28:52 +0200 Subject: [PATCH 090/130] Add meta tags to Collection HTML (#39357) --- app/controllers/collections_controller.rb | 1 - app/views/collections/show.html.haml | 20 +++++++++++++++++++ spec/rails_helper.rb | 1 + spec/requests/account_show_page_spec.rb | 14 ------------- spec/requests/collections_spec.rb | 12 ++++++++++-- spec/requests/status_show_page_spec.rb | 21 -------------------- spec/support/html_head_inspection.rb | 24 +++++++++++++++++++++++ 7 files changed, 55 insertions(+), 38 deletions(-) create mode 100644 app/views/collections/show.html.haml create mode 100644 spec/support/html_head_inspection.rb diff --git a/app/controllers/collections_controller.rb b/app/controllers/collections_controller.rb index 628418557c7..fe737810d5f 100644 --- a/app/controllers/collections_controller.rb +++ b/app/controllers/collections_controller.rb @@ -18,7 +18,6 @@ class CollectionsController < ApplicationController respond_to do |format| format.html do expires_in expiration_duration, public: true unless user_signed_in? - render template: 'home/index' end format.json do diff --git a/app/views/collections/show.html.haml b/app/views/collections/show.html.haml new file mode 100644 index 00000000000..176d4223963 --- /dev/null +++ b/app/views/collections/show.html.haml @@ -0,0 +1,20 @@ +- content_for :page_title, @collection.name + +- content_for :header_tags do + %meta{ name: 'robots', content: 'noindex, noarchive' }/ + + %link{ rel: 'alternate', type: 'application/activity+json', href: ap_account_collection_url(@collection.account_id, @collection) }/ + %link{ rel: 'alternate', type: 'application/ld+json; profile="https://www.w3.org/ns/activitystreams"', href: ap_account_collection_url(@collection.account_id, @collection) }/ + + - unless @collection.sensitive? + %meta{ name: 'description', content: @collection.description }/ + = opengraph 'og:description', @collection.description + = opengraph 'og:site_name', site_title + = opengraph 'og:type', 'website' + = opengraph 'og:title', @collection.name + = opengraph 'og:url', collection_url(@collection) + - if @collection.language.present? + = opengraph 'og:locale', @collection.language + = opengraph 'twitter:card', 'summary' + += render 'shared/web_app' diff --git a/spec/rails_helper.rb b/spec/rails_helper.rb index 55ad344b80a..21b56c27cd9 100644 --- a/spec/rails_helper.rb +++ b/spec/rails_helper.rb @@ -92,6 +92,7 @@ RSpec.configure do |config| config.include CommandLineHelpers, type: :cli config.include SystemHelpers, type: :system config.include Shoulda::Matchers::ActiveModel, type: :validator + config.include HtmlHeadInspection, type: :request # TODO: Remove when Devise fixes https://github.com/heartcombo/devise/issues/5705 config.before do diff --git a/spec/requests/account_show_page_spec.rb b/spec/requests/account_show_page_spec.rb index 7f3ea2595f8..e45c97801d3 100644 --- a/spec/requests/account_show_page_spec.rb +++ b/spec/requests/account_show_page_spec.rb @@ -16,18 +16,4 @@ RSpec.describe 'The account show page' do expect(head_meta_content('og:image')).to match '.+' expect(head_meta_content('og:url')).to eq short_account_url(username: alice.username) end - - def head_link_icons - response - .parsed_body - .search('html head link[rel=icon]') - end - - def head_meta_content(property) - response - .parsed_body - .search("html head meta[property='#{property}']") - .attr('content') - .text - end end diff --git a/spec/requests/collections_spec.rb b/spec/requests/collections_spec.rb index dbdf1c16a28..72622b5cab7 100644 --- a/spec/requests/collections_spec.rb +++ b/spec/requests/collections_spec.rb @@ -6,12 +6,20 @@ RSpec.describe 'Collections' do describe 'GET /collections/:id' do subject { get collection_path(collection) } - let(:collection) { Fabricate(:collection) } + let(:collection) do + Fabricate(:collection, name: 'Frequent posters', description: 'Amazing people that can quickly fill your timeline', language: 'en') + end - it 'returns success' do + it 'returns success and includes opengraph meta tags' do subject expect(response).to have_http_status(200) + + expect(head_meta_content('og:title')).to eq 'Frequent posters' + expect(head_meta_content('og:description')).to eq 'Amazing people that can quickly fill your timeline' + expect(head_meta_content('og:type')).to eq 'website' + expect(head_meta_content('og:url')).to eq collection_url(collection) + expect(head_meta_content('og:locale')).to eq 'en' end end diff --git a/spec/requests/status_show_page_spec.rb b/spec/requests/status_show_page_spec.rb index ac542e841dc..03f8f5a42eb 100644 --- a/spec/requests/status_show_page_spec.rb +++ b/spec/requests/status_show_page_spec.rb @@ -41,26 +41,5 @@ RSpec.describe 'Statuses' do expect(head_meta_content('og:locale')).to eq 'ca' expect(head_meta_content('og:description')).to eq status_text end - - def head_link_icons - response - .parsed_body - .search('html head link[rel=icon]') - end - - def head_meta_content(property) - response - .parsed_body - .search("html head meta[property='#{property}']") - .attr('content') - .text - end - - def head_meta_exists(property) - !response - .parsed_body - .search("html head meta[property='#{property}']") - .empty? - end end end diff --git a/spec/support/html_head_inspection.rb b/spec/support/html_head_inspection.rb new file mode 100644 index 00000000000..677bffe9072 --- /dev/null +++ b/spec/support/html_head_inspection.rb @@ -0,0 +1,24 @@ +# frozen_string_literal: true + +module HtmlHeadInspection + def head_link_icons + response + .parsed_body + .search('html head link[rel=icon]') + end + + def head_meta_content(property) + response + .parsed_body + .search("html head meta[property='#{property}']") + .attr('content') + .text + end + + def head_meta_exists(property) + !response + .parsed_body + .search("html head meta[property='#{property}']") + .empty? + end +end From c6e2e2255c54770076220d63ccd921ba23bb7987 Mon Sep 17 00:00:00 2001 From: Shlee Date: Wed, 10 Jun 2026 23:10:59 +0930 Subject: [PATCH 091/130] Fix missing boolean check in Admin Reports API (#39197) Co-authored-by: Claire --- app/models/report_filter.rb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/models/report_filter.rb b/app/models/report_filter.rb index dab45007bc9..f12aff6f3d8 100644 --- a/app/models/report_filter.rb +++ b/app/models/report_filter.rb @@ -39,8 +39,8 @@ class ReportFilter end def status_scope - resolved = params.key?(:resolved) - unresolved = params.key?(:unresolved) + resolved = ActiveModel::Type::Boolean.new.cast(params[:resolved]) + unresolved = ActiveModel::Type::Boolean.new.cast(params[:unresolved]) return Report.all if resolved && unresolved return Report.resolved if resolved From 2994e8543deec8fb3c4228afd7c556a37904662f Mon Sep 17 00:00:00 2001 From: diondiondion Date: Wed, 10 Jun 2026 16:50:49 +0200 Subject: [PATCH 092/130] [Accessibility] Navigation focus handling polish (#39358) --- app/javascript/mastodon/actions/compose.js | 7 +++++-- .../mastodon/components/account_header/name.tsx | 5 +++-- .../alt_text_modal/__tests__/index-test.tsx | 12 +++++++++--- .../mastodon/features/alt_text_modal/index.tsx | 8 ++++++-- .../mastodon/features/annual_report/index.tsx | 5 ++++- .../mastodon/features/collection_adder/index.tsx | 9 +++++++-- .../mastodon/features/custom_homepage/index.tsx | 5 ++++- .../features/filters/added_to_filter.jsx | 5 ++++- .../mastodon/features/filters/select_filter.jsx | 5 ++++- .../mastodon/features/list_adder/index.tsx | 5 +++-- .../mastodon/features/privacy_policy/index.tsx | 7 +++++-- .../mastodon/features/report/category.jsx | 7 ++++--- .../mastodon/features/report/comment.tsx | 9 +++++++-- .../mastodon/features/report/rules.jsx | 5 ++++- .../mastodon/features/report/statuses.jsx | 5 ++++- .../mastodon/features/report/thanks.jsx | 5 ++++- .../mastodon/features/terms_of_service/index.tsx | 7 +++++-- .../features/ui/components/block_modal.jsx | 5 ++++- .../features/ui/components/boost_modal.tsx | 5 +++-- .../features/ui/components/dialog_modal.tsx | 5 ++++- .../ui/components/domain_block_modal.tsx | 5 +++-- .../features/ui/components/embed_modal.tsx | 5 +++-- .../ui/components/ignore_notifications_modal.jsx | 3 ++- .../features/ui/components/mute_modal.jsx | 5 ++++- .../ui/components/report_collection_modal.tsx | 5 +++-- .../features/ui/components/visibility_modal.tsx | 16 +++++++++------- app/javascript/styles/mastodon/components.scss | 2 ++ 27 files changed, 119 insertions(+), 48 deletions(-) diff --git a/app/javascript/mastodon/actions/compose.js b/app/javascript/mastodon/actions/compose.js index b4be55cbfea..abc86a33943 100644 --- a/app/javascript/mastodon/actions/compose.js +++ b/app/javascript/mastodon/actions/compose.js @@ -93,7 +93,7 @@ const messages = defineMessages({ export const ensureComposeIsVisible = (getState) => { if (!getState().getIn(['compose', 'mounted'])) { - browserHistory.push('/publish'); + browserHistory.push('/publish', { focusTarget: false }); } }; @@ -292,7 +292,10 @@ export function submitCompose(successCallback) { message: statusId === null ? messages.published : messages.saved, action: messages.open, dismissAfter: 10000, - onClick: () => browserHistory.push(`/@${response.data.account.username}/${response.data.id}`), + onClick: () => browserHistory.push( + `/@${response.data.account.username}/${response.data.id}`, + { focusTarget: 'detailed-status' } + ), })); }).catch(function (error) { dispatch(submitComposeFail(error)); diff --git a/app/javascript/mastodon/components/account_header/name.tsx b/app/javascript/mastodon/components/account_header/name.tsx index b46e849765f..5bd2ed80dbe 100644 --- a/app/javascript/mastodon/components/account_header/name.tsx +++ b/app/javascript/mastodon/components/account_header/name.tsx @@ -19,6 +19,7 @@ import { FollowsYouBadge } from '../badge'; import { CopyButton } from '../copy_button'; import { DisplayName } from '../display_name'; import { Icon } from '../icon'; +import { NavigationFocusTarget } from '../navigation_focus_target'; import { AccountBadges } from './badges'; import classes from './styles.module.scss'; @@ -56,9 +57,9 @@ export const AccountName: FC<{ accountId: string }> = ({ accountId }) => { return (
-

+ -

+ {relationship?.followed_by && }
diff --git a/app/javascript/mastodon/features/alt_text_modal/__tests__/index-test.tsx b/app/javascript/mastodon/features/alt_text_modal/__tests__/index-test.tsx index 709e0ff6c29..bf1189d44a9 100644 --- a/app/javascript/mastodon/features/alt_text_modal/__tests__/index-test.tsx +++ b/app/javascript/mastodon/features/alt_text_modal/__tests__/index-test.tsx @@ -7,6 +7,8 @@ import { List, Map } from 'immutable'; import { render } from '@testing-library/react'; import { vi } from 'vitest'; +import { FocusTargetProvider } from '@/mastodon/components/navigation_focus_target'; +import { Router } from '@/mastodon/components/router'; import type { RootState } from 'mastodon/store'; import { useAppSelector } from 'mastodon/store'; @@ -27,9 +29,13 @@ describe('', () => { const renderComponent = () => { return render( - - - , + + + + + + + , ); }; diff --git a/app/javascript/mastodon/features/alt_text_modal/index.tsx b/app/javascript/mastodon/features/alt_text_modal/index.tsx index fafd4609477..3be514e1a4f 100644 --- a/app/javascript/mastodon/features/alt_text_modal/index.tsx +++ b/app/javascript/mastodon/features/alt_text_modal/index.tsx @@ -22,6 +22,7 @@ import { changeUploadCompose } from 'mastodon/actions/compose_typed'; import { Button } from 'mastodon/components/button'; import { GIFV } from 'mastodon/components/gifv'; import { LoadingIndicator } from 'mastodon/components/loading_indicator'; +import { NavigationFocusTarget } from 'mastodon/components/navigation_focus_target'; import { Skeleton } from 'mastodon/components/skeleton'; import { Audio } from 'mastodon/features/audio'; import { CharacterCounter } from 'mastodon/features/compose/components/character_counter'; @@ -412,12 +413,15 @@ export const AltTextModal = forwardRef>( )} - + - +