Compare commits

...

274 Commits

Author SHA1 Message Date
Claire
eeadda0e71 Merge pull request #3310 from ClearlyClaire/glitch-soc/merge-4.3
Merge upstream changes up to 770cf42085 into stable-4.3
2025-12-08 17:31:12 +01:00
Echo
96a5d173f1 [Glitch] Fixes YouTube embeds
Port 9bc9ebc59e to glitch-soc

Signed-off-by: Claire <claire.github-309c@sitedethib.com>
2025-12-08 17:07:01 +01:00
Bruno Viveiros
5057735a54 [Glitch] fix: YouTube iframe being able to start at a defined time
Port bdff970a5e to glitch-soc

Signed-off-by: Claire <claire.github-309c@sitedethib.com>
2025-12-08 17:03:04 +01:00
Claire
27b74ba7b8 Merge commit '770cf420854b03c1994ed21baa32a05b75ed34b4' into glitch-soc/merge-4.3 2025-12-08 17:01:25 +01:00
Claire
770cf42085 Bump version to v4.3.16 (#37163) 2025-12-08 16:20:21 +01:00
Claire
ef1af11956 Merge commit from fork 2025-12-08 15:44:08 +01:00
Echo
140e011e73 Fixes YouTube embeds (#37126) 2025-12-05 11:15:00 +01:00
Bruno Viveiros
43f8760c95 fix: YouTube iframe being able to start at a defined time (#26584) 2025-12-05 11:15:00 +01:00
Claire
473c112dae Increase HTTP read timeout for expensive S3 batch delete operation (#37004) 2025-12-05 11:15:00 +01:00
Matt Jankowski
821e735524 Suggest ES image version 7.17.29 in docker compose (#36972) 2025-12-05 11:15:00 +01:00
Claire
167c46adce Merge pull request #3293 from ClearlyClaire/glitch-soc/merge-4.3
Merge upstream changes up to 3260d25a8e into stable-4.3
2025-11-20 15:25:26 +01:00
Claire
7040d14476 Merge commit '3260d25a8e77635aa7ab874c9ca9acf51dfb36fb' into glitch-soc/merge-4.3 2025-11-20 15:01:17 +01:00
Claire
3260d25a8e Bump version to v4.3.15 (#36947) 2025-11-20 14:41:15 +01:00
Claire
b635c419fc Update dependency glob (#36943) 2025-11-19 16:29:53 +01:00
Shugo Maeda
d2f1767b81 Fix ArgumentError of tootctl upgrade storage-schema (#36914) 2025-11-19 15:20:08 +01:00
Claire
9636fc22cc Fix Update importing old previously-unknown activities and treating them as recent ones (#36848) 2025-11-19 15:20:08 +01:00
Claire
3924b33914 Update security policy for 4.3 (#36756) 2025-11-06 14:58:16 +01:00
Claire
99efed9aee Merge pull request #3233 from ClearlyClaire/glitch-soc/merge-4.3
Merge upstream changes up to 6dee9a12d2 into stable-4.3
2025-10-13 16:15:00 +02:00
Claire
f97834019a Merge commit '6dee9a12d2c2c3671ad9f4bc035f050a7c9549c5' into glitch-soc/merge-4.3 2025-10-13 15:58:48 +02:00
Claire
6dee9a12d2 Bump version to v4.3.14 (#36445) 2025-10-13 15:49:51 +02:00
Claire
81ed241061 Fix streaming still being authorized for suspended accounts (#36450) 2025-10-13 15:49:30 +02:00
Emelia Smith
aa1d3825cd Merge commit from fork 2025-10-13 14:20:57 +02:00
Claire
032aa9eb68 Merge commit from fork
* Ensure tootctl revokes sessions, access tokens and web push subscriptions

* Fix test coverage

---------

Co-authored-by: Emelia Smith <ThisIsMissEm@users.noreply.github.com>
2025-10-13 14:20:23 +02:00
Claire
50b586ef02 Merge commit from fork
* Streaming: Ensure disabled users cannot connect to streaming

* Streaming: Disconnect when the user is disabled

---------

Co-authored-by: Emelia Smith <ThisIsMissEm@users.noreply.github.com>
2025-10-13 14:19:14 +02:00
Claire
233f7570b3 Update dependency openssl 2025-10-13 11:03:46 +02:00
Claire
51b1a49834 Update dependency rack 2025-10-13 11:03:46 +02:00
Claire
90955d4ca5 Merge pull request #3229 from ClearlyClaire/glitch-soc/merge-4.3
Merge upstream changes up to 5983f8292b into stable-4.3
2025-10-10 20:27:30 +02:00
Claire
5ef8a632bf Merge commit '5983f8292b0e61f3878718a81ae708bf99462892' into glitch-soc/merge-4.3 2025-10-10 19:20:48 +02:00
github-actions[bot]
6d55436687 New Crowdin Translations for stable-4.3 (automated) (#3223)
* New Crowdin translations

* Fix bogus no.yml

* Fix bogus simple_form.no.yml

---------

Co-authored-by: GitHub Actions <noreply@github.com>
Co-authored-by: Claire <claire.github-309c@sitedethib.com>
2025-10-10 18:52:22 +02:00
github-actions[bot]
5983f8292b New Crowdin Translations for stable-4.3 (automated) (#36432)
Co-authored-by: GitHub Actions <noreply@github.com>
2025-10-10 18:17:25 +02:00
Claire
30c34606a1 Merge pull request #3219 from ClearlyClaire/glitch-soc/merge-4.3
Merge upstream changes up to 22c9f190e8 into stable-4.3
2025-10-09 14:08:15 +02:00
Claire
a53edd223e Merge commit '22c9f190e8f7b79ac6b66343680ed58d8ae65cc5' into glitch-soc/merge-4.3 2025-10-08 18:02:53 +02:00
Claire
22c9f190e8 Update dependency urì 2025-10-08 15:45:47 +02:00
Claire
f88b139a70 Update dependency rack 2025-10-08 15:45:47 +02:00
Claire
82edd1bcf5 Add integration tests for mastodon-streaming (#36025)
Co-authored-by: Claire <claire.github-309c@sitedethib.com>
Co-authored-by: David Roetzel <david@roetzel.de>
2025-10-08 15:45:47 +02:00
Claire
414f8ff60d Fix redirect to external object when URL is missing or malformed (#36347) 2025-10-08 15:45:47 +02:00
Claire
9e1c33f96a Merge upstream changes up to a86078e8bb into stable-4.3 (#3196)
* Fix getting `Create` and `Update` out of order (#36176)

* Fix processing of out-of-order `Update` as implicit updates (#36190)

* Update dependency `rexml`

* Bump version to v4.3.13
2025-09-23 18:47:29 +02:00
Claire
ef4ecd5eeb Merge commit 'a86078e8bb082eb15e0fd0d183a8a610f043827f' into glitch-soc/merge-4.3 2025-09-23 18:19:32 +02:00
Claire
a86078e8bb Bump version to v4.3.13 2025-09-23 14:33:27 +02:00
Claire
a3a02549e8 Update dependency rexml 2025-09-23 14:33:27 +02:00
Claire
06081721ef Fix processing of out-of-order Update as implicit updates (#36190) 2025-09-23 14:33:27 +02:00
Claire
60771df3e7 Fix getting Create and Update out of order (#36176) 2025-09-23 14:33:27 +02:00
Claire
21b324cc88 Merge pull request #3183 from ClearlyClaire/glitch-soc/merge-4.3
Merge upstream changes up to 51b29f4c30 to stable-4.3
2025-09-16 18:17:29 +02:00
Claire
5f07606955 Merge commit '51b29f4c30ef40d6f4ca6f8589b6093a5665c3a3' into glitch-soc/merge-4.3 2025-09-16 18:01:13 +02:00
Claire
51b29f4c30 Bump version to v4.3.12 2025-09-16 13:54:37 +02:00
Claire
0ec46833fa Update rails dependencies 2025-09-16 13:54:37 +02:00
Claire
de488fbea2 Merge pull request #3175 from ClearlyClaire/glitch-soc/merge-4.3
Merge upstream changes up to 6b78be274b into stable-4.3
2025-09-05 19:24:46 +02:00
Claire
d595641b73 [Glitch] Fix editing or deleting and redrafting polls in 4.3
Port 055be70c59 to glitch-soc

Signed-off-by: Claire <claire.github-309c@sitedethib.com>
2025-09-05 12:18:27 +02:00
Claire
fd733d0603 Merge remote-tracking branch 'upstream/stable-4.3' into glitch-soc/merge-4.3 2025-09-05 12:18:08 +02:00
Claire
055be70c59 Fix editing or deleting and redrafting polls in 4.3 (#36036) 2025-09-05 12:17:02 +02:00
Claire
0eeb0f00ba [Glitch] Fix API return types for interaction API helpers
Port 8777443c9b to glitch-soc

Signed-off-by: Claire <claire.github-309c@sitedethib.com>
2025-09-04 19:18:23 +02:00
Claire
6e406e119f [Glitch] Fix Edit as well as “Delete & Redraft” on a poll not inserting empty option
Port a48567784c to glitch-soc

Signed-off-by: Claire <claire.github-309c@sitedethib.com>
2025-09-04 19:18:17 +02:00
Claire
789df6b196 Merge remote-tracking branch 'upstream/stable-4.3' into glitch-soc/merge-4.3 2025-09-04 19:14:04 +02:00
fiona
6b78be274b Fix handling of edited status with new media and no text (#35970) 2025-09-04 15:44:53 +02:00
Claire
a3d4b7c9b9 Fix API return types for interaction API helpers (#35915) 2025-09-04 15:44:53 +02:00
Claire
d2b544e584 Fix Edit as well as “Delete & Redraft” on a poll not inserting empty option (#35892) 2025-09-04 15:44:53 +02:00
Claire
84c5ffb565 Fix self-destruct scheduler behavior on some Redis setups (#35823) 2025-09-04 15:44:53 +02:00
Claire
1d26fa9fed Merge pull request #3151 from ClearlyClaire/glitch-soc/backports-4.3
Merge upstream changes up to v4.3.11
2025-08-05 15:31:47 +02:00
Claire
62f21ab1fc Merge commit '42594f253e64c559ca2462abab0623dddc82f54c' into glitch-soc/backports-4.3 2025-08-05 15:16:11 +02:00
Claire
42594f253e Bump version to v4.3.11 (#35685) 2025-08-05 15:14:32 +02:00
Claire
b21e29cc7c Merge commit from fork 2025-08-05 14:53:04 +02:00
github-actions[bot]
ef8b45f004 New Crowdin Translations for stable-4.3 (automated) (#35682)
Co-authored-by: GitHub Actions <noreply@github.com>
2025-08-05 14:02:30 +02:00
Claire
16a3fcbe26 Update dependency ruby-saml to v1.18.1 2025-08-05 11:43:25 +02:00
Claire
65f1d77043 Disable ActiveRecord query cache in Create critical path (#35662) 2025-08-05 11:43:25 +02:00
Claire
6202cf6b65 Fix WebUI crashing for accounts with null URL (#35651) 2025-08-05 11:43:25 +02:00
Claire
8ee8228d46 Fix friends-of-friends recommendations suggesting already-requested accounts (#35604) 2025-08-05 11:43:25 +02:00
Claire
18869e9c90 Merge pull request #3139 from ClearlyClaire/glitch-soc/backports-4.3
Merge upstream changes up to v4.3.10 into stable-4.3
2025-07-23 18:26:07 +02:00
Claire
70ca99224f Merge commit '2232de0bfa6ce1854cd4cb4f7080a181be0b5a35' into glitch-soc/backports-4.3 2025-07-23 18:06:51 +02:00
David Roetzel
2232de0bfa Update dependency thor 2025-07-23 16:07:56 +02:00
David Roetzel
37b642d59c Bump version to v4.3.10 2025-07-23 16:07:56 +02:00
Claire
11ec1a8d7b Update security policy (#35292) 2025-07-08 17:32:27 +02:00
Claire
ec8c7dca2f Merge pull request #3117 from ClearlyClaire/glitch-soc/merge-4.3
Merge upstream changes up to f6dbb2206c
2025-07-02 19:21:12 +02:00
Claire
b6264ea625 [Glitch] Fix “Alt text” button submitting form in moderation interface
Port 973eb0a1d3 to glitch-soc

Signed-off-by: Claire <claire.github-309c@sitedethib.com>
2025-07-02 19:06:58 +02:00
Jeremy Kescher
36c5b0e2f0 [Glitch] Fix /share not using server-set characters limit
Port 44a88ad4d5 to glitch-soc

Signed-off-by: Claire <claire.github-309c@sitedethib.com>
2025-07-02 19:06:58 +02:00
Jeong Arm
645c910d38 [Glitch] Add missing autofocus on boost modal
Port e517c2a1bf to glitch-soc

Signed-off-by: Claire <claire.github-309c@sitedethib.com>
2025-07-02 19:06:58 +02:00
Claire
a076fa2063 Merge commit 'f6dbb2206c5a4c1b27ce1395b477492139cfcbcc' into glitch-soc/merge-4.3 2025-07-02 19:06:55 +02:00
Claire
f6dbb2206c Bump version to v4.3.9 2025-07-02 12:51:46 +02:00
Darius Kazemi
ea6736681b Fix NoMethodError in edge case of emoji cache handling (#34749)
Co-authored-by: Claire <claire.github-309c@sitedethib.com>
2025-07-02 12:51:46 +02:00
Claire
9ee5872f14 Fix error when viewing statuses to deleted replies in moderation view (#32986) 2025-07-02 12:51:46 +02:00
Claire
447527c154 Fix search operators sometimes getting lost (#35190) 2025-07-02 12:51:46 +02:00
Claire
973eb0a1d3 Fix “Alt text” button submitting form in moderation interface (#35147) 2025-07-02 12:51:46 +02:00
Claire
5039e9d474 Add basic support for remote attachments with multiple media types (#34996) 2025-07-02 12:51:46 +02:00
Claire
980c336ca4 Fix blocked accounts not being automatically removed from trending statuses (#34891) 2025-07-02 12:51:46 +02:00
Claire
4632be68eb Fix inconsistent filtering of silenced accounts for other silenced accounts (#34863) 2025-07-02 12:51:46 +02:00
Claire
8db52f2e66 Increase capybara default timeout to reduce test flakiness (#34859) 2025-07-02 12:51:46 +02:00
Claire
b38bbd04ea Fix NoMethodError in ActivityPub::FetchFeaturedCollectionService (#34811) 2025-07-02 12:51:46 +02:00
Claire
bd0c865bbb Fix handling of inlined featured collections in ActivityPub actor objects (#34789) 2025-07-02 12:51:46 +02:00
Claire
936827013b Change passthrough video processing to emit moov atom at start of video (#34726) 2025-07-02 12:51:46 +02:00
Claire
f1cfde4152 Fix admin dashboard crash on specific Elasticsearch connection errors (#34683) 2025-07-02 12:51:46 +02:00
Marcel Hellkamp
8c25742d4c fix: OIDC account creation fails for long display names (#34639) 2025-07-02 12:51:46 +02:00
Jeremy Kescher
44a88ad4d5 Fix /share not using server-set characters limit (#33459) 2025-07-02 12:51:46 +02:00
Jeong Arm
45fa4d99b3 Handle rotation is not present in the video metadata (#33261) 2025-07-02 12:51:46 +02:00
Eugen Rochko
11a466ab53 Fix wrong video dimensions for some rotated videos (#33008) 2025-07-02 12:51:46 +02:00
Jeong Arm
e517c2a1bf Add missing autofocus on boost modal (#32953) 2025-07-02 12:51:46 +02:00
github-actions[bot]
787702c26b New Crowdin Translations for stable-4.3 (automated) (#35243)
Co-authored-by: GitHub Actions <noreply@github.com>
2025-07-02 12:26:05 +02:00
Claire
91b3859b7b Add tests for featured tag removal (#34888) 2025-06-03 15:04:23 +02:00
Claire
9b31a5fc4c [Glitch] Fix code style issue
Port 3bbf3e9709 to glitch-soc

Signed-off-by: Claire <claire.github-309c@sitedethib.com>
2025-05-06 17:21:02 +02:00
Claire
b6aa0b4990 [Glitch] Merge commit from fork
Port 79931bf3ae to glitch-soc

Signed-off-by: Claire <claire.github-309c@sitedethib.com>
2025-05-06 17:21:02 +02:00
Claire
7868b545ed Merge pull request #3064 from glitch-soc/glitch-soc/merge-4.3
Merge upstream changes up to e6591bf322
2025-05-06 15:48:23 +02:00
Claire
bd8d96e699 Merge commit 'e6591bf322c7e47a8420a588d52a44a585c10b54' into glitch-soc/merge-4.3
Conflicts:
- `docker-compose.yml`:
  Conflict because of different repo names. Updated version.
2025-05-06 15:28:55 +02:00
Claire
e6591bf322 Fix code style issue 2025-05-06 15:08:57 +02:00
Claire
30e25ff7fc Bump version to v4.3.8 2025-05-06 15:04:34 +02:00
Claire
5ef82d7937 Update dependency net-imap 2025-05-06 15:04:34 +02:00
Claire
e14bf631b5 Update dependency nokogiri 2025-05-06 15:04:34 +02:00
Claire
6d46225718 Merge commit from fork
* Check scheme in account and post links

* Harden media attachments

* Client-side mitigation

* Client-side mitigation for media attachments
2025-05-06 15:02:13 +02:00
Claire
022af54ea2 Merge pull request #3061 from ClearlyClaire/glitch-soc/backports-4.3
Merge upstream changes to stable-4.3 up to ec2023233d
2025-05-06 08:03:24 +02:00
Claire
bcf788dad7 [Glitch] Fix sign-up e-mail confirmation page reloading on error or redirect
Port 698e4fdef2 to glitch-soc

Signed-off-by: Claire <claire.github-309c@sitedethib.com>
2025-05-05 20:39:23 +02:00
Claire
7917b495d2 Merge commit 'ec2023233d3e7cae1aba5aa1bdce0e6d72437101' into glitch-soc/backports-4.3 2025-05-05 20:35:05 +02:00
Claire
ec2023233d Add warning for REDIS_NAMESPACE deprecation at startup (#34581) 2025-05-05 18:48:39 +02:00
Claire
e6a6c26c36 Remove double-query for signed query strings (#34610) 2025-05-05 18:48:39 +02:00
Claire
86a8aa5e5c Add built-in context for interaction policies (#34574) 2025-05-05 18:48:39 +02:00
Claire
a9f8b1ad96 Fix incorrect redirect in response to unauthenticated API requests in limited federation mode (#34549) 2025-05-05 18:48:39 +02:00
Claire
698e4fdef2 Fix sign-up e-mail confirmation page reloading on error or redirect (#34548) 2025-05-05 18:48:39 +02:00
Claire
72b1af137e Change activity distribution error handling to skip retrying for deleted accounts (#33617) 2025-05-05 18:48:39 +02:00
David Roetzel
8291afae35 [Glitch] Merge commit from fork
Port d8f9db547a to glitch-soc

Co-authored-by: Eugen Rochko <eugen@zeonfederated.com>
Signed-off-by: Claire <claire.github-309c@sitedethib.com>
2025-05-03 18:39:30 +02:00
Claire
1ce0733cac Add option to stretch columns to available width (#3040) (#3042) 2025-04-15 13:57:49 +02:00
Claire
8bfbf2abaf Switch to glitch-soc docker images in docker-compose (#3038)
Fixes #3032
2025-04-12 12:42:07 +02:00
Claire
a63511425f Merge pull request #3026 from glitch-soc/glitch-soc/merge-4.3
Merge upstream changes up to 6f16011c5a
2025-04-02 14:26:10 +02:00
Claire
459e3451b6 Merge commit '6f16011c5a46bfa131cc1d6be89347dcff1b0fc1' into glitch-soc/merge-4.3 2025-04-02 12:10:24 +02:00
Jeong Arm
58d2c7b481 Merge pull request #2972 from tribela/fix-secondary-button
Fix secondary post button alignment
2025-04-02 12:09:17 +02:00
Claire
ae43b6bb09 Merge MoveGlitchUserSettings migration into MoveUserSettings (#2925) 2025-04-02 12:08:44 +02:00
Claire
6f16011c5a Bump version to v4.3.7 (#34328) 2025-04-02 09:14:21 +02:00
Claire
f79810313c Merge pull request #3024 from glitch-soc/glitch-soc/merge-4.3
Merge upstream changes up to 6d53e8c6c5 to stable-4.3
2025-04-02 08:34:39 +02:00
Claire
65a6840f71 Fix static version of animated PNG emojis not being properly extracted (#34337) 2025-04-01 16:01:14 +02:00
github-actions[bot]
527d9200d0 New Crowdin Translations for stable-4.3 (automated) (#34336)
Co-authored-by: GitHub Actions <noreply@github.com>
2025-04-01 11:10:20 +02:00
Claire
cbb9b83160 [Glitch] Fix bookmarks and favourites not being filtered
Port 2eb6d815d6 to glitch-soc

Signed-off-by: Claire <claire.github-309c@sitedethib.com>
2025-03-31 20:17:32 +02:00
Claire
51fcb9ca99 [Glitch] Fix filters not applying in detailed view
Port 8c3eeb4d29 to glitch-soc

Signed-off-by: Claire <claire.github-309c@sitedethib.com>
2025-03-31 20:15:13 +02:00
Claire
4a271072f5 Merge commit '6d53e8c6c5273bc8405ed8cf10ec6455ad7cc677' into glitch-soc/merge-4.3 2025-03-31 19:55:39 +02:00
Claire
6d53e8c6c5 Add delay to profile updates to debounce them (#34137) 2025-03-31 15:38:00 +02:00
Claire
d9fb61f305 Change account suspensions to be federated to recently-followed accounts as well (#34294) 2025-03-31 15:38:00 +02:00
Claire
6af733d1d8 Change AccountReachFinder to consider statuses based on suspension date (#34291) 2025-03-31 15:38:00 +02:00
Matt Jankowski
29eae75ca0 Define constants for sampling sizes in AccountReachFinder (#32805) 2025-03-31 15:38:00 +02:00
David Roetzel
8a3f25a4fa Use fixed order in flaky spec (#34279) 2025-03-31 15:38:00 +02:00
Claire
0615febd84 Add support for paginating partial collections in SynchronizeFollowersService (#34277) 2025-03-31 15:38:00 +02:00
Claire
86d8df0c03 Fix follower synchronization mechanism erroneously removing followers from multi-page collections (#34272) 2025-03-31 15:38:00 +02:00
Claire
105e5b1d76 Fix bookmarks and favourites not being filtered (#34260) 2025-03-31 15:38:00 +02:00
Claire
d6442b5455 Fix filters not applying in detailed view (#34259) 2025-03-31 15:38:00 +02:00
Claire
653868bb0c Change user archive signed URL TTL from 10 seconds to 1 hour (#34254) 2025-03-31 15:38:00 +02:00
Claire
4cb3fe35be Fix handling of malformed/unusual HTML (#34201) 2025-03-31 15:38:00 +02:00
Claire
8197e65cb3 Fix CacheBuster being queued for missing media attachments (#34253) 2025-03-31 15:38:00 +02:00
Claire
c48413ad4c Fix incorrect URL being used when cache busting (#34189) 2025-03-31 15:38:00 +02:00
Claire
9be391514b Fix streaming server refusing unix socket path in DATABASE_URL (#34091) 2025-03-31 15:38:00 +02:00
Claire
2340f4df81 Fix “x” hotkey not working on boosted filtered posts (#33758) 2025-03-31 15:38:00 +02:00
Claire
db86ec3d62 Merge pull request #2995 from glitch-soc/glitch-soc/merge-4.3
Merge upstream changes up to cdcd77ebff to stable-4.3
2025-03-13 15:44:43 +01:00
Claire
da6e667123 Merge commit 'cdcd77ebff3ff2093d47dbd622df763e88eaa731' into glitch-soc/merge-4.3 2025-03-13 15:28:46 +01:00
David Roetzel
cdcd77ebff Bump version to v4.3.6 2025-03-13 13:32:38 +01:00
Claire
c79c9e8c42 Update dependency omniauth-saml 2025-03-13 10:20:47 +01:00
Claire
e84031ea97 Update dependency rack 2025-03-13 10:20:47 +01:00
Claire
d01e407177 Fix Stoplight errors when using REDIS_NAMESPACE (#34126) 2025-03-13 10:20:47 +01:00
Claire
e1ff48978d Merge pull request #2990 from glitch-soc/glitch-soc/merge-4.3
Merge upstream changes up to a8613b7cda in stable-4.3
2025-03-10 12:46:02 +01:00
Claire
24304fbbe6 [Glitch] Change hashtag suggestion to prefer personal history capitalization
Port 62f019252a to glitch-soc

Signed-off-by: Claire <claire.github-309c@sitedethib.com>
2025-03-10 12:25:32 +01:00
Claire
644caeb156 [Glitch] Fix preview cards under Content Warnings not being shown in detailed statuses
Port 1ed1cdba1b to glitch-soc

Signed-off-by: Claire <claire.github-309c@sitedethib.com>
2025-03-10 12:25:06 +01:00
Claire
ad92660de6 [Glitch] Fix username and display name being hidden on narrow screens in moderation interface
Port b73e968641 to glitch-soc

Signed-off-by: Claire <claire.github-309c@sitedethib.com>
2025-03-10 12:23:53 +01:00
Claire
c5d17a3997 Merge commit 'a8613b7cda61e46209cace4379a9dea81f45529e' into glitch-soc/merge-4.3 2025-03-10 12:20:09 +01:00
Claire
a8613b7cda Bump version to v4.3.5 2025-03-10 10:14:17 +01:00
Noel De Martin
0c2fa2aab4 Comment sidekiq build in docker compose (#33483) 2025-03-10 10:14:17 +01:00
Claire
62f019252a Change hashtag suggestion to prefer personal history capitalization (#34070) 2025-03-10 10:14:17 +01:00
Renaud Chaput
4228ca614c Fix processing errors for some HEIF images from iOS 18 (#34086) 2025-03-10 10:14:17 +01:00
Claire
7e20ee7695 Fix streaming server not filtering unknown-language posts from public timelines (#33774) 2025-03-10 10:14:17 +01:00
Claire
1ed1cdba1b Fix preview cards under Content Warnings not being shown in detailed statuses (#34068) 2025-03-10 10:14:17 +01:00
Claire
b73e968641 Fix username and display name being hidden on narrow screens in moderation interface (#33064) 2025-03-10 10:14:17 +01:00
Claire
559f7a8e61 [Glitch] Fix media preview height in compose form when 3 or more images are attached (#2988)
Port 50449ae7ac to glitch-soc

Signed-off-by: Claire <claire.github-309c@sitedethib.com>
2025-03-08 16:13:49 +01:00
Claire
bcfd6ab3e4 Add Ruby 3.4 to Mastodon 4.3 test matrix (#34028) 2025-02-28 11:17:18 +01:00
Claire
1704a7d858 Merge pull request #2980 from glitch-soc/glitch-soc/merge-4.3
Merge upstream changes up to c1f398ae93
2025-02-27 16:31:19 +01:00
Claire
97fd14e141 Merge commit 'c1f398ae93d23ebb1ff5c7df5a32bc161a632980' into glitch-soc/merge-4.3 2025-02-27 16:21:44 +01:00
Claire
c1f398ae93 Bump version to v4.3.4 2025-02-27 16:09:48 +01:00
Claire
19b3469c29 Change HTML sanitization to remove unusable and unused embed tag (#34021) 2025-02-27 16:09:48 +01:00
Claire
57e4232b3e Update dependency uri 2025-02-27 16:09:48 +01:00
Claire
c6b501c42d Merge commit from fork
* Fix domain blocks/rationales being visible to unapproved/unconfirmed users

* Fix domain blocks/rationales being visible to suspended users

Co-authored-by: Claire <claire.github-309c@sitedethib.com>

* Allow moved users to view domain blocks

* Add authorization specs for `/api/v1/instance/domain_blocks` spec

* Fix tests

* Fix incorrect test setup

---------

Co-authored-by: Jeremy Kescher <jeremy@kescher.at>
2025-02-27 15:49:57 +01:00
Claire
5140f31cbb Merge commit from fork 2025-02-27 15:44:35 +01:00
Claire
adee65ad1b Merge pull request #2976 from glitch-soc/glitch-soc/merge-4.3
Merge upstream changes up to b1a584d252
2025-02-25 21:20:39 +01:00
Claire
fba7e85b9b [Glitch] Fix emoji rewrite adding unnecessary curft to the DOM for most emoji
Port 44f5f1f0a5 to glitch-soc

Signed-off-by: Claire <claire.github-309c@sitedethib.com>
2025-02-25 18:40:30 +01:00
Claire
bc95675236 [Glitch] Fix preview card sizing in “Author attribution” in profile settings
Port 82e046ea06 to glitch-soc

Signed-off-by: Claire <claire.github-309c@sitedethib.com>
2025-02-25 18:39:00 +01:00
Eugen Rochko
ccc4fcbdb8 [Glitch] Fix notification polling showing a loading bar in web UI
Port e856838e0c to glitch-soc

Signed-off-by: Claire <claire.github-309c@sitedethib.com>
2025-02-25 18:38:35 +01:00
Oliver Geer
e3afbab115 [Glitch] Fix accounts table long display name
Port 0ad5c212c1 to glitch-soc

Signed-off-by: Claire <claire.github-309c@sitedethib.com>
2025-02-25 18:38:12 +01:00
Claire
baac429103 Merge commit 'b1a584d252f4df4c2a1a9400d6588b4f36768216' into glitch-soc/merge-4.3
Conflicts:
- `app/lib/feed_manager.rb`:
  Not a real conflict, but glitch-soc has an extra `populate_direct_feed` method.
  Added upstream's code.
  In addition, upstream changed how notifications from follow subscriptions were
  handled, refactoring this file in the process.
  Ported upstream's changes.
- `app/services/precompute_feed_service.rb`:
  Not a real conflict, glitch-soc has extra code for the direct feed.
  Added upstream's new code for populating lists.
- `app/validators/poll_options_validator.rb`:
  Upstream split `PollValidator` in two, and glitch-soc had local changes to
  make the options configurable.
  Refactored as upstream did, keeping glitch-soc's configurable limits.
- `app/workers/feed_insert_worker.rb`:
  Upstream changed how notifications from follow subscriptions were handled,
  refactoring this file in the process.
  Conflict is due to glitch-soc having an extra timeline type (direct).
  Ported upstream's changes.
2025-02-25 18:33:54 +01:00
github-actions[bot]
b1a584d252 New Crowdin Translations for stable-4.3 (automated) (#33999)
Co-authored-by: GitHub Actions <noreply@github.com>
2025-02-25 17:12:07 +01:00
Claire
8787077462 Fix GET /api/v2/notifications/:id and POST /api/v2/notifications/:id/dismiss for ungrouped notifications (#33990) 2025-02-25 17:11:09 +01:00
Claire
10bcbf15af Update dependency nokogiri 2025-02-25 17:11:09 +01:00
Claire
fb29ac0f5f Update dependency rack 2025-02-25 17:11:09 +01:00
Claire
b0f88be86f Update dependencies net-imap, net-smtp and timeout 2025-02-25 17:11:09 +01:00
Claire
018b85e767 Update dependency ruby-vips 2025-02-25 17:11:09 +01:00
Claire
08d2250ad2 Fix handling of duplicate mentions in incoming status Update (#33911) 2025-02-25 17:11:09 +01:00
Claire
679e7555ee Fix filtering for lists (#33842) 2025-02-25 17:11:09 +01:00
Claire
452153d55d Optimize timeline generation (#33839) 2025-02-25 17:11:09 +01:00
Claire
2954c2facb Change preview cards to be shown when Content Warnings are expanded (#33827) 2025-02-25 17:11:09 +01:00
Claire
44e38b79de Fix emoji rewrite adding unnecessary curft to the DOM for most emoji (#33818) 2025-02-25 17:11:09 +01:00
Claire
b32a67ff74 Fix tootctl feeds build not building list timelines (#33783) 2025-02-25 17:11:09 +01:00
Claire
4f33b041f0 Fix flaky test in /api/v2/notifications tests (#33773) 2025-02-25 17:11:09 +01:00
Claire
6e906884cf Fix missing timeout options in Request class (#33769) 2025-02-25 17:11:09 +01:00
Claire
317715254f Fix incorrect signature after HTTP redirect (#33757) 2025-02-25 17:11:09 +01:00
Claire
2b148d3e88 Fix polls not being validated on edition (#33755) 2025-02-25 17:11:09 +01:00
Claire
227d48dbd5 Fix LDSignature tests (#33705) 2025-02-25 17:11:09 +01:00
Claire
94fed6e140 Change mastodon:setup to prevent overwriting already-configured servers (#33684) 2025-02-25 17:11:09 +01:00
Matt Jankowski
37b029d400 Move clear environment portion of mastodon:setup to private method (#33616) 2025-02-25 17:11:09 +01:00
Matt Jankowski
11baa26db2 Collect errors in setup rake task (#33603) 2025-02-25 17:11:09 +01:00
Claire
c7172b54fe Change notifications from moderators to not be filtered (#33654) 2025-02-25 17:11:09 +01:00
Matt Jankowski
74496838e7 Add UserRole#bypass_block? method for notification check (#32974) 2025-02-25 17:11:09 +01:00
Claire
ca39069433 Further harden the warnings against changing encryption secrets (#33631) 2025-02-25 17:11:09 +01:00
Claire
7ad9581940 Fix media preview height in compose form when 3 or more images are attached (#33571) 2025-02-25 17:11:09 +01:00
Claire
e4f2a054c9 Fix preview card sizing in “Author attribution” in profile settings (#33482) 2025-02-25 17:11:09 +01:00
Claire
68eb62f4a9 Fix processing of incoming notifications for unfilterable types (#33429) 2025-02-25 17:11:09 +01:00
Claire
e63d0cfe85 Fix intermittent failure on ap/activity/update spec timestamp check (#33425) 2025-02-25 17:11:09 +01:00
Matt Jankowski
4da31b8263 Fix intermittent failure on ap/activity/create spec timestamp check (#33406) 2025-02-25 17:11:09 +01:00
Claire
17695ace33 Fix featured tags for remote accounts not being kept up to date (#33372) 2025-02-25 17:11:09 +01:00
Eugen Rochko
fa2625a0d9 Fix notification polling showing a loading bar in web UI (#32960) 2025-02-25 17:11:09 +01:00
Oliver Geer
1005b2f7b2 Fix accounts table long display name (#29316) 2025-02-25 17:11:09 +01:00
Claire
f24b0e9505 Fix exclusive lists interfering with notifications (#28162) 2025-02-25 17:11:09 +01:00
Claire
4db64491ee Merge pull request #2969 from glitch-soc/glitch-soc/merge-4.3
Merge upstream changes up to 96455304bc
2025-02-12 20:53:05 +01:00
Claire
fd79e2417d Merge commit '96455304bc0d7157e9db13dba838a641ba42e907' into glitch-soc/merge-4.3
- `.github/workflows/build-nightly.yml`:
  We had modified the file to disable the custom ARM64 builder.
  Upstream has removed it, using github's runners.
  Took upstream's changes.
- `.github/workflows/build-push-pr.yml`:
  We had modified the file to disable the custom ARM64 builder.
  Upstream has removed it, using github's runners.
  Took upstream's changes.
- `.github/workflows/build-releases.yml`:
  We had modified the file to disable the custom ARM64 builder.
  Upstream has removed it, using github's runners.
  Took upstream's changes.
- `.github/workflows/build-security.yml`:
  We had modified the file to disable the custom ARM64 builder.
  Upstream has removed it, using github's runners.
  Took upstream's changes.
2025-02-12 20:33:05 +01:00
Claire
96455304bc Use github's native arm64 runners for docker builds (#33886) 2025-02-12 11:02:44 +01:00
Claire
63f4e2070c Merge commit 'faed9bf9f14f077443374f5eb3075b9878e24214' into glitch-soc/stable-4.3 2025-01-16 11:43:10 +01:00
Claire
faed9bf9f1 Bump version to v4.3.3 2025-01-16 11:42:36 +01:00
Claire
10f10844ff Update dependencies rails and rails-html-sanitizer 2025-01-16 11:42:36 +01:00
Michael Stanclift
5c8d2be23b Fix libyaml missing from Dockerfile build stage (#33591) 2025-01-16 11:42:36 +01:00
Claire
90072f4367 Fix incorrect relationship_severance_event attribute name in changelog (#33443) 2025-01-16 11:42:36 +01:00
Claire
512bfc0a54 Fix incorrect notification settings migration for non-followers (#33348) 2025-01-16 11:42:36 +01:00
Jesse Karmani
d764ae017d Fix down clause for notification policy v2 migrations (#33340) 2025-01-16 11:42:36 +01:00
Claire
757aed3290 Fix error decrementing status count when FeaturedTags#last_status_at is nil (#33320) 2025-01-16 11:42:36 +01:00
Claire
3cff7caffd Fix last paginated notification group only including data on a single notification (#33271) 2025-01-16 11:42:36 +01:00
Claire
533477e77c Fix processing of mentions for post edits with an existing corresponding silent mention (#33227) 2025-01-16 11:42:36 +01:00
Claire
afcfc64007 Fix deletion of unconfirmed users with Webauthn set (#33186) 2025-01-16 11:42:36 +01:00
Claire
734f0dd182 Fix fediverse:creator metadata not showing up in REST API (#33466) 2025-01-16 11:42:36 +01:00
Matt Jankowski
bcc798d6a7 Fix empty authors preview card serialization (#33151) 2025-01-16 11:42:36 +01:00
Claire
3a4242ce01 Merge commit from fork 2025-01-16 11:10:08 +01:00
Claire
23376cb691 Fix NameError in status update processing (#33161) 2024-12-04 08:41:21 +01:00
Claire
c2d65f7142 Merge commit '13ab4b54e2b9cb9ddfcbe9dd3d820a7ba9164412' into glitch-soc/stable-4.3 2024-12-03 15:17:19 +01:00
Claire
13ab4b54e2 Bump version to v4.3.2 (#33136) 2024-12-03 15:16:28 +01:00
Claire
df0b641914 [Glitch] Fix duplicate notifications in notification groups when using slow mode
Port 4bfb8887bf to glitch-soc

Signed-off-by: Claire <claire.github-309c@sitedethib.com>
2024-12-02 21:58:22 +01:00
Claire
624b942c2e [Glitch] Redesign Content Warning and filters
Port 393f0a0159 to glitch-soc

Signed-off-by: Claire <claire.github-309c@sitedethib.com>
2024-12-02 21:57:14 +01:00
Claire
cfa2e0503a [Glitch] Fix alt-text pop-in not using the translated description
Port 0a1b5df202 to glitch-soc

Signed-off-by: Claire <claire.github-309c@sitedethib.com>
2024-12-02 21:57:00 +01:00
Renato "Lond" Cerqueira
de945eef63 [Glitch] Fix 'unknown' media attachment rendering in detailed view
Port 01e25af2e3 to glitch-soc

Signed-off-by: Claire <claire.github-309c@sitedethib.com>
2024-12-02 21:56:45 +01:00
Claire
9a7030fb69 [Glitch] Fix preview cards with long titles erroneously causing layout changes
Port 742eb549ab to glitch-soc

Signed-off-by: Claire <claire.github-309c@sitedethib.com>
2024-12-02 21:56:24 +01:00
Nathan Sparrow
221da1ba04 [Glitch] Embed modal mobile fix
Port de1d8dc63a

Signed-off-by: Claire <claire.github-309c@sitedethib.com>
2024-12-02 21:56:05 +01:00
David Roetzel
ff85540904 [Glitch] Do not change follow counters when already following
Port 029c99bd7b to glitch-soc

Signed-off-by: Claire <claire.github-309c@sitedethib.com>
2024-12-02 21:55:41 +01:00
Emelia Smith
c2862049a2 [Glitch] Fix 'unknown' media attachment type rendering
Port 346cdb998c to glitch-soc

Signed-off-by: Claire <claire.github-309c@sitedethib.com>
2024-12-02 21:55:26 +01:00
Claire
0d69cc068c Merge commit '26f25ef4bafd5ad84d03d8cb7ad0d868360175e5' into glitch-soc/stable-4.3
Conflicts:
- `app/javascript/styles/mastodon/components.scss`:
  Conflict caused by glitch-soc changing the path to images, and upstream
  removing styling using such an image.
  Removed the styling as upstream did.
- `app/models/trends/statuses.rb`:
  Upstream added a date restriction to trendable posts, while glitch-soc had
  slightly different conditions.
  Added the date restriction to glitch-soc's conditions.
2024-12-02 21:49:12 +01:00
github-actions[bot]
26f25ef4ba New Crowdin Translations for stable-4.3 (automated) (#33135)
Co-authored-by: GitHub Actions <noreply@github.com>
2024-12-02 16:53:28 +01:00
Claire
3b4070cfcc Prepare changelog 2024-12-02 16:20:32 +01:00
Claire
eb997c9f0e Fix processing incoming post edits with mentions to unresolvable accounts (#33129) 2024-12-02 16:20:32 +01:00
Yann
4239baa1f4 Remove constant definition from global scope in embed.js (#33107) 2024-12-02 16:20:32 +01:00
Claire
5532d1c2cb Add tootctl feeds vacuum (#33065) 2024-12-02 16:20:32 +01:00
Claire
3f0d90f019 Fix inactive users' timelines being backfilled on follow and unsuspend (#33094) 2024-12-02 16:20:32 +01:00
Claire
15e1a63e4a Fix direct inbox delivery pushing posts into inactive followers' timelines (#33067) 2024-12-02 16:20:32 +01:00
Claire
6b8ff1cf6e Fix TagFollow records not being correctly handled in account operations (#33063) 2024-12-02 16:20:32 +01:00
Eugen Rochko
6cbd217055 Fix pushing hashtag-followed posts to feeds of inactive users (#33018) 2024-12-02 16:20:32 +01:00
Claire
90c7c1bf7d Fix duplicate notifications in notification groups when using slow mode (#33014) 2024-12-02 16:20:32 +01:00
Claire
e06448e652 Fix posts made in the future being allowed to trend (#32996) 2024-12-02 16:20:32 +01:00
Claire
3752db3c9a Update dependency rexml 2024-12-02 16:20:32 +01:00
Claire
cc5c125cc7 Fix uploading higher-than-wide GIF profile picture with libvips enabled (#32911) 2024-12-02 16:20:32 +01:00
Claire
f65523c5b6 Fix domain attribution field having autocorrect and autocapitalize enabled (#32903) 2024-12-02 16:20:32 +01:00
Claire
5b6b23eeef Fix titles being escaped twice (#32889) 2024-12-02 16:20:32 +01:00
Claire
0cbf03efa7 Fix list creation limit check (#32869) 2024-12-02 16:20:32 +01:00
Matt Jankowski
90f2c7a1e9 Fix error in CLI EmailDomainBlocks when supplying --with-dns-records (#32863) 2024-12-02 16:20:32 +01:00
Matt Jankowski
f0d734cc6e Add DomainHelpers spec support module for DNS/MX stub (#32690) 2024-12-02 16:20:32 +01:00
Eugen Rochko
0720ef5f62 Fix min_id and max_id causing error in search API (#32857) 2024-12-02 16:20:32 +01:00
Claire
dc9a106d4c Avoid latest featured tag use on post removal unless necessary (#32787) 2024-12-02 16:20:32 +01:00
Claire
c634da32cf Redesign Content Warning and filters (#32543) 2024-12-02 16:20:32 +01:00
Claire
2d8ce9e19a Fix alt-text pop-in not using the translated description (#32766) 2024-12-02 16:20:32 +01:00
Renato "Lond" Cerqueira
1ddf1aedf1 Fix 'unknown' media attachment rendering in detailed view (#32713) 2024-12-02 16:20:32 +01:00
Claire
931870ca34 Fix preview cards with long titles erroneously causing layout changes (#32678) 2024-12-02 16:20:32 +01:00
Nathan Sparrow
7f9b0f36ba Embed modal mobile fix (#32641) 2024-12-02 16:20:32 +01:00
Hugo Gameiro
dd0992b25d Fix and improve batch attachment deletion handling when using OpenStack Swift (#32637) 2024-12-02 16:20:32 +01:00
Jeong Arm
9b677f099e Fix that blocking was not working on link timeline (#32625) 2024-12-02 16:20:32 +01:00
David Roetzel
c13b8026f0 Do not change follow counters when already following (#32622) 2024-12-02 16:20:32 +01:00
Emelia Smith
bf1375ae37 Fix 'unknown' media attachment type rendering (#32613) 2024-12-02 16:20:32 +01:00
Eugene Alvin Villar
b06161dba3 Fix tl language native name (#32606) 2024-12-02 16:20:32 +01:00
Matt Jankowski
a089109b77 Use async_count in more view locations (#32086) 2024-12-02 16:20:32 +01:00
Leni Kadali
74f9f7c600 Add error message when user tries to follow their own account (#31910) 2024-12-02 16:20:32 +01:00
Emelia Smith
ea1b598246 Add client_secret_expires_at to OAuth Applications (#30317) 2024-12-02 16:20:32 +01:00
Matt Jankowski
dbedd021f5 Move account suspension-related methods to concern (#28351) 2024-12-02 16:20:32 +01:00
Claire
5d79af928c Fix collapse icon opening the post (#2899) 2024-11-24 18:36:54 +01:00
Claire
a62be22cb1 Fix clicking on avatar/display opening status instead of profile (#2897)
Fix regression from #2895
2024-11-24 18:36:54 +01:00
Claire
96ffbc05c0 Fix status clickable area (#2895) 2024-11-24 18:36:54 +01:00
595 changed files with 20070 additions and 8247 deletions

View File

@@ -78,7 +78,7 @@ OTP_SECRET=
# Must be available (and set to same values) for all server processes
# These are private/secret values, do not share outside hosting environment
# Use `bin/rails db:encryption:init` to generate fresh secrets
# Do not change these secrets once in use, as this would cause data loss and other issues
# Do NOT change these secrets once in use, as this would cause data loss and other issues
# ------------------
# ACTIVE_RECORD_ENCRYPTION_DETERMINISTIC_KEY=
# ACTIVE_RECORD_ENCRYPTION_KEY_DERIVATION_SALT=

View File

@@ -21,3 +21,4 @@ runs:
with:
ruby-version: ${{ inputs.ruby-version }}
bundler-cache: true
cache-version: 4.3

View File

@@ -1,14 +1,9 @@
on:
workflow_call:
inputs:
platforms:
required: true
type: string
cache:
type: boolean
default: true
use_native_arm64_builder:
type: boolean
push_to_images:
type: string
version_prerelease:
@@ -24,42 +19,36 @@ on:
file_to_build:
type: string
# This builds multiple images with one runner each, allowing us to build for multiple architectures
# using Github's runners.
# The two-step process is adapted form:
# https://docs.docker.com/build/ci/github-actions/multi-platform/#distribute-build-across-multiple-runners
jobs:
# Build each (amd64 and arm64) image separately
build-image:
runs-on: ubuntu-latest
runs-on: ${{ startsWith(matrix.platform, 'linux/arm') && 'ubuntu-24.04-arm' || 'ubuntu-24.04' }}
strategy:
fail-fast: false
matrix:
platform:
- linux/amd64
- linux/arm64
steps:
- uses: actions/checkout@v4
- uses: docker/setup-qemu-action@v3
if: contains(inputs.platforms, 'linux/arm64') && !inputs.use_native_arm64_builder
- name: Prepare
env:
PUSH_TO_IMAGES: ${{ inputs.push_to_images }}
run: |
platform=${{ matrix.platform }}
echo "PLATFORM_PAIR=${platform//\//-}" >> $GITHUB_ENV
# Transform multi-line variable into comma-separated variable
image_names=${PUSH_TO_IMAGES//$'\n'/,}
echo "IMAGE_NAMES=${image_names%,}" >> $GITHUB_ENV
- uses: docker/setup-buildx-action@v3
id: buildx
if: ${{ !(inputs.use_native_arm64_builder && contains(inputs.platforms, 'linux/arm64')) }}
- name: Start a local Docker Builder
if: inputs.use_native_arm64_builder && contains(inputs.platforms, 'linux/arm64')
run: |
docker run --rm -d --name buildkitd -p 1234:1234 --privileged moby/buildkit:latest --addr tcp://0.0.0.0:1234
- uses: docker/setup-buildx-action@v3
id: buildx-native
if: inputs.use_native_arm64_builder && contains(inputs.platforms, 'linux/arm64')
with:
driver: remote
endpoint: tcp://localhost:1234
platforms: linux/amd64
append: |
- endpoint: tcp://${{ vars.DOCKER_BUILDER_HETZNER_ARM64_01_HOST }}:13865
platforms: linux/arm64
name: mastodon-docker-builder-arm64-01
driver-opts:
- servername=mastodon-docker-builder-arm64-01
env:
BUILDER_NODE_1_AUTH_TLS_CACERT: ${{ secrets.DOCKER_BUILDER_HETZNER_ARM64_01_CACERT }}
BUILDER_NODE_1_AUTH_TLS_CERT: ${{ secrets.DOCKER_BUILDER_HETZNER_ARM64_01_CERT }}
BUILDER_NODE_1_AUTH_TLS_KEY: ${{ secrets.DOCKER_BUILDER_HETZNER_ARM64_01_KEY }}
- name: Log in to Docker Hub
if: contains(inputs.push_to_images, 'tootsuite')
@@ -76,8 +65,91 @@ jobs:
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}
- uses: docker/metadata-action@v5
- name: Docker meta
id: meta
uses: docker/metadata-action@v5
if: ${{ inputs.push_to_images != '' }}
with:
images: ${{ inputs.push_to_images }}
flavor: ${{ inputs.flavor }}
labels: ${{ inputs.labels }}
- name: Build and push by digest
id: build
uses: docker/build-push-action@v6
with:
context: .
file: ${{ inputs.file_to_build }}
build-args: |
MASTODON_VERSION_PRERELEASE=${{ inputs.version_prerelease }}
MASTODON_VERSION_METADATA=${{ inputs.version_metadata }}
SOURCE_COMMIT=${{ github.sha }}
platforms: ${{ matrix.platform }}
provenance: false
push: ${{ inputs.push_to_images != '' }}
cache-from: ${{ inputs.cache && 'type=gha' || '' }}
cache-to: ${{ inputs.cache && 'type=gha,mode=max' || '' }}
outputs: type=image,"name=${{ env.IMAGE_NAMES }}",push-by-digest=true,name-canonical=true,push=${{ inputs.push_to_images != '' }}
- name: Export digest
if: ${{ inputs.push_to_images != '' }}
run: |
mkdir -p "${{ runner.temp }}/digests"
digest="${{ steps.build.outputs.digest }}"
touch "${{ runner.temp }}/digests/${digest#sha256:}"
- name: Upload digest
if: ${{ inputs.push_to_images != '' }}
uses: actions/upload-artifact@v4
with:
# `hashFiles` is used to disambiguate between streaming and non-streaming images
name: digests-${{ hashFiles(inputs.file_to_build) }}-${{ env.PLATFORM_PAIR }}
path: ${{ runner.temp }}/digests/*
if-no-files-found: error
retention-days: 1
# Then merge the docker images into a single one
merge-images:
if: ${{ inputs.push_to_images != '' }}
runs-on: ubuntu-24.04
needs:
- build-image
env:
PUSH_TO_IMAGES: ${{ inputs.push_to_images }}
steps:
- uses: actions/checkout@v4
- name: Download digests
uses: actions/download-artifact@v4
with:
path: ${{ runner.temp }}/digests
# `hashFiles` is used to disambiguate between streaming and non-streaming images
pattern: digests-${{ hashFiles(inputs.file_to_build) }}-*
merge-multiple: true
- name: Log in to Docker Hub
if: contains(inputs.push_to_images, 'tootsuite')
uses: docker/login-action@v3
with:
username: ${{ secrets.DOCKERHUB_USERNAME }}
password: ${{ secrets.DOCKERHUB_TOKEN }}
- name: Log in to the GitHub Container registry
if: contains(inputs.push_to_images, 'ghcr.io')
uses: docker/login-action@v3
with:
registry: ghcr.io
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v3
- name: Docker meta
id: meta
uses: docker/metadata-action@v5
if: ${{ inputs.push_to_images != '' }}
with:
images: ${{ inputs.push_to_images }}
@@ -85,18 +157,14 @@ jobs:
tags: ${{ inputs.tags }}
labels: ${{ inputs.labels }}
- uses: docker/build-push-action@v6
with:
context: .
file: ${{ inputs.file_to_build }}
build-args: |
MASTODON_VERSION_PRERELEASE=${{ inputs.version_prerelease }}
MASTODON_VERSION_METADATA=${{ inputs.version_metadata }}
platforms: ${{ inputs.platforms }}
provenance: false
builder: ${{ steps.buildx.outputs.name || steps.buildx-native.outputs.name }}
push: ${{ inputs.push_to_images != '' }}
tags: ${{ steps.meta.outputs.tags }}
labels: ${{ steps.meta.outputs.labels }}
cache-from: ${{ inputs.cache && 'type=gha' || '' }}
cache-to: ${{ inputs.cache && 'type=gha,mode=max' || '' }}
- name: Create manifest list and push
working-directory: ${{ runner.temp }}/digests
run: |
echo "$PUSH_TO_IMAGES" | xargs -I{} \
docker buildx imagetools create $(jq -cr '.tags | map("-t " + .) | join(" ")' <<< "$DOCKER_METADATA_OUTPUT_JSON") \
$(printf '{}@sha256:%s ' *)
- name: Inspect image
run: |
echo "$PUSH_TO_IMAGES" | xargs -i{} \
docker buildx imagetools inspect {}:${{ steps.meta.outputs.version }}

View File

@@ -26,8 +26,6 @@ jobs:
uses: ./.github/workflows/build-container-image.yml
with:
file_to_build: Dockerfile
platforms: linux/amd64,linux/arm64
use_native_arm64_builder: false
cache: false
push_to_images: |
ghcr.io/${{ github.repository_owner }}/mastodon
@@ -47,8 +45,6 @@ jobs:
uses: ./.github/workflows/build-container-image.yml
with:
file_to_build: streaming/Dockerfile
platforms: linux/amd64,linux/arm64
use_native_arm64_builder: false
cache: false
push_to_images: |
ghcr.io/${{ github.repository_owner }}/mastodon-streaming

View File

@@ -32,8 +32,6 @@ jobs:
uses: ./.github/workflows/build-container-image.yml
with:
file_to_build: Dockerfile
platforms: linux/amd64,linux/arm64
use_native_arm64_builder: false
push_to_images: |
ghcr.io/${{ github.repository_owner }}/mastodon
version_metadata: ${{ needs.compute-suffix.outputs.metadata }}
@@ -49,8 +47,6 @@ jobs:
uses: ./.github/workflows/build-container-image.yml
with:
file_to_build: streaming/Dockerfile
platforms: linux/amd64,linux/arm64
use_native_arm64_builder: false
push_to_images: |
ghcr.io/${{ github.repository_owner }}/mastodon-streaming
version_metadata: ${{ needs.compute-suffix.outputs.metadata }}

View File

@@ -13,8 +13,6 @@ jobs:
uses: ./.github/workflows/build-container-image.yml
with:
file_to_build: Dockerfile
platforms: linux/amd64,linux/arm64
use_native_arm64_builder: false
push_to_images: |
ghcr.io/${{ github.repository_owner }}/mastodon
# Do not use cache when building releases, so apt update is always ran and the release always contain the latest packages
@@ -22,7 +20,7 @@ jobs:
# Only tag with latest when ran against the latest stable branch
# This needs to be updated after each minor version release
flavor: |
latest=${{ startsWith(github.ref, 'refs/tags/v4.3.') }}
latest=false
tags: |
type=pep440,pattern={{raw}}
type=pep440,pattern=v{{major}}.{{minor}}
@@ -33,8 +31,6 @@ jobs:
uses: ./.github/workflows/build-container-image.yml
with:
file_to_build: streaming/Dockerfile
platforms: linux/amd64,linux/arm64
use_native_arm64_builder: false
push_to_images: |
ghcr.io/${{ github.repository_owner }}/mastodon-streaming
# Do not use cache when building releases, so apt update is always ran and the release always contain the latest packages
@@ -42,7 +38,7 @@ jobs:
# Only tag with latest when ran against the latest stable branch
# This needs to be updated after each minor version release
flavor: |
latest=${{ startsWith(github.ref, 'refs/tags/v4.3.') }}
latest=false
tags: |
type=pep440,pattern={{raw}}
type=pep440,pattern=v{{major}}.{{minor}}

View File

@@ -23,8 +23,6 @@ jobs:
uses: ./.github/workflows/build-container-image.yml
with:
file_to_build: Dockerfile
platforms: linux/amd64,linux/arm64
use_native_arm64_builder: false
cache: false
push_to_images: |
ghcr.io/${{ github.repository_owner }}/mastodon
@@ -44,8 +42,6 @@ jobs:
uses: ./.github/workflows/build-container-image.yml
with:
file_to_build: streaming/Dockerfile
platforms: linux/amd64,linux/arm64
use_native_arm64_builder: false
cache: false
push_to_images: |
ghcr.io/${{ github.repository_owner }}/mastodon-streaming

View File

@@ -20,7 +20,6 @@ jobs:
uses: ./.github/workflows/build-container-image.yml
with:
file_to_build: Dockerfile
platforms: linux/amd64 # Testing only on native platform so it is performant
cache: true
build-image-streaming:
@@ -31,5 +30,4 @@ jobs:
uses: ./.github/workflows/build-container-image.yml
with:
file_to_build: streaming/Dockerfile
platforms: linux/amd64 # Testing only on native platform so it is performant
cache: true

View File

@@ -127,6 +127,7 @@ jobs:
- '3.1'
- '3.2'
- '.ruby-version'
- '3.4'
steps:
- uses: actions/checkout@v4
@@ -229,6 +230,7 @@ jobs:
- '3.1'
- '3.2'
- '.ruby-version'
- '3.4'
steps:
- uses: actions/checkout@v4
@@ -308,6 +310,7 @@ jobs:
- '3.1'
- '3.2'
- '.ruby-version'
- '3.4'
steps:
- uses: actions/checkout@v4
@@ -425,6 +428,7 @@ jobs:
- '3.1'
- '3.2'
- '.ruby-version'
- '3.4'
search-image:
- docker.elastic.co/elasticsearch/elasticsearch:7.17.13
include:

View File

@@ -2,6 +2,269 @@
All notable changes to this project will be documented in this file.
## [4.3.16] - 2025-12-08
### Security
- Fix inconsistent error handling leaking information on existence of private posts ([GHSA-gwhw-gcjx-72v8](https://github.com/mastodon/mastodon/security/advisories/GHSA-gwhw-gcjx-72v8))
### Fixed
- Fix YouTube embeds by sending referer (#37126 by @ChaosExAnima)
- Fix YouTube iframe not being able to start at a defined time (#26584 by @BrunoViveiros)
- Fix known expensive S3 batch delete operation failing because of short timeouts (#37004 by @ClearlyClaire)
## [4.3.15] - 2025-11-20
### Fixed
- Fix `tootctl upgrade storage-schema` failing with `ArgumentError` (#36914 by @shugo)
- Fix old previously-undiscovered posts being treated as new when receiving an `Update` (#36848 by @ClearlyClaire)
## [4.3.14] - 2025-10-13
### Security
- Update dependencies `rack` and `uri`
- Fix streaming server connection not being closed on user suspension (by @ThisIsMissEm, [GHSA-r2fh-jr9c-9pxh](https://github.com/mastodon/mastodon/security/advisories/GHSA-r2fh-jr9c-9pxh))
- Fix password change through admin CLI not invalidating existing sessions and access tokens (by @ThisIsMissEm, [GHSA-f3q3-rmf7-9655](https://github.com/mastodon/mastodon/security/advisories/GHSA-f3q3-rmf7-9655))
- Fix streaming server allowing access to public timelines even without the `read` or `read:statuses` OAuth scopes (by @ThisIsMissEm, [GHSA-7gwh-mw97-qjgp](https://github.com/mastodon/mastodon/security/advisories/GHSA-7gwh-mw97-qjgp))
### Fixed
- Fix redirect to external object when URL is missing or malformed (#36347 by @ClearlyClaire)
## [4.3.13] - 2025-09-23
### Security
- Update dependencies
### Fixed
- Fix processing of out-of-order `Update` as implicit updates (#36190 by @ClearlyClaire)
- Fix getting `Create` and `Update` out of order (#36176 by @ClearlyClaire)
## [4.3.12] - 2025-09-16
### Security
- Update dependencies
### Fixed
- Fix processing of remote edited statuses with new media and no text (#35970 by @unfokus)
- Fix “Edit” and “Delete & Redraft” on a poll not inserting empty option (#35892 by @ClearlyClaire)
- Fix self-destruct scheduler behavior on some Redis setups (#35823 by @ClearlyClaire)
## [4.3.11] - 2025-08-05
### Security
- Update dependencies
- Fix incorrect rate-limit handling [GHSA-84ch-6436-c7mg](https://github.com/mastodon/mastodon/security/advisories/GHSA-84ch-6436-c7mg)
### Fixed
- Fix race condition caused by ActiveRecord query cache in `Create` critical path (#35662 by @ClearlyClaire)
- Fix WebUI crashing for accounts with `null` URL (#35651 by @ClearlyClaire)
- Fix friends-of-friends recommendations suggesting already-requested accounts (#35604 by @ClearlyClaire)
## [4.3.10] - 2025-07-23
### Security
- Updated dependencies
## [4.3.9] - 2025-07-02
### Changed
- Change passthrough video processing to emit `moov` atom at start of video (#34726 by @ClearlyClaire)
### Fixed
- Fix `NoMethodError` in edge case of emoji cache handling (#34749 by @dariusk)
- Fix error when viewing statuses to deleted replies in moderation view (#32986 by @ClearlyClaire)
- Fix search operators sometimes getting lost (#35190 by @ClearlyClaire)
- Fix “Alt text” button submitting form in moderation interface (#35147 by @ClearlyClaire)
- Fix handling of remote attachments with multiple media types (#34996 by @ClearlyClaire)
- Fix blocked accounts not being automatically removed from trending statuses (#34891 by @ClearlyClaire)
- Fix inconsistent filtering of silenced accounts for other silenced accounts (#34863 by @ClearlyClaire)
- Fix handling of inlined `featured` collections in ActivityPub actor objects (#34789 and #34811 by @ClearlyClaire)
- Fix admin dashboard crash on specific Elasticsearch connection errors (#34683 by @ClearlyClaire)
- Fix OIDC account creation failing for long display names (#34639 by @defnull)
- Fix `/share` not using server-set characters limit (#33459 by @kescherCode)
- Fix wrong video dimensions for some rotated videos (#33008 and #33261 by @Gargron and @tribela)
- Fix missing autofocus on boost modal (#32953 by @tribela)
## [4.3.8] - 2025-05-06
### Security
- Update dependencies
- Check scheme on account, profile, and media URLs ([GHSA-x2rc-v5wx-g3m5](https://github.com/mastodon/mastodon/security/advisories/GHSA-x2rc-v5wx-g3m5))
### Added
- Add warning for REDIS_NAMESPACE deprecation at startup (#34581 by @ClearlyClaire)
- Add built-in context for interaction policies (#34574 by @ClearlyClaire)
### Changed
- Change activity distribution error handling to skip retrying for deleted accounts (#33617 by @ClearlyClaire)
### Removed
- Remove double-query for signed query strings (#34610 by @ClearlyClaire)
### Fixed
- Fix incorrect redirect in response to unauthenticated API requests in limited federation mode (#34549 by @ClearlyClaire)
- Fix sign-up e-mail confirmation page reloading on error or redirect (#34548 by @ClearlyClaire)
## [4.3.7] - 2025-04-02
### Added
- Add delay to profile updates to debounce them (#34137 by @ClearlyClaire)
- Add support for paginating partial collections in `SynchronizeFollowersService` (#34272 and #34277 by @ClearlyClaire)
### Changed
- Change account suspensions to be federated to recently-followed accounts as well (#34294 by @ClearlyClaire)
- Change `AccountReachFinder` to consider statuses based on suspension date (#32805 and #34291 by @ClearlyClaire and @mjankowski)
- Change user archive signed URL TTL from 10 seconds to 1 hour (#34254 by @ClearlyClaire)
### Fixed
- Fix static version of animated PNG emojis not being properly extracted (#34337 by @ClearlyClaire)
- Fix filters not applying in detailed view, favourites and bookmarks (#34259 and #34260 by @ClearlyClaire)
- Fix handling of malformed/unusual HTML (#34201 by @ClearlyClaire)
- Fix `CacheBuster` being queued for missing media attachments (#34253 by @ClearlyClaire)
- Fix incorrect URL being used when cache busting (#34189 by @ClearlyClaire)
- Fix streaming server refusing unix socket path in `DATABASE_URL` (#34091 by @ClearlyClaire)
- Fix “x” hotkey not working on boosted filtered posts (#33758 by @ClearlyClaire)
## [4.3.6] - 2025-03-13
### Security
- Update dependency `omniauth-saml`
- Update dependency `rack`
### Fixed
- Fix Stoplight errors when using `REDIS_NAMESPACE` (#34126 by @ClearlyClaire)
## [4.3.5] - 2025-03-10
### Changed
- Change hashtag suggestion to prefer personal history capitalization (#34070 by @ClearlyClaire)
### Fixed
- Fix processing errors for some HEIF images from iOS 18 (#34086 by @renchap)
- Fix streaming server not filtering unknown-language posts from public timelines (#33774 by @ClearlyClaire)
- Fix preview cards under Content Warnings not being shown in detailed statuses (#34068 by @ClearlyClaire)
- Fix username and display name being hidden on narrow screens in moderation interface (#33064 by @ClearlyClaire)
## [4.3.4] - 2025-02-27
### Security
- Update dependencies
- Change HTML sanitization to remove unusable and unused `embed` tag (#34021 by @ClearlyClaire, [GHSA-mq2m-hr29-8gqf](https://github.com/mastodon/mastodon/security/advisories/GHSA-mq2m-hr29-8gqf))
- Fix rate-limit on sign-up email verification ([GHSA-v39f-c9jj-8w7h](https://github.com/mastodon/mastodon/security/advisories/GHSA-v39f-c9jj-8w7h))
- Fix improper disclosure of domain blocks to unverified users ([GHSA-94h4-fj37-c825](https://github.com/mastodon/mastodon/security/advisories/GHSA-94h4-fj37-c825))
### Changed
- Change preview cards to be shown when Content Warnings are expanded (#33827 by @ClearlyClaire)
- Change warnings against changing encryption secrets to be even more noticeable (#33631 by @ClearlyClaire)
- Change `mastodon:setup` to prevent overwriting already-configured servers (#33603, #33616, and #33684 by @ClearlyClaire and @mjankowski)
- Change notifications from moderators to not be filtered (#32974 and #33654 by @ClearlyClaire and @mjankowski)
### Fixed
- Fix `GET /api/v2/notifications/:id` and `POST /api/v2/notifications/:id/dismiss` for ungrouped notifications (#33990 by @ClearlyClaire)
- Fix issue with some versions of libvips on some systems (#33853 by @kleisauke)
- Fix handling of duplicate mentions in incoming status `Update` (#33911 by @ClearlyClaire)
- Fix inefficiencies in timeline generation (#33839 and #33842 by @ClearlyClaire)
- Fix emoji rewrite adding unnecessary curft to the DOM for most emoji (#33818 by @ClearlyClaire)
- Fix `tootctl feeds build` not building list timelines (#33783 by @ClearlyClaire)
- Fix flaky test in `/api/v2/notifications` tests (#33773 by @ClearlyClaire)
- Fix incorrect signature after HTTP redirect (#33757 and #33769 by @ClearlyClaire)
- Fix polls not being validated on edition (#33755 by @ClearlyClaire)
- Fix media preview height in compose form when 3 or more images are attached (#33571 by @ClearlyClaire)
- Fix preview card sizing in “Author attribution” in profile settings (#33482 by @ClearlyClaire)
- Fix processing of incoming notifications for unfilterable types (#33429 by @ClearlyClaire)
- Fix featured tags for remote accounts not being kept up to date (#33372, #33406, and #33425 by @ClearlyClaire and @mjankowski)
- Fix notification polling showing a loading bar in web UI (#32960 by @Gargron)
- Fix accounts table long display name (#29316 by @WebCoder49)
- Fix exclusive lists interfering with notifications (#28162 by @ShadowJonathan)
## [4.3.3] - 2025-01-16
### Security
- Fix insufficient validation of account URIs ([GHSA-5wxh-3p65-r4g6](https://github.com/mastodon/mastodon/security/advisories/GHSA-5wxh-3p65-r4g6))
- Update dependencies
### Fixed
- Fix `libyaml` missing from `Dockerfile` build stage (#33591 by @vmstan)
- Fix incorrect notification settings migration for non-followers (#33348 by @ClearlyClaire)
- Fix down clause for notification policy v2 migrations (#33340 by @jesseplusplus)
- Fix error decrementing status count when `FeaturedTags#last_status_at` is `nil` (#33320 by @ClearlyClaire)
- Fix last paginated notification group only including data on a single notification (#33271 by @ClearlyClaire)
- Fix processing of mentions for post edits with an existing corresponding silent mention (#33227 by @ClearlyClaire)
- Fix deletion of unconfirmed users with Webauthn set (#33186 by @ClearlyClaire)
- Fix empty authors preview card serialization (#33151, #33466 by @mjankowski and @ClearlyClaire)
## [4.3.2] - 2024-12-03
### Added
- Add `tootctl feeds vacuum` (#33065 by @ClearlyClaire)
- Add error message when user tries to follow their own account (#31910 by @lenikadali)
- Add client_secret_expires_at to OAuth Applications (#30317 by @ThisIsMissEm)
### Changed
- Change design of Content Warnings and filters (#32543 by @ClearlyClaire)
### Fixed
- Fix processing incoming post edits with mentions to unresolvable accounts (#33129 by @ClearlyClaire)
- Fix error when including multiple instances of `embed.js` (#33107 by @YKWeyer)
- Fix inactive users' timelines being backfilled on follow and unsuspend (#33094 by @ClearlyClaire)
- Fix direct inbox delivery pushing posts into inactive followers' timelines (#33067 by @ClearlyClaire)
- Fix `TagFollow` records not being correctly handled in account operations (#33063 by @ClearlyClaire)
- Fix pushing hashtag-followed posts to feeds of inactive users (#33018 by @Gargron)
- Fix duplicate notifications in notification groups when using slow mode (#33014 by @ClearlyClaire)
- Fix posts made in the future being allowed to trend (#32996 by @ClearlyClaire)
- Fix uploading higher-than-wide GIF profile picture with libvips enabled (#32911 by @ClearlyClaire)
- Fix domain attribution field having autocorrect and autocapitalize enabled (#32903 by @ClearlyClaire)
- Fix titles being escaped twice (#32889 by @ClearlyClaire)
- Fix list creation limit check (#32869 by @ClearlyClaire)
- Fix error in `tootctl email_domain_blocks` when supplying `--with-dns-records` (#32863 by @mjankowski)
- Fix `min_id` and `max_id` causing error in search API (#32857 by @Gargron)
- Fix inefficiencies when processing removal of posts that use featured tags (#32787 by @ClearlyClaire)
- Fix alt-text pop-in not using the translated description (#32766 by @ClearlyClaire)
- Fix preview cards with long titles erroneously causing layout changes (#32678 by @ClearlyClaire)
- Fix embed modal layout on mobile (#32641 by @DismalShadowX)
- Fix and improve batch attachment deletion handling when using OpenStack Swift (#32637 by @hugogameiro)
- Fix blocks not being applied on link timeline (#32625 by @tribela)
- Fix follow counters being incorrectly changed (#32622 by @oneiros)
- Fix 'unknown' media attachment type rendering (#32613 and #32713 by @ThisIsMissEm and @renatolond)
- Fix tl language native name (#32606 by @seav)
### Security
- Update dependencies
## [4.3.1] - 2024-10-21
### Added
@@ -93,7 +356,7 @@ The following changelog entries focus on changes visible to users, administrator
- **Add notifications of severed relationships** (#27511, #29665, #29668, #29670, #29700, #29714, #29712, and #29731 by @ClearlyClaire and @Gargron)\
Notify local users when they lose relationships as a result of a local moderator blocking a remote account or server, allowing the affected user to retrieve the list of broken relationships.\
Note that this does not notify remote users.\
This adds the `severed_relationships` notification type to the REST API and streaming, with a new [`relationship_severance_event` attribute](https://docs.joinmastodon.org/entities/Notification/#relationship_severance_event).
This adds the `severed_relationships` notification type to the REST API and streaming, with a new [`event` attribute](https://docs.joinmastodon.org/entities/Notification/#relationship_severance_event).
- **Add hover cards in web UI** (#30754, #30864, #30850, #30879, #30928, #30949, #30948, #30931, and #31300 by @ClearlyClaire, @Gargron, and @renchap)\
Hovering over an avatar or username will now display a hover card with the first two lines of the user's description and their first two profile fields.\
This can be disabled in the “Animations and accessibility” section of the preferences.

View File

@@ -92,6 +92,9 @@ RUN \
# Set /opt/mastodon as working directory
WORKDIR /opt/mastodon
# Add backport repository for some specific packages where we need the latest version
RUN echo 'deb http://deb.debian.org/debian bookworm-backports main' >> /etc/apt/sources.list
# hadolint ignore=DL3008,DL3005
RUN \
# Mount Apt cache and lib directories from Docker buildx caches
@@ -150,6 +153,7 @@ RUN \
libpq-dev \
libssl-dev \
libtool \
libyaml-dev \
meson \
nasm \
pkg-config \
@@ -160,7 +164,7 @@ RUN \
libexif-dev \
libexpat1-dev \
libgirepository1.0-dev \
libheif-dev \
libheif-dev/bookworm-backports \
libimagequant-dev \
libjpeg62-turbo-dev \
liblcms2-dev \
@@ -343,7 +347,7 @@ RUN \
# libvips components
libcgif0 \
libexif12 \
libheif1 \
libheif1/bookworm-backports \
libimagequant0 \
libjpeg62-turbo \
liblcms2-2 \

View File

@@ -158,6 +158,9 @@ group :test do
# Stub web requests for specs
gem 'webmock', '~> 3.18'
# Websocket driver for testing integration between rails/sidekiq and streaming
gem 'websocket-driver', '~> 0.8', require: false
end
group :development do

View File

@@ -10,35 +10,35 @@ GIT
GEM
remote: https://rubygems.org/
specs:
actioncable (7.1.4.1)
actionpack (= 7.1.4.1)
activesupport (= 7.1.4.1)
actioncable (7.1.5.2)
actionpack (= 7.1.5.2)
activesupport (= 7.1.5.2)
nio4r (~> 2.0)
websocket-driver (>= 0.6.1)
zeitwerk (~> 2.6)
actionmailbox (7.1.4.1)
actionpack (= 7.1.4.1)
activejob (= 7.1.4.1)
activerecord (= 7.1.4.1)
activestorage (= 7.1.4.1)
activesupport (= 7.1.4.1)
actionmailbox (7.1.5.2)
actionpack (= 7.1.5.2)
activejob (= 7.1.5.2)
activerecord (= 7.1.5.2)
activestorage (= 7.1.5.2)
activesupport (= 7.1.5.2)
mail (>= 2.7.1)
net-imap
net-pop
net-smtp
actionmailer (7.1.4.1)
actionpack (= 7.1.4.1)
actionview (= 7.1.4.1)
activejob (= 7.1.4.1)
activesupport (= 7.1.4.1)
actionmailer (7.1.5.2)
actionpack (= 7.1.5.2)
actionview (= 7.1.5.2)
activejob (= 7.1.5.2)
activesupport (= 7.1.5.2)
mail (~> 2.5, >= 2.5.4)
net-imap
net-pop
net-smtp
rails-dom-testing (~> 2.2)
actionpack (7.1.4.1)
actionview (= 7.1.4.1)
activesupport (= 7.1.4.1)
actionpack (7.1.5.2)
actionview (= 7.1.5.2)
activesupport (= 7.1.5.2)
nokogiri (>= 1.8.5)
racc
rack (>= 2.2.4)
@@ -46,15 +46,15 @@ GEM
rack-test (>= 0.6.3)
rails-dom-testing (~> 2.2)
rails-html-sanitizer (~> 1.6)
actiontext (7.1.4.1)
actionpack (= 7.1.4.1)
activerecord (= 7.1.4.1)
activestorage (= 7.1.4.1)
activesupport (= 7.1.4.1)
actiontext (7.1.5.2)
actionpack (= 7.1.5.2)
activerecord (= 7.1.5.2)
activestorage (= 7.1.5.2)
activesupport (= 7.1.5.2)
globalid (>= 0.6.0)
nokogiri (>= 1.8.5)
actionview (7.1.4.1)
activesupport (= 7.1.4.1)
actionview (7.1.5.2)
activesupport (= 7.1.5.2)
builder (~> 3.1)
erubi (~> 1.11)
rails-dom-testing (~> 2.2)
@@ -64,30 +64,33 @@ GEM
activemodel (>= 4.1)
case_transform (>= 0.2)
jsonapi-renderer (>= 0.1.1.beta1, < 0.3)
activejob (7.1.4.1)
activesupport (= 7.1.4.1)
activejob (7.1.5.2)
activesupport (= 7.1.5.2)
globalid (>= 0.3.6)
activemodel (7.1.4.1)
activesupport (= 7.1.4.1)
activerecord (7.1.4.1)
activemodel (= 7.1.4.1)
activesupport (= 7.1.4.1)
activemodel (7.1.5.2)
activesupport (= 7.1.5.2)
activerecord (7.1.5.2)
activemodel (= 7.1.5.2)
activesupport (= 7.1.5.2)
timeout (>= 0.4.0)
activestorage (7.1.4.1)
actionpack (= 7.1.4.1)
activejob (= 7.1.4.1)
activerecord (= 7.1.4.1)
activesupport (= 7.1.4.1)
activestorage (7.1.5.2)
actionpack (= 7.1.5.2)
activejob (= 7.1.5.2)
activerecord (= 7.1.5.2)
activesupport (= 7.1.5.2)
marcel (~> 1.0)
activesupport (7.1.4.1)
activesupport (7.1.5.2)
base64
benchmark (>= 0.3)
bigdecimal
concurrent-ruby (~> 1.0, >= 1.0.2)
connection_pool (>= 2.2.5)
drb
i18n (>= 1.6, < 2)
logger (>= 1.4.2)
minitest (>= 5.1)
mutex_m
securerandom (>= 0.3)
tzinfo (~> 2.0)
addressable (2.8.7)
public_suffix (>= 2.0.2, < 7.0)
@@ -126,6 +129,7 @@ GEM
base64 (0.2.0)
bcp47_spec (0.2.1)
bcrypt (3.1.20)
benchmark (0.4.0)
better_errors (2.10.1)
erubi (>= 1.0.0)
rack (>= 0.9.0)
@@ -186,7 +190,7 @@ GEM
activerecord (>= 5.a)
database_cleaner-core (~> 2.0.0)
database_cleaner-core (2.0.1)
date (3.3.4)
date (3.4.1)
debug (1.9.2)
irb (~> 1.10)
reline (>= 0.3.8)
@@ -262,15 +266,15 @@ GEM
faraday (~> 1.0)
fast_blank (1.0.1)
fastimage (2.3.1)
ffi (1.16.3)
ffi (1.17.1)
ffi-compiler (1.3.2)
ffi (>= 1.15.5)
rake
flatware (2.3.3)
flatware (2.3.4)
drb
thor (< 2.0)
flatware-rspec (2.3.3)
flatware (= 2.3.3)
flatware-rspec (2.3.4)
flatware (= 2.3.4)
rspec (>= 3.6)
fog-core (2.5.0)
builder
@@ -406,7 +410,7 @@ GEM
llhttp-ffi (0.5.0)
ffi-compiler (~> 1.0)
rake (~> 13.0)
logger (1.6.1)
logger (1.6.6)
lograge (0.14.0)
actionpack (>= 4)
activesupport (>= 4)
@@ -433,7 +437,7 @@ GEM
mime-types-data (~> 3.2015)
mime-types-data (3.2024.0820)
mini_mime (1.1.5)
mini_portile2 (2.8.7)
mini_portile2 (2.8.9)
minitest (5.25.1)
msgpack (1.7.2)
multi_json (1.15.0)
@@ -443,7 +447,7 @@ GEM
uri
net-http-persistent (4.0.2)
connection_pool (~> 2.2)
net-imap (0.4.15)
net-imap (0.5.8)
date
net-protocol
net-ldap (0.19.0)
@@ -451,16 +455,16 @@ GEM
net-protocol
net-protocol (0.2.2)
timeout
net-smtp (0.5.0)
net-smtp (0.5.1)
net-protocol
nio4r (2.7.3)
nokogiri (1.16.7)
nokogiri (1.18.9)
mini_portile2 (~> 2.8.2)
racc (~> 1.4)
oj (3.16.6)
bigdecimal (>= 3.0)
ostruct (>= 0.2)
omniauth (2.1.2)
omniauth (2.1.3)
hashie (>= 3.4.6)
rack (>= 2.2.3)
rack-protection
@@ -471,9 +475,9 @@ GEM
omniauth-rails_csrf_protection (1.0.2)
actionpack (>= 4.2)
omniauth (~> 2.0)
omniauth-saml (2.2.1)
omniauth-saml (2.2.3)
omniauth (~> 2.1)
ruby-saml (~> 1.17)
ruby-saml (~> 1.18)
omniauth_openid_connect (0.6.1)
omniauth (>= 1.9, < 3)
openid_connect (~> 1.1)
@@ -488,7 +492,7 @@ GEM
validate_email
validate_url
webfinger (~> 1.2)
openssl (3.2.0)
openssl (3.2.2)
openssl-signature_algorithm (1.3.0)
openssl (> 2.0)
opentelemetry-api (1.4.0)
@@ -615,7 +619,7 @@ GEM
activesupport (>= 3.0.0)
raabro (1.4.0)
racc (1.8.1)
rack (2.2.9)
rack (2.2.20)
rack-attack (6.7.0)
rack (>= 1.0, < 4)
rack-cors (2.0.2)
@@ -638,20 +642,20 @@ GEM
rackup (1.0.0)
rack (< 3)
webrick
rails (7.1.4.1)
actioncable (= 7.1.4.1)
actionmailbox (= 7.1.4.1)
actionmailer (= 7.1.4.1)
actionpack (= 7.1.4.1)
actiontext (= 7.1.4.1)
actionview (= 7.1.4.1)
activejob (= 7.1.4.1)
activemodel (= 7.1.4.1)
activerecord (= 7.1.4.1)
activestorage (= 7.1.4.1)
activesupport (= 7.1.4.1)
rails (7.1.5.2)
actioncable (= 7.1.5.2)
actionmailbox (= 7.1.5.2)
actionmailer (= 7.1.5.2)
actionpack (= 7.1.5.2)
actiontext (= 7.1.5.2)
actionview (= 7.1.5.2)
activejob (= 7.1.5.2)
activemodel (= 7.1.5.2)
activerecord (= 7.1.5.2)
activestorage (= 7.1.5.2)
activesupport (= 7.1.5.2)
bundler (>= 1.15.0)
railties (= 7.1.4.1)
railties (= 7.1.5.2)
rails-controller-testing (1.0.5)
actionpack (>= 5.0.1.rc1)
actionview (>= 5.0.1.rc1)
@@ -660,15 +664,15 @@ GEM
activesupport (>= 5.0.0)
minitest
nokogiri (>= 1.6)
rails-html-sanitizer (1.6.0)
rails-html-sanitizer (1.6.2)
loofah (~> 2.21)
nokogiri (~> 1.14)
nokogiri (>= 1.15.7, != 1.16.7, != 1.16.6, != 1.16.5, != 1.16.4, != 1.16.3, != 1.16.2, != 1.16.1, != 1.16.0.rc1, != 1.16.0)
rails-i18n (7.0.9)
i18n (>= 0.7, < 2)
railties (>= 6.0.0, < 8)
railties (7.1.4.1)
actionpack (= 7.1.4.1)
activesupport (= 7.1.4.1)
railties (7.1.5.2)
actionpack (= 7.1.5.2)
activesupport (= 7.1.5.2)
irb
rackup (>= 1.0.0)
rake (>= 12.2)
@@ -698,7 +702,7 @@ GEM
responders (3.1.1)
actionpack (>= 5.2)
railties (>= 5.2)
rexml (3.3.8)
rexml (3.4.4)
rotp (6.3.0)
rouge (4.3.0)
rpam2 (4.0.2)
@@ -763,10 +767,10 @@ GEM
rubocop-rspec (~> 3, >= 3.0.1)
ruby-prof (1.7.0)
ruby-progressbar (1.13.0)
ruby-saml (1.17.0)
ruby-saml (1.18.1)
nokogiri (>= 1.13.10)
rexml
ruby-vips (2.2.2)
ruby-vips (2.2.3)
ffi (~> 1.12)
logger
ruby2_keywords (0.0.5)
@@ -781,6 +785,7 @@ GEM
scenic (1.8.0)
activerecord (>= 4.0.0)
railties (>= 4.0.0)
securerandom (0.4.1)
selenium-webdriver (4.25.0)
base64 (~> 0.2)
logger (~> 1.4)
@@ -835,9 +840,9 @@ GEM
terrapin (1.0.1)
climate_control
test-prof (1.4.2)
thor (1.3.2)
thor (1.4.0)
tilt (2.4.0)
timeout (0.4.1)
timeout (0.4.3)
tpm-key_attestation (0.12.1)
bindata (~> 2.4)
openssl (> 2.0)
@@ -863,7 +868,7 @@ GEM
unf_ext
unf_ext (0.0.9.1)
unicode-display_width (2.5.0)
uri (0.13.1)
uri (0.13.3)
validate_email (0.1.6)
activemodel (>= 3.0)
mail (>= 2.2.5)
@@ -895,7 +900,8 @@ GEM
semantic_range (>= 2.3.0)
webrick (1.8.2)
websocket (1.2.11)
websocket-driver (0.7.6)
websocket-driver (0.8.0)
base64
websocket-extensions (>= 0.1.0)
websocket-extensions (0.1.5)
wisper (2.0.1)
@@ -1054,10 +1060,11 @@ DEPENDENCIES
webmock (~> 3.18)
webpacker (~> 5.4)
webpush!
websocket-driver (~> 0.8)
xorcist (~> 1.1)
RUBY VERSION
ruby 3.3.4p94
BUNDLED WITH
2.5.18
2.6.5

View File

@@ -15,7 +15,7 @@ A "vulnerability in Mastodon" is a vulnerability in the code distributed through
| Version | Supported |
| ------- | ---------------- |
| 4.3.x | Yes |
| 4.2.x | Yes |
| 4.1.x | Until 2025-04-08 |
| < 4.1 | No |
| 4.4.x | Yes |
| 4.3.x | Until 2026-05-06 |
| 4.2.x | Until 2026-01-08 |
| < 4.2 | No |

View File

@@ -22,7 +22,7 @@ class ActivityPub::LikesController < ActivityPub::BaseController
def set_status
@status = @account.statuses.find(params[:status_id])
authorize @status, :show?
rescue Mastodon::NotPermittedError
rescue ActiveRecord::RecordNotFound, Mastodon::NotPermittedError
not_found
end

View File

@@ -25,7 +25,7 @@ class ActivityPub::RepliesController < ActivityPub::BaseController
def set_status
@status = @account.statuses.find(params[:status_id])
authorize @status, :show?
rescue Mastodon::NotPermittedError
rescue ActiveRecord::RecordNotFound, Mastodon::NotPermittedError
not_found
end

View File

@@ -22,7 +22,7 @@ class ActivityPub::SharesController < ActivityPub::BaseController
def set_status
@status = @account.statuses.find(params[:status_id])
authorize @status, :show?
rescue Mastodon::NotPermittedError
rescue ActiveRecord::RecordNotFound, Mastodon::NotPermittedError
not_found
end

View File

@@ -6,6 +6,7 @@ class Admin::AnnouncementsController < Admin::BaseController
def index
authorize :announcement, :index?
@published_announcements_count = Announcement.published.async_count
end
def new

View File

@@ -6,6 +6,7 @@ class Admin::Disputes::AppealsController < Admin::BaseController
def index
authorize :appeal, :index?
@pending_appeals_count = Appeal.pending.async_count
@appeals = filtered_appeals.page(params[:page])
end

View File

@@ -4,6 +4,7 @@ class Admin::Trends::Links::PreviewCardProvidersController < Admin::BaseControll
def index
authorize :preview_card_provider, :review?
@pending_preview_card_providers_count = PreviewCardProvider.unreviewed.async_count
@preview_card_providers = filtered_preview_card_providers.page(params[:page])
@form = Trends::PreviewCardProviderBatch.new
end

View File

@@ -4,6 +4,7 @@ class Admin::Trends::TagsController < Admin::BaseController
def index
authorize :tag, :review?
@pending_tags_count = Tag.pending_review.async_count
@tags = filtered_tags.page(params[:page])
@form = Trends::TagBatch.new
end

View File

@@ -72,6 +72,13 @@ class Api::BaseController < ApplicationController
end
end
# Redefine `require_functional!` to properly output JSON instead of HTML redirects
def require_functional!
return if current_user.functional?
require_user!
end
def render_empty
render json: {}, status: 200
end

View File

@@ -14,7 +14,7 @@ class Api::V1::Accounts::CredentialsController < Api::BaseController
@account = current_account
UpdateAccountService.new.call(@account, account_params, raise_error: true)
current_user.update(user_params) if user_params
ActivityPub::UpdateDistributionWorker.perform_async(@account.id)
ActivityPub::UpdateDistributionWorker.perform_in(ActivityPub::UpdateDistributionWorker::DEBOUNCE_DELAY, @account.id)
render json: @account, serializer: REST::CredentialAccountSerializer
rescue ActiveRecord::RecordInvalid => e
render json: ValidationErrorFormatter.new(e).as_json, status: 422

View File

@@ -16,6 +16,7 @@ class Api::V1::AccountsController < Api::BaseController
before_action :check_account_confirmation, except: [:index, :create]
before_action :check_enabled_registrations, only: [:create]
before_action :check_accounts_limit, only: [:index]
before_action :check_following_self, only: [:follow]
skip_before_action :require_authenticated_user!, only: :create
@@ -101,6 +102,10 @@ class Api::V1::AccountsController < Api::BaseController
raise(Mastodon::ValidationError) if account_ids.size > DEFAULT_ACCOUNTS_LIMIT
end
def check_following_self
render json: { error: I18n.t('accounts.self_follow_error') }, status: 403 if current_user.account.id == @account.id
end
def relationships(**options)
AccountRelationshipsPresenter.new([@account], current_user.account_id, **options)
end

View File

@@ -31,7 +31,7 @@ class Api::V1::Instances::DomainBlocksController < Api::V1::Instances::BaseContr
end
def show_domain_blocks_to_user?
Setting.show_domain_blocks == 'users' && user_signed_in?
Setting.show_domain_blocks == 'users' && user_signed_in? && current_user.functional_or_moved?
end
def set_domain_blocks
@@ -47,6 +47,6 @@ class Api::V1::Instances::DomainBlocksController < Api::V1::Instances::BaseContr
end
def show_rationale_for_user?
Setting.show_domain_blocks_rationale == 'users' && user_signed_in?
Setting.show_domain_blocks_rationale == 'users' && user_signed_in? && current_user.functional_or_moved?
end
end

View File

@@ -17,7 +17,7 @@ class Api::V1::Polls::VotesController < Api::BaseController
def set_poll
@poll = Poll.attached.find(params[:poll_id])
authorize @poll.status, :show?
rescue Mastodon::NotPermittedError
rescue ActiveRecord::RecordNotFound, Mastodon::NotPermittedError
not_found
end

View File

@@ -17,7 +17,7 @@ class Api::V1::PollsController < Api::BaseController
def set_poll
@poll = Poll.attached.find(params[:id])
authorize @poll.status, :show?
rescue Mastodon::NotPermittedError
rescue ActiveRecord::RecordNotFound, Mastodon::NotPermittedError
not_found
end

View File

@@ -7,7 +7,7 @@ class Api::V1::Profile::AvatarsController < Api::BaseController
def destroy
@account = current_account
UpdateAccountService.new.call(@account, { avatar: nil }, raise_error: true)
ActivityPub::UpdateDistributionWorker.perform_async(@account.id)
ActivityPub::UpdateDistributionWorker.perform_in(ActivityPub::UpdateDistributionWorker::DEBOUNCE_DELAY, @account.id)
render json: @account, serializer: REST::CredentialAccountSerializer
end
end

View File

@@ -7,7 +7,7 @@ class Api::V1::Profile::HeadersController < Api::BaseController
def destroy
@account = current_account
UpdateAccountService.new.call(@account, { header: nil }, raise_error: true)
ActivityPub::UpdateDistributionWorker.perform_async(@account.id)
ActivityPub::UpdateDistributionWorker.perform_in(ActivityPub::UpdateDistributionWorker::DEBOUNCE_DELAY, @account.id)
render json: @account, serializer: REST::CredentialAccountSerializer
end
end

View File

@@ -10,7 +10,7 @@ class Api::V1::Statuses::BaseController < Api::BaseController
def set_status
@status = Status.find(params[:status_id])
authorize @status, :show?
rescue Mastodon::NotPermittedError
rescue ActiveRecord::RecordNotFound, Mastodon::NotPermittedError
not_found
end
end

View File

@@ -23,7 +23,7 @@ class Api::V1::Statuses::BookmarksController < Api::V1::Statuses::BaseController
bookmark&.destroy!
render json: @status, serializer: REST::StatusSerializer, relationships: StatusRelationshipsPresenter.new([@status], current_account.id, bookmarks_map: { @status.id => false })
rescue Mastodon::NotPermittedError
rescue ActiveRecord::RecordNotFound, Mastodon::NotPermittedError
not_found
end
end

View File

@@ -25,7 +25,7 @@ class Api::V1::Statuses::FavouritesController < Api::V1::Statuses::BaseControlle
relationships = StatusRelationshipsPresenter.new([@status], current_account.id, favourites_map: { @status.id => false }, attributes_map: { @status.id => { favourites_count: count } })
render json: @status, serializer: REST::StatusSerializer, relationships: relationships
rescue Mastodon::NotPermittedError
rescue ActiveRecord::RecordNotFound, Mastodon::NotPermittedError
not_found
end
end

View File

@@ -36,7 +36,7 @@ class Api::V1::Statuses::ReblogsController < Api::V1::Statuses::BaseController
relationships = StatusRelationshipsPresenter.new([@status], current_account.id, reblogs_map: { @reblog.id => false }, attributes_map: { @reblog.id => { reblogs_count: count } })
render json: @reblog, serializer: REST::StatusSerializer, relationships: relationships
rescue Mastodon::NotPermittedError
rescue ActiveRecord::RecordNotFound, Mastodon::NotPermittedError
not_found
end
@@ -45,7 +45,7 @@ class Api::V1::Statuses::ReblogsController < Api::V1::Statuses::BaseController
def set_reblog
@reblog = Status.find(params[:status_id])
authorize @reblog, :show?
rescue Mastodon::NotPermittedError
rescue ActiveRecord::RecordNotFound, Mastodon::NotPermittedError
not_found
end

View File

@@ -127,7 +127,7 @@ class Api::V1::StatusesController < Api::BaseController
def set_status
@status = Status.find(params[:id])
authorize @status, :show?
rescue Mastodon::NotPermittedError
rescue ActiveRecord::RecordNotFound, Mastodon::NotPermittedError
not_found
end

View File

@@ -46,7 +46,7 @@ class Api::V2::NotificationsController < Api::BaseController
end
def show
@notification = current_account.notifications.without_suspended.find_by!(group_key: params[:group_key])
@notification = current_account.notifications.without_suspended.by_group_key(params[:group_key]).take!
presenter = GroupedNotificationsPresenter.new(NotificationGroup.from_notifications([@notification]))
render json: presenter, serializer: REST::DedupNotificationGroupSerializer
end
@@ -57,7 +57,7 @@ class Api::V2::NotificationsController < Api::BaseController
end
def dismiss
current_account.notifications.where(group_key: params[:group_key]).destroy_all
current_account.notifications.by_group_key(params[:group_key]).destroy_all
render_empty
end
@@ -80,10 +80,31 @@ class Api::V2::NotificationsController < Api::BaseController
return [] if @notifications.empty?
MastodonOTELTracer.in_span('Api::V2::NotificationsController#load_grouped_notifications') do
NotificationGroup.from_notifications(@notifications, pagination_range: (@notifications.last.id)..(@notifications.first.id), grouped_types: params[:grouped_types])
pagination_range = (@notifications.last.id)..@notifications.first.id
# If the page is incomplete, we know we are on the last page
if incomplete_page?
if paginating_up?
pagination_range = @notifications.last.id...(params[:max_id]&.to_i)
else
range_start = params[:since_id]&.to_i
range_start += 1 unless range_start.nil?
pagination_range = range_start..(@notifications.first.id)
end
end
NotificationGroup.from_notifications(@notifications, pagination_range: pagination_range, grouped_types: params[:grouped_types])
end
end
def incomplete_page?
@notifications.size < limit_param(DEFAULT_NOTIFICATIONS_LIMIT)
end
def paginating_up?
params[:min_id].present?
end
def browserable_account_notifications
current_account.notifications.without_suspended.browserable(
types: Array(browserable_params[:types]),

View File

@@ -30,7 +30,7 @@ class Api::Web::EmbedsController < Api::Web::BaseController
def set_status
@status = Status.find(params[:id])
authorize @status, :show?
rescue Mastodon::NotPermittedError
rescue ActiveRecord::RecordNotFound, Mastodon::NotPermittedError
not_found
end
end

View File

@@ -74,7 +74,23 @@ class ApplicationController < ActionController::Base
end
def require_functional!
redirect_to edit_user_registration_path unless current_user.functional?
return if current_user.functional?
respond_to do |format|
format.any do
redirect_to edit_user_registration_path
end
format.json do
if !current_user.confirmed?
render json: { error: 'Your login is missing a confirmed e-mail address' }, status: 403
elsif !current_user.approved?
render json: { error: 'Your login is currently pending approval' }, status: 403
elsif !current_user.functional?
render json: { error: 'Your login is currently disabled' }, status: 403
end
end
end
end
def skip_csrf_meta_tags?

View File

@@ -21,7 +21,7 @@ class AuthorizeInteractionsController < ApplicationController
def set_resource
@resource = located_resource
authorize(@resource, :show?) if @resource.is_a?(Status)
rescue Mastodon::NotPermittedError
rescue ActiveRecord::RecordNotFound, Mastodon::NotPermittedError
not_found
end

View File

@@ -9,13 +9,15 @@ class BackupsController < ApplicationController
before_action :authenticate_user!
before_action :set_backup
BACKUP_LINK_TIMEOUT = 1.hour.freeze
def download
case Paperclip::Attachment.default_options[:storage]
when :s3, :azure
redirect_to @backup.dump.expiring_url(10), allow_other_host: true
redirect_to @backup.dump.expiring_url(BACKUP_LINK_TIMEOUT.to_i), allow_other_host: true
when :fog
if Paperclip::Attachment.default_options.dig(:fog_credentials, :openstack_temp_url_key).present?
redirect_to @backup.dump.expiring_url(Time.now.utc + 10), allow_other_host: true
redirect_to @backup.dump.expiring_url(BACKUP_LINK_TIMEOUT.from_now), allow_other_host: true
else
redirect_to full_asset_url(@backup.dump.url), allow_other_host: true
end

View File

@@ -117,7 +117,7 @@ module SignatureVerification
def verify_signature_strength!
raise SignatureVerificationError, 'Mastodon requires the Date header or (created) pseudo-header to be signed' unless signed_headers.include?('date') || signed_headers.include?('(created)')
raise SignatureVerificationError, 'Mastodon requires the Digest header or (request-target) pseudo-header to be signed' unless signed_headers.include?(Request::REQUEST_TARGET) || signed_headers.include?('digest')
raise SignatureVerificationError, 'Mastodon requires the Digest header or (request-target) pseudo-header to be signed' unless signed_headers.include?(HttpSignatureDraft::REQUEST_TARGET) || signed_headers.include?('digest')
raise SignatureVerificationError, 'Mastodon requires the Host header to be signed when doing a GET request' if request.get? && !signed_headers.include?('host')
raise SignatureVerificationError, 'Mastodon requires the Digest header to be signed when doing a POST request' if request.post? && !signed_headers.include?('digest')
end
@@ -155,14 +155,14 @@ module SignatureVerification
def build_signed_string(include_query_string: true)
signed_headers.map do |signed_header|
case signed_header
when Request::REQUEST_TARGET
when HttpSignatureDraft::REQUEST_TARGET
if include_query_string
"#{Request::REQUEST_TARGET}: #{request.method.downcase} #{request.original_fullpath}"
"#{HttpSignatureDraft::REQUEST_TARGET}: #{request.method.downcase} #{request.original_fullpath}"
else
# Current versions of Mastodon incorrectly omit the query string from the (request-target) pseudo-header.
# Therefore, temporarily support such incorrect signatures for compatibility.
# TODO: remove eventually some time after release of the fixed version
"#{Request::REQUEST_TARGET}: #{request.method.downcase} #{request.path}"
"#{HttpSignatureDraft::REQUEST_TARGET}: #{request.method.downcase} #{request.path}"
end
when '(created)'
raise SignatureVerificationError, 'Invalid pseudo-header (created) for rsa-sha256' unless signature_algorithm == 'hs2019'

View File

@@ -34,7 +34,7 @@ class MediaController < ApplicationController
def verify_permitted_status!
authorize @media_attachment.status, :show?
rescue Mastodon::NotPermittedError
rescue ActiveRecord::RecordNotFound, Mastodon::NotPermittedError
not_found
end

View File

@@ -8,7 +8,7 @@ module Settings
def destroy
if valid_picture?
if UpdateAccountService.new.call(@account, { @picture => nil, "#{@picture}_remote_url" => '' })
ActivityPub::UpdateDistributionWorker.perform_async(@account.id)
ActivityPub::UpdateDistributionWorker.perform_in(ActivityPub::UpdateDistributionWorker::DEBOUNCE_DELAY, @account.id)
redirect_to settings_profile_path, notice: I18n.t('generic.changes_saved_msg'), status: 303
else
redirect_to settings_profile_path

View File

@@ -8,7 +8,7 @@ class Settings::PrivacyController < Settings::BaseController
def update
if UpdateAccountService.new.call(@account, account_params.except(:settings))
current_user.update!(settings_attributes: account_params[:settings])
ActivityPub::UpdateDistributionWorker.perform_async(@account.id)
ActivityPub::UpdateDistributionWorker.perform_in(ActivityPub::UpdateDistributionWorker::DEBOUNCE_DELAY, @account.id)
redirect_to settings_privacy_path, notice: I18n.t('generic.changes_saved_msg')
else
render :show

View File

@@ -9,7 +9,7 @@ class Settings::ProfilesController < Settings::BaseController
def update
if UpdateAccountService.new.call(@account, account_params)
ActivityPub::UpdateDistributionWorker.perform_async(@account.id)
ActivityPub::UpdateDistributionWorker.perform_in(ActivityPub::UpdateDistributionWorker::DEBOUNCE_DELAY, @account.id)
redirect_to settings_profile_path, notice: I18n.t('generic.changes_saved_msg')
else
@account.build_fields

View File

@@ -8,7 +8,7 @@ class Settings::VerificationsController < Settings::BaseController
def update
if UpdateAccountService.new.call(@account, account_params)
ActivityPub::UpdateDistributionWorker.perform_async(@account.id)
ActivityPub::UpdateDistributionWorker.perform_in(ActivityPub::UpdateDistributionWorker::DEBOUNCE_DELAY, @account.id)
redirect_to settings_verification_path, notice: I18n.t('generic.changes_saved_msg')
else
render :show

View File

@@ -59,7 +59,7 @@ class StatusesController < ApplicationController
def set_status
@status = @account.statuses.find(params[:id])
authorize @status, :show?
rescue Mastodon::NotPermittedError
rescue ActiveRecord::RecordNotFound, Mastodon::NotPermittedError
not_found
end

View File

@@ -2,11 +2,18 @@
module Admin::Trends::StatusesHelper
def one_line_preview(status)
text = if status.local?
status.text.split("\n").first
else
Nokogiri::HTML5(status.text).css('html > body > *').first&.text
end
text = begin
if status.local?
status.text.split("\n").first
else
Nokogiri::HTML5(status.text).css('html > body > *').first&.text
end
rescue ArgumentError
# This can happen if one of the Nokogumbo limits is encountered
# Unfortunately, it does not use a more precise error class
# nor allows more graceful handling
''
end
return '' if text.blank?

View File

@@ -79,7 +79,7 @@ module ApplicationHelper
def html_title
safe_join(
[content_for(:page_title).to_s.chomp, title]
[content_for(:page_title), title]
.compact_blank,
' - '
)

View File

@@ -26,6 +26,13 @@ module ContextHelper
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' } },
interaction_policies: {
'gts' => 'https://gotosocial.org/ns#',
'interactionPolicy' => { '@id' => 'gts:interactionPolicy', '@type' => '@id' },
'canQuote' => { '@id' => 'gts:canQuote', '@type' => '@id' },
'automaticApproval' => { '@id' => 'gts:automaticApproval', '@type' => '@id' },
'manualApproval' => { '@id' => 'gts:manualApproval', '@type' => '@id' },
},
}.freeze
def full_context

View File

@@ -26,6 +26,8 @@ module JsonLdHelper
# The url attribute can be a string, an array of strings, or an array of objects.
# The objects could include a mimeType. Not-included mimeType means it's text/html.
def url_to_href(value, preferred_type = nil)
value = [value] if value.is_a?(Hash)
single_value = if value.is_a?(Array) && !value.first.is_a?(String)
value.find { |link| preferred_type.nil? || ((link['mimeType'].presence || 'text/html') == preferred_type) }
elsif value.is_a?(Array)
@@ -41,6 +43,15 @@ module JsonLdHelper
end
end
def url_to_media_type(value, preferred_type = nil)
value = [value] if value.is_a?(Hash)
return unless value.is_a?(Array) && !value.first.is_a?(String)
single_value = value.find { |link| preferred_type.nil? || ((link['mimeType'].presence || 'text/html') == preferred_type) }
single_value['mediaType'] unless single_value.nil?
end
def as_array(value)
if value.nil?
[]

View File

@@ -162,7 +162,7 @@ module LanguagesHelper
th: ['Thai', 'ไทย'].freeze,
ti: ['Tigrinya', 'ትግርኛ'].freeze,
tk: ['Turkmen', 'Türkmen'].freeze,
tl: ['Tagalog', 'Wikang Tagalog'].freeze,
tl: ['Tagalog', 'Tagalog'].freeze,
tn: ['Tswana', 'Setswana'].freeze,
to: ['Tonga', 'faka Tonga'].freeze,
tr: ['Turkish', 'Türkçe'].freeze,

View File

@@ -4,9 +4,12 @@ import axios from 'axios';
import ready from '../mastodon/ready';
async function checkConfirmation() {
const response = await axios.get('/api/v1/emails/check_confirmation');
const response = await axios.get('/api/v1/emails/check_confirmation', {
headers: { Accept: 'application/json' },
withCredentials: true,
});
if (response.data) {
if (response.status === 200 && response.data === true) {
window.location.href = '/start';
}
}

View File

@@ -102,12 +102,17 @@ export const ensureComposeIsVisible = (getState) => {
};
export function setComposeToStatus(status, text, spoiler_text, content_type) {
return{
type: COMPOSE_SET_STATUS,
status,
text,
spoiler_text,
content_type,
return (dispatch, getState) => {
const maxOptions = getState().server.getIn(['server', 'configuration', 'polls', 'max_options']);
dispatch({
type: COMPOSE_SET_STATUS,
status,
text,
spoiler_text,
content_type,
maxOptions
});
};
}

View File

@@ -72,6 +72,17 @@ export function normalizeStatus(status, normalOldStatus, settings) {
normalStatus.contentHtml = emojify(normalStatus.content, emojiMap);
normalStatus.spoilerHtml = emojify(escapeTextContentForBrowser(spoilerText), emojiMap);
normalStatus.hidden = (spoilerText.length > 0 || normalStatus.sensitive) && autoHideCW(settings, spoilerText);
if (normalStatus.url && !(normalStatus.url.startsWith('http://') || normalStatus.url.startsWith('https://'))) {
normalStatus.url = null;
}
normalStatus.url ||= normalStatus.uri;
normalStatus.media_attachments.forEach(item => {
if (item.remote_url && !(item.remote_url.startsWith('http://') || item.remote_url.startsWith('https://')))
item.remote_url = null;
});
}
if (normalOldStatus) {

View File

@@ -141,6 +141,9 @@ export const pollRecentNotifications = createDataLoadingThunk(
return { notifications };
},
{
useLoadingBar: false,
},
);
export const processNewNotificationForGroups = createAppAsyncThunk(

View File

@@ -90,11 +90,16 @@ export function fetchStatusFail(id, error, skipLoading) {
}
export function redraft(status, raw_text, content_type) {
return {
type: REDRAFT,
status,
raw_text,
content_type,
return (dispatch, getState) => {
const maxOptions = getState().server.getIn(['server', 'configuration', 'polls', 'max_options']);
dispatch({
type: REDRAFT,
status,
raw_text,
content_type,
maxOptions,
});
};
}

View File

@@ -1,10 +1,11 @@
import { apiRequestPost } from 'flavours/glitch/api';
import type { Status, StatusVisibility } from 'flavours/glitch/models/status';
import type { ApiStatusJSON } from 'flavours/glitch/api_types/statuses';
import type { StatusVisibility } from 'flavours/glitch/models/status';
export const apiReblog = (statusId: string, visibility: StatusVisibility) =>
apiRequestPost<{ reblog: Status }>(`v1/statuses/${statusId}/reblog`, {
apiRequestPost<{ reblog: ApiStatusJSON }>(`v1/statuses/${statusId}/reblog`, {
visibility,
});
export const apiUnreblog = (statusId: string) =>
apiRequestPost<Status>(`v1/statuses/${statusId}/unreblog`);
apiRequestPost<ApiStatusJSON>(`v1/statuses/${statusId}/unreblog`);

View File

@@ -28,6 +28,7 @@ export const AltTextBadge: React.FC<{
return (
<>
<button
type='button'
ref={anchorRef}
className='media-gallery__alt__label'
onClick={handleClick}

View File

@@ -19,6 +19,7 @@ export const CollapseButton = ({ collapsed, setCollapsed }) => {
if (e.button === 0) {
setCollapsed(!collapsed);
e.preventDefault();
e.stopPropagation();
}
}, [collapsed, setCollapsed]);

View File

@@ -17,9 +17,15 @@ export const ContentWarning: React.FC<{
aria-expanded={expanded}
>
{expanded ? (
<FormattedMessage id='status.show_less' defaultMessage='Show less' />
<FormattedMessage
id='content_warning.hide'
defaultMessage='Hide post'
/>
) : (
<FormattedMessage id='status.show_more' defaultMessage='Show more' />
<FormattedMessage
id='content_warning.show_more'
defaultMessage='Show more'
/>
)}
{icons}
</button>

View File

@@ -10,13 +10,16 @@ export const FilterWarning: React.FC<{
<StatusBanner
expanded={expanded}
onClick={onClick}
variant={BannerVariant.Blue}
variant={BannerVariant.Filter}
>
<p>
<FormattedMessage
id='filter_warning.matches_filter'
defaultMessage='Matches filter “{title}”'
values={{ title }}
defaultMessage='Matches filter “<span>{title}</span>”'
values={{
title,
span: (chunks) => <span className='filter-name'>{chunks}</span>,
}}
/>
</p>
</StatusBanner>

View File

@@ -98,12 +98,12 @@ class Item extends PureComponent {
height = 50;
}
if (attachment.get('description')?.length > 0) {
badges.push(<AltTextBadge key='alt' description={attachment.get('description')} />);
}
const description = attachment.getIn(['translation', 'description']) || attachment.get('description');
if (description?.length > 0) {
badges.push(<AltTextBadge key='alt' description={description} />);
}
if (attachment.get('type') === 'unknown') {
return (
<div className={classNames('media-gallery__item', { standalone, 'media-gallery__item--tall': height === 100, 'media-gallery__item--wide': width === 100 })} key={attachment.get('id')}>

View File

@@ -372,26 +372,29 @@ class Status extends ImmutablePureComponent {
const { isCollapsed } = this.state;
if (!history) return;
if (e.button === 0 && !(e.ctrlKey || e.altKey || e.metaKey)) {
if (isCollapsed) this.setCollapsed(false);
else if (e.shiftKey) {
this.setCollapsed(true);
document.getSelection().removeAllRanges();
} else if (this.props.onClick) {
this.props.onClick();
return;
} else {
if (destination === undefined) {
destination = `/@${
status.getIn(['reblog', 'account', 'acct'], status.getIn(['account', 'acct']))
}/${
status.getIn(['reblog', 'id'], status.get('id'))
}`;
}
history.push(destination);
}
e.preventDefault();
if (e.button !== 0 || e.ctrlKey || e.altKey || e.metaKey) {
return;
}
if (isCollapsed) this.setCollapsed(false);
else if (e.shiftKey) {
this.setCollapsed(true);
document.getSelection().removeAllRanges();
} else if (this.props.onClick) {
this.props.onClick();
return;
} else {
if (destination === undefined) {
destination = `/@${
status.getIn(['reblog', 'account', 'acct'], status.getIn(['account', 'acct']))
}/${
status.getIn(['reblog', 'id'], status.get('id'))
}`;
}
history.push(destination);
}
e.preventDefault();
};
handleToggleMediaVisibility = () => {
@@ -648,7 +651,7 @@ class Status extends ImmutablePureComponent {
media={status.get('media_attachments')}
/>,
);
} else if (['image', 'gifv'].includes(status.getIn(['media_attachments', 0, 'type'])) || status.get('media_attachments').size > 1) {
} else if (['image', 'gifv', 'unknown'].includes(status.getIn(['media_attachments', 0, 'type'])) || status.get('media_attachments').size > 1) {
media.push(
<Bundle fetchComponent={MediaGallery} loading={this.renderLoadingMediaGallery}>
{Component => (
@@ -806,7 +809,8 @@ class Status extends ImmutablePureComponent {
{(connectReply || connectUp || connectToRoot) && <div className={classNames('status__line', { 'status__line--full': connectReply, 'status__line--first': !status.get('in_reply_to_id') && !connectToRoot })} />}
{(!muted || !isCollapsed) && (
<header className='status__info'>
/* eslint-disable-next-line jsx-a11y/no-static-element-interactions */
<header onClick={this.parseClick} className='status__info'>
<StatusHeader
status={status}
friend={account}

View File

@@ -1,8 +1,8 @@
import { FormattedMessage } from 'react-intl';
export enum BannerVariant {
Yellow = 'yellow',
Blue = 'blue',
Warning = 'warning',
Filter = 'filter',
}
export const StatusBanner: React.FC<{
@@ -11,9 +11,9 @@ export const StatusBanner: React.FC<{
expanded?: boolean;
onClick?: () => void;
}> = ({ children, variant, expanded, onClick }) => (
<div
<label
className={
variant === BannerVariant.Yellow
variant === BannerVariant.Warning
? 'content-warning'
: 'content-warning content-warning--filter'
}
@@ -26,6 +26,11 @@ export const StatusBanner: React.FC<{
id='content_warning.hide'
defaultMessage='Hide post'
/>
) : variant === BannerVariant.Warning ? (
<FormattedMessage
id='content_warning.show_more'
defaultMessage='Show more'
/>
) : (
<FormattedMessage
id='content_warning.show'
@@ -33,5 +38,5 @@ export const StatusBanner: React.FC<{
/>
)}
</button>
</div>
</label>
);

View File

@@ -18,15 +18,10 @@ export default class StatusHeader extends PureComponent {
parseClick: PropTypes.func.isRequired,
};
// Handles clicks on account name/image
handleClick = (acct, e) => {
const { parseClick } = this.props;
parseClick(e, `/@${acct}`);
};
handleAccountClick = (e) => {
const { status } = this.props;
this.handleClick(status.getIn(['account', 'acct']), e);
const { status, parseClick } = this.props;
parseClick(e, `/@${status.getIn(['account', 'acct'])}`);
e.stopPropagation();
};
// Rendering.

View File

@@ -1,6 +1,7 @@
import { Provider } from 'react-redux';
import { fetchCustomEmojis } from 'flavours/glitch/actions/custom_emojis';
import { fetchServer } from 'flavours/glitch/actions/server';
import { hydrateStore } from 'flavours/glitch/actions/store';
import { Router } from 'flavours/glitch/components/router';
import Compose from 'flavours/glitch/features/standalone/compose';
@@ -13,6 +14,7 @@ if (initialState) {
}
store.dispatch(fetchCustomEmojis());
store.dispatch(fetchServer());
const ComposeContainer = () => (
<IntlProvider>

View File

@@ -4,9 +4,12 @@ import axios from 'axios';
import ready from 'flavours/glitch/ready';
async function checkConfirmation() {
const response = await axios.get('/api/v1/emails/check_confirmation');
const response = await axios.get('/api/v1/emails/check_confirmation', {
headers: { Accept: 'application/json' },
withCredentials: true,
});
if (response.data) {
if (response.status === 200 && response.data === true) {
window.location.href = '/start';
}
}

View File

@@ -100,6 +100,7 @@ class Bookmarks extends ImmutablePureComponent {
onLoadMore={this.handleLoadMore}
emptyMessage={emptyMessage}
bindToDocument={!multiColumn}
timelineId='bookmarks'
/>
<Helmet>

View File

@@ -97,30 +97,30 @@ const emojifyTextNode = (node, customEmojis) => {
const { filename, shortCode } = unicodeMapping[unicode_emoji];
const title = shortCode ? `:${shortCode}:` : '';
replacement = document.createElement('picture');
const isSystemTheme = !!document.body?.classList.contains('theme-system');
if(isSystemTheme) {
let source = document.createElement('source');
source.setAttribute('media', '(prefers-color-scheme: dark)');
source.setAttribute('srcset', `${assetHost}/emoji/${emojiFilename(filename, "dark")}.svg`);
replacement.appendChild(source);
}
const theme = (isSystemTheme || document.body?.classList.contains('theme-mastodon-light')) ? 'light' : 'dark';
let img = document.createElement('img');
const imageFilename = emojiFilename(filename, theme);
const img = document.createElement('img');
img.setAttribute('draggable', 'false');
img.setAttribute('class', 'emojione');
img.setAttribute('alt', unicode_emoji);
img.setAttribute('title', title);
img.setAttribute('src', `${assetHost}/emoji/${imageFilename}.svg`);
let theme = "light";
if (isSystemTheme && imageFilename !== emojiFilename(filename, 'dark')) {
replacement = document.createElement('picture');
if(!isSystemTheme && !document.body?.classList.contains('skin-mastodon-light'))
theme = "dark";
img.setAttribute('src', `${assetHost}/emoji/${emojiFilename(filename, theme)}.svg`);
replacement.appendChild(img);
const source = document.createElement('source');
source.setAttribute('media', '(prefers-color-scheme: dark)');
source.setAttribute('srcset', `${assetHost}/emoji/${emojiFilename(filename, 'dark')}.svg`);
replacement.appendChild(source);
replacement.appendChild(img);
} else {
replacement = img;
}
}
// Add the processed-up-to-now string and the emoji replacement
@@ -135,7 +135,7 @@ const emojifyTextNode = (node, customEmojis) => {
};
const emojifyNode = (node, customEmojis) => {
for (const child of node.childNodes) {
for (const child of Array.from(node.childNodes)) {
switch(child.nodeType) {
case Node.TEXT_NODE:
emojifyTextNode(child, customEmojis);

View File

@@ -100,6 +100,7 @@ class Favourites extends ImmutablePureComponent {
onLoadMore={this.handleLoadMore}
emptyMessage={emptyMessage}
bindToDocument={!multiColumn}
timelineId='favourites'
/>
<Helmet>

View File

@@ -169,6 +169,15 @@ class LocalSettingsPage extends PureComponent {
<FormattedMessage id='settings.wide_view' defaultMessage='Wide view (Desktop mode only)' />
<span className='hint'><FormattedMessage id='settings.wide_view_hint' defaultMessage='Stretches columns to better fill the available space.' /></span>
</LocalSettingsPageItem>
<LocalSettingsPageItem
settings={settings}
item={['fullwidth_columns']}
id='mastodon-settings--fullwidth_columns'
onChange={onChange}
>
<FormattedMessage id='settings.fullwidth_view' defaultMessage='Stretch columns to full width (Desktop mode only)' />
<span className='hint'><FormattedMessage id='settings.fullwidth_view_hint' defaultMessage='Stretches columns to fill all the available space.' /></span>
</LocalSettingsPageItem>
</section>
</div>
),

View File

@@ -26,18 +26,23 @@ const getHostname = url => {
const domParser = new DOMParser();
const addAutoPlay = html => {
const handleIframeUrl = (html, url, providerName) => {
const document = domParser.parseFromString(html, 'text/html').documentElement;
const iframe = document.querySelector('iframe');
const startTime = new URL(url).searchParams.get('t');
if (iframe) {
if (iframe.src.indexOf('?') !== -1) {
iframe.src += '&';
} else {
iframe.src += '?';
const iframeUrl = new URL(iframe.src);
iframeUrl.searchParams.set('autoplay', 1);
iframeUrl.searchParams.set('auto_play', 1);
if (providerName === 'YouTube') {
iframeUrl.searchParams.set('start', startTime || '');
iframe.referrerPolicy = 'strict-origin-when-cross-origin';
}
iframe.src += 'autoplay=1&auto_play=1';
iframe.src = iframeUrl.href;
// DOM parser creates html/body elements around original HTML fragment,
// so we need to get innerHTML out of the body and not the entire document
@@ -103,7 +108,7 @@ export default class Card extends PureComponent {
renderVideo () {
const { card } = this.props;
const content = { __html: addAutoPlay(card.get('html')) };
const content = { __html: handleIframeUrl(card.get('html'), card.get('url'), card.get('provider_name')) };
return (
<div

View File

@@ -14,6 +14,7 @@ import { Link } from 'react-router-dom';
import { AnimatedNumber } from 'flavours/glitch/components/animated_number';
import AttachmentList from 'flavours/glitch/components/attachment_list';
import EditedTimestamp from 'flavours/glitch/components/edited_timestamp';
import { FilterWarning } from 'flavours/glitch/components/filter_warning';
import type { StatusLike } from 'flavours/glitch/components/hashtag_bar';
import { getHashtagBarForStatus } from 'flavours/glitch/components/hashtag_bar';
import { IconLogo } from 'flavours/glitch/components/logo';
@@ -72,6 +73,7 @@ export const DetailedStatus: React.FC<{
}) => {
const properStatus = status?.get('reblog') ?? status;
const [height, setHeight] = useState(0);
const [showDespiteFilter, setShowDespiteFilter] = useState(false);
const nodeRef = useRef<HTMLDivElement>();
const history = useAppHistory();
@@ -108,6 +110,10 @@ export const DetailedStatus: React.FC<{
[onOpenVideo, status],
);
const handleFilterToggle = useCallback(() => {
setShowDespiteFilter(!showDespiteFilter);
}, [showDespiteFilter, setShowDespiteFilter]);
const _measureHeight = useCallback(
(heightJustChanged?: boolean) => {
if (measureHeight && nodeRef.current) {
@@ -196,7 +202,7 @@ export const DetailedStatus: React.FC<{
) {
media.push(<AttachmentList media={status.get('media_attachments')} />);
} else if (
['image', 'gifv'].includes(
['image', 'gifv', 'unknown'].includes(
status.getIn(['media_attachments', 0, 'type']) as string,
) ||
status.get('media_attachments').size > 1
@@ -273,12 +279,12 @@ export const DetailedStatus: React.FC<{
);
mediaIcons.push('video-camera');
}
} else if (status.get('spoiler_text').length === 0) {
} else if (status.get('card')) {
media.push(
<Card
sensitive={status.get('sensitive')}
onOpenMedia={onOpenMedia}
card={status.get('card', null)}
card={status.get('card')}
/>,
);
mediaIcons.push('link');
@@ -358,6 +364,8 @@ export const DetailedStatus: React.FC<{
);
contentMedia.push(hashtagBar);
const matchedFilters = status.get('matched_filters');
return (
<div style={outerStyle}>
<div
@@ -386,22 +394,32 @@ export const DetailedStatus: React.FC<{
)}
</Permalink>
<StatusContent
status={status}
media={contentMedia}
extraMedia={extraMedia}
mediaIcons={contentMediaIcons}
expanded={expanded}
collapsed={false}
onExpandedToggle={onToggleHidden}
onTranslate={handleTranslate}
onUpdate={handleChildUpdate}
tagLinks={tagMisleadingLinks}
rewriteMentions={rewriteMentions}
parseClick={parseClick}
disabled
{...(statusContentProps as any)}
/>
{matchedFilters && (
<FilterWarning
title={matchedFilters.join(', ')}
expanded={showDespiteFilter}
onClick={handleFilterToggle}
/>
)}
{(!matchedFilters || showDespiteFilter) && (
<StatusContent
status={status}
media={contentMedia}
extraMedia={extraMedia}
mediaIcons={contentMediaIcons}
expanded={expanded}
collapsed={false}
onExpandedToggle={onToggleHidden}
onTranslate={handleTranslate}
onUpdate={handleChildUpdate}
tagLinks={tagMisleadingLinks}
rewriteMentions={rewriteMentions}
parseClick={parseClick}
disabled
{...(statusContentProps as any)}
/>
)}
<div className='detailed-status__meta'>
<div className='detailed-status__meta__line'>

View File

@@ -133,7 +133,7 @@ const makeMapStateToProps = () => {
});
const mapStateToProps = (state, props) => {
const status = getStatus(state, { id: props.params.statusId });
const status = getStatus(state, { id: props.params.statusId, contextType: 'detailed' });
let ancestorsIds = Immutable.List();
let descendantsIds = Immutable.List();

View File

@@ -136,6 +136,8 @@ export const BoostModal: React.FC<{
? messages.cancel_reblog
: messages.reblog,
)}
/* eslint-disable-next-line jsx-a11y/no-autofocus -- We are in the modal */
autoFocus
/>
</div>
</div>

View File

@@ -91,6 +91,7 @@ const mapStateToProps = state => ({
hasMediaAttachments: state.getIn(['compose', 'media_attachments']).size > 0,
canUploadMore: !state.getIn(['compose', 'media_attachments']).some(x => ['audio', 'video'].includes(x.get('type'))) && state.getIn(['compose', 'media_attachments']).size < 4,
isWide: state.getIn(['local_settings', 'stretch']),
fullWidthColumns: state.getIn(['local_settings', 'fullwidth_columns']),
unreadNotifications: selectUnreadNotificationGroupsCount(state),
showFaviconBadge: state.getIn(['local_settings', 'notifications', 'favicon_badge']),
hicolorPrivacyIcons: state.getIn(['local_settings', 'hicolor_privacy_icons']),
@@ -270,6 +271,7 @@ class UI extends PureComponent {
dispatch: PropTypes.func.isRequired,
children: PropTypes.node,
isWide: PropTypes.bool,
fullWidthColumns: PropTypes.bool,
systemFontUi: PropTypes.bool,
isComposing: PropTypes.bool,
hasComposingText: PropTypes.bool,
@@ -608,6 +610,7 @@ class UI extends PureComponent {
const className = classNames('ui', {
'wide': isWide,
'fullwidth-columns': this.props.fullWidthColumns,
'system-font': this.props.systemFontUi,
'hicolor-privacy-icons': this.props.hicolorPrivacyIcons,
});

View File

@@ -1,17 +1,55 @@
{
"about.fork_disclaimer": "Glitch-soc je svobodný software s otevřeným zdrojovým kódem založený na Mastodonu.",
"account.disclaimer_full": "Níže uvedené informace mohou popisovat uživatelský profil neúplně.",
"account.follows": "Sleduje",
"account.follows_you": "Sleduje vás",
"account.suspended_disclaimer_full": "Tento uživatel byl pozastaven moderátorem.",
"account.view_full_profile": "Zobrazit celý profil",
"boost_modal.missing_description": "Příspěvek obsahuje obrázky bez popisků",
"column.favourited_by": "Oblíbeno uživatelem",
"column.heading": "Různé",
"column.reblogged_by": "Boostnuto uživatelem",
"column.subheading": "Různé",
"column_header.profile": "Profil",
"column_subheading.lists": "Seznamy",
"column_subheading.navigation": "Navigace",
"community.column_settings.allow_local_only": "Zobrazit pouze místní tooty",
"compose.attach.doodle": "Nakreslete něco",
"compose.change_federation": "Změnit nastavení federace",
"compose.content-type.change": "Změnit pokročilé možnosti formátování",
"compose.content-type.html": "HTML",
"compose.content-type.html_meta": "Formátovat příspěvky pomocí HTML",
"compose.content-type.markdown": "Markdown",
"compose.content-type.markdown_meta": "Formátovat příspěvky pomocí Markdown",
"compose.content-type.plain": "Prostý text",
"compose.content-type.plain_meta": "Psát bez pokročilého formátování",
"compose.disable_threaded_mode": "Zakázat režim vláken",
"compose.enable_threaded_mode": "Povolit režim vláken",
"compose_form.sensitive.hide": "{count, plural, one {Označit médium za citlivé} other {Označit média za citlivá}}",
"compose_form.sensitive.marked": "{count, plural, one {Médium je označeno jako citlivé} other {Média jsou označena jako citlivá}}",
"compose_form.sensitive.unmarked": "{count, plural, one {Médium není označeno za citlivé} other {Média nejsou označena za citlivá}}",
"confirmation_modal.do_not_ask_again": "Příště se už neptat",
"confirmations.deprecated_settings.confirm": "Použít nastavení Mastodon",
"confirmations.deprecated_settings.message": "Některé z glitch-soc, zařízeních specifických {app_settings}, které používáte, byly nahrazeny {preferences} Mastodonu a budou přepsány:",
"confirmations.missing_media_description.confirm": "Přesto odeslat",
"confirmations.missing_media_description.edit": "Upravit média",
"confirmations.missing_media_description.message": "Alespoň jedna příloha nemá popisek. Zvažte popsání všech příloh pro zrakově postižené před odesláním tootu.",
"direct.group_by_conversations": "Seskupit do konverzací",
"endorsed_accounts_editor.endorsed_accounts": "Vybrané účty",
"favourite_modal.favourite": "Oblíbit si příspěvek?",
"federation.federated.long": "Povolit tomuto příspěvku přístup na jiné servery",
"federation.federated.short": "Federováno",
"federation.local_only.long": "Zabránit tomuto příspěvku v přístupu k jiným serverům",
"federation.local_only.short": "Lokální příspěvek",
"firehose.column_settings.allow_local_only": "Zobrazit pouze lokální příspěvky ve \"Vše\"",
"home.column_settings.advanced": "Pokročilé",
"home.column_settings.filter_regex": "Filtrovat podle regulárních výrazů",
"home.column_settings.show_direct": "Zobrazit přímé zprávy",
"home.column_settings.show_direct": "Zobrazit soukromé zmínky",
"home.settings": "Nastavení sloupců",
"keyboard_shortcuts.bookmark": "Přidat do záložek",
"keyboard_shortcuts.secondary_toot": "Odeslat příspěvek s druhotným nastavením soukromí",
"keyboard_shortcuts.secondary_toot": "pro odeslání příspěvku s sekundárním nastavením soukromí",
"keyboard_shortcuts.toggle_collapse": "Sbalit/rozbalit příspěvek",
"moved_to_warning": "Tento účet je označen jako přesunut na {moved_to_link}, a proto nemusí přijímat nové sledování.",
"navigation_bar.app_settings": "Nastavení aplikace",
"navigation_bar.featured_users": "Vybraní uživatelé",
"navigation_bar.keyboard_shortcuts": "Klávesové zkratky",
@@ -22,11 +60,13 @@
"notification_purge.btn_invert": "Obrátit\nvýběr",
"notification_purge.btn_none": "Nevybrat\nnic",
"notification_purge.start": "Čistící režim",
"notifications.column_settings.filter_bar.show_bar": "Zobrazit panel filtrů",
"notifications.marked_clear": "Smazat vybraná oznámení",
"notifications.marked_clear_confirmation": "Určitě chcete trvale smazat všechna vybraná oznámení?",
"settings.always_show_spoilers_field": "Vždy zobrazit pole pro varování o obsahu",
"settings.auto_collapse": "Automaticky sbalit",
"settings.auto_collapse_all": "Všechno",
"settings.auto_collapse_height": "Výška (v pixelech) pro toot považována za dlouhou",
"settings.auto_collapse_lengthy": "Dlouhé příspěvky",
"settings.auto_collapse_media": "Příspěvky s přílohami",
"settings.auto_collapse_notifications": "Oznámení",
@@ -50,6 +90,8 @@
"settings.enable_collapsed": "Povolit sbalené příspěvky",
"settings.enable_collapsed_hint": "U sbalených příspěvků je část jejich obsahu skrytá, aby zabraly méně místa na obrazovce. (Tohle není stejná funkce jako varování o obsahu.)",
"settings.enable_content_warnings_auto_unfold": "Vždy rozbalit příspěvky označené varováním o obsahu",
"settings.fullwidth_view": "Roztáhnout sloupce na celou šířku (pouze ve verzi pro počítač)",
"settings.fullwidth_view_hint": "Sloupce se roztáhnou, aby vyplnily veškerý dostupný prostor.",
"settings.general": "Obecné",
"settings.hicolor_privacy_icons": "Barevné ikony soukromí",
"settings.hicolor_privacy_icons.hint": "Zobrazit ikony úrovně soukromí příspěvků v jasných, snadno rozlišitelných barvách",
@@ -73,17 +115,18 @@
"settings.pop_in_player": "Povolit plovoucí okno přehrávače",
"settings.pop_in_position": "Pozice plovoucího okna:",
"settings.pop_in_right": "Vpravo",
"settings.preferences": "Předvolby",
"settings.preferences": "Uživatelské předvolby",
"settings.prepend_cw_re": "Při odpovídání přidat před varování o obsahu “re: ”",
"settings.preselect_on_reply": "Při odpovědi označit uživatelská jména",
"settings.preselect_on_reply": "Při odpovědi před-vybrat uživatelská jména",
"settings.preselect_on_reply_hint": "Při odpovídání na konverzaci s více účastníky se jména všech kromě prvního označí, aby šla jednoduše smazat",
"settings.rewrite_mentions": "Přepsat zmínky v zobrazených příspěvcích",
"settings.rewrite_mentions_acct": "Přepsat uživatelským jménem a doménou (pokud je účet na jiném serveru)",
"settings.rewrite_mentions_no": "Nepřepisovat zmínky",
"settings.rewrite_mentions_username": "Přepsat uživatelským jménem",
"settings.shared_settings_link": "předvolbách Mastodonu",
"settings.shared_settings_link": "uživatelské předvolby",
"settings.show_action_bar": "Zobrazit ve sbalených příspěvcích tlačítka s akcemi",
"settings.show_content_type_choice": "Zobrazit volbu formátu příspěvku",
"settings.show_published_toast": "Zobrazit gratulaci při publikování/ukládání příspěvku",
"settings.show_reply_counter": "Zobrazit odhad počtu odpovědí",
"settings.side_arm": "Vedlejší odesílací tlačítko:",
"settings.side_arm.none": "Žádné",
@@ -92,22 +135,26 @@
"settings.side_arm_reply_mode.keep": "Použít svou nastavenou úroveň soukromí",
"settings.side_arm_reply_mode.restrict": "Zvýšit úroveň soukromí nejméně na úroveň příspěvku, na který odpovídáte",
"settings.status_icons": "Ikony u příspěvků",
"settings.status_icons_language": "Indikace jazyk",
"settings.status_icons_language": "Indikátor jazyka",
"settings.status_icons_local_only": "Indikace lokálního příspěvku",
"settings.status_icons_media": "Indikace obrázků a anket",
"settings.status_icons_reply": "Indikace odpovědi",
"settings.status_icons_visibility": "Indikace úrovně soukromí",
"settings.swipe_to_change_columns": "Povolit změnu sloupců přejetím (pouze na mobilním telefonu)",
"settings.tag_misleading_links": "Označit zavádějící odkazy",
"settings.tag_misleading_links.hint": "Zobrazit skutečný cíl u každého odkazu, který ho explicitně nezmiňuje",
"settings.wide_view": "Široké sloupce (pouze v režimu Desktop)",
"settings.wide_view_hint": "Sloupce se roztáhnout, aby lépe vyplnily dostupný prostor.",
"settings.wide_view_hint": "Sloupce se roztáhnou, aby lépe vyplnily dostupný prostor.",
"status.collapse": "Sbalit",
"status.filtered": "Filtrováno",
"status.has_audio": "Obsahuje audio",
"status.has_pictures": "Obsahuje obrázky",
"status.has_preview_card": "Obsahuje náhled odkazu",
"status.has_video": "Obsahuje video",
"status.hide": "Skrýt příspěvek",
"status.in_reply_to": "Tento příspěvek je odpověď",
"status.is_poll": "Tento příspěvek je anketa",
"status.local_only": "Viditelné pouze z vaší instance",
"status.show_filter_reason": "Přesto zobrazit",
"status.uncollapse": "Rozbalit"
}

View File

@@ -154,7 +154,5 @@
"status.is_poll": "Dieser Toot ist eine Umfrage",
"status.local_only": "Nur auf deiner Instanz sichtbar",
"status.show_filter_reason": "Trotzdem anzeigen",
"status.show_less": "Weniger anzeigen",
"status.show_more": "Mehr anzeigen",
"status.uncollapse": "Ausklappen"
}

View File

@@ -1,4 +1,134 @@
{
"settings.content_warnings": "Content warnings",
"settings.preferences": "Preferences"
"about.fork_disclaimer": "Το Glitch-soc είναι ελεύθερο λογισμικό ανοιχτού κώδικα που είναι αντιγραφή από το Mastodon.",
"account.disclaimer_full": "Οι παρακάτω πληροφορίες μπορεί να αντικατοπτρίζουν το προφίλ του χρήστη ελλιπώς.",
"account.follows": "Ακολουθεί",
"account.follows_you": "Σε ακολουθεί",
"account.suspended_disclaimer_full": "Αυτός ο χρήστης έχει ανασταλεί από έναν συντονιστή.",
"account.view_full_profile": "Προβολή πλήρους προφίλ",
"boost_modal.missing_description": "Αυτό το τουτ περιέχει κάποια μέσα χωρίς περιγραφή",
"column.favourited_by": "Αγαπήθηκε από",
"column.heading": "Διάφορα",
"column.reblogged_by": "Ενισχύθηκε από",
"column.subheading": "Διάφορες επιλογές",
"column_header.profile": "Προφίλ",
"column_subheading.lists": "Λίστες",
"column_subheading.navigation": "Πλοήγηση",
"community.column_settings.allow_local_only": "Εμφάνιση τοπικών τουτ",
"compose.attach.doodle": "Σχεδίασε κάτι",
"compose.change_federation": "Αλλαγή ρυθμίσεων ομοσπονδίας",
"compose.content-type.change": "Αλλαγή προηγμένων επιλογών μορφοποίησης",
"compose.content-type.html": "HTML",
"compose.content-type.html_meta": "Μορφοποίηση των αναρτήσεων σας με χρήση HTML",
"compose.content-type.markdown": "Markdown",
"compose.content-type.markdown_meta": "Μορφοποίηση των αναρτήσεων σας με χρήση Markdown",
"compose.content-type.plain": "Απλό κείμενο",
"compose.content-type.plain_meta": "Γράψιμο χωρίς προηγμένη μορφοποίηση",
"compose.disable_threaded_mode": "Απενεργοποίηση λειτουργίας νημάτων",
"compose.enable_threaded_mode": "Ενεργοποίηση λειτουργίας νημάτων",
"compose_form.sensitive.hide": "{count, plural, one {Επισήμανση πολυμέσου ως ευαίσθητο} other {Επισήμανση πολυμέσων ως ευαίσθητα}}",
"compose_form.sensitive.marked": "{count, plural, one {Το πολυμέσο έχει σημανθεί ως ευαίσθητο} other {Τα πολυμέσα έχουν σημανθεί ως ευαίσθητα}}",
"compose_form.sensitive.unmarked": "{count, plural, one {Το πολυμέσο δεν έχει σημανθεί ως ευαίσθητο} other {Τα πολυμέσα δεν έχουν σημανθεί ως ευαίσθητα}}",
"confirmation_modal.do_not_ask_again": "Να μην ζητηθεί επιβεβαίωση ξανά",
"confirmations.deprecated_settings.confirm": "Χρήση προτιμήσεων του Mastodon",
"confirmations.missing_media_description.confirm": "Αποστολή ούτως ή άλλως",
"confirmations.missing_media_description.edit": "Επεξεργασία πολυμέσου",
"confirmations.missing_media_description.message": "Τουλάχιστον ένα συνημμένο πολυμέσων δεν έχει περιγραφή. Σκεφτείτε να προσθέσετε περιγραφή σε όλα τα συνημμένα πολυμέσων για τα άτομα με προβλήματα όρασης πριν από την αποστολή του τουτ σας.",
"direct.group_by_conversations": "Ομαδοποίηση ανά συζήτηση",
"endorsed_accounts_editor.endorsed_accounts": "Αναδεικνυόμενοι λογαριασμοί",
"favourite_modal.favourite": "Αγάπησε την ανάρτηση;",
"federation.federated.long": "Επιτρέψτε σε αυτήν την ανάρτηση να φτάσει σε άλλους διακομιστές",
"federation.local_only.long": "Αποτρέψτε αυτήν την ανάρτηση να φτάσει σε άλλους διακομιστές",
"federation.local_only.short": "Τοπικά μόνο",
"firehose.column_settings.allow_local_only": "Εμφάνιση τοπικών αναρτήσεων σε \"Όλα\"",
"home.column_settings.advanced": "Για προχωρημένους",
"home.column_settings.filter_regex": "Φιλτράρισμα βάσει των κανονικών εκφράσεων",
"home.column_settings.show_direct": "Εμφάνιση ιδιωτικών επισημάνσεων",
"home.settings": "Ρυθμίσεις στήλης",
"keyboard_shortcuts.bookmark": "για να σελιδοποιήσει",
"keyboard_shortcuts.secondary_toot": "για αποστολή τουτ χρησιμοποιώντας δευτερεύουσα ρύθμιση απορρήτου",
"keyboard_shortcuts.toggle_collapse": "για να συμπτύξει/επεκτείνει τα τουτς",
"moved_to_warning": "Αυτός ο λογαριασμός έχει σημανθεί ως μετακινημένος στο {moved_to_link} και έτσι δεν μπορεί να δεχτεί νέους ακολούθους.",
"navigation_bar.app_settings": "Ρυθμίσεις εφαρμογής",
"navigation_bar.featured_users": "Αναδεικνυόμενοι χρήστες",
"navigation_bar.keyboard_shortcuts": "Συντομεύσεις πληκτρολογίου",
"navigation_bar.misc": "Διάφορα",
"notification.markForDeletion": "Σήμανση για διαγραφή",
"notification_purge.btn_all": "Επιλογή\nόλων",
"notification_purge.btn_apply": "Εκκαθάριση\nεπιλεγμένων",
"notification_purge.btn_invert": "Αντιστροφή\nεπιλογής",
"notification_purge.btn_none": "Επιλογή\nκανενός",
"notification_purge.start": "Εισαγωγή στη λειτουργία καθαρισμού ειδοποιήσεων",
"notifications.column_settings.filter_bar.show_bar": "Εμφάνιση μπάρας φίλτρου",
"notifications.marked_clear": "Εκκαθάριση επιλεγμένων ειδοποιήσεων",
"notifications.marked_clear_confirmation": "Είστε βέβαιοι ότι θέλετε να καθαρίσετε μόνιμα όλες τις επιλεγμένες ειδοποιήσεις;",
"settings.always_show_spoilers_field": "Πάντα ενεργοποίηση του πεδίου Προειδοποίηση Περιεχομένου",
"settings.auto_collapse": "Αυτόματη σύμπτυξη",
"settings.auto_collapse_all": "Τα πάντα",
"settings.auto_collapse_height": "Ύψος (σε pixels) για να θεωρηθεί ένα τουτ μακροσκελές",
"settings.auto_collapse_lengthy": "Μακροσκελή τουτς",
"settings.auto_collapse_media": "Τουτς με πολυμέσα",
"settings.auto_collapse_notifications": "Ειδοποιήσεις",
"settings.auto_collapse_reblogs": "Ενισχύσεις",
"settings.auto_collapse_replies": "Απαντήσεις",
"settings.close": "Κλείσιμο",
"settings.collapsed_statuses": "Συμπτυγμένα τουτς",
"settings.compose_box_opts": "Πλαίσιο σύνθεσης",
"settings.confirm_missing_media_description": "Εμφάνιση διαλόγου επιβεβαίωσης πριν την αποστολή τουτς χωρίς περιγραφές πολυμέσων",
"settings.content_warnings": "Προειδοποιήσεις περιεχομένου",
"settings.content_warnings.regexp": "Κανονική έκφραση (regex)",
"settings.content_warnings_filter": "Προειδοποιήσεις περιεχομένου να μην ξεδιπλώνονται αυτόματα:",
"settings.content_warnings_media_outside": "Εμφάνιση συνημμένων πολυμέσων έξω από τις προειδοποιήσεις περιεχομένου",
"settings.content_warnings_media_outside_hint": "Αναπαράγει την συμπεριφορά του Mastodon έχοντας την εναλλαγή προειδοποίησης περιεχομένου να μην επηρεάζει τα συνημμένα πολυμέσων",
"settings.content_warnings_shared_state": "Εμφάνιση/απόκρυψη περιεχομένου όλων των αντιγράφων ταυτόχρονα",
"settings.content_warnings_unfold_opts": "Επιλογές αυτόματου ξεδιπλώματος",
"settings.deprecated_setting": "Αυτή η ρύθμιση τώρα ελέγχεται από τις {settings_page_link} του Mastodon",
"settings.enable_collapsed": "Ενεργοποίηση συμπτυγμένων τουτς",
"settings.enable_collapsed_hint": "Τα συμπτηγμένα τουτ έχουν τμήματα του περιεχομένου τους κρυμμένα για να καταλαμβάνουν λιγότερο χώρο στην οθόνη. Αυτό είναι διαφορετικό από τη λειτουργία Προειδοποίησης Περιεχομένου",
"settings.enable_content_warnings_auto_unfold": "Αυτόματη ξεδίπλωμα προειδοποιήσεων περιεχομένου",
"settings.general": "Γενικά",
"settings.image_backgrounds": "Εικόνες φόντου",
"settings.image_backgrounds_media": "Προεπισκόπηση συμπτυγμένων πολυμέσων τουτ",
"settings.image_backgrounds_media_hint": "Αν η δημοσίευση έχει οποιοδήποτε συνημμένο πολυμέσων, χρησιμοποιήστε το πρώτο ως φόντο",
"settings.image_backgrounds_users": "Δώστε στα συμπτυγμένα τουτ μια εικόνα φόντου",
"settings.layout_opts": "Επιλογές διάταξης",
"settings.media": "Πολυμέσα",
"settings.notifications.tab_badge": "Σήμα μη αναγνωσμένων ειδοποιήσεων",
"settings.notifications.tab_badge.hint": "Εμφανίζει ένα σήμα για μη αναγνωσμένες ειδοποιήσεις στα εικονίδια της στήλης όταν η στήλη ειδοποιήσεων δεν είναι ανοιχτή",
"settings.notifications_opts": "Ρυθμίσεις ειδοποιήσεων",
"settings.pop_in_left": "Αριστερά",
"settings.pop_in_right": "Δεξιά",
"settings.preferences": "Προτιμήσεις χρήστη",
"settings.preselect_on_reply": "Προεπιλογή ονομάτων χρηστών στην απάντηση",
"settings.preselect_on_reply_hint": "Όταν απαντάτε σε μια συνομιλία με πολλαπλούς συμμετέχοντες, προεπιλέξτε τα ονόματα χρηστών μετά τον πρώτο",
"settings.rewrite_mentions": "Ξαναγράψε επισημάνσεις στις προβαλλόμενες καταστάσεις",
"settings.rewrite_mentions_acct": "Ξαναγράψε με όνομα χρήστη και τομέα (όταν ο λογαριασμός είναι απομακρυσμένος)",
"settings.rewrite_mentions_no": "Μην ξαναγράψεις επισημάνσεις",
"settings.rewrite_mentions_username": "Ξαναγράψε με όνομα χρήστη",
"settings.shared_settings_link": "προτιμήσεις χρήστη",
"settings.show_action_bar": "Εμφάνιση κουμπιών ενεργειών σε συμπτυγμένα τουτ",
"settings.side_arm": "Δευτερεύον κουμπί τουτ:",
"settings.side_arm.none": "Κανένα",
"settings.side_arm_reply_mode": "Όταν απαντάτε σε ένα τουτ, το κουμπί δευτερεύοντος τουτ πρέπει να:",
"settings.side_arm_reply_mode.copy": "Αντιγράψει τη ρύθμιση απορρήτου του τουτ που απαντάται",
"settings.side_arm_reply_mode.keep": "Διατηρήσει το καθορισμένο απόρρητο",
"settings.side_arm_reply_mode.restrict": "Περιορίσει τη ρύθμιση απορρήτου σε εκείνη του τουτ που απαντάται",
"settings.status_icons": "Εικονίδια τουτ",
"settings.status_icons_language": "Ένδειξη γλώσσας",
"settings.status_icons_local_only": "Ένδειξη τοπικό μόνο",
"settings.status_icons_media": "Ενδείξεις μέσων και δημοσκοπήσεων",
"settings.status_icons_reply": "Ένδειξη απαντήσεων",
"settings.status_icons_visibility": "Ένδειξη απορρήτου τουτ",
"settings.tag_misleading_links": "Σήμανση παραπλανητικών συνδέσμων",
"settings.tag_misleading_links.hint": "Προσθήκη οπτικής ένδειξης με τον εξυπηρετητή στόχο του συνδέσμου σε κάθε σύνδεσμο που δεν αναφέρεται ρητά",
"status.collapse": "Σύμπτυξη",
"status.filtered": "Φιλτραρισμένο",
"status.has_audio": "Διαθέτει συνημμένα αρχεία ήχου",
"status.has_pictures": "Διαθέτει συνημμένες εικόνες",
"status.has_preview_card": "Διαθέτει συνημμένη κάρτα προεπισκόπησης",
"status.has_video": "Διαθέτει συνημμένα βίντεο",
"status.hide": "Απόκρυψη ανάρτησης",
"status.in_reply_to": "Αυτό το τουτ είναι απάντηση",
"status.is_poll": "Αυτό το τουτ είναι δημοσκόπηση",
"status.show_filter_reason": "Εμφάνιση ούτως ή άλλως",
"status.uncollapse": "Επέκταση"
}

View File

@@ -90,6 +90,8 @@
"settings.enable_collapsed": "Enable collapsed toots",
"settings.enable_collapsed_hint": "Collapsed posts have parts of their contents hidden to take up less screen space. This is distinct from the Content Warning feature",
"settings.enable_content_warnings_auto_unfold": "Automatically unfold content-warnings",
"settings.fullwidth_view": "Stretch columns to full width (Desktop mode only)",
"settings.fullwidth_view_hint": "Stretches columns to fill all the available space.",
"settings.general": "General",
"settings.hicolor_privacy_icons": "High color privacy icons",
"settings.hicolor_privacy_icons.hint": "Display privacy icons in bright and easily distinguishable colors",
@@ -154,7 +156,5 @@
"status.is_poll": "This toot is a poll",
"status.local_only": "Only visible from your instance",
"status.show_filter_reason": "Show anyway",
"status.show_less": "Show less",
"status.show_more": "Show more",
"status.uncollapse": "Uncollapse"
}

View File

@@ -2,6 +2,7 @@
"about.fork_disclaimer": "Glitch-soc estas libera malfermitkoda programo forkigita el Mastodon.",
"account.disclaimer_full": "Subaj informoj povas nekomplete prezenti la profilon de la uzanto.",
"account.follows": "Sekvatoj",
"account.follows_you": "Sekvas vin",
"account.suspended_disclaimer_full": "Ĉi tiu uzanto estis suspendita de moderiganto.",
"account.view_full_profile": "Vidi plenan profilon",
"boost_modal.missing_description": "Ĉi tiu afiŝo enhavas plurmedion, ke ne havas priskribon",
@@ -13,37 +14,118 @@
"column_subheading.lists": "Listoj",
"column_subheading.navigation": "Navigado",
"community.column_settings.allow_local_only": "Montri nur-lokajn afiŝojn",
"compose.attach.doodle": "Skribu ion",
"compose.change_federation": "Ŝanĝi agordojn de federacio",
"compose.content-type.change": "Ŝanĝi altnivelajn agordojn de formatado",
"compose.content-type.html": "HTML",
"compose.content-type.html_meta": "Formati viajn afiŝojn per HTML",
"compose.content-type.markdown": "Markdown",
"compose.content-type.markdown_meta": "Formati viajn afiŝojn per Markdown",
"compose.content-type.plain": "Plata teksto",
"compose.content-type.plain_meta": "Skribi sen altnivela formatado",
"compose.disable_threaded_mode": "Malŝalti treditan reĝimon",
"compose.enable_threaded_mode": "Ŝalti treditan reĝimon",
"compose_form.sensitive.hide": "{count, plural, one {Stampi enhavon kiel sentema} other {Stampi enhavon kiel sentema}}",
"compose_form.sensitive.marked": "{count, plural, one {Enhavo delikatiĝis} other {Enhavo delikatiĝis}}",
"compose_form.sensitive.unmarked": "{count, plural, one {Enhavo ne delikatiĝis} other {Enhavo ne delikatiĝis}}",
"confirmation_modal.do_not_ask_again": "Ne peti por konfirmo plue",
"confirmations.deprecated_settings.confirm": "Uzi la agordojn de Mastodon",
"confirmations.deprecated_settings.message": "{preferences} de Mastodon anstataŭigis iom da ilo-nivela {app_settings} de glitch-soc, kaj superos ĝin:",
"confirmations.missing_media_description.confirm": "Sendi ĉiuokaze",
"confirmations.missing_media_description.edit": "Redakti aŭdovidaĵon",
"confirmations.missing_media_description.message": "Unu aŭ pli da plurmedioj mankas priskribo. Bonvolu priskribi ĉiujn plurmediojn por la vida-malkapabluloj antaŭ ol sendi vian afiŝon.",
"direct.group_by_conversations": "Grupu de konversado",
"endorsed_accounts_editor.endorsed_accounts": "Prezentitaj kontoj",
"favourite_modal.favourite": "Ĉu vi volas stelumi ĉi tiun afiŝon?",
"federation.federated.long": "Permesu ĉi tiun afiŝon atingi aliajn servilojn",
"federation.federated.short": "Federatita",
"federation.local_only.long": "Malpermesu ĉi tiun afiŝon atingi aliajn servilojn",
"federation.local_only.short": "Nurloka",
"firehose.column_settings.allow_local_only": "Montri nurlokaj afiŝoj en \"Ĉio\"",
"home.column_settings.advanced": "Altnivela",
"home.column_settings.filter_regex": "Filtri per regulaj esprimoj",
"home.column_settings.show_direct": "Montri malpublikajn menciojn",
"home.settings": "Agordoj de rubriko",
"keyboard_shortcuts.bookmark": "legosignigi",
"keyboard_shortcuts.secondary_toot": "sendi afiŝon per dua agordo de privateco",
"keyboard_shortcuts.toggle_collapse": "malmontri/montri afiŝojn",
"moved_to_warning": "Ĉi tiun konton sigelas, kiel movinta al {moved_to_link}, kaj pro ne permesos novajn sekvantojn.",
"navigation_bar.app_settings": "Agordoj de aplikaĵo",
"navigation_bar.featured_users": "Prezentitaj uzantoj",
"navigation_bar.keyboard_shortcuts": "Fulmoklavoj",
"navigation_bar.misc": "Aliaj",
"notification.markForDeletion": "Sigeli por forigi",
"notification_purge.btn_all": "Selekti ĉiujn",
"notification_purge.btn_apply": "Forigi selektajn",
"notification_purge.btn_invert": "Inverti selekton",
"notification_purge.btn_none": "Elekti neniun",
"notification_purge.start": "Eniri reĝimon de la purigo de sciigojn",
"notifications.column_settings.filter_bar.show_bar": "Montri mezuron de filtrilo",
"notifications.marked_clear": "Forigi selektajn sciigojn",
"notifications.marked_clear_confirmation": "Ĉu vi certas, ke vi volas forigi tutajn selektitajn sciigojn?",
"settings.always_show_spoilers_field": "Ĉiam ŝaltiĝu la arealo de Enhava Averto",
"settings.auto_collapse": "Aŭtomata kolapsado",
"settings.auto_collapse_all": "Ĉiuj",
"settings.auto_collapse_height": "Alteco (en rastrumeroj) por afiŝo konsideriĝi longa",
"settings.auto_collapse_lengthy": "Longaj afiŝoj",
"settings.auto_collapse_media": "Afiŝoj kun aŭdovidaĵoj",
"settings.auto_collapse_notifications": "Sciigoj",
"settings.auto_collapse_reblogs": "Diskonigoj",
"settings.auto_collapse_replies": "Respondoj",
"settings.close": "Fermi",
"settings.collapsed_statuses": "Kolapsitaj afiŝoj",
"settings.compose_box_opts": "Skatolo por verki",
"settings.confirm_before_clearing_draft": "Montri dialogujon antaŭ superskribas la verkantan mesaĝon",
"settings.confirm_boost_missing_media_description": "Montri dialogujon antaŭ stimulas afiŝojn sen prikskribaĵojn por enhavo",
"settings.confirm_missing_media_description": "Montri dialogujon antaŭ sendas afiŝojn sen prikskribaĵojn por enhavo",
"settings.content_warnings": "Enhavaj avertoj",
"settings.content_warnings.regexp": "Regula esprimo",
"settings.content_warnings_filter": "Enhavaj avertoj, kiujn ne aŭtomate malkaŝu:",
"settings.content_warnings_media_outside": "Montri plurmediojn ekstere de enhavaj avertoj",
"settings.content_warnings_media_outside_hint": "Fari same, kiel la originala programaro Mastodon, por ke la enhavaj avertoj ne influas plurmediojn",
"settings.content_warnings_shared_state": "Montri/Malmontri enhavon de kopiaĵoj tuje",
"settings.content_warnings_shared_state_hint": "Redonu normalan kondukton de Mastodon per havante la butonon por la Averto por la Enhavo rezultas tutajn kopiaĵojn tuje. Tion preventos aŭtomatan kolapsadon de kopiiaĵo de afiŝo ajn, kiu havus malkolapsan EA-on",
"settings.content_warnings_unfold_opts": "Aŭtomat-malkolapsintaj agordoj",
"settings.deprecated_setting": "Ĉi tiun agordon nun kontrolas de la {settings_page_link} de Mastodon",
"settings.enable_collapsed": "Ŝaltigi kolaptsitajn afiŝojn",
"settings.enable_collapsed_hint": "Kolapsitaj afiŝoj havas partojn de siaj enhavoj malkovritaj por uzi malpli da spacon de la ekrano. Ĉi tion estas malsama ol la Enhava Averto",
"settings.enable_content_warnings_auto_unfold": "Aŭtomate malkovri avertojn por enhavo",
"settings.general": "Ĝenerala",
"settings.hicolor_privacy_icons": "Helaj piktogramoj de privateco",
"settings.hicolor_privacy_icons.hint": "Montri piktogramojn de privateco en helaj kaj distingigeblaj koloroj",
"settings.image_backgrounds": "Fonoj de bildoj",
"settings.image_backgrounds_media": "Antaŭrigardi la kolapsitajn plurmediojn de afiŝoj",
"settings.image_backgrounds_media_hint": "Se la afiŝo havas plurmediojn, uzi la unuan kiel fono",
"settings.image_backgrounds_users": "Donu al kolapsitaj afiŝoj bildfonon",
"settings.inline_preview_cards": "Enliniaj antaŭrigardoj por eksteraj ligiloj",
"settings.layout_opts": "Opcioj por tekstaranĝo",
"settings.media": "Plurenhavo",
"settings.media_fullwidth": "Tutlarĝaj antaŭrigardoj por plurenhavoj",
"settings.media_letterbox": "Skatoligi plurenhavojn",
"settings.media_letterbox_hint": "Skali malsupren kaj kesti plurmediojn por plenigi la bildujojn anstataŭ streĉi kaj tondi ilin",
"settings.media_reveal_behind_cw": "Montri sensativajn plurmediajn per AE defaŭlte",
"settings.notifications.favicon_badge": "Favikono por nelegitaj sciigoj",
"settings.notifications.favicon_badge.hint": "Doni insignon por nelegitaj sciigoj al la favikono",
"settings.notifications.tab_badge": "Insigno por nelegitaj sciigoj",
"settings.notifications.tab_badge.hint": "Montru insignon por nelegitaj sciigoj en la kolumno de piktogramoj, kiam la kolumno de sciigoj ne malfermas",
"settings.notifications_opts": "Agordoj por sciigoj",
"settings.pop_in_left": "Maldekstre",
"settings.pop_in_player": "Permesu pop-ena filmspektilon",
"settings.pop_in_position": "Posteno de la pop-ena filmspektilon:",
"settings.pop_in_right": "Dekstre",
"settings.preferences": "Preferences",
"settings.prepend_cw_re": "Donu \"re:\" al avertoj de enhavo, kiam respondante",
"settings.preselect_on_reply": "Antaŭselekti uzuantnomojn en la respondo",
"settings.preselect_on_reply_hint": "Kiam respondas al konversacio, kiu havas multajn uzantojn, antaŭselekti uzantnomojn post la unua",
"settings.rewrite_mentions": "Reskribu menciiojn en montritaj statusoj",
"settings.rewrite_mentions_acct": "Reskribu kun uzantnomon kaj domajno (kiam la konto malproksimas)",
"settings.rewrite_mentions_no": "Ne reskribu menciiojn",
"settings.rewrite_mentions_username": "Reskribu kun uzantnomo",
"settings.shared_settings_link": "preferoj de uzanto",
"settings.show_action_bar": "Montri agajn butonojn en kolapsitaj afiŝoj",
"settings.show_content_type_choice": "Montru elekton de enhava-tipo dum skribante afiŝojn",
"settings.show_published_toast": "Montri sciigetojn dum eldonante/savante afiŝon",
"settings.show_reply_counter": "Montri takson de la nombro da respondoj",
"settings.side_arm": "Duaranga butono por afiŝi:",
"settings.side_arm.none": "Neniu",
"settings.status_icons": "Ikonoj sur la afiŝoj",

View File

@@ -90,6 +90,8 @@
"settings.enable_collapsed": "Habilitar toots colapsados",
"settings.enable_collapsed_hint": "Las publicaciones colapsadas tienen partes de su contenido ocultas para ocupar menos espacio en pantalla. Esto es distinto de la función Advertencia de Contenido",
"settings.enable_content_warnings_auto_unfold": "Descolapsar automáticamente advertencias de contenido",
"settings.fullwidth_view": "Estirar columnas al ancho total (solo en Modo escritorio)",
"settings.fullwidth_view_hint": "Estira las columnas para rellenar todo el espacio disponible.",
"settings.general": "General",
"settings.hicolor_privacy_icons": "Íconos de privacidad más visibles",
"settings.hicolor_privacy_icons.hint": "Mostrar iconos de privacidad en colores brillantes y fácilmente distinguibles",
@@ -154,7 +156,5 @@
"status.is_poll": "Esta publicación es una encuesta",
"status.local_only": "Sólo visible para tu instancia",
"status.show_filter_reason": "Mostrar de todos modos",
"status.show_less": "Mostrar menos",
"status.show_more": "Mostrar más",
"status.uncollapse": "Descolapsar"
}

View File

@@ -25,6 +25,9 @@
"compose.content-type.plain_meta": "Écrire sans formatage avancé",
"compose.disable_threaded_mode": "Désactiver le mode thread",
"compose.enable_threaded_mode": "Activer le mode thread",
"compose_form.sensitive.hide": "{count, plural, one {Marquer le média comme sensible} other {Marquer les médias comme sensibles}}",
"compose_form.sensitive.marked": "{count, plural, one {Le média est marqué comme sensible} other {Les médias sont marqués comme sensibles}}",
"compose_form.sensitive.unmarked": "{count, plural, one {Le média nest pas marqué comme sensible} other {Les médias ne sont pas marqué comme sensible}}",
"confirmation_modal.do_not_ask_again": "Ne plus demander confirmation",
"confirmations.deprecated_settings.confirm": "Utiliser les préférences de Mastodon",
"confirmations.deprecated_settings.message": "Certaines {app_settings} de glitch-soc que vous utilisez ont été remplacées par les {preferences} de Mastodon et seront remplacées :",
@@ -33,6 +36,7 @@
"confirmations.missing_media_description.message": "Au moins un média joint manque d'une description. Pensez à décrire tous les médias attachés pour les malvoyant·e·s avant de publier votre post.",
"direct.group_by_conversations": "Grouper par conversation",
"endorsed_accounts_editor.endorsed_accounts": "Comptes mis en avant",
"favourite_modal.favourite": "Ajouter le message aux favoris?",
"federation.federated.long": "Permettre à ce post datteindre d'autres serveurs",
"federation.federated.short": "Fédéré",
"federation.local_only.long": "Empêcher ce post datteindre d'autres serveurs",
@@ -56,6 +60,7 @@
"notification_purge.btn_invert": "Inverser\nla sélection",
"notification_purge.btn_none": "Annuler\nla sélection",
"notification_purge.start": "Activer le mode de nettoyage des notifications",
"notifications.column_settings.filter_bar.show_bar": "Afficher la barre de filtre",
"notifications.marked_clear": "Effacer les notifications sélectionnées",
"notifications.marked_clear_confirmation": "Voulez-vous vraiment effacer de manière permanente toutes les notifications sélectionnées ?",
"settings.always_show_spoilers_field": "Toujours activer le champ de rédaction de l'avertissement de contenu",
@@ -85,6 +90,8 @@
"settings.enable_collapsed": "Activer le repliement des posts",
"settings.enable_collapsed_hint": "Les posts repliés ont une partie de leur contenu caché pour libérer de l'espace sur l'écran. C'est une option différente de l'avertissement de contenu",
"settings.enable_content_warnings_auto_unfold": "Déplier automatiquement les avertissements de contenu",
"settings.fullwidth_view": "Étirer les colonnes sur toute la largeur (mode bureau uniquement)",
"settings.fullwidth_view_hint": "Étire les colonnes pour remplir tout l'espace disponible.",
"settings.general": "Général",
"settings.hicolor_privacy_icons": "Indicateurs de confidentialité en couleurs",
"settings.hicolor_privacy_icons.hint": "Affiche les indicateurs de confidentialité dans des couleurs facilement distinguables",
@@ -139,12 +146,15 @@
"settings.wide_view": "Vue élargie (mode ordinateur uniquement)",
"settings.wide_view_hint": "Étire les colonnes pour mieux remplir l'espace disponible.",
"status.collapse": "Replier",
"status.filtered": "Filtré",
"status.has_audio": "Contient des fichiers audio attachés",
"status.has_pictures": "Contient des images attachées",
"status.has_preview_card": "Contient une carte de prévisualisation attachée",
"status.has_video": "Contient des vidéos attachées",
"status.hide": "Masquer la publication",
"status.in_reply_to": "Ce post est une réponse",
"status.is_poll": "Ce post est un sondage",
"status.local_only": "Visible uniquement depuis votre instance",
"status.show_filter_reason": "Afficher quand même",
"status.uncollapse": "Déplier"
}

View File

@@ -3,7 +3,7 @@
"account.disclaimer_full": "Les informations ci-dessous peuvent être incomplètes.",
"account.follows": "Abonnements",
"account.follows_you": "Vous suit",
"account.suspended_disclaimer_full": "Cet utilisateur a été suspendu par un modérateur.",
"account.suspended_disclaimer_full": "Ce compte a été suspendu par un modérateur.",
"account.view_full_profile": "Voir le profil complet",
"boost_modal.missing_description": "Ce post contient des médias sans description",
"column.favourited_by": "Ajouté en favori par",
@@ -21,10 +21,13 @@
"compose.content-type.html_meta": "Formatez vos messages en HTML",
"compose.content-type.markdown": "Markdown",
"compose.content-type.markdown_meta": "Formatez vos messages en Markdown",
"compose.content-type.plain": "Text brut",
"compose.content-type.plain": "Texte brut",
"compose.content-type.plain_meta": "Écrire sans formatage avancé",
"compose.disable_threaded_mode": "Désactiver le mode thread",
"compose.enable_threaded_mode": "Activer le mode thread",
"compose_form.sensitive.hide": "{count, plural, one {Marquer le média comme sensible} other {Marquer les médias comme sensibles}}",
"compose_form.sensitive.marked": "{count, plural, one {Le média est marqué comme sensible} other {Les médias sont marqués comme sensibles}}",
"compose_form.sensitive.unmarked": "{count, plural, one {Le média nest pas marqué comme sensible} other {Les médias ne sont pas marqué comme sensible}}",
"confirmation_modal.do_not_ask_again": "Ne plus demander confirmation",
"confirmations.deprecated_settings.confirm": "Utiliser les préférences de Mastodon",
"confirmations.deprecated_settings.message": "Certaines {app_settings} de glitch-soc que vous utilisez ont été remplacées par les {preferences} de Mastodon et seront remplacées :",
@@ -33,6 +36,7 @@
"confirmations.missing_media_description.message": "Au moins un média joint manque d'une description. Pensez à décrire tous les médias attachés pour les malvoyant·e·s avant de publier votre post.",
"direct.group_by_conversations": "Grouper par conversation",
"endorsed_accounts_editor.endorsed_accounts": "Comptes mis en avant",
"favourite_modal.favourite": "Ajouter le message aux favoris?",
"federation.federated.long": "Permettre à ce post datteindre d'autres serveurs",
"federation.federated.short": "Fédéré",
"federation.local_only.long": "Empêcher ce post datteindre d'autres serveurs",
@@ -56,6 +60,7 @@
"notification_purge.btn_invert": "Inverser\nla sélection",
"notification_purge.btn_none": "Annuler\nla sélection",
"notification_purge.start": "Activer le mode de nettoyage des notifications",
"notifications.column_settings.filter_bar.show_bar": "Afficher la barre de filtre",
"notifications.marked_clear": "Effacer les notifications sélectionnées",
"notifications.marked_clear_confirmation": "Voulez-vous vraiment effacer de manière permanente toutes les notifications sélectionnées ?",
"settings.always_show_spoilers_field": "Toujours activer le champ de rédaction de l'avertissement de contenu",
@@ -85,6 +90,8 @@
"settings.enable_collapsed": "Activer le repliement des posts",
"settings.enable_collapsed_hint": "Les posts repliés ont une partie de leur contenu caché pour libérer de l'espace sur l'écran. C'est une option différente de l'avertissement de contenu",
"settings.enable_content_warnings_auto_unfold": "Déplier automatiquement les avertissements de contenu",
"settings.fullwidth_view": "Étirer les colonnes sur toute la largeur (mode bureau uniquement)",
"settings.fullwidth_view_hint": "Étire les colonnes pour remplir tout l'espace disponible.",
"settings.general": "Général",
"settings.hicolor_privacy_icons": "Indicateurs de confidentialité en couleurs",
"settings.hicolor_privacy_icons.hint": "Affiche les indicateurs de confidentialité dans des couleurs facilement distinguables",
@@ -108,7 +115,7 @@
"settings.pop_in_player": "Activer le lecteur pop-in",
"settings.pop_in_position": "Position du lecteur pop-in :",
"settings.pop_in_right": "Droite",
"settings.preferences": "Preferences",
"settings.preferences": "Préferences",
"settings.prepend_cw_re": "Préfixer les avertissements avec \"re: \" lors d'une réponse",
"settings.preselect_on_reply": "Présélectionner les noms dutilisateur·rices lors de la réponse",
"settings.preselect_on_reply_hint": "Présélectionner les noms d'utilisateurs après le premier lors d'une réponse à une conversation à plusieurs participants",
@@ -139,12 +146,15 @@
"settings.wide_view": "Vue élargie (mode ordinateur uniquement)",
"settings.wide_view_hint": "Étire les colonnes pour mieux remplir l'espace disponible.",
"status.collapse": "Replier",
"status.filtered": "Filtré",
"status.has_audio": "Contient des fichiers audio attachés",
"status.has_pictures": "Contient des images attachées",
"status.has_preview_card": "Contient une carte de prévisualisation attachée",
"status.has_video": "Contient des vidéos attachées",
"status.hide": "Masquer la publication",
"status.in_reply_to": "Ce post est une réponse",
"status.is_poll": "Ce post est un sondage",
"status.local_only": "Visible uniquement depuis votre instance",
"status.show_filter_reason": "Afficher quand même",
"status.uncollapse": "Déplier"
}

View File

@@ -1,4 +1,107 @@
{
"about.fork_disclaimer": "Glitch-soc é software libre de código aberto derivado de Mastodon.",
"account.disclaimer_full": "A información inferior sobre a usuaria podería estar incompleta.",
"account.follows": "Segue",
"account.follows_you": "Séguete",
"account.suspended_disclaimer_full": "Usuaria suspendida pola moderación.",
"account.view_full_profile": "Ver perfil completo",
"boost_modal.missing_description": "Esta publicación contén multimedia sen descrición",
"column.favourited_by": "Favorecida por",
"column.heading": "Varios",
"column.reblogged_by": "Promovida por",
"column.subheading": "Opcións diversas",
"column_header.profile": "Perfil",
"column_subheading.lists": "Listas",
"column_subheading.navigation": "Navegación",
"community.column_settings.allow_local_only": "Ver só mensaxes de ámbito local",
"compose.attach.doodle": "Debuxa algo",
"compose.change_federation": "Cambiar axustes de federación",
"compose.content-type.change": "Cambiar opcións avanzadas de formato",
"compose.content-type.html": "HTML",
"compose.content-type.html_meta": "Usar formato HTML nas publicacións",
"compose.content-type.markdown": "Markdown",
"compose.content-type.markdown_meta": "Usar formato Markdown nas publicacións",
"compose.content-type.plain": "Texto plano",
"compose.content-type.plain_meta": "Escribir sen dar formato ao texto",
"compose.disable_threaded_mode": "Desactivar modo fiado",
"compose.enable_threaded_mode": "Activar modo fiado",
"compose_form.sensitive.hide": "{count, plural, one {Marcar multimedia como sensible} other {Marcar multimedia como sensible}}",
"compose_form.sensitive.marked": "{count, plural, one {Multimedia marcado como sensible} other {Multimedia marcado como sensible}}",
"compose_form.sensitive.unmarked": "{count, plural, one {Multimedia non marcado como sensible} other {Multimedia non marcado como sensible}}",
"confirmation_modal.do_not_ask_again": "Non volver a pedir confirmación",
"confirmations.deprecated_settings.confirm": "Usar preferencias de Mastodon",
"confirmations.deprecated_settings.message": "Algunha das preferencias propias do dispositivo {app_settings} que estás a usar foron substituídas por {preferences} de Mastodon e serán substituídas:",
"confirmations.missing_media_description.confirm": "Enviar igualmente",
"confirmations.missing_media_description.edit": "Editar multimedia",
"confirmations.missing_media_description.message": "Polo menos hai un multimedia ao que lle falta a descrición. Considera describir todos os anexos multimedia para axudar a persoas con deficiencias visuas.",
"direct.group_by_conversations": "Agrupar por conversa",
"favourite_modal.favourite": "Marcar como favorita?",
"federation.federated.long": "Permitir que esta publicación acade outros servidores",
"federation.federated.short": "Federada",
"federation.local_only.long": "Evitar que esta publicación acade outros servidores",
"federation.local_only.short": "Só local",
"firehose.column_settings.allow_local_only": "Mostrar só publicacións locais en «Todo»",
"home.column_settings.advanced": "Avanzado",
"home.column_settings.filter_regex": "Filtrar usando expresións regulares",
"home.column_settings.show_direct": "Mostrar mencións privadas",
"home.settings": "Axustes das columnas",
"keyboard_shortcuts.bookmark": "para marcar",
"keyboard_shortcuts.secondary_toot": "para enviar publicación usando axuste secundario de privacidade",
"moved_to_warning": "Esta conta moveuse a {moved_to_link}, e non acepta novos seguimentos.",
"navigation_bar.app_settings": "Axustes da app",
"navigation_bar.keyboard_shortcuts": "Atallos de teclado",
"navigation_bar.misc": "Varios",
"notifications.column_settings.filter_bar.show_bar": "Amosar barra de filtros",
"settings.always_show_spoilers_field": "Activar sempre o campo de Aviso sobre o contido CW",
"settings.close": "Pechar",
"settings.compose_box_opts": "Caixa de escritura",
"settings.confirm_before_clearing_draft": "Mostra cadro de confirmación antes de sobrescribir a mensaxe que se está a compoñer",
"settings.confirm_boost_missing_media_description": "Mostra cadro de confirmación antes de promover mensaxes que non describen o multimedia",
"settings.confirm_missing_media_description": "Mostra cadro de confirmación antes de enviar mensaxes sen descrición do multimedia",
"settings.content_warnings": "Content warnings",
"settings.preferences": "Preferences"
"settings.content_warnings.regexp": "Expresión regular",
"settings.content_warnings_filter": "Non despregar automáticamente os CW que:",
"settings.content_warnings_shared_state": "Mostra/oculta contido de todas as copias á vez",
"settings.content_warnings_shared_state_hint": "Imita o comportamento do propio Mastodon facendo que o botón de CW afecte a todas a copias dunha publicación á vez. Isto evita pregar automáticamente calquera copia dunha publicación con CW despregrado",
"settings.content_warnings_unfold_opts": "Opcións despregamento automático",
"settings.deprecated_setting": "O axuste está xestionado directamente desde os {settings_page_link} de Mastodon",
"settings.enable_content_warnings_auto_unfold": "Despregar automáticamente os avisos de contido",
"settings.general": "Xeral",
"settings.hicolor_privacy_icons": "Cores destacadas na icona de privacidade",
"settings.hicolor_privacy_icons.hint": "Mostra con cores brillantes e visibles as iconas co nivel de privacidade",
"settings.inline_preview_cards": "Vista previa local en tarxeta para ligazóns externas",
"settings.layout_opts": "Opcións da disposición",
"settings.media": "Multimedia",
"settings.media_fullwidth": "Vistra previa co ancho completo",
"settings.media_letterbox": "Multimedia nun rectángulo",
"settings.media_letterbox_hint": "Reducir a escala a un rectángulo que conteña a imaxe no lugar de estirala e recortala",
"settings.media_reveal_behind_cw": "Mostrar contido sensible con CW de xeito predeterminado",
"settings.notifications.favicon_badge": "Marca no favicon para notificacións non lidas",
"settings.notifications.favicon_badge.hint": "Mostra unha insignia no favicon cando hai notificacións non lidas",
"settings.notifications.tab_badge": "Insignia para notificacións non lidas",
"settings.notifications.tab_badge.hint": "Mostra unha insignia para as notificacións non lidas na columna de iconas cando a columna non está aberta",
"settings.notifications_opts": "Opcións das notificacións",
"settings.pop_in_left": "Esquerda",
"settings.pop_in_right": "Dereita",
"settings.preferences": "Preferences",
"settings.prepend_cw_re": "Engadir \"re:\" aos avisos sobre o contido nas respostas",
"settings.preselect_on_reply": "Preseleccionar identificadores ao responder",
"settings.preselect_on_reply_hint": "Preseleccionar os identificadores ao responder nunha conversa con varias persoas participantes",
"settings.rewrite_mentions": "Rescribe as mencións nos estados mostrados",
"settings.rewrite_mentions_acct": "Rescribir con identificador e dominio (para contas remotas)",
"settings.rewrite_mentions_no": "Non rescribir mencións",
"settings.rewrite_mentions_username": "Rescribir con identificador",
"settings.shared_settings_link": "preferencias da usuaria",
"settings.side_arm": "Botón secundario de publicación:",
"settings.side_arm.none": "Ningún",
"settings.side_arm_reply_mode": "Ao responder, o botón secundario de publicación debería:",
"settings.side_arm_reply_mode.copy": "Copiar a privacidade da publicación á que se responde",
"settings.side_arm_reply_mode.keep": "Manter a privacidade establecida",
"settings.side_arm_reply_mode.restrict": "Limita o nivel de privacidade a aquel que teña a publicación á que se responde",
"settings.status_icons": "Iconas das publicacións",
"settings.status_icons_language": "Indicador de idioma",
"settings.status_icons_local_only": "Indicador de só-local",
"settings.status_icons_media": "Indicadores multimedia e enquisas",
"settings.status_icons_reply": "Indicador de resposta",
"settings.status_icons_visibility": "Indicador de nivel de privacidade"
}

View File

@@ -75,6 +75,7 @@
"settings.content_warnings_media_outside": "Tampilkan lampiran media di luar peringatan konten",
"settings.content_warnings_media_outside_hint": "Reproduksi perilaku Mastodon upstream dengan membuat tombol Peringatan Konten tidak memengaruhi lampiran media",
"settings.content_warnings_shared_state": "Tampilkan/sembunyikan konten semua salinan sekaligus",
"settings.pop_in_right": "Kanan",
"settings.preferences": "Preferences",
"settings.status_icons_reply": "Indikator balasan",
"settings.status_icons_visibility": "Indikator privasi toot",

View File

@@ -75,9 +75,9 @@
"settings.close": "닫기",
"settings.collapsed_statuses": "접힌 글",
"settings.compose_box_opts": "작성 상자",
"settings.confirm_before_clearing_draft": "작성 중인 메시지를 덮어씌우기 전에 확인창을 보여주기",
"settings.confirm_boost_missing_media_description": "미디어 설명이 없는 글을 부스트하려 할 때 확인창을 보여주기",
"settings.confirm_missing_media_description": "미디어 설명이 없는 글을 작성하려 할 때 확인창을 보여주기",
"settings.confirm_before_clearing_draft": "작성 중인 메시지를 덮어씌우기 전에 확인창을 띄웁니다",
"settings.confirm_boost_missing_media_description": "미디어 설명이 없는 글을 부스트하려 할 때 확인창을 띄웁니다",
"settings.confirm_missing_media_description": "미디어 설명이 없는 글을 작성하려 할 때 확인창을 띄웁니다",
"settings.content_warnings": "열람주의",
"settings.content_warnings.regexp": "정규표현식",
"settings.content_warnings_filter": "자동으로 펼치지 않을 열람주의 문구:",
@@ -154,7 +154,5 @@
"status.is_poll": "이 글은 설문입니다",
"status.local_only": "당신의 서버에서만 보입니다",
"status.show_filter_reason": "그냥 표시하기",
"status.show_less": "접기",
"status.show_more": "더보기",
"status.uncollapse": "펼치기"
}

View File

@@ -1,4 +1,160 @@
{
"settings.content_warnings": "Content warnings",
"settings.preferences": "Preferences"
"about.fork_disclaimer": "„Glitch-soc“ tai nemokama atvirojo kodo programinė įranga, atšakota iš „Mastodon“.",
"account.disclaimer_full": "Žemiau pateikta informacija gali nevisiškai atitikti naudotojo profilį.",
"account.follows": "Sekimai",
"account.follows_you": "Seka jus",
"account.suspended_disclaimer_full": "Šį naudotoją pristabdė prižiūrėtojas.",
"account.view_full_profile": "Peržiūrėti visą profilį",
"boost_modal.missing_description": "Šis įrašas turi šiek tiek medijų be aprašų.",
"column.favourited_by": "Pamėgo",
"column.heading": "Įvairūs",
"column.reblogged_by": "Pasidalino",
"column.subheading": "Įvairios parinktys",
"column_header.profile": "Profilis",
"column_subheading.lists": "Sąrašai",
"column_subheading.navigation": "Naršymas",
"community.column_settings.allow_local_only": "Rodyti tik vietinius įrašus",
"compose.attach.doodle": "Nupiešti kažką",
"compose.change_federation": "Keisti federacijos nustatymus",
"compose.content-type.change": "Keisti papildomas formatavimo parinktis",
"compose.content-type.html": "HTML",
"compose.content-type.html_meta": "Formatuokite įrašus naudojant HTML",
"compose.content-type.markdown": "Ženklinimas",
"compose.content-type.markdown_meta": "Formatuokite įrašus naudojant ženklinimą",
"compose.content-type.plain": "Grynasis tekstas",
"compose.content-type.plain_meta": "Rašykite be papildomo formatavimo",
"compose.disable_threaded_mode": "Išjungti gijimo režimą",
"compose.enable_threaded_mode": "Įjungti gijimo režimą",
"compose_form.sensitive.hide": "{count, plural, one {Žymėti mediją kaip jautrią} few {Žymėti medijas kaip jautrias} many {Žymėti medijos kaip jautrios} other {Žymėti medijų kaip jautrių}}",
"compose_form.sensitive.marked": "{count, plural, one {Medija pažymėta kaip jautri} few {Medijos pažymėtos kaip jautrios} many {Medijos pažymėta kaip jautrios} other {Medijų pažymėtų kaip jautrių}}",
"compose_form.sensitive.unmarked": "{count, plural, one {Medija nepažymėta kaip jautri} few {Medijos nepažymėtos kaip jautrios} many {Medijos nepažymėta kaip jautrios} other {Medijų nepažymėtų kaip jautrių}}",
"confirmation_modal.do_not_ask_again": "Neklausti patvirtinimo vėl",
"confirmations.deprecated_settings.confirm": "Naudoti „Mastodon“ nuostatas",
"confirmations.deprecated_settings.message": "Kai kurios „glitch-soc“ įrenginiui būdingos {app_settings}, kurias naudojate, pakeistos į „Mastodon“ {preferences} ir bus perrašytos:",
"confirmations.missing_media_description.confirm": "Vis tiek siųsti",
"confirmations.missing_media_description.edit": "Redaguoti mediją",
"confirmations.missing_media_description.message": "Bent vienam medijos priedui trūksta aprašo. Prieš siųsdami savo įrašą apsvarstykite galimybę aprašyti visus medijų priedus silpnaregiams.",
"direct.group_by_conversations": "Grupuoti pagal pokalbį",
"endorsed_accounts_editor.endorsed_accounts": "Rekomenduojamos paskyros",
"favourite_modal.favourite": "Pamėgti įrašą?",
"federation.federated.long": "Leiskite šiam įrašui pasiekti kitus serverius",
"federation.federated.short": "Federuotas",
"federation.local_only.long": "Neleiskite šiam įrašui pasiekti kitus serverius",
"federation.local_only.short": "Tik vietinis",
"firehose.column_settings.allow_local_only": "Rodyti tik vietinius įrašus skiltyje „Visi“",
"home.column_settings.advanced": "Išplėstiniai",
"home.column_settings.filter_regex": "Filtruokite pagal paieškos reiškiniais",
"home.column_settings.show_direct": "Rodyti privačius paminėjimus",
"home.settings": "Stulpelio nustatymai",
"keyboard_shortcuts.bookmark": "pridėti prie žymių",
"keyboard_shortcuts.secondary_toot": "siųsti įrašą naudojant antrinį privatumo nustatymą",
"keyboard_shortcuts.toggle_collapse": "suskleisti / išskleisti įrašus",
"moved_to_warning": "Ši paskyra pažymėta kaip perkelta į {moved_to_link}, todėl negali priimti naujų sekimų.",
"navigation_bar.app_settings": "Programėlės nustatymai",
"navigation_bar.featured_users": "Rekomenduojami naudotojai",
"navigation_bar.keyboard_shortcuts": "Spartieji klavišai",
"navigation_bar.misc": "Įvairūs",
"notification.markForDeletion": "Žymėti ištrynimui",
"notification_purge.btn_all": "Pasirinkti\nviską",
"notification_purge.btn_apply": "Valyti\npasirinktus",
"notification_purge.btn_invert": "Apversti\npasirinkimą",
"notification_purge.btn_none": "Pasirinkti\nnieko",
"notification_purge.start": "Įeiti į pranešimų valymo režimą",
"notifications.column_settings.filter_bar.show_bar": "Rodyti filtro juostą",
"notifications.marked_clear": "Valyti pasirinktus pranešimus",
"notifications.marked_clear_confirmation": "Ar tikrai norite negrįžtamai išvalyti visus pasirinktus pranešimus?",
"settings.always_show_spoilers_field": "Visada įjungti turinio įspėjimo lauką",
"settings.auto_collapse": "Automatinis suskleidimas",
"settings.auto_collapse_all": "Viskas",
"settings.auto_collapse_height": "Aukštis (taškais), kad įrašas būtų laikomas ilgu",
"settings.auto_collapse_lengthy": "Ilgi įrašai",
"settings.auto_collapse_media": "Įrašai su medija",
"settings.auto_collapse_notifications": "Pranešimai",
"settings.auto_collapse_reblogs": "Pasidalinimai",
"settings.auto_collapse_replies": "Atsakymai",
"settings.close": "Užverti",
"settings.collapsed_statuses": "Suskleisti įrašai",
"settings.compose_box_opts": "Sukūrimo langelis",
"settings.confirm_before_clearing_draft": "Rodyti patvirtinimo dialogo langą prieš perrašant kuriamą įrašą",
"settings.confirm_boost_missing_media_description": "Rodyti patvirtinimo dialogo langą prieš pasidalinant įrašus, kuriems trūksta medijos aprašų",
"settings.confirm_missing_media_description": "Rodyti patvirtinimo dialogo langą prieš siunčiant įrašus, kuriems trūksta medijos aprašų",
"settings.content_warnings": "Turinio įspėjimai",
"settings.content_warnings.regexp": "Reguliarusis reiškinys",
"settings.content_warnings_filter": "Turinio įspėjimai automatiškai neišskleidžiami:",
"settings.content_warnings_media_outside": "Rodyti medijos priedus už turinio įspėjimų ribų",
"settings.content_warnings_media_outside_hint": "Atkurkite „Mastodon“ išsiuntimo srauto elgseną, nustačius, kad turinio įspėjimo perjungiklis nepaveiktų medijos priedų.",
"settings.content_warnings_shared_state": "Rodyti / slėpti visų kopijų turinį vienu metu",
"settings.content_warnings_shared_state_hint": "Atkurkite „Mastodon“ elgseną, nustatčius, kad turinio įspėjimo mygtukas vienu metu paveiktų visas įrašo kopijas. Tai neleis automatiškai suskleisti bet kurios įrašo kopijos su išskleistu TĮ.",
"settings.content_warnings_unfold_opts": "Automatinio atskleidžiamojo parinktys",
"settings.deprecated_setting": "Šis nustatymas dabar valdomas iš „Mastodon“ {settings_page_link}.",
"settings.enable_collapsed": "Įjungti suskleistus įrašus",
"settings.enable_collapsed_hint": "Suskleisti įrašai turi kai kurias turinio dalis paslėptas, kad užimtų mažiau vietos ekrane. Tai skiriasi nuo turinio įspėjimo funkcijos.",
"settings.enable_content_warnings_auto_unfold": "Automatiškai atskleisti turinio įspėjimus",
"settings.fullwidth_view": "Ištempti stulpelius į visą plotį (tik darbalaukio režime)",
"settings.fullwidth_view_hint": "Ištempia stulpelius, kad užpildytų visą laisvą vietą.",
"settings.general": "Bendrieji",
"settings.hicolor_privacy_icons": "Didelės spalvos privatumo piktogramos",
"settings.hicolor_privacy_icons.hint": "Rodyti privatumo piktogramas ryškiomis ir lengvai atskiriamomis spalvomis.",
"settings.image_backgrounds": "Vaizdo fonai",
"settings.image_backgrounds_media": "Peržiūrėti suskleistą įrašo mediją",
"settings.image_backgrounds_media_hint": "Jei įrašas turi kokių nors medijos priedų, kaip foną naudoti pirmąjį.",
"settings.image_backgrounds_users": "Suteikti suskleistiems įrašams vaizdo foną",
"settings.inline_preview_cards": "Įterptinės peržiūros kortelės išorinėms nuorodoms",
"settings.layout_opts": "Išdėstymo parinktys",
"settings.media": "Medija",
"settings.media_fullwidth": "Viso pločio medijos peržiūros",
"settings.media_letterbox": "Raidžių langelio medija",
"settings.media_letterbox_hint": "Mažinti mastelį ir raidžių langelio mediją, kad ji užpildytų vaizdo podėlius, vietoj to juos ištempti ir apkarpyti.",
"settings.media_reveal_behind_cw": "Atskleisti jautrią mediją po TĮ pagal numatytąjį",
"settings.notifications.favicon_badge": "Neskaitytų pranešimų svetainės piktogramos ženklelis",
"settings.notifications.favicon_badge.hint": "Pridėti neskaitytų pranešimų ženklelį prie svetainės piktogramos",
"settings.notifications.tab_badge": "Neskaitytų pranešimų ženklelis",
"settings.notifications.tab_badge.hint": "Rodyti neskaitytų pranešimų ženklelį stulpelio piktogramose, kai pranešimų stulpelis nėra atvertas.",
"settings.notifications_opts": "Pranešimų parinktys",
"settings.pop_in_left": "kairėje",
"settings.pop_in_player": "Įjungti iškylančiąją leistuvę",
"settings.pop_in_position": "Iškylančio leistuvės vieta:",
"settings.pop_in_right": "dešinėje",
"settings.preferences": "Naudotojo nuostatos",
"settings.prepend_cw_re": "Pridėti „re:“ prie turinio įspėjimų, kai atsakoma",
"settings.preselect_on_reply": "Iš anksto parinkti naudotojų vardus atsakant",
"settings.preselect_on_reply_hint": "Atsakant į pokalbį su daugeliu dalyvių, iš anksto pasirinkti naudotojų vardus po pirmojo.",
"settings.rewrite_mentions": "Perrašyti paminėjimus rodomose būsenose",
"settings.rewrite_mentions_acct": "Perrašyti su naudotojo vardu ir domenu (kai paskyra nuotolinė)",
"settings.rewrite_mentions_no": "Neperrašyti paminėjimų",
"settings.rewrite_mentions_username": "Perrašyti su naudotojo vardu",
"settings.shared_settings_link": "naudotojo nuostatos",
"settings.show_action_bar": "Rodyti veiksmo mygtukus suskleistuose įrašuose",
"settings.show_content_type_choice": "Rodyti turinio tipo pasirinkimą, kai kuriami įrašai",
"settings.show_published_toast": "Rodyti tostą, kai skelbiant / išsaugant įrašą",
"settings.show_reply_counter": "Rodyti apytikslį atsakymų skaičių",
"settings.side_arm": "Antrinio įrašo mygtukas:",
"settings.side_arm.none": "Jokio",
"settings.side_arm_reply_mode": "Atsakant į įrašą, antrinis įrašo mygtukas turėtų:",
"settings.side_arm_reply_mode.copy": "Nukopijuoti įrašo privatumo nustatymą, į kurį atsakoma",
"settings.side_arm_reply_mode.keep": "Išlaikyti nustatytą privatumą",
"settings.side_arm_reply_mode.restrict": "Apriboti privatumo nustatymą iki to įrašo, į kurį atsakoma",
"settings.status_icons": "Įrašo piktogramos",
"settings.status_icons_language": "Kalbos indikatorius",
"settings.status_icons_local_only": "Tik vietinis indikatorius",
"settings.status_icons_media": "Medijos ir apklausos indikatoriai",
"settings.status_icons_reply": "Atsakymo indikatorius",
"settings.status_icons_visibility": "Įrašo privatumo indikatorius",
"settings.swipe_to_change_columns": "Leisti keisti stulpelius perbraukiant (tik mobiliesiems)",
"settings.tag_misleading_links": "Žymėti klaidinančias nuorodas",
"settings.tag_misleading_links.hint": "Pridėkite vizualinį indikatorių su nuorodos paskirties serveriu prie kiekvienos nuorodos, kurioje ji nėra aiškiai paminėta.",
"settings.wide_view": "Platusis vaizdas (tik darbalaukio režimu)",
"settings.wide_view_hint": "Ištempia stulpelius, kad geriau užimtų laisvą vietą.",
"status.collapse": "Suskleisti",
"status.filtered": "Filtruota",
"status.has_audio": "Turi pridėtų garso įrašų failų",
"status.has_pictures": "Turi pridėtų nuotraukų",
"status.has_preview_card": "Turi pridėtą peržiūros kortelę",
"status.has_video": "Turi pridėtų vaizdo įrašų",
"status.hide": "Slėpti įrašą",
"status.in_reply_to": "Šis įrašas yra atsakymas",
"status.is_poll": "Šis įrašas yra apklausa",
"status.local_only": "Matomas tik iš jūsų serverio",
"status.show_filter_reason": "Rodyti vis tiek",
"status.uncollapse": "Išskleisti"
}

View File

@@ -1,5 +1,113 @@
{
"about.fork_disclaimer": "Glitch-soc - это бесплатное программное обеспечение с открытым исходным кодом, обращенное от Mastodon.",
"about.fork_disclaimer": "Glitch-soc это свободное программное обеспечение с открытым исходным кодом, ответвлённое от Mastodon.",
"account.disclaimer_full": "Приведённые ниже сведения могут не полностью соответствовать профилю пользователя.",
"account.follows": "Подписки",
"account.follows_you": "Подписан(а) на вас",
"account.suspended_disclaimer_full": "Этот пользователь был заблокирован модератором.",
"account.view_full_profile": "Открыть полный профиль",
"boost_modal.missing_description": "Этот пост содержит медиафайлы без описания",
"column.favourited_by": "Добавили в избранное",
"column.heading": "Прочее",
"column.reblogged_by": "Продвинули",
"column.subheading": "Прочие разделы",
"column_header.profile": "Профиль",
"column_subheading.lists": "Списки",
"column_subheading.navigation": "Навигация",
"community.column_settings.allow_local_only": "Показывать нефедерируемые посты",
"compose.attach.doodle": "Нарисовать что-нибудь",
"compose.change_federation": "Изменить настройки федерации",
"compose.content-type.change": "Изменить настройки форматирования",
"compose.content-type.html": "HTML",
"compose.content-type.html_meta": "Использовать HTML для написания постов",
"compose.content-type.markdown": "Markdown",
"compose.content-type.markdown_meta": "Использовать Markdown для написания постов",
"compose.content-type.plain": "Простой текст",
"compose.content-type.plain_meta": "Не использовать продвинутое форматирование",
"compose.disable_threaded_mode": "Отключить режим треда",
"compose.enable_threaded_mode": "Включить режим треда",
"confirmation_modal.do_not_ask_again": "Больше не спрашивать подтверждение",
"confirmations.deprecated_settings.confirm": "Использовать настройки Mastodon",
"confirmations.missing_media_description.confirm": "Всё равно опубликовать",
"direct.group_by_conversations": "Группировать по перепискам",
"endorsed_accounts_editor.endorsed_accounts": "Рекомендованные аккаунты",
"favourite_modal.favourite": "Добавить пост в избранное?",
"federation.federated.long": "Разрешить делиться этим постом с другими серверами",
"federation.federated.short": "Федерация",
"federation.local_only.long": "Запретить делиться этим постом с другими серверами",
"federation.local_only.short": "Без федерации",
"firehose.column_settings.allow_local_only": "Показывать нефедерируемые посты по вкладке «Все»",
"home.column_settings.advanced": "Продвинутые настройки",
"home.column_settings.filter_regex": "Фильтр по регулярным выражениям",
"home.column_settings.show_direct": "Показывать личные упоминания",
"keyboard_shortcuts.bookmark": "добавить закладку",
"keyboard_shortcuts.toggle_collapse": "свернуть/развернуть пост",
"moved_to_warning": "Этот аккаунт переехал на {moved_to_link}, и скорее всего не принимает новых подписчиков.",
"navigation_bar.app_settings": "Настройки приложения",
"navigation_bar.keyboard_shortcuts": "Сочетания клавиш",
"navigation_bar.misc": "Прочее",
"notification.markForDeletion": "Отметить для удаления",
"notification_purge.btn_all": "Выбрать все",
"notification_purge.btn_apply": "Удалить выбранное",
"notification_purge.btn_invert": "Инвертировать выбор",
"notification_purge.btn_none": "Отменить выбор",
"notification_purge.start": "Войти в режим очистки уведомлений",
"notifications.column_settings.filter_bar.show_bar": "Показать панель фильтров",
"notifications.marked_clear": "Удалить выбранные уведомления",
"notifications.marked_clear_confirmation": "Вы уверены, что хотите безвозвратно удалить все выбранные уведомления?",
"settings.always_show_spoilers_field": "Всегда ставить предупреждение о содержании",
"settings.auto_collapse": "Сворачивать автоматически",
"settings.auto_collapse_all": "Всё",
"settings.auto_collapse_height": "Высота (в пикселях) для того, чтобы пост считался длинным",
"settings.auto_collapse_lengthy": "Длинные посты",
"settings.auto_collapse_media": "Посты с медиафайлами",
"settings.auto_collapse_notifications": "Уведомления",
"settings.auto_collapse_reblogs": "Продвижения",
"settings.auto_collapse_replies": "Ответы",
"settings.close": "Закрыть",
"settings.collapsed_statuses": "Сворачивание постов",
"settings.compose_box_opts": "Форма постинга",
"settings.content_warnings": "Content warnings",
"settings.preferences": "Preferences"
"settings.content_warnings.regexp": "Регулярное выражение",
"settings.content_warnings_filter": "Предупреждения о содержании, к которым автоматическое разворачивание не применяется:",
"settings.content_warnings_media_outside": "Показывать медиафайлы внизу под предупреждением о содержании",
"settings.content_warnings_media_outside_hint": "Воспроизводить исходное поведение Mastodon, когда предупреждение о содержании сворачивает только текст поста",
"settings.content_warnings_shared_state": "Показывать/скрывать содержимое всех копий вместе",
"settings.content_warnings_shared_state_hint": "Воспроизводить исходное поведение Mastodon, когда раскрывание и закрывание предупреждения о содержимом охватывает все копии поста сразу. Это предотвращает автоматическое сворачивание копий поста с уже однажды раскрытым CW",
"settings.content_warnings_unfold_opts": "Автоматическое раскрытие",
"settings.deprecated_setting": "Эта опция теперь может быть включена в {settings_page_link} Mastodon",
"settings.enable_collapsed": "Включить сворачивание постов",
"settings.enable_collapsed_hint": "Свёрнутые посты отображаются частично скрытыми, чтобы занимать меньше места на экране. Эту функцию не следует путать с предупреждением о содержании",
"settings.enable_content_warnings_auto_unfold": "Автоматически раскрывать предупреждения о содержании",
"settings.general": "Общие",
"settings.hicolor_privacy_icons": "Цветные значки публичности поста",
"settings.hicolor_privacy_icons.hint": "Отображать значки публичности поста в ярких и различимых цветах",
"settings.media": "Медиафайлы",
"settings.notifications.favicon_badge": "Индикатор уведомлений на иконке сайта",
"settings.notifications.favicon_badge.hint": "Добавить индикатор непрочитанных уведомлений на иконку вкладки",
"settings.notifications.tab_badge": "Индикатор непрочитанных уведомлений",
"settings.notifications_opts": "Опции уведомлений",
"settings.pop_in_left": "Слева",
"settings.pop_in_player": "Включить плавающий плеер",
"settings.pop_in_position": "Расположение плавающего плеера:",
"settings.pop_in_right": "Справа",
"settings.preferences": "Preferences",
"settings.prepend_cw_re": "Добавлять «re: » перед предупреждением о содержании при ответе",
"settings.shared_settings_link": "настройках пользователя",
"settings.show_reply_counter": "Показывать приблизительное число ответов",
"settings.side_arm": "Дополнительная кнопка постинга:",
"settings.side_arm.none": "Нет",
"settings.side_arm_reply_mode": "При ответе на пост дополнительная кнопка постинга должна:",
"settings.status_icons": "Значки постов",
"settings.status_icons_language": "Индикатор языка",
"settings.status_icons_local_only": "Индикатор нефедерируемого поста",
"settings.status_icons_media": "Индикаторы медиафайлов и опросов",
"settings.status_icons_reply": "Индикатор ответа",
"settings.status_icons_visibility": "Индикатор публичности поста",
"settings.tag_misleading_links": "Помечать обманчивые ссылки",
"status.collapse": "Свернуть",
"status.hide": "Скрыть пост",
"status.in_reply_to": "Этот пост является ответом",
"status.is_poll": "Этот пост содержит опрос",
"status.show_filter_reason": "Всё равно показать",
"status.uncollapse": "Развернуть"
}

View File

@@ -1,4 +1,87 @@
{
"about.fork_disclaimer": "Glitch-soc is free open source software forked fae Mastodon.",
"account.disclaimer_full": "Information below may reflect the user's profile incompletely",
"account.follows": "Follows",
"account.suspended_disclaimer_full": "This user has been suspendit by a moderator.",
"account.view_full_profile": "View full profile",
"boost_modal.missing_description": "This post contains some media withoot description",
"column.favourited_by": "Favouritit by",
"column.heading": "Misc",
"column.reblogged_by": "Boosted by",
"column.subheading": "Miscellaneous options",
"column_header.profile": "Profile",
"column_subheading.lists": "Lists",
"column_subheading.navigation": "Navigation",
"community.column_settings.allow_local_only": "Show local-only posts",
"compose.attach.doodle": "Draw something",
"compose.change_federation": "Change federation settins",
"compose.content-type.change": "Change advanced formatting options",
"compose.content-type.html": "HTML",
"compose.content-type.html_meta": "Format yer posts using HTML",
"compose.content-type.markdown": "Markdoon",
"compose.content-type.markdown_meta": "Format yer posts using Markdoon",
"compose.content-type.plain": "Plain text",
"compose.content-type.plain_meta": "Write with no advanced formatting",
"compose.disable_threaded_mode": "Disable threaded mode",
"compose.enable_threaded_mode": "Enable threaded mode",
"compose_form.sensitive.hide": "{count, plural, one {Mark media as sensitive} other {Mark media as sensitive}}",
"compose_form.sensitive.marked": "{count, plural, one {Media is marked as sensitive} other {Media is marked as sensitive}}",
"compose_form.sensitive.unmarked": "{count, plural, one {Media isnae marked as sensitive} other {Media isnae marked as sensitive}}",
"confirmation_modal.do_not_ask_again": "Dinnae ask for confirmation again",
"confirmations.deprecated_settings.confirm": "Use Mastodon preferences",
"confirmations.deprecated_settings.message": "Some of the glitch-soc device-specific {app_settings} yer using hae been replaced by Mastodon {preferences} and will be overriden:",
"direct.group_by_conversations": "Group by conversation",
"favourite_modal.favourite": "Favourite post?",
"federation.federated.long": "Allow this post to reach other servers",
"federation.federated.short": "Federated",
"federation.local_only.long": "Prevent this post from reaching other servers",
"federation.local_only.short": "Local-only",
"firehose.column_settings.allow_local_only": "Show local-only posts in \"All\"",
"home.column_settings.advanced": "Advanced",
"home.column_settings.filter_regex": "Filter oot by regular expressions",
"home.column_settings.show_direct": "Show private mentions",
"home.settings": "Column settins",
"keyboard_shortcuts.bookmark": "tae bookmark",
"keyboard_shortcuts.secondary_toot": "tae send post using secondary privacy settin",
"moved_to_warning": "This account is marked as moved tae {moved_to_link}, an' may not accept new follows.",
"navigation_bar.app_settings": "App settins",
"navigation_bar.keyboard_shortcuts": "Keyboard shortcuts",
"navigation_bar.misc": "Misc",
"notifications.column_settings.filter_bar.show_bar": "Show filter bar",
"settings.always_show_spoilers_field": "Always enable the Content Warning field",
"settings.close": "Close",
"settings.compose_box_opts": "Compose box",
"settings.confirm_before_clearing_draft": "Show confirmation dialog before overwriting the message being composed",
"settings.confirm_boost_missing_media_description": "Show confirmation dialog before boosting posts lacking media descriptions",
"settings.content_warnings": "Content warnings",
"settings.preferences": "Preferences"
"settings.content_warnings.regexp": "Regular expression",
"settings.content_warnings_filter": "Content warnings tae not automatically unfold:",
"settings.content_warnings_shared_state": "Show/hide content fae all copies at once",
"settings.content_warnings_shared_state_hint": "Reproduce upstream Mastodon behavior by having the Content Warning button affect all copies of a post at once. This will prevent automatic collapsing of any copy of a post wi' unfolded CW",
"settings.content_warnings_unfold_opts": "Auto-unfolding options",
"settings.deprecated_setting": "This settin is now controlled fae Mastodon's {settings_page_link}",
"settings.enable_content_warnings_auto_unfold": "Automatically unfold content-warnings",
"settings.fullwidth_view": "Stretch columns tae full width (Desktop mode only)",
"settings.fullwidth_view_hint": "Stretches columns tae fill all the available space.",
"settings.general": "General",
"settings.hicolor_privacy_icons": "High color privacy icons",
"settings.hicolor_privacy_icons.hint": "Display privacy icons in bright an' easily distinguishable colors",
"settings.inline_preview_cards": "Inline preview cards fae external links",
"settings.layout_opts": "Layout options",
"settings.media": "Media",
"settings.media_fullwidth": "Full-width media previews",
"settings.media_letterbox": "Letterbox media",
"settings.media_letterbox_hint": "Scale doon an' letterbox media tae fill the image containers instead of stretching an' cropping them",
"settings.media_reveal_behind_cw": "Reveal sensitive media behind a CW by default",
"settings.notifications.favicon_badge": "Unread notifications favicon badge",
"settings.notifications.favicon_badge.hint": "Add a badge fae unread notifications to the favicon",
"settings.notifications.tab_badge": "Unread notifications badge",
"settings.notifications.tab_badge.hint": "Display a badge fae unread notifications in the column icons when the notifications column isnae open",
"settings.notifications_opts": "Notifications options",
"settings.pop_in_left": "Left",
"settings.pop_in_player": "Enable pop-in player",
"settings.pop_in_position": "Pop-in player position:",
"settings.pop_in_right": "Right",
"settings.preferences": "Preferences",
"settings.prepend_cw_re": "Prepend “re: ” to content warnings when replying"
}

View File

@@ -1,4 +1,5 @@
{
"account.follows": "ติดตาม",
"settings.content_warnings": "Content warnings",
"settings.preferences": "Preferences"
}

View File

@@ -36,6 +36,7 @@
"confirmations.missing_media_description.message": "你没有为一个或多个媒体撰写描述。请考虑为视障人士添加描述。",
"direct.group_by_conversations": "按对话分组",
"endorsed_accounts_editor.endorsed_accounts": "精选账户",
"favourite_modal.favourite": "点赞嘟文?",
"federation.federated.long": "允许此嘟文到达其它服务器",
"federation.federated.short": "联动",
"federation.local_only.long": "阻止此嘟文到达其它服务器",
@@ -89,6 +90,8 @@
"settings.enable_collapsed": "启用折叠嘟文",
"settings.enable_collapsed_hint": "让折叠的帖子隐藏部分内容以占用较少的屏幕空间。这与“内容警告”功能不同。",
"settings.enable_content_warnings_auto_unfold": "自动展开内容警告",
"settings.fullwidth_view": "将列拉伸至全宽 (仅桌面模式)",
"settings.fullwidth_view_hint": "拉伸列以利用所有可用空间。",
"settings.general": "一般",
"settings.hicolor_privacy_icons": "彩色隐私图标 ",
"settings.hicolor_privacy_icons.hint": "以明亮且易于区分的颜色显示隐私图标",
@@ -153,7 +156,5 @@
"status.is_poll": "此嘟文是投票",
"status.local_only": "此嘟文仅本站可见",
"status.show_filter_reason": "仍然显示",
"status.show_less": "部分显示",
"status.show_more": "完全显示",
"status.uncollapse": "展开"
}

View File

@@ -25,6 +25,9 @@
"compose.content-type.plain_meta": "不使用進階格式撰寫",
"compose.disable_threaded_mode": "停用貼文串模式",
"compose.enable_threaded_mode": "啟用貼文串模式",
"compose_form.sensitive.hide": "{count, plural, other {將媒體標記為敏感內容}}",
"compose_form.sensitive.marked": "{count, plural, other {媒體已被標記為敏感內容}}",
"compose_form.sensitive.unmarked": "{count, plural, other {媒體未被標記為敏感內容}}",
"confirmation_modal.do_not_ask_again": "不要再顯示確認訊息",
"confirmations.deprecated_settings.confirm": "使用 Mastodon 偏好",
"confirmations.deprecated_settings.message": "您正在使用的某些特定於 glitch-soc 設備的 {app_settings} 已被 Mastodon {preferences} 所取代,並將被覆蓋:",
@@ -33,6 +36,7 @@
"confirmations.missing_media_description.message": "至少有一個媒體附件缺少說明。 在發送貼文之前,請考慮為視障人士在所有媒體附件加上說明。",
"direct.group_by_conversations": "以對話分組",
"endorsed_accounts_editor.endorsed_accounts": "受推薦帳號",
"favourite_modal.favourite": "將貼文加入最愛?",
"federation.federated.long": "允許此貼文發布到其他伺服器",
"federation.federated.short": "聯邦",
"federation.local_only.long": "避免此貼文發布到其他伺服器",
@@ -86,6 +90,8 @@
"settings.enable_collapsed": "啟用折疊的貼文",
"settings.enable_collapsed_hint": "折疊的貼文隱藏了部分內容,以佔用更少的螢幕空間。這與內容警告功能不同",
"settings.enable_content_warnings_auto_unfold": "自動展開內容警告",
"settings.fullwidth_view": "將欄位延展至全寬(僅限桌面模式)",
"settings.fullwidth_view_hint": "將欄位延展以填滿所有可用空間。",
"settings.general": "一般設定",
"settings.hicolor_privacy_icons": "隱私圖示使用對比色",
"settings.hicolor_privacy_icons.hint": "用明亮且易於區分的顏色顯示隱私圖示",
@@ -140,12 +146,15 @@
"settings.wide_view": "寬廣模式(僅限桌面模式)",
"settings.wide_view_hint": "延伸欄以更好地填充可用空間。",
"status.collapse": "折疊",
"status.filtered": "已過濾的",
"status.has_audio": "包含音訊檔案",
"status.has_pictures": "包含圖片",
"status.has_preview_card": "包含預覽卡",
"status.has_video": "包含視訊檔案",
"status.hide": "隱藏貼文",
"status.in_reply_to": "貼文有回覆",
"status.is_poll": "貼文有投票",
"status.local_only": "只在此實例可見",
"status.show_filter_reason": "仍要顯示",
"status.uncollapse": "展開"
}

View File

@@ -150,5 +150,10 @@ export function createAccountFromServerJSON(serverJSON: ApiAccountJSON) {
),
note_emojified: emojify(accountJSON.note, emojiMap),
note_plain: unescapeHTML(accountJSON.note),
url:
accountJSON.url.startsWith('http://') ||
accountJSON.url.startsWith('https://')
? accountJSON.url
: accountJSON.uri,
});
}

View File

@@ -16,6 +16,7 @@ export const NOTIFICATIONS_GROUP_MAX_AVATARS = 8;
interface BaseNotificationGroup
extends Omit<BaseNotificationGroupJSON, 'sample_account_ids'> {
sampleAccountIds: string[];
partial: boolean;
}
interface BaseNotificationWithStatus<Type extends NotificationWithStatusType>
@@ -128,6 +129,7 @@ export function createNotificationGroupFromJSON(
return {
statusId: statusId ?? undefined,
sampleAccountIds,
partial: false,
...groupWithoutStatus,
};
}
@@ -136,12 +138,14 @@ export function createNotificationGroupFromJSON(
return {
report: createReportFromJSON(report),
sampleAccountIds,
partial: false,
...groupWithoutTargetAccount,
};
}
case 'severed_relationships':
return {
...group,
partial: false,
event: createAccountRelationshipSeveranceEventFromJSON(group.event),
sampleAccountIds,
};
@@ -150,13 +154,16 @@ export function createNotificationGroupFromJSON(
const { moderation_warning, ...groupWithoutModerationWarning } = group;
return {
...groupWithoutModerationWarning,
partial: false,
moderationWarning: createAccountWarningFromJSON(moderation_warning),
sampleAccountIds,
};
}
default:
return {
sampleAccountIds,
partial: false,
...group,
};
}
@@ -164,17 +171,17 @@ export function createNotificationGroupFromJSON(
export function createNotificationGroupFromNotificationJSON(
notification: ApiNotificationJSON,
) {
): NotificationGroup {
const group = {
sampleAccountIds: [notification.account.id],
group_key: notification.group_key,
notifications_count: 1,
type: notification.type,
most_recent_notification_id: notification.id,
page_min_id: notification.id,
page_max_id: notification.id,
latest_page_notification_at: notification.created_at,
} as NotificationGroup;
partial: true,
};
switch (notification.type) {
case 'favourite':
@@ -183,12 +190,21 @@ export function createNotificationGroupFromNotificationJSON(
case 'mention':
case 'poll':
case 'update':
return { ...group, statusId: notification.status?.id };
return {
...group,
type: notification.type,
statusId: notification.status?.id,
};
case 'admin.report':
return { ...group, report: createReportFromJSON(notification.report) };
return {
...group,
type: notification.type,
report: createReportFromJSON(notification.report),
};
case 'severed_relationships':
return {
...group,
type: notification.type,
event: createAccountRelationshipSeveranceEventFromJSON(
notification.event,
),
@@ -196,11 +212,15 @@ export function createNotificationGroupFromNotificationJSON(
case 'moderation_warning':
return {
...group,
type: notification.type,
moderationWarning: createAccountWarningFromJSON(
notification.moderation_warning,
),
};
default:
return group;
return {
...group,
type: notification.type,
};
}
}

View File

@@ -57,7 +57,10 @@ export const accountsReducer: Reducer<typeof initialState> = (
return state.setIn([action.payload.id, 'hidden'], false);
else if (importAccounts.match(action))
return normalizeAccounts(state, action.payload.accounts);
else if (followAccountSuccess.match(action)) {
else if (
followAccountSuccess.match(action) &&
!action.payload.alreadyFollowing
) {
return state
.update(action.payload.relationship.id, (account) =>
account?.update('followers_count', (n) => n + 1),

View File

@@ -4,11 +4,10 @@ import { ACCOUNT_LOOKUP_FAIL } from '../actions/accounts';
import { importAccounts } from '../actions/accounts_typed';
import { domain } from '../initial_state';
export const normalizeForLookup = str => {
str = str.toLowerCase();
const trailingIndex = str.indexOf(`@${domain.toLowerCase()}`);
return (trailingIndex > 0) ? str.slice(0, trailingIndex) : str;
};
const pattern = new RegExp(`@${domain}$`, 'gi');
export const normalizeForLookup = str =>
str.toLowerCase().replace(pattern, '');
const initialState = ImmutableMap();

View File

@@ -330,12 +330,26 @@ const expiresInFromExpiresAt = expires_at => {
const mergeLocalHashtagResults = (suggestions, prefix, tagHistory) => {
prefix = prefix.toLowerCase();
if (suggestions.length < 4) {
const localTags = tagHistory.filter(tag => tag.toLowerCase().startsWith(prefix) && !suggestions.some(suggestion => suggestion.type === 'hashtag' && suggestion.name.toLowerCase() === tag.toLowerCase()));
return suggestions.concat(localTags.slice(0, 4 - suggestions.length).toJS().map(tag => ({ type: 'hashtag', name: tag })));
} else {
return suggestions;
suggestions = suggestions.concat(localTags.slice(0, 4 - suggestions.length).toJS().map(tag => ({ type: 'hashtag', name: tag })));
}
// Prefer capitalization from personal history, unless personal history is all lower-case
const fixSuggestionCapitalization = (suggestion) => {
if (suggestion.type !== 'hashtag')
return suggestion;
const tagFromHistory = tagHistory.find((tag) => tag.localeCompare(suggestion.name, undefined, { sensitivity: 'accent' }) === 0);
if (!tagFromHistory || tagFromHistory.toLowerCase() === tagFromHistory)
return suggestion;
return { ...suggestion, name: tagFromHistory };
};
return suggestions.map(fixSuggestionCapitalization);
};
const normalizeSuggestions = (state, { accounts, emojis, tags, token }) => {
@@ -609,8 +623,13 @@ export default function compose(state = initialState, action) {
}
if (action.status.get('poll')) {
let options = action.status.getIn(['poll', 'options']).map(x => x.get('title'));
if (options.size < action.maxOptions) {
options = options.push('');
}
map.set('poll', ImmutableMap({
options: action.status.getIn(['poll', 'options']).map(x => x.get('title')),
options: options,
multiple: action.status.getIn(['poll', 'multiple']),
expires_in: expiresInFromExpiresAt(action.status.getIn(['poll', 'expires_at'])),
}));
@@ -639,8 +658,13 @@ export default function compose(state = initialState, action) {
}
if (action.status.get('poll')) {
let options = action.status.getIn(['poll', 'options']).map(x => x.get('title'));
if (options.size < action.maxOptions) {
options = options.push('');
}
map.set('poll', ImmutableMap({
options: action.status.getIn(['poll', 'options']).map(x => x.get('title')),
options: options,
multiple: action.status.getIn(['poll', 'multiple']),
expires_in: expiresInFromExpiresAt(action.status.getIn(['poll', 'expires_at'])),
}));

View File

@@ -6,6 +6,7 @@ import { LOCAL_SETTING_CHANGE, LOCAL_SETTING_DELETE } from 'flavours/glitch/acti
import { STORE_HYDRATE } from 'flavours/glitch/actions/store';
const initialState = ImmutableMap({
fullwidth_columns: false,
stretch : true,
side_arm : 'none',
side_arm_reply_mode : 'keep',

View File

@@ -534,10 +534,13 @@ export const notificationGroupsReducer = createReducer<NotificationGroupsState>(
if (existingGroupIndex > -1) {
const existingGroup = state.groups[existingGroupIndex];
if (existingGroup && existingGroup.type !== 'gap') {
group.notifications_count += existingGroup.notifications_count;
group.sampleAccountIds = group.sampleAccountIds
.concat(existingGroup.sampleAccountIds)
.slice(0, NOTIFICATIONS_GROUP_MAX_AVATARS);
if (group.partial) {
group.notifications_count +=
existingGroup.notifications_count;
group.sampleAccountIds = group.sampleAccountIds
.concat(existingGroup.sampleAccountIds)
.slice(0, NOTIFICATIONS_GROUP_MAX_AVATARS);
}
state.groups.splice(existingGroupIndex, 1);
}
}

Some files were not shown because too many files have changed in this diff Show More