1
0

Compare commits

..

161 Commits

Author SHA1 Message Date
3a8047c9f2
style: change theme color
Signed-off-by: オスカー、 <oscar@oscar.surf>
2024-10-28 21:25:08 +09:00
3bd575ac61
Merge upstream
Signed-off-by: オスカー、 <oscar@oscar.surf>
2024-10-28 21:24:27 +09:00
Noa Himesaka
a7f9a34d89 use YuruToot theme color 2024-10-17 00:31:57 +09:00
Noa Himesaka
d45671066c Merge branch 'main' of https://github.com/glitch-soc/mastodon 2024-10-17 00:30:51 +09:00
Claire
92771e5afb
Merge pull request #2884 from ClearlyClaire/glitch-soc/merge-upstream
Merge upstream changes up to 7c10b0fb7a
2024-10-14 21:47:32 +02:00
Claire
ab50b2613e [Glitch] Fix follow recommendation carrousel scrolling on RTL layouts
Port 7c10b0fb7a to glitch-soc

Signed-off-by: Claire <claire.github-309c@sitedethib.com>
2024-10-14 20:11:29 +02:00
Claire
075eb3ed38 [Glitch] Fix mute duration not being shown in list of muted accounts in web UI
Port a295832960f3a782b928145279af335f956fff1f to glitch-soc

Signed-off-by: Claire <claire.github-309c@sitedethib.com>
2024-10-14 20:11:02 +02:00
Claire
71a6ced55c [Glitch] Fix “Mark every notification as read” not updating the read marker if scrolled down
Port e018e6321feb97609b18ac61d3349beb6de170b5 to glitch-soc

Signed-off-by: Claire <claire.github-309c@sitedethib.com>
2024-10-14 20:11:02 +02:00
Claire
9b3aaa9609 [Glitch] Fix “Mention” appearing for otherwise filtered posts
Port f75eb1a8b0386d2ca5c1c05ee3b10364b3e11211 to glitch-soc

Signed-off-by: Claire <claire.github-309c@sitedethib.com>
2024-10-14 20:11:02 +02:00
Michael Stanclift
1a9be3e0eb [Glitch] Restore list column border
Port de4f7859b4cf5fc5254173368cf35f0d711331b6 to glitch-soc

Signed-off-by: Claire <claire.github-309c@sitedethib.com>
2024-10-14 20:11:02 +02:00
Claire
39723a4d9c [Glitch] Fix list edition modal styling
Port 45a520603b10792e24a2190215c0305c739108d0 to glitch-soc

Signed-off-by: Claire <claire.github-309c@sitedethib.com>
2024-10-14 20:11:02 +02:00
Matt Jankowski
6cedbb4c50 [Glitch] Bring icon vertical middle to applications list style
Port fa4a82326d4e33c63a76c6725c36e85fe3ae9310 to glitch-soc

Signed-off-by: Claire <claire.github-309c@sitedethib.com>
2024-10-14 20:11:02 +02:00
Claire
4d9b4ef72f Merge commit '7c10b0fb7a078661558fef86399d86831423260c' into glitch-soc/merge-upstream 2024-10-14 19:46:52 +02:00
Claire
7c10b0fb7a
Fix follow recommendation carrousel scrolling on RTL layouts (#32462) 2024-10-14 15:25:32 +00:00
Claire
ffa1032381
Add further warnings about encryption secrets (#32476) 2024-10-14 13:00:20 +00:00
Matt Jankowski
cc70acc11c
Augment coverage for Status model (#32468) 2024-10-14 12:52:47 +00:00
Matt Jankowski
d8eab3d81f
Reinforce coverage for DomainBlock model (#32473) 2024-10-14 12:51:01 +00:00
Florian Kohler
2404d6d1a1
Added Swiss German to languages dropdown (#29281)
Co-authored-by: David Roetzel <david@roetzel.de>
2024-10-14 08:57:34 +00:00
Matt Jankowski
06d6b35e88
Convert admin/tags controller specs to system specs (#32447) 2024-10-14 08:31:12 +00:00
renovate[bot]
2343ce4441
Update dependency rack to v2.2.10 (#32455)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-10-14 08:28:47 +00:00
renovate[bot]
555fb98cbb
Update dependency typescript to v5.6.3 (#32456)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-10-14 08:28:15 +00:00
renovate[bot]
05bc82e1ab
Update dependency use-debounce to v10.0.4 (#32452)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-10-14 08:24:10 +00:00
renovate[bot]
e9eac64896
Update devDependencies (non-major) (#32457)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-10-14 08:23:20 +00:00
renovate[bot]
de422a37e8
Update dependency fuzzysort to v3.1.0 (#32460)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-10-14 08:22:46 +00:00
Claire
b0dd38433b
Fix follow recommendation suppressions not applying immediately (#32392) 2024-10-14 08:18:25 +00:00
Claire
888e6a3439
Fix setting to hide the quick filter bar (#2882)
Fixes #2881
2024-10-11 17:45:07 +02:00
Claire
e15befebbd
Add tag with commit hash to PR image builds (#32418) 2024-10-11 14:16:37 +00:00
Claire
10ea6da09f
Fix language of push notifications (#32415) 2024-10-11 10:24:03 +00:00
Claire
bb0cf04d71
Add note about not changing ActiveRecord encryption secrets once they are set (#32413) 2024-10-11 09:19:48 +00:00
Claire
6e96ec840d
Fix the favicon notification badge not using the correct notification count (#2880)
Fixes #2879
2024-10-10 19:31:51 +02:00
Claire
22fd767425
Fix mute duration not being shown in list of muted accounts in web UI (#32388) 2024-10-10 14:53:12 +00:00
Claire
3b07fe1bba
Fix “Mark every notification as read” not updating the read marker if scrolled down (#32385) 2024-10-10 13:42:08 +00:00
renovate[bot]
9350cd31d7
Update dependency postcss-preset-env to v10.0.7 (#32389)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-10-10 13:21:48 +00:00
Claire
a5a3733c97
Fix “Mention” appearing for otherwise filtered posts (#32356) 2024-10-10 11:04:38 +00:00
Michael Stanclift
cdf603239e
Restore list column border (#32367) 2024-10-09 19:33:28 +00:00
Claire
d9fbb071da
Fix notification requests from suspended accounts still being listed (#32354) 2024-10-09 17:29:02 +00:00
Claire
03dbebdfef
Fix list edition modal styling (#32358) 2024-10-09 17:24:22 +00:00
Claire
fda52b2a52
Fix 4 columns barely not fitting on 1920px screen (#32361) 2024-10-09 17:16:57 +00:00
Claire
c574f5b53f
Change how migrations duplicated between glitch and upstream are handled (#2878) 2024-10-09 18:36:19 +02:00
renovate[bot]
6d6565eee7
Update dependency express to v4.21.1 (#32336)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-10-09 14:24:24 +00:00
Claire
0d91db3d77
Fix latest tag for 4.3 docker image builds (#32350) 2024-10-09 12:13:32 +00:00
Claire
7033b3476e
Fix discrepancy with upstream regarding latest docker image tag (#2877) 2024-10-08 19:10:59 +02:00
Matt Jankowski
258dce1256
Add OpenSSL::SSL::SSLError to http connection errors wrapper (#32307) 2024-10-08 14:59:51 +00:00
Noa Himesaka
0e5dd35e84 Merge branch 'main' of https://github.com/glitch-soc/mastodon 2024-10-08 23:58:28 +09:00
Matt Jankowski
e8ec6667bd
Extract wrapper constant for HTTP::* error classes (#32285) 2024-10-08 13:53:35 +00:00
Matt Jankowski
f49161ab1d
Oauth system spec cleanup / helper method extraction (#32287) 2024-10-08 13:30:54 +00:00
Matt Jankowski
3cf2d35c49
Reference IpBlock.severities keys from CLI option check (#32291) 2024-10-08 13:23:30 +00:00
Matt Jankowski
d20a899bb9
Bring icon vertical middle to applications list style (#32293) 2024-10-08 13:21:36 +00:00
Matt Jankowski
022c1ae6f2
Remove unused deprecator configuration (#32288) 2024-10-08 12:52:52 +00:00
Claire
c3a38c7d8c
Update changelog and security policy (#32300) 2024-10-08 12:24:59 +00:00
Claire
d04e2e9104
Merge pull request #2874 from ClearlyClaire/glitch-soc/fixes/crowdin-download-stable-glitch
Fix download of stable translation files in glitch-soc
2024-10-08 13:42:11 +02:00
Claire
1de6d511f4 Fix download of stable translation files in glitch-soc 2024-10-08 13:41:40 +02:00
github-actions[bot]
ff3e2c9cfa
New Crowdin Translations (automated) (#32295)
Co-authored-by: GitHub Actions <noreply@github.com>
2024-10-08 08:10:39 +00:00
Claire
562105c69a
Fix source strings being uploaded to crowdin in merge groups (#32298) 2024-10-08 08:00:05 +00:00
renovate[bot]
c60d4ecc82
Update dependency @reduxjs/toolkit to v2.2.8 (#32296)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-10-08 07:38:43 +00:00
Jake Anto
0c16365991
Prefer native apps over PWA (#27254) 2024-10-07 20:33:14 +00:00
Claire
fd75087534
Merge pull request #2872 from ClearlyClaire/glitch-soc/merge-upstream
Merge upstream changes up to 4238da6ee3
2024-10-07 21:25:06 +02:00
Eugen Rochko
ee17081793 [Glitch] Fix missing avatar fallback interfering with transparency in web UI
Port cae93e79a406a1156b51091784e35f8f0126ea12 to glitch-soc

Signed-off-by: Claire <claire.github-309c@sitedethib.com>
2024-10-07 20:46:30 +02:00
Eugen Rochko
9ca99b7dc1 [Glitch] Fix wrong width on logo in detailed link card in web UI
Port 889edc560ae94b0663bab0e4cdb7cbad7e3cc6f8 to glitch-soc

Signed-off-by: Claire <claire.github-309c@sitedethib.com>
2024-10-07 20:46:30 +02:00
Claire
7e06d724c9 Merge commit '4238da6ee3c93dfd5752e9133cbec958f8ebb18a' into glitch-soc/merge-upstream 2024-10-07 20:45:07 +02:00
Leni Kadali
4238da6ee3
Add error message when user tries to follow their own account (#31910) 2024-10-07 12:05:46 +00:00
Matt Jankowski
bfabd6a2b8
Move account suspension-related methods to concern (#28351) 2024-10-07 12:02:04 +00:00
Eugen Rochko
1f5bd571cd
Fix missing avatar fallback interfering with transparency in web UI (#32270) 2024-10-07 09:35:42 +00:00
Claire
a59160cf01
Add missing on_delete: :cascade on notification_permissions (#32281) 2024-10-07 07:46:03 +00:00
renovate[bot]
0ce2db4f7d
Update dependency postcss-preset-env to v10.0.6 (#32260)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-10-07 07:07:07 +00:00
github-actions[bot]
498024558a
New Crowdin Translations (automated) (#32262)
Co-authored-by: GitHub Actions <noreply@github.com>
2024-10-07 07:06:43 +00:00
Eugen Rochko
2c54b91dd1
Fix wrong width on logo in detailed link card in web UI (#32271) 2024-10-07 06:53:29 +00:00
Claire
6967031144 Fix video player's height in detailed status view 2024-10-06 19:19:28 +02:00
Claire
bbc7be1d95
Merge pull request #2867 from ClearlyClaire/glitch-soc/merge-upstream
Merge upstream changes up to c40ab43dc7
2024-10-06 19:18:59 +02:00
Christian Schmidt
c37daa11f2 [Glitch] Remove redundant title attribute
Port c40ab43dc7 to glitch-soc

Signed-off-by: Claire <claire.github-309c@sitedethib.com>
2024-10-06 17:04:53 +02:00
Claire
7b40f14452 [Glitch] Fix media gallery items having incorrect borders when hidden
Port 51769e0670 to glitch-soc

Signed-off-by: Claire <claire.github-309c@sitedethib.com>
2024-10-06 17:04:53 +02:00
Claire
c720623dc7 [Glitch] Fix unsupported grouped notifications from streaming causing duplicate IDs
Port 77f5b127fa to glitch-soc

Signed-off-by: Claire <claire.github-309c@sitedethib.com>
2024-10-06 17:04:53 +02:00
forsamori
819abbdb2f [Glitch] Add margin-bottom to error.dialog to reduce whitespace
Port 63a959099b to glitch-soc

Co-authored-by: Claire <claire.github-309c@sitedethib.com>
Signed-off-by: Claire <claire.github-309c@sitedethib.com>
2024-10-06 17:04:53 +02:00
Claire
b22272fcdc [Glitch] Hide badges in media gallery when media are hidden
Port f768a6eb16 to glitch-soc

Signed-off-by: Claire <claire.github-309c@sitedethib.com>
2024-10-06 17:04:53 +02:00
Claire
299372babe [Glitch] Fix editing description of media uploads with custom thumbnails
Port f760899b04 to glitch-soc

Signed-off-by: Claire <claire.github-309c@sitedethib.com>
2024-10-06 17:04:53 +02:00
Claire
54b209243b [Glitch] Fix media uploads in composer appearing over search results in advanced interface
Port b5006539c9 to glitch-soc

Signed-off-by: Claire <claire.github-309c@sitedethib.com>
2024-10-06 17:04:53 +02:00
Claire
ce3bedade3 [Glitch] Fix incorrect 'navigator' check
Port 4a737a948a to glitch-soc

Signed-off-by: Claire <claire.github-309c@sitedethib.com>
2024-10-06 17:04:53 +02:00
Nick Schonning
61a0c58dee [Glitch] Enable ESLlint no-case-declarations
Port f91f077985 to glitch-soc

Signed-off-by: Claire <claire.github-309c@sitedethib.com>
2024-10-06 17:04:53 +02:00
Matt Jankowski
af39ac6edc [Glitch] Adjust spacing on setting sub-nav items when below mobile size
Port f10d61bf86

Signed-off-by: Claire <claire.github-309c@sitedethib.com>
2024-10-06 16:44:22 +02:00
Matt Jankowski
edfa716a18 [Glitch] Improve alignment of icons on admin roles list
Port f811fcb2b2 to glitch-soc

Signed-off-by: Claire <claire.github-309c@sitedethib.com>
2024-10-06 16:43:50 +02:00
Renaud Chaput
8572fa1452 [Glitch] Fix follow notifications from streaming being grouped
Port 1be55ce244 to glitch-soc

Signed-off-by: Claire <claire.github-309c@sitedethib.com>
2024-10-06 16:43:17 +02:00
Claire
b28ce2424c Merge commit 'c40ab43dc703be988c277d4ba6b7987a3a80e16c' into glitch-soc/merge-upstream
Conflicts:
- `app/helpers/application_helper.rb`:
  Upstream added a helper where glitch-soc had its own, not really
  a conflict.
  Added upstream's helper.
- `lib/sanitize_ext/sanitize_config.rb`:
  Upstream renamed a constant that was used slightly differently in glitch-soc.
  Renamed it as upstream did.
2024-10-06 16:07:58 +02:00
Christian Schmidt
c40ab43dc7
Remove redundant title attribute (#32258) 2024-10-04 16:23:05 +00:00
Claire
51769e0670
Fix media gallery items having incorrect borders when hidden (#32257) 2024-10-04 14:55:44 +00:00
Claire
1f720366e9
Fix notification push notifications not including the author's username (#32254) 2024-10-04 14:29:23 +00:00
Matt Jankowski
ebdeac0731
Add coverage for missing status scenario in NotificationMailer (#32256) 2024-10-04 14:15:14 +00:00
Matt Jankowski
e4e07b1c34
Reduce factory usage across spec/services area (#32098) 2024-10-04 14:11:15 +00:00
Matt Jankowski
4fe7f213a6
Use async_count in more view locations (#32086) 2024-10-04 12:29:43 +00:00
Claire
77f5b127fa
Fix unsupported grouped notifications from streaming causing duplicate IDs (#32243) 2024-10-04 12:23:30 +00:00
Matt Jankowski
463f9197d8
Add regression coverage for admin reports resolution button within form (#32248) 2024-10-04 12:21:55 +00:00
Claire
49407e7623
Fix Content-Security-Policy when using sso-redirect (#32241) 2024-10-04 08:50:36 +00:00
Matt Jankowski
cf28104317
Rename preloaded models constant in cli media (#30531) 2024-10-04 08:30:08 +00:00
Matt Jankowski
82e7d53d54
Rename transformer constant in sanitizer (#30532) 2024-10-04 08:29:23 +00:00
gunchleoc
160917e718
Pluralize csv imports (#27094)
Co-authored-by: Claire <claire.github-309c@sitedethib.com>
2024-10-04 08:19:01 +00:00
forsamori
63a959099b
Add margin-bottom to error.dialog to reduce whitespace (#25708)
Co-authored-by: Claire <claire.github-309c@sitedethib.com>
2024-10-04 08:02:14 +00:00
renovate[bot]
12a8ac1f85
Update dependency node to 20.18 (#32244)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-10-04 07:57:41 +00:00
github-actions[bot]
1b247a1dc2
New Crowdin Translations (automated) (#32249)
Co-authored-by: GitHub Actions <noreply@github.com>
2024-10-04 07:29:53 +00:00
renovate[bot]
aba888c4a6
Update dependency ffmpeg to v7.1 (#32239)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-10-04 07:18:38 +00:00
Claire
4c0e44ebbe
Fix recently-broken admin interface buttons (#32240) 2024-10-03 16:12:15 +00:00
Matt Jankowski
cc8d723e71
Register an XML encoder for response tests (#32220) 2024-10-03 13:10:27 +00:00
Matt Jankowski
d95f6f4410
Extract ExportSummary class for account object counts (#32227) 2024-10-03 13:09:58 +00:00
Matt Jankowski
52afa94f1c
Use print_table to wrap storage output CLI (#32230) 2024-10-03 12:13:54 +00:00
renovate[bot]
1db91ab8d9
Update dependency typescript to v5.6.2 (#32165)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-10-03 09:34:04 +00:00
github-actions[bot]
fe3f5375e3
New Crowdin Translations (automated) (#32233)
Co-authored-by: GitHub Actions <noreply@github.com>
2024-10-03 09:15:31 +00:00
renovate[bot]
d96351a87d
Update babel monorepo to v7.25.7 (#32225)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-10-03 09:05:11 +00:00
renovate[bot]
0be1d332f2
Update dependency aws-sdk-s3 to v1.167.0 (#32231)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-10-03 09:04:33 +00:00
renovate[bot]
6ef510fe3f
Update dependency json-schema to v5.0.1 (#32234)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-10-03 09:04:12 +00:00
Claire
f768a6eb16
Hide badges in media gallery when media are hidden (#32224) 2024-10-02 15:51:05 +00:00
Matt Jankowski
cec8961372
Move admin action log type list generation to helper (#32178) 2024-10-02 14:47:00 +00:00
Matt Jankowski
7d6b9ccd34
Add copyable_input helper method to wrap shared options (#32119) 2024-10-02 14:45:54 +00:00
Matt Jankowski
36f9c96812
Clean up labels on development application form (#32116) 2024-10-02 14:45:12 +00:00
Matt Jankowski
b7bb850efd
Enable hostname config for all system specs (#32109) 2024-10-02 13:56:26 +00:00
Claire
f760899b04
Fix editing description of media uploads with custom thumbnails (#32221) 2024-10-02 13:29:23 +00:00
Claire
b5006539c9
Fix media uploads in composer appearing over search results in advanced interface (#32217) 2024-10-02 13:28:36 +00:00
Matt Jankowski
d270d6dd4f
Provide use_path to qr generator for svg data size reduction (#32127) 2024-10-02 13:26:46 +00:00
Matt Jankowski
2151dfb8d6
Add relevant_params to ReportFilter (matches account filter) (#32136) 2024-10-02 13:24:40 +00:00
Matt Jankowski
cf859d151b
More link/button conversion across views (#32199) 2024-10-02 13:08:40 +00:00
Matt Jankowski
1f65a95421
Remove unneeded reorder(nil) conditions (#32200) 2024-10-02 12:26:16 +00:00
Matt Jankowski
4aa26eba53
Extract WebPushRequest from push notification worker and subscription (#32208) 2024-10-02 11:11:52 +00:00
Claire
4a737a948a
Fix incorrect 'navigator' check (#32219) 2024-10-02 10:03:04 +00:00
Matt Jankowski
ebab3b80c7
Expand coverage for Export utility class (#32212) 2024-10-02 09:43:04 +00:00
Christian Schmidt
33d3ca7cf1
Support /.well-known/host-meta.json (#32206) 2024-10-02 09:23:44 +00:00
Matt Jankowski
f0716368e6
Update simplecov-html to version 0.13.1 (#32205) 2024-10-02 09:07:52 +00:00
github-actions[bot]
ea72d5ec3a
New Crowdin Translations (automated) (#32214)
Co-authored-by: GitHub Actions <noreply@github.com>
2024-10-02 09:05:57 +00:00
Jeong Arm
66b2bc1c84
Ignore error if mentioned account was not processable (#29215)
Co-authored-by: Claire <claire.github-309c@sitedethib.com>
2024-10-02 08:08:02 +00:00
Nick Schonning
f91f077985
Enable ESLlint no-case-declarations (#30768) 2024-10-01 16:26:30 +00:00
renovate[bot]
a2c4ba2001
Update dependency rubocop-rspec to v3.1.0 (#32202)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-10-01 15:10:56 +00:00
Matt Jankowski
4cae309f6a
Fix Rails/CreateTableWithTimestamps cop (#30836) 2024-10-01 13:56:43 +00:00
Jeong Arm
65508bb0c0
Show timestamp when the user deletes their account on admin dashboard (#25640)
Co-authored-by: Claire <claire.github-309c@sitedethib.com>
2024-10-01 13:54:28 +00:00
Matt Jankowski
df98cf71e3
Avoid repeated icon stack in settings sidebar (#32201) 2024-10-01 13:50:20 +00:00
Matt Jankowski
f10d61bf86
Adjust spacing on setting sub-nav items when below mobile size (#32137) 2024-10-01 13:41:25 +00:00
Matt Jankowski
f73787a4b8
Fix broken border on applications list (#32147) 2024-10-01 13:38:29 +00:00
Claire
7b92cf3b47
Fix unneeded requests to blocked domains when receiving relayed signed activities from them (#31161) 2024-10-01 12:52:13 +00:00
Emelia Smith
c5f0da98e4
Add detection and download of material_symbol icons in config/navigation.rb (#31366) 2024-10-01 12:49:04 +00:00
Matt Jankowski
44071fdbae
Wrap datetime in time element with attrs (#32177) 2024-10-01 12:45:58 +00:00
Matt Jankowski
ec16ed37c3
Extract constants for header and avatar geometry (#32151) 2024-10-01 11:36:25 +00:00
Matt Jankowski
c009507912
Use button_to for method: :post links on account show page (#32154) 2024-10-01 11:14:12 +00:00
Matt Jankowski
651846c622
Only show email domain blocks MX table when some found (#32155) 2024-10-01 11:03:13 +00:00
Matt Jankowski
4b4bf82ea9
Fix nav item active highlight for some paths (#32159) 2024-10-01 10:48:27 +00:00
Matt Jankowski
489abb8173
Remove explicit put action in prefs forms (#32175) 2024-10-01 10:35:40 +00:00
Matt Jankowski
7e35bef97e
Remove explicit put action in settings forms (#32176) 2024-10-01 10:34:05 +00:00
renovate[bot]
8ae381fd04
Update dependency postcss-preset-env to v10.0.5 (#32019)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-10-01 10:04:12 +00:00
Matt Jankowski
efd3f59627
Use module: :users in routes/admin section (#30767) 2024-10-01 10:02:58 +00:00
Emelia Smith
454d21ab5a
Remove OAuth Password Grant Type support (#30960) 2024-10-01 09:56:58 +00:00
Matt Jankowski
e975b55c24
Remove WebfingerHelper module & move usage inline (#31203) 2024-10-01 09:54:42 +00:00
David Roetzel
e6cda8388c
Move OTP secret length to configuration (#32125) 2024-10-01 09:38:42 +00:00
renovate[bot]
0b89765e9a
Update RuboCop (non-major) to v1.22.1 (#31573)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-10-01 09:30:54 +00:00
Matt Jankowski
f251edfc1d
Add date_range view helper (#32187) 2024-10-01 09:30:21 +00:00
renovate[bot]
7a653001b4
Update dependency haml_lint to v0.59.0 (#32146)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-10-01 09:30:09 +00:00
renovate[bot]
b7ddf45924
Update docker/dockerfile Docker tag to v1.10 (#32166)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-10-01 09:29:38 +00:00
renovate[bot]
3d943f03fd
Update dependency webmock to v3.24.0 (#32190)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-10-01 09:13:33 +00:00
renovate[bot]
2829f72d16
Update dependency propshaft to v1.1.0 (#32192)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-10-01 09:13:29 +00:00
Matt Jankowski
f811fcb2b2
Improve alignment of icons on admin roles list (#32153) 2024-10-01 09:08:29 +00:00
Matt Jankowski
675d3ea5c1
Extract dashboard partial for admin instance page (#32189) 2024-10-01 08:36:41 +00:00
Renaud Chaput
497e8d00b9
Bump main version 4.4.0-alpha.1 (#32180) 2024-10-01 08:36:22 +00:00
renovate[bot]
d9973f3b70
Update peter-evans/create-pull-request action to v7.0.5 (#32164)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-10-01 08:28:50 +00:00
Matt Jankowski
685067efd1
Avoid id duplication conflict with main navigation from settings profile link (#32181) 2024-10-01 08:23:05 +00:00
Renaud Chaput
1be55ce244
Fix follow notifications from streaming being grouped (#32179) 2024-10-01 08:22:14 +00:00
github-actions[bot]
5839ee434b
New Crowdin Translations (automated) (#32195)
Co-authored-by: GitHub Actions <noreply@github.com>
2024-10-01 08:21:17 +00:00
Matt Jankowski
0b6d217b9e
Use account display name for pretend blog example in attribution area (#32188) 2024-10-01 08:19:53 +00:00
Claire
07cd1fd1ef
Support translation branches in Crowdin (#32174) 2024-09-30 17:32:23 +00:00
376 changed files with 4635 additions and 3403 deletions

View File

@ -64,7 +64,6 @@ module.exports = defineConfig({
'indent': ['error', 2],
'jsx-quotes': ['error', 'prefer-single'],
'semi': ['error', 'always'],
'no-case-declarations': 'off',
'no-catch-shadow': 'error',
'no-console': [
'warn',

View File

@ -21,9 +21,11 @@ jobs:
uses: actions/checkout@v4
- id: version_vars
run: |
echo mastodon_version_metadata=pr-${{ github.event.pull_request.number }}-$(git rev-parse --short HEAD) >> $GITHUB_OUTPUT
echo mastodon_version_metadata=pr-${{ github.event.pull_request.number }}-$(git rev-parse --short ${{github.event.pull_request.head.sha}}) >> $GITHUB_OUTPUT
echo mastodon_short_sha=$(git rev-parse --short ${{github.event.pull_request.head.sha}}) >> $GITHUB_OUTPUT
outputs:
metadata: ${{ steps.version_vars.outputs.mastodon_version_metadata }}
short_sha: ${{ steps.version_vars.outputs.mastodon_short_sha }}
build-image:
needs: compute-suffix
@ -39,6 +41,7 @@ jobs:
latest=auto
tags: |
type=ref,event=pr
type=ref,event=pr,suffix=-${{ needs.compute-suffix.outputs.short_sha }}
secrets: inherit
build-image-streaming:
@ -55,4 +58,5 @@ jobs:
latest=auto
tags: |
type=ref,event=pr
type=ref,event=pr,suffix=-${{ needs.compute-suffix.outputs.short_sha }}
secrets: inherit

View File

@ -32,7 +32,7 @@ jobs:
labels: |
org.opencontainers.image.description=Nightly build image used for testing purposes
flavor: |
latest=true
latest=auto
tags: |
type=raw,value=edge
type=raw,value=nightly
@ -53,7 +53,7 @@ jobs:
labels: |
org.opencontainers.image.description=Nightly build image used for testing purposes
flavor: |
latest=true
latest=auto
tags: |
type=raw,value=edge
type=raw,value=nightly

2
.nvmrc
View File

@ -1 +1 @@
20.17
20.18

View File

@ -2,7 +2,7 @@
All notable changes to this project will be documented in this file.
## [4.3.0] - UNRELEASED
## [4.3.0] - 2024-10-08
The following changelog entries focus on changes visible to users, administrators, client developers or federated software developers, but there has also been a lot of code modernization, refactoring, and tooling work, in particular by @mjankowski.
@ -11,12 +11,12 @@ The following changelog entries focus on changes visible to users, administrator
- **Add confirmation interstitial instead of silently redirecting logged-out visitors to remote resources** (#27792, #28902, and #30651 by @ClearlyClaire and @Gargron)\
This fixes a longstanding open redirect in Mastodon, at the cost of added friction when local links to remote resources are shared.
- Fix ReDoS vulnerability on some Ruby versions ([GHSA-jpxp-r43f-rhvx](https://github.com/mastodon/mastodon/security/advisories/GHSA-jpxp-r43f-rhvx))
- Change `form-action` Content-Security-Policy directive to be more restrictive (#26897 by @ClearlyClaire)
- Change `form-action` Content-Security-Policy directive to be more restrictive (#26897 and #32241 by @ClearlyClaire)
- Update dependencies
### Added
- **Add server-side notification grouping** (#29889, #30576, #30685, #30688, #30707, #30776, #30779, #30781, #30440, #31062, #31098, #31076, #31111, #31123, #31223, #31214, #31224, #31299, #31325, #31347, #31304, #31326, #31384, #31403, #31433, #31509, #31486, #31513, #31592, #31594, #31638, #31746, #31652, #31709, #31725, #31745, #31613, #31657, #31840, #31610, #31929, #32089 and #32085 by @ClearlyClaire, @Gargron, @mgmn, and @renchap)\
- **Add server-side notification grouping** (#29889, #30576, #30685, #30688, #30707, #30776, #30779, #30781, #30440, #31062, #31098, #31076, #31111, #31123, #31223, #31214, #31224, #31299, #31325, #31347, #31304, #31326, #31384, #31403, #31433, #31509, #31486, #31513, #31592, #31594, #31638, #31746, #31652, #31709, #31725, #31745, #31613, #31657, #31840, #31610, #31929, #32089, #32085, #32243, #32179 and #32254 by @ClearlyClaire, @Gargron, @mgmn, and @renchap)\
Group notifications of the same type for the same target, so that your notifications no longer get cluttered by boost and favorite notifications as soon as a couple of your posts get traction.\
This is done server-side so that clients can efficiently get relevant groups without having to go through numerous pages of individual notifications.\
As part of this, the visual design of the entire notifications feature has been revamped.\
@ -28,7 +28,7 @@ The following changelog entries focus on changes visible to users, administrator
- `GET /api/v2/notifications/:group_key/accounts`: https://docs.joinmastodon.org/methods/grouped_notifications/#get-group-accounts
- `POST /api/v2/notifications/:group_key/dimsiss`: https://docs.joinmastodon.org/methods/grouped_notifications/#dismiss-group
- `GET /api/v2/notifications/:unread_count`: https://docs.joinmastodon.org/methods/grouped_notifications/#unread-group-count
- **Add notification policies, filtered notifications and notification requests** (#29366, #29529, #29433, #29565, #29567, #29572, #29575, #29588, #29646, #29652, #29658, #29666, #29693, #29699, #29737, #29706, #29570, #29752, #29810, #29826, #30114, #30251, #30559, #29868, #31008, #31011, #30996, #31149, #31220, #31222, #31225, #31242, #31262, #31250, #31273, #31310, #31316, #31322, #31329, #31324, #31331, #31343, #31342, #31309, #31358, #31378, #31406, #31256, #31456, #31419, #31457, #31508, #31540, #31541, #31723 and #32062 by @ClearlyClaire, @Gargron, @TheEssem, @mgmn, @oneiros, and @renchap)\
- **Add notification policies, filtered notifications and notification requests** (#29366, #29529, #29433, #29565, #29567, #29572, #29575, #29588, #29646, #29652, #29658, #29666, #29693, #29699, #29737, #29706, #29570, #29752, #29810, #29826, #30114, #30251, #30559, #29868, #31008, #31011, #30996, #31149, #31220, #31222, #31225, #31242, #31262, #31250, #31273, #31310, #31316, #31322, #31329, #31324, #31331, #31343, #31342, #31309, #31358, #31378, #31406, #31256, #31456, #31419, #31457, #31508, #31540, #31541, #31723, #32062 and #32281 by @ClearlyClaire, @Gargron, @TheEssem, @mgmn, @oneiros, and @renchap)\
The old “Block notifications from non-followers”, “Block notifications from people you don't follow” and “Block direct messages from people you don't follow” notification settings have been replaced by a new set of settings found directly in the notification column.\
You can now separately filter or drop notifications from people you don't follow, people who don't follow you, accounts created within the past 30 days, as well as unsolicited private mentions, and accounts limited by the moderation.\
Instead of being outright dropped, notifications that you chose to filter are put in a separate “Filtered notifications” box that you can review separately without it clogging your main notifications.\
@ -61,7 +61,7 @@ The following changelog entries focus on changes visible to users, administrator
- **Add timeline of public posts about a trending link** (#30381 and #30840 by @Gargron)\
You can now see public posts mentioning currently-trending articles from people who have opted into discovery features.\
This adds a new REST API endpoint: https://docs.joinmastodon.org/methods/timelines/#link
- **Add author highlight for news articles whose authors are on the fediverse** (#30398, #30670, #30521, #30846, #31819, and #31900 by @Gargron and @oneiros)\
- **Add author highlight for news articles whose authors are on the fediverse** (#30398, #30670, #30521, #30846, #31819, #31900 and #32188 by @Gargron, @mjankowski and @oneiros)\
This adds a mechanism to [highlight the author of news articles](https://blog.joinmastodon.org/2024/07/highlighting-journalism-on-mastodon/) shared on Mastodon.\
Articles hosted outside the fediverse can indicate a fediverse author with a meta tag:
```html
@ -150,10 +150,12 @@ The following changelog entries focus on changes visible to users, administrator
- Add groundwork for annual reports for accounts (#28693 by @Gargron)\
This lays the groundwork for a “year-in-review”/“wrapped” style report for local users, but is currently not in use.
- Add notification email on invalid second authenticator (#28822 by @ClearlyClaire)
- Add date of account deletion in list of accounts in the admin interface (#25640 by @tribela)
- Add new emojis from `jdecked/twemoji` 15.0 (#28404 by @TheEssem)
- Add configurable error handling in attachment batch deletion (#28184 by @vmstan)\
This makes the S3 batch size configurable through the `S3_BATCH_DELETE_LIMIT` environment variable (defaults to 1000), and adds some retry logic, configurable through the `S3_BATCH_DELETE_RETRY` environment variable (defaults to 3).
- Add VAPID public key to instance serializer (#28006 by @ThisIsMissEm)
- Add support for serving JRD `/.well-known/host-meta.json` in addition to XRD host-meta (#32206 by @c960657)
- Add `nodeName` and `nodeDescription` to nodeinfo `metadata` (#28079 by @6543)
- Add Thai diacritics and tone marks in `HASHTAG_INVALID_CHARS_RE` (#26576 by @ppnplus)
- Add variable delay before link verification of remote account links (#27774 by @ClearlyClaire)
@ -168,7 +170,7 @@ The following changelog entries focus on changes visible to users, administrator
### Changed
- **Change icons throughout the web interface** (#27385, #27539, #27555, #27579, #27700, #27817, #28519, #28709, #28064, #28775, #28780, #27924, #29294, #29395, #29537, #29569, #29610, #29612, #29649, #29844, #27780, #30974, #30963, #30962, #30961, #31362, #31363, #31359, #31371, #31360, #31512, #31511, and #31525 by @ClearlyClaire, @Gargron, @arbolitoloco1, @mjankowski, @nclm, @renchap, @ronilaukkarinen, and @zunda)\
- **Change icons throughout the web interface** (#27385, #27539, #27555, #27579, #27700, #27817, #28519, #28709, #28064, #28775, #28780, #27924, #29294, #29395, #29537, #29569, #29610, #29612, #29649, #29844, #27780, #30974, #30963, #30962, #30961, #31362, #31363, #31359, #31371, #31360, #31512, #31511, #31525, #32153, and #32201 by @ClearlyClaire, @Gargron, @arbolitoloco1, @mjankowski, @nclm, @renchap, @ronilaukkarinen, and @zunda)\
This changes all the interface icons from FontAwesome to Material Symbols for a more modern look, consistent with the official Mastodon Android app.\
In addition, better care is given to pixel alignment, and icon variants are used to better highlight active/inactive state.
- **Change design of compose form in web UI** (#28119, #29059, #29248, #29372, #29384, #29417, #29456, #29406, #29651, #29659, #31889 and #32033 by @ClearlyClaire, @Gargron, @eai04191, @hinaloe, and @ronilaukkarinen)\
@ -192,9 +194,9 @@ The following changelog entries focus on changes visible to users, administrator
Administrators may need to update their setup accordingly.
- Change how content warnings and filters are displayed in web UI (#31365, and #31761 by @Gargron)
- Change preview card processing to ignore `undefined` as canonical url (#31882 by @oneiros)
- Change embedded posts to use web UI (#31766 and #32135 by @Gargron)
- Change embedded posts to use web UI (#31766, #32135 and #32271 by @Gargron)
- Change inner borders in media galleries in web UI (#31852 by @Gargron)
- Change design of media attachments and profile media tab in web UI (#31807, #32048, and #31967 by @Gargron)
- Change design of media attachments and profile media tab in web UI (#31807, #32048, #31967, #32217, #32224 and #32257 by @ClearlyClaire and @Gargron)
- Change labels on thread indicators in web UI (#31806 by @Gargron)
- Change label of "Data export" menu item in settings interface (#32099 by @c960657)
- Change responsive break points on navigation panel in web UI (#32034 by @Gargron)
@ -284,9 +286,10 @@ The following changelog entries focus on changes visible to users, administrator
- Fix error when accepting an appeal for sensitive posts deleted in the meantime (#32037 by @ClearlyClaire)
- Fix error when encountering reblog of deleted post in feed rebuild (#32001 by @ClearlyClaire)
- Fix Safari browser glitch related to horizontal scrolling (#31960 by @Gargron)
- Fix unresolvable mentions sometimes preventing processing incoming posts (#29215 by @tribela and @ClearlyClaire)
- Fix too many requests caused by relationship look-ups in web UI (#32042 by @Gargron)
- Fix links for reblogs in moderation interface (#31979 by @ClearlyClaire)
- Fix the appearance of avatars when they do not load (#31966 by @renchap)
- Fix the appearance of avatars when they do not load (#31966 and #32270 by @Gargron and @renchap)
- Fix spurious error notifications for aborted requests in web UI (#31952 by @c960657)
- Fix HTTP 500 error in `/api/v1/polls/:id/votes` when required `choices` parameter is missing (#25598 by @danielmbrasil)
- Fix security context sometimes not being added in LD-Signed activities (#31871 by @ClearlyClaire)
@ -309,10 +312,12 @@ The following changelog entries focus on changes visible to users, administrator
- Fix “Redirect URI” field not being marked as required in “New application” form (#30311 by @ThisIsMissEm)
- Fix right-to-left text in preview cards (#30930 by @ClearlyClaire)
- Fix rack attack `match_type` value typo in logging config (#30514 by @mjankowski)
- Fix various cases of duplicate, missing, or inconsistent borders or scrollbar styles (#31068, #31286, #31268, #31275, #31284, #31305, #31346, #31372, #31373, #31389, #31432, #31391, #31445 and #32091 by @ClearlyClaire, @valtlai and @vmstan)
- Fix various cases of duplicate, missing, or inconsistent borders or scrollbar styles (#31068, #31286, #31268, #31275, #31284, #31305, #31346, #31372, #31373, #31389, #31432, #31391, #31445, #32091, #32147 and #32137 by @ClearlyClaire, @mjankowski, @valtlai and @vmstan)
- Fix editing description of media uploads with custom thumbnails (#32221 by @ClearlyClaire)
- Fix race condition in `POST /api/v1/push/subscription` (#30166 by @ClearlyClaire)
- Fix post deletion not being delayed when those are part of an account warning (#30163 by @ClearlyClaire)
- Fix rendering error on `/start` when not logged in (#30023 by @timothyjrogers)
- Fix unneeded requests to blocked domains when receiving relayed signed activities from them (#31161 by @ClearlyClaire)
- Fix logo pushing header buttons out of view on certain conditions in mobile layout (#29787 by @ClearlyClaire)
- Fix notification-related records not being reattributed when merging accounts (#29694 by @ClearlyClaire)
- Fix results/query in `api/v1/featured_tags/suggestions` (#29597 by @mjankowski)
@ -322,6 +327,7 @@ The following changelog entries focus on changes visible to users, administrator
- Fix full date display not respecting the locale 12/24h format (#29448 by @renchap)
- Fix filters title and keywords overflow (#29396 by @GeopJr)
- Fix incorrect date format in “Follows and followers” (#29390 by @JasonPunyon)
- Fix navigation item active highlight for some paths (#32159 by @mjankowski)
- Fix “Edit media” modal sizing and layout when space-constrained (#27095 by @ronilaukkarinen)
- Fix modal container bounds (#29185 by @nico3333fr)
- Fix inefficient HTTP signature parsing using regexps and `StringScanner` (#29133 by @ClearlyClaire)

View File

@ -1,4 +1,4 @@
# syntax=docker/dockerfile:1.9
# syntax=docker/dockerfile:1.10
# This file is designed for production server deployment, not local development work
# For a containerized local dev environment, see: https://github.com/mastodon/mastodon/blob/main/README.md#docker
@ -214,7 +214,7 @@ FROM build AS ffmpeg
# ffmpeg version to compile, change with [--build-arg FFMPEG_VERSION="7.0.x"]
# renovate: datasource=repology depName=ffmpeg packageName=openpkg_current/ffmpeg
ARG FFMPEG_VERSION=7.0.2
ARG FFMPEG_VERSION=7.1
# ffmpeg download URL, change with [--build-arg FFMPEG_URL="https://ffmpeg.org/releases"]
ARG FFMPEG_URL=https://ffmpeg.org/releases

View File

@ -100,8 +100,8 @@ GEM
attr_required (1.0.2)
awrence (1.2.1)
aws-eventstream (1.3.0)
aws-partitions (1.978.0)
aws-sdk-core (3.209.0)
aws-partitions (1.983.0)
aws-sdk-core (3.209.1)
aws-eventstream (~> 1, >= 1.3.0)
aws-partitions (~> 1, >= 1.651.0)
aws-sigv4 (~> 1.9)
@ -109,7 +109,7 @@ GEM
aws-sdk-kms (1.94.0)
aws-sdk-core (~> 3, >= 3.207.0)
aws-sigv4 (~> 1.5)
aws-sdk-s3 (1.166.0)
aws-sdk-s3 (1.167.0)
aws-sdk-core (~> 3, >= 3.207.0)
aws-sdk-kms (~> 1)
aws-sigv4 (~> 1.5)
@ -301,7 +301,7 @@ GEM
activesupport (>= 5.1)
haml (>= 4.0.6)
railties (>= 5.1)
haml_lint (0.58.0)
haml_lint (0.59.0)
haml (>= 5.0)
parallel (~> 1.10)
rainbow
@ -369,7 +369,7 @@ GEM
json-ld-preloaded (3.3.0)
json-ld (~> 3.3)
rdf (~> 3.3)
json-schema (5.0.0)
json-schema (5.0.1)
addressable (~> 2.8)
jsonapi-renderer (0.2.2)
jwt (2.7.1)
@ -601,7 +601,7 @@ GEM
actionmailer (>= 3)
net-smtp
premailer (~> 1.7, >= 1.7.9)
propshaft (1.0.1)
propshaft (1.1.0)
actionpack (>= 7.0.0)
activesupport (>= 7.0.0)
rack
@ -615,7 +615,7 @@ GEM
activesupport (>= 3.0.0)
raabro (1.4.0)
racc (1.8.1)
rack (2.2.9)
rack (2.2.10)
rack-attack (6.7.0)
rack (>= 1.0, < 4)
rack-cors (2.0.2)
@ -698,7 +698,7 @@ GEM
responders (3.1.1)
actionpack (>= 5.2)
railties (>= 5.2)
rexml (3.3.7)
rexml (3.3.8)
rotp (6.3.0)
rouge (4.3.0)
rpam2 (4.0.2)
@ -748,15 +748,15 @@ GEM
parser (>= 3.3.1.0)
rubocop-capybara (2.21.0)
rubocop (~> 1.41)
rubocop-performance (1.21.1)
rubocop-performance (1.22.1)
rubocop (>= 1.48.1, < 2.0)
rubocop-ast (>= 1.31.1, < 2.0)
rubocop-rails (2.25.1)
rubocop-rails (2.26.2)
activesupport (>= 4.2.0)
rack (>= 1.1)
rubocop (>= 1.33.0, < 2.0)
rubocop (>= 1.52.0, < 2.0)
rubocop-ast (>= 1.31.1, < 2.0)
rubocop-rspec (3.0.4)
rubocop-rspec (3.1.0)
rubocop (~> 1.61)
rubocop-rspec_rails (2.30.0)
rubocop (~> 1.61)
@ -815,7 +815,7 @@ GEM
docile (~> 1.1)
simplecov-html (~> 0.11)
simplecov_json_formatter (~> 0.1)
simplecov-html (0.12.3)
simplecov-html (0.13.1)
simplecov-lcov (0.8.0)
simplecov_json_formatter (0.1.4)
stackprof (0.2.26)
@ -862,7 +862,7 @@ GEM
unf (0.1.4)
unf_ext
unf_ext (0.0.9.1)
unicode-display_width (2.5.0)
unicode-display_width (2.6.0)
uri (0.13.1)
validate_email (0.1.6)
activemodel (>= 3.0)
@ -884,7 +884,7 @@ GEM
webfinger (1.2.0)
activesupport
httpclient (>= 2.4)
webmock (3.23.1)
webmock (3.24.0)
addressable (>= 2.8.0)
crack (>= 0.3.2)
hashdiff (>= 0.4.0, < 2.0.0)

View File

@ -13,8 +13,9 @@ A "vulnerability in Mastodon" is a vulnerability in the code distributed through
## Supported Versions
| Version | Supported |
| ------- | --------- |
| 4.2.x | Yes |
| 4.1.x | Yes |
| < 4.1 | No |
| Version | Supported |
| ------- | ---------------- |
| 4.3.x | Yes |
| 4.2.x | Yes |
| 4.1.x | Until 2025-04-08 |
| < 4.1 | No |

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

@ -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

@ -52,7 +52,7 @@ class Api::V1::Notifications::RequestsController < Api::BaseController
private
def load_requests
requests = NotificationRequest.where(account: current_account).includes(:last_status, from_account: [:account_stat, :user]).to_a_paginated_by_id(
requests = NotificationRequest.where(account: current_account).without_suspended.includes(:last_status, from_account: [:account_stat, :user]).to_a_paginated_by_id(
limit_param(DEFAULT_ACCOUNTS_LIMIT),
params_slice(:max_id, :since_id, :min_id)
)

View File

@ -35,7 +35,7 @@ class ApplicationController < ActionController::Base
rescue_from ActionController::InvalidAuthenticityToken, with: :unprocessable_entity
rescue_from Mastodon::RateLimitExceededError, with: :too_many_requests
rescue_from HTTP::Error, OpenSSL::SSL::SSLError, with: :internal_server_error
rescue_from(*Mastodon::HTTP_CONNECTION_ERRORS, with: :internal_server_error)
rescue_from Mastodon::RaceConditionError, Stoplight::Error::RedLight, ActiveRecord::SerializationFailure, with: :service_unavailable
rescue_from Seahorse::Client::NetworkingError do |e|

View File

@ -20,7 +20,7 @@ module Api::ErrorHandling
render json: { error: 'Record not found' }, status: 404
end
rescue_from HTTP::Error, Mastodon::UnexpectedResponseError do
rescue_from(*Mastodon::HTTP_CONNECTION_ERRORS, Mastodon::UnexpectedResponseError) do
render json: { error: 'Remote data could not be fetched' }, status: 503
end

View File

@ -80,7 +80,7 @@ module SignatureVerification
fail_with! "Verification failed for #{actor.to_log_human_identifier} #{actor.uri} using rsa-sha256 (RSASSA-PKCS1-v1_5 with SHA-256)", signed_string: compare_signed_string, signature: signature_params['signature']
rescue SignatureVerificationError => e
fail_with! e.message
rescue HTTP::Error, OpenSSL::SSL::SSLError => e
rescue *Mastodon::HTTP_CONNECTION_ERRORS => e
fail_with! "Failed to fetch remote data: #{e.message}"
rescue Mastodon::UnexpectedResponseError
fail_with! 'Failed to fetch remote data (got unexpected reply from server)'

View File

@ -13,7 +13,7 @@ module WebAppControllerConcern
policy = ContentSecurityPolicy.new
if policy.sso_host.present?
p.form_action policy.sso_host
p.form_action policy.sso_host, -> { "https://#{request.host}/auth/auth/" }
else
p.form_action :none
end

View File

@ -13,7 +13,7 @@ class MediaProxyController < ApplicationController
rescue_from ActiveRecord::RecordInvalid, with: :not_found
rescue_from Mastodon::UnexpectedResponseError, with: :not_found
rescue_from Mastodon::NotPermittedError, with: :not_found
rescue_from HTTP::TimeoutError, HTTP::ConnectionError, OpenSSL::SSL::SSLError, with: :internal_server_error
rescue_from(*Mastodon::HTTP_CONNECTION_ERRORS, with: :internal_server_error)
def show
with_redis_lock("media_download:#{params[:id]}") do

View File

@ -9,7 +9,7 @@ class Settings::ExportsController < Settings::BaseController
skip_before_action :require_functional!
def show
@export = Export.new(current_account)
@export_summary = ExportSummary.new(preloaded_account)
@backups = current_user.backups
end
@ -25,4 +25,15 @@ class Settings::ExportsController < Settings::BaseController
redirect_to settings_export_path
end
private
def preloaded_account
current_account.tap do |account|
ActiveRecord::Associations::Preloader.new(
records: [account],
associations: :account_stat
).call
end
end
end

View File

@ -15,7 +15,7 @@ module Settings
end
def create
session[:new_otp_secret] = User.generate_otp_secret(32)
session[:new_otp_secret] = User.generate_otp_secret
redirect_to new_settings_two_factor_authentication_confirmation_path
end

View File

@ -7,7 +7,23 @@ module WellKnown
def show
@webfinger_template = "#{webfinger_url}?resource={uri}"
expires_in 3.days, public: true
render content_type: 'application/xrd+xml', formats: [:xml]
respond_to do |format|
format.any do
render content_type: 'application/xrd+xml', formats: [:xml]
end
format.json do
render json: {
links: [
{
rel: 'lrdd',
template: @webfinger_template,
},
],
}
end
end
end
end
end

View File

@ -35,4 +35,11 @@ module Admin::ActionLogsHelper
end
end
end
def sorted_action_log_types
Admin::ActionLogFilter::ACTION_TYPE_MAP
.keys
.map { |key| [I18n.t("admin.action_logs.action_types.#{key}"), key] }
.sort_by(&:first)
end
end

View File

@ -18,6 +18,11 @@ module Admin::DashboardHelper
end
end
def date_range(range)
[l(range.first), l(range.last)]
.join(' - ')
end
def relevant_account_timestamp(account)
timestamp, exact = if account.user_current_sign_in_at && account.user_current_sign_in_at < 24.hours.ago
[account.user_current_sign_in_at, true]
@ -25,6 +30,8 @@ module Admin::DashboardHelper
[account.user_current_sign_in_at, false]
elsif account.user_pending?
[account.user_created_at, true]
elsif account.suspended_at.present? && account.local? && account.user.nil?
[account.suspended_at, true]
elsif account.last_status_at.present?
[account.last_status_at, true]
else

View File

@ -1,12 +1,6 @@
# frozen_string_literal: true
module ApplicationHelper
DANGEROUS_SCOPES = %w(
read
write
follow
).freeze
RTL_LOCALES = %i(
ar
ckb
@ -95,8 +89,11 @@ module ApplicationHelper
Rails.env.production? ? site_title : "#{site_title} (Dev)"
end
def class_for_scope(scope)
'scope-danger' if DANGEROUS_SCOPES.include?(scope.to_s)
def label_for_scope(scope)
safe_join [
tag.samp(scope, class: { 'scope-danger' => SessionActivation::DEFAULT_SCOPES.include?(scope.to_s) }),
tag.span(t("doorkeeper.scopes.#{scope}"), class: :hint),
]
end
def can?(action, record)
@ -244,6 +241,10 @@ module ApplicationHelper
full_asset_url(instance_presenter.mascot&.file&.url || frontend_asset_path('images/elephant_ui_plane.svg'))
end
def copyable_input(options = {})
tag.input(type: :text, maxlength: 999, spellcheck: false, readonly: true, **options)
end
# glitch-soc addition to handle the multiple flavors
def preload_locale_pack
supported_locales = Themes.instance.flavour(current_flavour)['locales']

View File

@ -193,6 +193,7 @@ module LanguagesHelper
ckb: ['Sorani (Kurdish)', 'سۆرانی'].freeze,
cnr: ['Montenegrin', 'crnogorski'].freeze,
csb: ['Kashubian', 'Kaszëbsczi'].freeze,
gsw: ['Swiss German', 'Schwiizertütsch'].freeze,
jbo: ['Lojban', 'la .lojban.'].freeze,
kab: ['Kabyle', 'Taqbaylit'].freeze,
ldn: ['Láadan', 'Láadan'].freeze,

View File

@ -19,11 +19,11 @@ module ThemeHelper
if theme == 'system'
''.html_safe.tap do |tags|
tags << tag.meta(name: 'theme-color', content: Themes::THEME_COLORS[:dark], media: '(prefers-color-scheme: dark)')
tags << tag.meta(name: 'theme-color', content: Themes::THEME_COLORS[:light], media: '(prefers-color-scheme: light)')
tags << tag.meta(name: 'theme-color', content: '#3ff2ab', media: '(prefers-color-scheme: dark)')
tags << tag.meta(name: 'theme-color', content: '#3ff2ab', media: '(prefers-color-scheme: light)')
end
else
tag.meta name: 'theme-color', content: theme_color_for(theme)
tag.meta name: 'theme-color', content: '#3ff2ab'
end
end

View File

@ -1,7 +0,0 @@
# frozen_string_literal: true
module WebfingerHelper
def webfinger!(uri)
Webfinger.new(uri).perform
end
end

View File

@ -37,8 +37,7 @@ export const synchronouslySubmitMarkers = createAppAsyncThunk(
});
return;
// eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
} else if ('navigator' && 'sendBeacon' in navigator) {
} else if ('sendBeacon' in navigator) {
// Failing that, we can use sendBeacon, but we have to encode the data as
// FormData for DoorKeeper to recognize the token.
const formData = new FormData();

View File

@ -70,6 +70,10 @@ function dispatchAssociatedRecords(
const supportedGroupedNotificationTypes = ['favourite', 'reblog'];
export function shouldGroupNotificationType(type: string) {
return supportedGroupedNotificationTypes.includes(type);
}
export const fetchNotifications = createDataLoadingThunk(
'notificationGroups/fetch',
async (_params, { getState }) =>

View File

@ -106,12 +106,13 @@ export const connectTimelineStream = (timelineId, channelName, params = {}, opti
dispatch(processNewNotificationForGroups(notificationJSON));
break;
}
case 'notifications_merged':
case 'notifications_merged': {
const state = getState();
if (state.notifications.top || !state.notifications.mounted)
dispatch(expandNotifications({ forceLoad: true, maxId: undefined }));
dispatch(refreshStaleNotificationGroups());
break;
}
case 'conversation':
// @ts-expect-error
dispatch(updateConversations(JSON.parse(data.payload)));

View File

@ -13,7 +13,7 @@ export interface ApiAccountRoleJSON {
}
// See app/serializers/rest/account_serializer.rb
export interface ApiAccountJSON {
export interface BaseApiAccountJSON {
acct: string;
avatar: string;
avatar_static: string;
@ -45,3 +45,12 @@ export interface ApiAccountJSON {
memorial?: boolean;
hide_collections: boolean;
}
// See app/serializers/rest/muted_account_serializer.rb
export interface ApiMutedAccountJSON extends BaseApiAccountJSON {
mute_expires_at?: string | null;
}
// For now, we have the same type representing both `Account` and `MutedAccount`
// objects, but we should refactor this in the future.
export type ApiAccountJSON = ApiMutedAccountJSON;

View File

@ -1,9 +1,10 @@
import { useState, useCallback } from 'react';
import classNames from 'classnames';
import type {Account} from 'flavours/glitch/models/account';
import {useHovering} from '../hooks/useHovering';
import {autoPlayGif} from '../initial_state';
import { useHovering } from 'flavours/glitch/hooks/useHovering';
import { autoPlayGif } from 'flavours/glitch/initial_state';
import type { Account } from 'flavours/glitch/models/account';
interface Props {
account: Account | undefined; // FIXME: remove `undefined` once we know for sure its always there
@ -25,6 +26,8 @@ export const Avatar: React.FC<Props> = ({
counterBorderColor,
}) => {
const { hovering, handleMouseEnter, handleMouseLeave } = useHovering(animate);
const [loading, setLoading] = useState(true);
const [error, setError] = useState(false);
const style = {
...styleFromParent,
@ -37,17 +40,29 @@ export const Avatar: React.FC<Props> = ({
? account?.get('avatar')
: account?.get('avatar_static');
const handleLoad = useCallback(() => {
setLoading(false);
}, [setLoading]);
const handleError = useCallback(() => {
setError(true);
}, [setError]);
return (
<div
className={classNames('account__avatar', {
'account__avatar-inline': inline,
'account__avatar--inline': inline,
'account__avatar--loading': loading,
})}
onMouseEnter={handleMouseEnter}
onMouseLeave={handleMouseLeave}
style={style}
data-avatar-of={account && `@${account.get('acct')}`}
>
{src && <img src={src} alt='' />}
{src && !error && (
<img src={src} alt='' onLoad={handleLoad} onError={handleError} />
)}
{counter && (
<div
className='account__avatar__counter'

View File

@ -198,7 +198,7 @@ class Item extends PureComponent {
{visible && thumbnail}
{badges && (
{visible && badges && (
<div className='media-gallery__item__badges'>
{badges}
</div>
@ -356,14 +356,14 @@ class MediaGallery extends PureComponent {
return (
<div className={computedClass} style={style} ref={this.handleRef}>
{children}
{(!visible || uncached) && (
<div className={classNames('spoiler-button', { 'spoiler-button--click-thru': uncached })}>
{spoilerButton}
</div>
)}
{children}
{(visible && !uncached) && (
<div className='media-gallery__actions'>
<button className='media-gallery__actions__pill' onClick={this.handleOpen}><FormattedMessage id='media_gallery.hide' defaultMessage='Hide' /></button>

View File

@ -41,7 +41,7 @@ const isLinkMisleading = (link) => {
case Node.TEXT_NODE:
linkTextParts.push(node.textContent);
break;
case Node.ELEMENT_NODE:
case Node.ELEMENT_NODE: {
if (node.classList.contains('invisible')) return;
const children = node.childNodes;
for (let i = 0; i < children.length; i++) {
@ -49,6 +49,7 @@ const isLinkMisleading = (link) => {
}
break;
}
}
};
walk(link);

View File

@ -129,8 +129,13 @@ export const InlineFollowSuggestions = ({ hidden }) => {
return;
}
setCanScrollLeft(bodyRef.current.scrollLeft > 0);
setCanScrollRight((bodyRef.current.scrollLeft + bodyRef.current.clientWidth) < bodyRef.current.scrollWidth);
if (getComputedStyle(bodyRef.current).direction === 'rtl') {
setCanScrollLeft((bodyRef.current.clientWidth - bodyRef.current.scrollLeft) < bodyRef.current.scrollWidth);
setCanScrollRight(bodyRef.current.scrollLeft < 0);
} else {
setCanScrollLeft(bodyRef.current.scrollLeft > 0);
setCanScrollRight((bodyRef.current.scrollLeft + bodyRef.current.clientWidth) < bodyRef.current.scrollWidth);
}
}, [setCanScrollRight, setCanScrollLeft, bodyRef, suggestions]);
const handleLeftNav = useCallback(() => {

View File

@ -16,6 +16,7 @@ import {
import type { IconProp } from 'flavours/glitch/components/icon';
import { Icon } from 'flavours/glitch/components/icon';
import Status from 'flavours/glitch/containers/status_container';
import { getStatusHidden } from 'flavours/glitch/selectors/filters';
import { useAppSelector, useAppDispatch } from 'flavours/glitch/store';
import { DisplayedName } from './displayed_name';
@ -51,6 +52,12 @@ export const NotificationWithStatus: React.FC<{
(state) => state.statuses.getIn([statusId, 'visibility']) === 'direct',
);
const isFiltered = useAppSelector(
(state) =>
statusId &&
getStatusHidden(state, { id: statusId, contextType: 'notifications' }),
);
const handlers = useMemo(
() => ({
open: () => {
@ -77,7 +84,7 @@ export const NotificationWithStatus: React.FC<{
[dispatch, statusId],
);
if (!statusId) return null;
if (!statusId || isFiltered) return null;
return (
<HotKeys handlers={handlers}>

View File

@ -15,6 +15,7 @@ import {Icon} from 'flavours/glitch/components/icon';
import {
selectSettingsNotificationsQuickFilterActive,
selectSettingsNotificationsQuickFilterAdvanced,
selectSettingsNotificationsQuickFilterShow,
} from 'flavours/glitch/selectors/settings';
import {useAppDispatch, useAppSelector} from 'flavours/glitch/store';
@ -70,6 +71,11 @@ export const FilterBar: React.FC = () => {
const advancedMode = useAppSelector(
selectSettingsNotificationsQuickFilterAdvanced,
);
const useFilterBar = useAppSelector(
selectSettingsNotificationsQuickFilterShow,
);
if (!useFilterBar) return null;
if (advancedMode)
return (

View File

@ -267,6 +267,7 @@ export const DetailedStatus: React.FC<{
src={attachment.get('url')}
alt={description}
lang={language}
inline
width={300}
height={150}
onOpenVideo={handleOpenVideo}

View File

@ -15,7 +15,7 @@ const ColumnLink = ({ icon, activeIcon, iconComponent, activeIconComponent, text
if (href) {
return (
<a href={href} className={className} data-method={method} title={text} {...other}>
<a href={href} className={className} data-method={method} {...other}>
{active ? activeIconElement : iconElement}
<span>{text}</span>
{badgeElement}
@ -23,7 +23,7 @@ const ColumnLink = ({ icon, activeIcon, iconComponent, activeIconComponent, text
);
} else if (to) {
return (
<NavLink to={to} className={className} title={text} exact {...other}>
<NavLink to={to} className={className} exact {...other}>
{active ? activeIconElement : iconElement}
<span>{text}</span>
{badgeElement}
@ -37,7 +37,7 @@ const ColumnLink = ({ icon, activeIcon, iconComponent, activeIconComponent, text
};
return (
// eslint-disable-next-line jsx-a11y/anchor-is-valid -- intentional to have the same look and feel as other menu items
<a href='#' onClick={onClick && handleOnClick} className={className} title={text} {...other} tabIndex={0}>
<a href='#' onClick={onClick && handleOnClick} className={className} {...other} tabIndex={0}>
{iconElement}
<span>{text}</span>
{badgeElement}

View File

@ -1,41 +1,35 @@
import PropTypes from 'prop-types';
import {PureComponent} from 'react';
import { PureComponent } from 'react';
import {defineMessages, FormattedMessage, injectIntl} from 'react-intl';
import { defineMessages, FormattedMessage, injectIntl } from 'react-intl';
import classNames from 'classnames';
import {Redirect, Route, withRouter} from 'react-router-dom';
import { Redirect, Route, withRouter } from 'react-router-dom';
import {connect} from 'react-redux';
import { connect } from 'react-redux';
import Favico from 'favico.js';
import {debounce} from 'lodash';
import {HotKeys} from 'react-hotkeys';
import { debounce } from 'lodash';
import { HotKeys } from 'react-hotkeys';
import {changeLayout, focusApp, unfocusApp} from 'flavours/glitch/actions/app';
import {fetchMarkers, submitMarkers, synchronouslySubmitMarkers} from 'flavours/glitch/actions/markers';
import {initializeNotifications} from 'flavours/glitch/actions/notifications_migration';
import {INTRODUCTION_VERSION} from 'flavours/glitch/actions/onboarding';
import {HoverCardController} from 'flavours/glitch/components/hover_card_controller';
import {Permalink} from 'flavours/glitch/components/permalink';
import {PictureInPicture} from 'flavours/glitch/features/picture_in_picture';
import {identityContextPropShape, withIdentity} from 'flavours/glitch/identity_context';
import {layoutFromWindow} from 'flavours/glitch/is_mobile';
import {WithRouterPropTypes} from 'flavours/glitch/utils/react_router';
import { focusApp, unfocusApp, changeLayout } from 'flavours/glitch/actions/app';
import { synchronouslySubmitMarkers, submitMarkers, fetchMarkers } from 'flavours/glitch/actions/markers';
import { initializeNotifications } from 'flavours/glitch/actions/notifications_migration';
import { INTRODUCTION_VERSION } from 'flavours/glitch/actions/onboarding';
import { HoverCardController } from 'flavours/glitch/components/hover_card_controller';
import { Permalink } from 'flavours/glitch/components/permalink';
import { PictureInPicture } from 'flavours/glitch/features/picture_in_picture';
import { identityContextPropShape, withIdentity } from 'flavours/glitch/identity_context';
import { layoutFromWindow } from 'flavours/glitch/is_mobile';
import { selectUnreadNotificationGroupsCount } from 'flavours/glitch/selectors/notifications';
import { WithRouterPropTypes } from 'flavours/glitch/utils/react_router';
import {changeComposeSpoilerness, resetCompose, uploadCompose} from '../../actions/compose';
import {clearHeight} from '../../actions/height_cache';
import {notificationsSetVisibility} from '../../actions/notifications';
import {fetchServer, fetchServerTranslationLanguages} from '../../actions/server';
import {expandHomeTimeline} from '../../actions/timelines';
import initialState, {
disableHoverCards,
me,
owner,
singleUserMode,
trendsAsLanding,
trendsEnabled
} from '../../initial_state';
import { uploadCompose, resetCompose, changeComposeSpoilerness } from '../../actions/compose';
import { clearHeight } from '../../actions/height_cache';
import { notificationsSetVisibility } from '../../actions/notifications';
import { fetchServer, fetchServerTranslationLanguages } from '../../actions/server';
import { expandHomeTimeline } from '../../actions/timelines';
import initialState, { me, owner, singleUserMode, trendsEnabled, trendsAsLanding, disableHoverCards } from '../../initial_state';
import BundleColumnError from './components/bundle_column_error';
import Header from './components/header';
@ -45,43 +39,43 @@ import LoadingBarContainer from './containers/loading_bar_container';
import ModalContainer from './containers/modal_container';
import NotificationsContainer from './containers/notifications_container';
import {
About,
AccountGallery,
AccountTimeline,
Blocks,
BookmarkedStatuses,
Compose,
Directory,
DirectTimeline,
DomainBlocks,
Explore,
FavouritedStatuses,
Favourites,
Status,
GettingStarted,
KeyboardShortcuts,
Firehose,
FollowedTags,
AccountTimeline,
AccountGallery,
HomeTimeline,
Followers,
Following,
FollowRequests,
GettingStarted,
GettingStartedMisc,
HashtagTimeline,
HomeTimeline,
KeyboardShortcuts,
LinkTimeline,
Lists,
ListTimeline,
Mutes,
NotificationRequest,
NotificationRequests,
NotificationsWrapper,
Onboarding,
PinnedStatuses,
PrivacyPolicy,
Reblogs,
Status,
Favourites,
DirectTimeline,
HashtagTimeline,
NotificationsWrapper,
NotificationRequests,
NotificationRequest,
FollowRequests,
FavouritedStatuses,
BookmarkedStatuses,
FollowedTags,
LinkTimeline,
ListTimeline,
Blocks,
DomainBlocks,
Mutes,
PinnedStatuses,
Lists,
GettingStartedMisc,
Directory,
Explore,
Onboarding,
About,
PrivacyPolicy,
} from './util/async-components';
import {ColumnsContextProvider} from './util/columns_context';
import {WrappedRoute, WrappedSwitch} from './util/react_router_helpers';
import { ColumnsContextProvider } from './util/columns_context';
import { WrappedSwitch, WrappedRoute } from './util/react_router_helpers';
// Dummy import, to make sure that <Status /> ends up in the application bundle.
// Without this it ends up in ~8 very commonly used bundles.
@ -97,7 +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']),
unreadNotifications: state.getIn(['notifications', 'unread']),
unreadNotifications: selectUnreadNotificationGroupsCount(state),
showFaviconBadge: state.getIn(['local_settings', 'notifications', 'favicon_badge']),
hicolorPrivacyIcons: state.getIn(['local_settings', 'hicolor_privacy_icons']),
moved: state.getIn(['accounts', me, 'moved']) && state.getIn(['accounts', state.getIn(['accounts', me, 'moved'])]),

View File

@ -95,6 +95,9 @@ export const accountDefaultValues: AccountShape = {
limited: false,
moved: null,
hide_collections: false,
// This comes from `ApiMutedAccountJSON`, but we should eventually
// store that in a different object.
mute_expires_at: null,
};
const AccountFactory = ImmutableRecord<AccountShape>(accountDefaultValues);

View File

@ -507,12 +507,12 @@ export default function compose(state = initialState, action) {
.set('isUploadingThumbnail', false)
.update('media_attachments', list => list.map(item => {
if (item.get('id') === action.media.id) {
return fromJS(action.media);
return fromJS(action.media).set('unattached', item.get('unattached'));
}
return item;
}));
case INIT_MEDIA_EDIT_MODAL:
case INIT_MEDIA_EDIT_MODAL: {
const media = state.get('media_attachments').find(item => item.get('id') === action.id);
return state.set('media_modal', ImmutableMap({
id: action.id,
@ -521,6 +521,7 @@ export default function compose(state = initialState, action) {
focusY: media.getIn(['meta', 'focus', 'y'], 0),
dirty: false,
}));
}
case COMPOSE_CHANGE_MEDIA_DESCRIPTION:
return state.setIn(['media_modal', 'description'], action.description).setIn(['media_modal', 'dirty'], true);
case COMPOSE_CHANGE_MEDIA_FOCUS:
@ -575,7 +576,7 @@ export default function compose(state = initialState, action) {
}));
case COMPOSE_DOODLE_SET:
return state.mergeIn(['doodle'], action.options);
case REDRAFT:
case REDRAFT: {
const do_not_federate = !!action.status.get('local_only');
let text = action.raw_text || unescapeHTML(expandMentions(action.status));
if (do_not_federate) text = text.replace(/ ?👁\ufe0f?\u200b?$/, '');
@ -616,6 +617,7 @@ export default function compose(state = initialState, action) {
}));
}
});
}
case COMPOSE_SET_STATUS:
return state.withMutations(map => {
map.set('id', action.status.get('id'));

View File

@ -21,6 +21,7 @@ import {
unmountNotifications,
refreshStaleNotificationGroups,
pollRecentNotifications,
shouldGroupNotificationType,
} from 'flavours/glitch/actions/notification_groups';
import {
disconnectTimeline,
@ -205,6 +206,13 @@ function processNewNotification(
groups: NotificationGroupsState['groups'],
notification: ApiNotificationJSON,
) {
if (!shouldGroupNotificationType(notification.type)) {
notification = {
...notification,
group_key: `ungrouped-${notification.id}`,
};
}
const existingGroupIndex = groups.findIndex(
(group) =>
group.type !== 'gap' && group.group_key === notification.group_key,
@ -242,7 +250,7 @@ function processNewNotification(
groups.unshift(existingGroup);
}
} else {
// Create a new group
// We have not found an existing group, create a new one
groups.unshift(createNotificationGroupFromNotificationJSON(notification));
}
}
@ -551,7 +559,10 @@ export const notificationGroupsReducer = createReducer<NotificationGroupsState>(
compareId(state.lastReadId, mostRecentGroup.page_max_id) < 0
)
state.lastReadId = mostRecentGroup.page_max_id;
commitLastReadId(state);
// We don't call `commitLastReadId`, because that is conditional
// and we want to unconditionally update the state instead.
state.readMarkerId = state.lastReadId;
})
.addCase(fetchMarkers.fulfilled, (state, action) => {
if (

View File

@ -367,9 +367,10 @@ export default function notifications(state = initialState, action) {
}
return markAllForDelete(st, action.yes);
case NOTIFICATIONS_MARK_AS_READ:
case NOTIFICATIONS_MARK_AS_READ: {
const lastNotification = state.get('items').find(item => item !== null);
return lastNotification ? recountUnread(state, lastNotification.get('id')) : state;
}
default:
return state;

View File

@ -72,9 +72,10 @@ export default function search(state = initialState, action) {
});
case SEARCH_EXPAND_REQUEST:
return state.set('type', action.searchType).set('isLoading', true);
case SEARCH_EXPAND_SUCCESS:
case SEARCH_EXPAND_SUCCESS: {
const results = action.searchType === 'hashtags' ? ImmutableOrderedSet(fromJS(action.results.hashtags)) : action.results[action.searchType].map(item => item.id);
return state.updateIn(['results', action.searchType], list => list.union(results)).set('isLoading', false);
}
case SEARCH_HISTORY_UPDATE:
return state.set('recent', ImmutableOrderedSet(fromJS(action.recent)));
default:

View File

@ -0,0 +1,50 @@
import { createSelector } from '@reduxjs/toolkit';
import type { RootState } from 'flavours/glitch/store';
import { toServerSideType } from 'flavours/glitch/utils/filters';
// TODO: move to `app/javascript/flavours/glitch/models` and use more globally
type Filter = Immutable.Map<string, unknown>;
// TODO: move to `app/javascript/flavours/glitch/models` and use more globally
type FilterResult = Immutable.Map<string, unknown>;
export const getFilters = createSelector(
[
(state: RootState) => state.filters as Immutable.Map<string, Filter>,
(_, { contextType }: { contextType: string }) => contextType,
],
(filters, contextType) => {
if (!contextType) {
return null;
}
const now = new Date();
const serverSideType = toServerSideType(contextType);
return filters.filter((filter) => {
const context = filter.get('context') as Immutable.List<string>;
const expiration = filter.get('expires_at') as Date | null;
return (
context.includes(serverSideType) &&
(expiration === null || expiration > now)
);
});
},
);
export const getStatusHidden = (
state: RootState,
{ id, contextType }: { id: string; contextType: string },
) => {
const filters = getFilters(state, { contextType });
if (filters === null) return false;
const filtered = state.statuses.getIn([id, 'filtered']) as
| Immutable.List<FilterResult>
| undefined;
return filtered?.some(
(result) =>
filters.getIn([result.get('filter'), 'filter_action']) === 'hide',
);
};

View File

@ -1,23 +1,12 @@
import { createSelector } from '@reduxjs/toolkit';
import { List as ImmutableList, Map as ImmutableMap } from 'immutable';
import { toServerSideType } from 'flavours/glitch/utils/filters';
import { me } from '../initial_state';
import { getFilters } from './filters';
export { makeGetAccount } from "./accounts";
const getFilters = createSelector([state => state.get('filters'), (_, { contextType }) => contextType], (filters, contextType) => {
if (!contextType) {
return null;
}
const now = new Date();
const serverSideType = toServerSideType(contextType);
return filters.filter(filter => filter.get('context').includes(serverSideType) && (filter.get('expires_at') === null || filter.get('expires_at') > now));
});
export const makeGetStatus = () => {
return createSelector(
[

View File

@ -226,6 +226,10 @@ $content-width: 840px;
gap: 5px;
white-space: nowrap;
@media screen and (max-width: $mobile-breakpoint) {
flex: 1 0 50%;
}
&:hover,
&:focus,
&:active {
@ -1046,6 +1050,12 @@ a.name-tag,
color: var(--user-role-accent);
}
.applications-list {
.icon {
vertical-align: middle;
}
}
.announcements-list,
.filters-list {
border: 1px solid var(--background-border-color);
@ -1075,6 +1085,10 @@ a.name-tag,
}
}
.icon {
vertical-align: middle;
}
a.announcements-list__item__title {
&:hover,
&:focus,

View File

@ -141,6 +141,7 @@ body {
width: 100%;
height: auto;
margin-top: -120px;
margin-bottom: -45px;
}
}

View File

@ -2272,7 +2272,6 @@ body > [data-popper-placement] {
display: block;
position: relative;
border-radius: var(--avatar-border-radius);
background-color: var(--surface-background-color);
img {
width: 100%;
@ -2282,7 +2281,11 @@ body > [data-popper-placement] {
display: inline-block; // to not show broken images
}
&-inline {
&--loading {
background-color: var(--surface-background-color);
}
&--inline {
display: inline-block;
vertical-align: middle;
margin-inline-end: 5px;
@ -3806,6 +3809,7 @@ $ui-header-logo-wordmark-width: 99px;
overflow-y: auto;
width: 100%;
height: 100%;
z-index: 0;
}
.drawer__inner__mastodon {
@ -8538,79 +8542,23 @@ noscript {
background: rgba($base-overlay-background, 0.5);
}
.list-adder,
.list-editor {
background: $ui-base-color;
backdrop-filter: var(--background-filter);
background: var(--modal-background-color);
border: 1px solid var(--modal-border-color);
flex-direction: column;
border-radius: 8px;
box-shadow: 2px 4px 15px rgba($base-shadow-color, 0.4);
width: 380px;
overflow: hidden;
@media screen and (width <= 420px) {
width: 90%;
}
h4 {
padding: 15px 0;
background: lighten($ui-base-color, 13%);
font-weight: 500;
font-size: 16px;
text-align: center;
border-radius: 8px 8px 0 0;
}
.drawer__pager {
height: 50vh;
border-radius: 4px;
}
.drawer__inner {
border-radius: 0 0 8px 8px;
&.backdrop {
width: calc(100% - 60px);
box-shadow: 2px 4px 15px rgba($base-shadow-color, 0.4);
border-radius: 0 0 0 8px;
}
}
&__accounts {
overflow-y: auto;
}
.account__display-name {
&:hover strong {
text-decoration: none;
}
}
.account__avatar {
cursor: default;
}
.search {
margin-bottom: 0;
}
}
.list-adder {
background: $ui-base-color;
flex-direction: column;
border-radius: 8px;
box-shadow: 2px 4px 15px rgba($base-shadow-color, 0.4);
width: 380px;
overflow: hidden;
@media screen and (width <= 420px) {
width: 90%;
}
&__account {
background: lighten($ui-base-color, 13%);
}
&__lists {
background: lighten($ui-base-color, 13%);
height: 50vh;
border-radius: 0 0 8px 8px;
overflow-y: auto;
@ -8631,6 +8579,52 @@ noscript {
text-decoration: none;
font-size: 16px;
padding: 10px;
display: flex;
align-items: center;
gap: 4px;
}
}
.list-editor {
h4 {
padding: 15px 0;
background: lighten($ui-base-color, 13%);
font-weight: 500;
font-size: 16px;
text-align: center;
border-radius: 8px 8px 0 0;
}
.drawer__pager {
height: 50vh;
border: 0;
}
.drawer__inner {
&.backdrop {
width: calc(100% - 60px);
box-shadow: 2px 4px 15px rgba($base-shadow-color, 0.4);
border-radius: 0 0 0 8px;
}
}
&__accounts {
background: unset;
overflow-y: auto;
}
.account__display-name {
&:hover strong {
text-decoration: none;
}
}
.account__avatar {
cursor: default;
}
.search {
margin-bottom: 0;
}
}
@ -11190,6 +11184,7 @@ noscript {
gap: 8px;
.logo {
width: 16px;
height: 16px;
color: $darker-text-color;
}

View File

@ -137,6 +137,7 @@ a.table-action-link {
padding: 0 10px;
color: $darker-text-color;
font-weight: 500;
white-space: nowrap;
&:hover {
color: $highlight-text-color;

View File

@ -17,7 +17,7 @@ const dropOrientationIfNeeded = (orientation) => new Promise(resolve => {
case false:
resolve(orientation);
break;
default:
default: {
// black 2x1 JPEG, with the following meta information set:
// - EXIF Orientation: 6 (Rotated 90° CCW)
const testImageURL =
@ -39,6 +39,7 @@ const dropOrientationIfNeeded = (orientation) => new Promise(resolve => {
};
img.src = testImageURL;
}
}
});
// Some browsers don't allow reading from a canvas and instead return all-white
@ -52,7 +53,7 @@ const checkCanvasReliability = () => new Promise((resolve, reject) => {
case false:
resolve();
break;
default:
default: {
// 2×2 GIF with white, red, green and blue pixels
const testImageURL =
'data:image/gif;base64,R0lGODdhAgACAKEDAAAA//8AAAD/AP///ywAAAAAAgACAAACA1wEBQA7';
@ -78,6 +79,7 @@ const checkCanvasReliability = () => new Promise((resolve, reject) => {
};
img.src = testImageURL;
}
}
});
const getImageUrl = inputFile => new Promise((resolve, reject) => {

View File

@ -37,8 +37,7 @@ export const synchronouslySubmitMarkers = createAppAsyncThunk(
});
return;
// eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
} else if ('navigator' && 'sendBeacon' in navigator) {
} else if ('sendBeacon' in navigator) {
// Failing that, we can use sendBeacon, but we have to encode the data as
// FormData for DoorKeeper to recognize the token.
const formData = new FormData();

View File

@ -70,6 +70,10 @@ function dispatchAssociatedRecords(
const supportedGroupedNotificationTypes = ['favourite', 'reblog'];
export function shouldGroupNotificationType(type: string) {
return supportedGroupedNotificationTypes.includes(type);
}
export const fetchNotifications = createDataLoadingThunk(
'notificationGroups/fetch',
async (_params, { getState }) =>

View File

@ -106,12 +106,13 @@ export const connectTimelineStream = (timelineId, channelName, params = {}, opti
dispatch(processNewNotificationForGroups(notificationJSON));
break;
}
case 'notifications_merged':
case 'notifications_merged': {
const state = getState();
if (state.notifications.top || !state.notifications.mounted)
dispatch(expandNotifications({ forceLoad: true, maxId: undefined }));
dispatch(refreshStaleNotificationGroups());
break;
}
case 'conversation':
// @ts-expect-error
dispatch(updateConversations(JSON.parse(data.payload)));

View File

@ -13,7 +13,7 @@ export interface ApiAccountRoleJSON {
}
// See app/serializers/rest/account_serializer.rb
export interface ApiAccountJSON {
export interface BaseApiAccountJSON {
acct: string;
avatar: string;
avatar_static: string;
@ -45,3 +45,12 @@ export interface ApiAccountJSON {
memorial?: boolean;
hide_collections: boolean;
}
// See app/serializers/rest/muted_account_serializer.rb
export interface ApiMutedAccountJSON extends BaseApiAccountJSON {
mute_expires_at?: string | null;
}
// For now, we have the same type representing both `Account` and `MutedAccount`
// objects, but we should refactor this in the future.
export type ApiAccountJSON = ApiMutedAccountJSON;

View File

@ -2,7 +2,7 @@
exports[`<Avatar /> Autoplay renders a animated avatar 1`] = `
<div
className="account__avatar"
className="account__avatar account__avatar--loading"
onMouseEnter={[Function]}
onMouseLeave={[Function]}
style={
@ -14,6 +14,8 @@ exports[`<Avatar /> Autoplay renders a animated avatar 1`] = `
>
<img
alt=""
onError={[Function]}
onLoad={[Function]}
src="/animated/alice.gif"
/>
</div>
@ -21,7 +23,7 @@ exports[`<Avatar /> Autoplay renders a animated avatar 1`] = `
exports[`<Avatar /> Still renders a still avatar 1`] = `
<div
className="account__avatar"
className="account__avatar account__avatar--loading"
onMouseEnter={[Function]}
onMouseLeave={[Function]}
style={
@ -33,6 +35,8 @@ exports[`<Avatar /> Still renders a still avatar 1`] = `
>
<img
alt=""
onError={[Function]}
onLoad={[Function]}
src="/static/alice.jpg"
/>
</div>

View File

@ -1,9 +1,10 @@
import { useState, useCallback } from 'react';
import classNames from 'classnames';
import type {Account} from 'mastodon/models/account';
import {useHovering} from '../../hooks/useHovering';
import {autoPlayGif} from '../initial_state';
import { useHovering } from 'mastodon/../hooks/useHovering';
import { autoPlayGif } from 'mastodon/initial_state';
import type { Account } from 'mastodon/models/account';
interface Props {
account: Account | undefined; // FIXME: remove `undefined` once we know for sure its always there
@ -25,6 +26,8 @@ export const Avatar: React.FC<Props> = ({
counterBorderColor,
}) => {
const { hovering, handleMouseEnter, handleMouseLeave } = useHovering(animate);
const [loading, setLoading] = useState(true);
const [error, setError] = useState(false);
const style = {
...styleFromParent,
@ -37,16 +40,28 @@ export const Avatar: React.FC<Props> = ({
? account?.get('avatar')
: account?.get('avatar_static');
const handleLoad = useCallback(() => {
setLoading(false);
}, [setLoading]);
const handleError = useCallback(() => {
setError(true);
}, [setError]);
return (
<div
className={classNames('account__avatar', {
'account__avatar-inline': inline,
'account__avatar--inline': inline,
'account__avatar--loading': loading,
})}
onMouseEnter={handleMouseEnter}
onMouseLeave={handleMouseLeave}
style={style}
>
{src && <img src={src} alt='' />}
{src && !error && (
<img src={src} alt='' onLoad={handleLoad} onError={handleError} />
)}
{counter && (
<div
className='account__avatar__counter'

View File

@ -196,7 +196,7 @@ class Item extends PureComponent {
{visible && thumbnail}
{badges && (
{visible && badges && (
<div className='media-gallery__item__badges'>
{badges}
</div>
@ -336,14 +336,14 @@ class MediaGallery extends PureComponent {
return (
<div className={`media-gallery media-gallery--layout-${size}`} style={style} ref={this.handleRef}>
{children}
{(!visible || uncached) && (
<div className={classNames('spoiler-button', { 'spoiler-button--click-thru': uncached })}>
{spoilerButton}
</div>
)}
{children}
{(visible && !uncached) && (
<div className='media-gallery__actions'>
<button className='media-gallery__actions__pill' onClick={this.handleOpen}><FormattedMessage id='media_gallery.hide' defaultMessage='Hide' /></button>

View File

@ -129,8 +129,13 @@ export const InlineFollowSuggestions = ({ hidden }) => {
return;
}
setCanScrollLeft(bodyRef.current.scrollLeft > 0);
setCanScrollRight((bodyRef.current.scrollLeft + bodyRef.current.clientWidth) < bodyRef.current.scrollWidth);
if (getComputedStyle(bodyRef.current).direction === 'rtl') {
setCanScrollLeft((bodyRef.current.clientWidth - bodyRef.current.scrollLeft) < bodyRef.current.scrollWidth);
setCanScrollRight(bodyRef.current.scrollLeft < 0);
} else {
setCanScrollLeft(bodyRef.current.scrollLeft > 0);
setCanScrollRight((bodyRef.current.scrollLeft + bodyRef.current.clientWidth) < bodyRef.current.scrollWidth);
}
}, [setCanScrollRight, setCanScrollLeft, bodyRef, suggestions]);
const handleLeftNav = useCallback(() => {

View File

@ -13,6 +13,7 @@ import {
import type { IconProp } from 'mastodon/components/icon';
import { Icon } from 'mastodon/components/icon';
import Status from 'mastodon/containers/status_container';
import { getStatusHidden } from 'mastodon/selectors/filters';
import { useAppSelector, useAppDispatch } from 'mastodon/store';
import { DisplayedName } from './displayed_name';
@ -48,6 +49,12 @@ export const NotificationWithStatus: React.FC<{
(state) => state.statuses.getIn([statusId, 'visibility']) === 'direct',
);
const isFiltered = useAppSelector(
(state) =>
statusId &&
getStatusHidden(state, { id: statusId, contextType: 'notifications' }),
);
const handlers = useMemo(
() => ({
open: () => {
@ -73,7 +80,7 @@ export const NotificationWithStatus: React.FC<{
[dispatch, statusId],
);
if (!statusId) return null;
if (!statusId || isFiltered) return null;
return (
<HotKeys handlers={handlers}>

View File

@ -15,7 +15,7 @@ const ColumnLink = ({ icon, activeIcon, iconComponent, activeIconComponent, text
if (href) {
return (
<a href={href} className={className} data-method={method} title={text} {...other}>
<a href={href} className={className} data-method={method} {...other}>
{active ? activeIconElement : iconElement}
<span>{text}</span>
{badgeElement}
@ -23,7 +23,7 @@ const ColumnLink = ({ icon, activeIcon, iconComponent, activeIconComponent, text
);
} else {
return (
<NavLink to={to} className={className} title={text} exact {...other}>
<NavLink to={to} className={className} exact {...other}>
{active ? activeIconElement : iconElement}
<span>{text}</span>
{badgeElement}

View File

@ -84,6 +84,7 @@
"alert.rate_limited.title": "معدل الطلبات محدود",
"alert.unexpected.message": "لقد طرأ خطأ غير متوقّع.",
"alert.unexpected.title": "المعذرة!",
"alt_text_badge.title": "نص بديل",
"announcement.announcement": "إعلان",
"attachments_list.unprocessed": "(غير معالَج)",
"audio.hide": "إخفاء المقطع الصوتي",
@ -758,7 +759,7 @@
"status.history.edited": "عدله {name} {date}",
"status.load_more": "حمّل المزيد",
"status.media.open": "اضغط للفتح",
"status.media.show": "اضغط لإظهاره",
"status.media.show": "اضغط لإظهارها",
"status.media_hidden": "وسائط مخفية",
"status.mention": "أذكُر @{name}",
"status.more": "المزيد",

View File

@ -85,6 +85,7 @@
"alert.rate_limited.title": "Ліміт перавышаны",
"alert.unexpected.message": "Узнікла нечаканая памылка.",
"alert.unexpected.title": "Вой!",
"alt_text_badge.title": "Альтернативный текст",
"announcement.announcement": "Аб'ява",
"attachments_list.unprocessed": "(неапрацаваны)",
"audio.hide": "Схаваць аўдыя",

View File

@ -516,6 +516,7 @@
"notification.label.private_reply": "Resposta en privat",
"notification.label.reply": "Resposta",
"notification.mention": "Menció",
"notification.mentioned_you": "{name} us ha mencionat",
"notification.moderation-warning.learn_more": "Per a saber-ne més",
"notification.moderation_warning": "Heu rebut un avís de moderació",
"notification.moderation_warning.action_delete_statuses": "S'han eliminat algunes de les vostres publicacions.",

View File

@ -85,6 +85,7 @@
"alert.rate_limited.title": "Cyfradd gyfyngedig",
"alert.unexpected.message": "Digwyddodd gwall annisgwyl.",
"alert.unexpected.title": "Wps!",
"alt_text_badge.title": "Testun Amgen",
"announcement.announcement": "Cyhoeddiad",
"attachments_list.unprocessed": "(heb eu prosesu)",
"audio.hide": "Cuddio sain",
@ -221,6 +222,7 @@
"domain_block_modal.they_cant_follow": "Ni all neb o'r gweinydd hwn eich dilyn.",
"domain_block_modal.they_wont_know": "Fyddan nhw ddim yn gwybod eu bod wedi cael eu blocio.",
"domain_block_modal.title": "Blocio parth?",
"domain_block_modal.you_will_lose_relationships": "Byddwch yn colli'r holl ddilynwyr a phobl rydych chi'n eu dilyn o'r gweinydd hwn.",
"domain_block_modal.you_wont_see_posts": "Fyddwch chi ddim yn gweld postiadau na hysbysiadau gan ddefnyddwyr ar y gweinydd hwn.",
"domain_pill.activitypub_lets_connect": "Mae'n caniatáu ichi gysylltu a rhyngweithio â phobl nid yn unig ar Mastodon, ond ar draws gwahanol apiau cymdeithasol hefyd.",
"domain_pill.activitypub_like_language": "Mae ActivityPub fel yr iaith y mae Mastodon yn ei siarad â rhwydweithiau cymdeithasol eraill.",
@ -849,6 +851,11 @@
"upload_error.poll": "Nid oes modd llwytho ffeiliau â phleidleisiau.",
"upload_form.audio_description": "Disgrifio ar gyfer pobl sydd â cholled clyw",
"upload_form.description": "Disgrifio i'r rheini a nam ar ei golwg",
"upload_form.drag_and_drop.instructions": "I godi atodiad cyfryngau, pwyswch y space neu enter. Wrth lusgo, defnyddiwch y bysellau saeth i symud yr atodiad cyfryngau i unrhyw gyfeiriad penodol. Pwyswch space neu enter eto i ollwng yr atodiad cyfryngau yn ei safle newydd, neu pwyswch escape i ddiddymu.",
"upload_form.drag_and_drop.on_drag_cancel": "Cafodd llusgo ei ddiddymu. Cafodd atodiad cyfryngau {item} ei ollwng.",
"upload_form.drag_and_drop.on_drag_end": "Cafodd atodiad cyfryngau {item} ei ollwng.",
"upload_form.drag_and_drop.on_drag_over": "Symudwyd atodiad cyfryngau {item}.",
"upload_form.drag_and_drop.on_drag_start": "Atodiad cyfryngau godwyd {item}.",
"upload_form.edit": "Golygu",
"upload_form.thumbnail": "Newid llun bach",
"upload_form.video_description": "Disgrifio ar gyfer pobl sydd â cholled clyw neu amhariad golwg",

View File

@ -516,6 +516,7 @@
"notification.label.private_reply": "Privat svar",
"notification.label.reply": "Besvar",
"notification.mention": "Omtale",
"notification.mentioned_you": "{name} nævnte dig",
"notification.moderation-warning.learn_more": "Læs mere",
"notification.moderation_warning": "Du er tildelt en moderationsadvarsel",
"notification.moderation_warning.action_delete_statuses": "Nogle af dine indlæg er blevet fjernet.",

View File

@ -41,7 +41,7 @@
"account.go_to_profile": "Profil aufrufen",
"account.hide_reblogs": "Geteilte Beiträge von @{name} ausblenden",
"account.in_memoriam": "Zum Andenken.",
"account.joined_short": "Beigetreten",
"account.joined_short": "Mitglied seit",
"account.languages": "Ausgewählte Sprachen ändern",
"account.link_verified_on": "Das Profil mit dieser E-Mail-Adresse wurde bereits am {date} bestätigt",
"account.locked_info": "Die Privatsphäre dieses Kontos wurde auf „geschützt“ gesetzt. Die Person bestimmt manuell, wer ihrem Profil folgen darf.",
@ -516,6 +516,7 @@
"notification.label.private_reply": "Private Antwort",
"notification.label.reply": "Antwort",
"notification.mention": "Erwähnung",
"notification.mentioned_you": "{name} erwähnte dich",
"notification.moderation-warning.learn_more": "Mehr erfahren",
"notification.moderation_warning": "Du wurdest von den Moderator*innen verwarnt",
"notification.moderation_warning.action_delete_statuses": "Einige deiner Beiträge sind entfernt worden.",
@ -534,7 +535,7 @@
"notification.relationships_severance_event.domain_block": "Ein Admin von {from} hat {target} blockiert darunter {followersCount} deiner Follower und {followingCount, plural, one {# Konto, dem} other {# Konten, denen}} du folgst.",
"notification.relationships_severance_event.learn_more": "Mehr erfahren",
"notification.relationships_severance_event.user_domain_block": "Du hast {target} blockiert {followersCount} deiner Follower und {followingCount, plural, one {# Konto, dem} other {# Konten, denen}} du folgst, wurden entfernt.",
"notification.status": "{name} hat gerade etwas gepostet",
"notification.status": "{name} veröffentlichte gerade",
"notification.update": "{name} bearbeitete einen Beitrag",
"notification_requests.accept": "Genehmigen",
"notification_requests.accept_multiple": "{count, plural, one {# Anfrage genehmigen …} other {# Anfragen genehmigen …}}",

View File

@ -85,6 +85,7 @@
"alert.rate_limited.title": "Περιορισμός συχνότητας",
"alert.unexpected.message": "Προέκυψε απροσδόκητο σφάλμα.",
"alert.unexpected.title": "Ουπς!",
"alt_text_badge.title": "Εναλλακτικό κείμενο",
"announcement.announcement": "Ανακοίνωση",
"attachments_list.unprocessed": "(μη επεξεργασμένο)",
"audio.hide": "Απόκρυψη αρχείου ήχου",
@ -221,6 +222,8 @@
"domain_block_modal.they_cant_follow": "Κανείς από αυτόν τον διακομιστή δεν μπορεί να σε ακολουθήσει.",
"domain_block_modal.they_wont_know": "Δεν θα ξέρουν ότι έχουν αποκλειστεί.",
"domain_block_modal.title": "Αποκλεισμός τομέα;",
"domain_block_modal.you_will_lose_num_followers": "Θα χάσετε {followersCount, plural, one {{followersCountDisplay} ακόλουθο} other {{followersCountDisplay} ακόλουθους}} και {followingCount, plural, one {{followingCountDisplay} άτομο που ακολουθείτε} other {{followingCountDisplay} άτομα που ακολουθείτε}}.",
"domain_block_modal.you_will_lose_relationships": "Θα χάσετε όλους τους ακόλουθους και τα άτομα που ακολουθείτε από αυτόν τον διακομιστή.",
"domain_block_modal.you_wont_see_posts": "Δεν θα βλέπεις αναρτήσεις ή ειδοποιήσεις από χρήστες σε αυτόν το διακομιστή.",
"domain_pill.activitypub_lets_connect": "Σού επιτρέπει να συνδεθείς και να αλληλεπιδράσεις με τους ανθρώπους όχι μόνο στο Mastodon, αλλά και σε διαφορετικές κοινωνικές εφαρμογές.",
"domain_pill.activitypub_like_language": "Το ActivityPub είναι σαν τη γλώσσα Mastodon μιλάει με άλλα κοινωνικά δίκτυα.",
@ -849,6 +852,11 @@
"upload_error.poll": "Στις δημοσκοπήσεις δεν επιτρέπεται η μεταφόρτωση αρχείου.",
"upload_form.audio_description": "Περιγραφή για άτομα με προβλήματα ακοής",
"upload_form.description": "Περιγραφή για άτομα με προβλήματα όρασης",
"upload_form.drag_and_drop.instructions": "Για να επιλέξετε ένα συνημμένο αρχείο πολυμέσων, πατήστε το Space ή το Enter. Ενώ το σέρνετε, χρησιμοποιήστε τα πλήκτρα βέλους για να μετακινήσετε το συνημμένο αρχείο πολυμέσων προς οποιαδήποτε κατεύθυνση. Πατήστε ξανά το Space ή το Enter για να αποθέσετε το συνημμένο αρχείο πολυμέσων στη νέα του θέση ή πατήστε το Escape για ακύρωση.",
"upload_form.drag_and_drop.on_drag_cancel": "Η μετακίνηση ακυρώθηκε. Έγινε απόθεση του συνημμένου αρχείου πολυμέσων «{item}».",
"upload_form.drag_and_drop.on_drag_end": "Έγινε απόθεση του συνημμένου αρχείου πολυμέσων «{item}».",
"upload_form.drag_and_drop.on_drag_over": "Έγινε μετακίνηση του συνημμένου αρχείου πολυμέσων «{item}».",
"upload_form.drag_and_drop.on_drag_start": "Έγινε επιλογή του συνημμένου αρχείου πολυμέσων «{item}».",
"upload_form.edit": "Επεξεργασία",
"upload_form.thumbnail": "Αλλαγή μικρογραφίας",
"upload_form.video_description": "Περιγραφή για άτομα με προβλήματα ακοής ή όρασης",

View File

@ -852,6 +852,11 @@
"upload_error.poll": "File upload not allowed with polls.",
"upload_form.audio_description": "Describe for people who are deaf or hard of hearing",
"upload_form.description": "Describe for people who are blind or have low vision",
"upload_form.drag_and_drop.instructions": "To pick up a media attachment, press space or enter. While dragging, use the arrow keys to move the media attachment in any given direction. Press space or enter again to drop the media attachment in its new position, or press escape to cancel.",
"upload_form.drag_and_drop.on_drag_cancel": "Dragging was cancelled. Media attachment {item} was dropped.",
"upload_form.drag_and_drop.on_drag_end": "Media attachment {item} was dropped.",
"upload_form.drag_and_drop.on_drag_over": "Media attachment {item} was moved.",
"upload_form.drag_and_drop.on_drag_start": "Picked up media attachment {item}.",
"upload_form.edit": "Edit",
"upload_form.thumbnail": "Change thumbnail",
"upload_form.video_description": "Describe for people who are deaf, hard of hearing, blind or have low vision",

View File

@ -517,6 +517,7 @@
"notification.label.private_reply": "Private reply",
"notification.label.reply": "Reply",
"notification.mention": "Mention",
"notification.mentioned_you": "{name} mentioned you",
"notification.moderation-warning.learn_more": "Learn more",
"notification.moderation_warning": "You have received a moderation warning",
"notification.moderation_warning.action_delete_statuses": "Some of your posts have been removed.",

View File

@ -22,10 +22,10 @@
"account.cancel_follow_request": "Nuligi peton por sekvado",
"account.copy": "Kopii ligilon al profilo",
"account.direct": "Private mencii @{name}",
"account.disable_notifications": "Ne plu sciigi min, kiam @{name} mesaĝas",
"account.disable_notifications": "Ĉesu sciigi min kiam @{name} afiŝas",
"account.domain_blocked": "Domajno blokita",
"account.edit_profile": "Redakti la profilon",
"account.enable_notifications": "Sciigi min, kiam @{name} mesaĝas",
"account.enable_notifications": "Sciigu min kiam @{name} afiŝos",
"account.endorse": "Rekomendi ĉe via profilo",
"account.featured_tags.last_status_at": "Lasta afîŝo je {date}",
"account.featured_tags.last_status_never": "Neniu afiŝo",
@ -49,14 +49,14 @@
"account.mention": "Mencii @{name}",
"account.moved_to": "{name} indikis, ke ria nova konto estas nun:",
"account.mute": "Silentigi @{name}",
"account.mute_notifications_short": "Silentigu Sciigojn",
"account.mute_notifications_short": "Silentigu sciigojn",
"account.mute_short": "Silentigu",
"account.muted": "Silentigita",
"account.mutual": "Reciproka",
"account.no_bio": "Neniu priskribo estas provizita.",
"account.open_original_page": "Malfermi la originalan paĝon",
"account.posts": "Afiŝoj",
"account.posts_with_replies": "Mesaĝoj kaj respondoj",
"account.posts_with_replies": "Afiŝoj kaj respondoj",
"account.report": "Raporti @{name}",
"account.requested": "Atendo de aprobo. Klaku por nuligi la peton por sekvado",
"account.requested_follow": "{name} petis sekvi vin",
@ -69,7 +69,7 @@
"account.unendorse": "Ne plu rekomendi ĉe la profilo",
"account.unfollow": "Ĉesi sekvi",
"account.unmute": "Ne plu silentigi @{name}",
"account.unmute_notifications_short": "Malsilentigu Sciigojn",
"account.unmute_notifications_short": "Malsilentigu sciigojn",
"account.unmute_short": "Ne plu silentigi",
"account_note.placeholder": "Alklaku por aldoni noton",
"admin.dashboard.daily_retention": "Uzantoretenprocento lau tag post registro",
@ -81,7 +81,7 @@
"admin.impact_report.instance_followers": "Sekvantojn niaj uzantoj perdus",
"admin.impact_report.instance_follows": "Sekvantojn ties uzantoj perdus",
"admin.impact_report.title": "Influa reporto",
"alert.rate_limited.message": "Bonvolu reprovi post {retry_time, time, medium}.",
"alert.rate_limited.message": "Bonvolu reprovi poste {retry_time, time, medium}.",
"alert.rate_limited.title": "Mesaĝkvante limigita",
"alert.unexpected.message": "Neatendita eraro okazis.",
"alert.unexpected.title": "Aj!",
@ -163,7 +163,7 @@
"compose_form.poll.switch_to_single": "Ŝanĝi la balotenketon por permesi unu solan elekton",
"compose_form.poll.type": "Stilo",
"compose_form.publish": "Afiŝo",
"compose_form.publish_form": "Afiŝi",
"compose_form.publish_form": "Nova afiŝo",
"compose_form.reply": "Respondi",
"compose_form.save_changes": "Ĝisdatigi",
"compose_form.spoiler.marked": "Forigi la averton de enhavo",
@ -173,7 +173,7 @@
"confirmations.block.confirm": "Bloki",
"confirmations.delete.confirm": "Forigi",
"confirmations.delete.message": "Ĉu vi certas, ke vi volas forigi ĉi tiun afiŝon?",
"confirmations.delete.title": "Ĉu forigi Afiŝon?",
"confirmations.delete.title": "Ĉu forigi afiŝon?",
"confirmations.delete_list.confirm": "Forigi",
"confirmations.delete_list.message": "Ĉu vi certas, ke vi volas porĉiame forigi ĉi tiun liston?",
"confirmations.delete_list.title": "Ĉu forigi liston?",
@ -213,9 +213,9 @@
"dismissable_banner.community_timeline": "Jen la plej novaj publikaj afiŝoj de uzantoj, kies kontojn gastigas {domain}.",
"dismissable_banner.dismiss": "Eksigi",
"dismissable_banner.explore_links": "Tiuj novaĵoj estas aktuale priparolataj de uzantoj en tiu ĉi kaj aliaj serviloj, sur la malcentrigita reto.",
"dismissable_banner.explore_statuses": "Ĉi tioj estas afiŝoj de socia reto kiu populariĝas hodiau.",
"dismissable_banner.explore_statuses": "Ĉi tiuj estas afiŝoj de la tuta socia reto, kiuj populariĝas hodiaŭ. Pli novaj afiŝoj kun pli da diskonigoj kaj plej ŝatataj estas rangigitaj pli alte.",
"dismissable_banner.explore_tags": "Ĉi tiuj kradvostoj populariĝas en ĉi tiu kaj aliaj serviloj en la malcentraliza reto nun.",
"dismissable_banner.public_timeline": "Ĉi tioj estas plej lastaj publikaj afiŝoj de personoj ĉe socia reto kiu personoj ĉe {domain} sekvas.",
"dismissable_banner.public_timeline": "Ĉi tiuj estas la plej lastatempaj publikaj afiŝoj de homoj en la socia reto, kiujn homoj sur {domain} sekvas.",
"domain_block_modal.block": "Bloki servilon",
"domain_block_modal.block_account_instead": "Bloki @{name} anstataŭe",
"domain_block_modal.they_can_interact_with_old_posts": "Homoj de ĉi tiu servilo povas interagi kun viaj malnovaj afiŝoj.",
@ -265,8 +265,8 @@
"empty_column.direct": "Vi ankoraŭ ne havas privatan mencion. Kiam vi sendos aŭ ricevos iun, tiu aperos ĉi tie.",
"empty_column.domain_blocks": "Ankoraŭ neniu domajno estas blokita.",
"empty_column.explore_statuses": "Nenio tendencas nun. Rekontrolu poste!",
"empty_column.favourited_statuses": "Vi ankoraŭ ne havas stelumitan afiŝon.",
"empty_column.favourites": "Ankoraŭ neniu stelumis tiun afiŝon.",
"empty_column.favourited_statuses": "Vi ankoraŭ ne havas plej ŝatatajn afiŝojn. Kiam vi ŝatatas unu, ĝi aperos ĉi tie.",
"empty_column.favourites": "Neniu ankoraŭ ŝatis ĉi tiun afiŝon. Kiam iu ŝatos ĝin, ili aperos ĉi tie.",
"empty_column.follow_requests": "Vi ne ankoraŭ havas iun peton de sekvado. Kiam vi ricevos unu, ĝi aperos ĉi tie.",
"empty_column.followed_tags": "Vi ankoraŭ ne sekvas iujn kradvortojn. Kiam vi faras, ili aperos ĉi tie.",
"empty_column.hashtag": "Ankoraŭ estas nenio per ĉi tiu kradvorto.",
@ -296,7 +296,7 @@
"filter_modal.added.review_and_configure": "Por kontroli kaj pli modifi ĉi tiu filtrilkategorio, iru al la {settings_link}.",
"filter_modal.added.review_and_configure_title": "Filtrilopcioj",
"filter_modal.added.settings_link": "opciopaĝo",
"filter_modal.added.short_explanation": "Ĉi tiu mesaĝo aldonitas al la filtrilkategorio: {title}.",
"filter_modal.added.short_explanation": "Ĉi tiu afiŝo aldonitas al la filtrilkategorio: {title}.",
"filter_modal.added.title": "Filtrilo aldonita!",
"filter_modal.select_filter.context_mismatch": "ne kongruas la kuntekston",
"filter_modal.select_filter.expired": "eksvalidiĝinta",
@ -304,7 +304,7 @@
"filter_modal.select_filter.search": "Serĉi aŭ krei",
"filter_modal.select_filter.subtitle": "Uzu ekzistantan kategorion aŭ kreu novan",
"filter_modal.select_filter.title": "Filtri ĉi tiun afiŝon",
"filter_modal.title.status": "Filtri mesaĝon",
"filter_modal.title.status": "Filtri afiŝon",
"filter_warning.matches_filter": "Filtrilo de kongruoj “{title}”",
"filtered_notifications_banner.pending_requests": "El {count, plural, =0 {neniu} one {unu persono} other {# homoj}} vi eble konas",
"filtered_notifications_banner.title": "Filtritaj sciigoj",
@ -351,7 +351,7 @@
"hashtag.column_settings.tag_toggle": "Aldoni pliajn etikedojn por ĉi tiu kolumno",
"hashtag.counter_by_accounts": "{count, plural,one {{counter} partoprenanto} other {{counter} partoprenantoj}}",
"hashtag.counter_by_uses": "{count, plural,one {{counter} afiŝo} other {{counter} afiŝoj}}",
"hashtag.counter_by_uses_today": "{count, plural,one {{counter} afiŝo} other {{counter} afiŝoj}} hodiau",
"hashtag.counter_by_uses_today": "{count, plural,one {{counter} afiŝo} other {{counter} afiŝoj}} hodiaŭ",
"hashtag.follow": "Sekvi la kradvorton",
"hashtag.unfollow": "Ne plu sekvi la kradvorton",
"hashtags.and_other": "…kaj {count, plural,other {# pli}}",
@ -382,9 +382,9 @@
"ignore_notifications_modal.not_following_title": "Ĉu ignori sciigojn de homoj, kiujn vi ne sekvas?",
"ignore_notifications_modal.private_mentions_title": "Ĉu ignori sciigojn de nepetitaj privataj mencioj?",
"interaction_modal.description.favourite": "Per konto ĉe Mastodon, vi povas stelumiti ĉi tiun afiŝon por sciigi la afiŝanton ke vi aprezigas ŝin kaj konservas por la estonteco.",
"interaction_modal.description.follow": "Kun konto ĉe Mastodon, vi povos sekvi {name} por vidi ties mesaĝojn en via hejmo.",
"interaction_modal.description.follow": "Kun konto ĉe Mastodon, vi povas sekvi {name} por ricevi iliajn afiŝojn en via hejma fluo.",
"interaction_modal.description.reblog": "Kun konto ĉe Mastodon, vi povas diskonigi ĉi tiun afiŝon, por ke viaj propraj sekvantoj vidu ĝin.",
"interaction_modal.description.reply": "Kun konto ĉe Mastodon, vi povos respondi al ĉi tiu mesaĝo.",
"interaction_modal.description.reply": "Kun konto ĉe Mastodon, vi povos respondi al ĉi tiu afiŝo.",
"interaction_modal.login.action": "Prenu min hejmen",
"interaction_modal.login.prompt": "Domajno de via hejma servilo, ekz. mastodon.social",
"interaction_modal.no_account_yet": "Ĉu ne estas ĉe Mastodon?",
@ -402,12 +402,12 @@
"keyboard_shortcuts.back": "reveni",
"keyboard_shortcuts.blocked": "Malfermi la liston de blokitaj uzantoj",
"keyboard_shortcuts.boost": "Diskonigi la mesaĝon",
"keyboard_shortcuts.column": "fokusi mesaĝon en unu el la kolumnoj",
"keyboard_shortcuts.column": "Fokusi kolumnon",
"keyboard_shortcuts.compose": "enfokusigi la tekstujon",
"keyboard_shortcuts.description": "Priskribo",
"keyboard_shortcuts.direct": "por malfermi la kolumnon pri privataj mencioj",
"keyboard_shortcuts.down": "iri suben en la listo",
"keyboard_shortcuts.enter": "malfermi mesaĝon",
"keyboard_shortcuts.enter": "Malfermi afiŝon",
"keyboard_shortcuts.favourite": "Stelumi afiŝon",
"keyboard_shortcuts.favourites": "Malfermi la liston de la stelumoj",
"keyboard_shortcuts.federated": "Malfermi la frataran templinion",
@ -421,16 +421,16 @@
"keyboard_shortcuts.my_profile": "malfermi vian profilon",
"keyboard_shortcuts.notifications": "malfermi la kolumnon de sciigoj",
"keyboard_shortcuts.open_media": "Malfermi plurmedion",
"keyboard_shortcuts.pinned": "malfermi la liston de alpinglitaj mesaĝoj",
"keyboard_shortcuts.pinned": "Malfermu alpinglitajn afiŝojn-liston",
"keyboard_shortcuts.profile": "malfermi la profilon de la aŭtoro",
"keyboard_shortcuts.reply": "respondi",
"keyboard_shortcuts.reply": "Respondu al afiŝo",
"keyboard_shortcuts.requests": "Malfermi la liston de petoj por sekvado",
"keyboard_shortcuts.search": "enfokusigi la serĉilon",
"keyboard_shortcuts.spoilers": "Montri/kaŝi la kampon de averto de enhavo (\"CW\")",
"keyboard_shortcuts.start": "malfermi la kolumnon «por komenci»",
"keyboard_shortcuts.toggle_hidden": "Montri/kaŝi tekston malantaŭ la averto de enhavo (\"CW\")",
"keyboard_shortcuts.toggle_sensitivity": "Montri/kaŝi plurmedion",
"keyboard_shortcuts.toot": "Krei novan mesaĝon",
"keyboard_shortcuts.toot": "Komencu novan afiŝon",
"keyboard_shortcuts.unfocus": "malenfokusigi la tekstujon aŭ la serĉilon",
"keyboard_shortcuts.up": "iri supren en la listo",
"lightbox.close": "Fermi",
@ -476,9 +476,9 @@
"navigation_bar.blocks": "Blokitaj uzantoj",
"navigation_bar.bookmarks": "Legosignoj",
"navigation_bar.community_timeline": "Loka templinio",
"navigation_bar.compose": "Skribi novan mesaĝon",
"navigation_bar.compose": "Redakti novan afiŝon",
"navigation_bar.direct": "Privataj mencioj",
"navigation_bar.discover": "Esplori",
"navigation_bar.discover": "Malkovri",
"navigation_bar.domain_blocks": "Blokitaj domajnoj",
"navigation_bar.explore": "Esplori",
"navigation_bar.favourites": "Stelumoj",
@ -487,12 +487,12 @@
"navigation_bar.followed_tags": "Sekvataj kradvortoj",
"navigation_bar.follows_and_followers": "Sekvatoj kaj sekvantoj",
"navigation_bar.lists": "Listoj",
"navigation_bar.logout": "Adiaŭi",
"navigation_bar.logout": "Elsaluti",
"navigation_bar.moderation": "Modereco",
"navigation_bar.mutes": "Silentigitaj uzantoj",
"navigation_bar.opened_in_classic_interface": "Afiŝoj, kontoj, kaj aliaj specifaj paĝoj kiuj estas malfermititaj defaulta en la klasika reta interfaco.",
"navigation_bar.personal": "Persone",
"navigation_bar.pins": "Alpinglitaj mesaĝoj",
"navigation_bar.pins": "Alpinglitaj afiŝoj",
"navigation_bar.preferences": "Preferoj",
"navigation_bar.public_timeline": "Fratara templinio",
"navigation_bar.search": "Serĉi",
@ -516,6 +516,7 @@
"notification.label.private_reply": "Privata respondo",
"notification.label.reply": "Respondi",
"notification.mention": "Mencii",
"notification.mentioned_you": "{name} menciis vin",
"notification.moderation-warning.learn_more": "Lerni pli",
"notification.moderation_warning": "Vi ricevis moderigan averton",
"notification.moderation_warning.action_delete_statuses": "Kelkaj el viaj afiŝoj estis forigitaj.",
@ -572,7 +573,7 @@
"notifications.column_settings.reblog": "Diskonigoj:",
"notifications.column_settings.show": "Montri en kolumno",
"notifications.column_settings.sound": "Eligi sonon",
"notifications.column_settings.status": "Novaj mesaĝoj:",
"notifications.column_settings.status": "Novaj afiŝoj:",
"notifications.column_settings.unread_notifications.category": "Nelegitaj sciigoj",
"notifications.column_settings.unread_notifications.highlight": "Marki nelegitajn sciigojn",
"notifications.column_settings.update": "Redaktoj:",
@ -660,7 +661,7 @@
"poll.votes": "{votes, plural, one {# voĉdono} other {# voĉdonoj}}",
"poll_button.add_poll": "Aldoni balotenketon",
"poll_button.remove_poll": "Forigi balotenketon",
"privacy.change": "Agordi mesaĝan privatecon",
"privacy.change": "Ŝanĝu afiŝan privatecon",
"privacy.direct.long": "Ĉiuj menciitaj en la afiŝo",
"privacy.direct.short": "Specifaj homoj",
"privacy.private.long": "Nur viaj sekvantoj",
@ -775,13 +776,13 @@
"sign_in_banner.sso_redirect": "Ensalutu aŭ Registriĝi",
"status.admin_account": "Malfermi fasadon de moderigado por @{name}",
"status.admin_domain": "Malfermu moderigan interfacon por {domain}",
"status.admin_status": "Malfermi ĉi tiun mesaĝon en la kontrola interfaco",
"status.admin_status": "Malfermi ĉi tiun afiŝon en la kontrola interfaco",
"status.block": "Bloki @{name}",
"status.bookmark": "Aldoni al la legosignoj",
"status.cancel_reblog_private": "Ne plu diskonigi",
"status.cannot_reblog": "Ĉi tiun afiŝon ne eblas diskonigi",
"status.continued_thread": "Daŭrigis fadenon",
"status.copy": "Kopii la ligilon al la mesaĝo",
"status.copy": "Kopii la ligilon al la afiŝo",
"status.delete": "Forigi",
"status.detailed_status": "Detala konversacia vido",
"status.direct": "Private mencii @{name}",
@ -803,9 +804,9 @@
"status.more": "Pli",
"status.mute": "Silentigi @{name}",
"status.mute_conversation": "Silentigi konversacion",
"status.open": "Disvolvi la mesaĝon",
"status.open": "Pligrandigu ĉi tiun afiŝon",
"status.pin": "Alpingli al la profilo",
"status.pinned": "Alpinglita mesaĝo",
"status.pinned": "Alpinglita afiŝo",
"status.read_more": "Legi pli",
"status.reblog": "Diskonigi",
"status.reblog_private": "Diskonigi kun la sama videbleco",

View File

@ -516,6 +516,7 @@
"notification.label.private_reply": "Respuesta privada",
"notification.label.reply": "Respuesta",
"notification.mention": "Mención",
"notification.mentioned_you": "{name} te mencionó",
"notification.moderation-warning.learn_more": "Aprendé más",
"notification.moderation_warning": "Recibiste una advertencia de moderación",
"notification.moderation_warning.action_delete_statuses": "Se eliminaron algunos de tus mensajes.",

View File

@ -516,6 +516,7 @@
"notification.label.private_reply": "Respuesta privada",
"notification.label.reply": "Respuesta",
"notification.mention": "Mención",
"notification.mentioned_you": "{name} te ha mencionado",
"notification.moderation-warning.learn_more": "Saber más",
"notification.moderation_warning": "Has recibido una advertencia de moderación",
"notification.moderation_warning.action_delete_statuses": "Se han eliminado algunas de tus publicaciones.",
@ -852,11 +853,11 @@
"upload_error.poll": "Subida de archivos no permitida con encuestas.",
"upload_form.audio_description": "Describir para personas con problemas auditivos",
"upload_form.description": "Describir para los usuarios con dificultad visual",
"upload_form.drag_and_drop.instructions": "Para recoger un archivo multimedia, pulsa la barra espaciadora o la tecla Enter. Mientras arrastras, utiliza las teclas de flecha para mover el archivo multimedia en cualquier dirección. Vuelve a pulsar la barra espaciadora o la tecla Enter para soltar el archivo multimedia en su nueva posición, o pulsa Escape para cancelar.",
"upload_form.drag_and_drop.on_drag_cancel": "Se canceló el arrastre. Se eliminó el archivo adjunto {item}.",
"upload_form.drag_and_drop.on_drag_end": "El archivo adjunto {item} ha sido eliminado.",
"upload_form.drag_and_drop.on_drag_over": "El archivo adjunto {item} se ha movido.",
"upload_form.drag_and_drop.on_drag_start": "Se ha recogido el archivo adjunto {item}.",
"upload_form.drag_and_drop.instructions": "Para recoger un archivo adjunto, pulsa la barra espaciadora o la tecla Intro. Mientras arrastras, usa las teclas de flecha para mover el archivo adjunto en cualquier dirección. Vuelve a pulsar la barra espaciadora o la tecla Intro para soltar el archivo adjunto en su nueva posición, o pulsa la tecla Escape para cancelar.",
"upload_form.drag_and_drop.on_drag_cancel": "Arrastre cancelado. El archivo adjunto {item} fue eliminado.",
"upload_form.drag_and_drop.on_drag_end": "El archivo adjunto {item} fue eliminado.",
"upload_form.drag_and_drop.on_drag_over": "El archivo adjunto {item} fue movido.",
"upload_form.drag_and_drop.on_drag_start": "Recogidos los archivos adjuntos {item}.",
"upload_form.edit": "Editar",
"upload_form.thumbnail": "Cambiar miniatura",
"upload_form.video_description": "Describir para personas con problemas auditivos o visuales",

View File

@ -516,6 +516,7 @@
"notification.label.private_reply": "Respuesta privada",
"notification.label.reply": "Respuesta",
"notification.mention": "Mención",
"notification.mentioned_you": "{name} te ha mencionado",
"notification.moderation-warning.learn_more": "Saber más",
"notification.moderation_warning": "Has recibido una advertencia de moderación",
"notification.moderation_warning.action_delete_statuses": "Se han eliminado algunas de tus publicaciones.",

View File

@ -516,6 +516,7 @@
"notification.label.private_reply": "Yksityinen vastaus",
"notification.label.reply": "Vastaus",
"notification.mention": "Maininta",
"notification.mentioned_you": "{name} mainitsi sinut",
"notification.moderation-warning.learn_more": "Lue lisää",
"notification.moderation_warning": "Olet saanut moderointivaroituksen",
"notification.moderation_warning.action_delete_statuses": "Julkaisujasi on poistettu.",

View File

@ -516,6 +516,7 @@
"notification.label.private_reply": "Privat svar",
"notification.label.reply": "Svara",
"notification.mention": "Umrøð",
"notification.mentioned_you": "{name} nevndi teg",
"notification.moderation-warning.learn_more": "Lær meira",
"notification.moderation_warning": "Tú hevur móttikið eina umsjónarávaring",
"notification.moderation_warning.action_delete_statuses": "Onkrir av tínum postum eru strikaðir.",

View File

@ -852,6 +852,7 @@
"upload_error.poll": "Lenvoi de fichiers nest pas autorisé avec les sondages.",
"upload_form.audio_description": "Décrire pour les personnes ayant des difficultés daudition",
"upload_form.description": "Décrire pour les malvoyants",
"upload_form.drag_and_drop.instructions": "Pour choisir un média joint, appuyez sur la touche espace ou entrée. Tout en faisant glisser, utilisez les touches fléchées pour déplacer le fichier média dans une direction donnée. Appuyez à nouveau sur la touche espace ou entrée pour déposer le fichier média dans sa nouvelle position, ou appuyez sur la touche Echap pour annuler.",
"upload_form.edit": "Modifier",
"upload_form.thumbnail": "Changer la vignette",
"upload_form.video_description": "Décrire pour les personnes ayant des problèmes de vue ou d'audition",

View File

@ -852,6 +852,7 @@
"upload_error.poll": "Lenvoi de fichiers nest pas autorisé avec les sondages.",
"upload_form.audio_description": "Décrire pour les personnes ayant des difficultés daudition",
"upload_form.description": "Décrire pour les malvoyant·e·s",
"upload_form.drag_and_drop.instructions": "Pour choisir un média joint, appuyez sur la touche espace ou entrée. Tout en faisant glisser, utilisez les touches fléchées pour déplacer le fichier média dans une direction donnée. Appuyez à nouveau sur la touche espace ou entrée pour déposer le fichier média dans sa nouvelle position, ou appuyez sur la touche Echap pour annuler.",
"upload_form.edit": "Modifier",
"upload_form.thumbnail": "Changer la vignette",
"upload_form.video_description": "Décrire pour les personnes ayant des problèmes de vue ou d'audition",

View File

@ -85,6 +85,7 @@
"alert.rate_limited.title": "Dataferkear beheind",
"alert.unexpected.message": "Der is in ûnferwachte flater bard.",
"alert.unexpected.title": "Oepsy!",
"alt_text_badge.title": "Alternative tekst",
"announcement.announcement": "Oankundiging",
"attachments_list.unprocessed": "(net ferwurke)",
"audio.hide": "Audio ferstopje",
@ -221,6 +222,8 @@
"domain_block_modal.they_cant_follow": "Net ien op dizze server kin jo folgje.",
"domain_block_modal.they_wont_know": "Se krije net te witten dat se blokkearre wurde.",
"domain_block_modal.title": "Domein blokkearje?",
"domain_block_modal.you_will_lose_num_followers": "Jo ferlieze {followersCount, plural, one {{followersCountDisplay} folger} other {{followersCountDisplay} folgers}} en {followingCount, plural, one {{followingCountDisplay} persoan dyt jo folgje} other {{followingCountDisplay} persoanen dyt jo folgje}}.",
"domain_block_modal.you_will_lose_relationships": "Jo ferlieze alle folgers en minsken dyt jo folgje fan dizze server.",
"domain_block_modal.you_wont_see_posts": "Jo sjogge gjin berjochten of meldingen mear fan brûkers op dizze server.",
"domain_pill.activitypub_lets_connect": "It soarget derfoar dat jo net allinnich mar ferbine en kommunisearje kinne mei minsken op Mastodon, mar ek mei oare sosjale apps.",
"domain_pill.activitypub_like_language": "ActivityPub is de taal dyt Mastodon mei oare sosjale netwurken sprekt.",
@ -433,6 +436,8 @@
"lightbox.close": "Slute",
"lightbox.next": "Folgjende",
"lightbox.previous": "Foarige",
"lightbox.zoom_in": "Oarspronklike grutte toane",
"lightbox.zoom_out": "Passend toane",
"limited_account_hint.action": "Profyl dochs besjen",
"limited_account_hint.title": "Dit profyl is troch de behearders fan {domain} ferstoppe.",
"link_preview.author": "Troch {name}",
@ -454,6 +459,7 @@
"lists.subheading": "Jo listen",
"load_pending": "{count, plural, one {# nij item} other {# nije items}}",
"loading_indicator.label": "Lade…",
"media_gallery.hide": "Ferstopje",
"moved_to_account_banner.text": "Omdat jo nei {movedToAccount} ferhuze binne is jo account {disabledAccount} op dit stuit útskeakele.",
"mute_modal.hide_from_notifications": "Meldingen ferstopje",
"mute_modal.hide_options": "Opsjes ferstopje",
@ -510,6 +516,7 @@
"notification.label.private_reply": "Priveereaksje",
"notification.label.reply": "Beäntwurdzje",
"notification.mention": "Fermelding",
"notification.mentioned_you": "{name} hat dy fermeld",
"notification.moderation-warning.learn_more": "Mear ynfo",
"notification.moderation_warning": "Jo hawwe in moderaasje-warskôging ûntfongen",
"notification.moderation_warning.action_delete_statuses": "Guon fan jo berjochten binne fuortsmiten.",
@ -774,6 +781,7 @@
"status.bookmark": "Blêdwizer tafoegje",
"status.cancel_reblog_private": "Net langer booste",
"status.cannot_reblog": "Dit berjocht kin net boost wurde",
"status.continued_thread": "Ferfolgje it petear",
"status.copy": "Copy link to status",
"status.delete": "Fuortsmite",
"status.detailed_status": "Detaillearre petearoersjoch",
@ -782,6 +790,7 @@
"status.edit": "Bewurkje",
"status.edited": "Lêst bywurke op {date}",
"status.edited_x_times": "{count, plural, one {{count} kear} other {{count} kearen}} bewurke",
"status.embed": "Koade om op te nimmen",
"status.favourite": "Favoryt",
"status.favourites": "{count, plural, one {favoryt} other {favoriten}}",
"status.filter": "Dit berjocht filterje",
@ -806,6 +815,7 @@
"status.reblogs.empty": "Net ien hat dit berjocht noch boost. Wanneart ien dit docht, falt dat hjir te sjen.",
"status.redraft": "Fuortsmite en opnij opstelle",
"status.remove_bookmark": "Blêdwizer fuortsmite",
"status.replied_in_thread": "Antwurde yn petear",
"status.replied_to": "Antwurde op {name}",
"status.reply": "Beäntwurdzje",
"status.replyAll": "Alle beäntwurdzje",
@ -843,6 +853,11 @@
"upload_error.poll": "It opladen fan bestannen is yn enkêten net tastien.",
"upload_form.audio_description": "Describe for people with hearing loss",
"upload_form.description": "Describe for the visually impaired",
"upload_form.drag_and_drop.instructions": "Druk op spaasje of Enter om in mediabylage op te pakken. Bruk de pylktoetsen om de bylage yn in bepaalde rjochting te ferpleatsen. Druk opnij op de spaasjebalke of Enter om de mediabylage op de nije posysje te pleatsen, of druk op Esc om te annulearjen.",
"upload_form.drag_and_drop.on_drag_cancel": "Slepen is annulearre. Mediabylage {item} is net ferpleatst.",
"upload_form.drag_and_drop.on_drag_end": "Mediabylage {item} is net ferpleatst.",
"upload_form.drag_and_drop.on_drag_over": "Mediabylage {item} is ferpleatst.",
"upload_form.drag_and_drop.on_drag_start": "Mediabylage {item} is oppakt.",
"upload_form.edit": "Bewurkje",
"upload_form.thumbnail": "Miniatuerôfbylding wizigje",
"upload_form.video_description": "Describe for people with hearing loss or visual impairment",

View File

@ -85,6 +85,7 @@
"alert.rate_limited.title": "Cuingeachadh ùine",
"alert.unexpected.message": "Thachair mearachd ris nach robh dùil.",
"alert.unexpected.title": "Oich!",
"alt_text_badge.title": "Roghainn teacsa",
"announcement.announcement": "Brath-fios",
"attachments_list.unprocessed": "(gun phròiseasadh)",
"audio.hide": "Falaich an fhuaim",
@ -221,6 +222,8 @@
"domain_block_modal.they_cant_follow": "Chan urrainn do neach sam bith a th air an fhrithealaiche seo do leantainn.",
"domain_block_modal.they_wont_know": "Cha bhi fios aca gun deach am bacadh.",
"domain_block_modal.title": "A bheil thu airson an àrainn a bhacadh?",
"domain_block_modal.you_will_lose_num_followers": "Caillidh tu {followersCount, plural, one {{followersCountDisplay} neach-leantainn} two {{followersCountDisplay} luchd-leantainn} few {{followersCountDisplay} luchd-leantainn} other {{followersCountDisplay} luchd-leantainn}} s {followingCount, plural, one {{followingCountDisplay} neach a tha thu a leantainn} two {{followingCountDisplay} daoine a tha thu a leantainn} few {{followingCountDisplay} daoine a tha thu a leantainn} other {{followingCountDisplay} daoine a tha thu a leantainn}}.",
"domain_block_modal.you_will_lose_relationships": "Caillidh tu a h-uile luchd-leantainn s neach a leanas tu air an fhrithealaiche seo.",
"domain_block_modal.you_wont_see_posts": "Chan fhaic thu postaichean no brathan o chleachdaichean a th air an fhrithealaiche seo.",
"domain_pill.activitypub_lets_connect": "Leigidh e leat ceangal a dhèanamh ri daoine chan ann air Mastodon a-mhàin ach air feadh aplacaidean sòisealta eile cuideachd agus conaltradh leotha.",
"domain_pill.activitypub_like_language": "Tha ActivityPub coltach ri cànan a bhruidhneas Mastodon ri lìonraidhean sòisealta eile.",
@ -330,7 +333,7 @@
"footer.about": "Mu dhèidhinn",
"footer.directory": "Eòlaire nam pròifil",
"footer.get_app": "Faigh an aplacaid",
"footer.invite": "Thoir cuireadh do dhaoine",
"footer.invite": "Thoir cuireadh",
"footer.keyboard_shortcuts": "Ath-ghoiridean a mheur-chlàir",
"footer.privacy_policy": "Poileasaidh prìobhaideachd",
"footer.source_code": "Seall am bun-tùs",
@ -849,6 +852,11 @@
"upload_error.poll": "Chan fhaod thu faidhle a luchdadh suas an cois cunntais-bheachd.",
"upload_form.audio_description": "Mìnich e dhan fheadhainn le èisteachd bheag",
"upload_form.description": "Mìnich e dhan fheadhainn le cion-lèirsinne",
"upload_form.drag_and_drop.instructions": "Airson ceanglachan meadhain a thogail, brùth air space no enter. Fhad a bhios tu ga shlaodadh, cleachd na h-iuchraichean-saighde airson an ceanglachan meadhain a ghluasad gu comhair sam bith. Brùth air space no enter a-rithist airson an ceanglachen meadhain a leigeil às air an ionad ùr aige no brùth air escape airson sgur dheth.",
"upload_form.drag_and_drop.on_drag_cancel": "Chaidh sgur dhen t-slaodadh. Chaidh an ceanglachan meadhain {item} a leigeil às.",
"upload_form.drag_and_drop.on_drag_end": "Chaidh an ceanglachan meadhain {item} a leigeil às.",
"upload_form.drag_and_drop.on_drag_over": "Chaidh an ceanglachan meadhain {item} a ghluasad.",
"upload_form.drag_and_drop.on_drag_start": "Chaidh an ceanglachan meadhain {item} a thogail.",
"upload_form.edit": "Deasaich",
"upload_form.thumbnail": "Atharraich an dealbhag",
"upload_form.video_description": "Mìnich e dhan fheadhainn le èisteachd bheag no cion-lèirsinne",

View File

@ -193,7 +193,7 @@
"confirmations.reply.message": "Ao responder sobrescribirás a mensaxe que estás a compor. Tes a certeza de que queres continuar?",
"confirmations.reply.title": "Editar a publicación?",
"confirmations.unfollow.confirm": "Deixar de seguir",
"confirmations.unfollow.message": "Desexas deixar de seguir a {name}?",
"confirmations.unfollow.message": "Tes certeza de querer deixar de seguir a {name}?",
"confirmations.unfollow.title": "Deixar de seguir á usuaria?",
"content_warning.hide": "Agochar publicación",
"content_warning.show": "Mostrar igualmente",
@ -516,6 +516,7 @@
"notification.label.private_reply": "Resposta privada",
"notification.label.reply": "Resposta",
"notification.mention": "Mención",
"notification.mentioned_you": "{name} mencionoute",
"notification.moderation-warning.learn_more": "Saber máis",
"notification.moderation_warning": "Recibiches unha advertencia da moderación",
"notification.moderation_warning.action_delete_statuses": "Algunha das túas publicacións foron eliminadas.",

View File

@ -1,5 +1,5 @@
{
"about.blocks": "שרתים שנחסמו על ידי המנהלים",
"about.blocks": "שרתים מוגבלים",
"about.contact": "יצירת קשר:",
"about.disclaimer": "מסטודון היא תוכנת קוד פתוח חינמית וסימן מסחרי של Mastodon gGmbH.",
"about.domain_blocks.no_reason_available": "הסיבה אינה זמינה",
@ -34,9 +34,9 @@
"account.follow_back": "לעקוב בחזרה",
"account.followers": "עוקבים",
"account.followers.empty": "אף אחד לא עוקב אחר המשתמש הזה עדיין.",
"account.followers_counter": "{count, plural,one {עוקב אחד} other {{count} עוקבים}}",
"account.followers_counter": "{count, plural,one {עוקב אחד} other {{counter} עוקבים}}",
"account.following": "נעקבים",
"account.following_counter": "{count, plural,one {עוקב אחרי {count}}other {עוקב אחרי {count}}}",
"account.following_counter": "{count, plural,one {עוקב אחרי {count}}other {עוקב אחרי {counter}}}",
"account.follows.empty": "משתמש זה עדיין לא עוקב אחרי אף אחד.",
"account.go_to_profile": "מעבר לפרופיל",
"account.hide_reblogs": "להסתיר הידהודים מאת @{name}",
@ -62,7 +62,7 @@
"account.requested_follow": "{name} ביקשו לעקוב אחריך",
"account.share": "שתף את הפרופיל של @{name}",
"account.show_reblogs": "הצג הדהודים מאת @{name}",
"account.statuses_counter": "{count, plural, one {הודעה אחת} two {הודעותיים} many {{count} הודעות} other {{count} הודעות}}",
"account.statuses_counter": "{count, plural, one {הודעה אחת} two {הודעותיים} many {{counter} הודעות} other {{counter} הודעות}}",
"account.unblock": "להסיר חסימה ל- @{name}",
"account.unblock_domain": "הסירי את החסימה של קהילת {domain}",
"account.unblock_short": "הסר חסימה",
@ -85,6 +85,7 @@
"alert.rate_limited.title": "חלה הגבלה על קצב התעבורה",
"alert.unexpected.message": "אירעה שגיאה בלתי צפויה.",
"alert.unexpected.title": "אופס!",
"alt_text_badge.title": "כיתוב חלופי",
"announcement.announcement": "הכרזה",
"attachments_list.unprocessed": "(לא מעובד)",
"audio.hide": "השתק",
@ -221,6 +222,8 @@
"domain_block_modal.they_cant_follow": "משתמש משרת זה לא יכול לעקוב אחריך.",
"domain_block_modal.they_wont_know": "הם לא ידעו כי נחסמו.",
"domain_block_modal.title": "לחסום שרת?",
"domain_block_modal.you_will_lose_num_followers": "{followersCount, plural,one {יאבד לך עוקב אחד}other {יאבדו לך {followersCountDisplay} עוקבים}} {followingCount, plural,one {ונעקב אחד}other {ו־{followingCountDisplay} נעקבים}}.",
"domain_block_modal.you_will_lose_relationships": "יאבדו לך כל העוקבים והנעקבים משרת זה.",
"domain_block_modal.you_wont_see_posts": "לא תוכלו לראות הודעות ממשתמשים על שרת זה.",
"domain_pill.activitypub_lets_connect": "מאפשר לך להתחבר ולהתרועע עם אחרים לא רק במסטודון, אלא גם ביישומים חברתיים שונים אחרים.",
"domain_pill.activitypub_like_language": "אקטיביטיפאב היא למעשה השפה בה מסטודון מדבר עם רשתות חברתיות אחרות.",
@ -346,9 +349,9 @@
"hashtag.column_settings.tag_mode.any": "לפחות אחד מאלה",
"hashtag.column_settings.tag_mode.none": "אף אחד מאלה",
"hashtag.column_settings.tag_toggle": "כלול תגיות נוספות בטור זה",
"hashtag.counter_by_accounts": "{count, plural,one{{count} משתתף.ת}other{{count} משתתפיםות}}",
"hashtag.counter_by_uses": "{count, plural, one {הודעה אחת} two {הודעותיים} many {{count} הודעות} other {{count} הודעות}}",
"hashtag.counter_by_uses_today": "{count, plural, one {הודעה אחת} two {הודעותיים} many {{count} הודעות} other {{count} הודעות}} היום",
"hashtag.counter_by_accounts": "{count, plural,one{{count} משתתף.ת}other{{counter} משתתפיםות}}",
"hashtag.counter_by_uses": "{count, plural, one {הודעה אחת} two {הודעותיים} many {{counter} הודעות} other {{counter} הודעות}}",
"hashtag.counter_by_uses_today": "{count, plural, one {הודעה אחת} two {הודעותיים} many {{counter} הודעות} other {{counter} הודעות}} היום",
"hashtag.follow": "לעקוב אחרי תגית",
"hashtag.unfollow": "להפסיק לעקוב אחרי תגית",
"hashtags.and_other": "…{count, plural,other {ועוד #}}",
@ -439,7 +442,7 @@
"limited_account_hint.title": "פרופיל המשתמש הזה הוסתר על ידי המנחים של {domain}.",
"link_preview.author": "מאת {name}",
"link_preview.more_from_author": "עוד מאת {name}",
"link_preview.shares": "{count, plural, one {הודעה אחת} two {הודעותיים} many {{count} הודעות} other {{count} הודעות}}",
"link_preview.shares": "{count, plural, one {הודעה אחת} two {הודעותיים} many {{counter} הודעות} other {{counter} הודעות}}",
"lists.account.add": "הוסף לרשימה",
"lists.account.remove": "הסר מרשימה",
"lists.delete": "מחיקת רשימה",
@ -513,6 +516,7 @@
"notification.label.private_reply": "תשובה בפרטי",
"notification.label.reply": "תשובה",
"notification.mention": "אזכור",
"notification.mentioned_you": "אוזכרת על ידי {name}",
"notification.moderation-warning.learn_more": "למידע נוסף",
"notification.moderation_warning": "קיבלת אזהרה מצוות ניהול התוכן",
"notification.moderation_warning.action_delete_statuses": "חלק מהודעותיך הוסרו.",
@ -837,7 +841,7 @@
"time_remaining.minutes": "נותרו {number, plural, one {# דקה} other {# דקות}}",
"time_remaining.moments": "רגעים נותרו",
"time_remaining.seconds": "נותרו {number, plural, one {# שניה} other {# שניות}}",
"trends.counter_by_accounts": "{count, plural, one {אדם אחד} other {{count} א.נשים}} {days, plural, one {מאז אתמול} two {ביומיים האחרונים} other {במשך {days} הימים האחרונים}}",
"trends.counter_by_accounts": "{count, plural, one {אדם אחד} other {{counter} א.נשים}} {days, plural, one {מאז אתמול} two {ביומיים האחרונים} other {במשך {days} הימים האחרונים}}",
"trends.trending_now": "נושאים חמים",
"ui.beforeunload": "הטיוטא תאבד אם תעזבו את מסטודון.",
"units.short.billion": "{count} מליארד",
@ -849,6 +853,11 @@
"upload_error.poll": "לא ניתן להעלות קובץ עם סקר.",
"upload_form.audio_description": "תאר/י עבור לקויי שמיעה",
"upload_form.description": "תיאור לכבדי ראיה",
"upload_form.drag_and_drop.instructions": "כדי לבחור קובץ מוצמד, יש ללחוץ על מקש רווח או אנטר. בעת הגרירה, השתמשו במקשי החיצים כדי להזיז את הקובץ המוצמד בכל כיוון. לחצו רווח או אנטר בשנית כדי לעזוב את הקובץ במקומו החדש, או לחצו אסקייפ לביטול.",
"upload_form.drag_and_drop.on_drag_cancel": "הגרירה בוטלה. קובץ המדיה {item} נעזב.",
"upload_form.drag_and_drop.on_drag_end": "קובץ המדיה {item} נעזב.",
"upload_form.drag_and_drop.on_drag_over": "קובץ המדיה {item} הוזז.",
"upload_form.drag_and_drop.on_drag_start": "קובץ המדיה {item} נבחר.",
"upload_form.edit": "עריכה",
"upload_form.thumbnail": "שנה/י תמונה ממוזערת",
"upload_form.video_description": "תאר/י עבור לקויי שמיעה ולקויי ראייה",

View File

@ -85,6 +85,7 @@
"alert.rate_limited.title": "Adatforgalom korlátozva",
"alert.unexpected.message": "Váratlan hiba történt.",
"alert.unexpected.title": "Hoppá!",
"alt_text_badge.title": "Helyettesítő szöveg",
"announcement.announcement": "Közlemény",
"attachments_list.unprocessed": "(feldolgozatlan)",
"audio.hide": "Hang elrejtése",
@ -515,6 +516,7 @@
"notification.label.private_reply": "Privát válasz",
"notification.label.reply": "Válasz",
"notification.mention": "Említés",
"notification.mentioned_you": "{name} megemlített",
"notification.moderation-warning.learn_more": "További információ",
"notification.moderation_warning": "Moderációs figyelmeztetést kaptál",
"notification.moderation_warning.action_delete_statuses": "Néhány bejegyzésedet eltávolították.",
@ -851,6 +853,11 @@
"upload_error.poll": "Szavazásnál nem lehet fájlt feltölteni.",
"upload_form.audio_description": "Leírás siket vagy hallássérült emberek számára",
"upload_form.description": "Leírás vak vagy gyengénlátó emberek számára",
"upload_form.drag_and_drop.instructions": "Egy médiamelléklet kiválasztásához nyomj Szóközt vagy Entert. Húzás közben használd a nyílgombokat a médiamelléklet adott irányba történő mozgatásához. A médiamelléklet új pozícióba helyezéséhez nyomd meg a Szóközt vagy az Entert, vagy a megszakításhoz nyomd meg az Esc gombot.",
"upload_form.drag_and_drop.on_drag_cancel": "Az áthúzás megszakítva. A(z) {item} médiamelléklet el lett dobva.",
"upload_form.drag_and_drop.on_drag_end": "A(z) {item} médiamelléklet el lett dobva.",
"upload_form.drag_and_drop.on_drag_over": "A(z) {item} médiamelléklet át lett helyezve.",
"upload_form.drag_and_drop.on_drag_start": "A(z) {item} médiamelléklet fel lett véve.",
"upload_form.edit": "Szerkesztés",
"upload_form.thumbnail": "Bélyegkép megváltoztatása",
"upload_form.video_description": "Leírás siket, hallássérült, vak vagy gyengénlátó emberek számára",

View File

@ -85,6 +85,7 @@
"alert.rate_limited.title": "Með takmörkum",
"alert.unexpected.message": "Upp kom óvænt villa.",
"alert.unexpected.title": "Úbbs!",
"alt_text_badge.title": "Hjálpartexti mynda",
"announcement.announcement": "Auglýsing",
"attachments_list.unprocessed": "(óunnið)",
"audio.hide": "Fela hljóð",
@ -433,6 +434,8 @@
"lightbox.close": "Loka",
"lightbox.next": "Næsta",
"lightbox.previous": "Fyrra",
"lightbox.zoom_in": "Renna að raunstærð",
"lightbox.zoom_out": "Renna að svo passi",
"limited_account_hint.action": "Birta notandasniðið samt",
"limited_account_hint.title": "Þetta notandasnið hefur verið falið af umsjónarmönnum {domain}.",
"link_preview.author": "Frá {name}",
@ -511,6 +514,7 @@
"notification.label.private_reply": "Einkasvar",
"notification.label.reply": "Svara",
"notification.mention": "Minnst á",
"notification.mentioned_you": "{name} minntist á þig",
"notification.moderation-warning.learn_more": "Kanna nánar",
"notification.moderation_warning": "Þú hefur fengið aðvörun frá umsjónarmanni",
"notification.moderation_warning.action_delete_statuses": "Sumar færslurnar þínar hafa verið fjarlægðar.",

View File

@ -516,6 +516,7 @@
"notification.label.private_reply": "Rispondi in privato",
"notification.label.reply": "Rispondi",
"notification.mention": "Menziona",
"notification.mentioned_you": "{name} ti ha menzionato",
"notification.moderation-warning.learn_more": "Scopri di più",
"notification.moderation_warning": "Hai ricevuto un avviso di moderazione",
"notification.moderation_warning.action_delete_statuses": "Alcuni dei tuoi post sono stati rimossi.",
@ -852,6 +853,11 @@
"upload_error.poll": "Caricamento del file non consentito con i sondaggi.",
"upload_form.audio_description": "Descrizione per persone con deficit uditivi",
"upload_form.description": "Descrizione per ipovedenti",
"upload_form.drag_and_drop.instructions": "Per selezionare un allegato multimediale, premi Spazio o Invio. Mentre trascini, usa i tasti con le frecce per spostare l'allegato multimediale in una qualsiasi direzione. Premi di nuovo Spazio o Invio per rilasciare l'allegato multimediale nella sua nuova posizione, oppure premi Esc per annullare.",
"upload_form.drag_and_drop.on_drag_cancel": "Il trascinamento è stato annullato. L'allegato multimediale {item} è stato eliminato.",
"upload_form.drag_and_drop.on_drag_end": "L'allegato multimediale {item} è stato eliminato.",
"upload_form.drag_and_drop.on_drag_over": "L'allegato multimediale {item} è stato spostato.",
"upload_form.drag_and_drop.on_drag_start": "L'allegato multimediale {item} è stato ricevuto.",
"upload_form.edit": "Modifica",
"upload_form.thumbnail": "Cambia la miniatura",
"upload_form.video_description": "Descrizione per persone con deficit uditivi o ipovedenti",

View File

@ -85,6 +85,7 @@
"alert.rate_limited.title": "制限に達しました",
"alert.unexpected.message": "不明なエラーが発生しました。",
"alert.unexpected.title": "エラー!",
"alt_text_badge.title": "代替テキスト",
"announcement.announcement": "お知らせ",
"attachments_list.unprocessed": "(未処理)",
"audio.hide": "音声を閉じる",
@ -513,6 +514,7 @@
"notification.label.private_reply": "非公開の返信",
"notification.label.reply": "返信",
"notification.mention": "メンション",
"notification.mentioned_you": "{name} さんがあなたに返信しました",
"notification.moderation-warning.learn_more": "さらに詳しく",
"notification.moderation_warning": "管理者から警告が来ています",
"notification.moderation_warning.action_delete_statuses": "あなたによるいくつかの投稿が削除されました。",

View File

@ -1,5 +1,5 @@
{
"about.blocks": "Ulac agbur",
"about.blocks": "Iqeddacen yettwaɛassen",
"about.contact": "Anermis:",
"about.disclaimer": "Mastodon d aseɣẓan ilelli, d aseɣẓan n uɣbalu yeldin, d tnezzut n Mastodon gGmbH.",
"about.domain_blocks.no_reason_available": "Ulac taɣẓint",
@ -278,6 +278,8 @@
"hashtag.counter_by_uses_today": "{count, plural, one {{counter} n tsuffeɣt} other {{counter} n tsuffaɣ}} assa",
"hashtag.follow": "Ḍfeṛ ahacṭag",
"hashtags.and_other": "…d {count, plural, one {}other {# nniḍen}}",
"hints.threads.replies_may_be_missing": "Tiririyin d-yusan deg iqeddacen nniḍen, yezmer ur d-ddant ara.",
"hints.threads.see_more": "Wali ugar n tririt deg {domain}",
"home.column_settings.show_reblogs": "Ssken-d beṭṭu",
"home.column_settings.show_replies": "Ssken-d tiririyin",
"home.hide_announcements": "Ffer ulɣuyen",
@ -550,6 +552,7 @@
"report_notification.attached_statuses": "{count, plural, one {{count} n tsuffeɣt} other {{count} n tsuffiɣin}} ttwaqnent",
"report_notification.categories.legal": "Azerfan",
"report_notification.categories.other": "Ayen nniḍen",
"report_notification.categories.other_sentence": "ayen nniḍen",
"report_notification.categories.spam": "Aspam",
"report_notification.categories.spam_sentence": "aspam",
"report_notification.open": "Ldi aneqqis",
@ -584,11 +587,13 @@
"status.bookmark": "Creḍ",
"status.cancel_reblog_private": "Sefsex beṭṭu",
"status.cannot_reblog": "Tasuffeɣt-a ur tezmir ara ad tettwabḍu tikelt-nniḍen",
"status.continued_thread": "Asqerdec yettkemmil",
"status.copy": "Nɣel assaɣ ɣer tasuffeɣt",
"status.delete": "Kkes",
"status.direct": "Bder-d @{name} weḥd-s",
"status.direct_indicator": "Abdar uslig",
"status.edit": "Ẓreg",
"status.edited": "Taẓrigt taneggarut {date}",
"status.edited_x_times": "Tettwaẓreg {count, plural, one {{count} n tikkelt} other {{count} n tikkal}}",
"status.embed": "Awi-d tangalt n weslaɣ",
"status.favourite": "Amenyaf",
@ -614,9 +619,10 @@
"status.reblogs.empty": "Ula yiwen ur yebḍi tajewwiqt-agi ar tura. Ticki yebḍa-tt yiwen, ad d-iban da.",
"status.redraft": "Kkes tɛiwdeḍ tira",
"status.remove_bookmark": "Kkes tacreḍt",
"status.replied_in_thread": "Y·t·erra-d deg usqerdec",
"status.replied_to": "Y·terra-yas i {name}",
"status.reply": "Err",
"status.replyAll": "Err i lxiḍ",
"status.replyAll": "Err i wesqerdec",
"status.report": "Cetki ɣef @{name}",
"status.sensitive_warning": "Agbur amḥulfu",
"status.share": "Bḍu",

View File

@ -317,7 +317,7 @@
"follow_suggestions.curated_suggestion": "스태프의 추천",
"follow_suggestions.dismiss": "다시 보지 않기",
"follow_suggestions.featured_longer": "{domain} 팀이 손수 고름",
"follow_suggestions.friends_of_friends_longer": "내가 팔로우 하는 사람들 사이에서 인기",
"follow_suggestions.friends_of_friends_longer": "내가 팔로우 사람들 사이에서 인기",
"follow_suggestions.hints.featured": "이 프로필은 {domain} 팀이 손수 선택했습니다.",
"follow_suggestions.hints.friends_of_friends": "이 프로필은 내가 팔로우 하는 사람들에게서 유명합니다.",
"follow_suggestions.hints.most_followed": "이 프로필은 {domain}에서 가장 많이 팔로우 된 사람들 중 하나입니다.",
@ -516,6 +516,7 @@
"notification.label.private_reply": "개인 답글",
"notification.label.reply": "답글",
"notification.mention": "멘션",
"notification.mentioned_you": "{name} 님의 멘션",
"notification.moderation-warning.learn_more": "더 알아보기",
"notification.moderation_warning": "중재 경고를 받았습니다",
"notification.moderation_warning.action_delete_statuses": "게시물 몇 개가 삭제되었습니다.",
@ -766,10 +767,10 @@
"server_banner.about_active_users": "30일 동안 이 서버를 사용한 사람들 (월간 활성 이용자)",
"server_banner.active_users": "활성 사용자",
"server_banner.administered_by": "관리자:",
"server_banner.is_one_of_many": "{domain} / 글리치맛 소다를 통해 제공되는 가벼운 페디버스 서버 중 일부.",
"server_banner.is_one_of_many": "{domain} / 글리치맛 소다를 통해 제공되는 가벼운 연합우주 서버 중 일부.",
"server_banner.server_stats": "서버 통계:",
"sign_in_banner.create_account": "계정 생성",
"sign_in_banner.follow_anyone": "페디버스를 통해 누구든지 팔로우하고 시간순으로 게시물을 받아보세요. 알고리즘도, 광고도, 클릭을 유도하는 것들도 없습니다.",
"sign_in_banner.follow_anyone": "연합우주를 통해 누구든지 팔로우하고 시간순으로 게시물을 받아보세요. 알고리즘도, 광고도, 클릭을 유도하는 것들도 없습니다.",
"sign_in_banner.mastodon_is": "마스토돈은 무엇이 일어나는지 받아보는 가장 좋은 수단입니다.",
"sign_in_banner.sign_in": "로그인",
"sign_in_banner.sso_redirect": "로그인 또는 가입하기",

View File

@ -504,22 +504,23 @@
"notification.admin.report_statuses": "{name} rapporteerde {target} voor {category}",
"notification.admin.report_statuses_other": "{name} rapporteerde {target}",
"notification.admin.sign_up": "{name} heeft zich geregistreerd",
"notification.admin.sign_up.name_and_others": "{name} en {count, plural, one {# ander} other {# anderen}} hebben zich geregistreerd",
"notification.admin.sign_up.name_and_others": "{name} en {count, plural, one {# ander persoon} other {# andere personen}} hebben zich geregistreerd",
"notification.favourite": "{name} markeerde jouw bericht als favoriet",
"notification.favourite.name_and_others_with_link": "{name} en <a>{count, plural, one {# ander} other {# anderen}}</a> hebben jouw bericht als favoriet gemarkeerd",
"notification.favourite.name_and_others_with_link": "{name} en <a>{count, plural, one {# ander persoon} other {# andere personen}}</a> hebben jouw bericht als favoriet gemarkeerd",
"notification.follow": "{name} volgt jou nu",
"notification.follow.name_and_others": "{name} en {count, plural, one {# ander} other {# anderen}} hebben je gevolgd",
"notification.follow.name_and_others": "{name} en {count, plural, one {# ander persoon} other {# andere personen}} hebben je gevolgd",
"notification.follow_request": "{name} wil jou graag volgen",
"notification.follow_request.name_and_others": "{name} en {count, plural, one {# ander} other {# anderen}} hebben gevraagd om je te volgen",
"notification.follow_request.name_and_others": "{name} en {count, plural, one {# ander persoon} other {# andere personen}} hebben gevraagd om je te volgen",
"notification.label.mention": "Vermelding",
"notification.label.private_mention": "Privébericht",
"notification.label.private_reply": "Privéreactie",
"notification.label.reply": "Reactie",
"notification.mention": "Vermelding",
"notification.mentioned_you": "Je bent vermeld door {name}",
"notification.moderation-warning.learn_more": "Meer informatie",
"notification.moderation_warning": "Je hebt een moderatie-waarschuwing ontvangen",
"notification.moderation_warning.action_delete_statuses": "Sommige van je berichten zijn verwijderd.",
"notification.moderation_warning.action_disable": "Je account is uitgeschakeld.",
"notification.moderation_warning.action_disable": "Jouw account is uitgeschakeld.",
"notification.moderation_warning.action_mark_statuses_as_sensitive": "Sommige van je berichten zijn gemarkeerd als gevoelig.",
"notification.moderation_warning.action_none": "Jouw account heeft een moderatie-waarschuwing ontvangen.",
"notification.moderation_warning.action_sensitive": "Je berichten worden vanaf nu als gevoelig gemarkeerd.",
@ -528,14 +529,14 @@
"notification.own_poll": "Jouw peiling is beëindigd",
"notification.poll": "Een peiling waaraan jij hebt meegedaan is beëindigd",
"notification.reblog": "{name} boostte jouw bericht",
"notification.reblog.name_and_others_with_link": "{name} en <a>{count, plural, one {# ander} other {# anderen}}</a> hebben jouw bericht geboost",
"notification.reblog.name_and_others_with_link": "{name} en <a>{count, plural, one {# ander persoon} other {# andere personen}}</a> hebben jouw bericht geboost",
"notification.relationships_severance_event": "Verloren verbindingen met {name}",
"notification.relationships_severance_event.account_suspension": "Een beheerder van {from} heeft {target} geschorst, wat betekent dat je geen updates meer van hen kunt ontvangen of met hen kunt communiceren.",
"notification.relationships_severance_event.domain_block": "Een beheerder van {from} heeft {target} geblokkeerd, inclusief {followersCount} van jouw volgers en {followingCount, plural, one {# account} other {# accounts}} die jij volgt.",
"notification.relationships_severance_event.domain_block": "Een beheerder van {from} heeft {target} geblokkeerd, inclusief {followersCount} van jouw volgers en {followingCount, plural, one {# account} other {# accounts}} die je volgt.",
"notification.relationships_severance_event.learn_more": "Meer informatie",
"notification.relationships_severance_event.user_domain_block": "Je hebt {target} geblokkeerd, waarmee je {followersCount} van je volgers en {followingCount, plural, one {# account} other {# accounts}} die jij volgt, bent verloren.",
"notification.relationships_severance_event.user_domain_block": "Je hebt {target} geblokkeerd, waarmee je {followersCount} van je volgers en {followingCount, plural, one {# account} other {# accounts}} die je volgt, bent verloren.",
"notification.status": "{name} heeft zojuist een bericht geplaatst",
"notification.update": "{name} heeft een bericht bewerkt",
"notification.update": "{name} bewerkte een bericht",
"notification_requests.accept": "Accepteren",
"notification_requests.accept_multiple": "{count, plural, one {# verzoek accepteren…} other {# verzoeken accepteren…}}",
"notification_requests.confirm_accept_multiple.button": "{count, plural, one {Verzoek accepteren} other {Verzoeken accepteren}}",

View File

@ -516,6 +516,7 @@
"notification.label.private_reply": "Privat svar",
"notification.label.reply": "Svar",
"notification.mention": "Omtale",
"notification.mentioned_you": "{name} nemnde deg",
"notification.moderation-warning.learn_more": "Lær meir",
"notification.moderation_warning": "Du har mottatt ei moderasjonsåtvaring",
"notification.moderation_warning.action_delete_statuses": "Nokre av innlegga dine har blitt fjerna.",

View File

@ -502,6 +502,8 @@
"notification.reblog": "{name} fremhevet ditt innlegg",
"notification.status": "{name} la nettopp ut",
"notification.update": "{name} redigerte et innlegg",
"notification_requests.minimize_banner": "Minimer banneret for filtrerte varsler",
"notification_requests.view": "Vis varsler",
"notifications.clear": "Fjern varsler",
"notifications.clear_confirmation": "Er du sikker på at du vil fjerne alle dine varsler permanent?",
"notifications.column_settings.admin.report": "Nye rapporter:",

View File

@ -516,6 +516,7 @@
"notification.label.private_reply": "Odpowiedź prywatna",
"notification.label.reply": "Odpowiedź",
"notification.mention": "Wzmianka",
"notification.mentioned_you": "{name} wspomniał(a) o Tobie",
"notification.moderation-warning.learn_more": "Dowiedz się więcej",
"notification.moderation_warning": "Otrzymałeś/-łaś ostrzeżenie moderacyjne",
"notification.moderation_warning.action_delete_statuses": "Niektóre twoje wpisy zostały usunięte.",

View File

@ -437,6 +437,7 @@
"lightbox.next": "Próximo",
"lightbox.previous": "Anterior",
"lightbox.zoom_in": "Voltar para o tamanho real",
"lightbox.zoom_out": "Zoom para ajustar",
"limited_account_hint.action": "Exibir perfil mesmo assim",
"limited_account_hint.title": "Este perfil foi ocultado pelos moderadores do {domain}.",
"link_preview.author": "Por {name}",
@ -515,6 +516,7 @@
"notification.label.private_reply": "Resposta privada",
"notification.label.reply": "Resposta",
"notification.mention": "Menção",
"notification.mentioned_you": "{name} te mencionou",
"notification.moderation-warning.learn_more": "Aprender mais",
"notification.moderation_warning": "Você recebeu um aviso de moderação",
"notification.moderation_warning.action_delete_statuses": "Algumas das suas publicações foram removidas.",
@ -813,7 +815,7 @@
"status.reblogs.empty": "Nada aqui. Quando alguém der boost, o usuário aparecerá aqui.",
"status.redraft": "Excluir e rascunhar",
"status.remove_bookmark": "Remover do Salvos",
"status.replied_in_thread": "Respondido na discussão",
"status.replied_in_thread": "Respondido na conversa",
"status.replied_to": "Em resposta a {name}",
"status.reply": "Responder",
"status.replyAll": "Responder a conversa",
@ -851,6 +853,11 @@
"upload_error.poll": "Mídias não podem ser anexadas em toots com enquetes.",
"upload_form.audio_description": "Descrever para deficientes auditivos",
"upload_form.description": "Descrever para deficientes visuais",
"upload_form.drag_and_drop.instructions": "Para pegar um anexo de mídia, pressione espaço ou enter. Enquanto arrastar, use as setas do teclado para mover o anexo de mídia em qualquer direção. Pressione espaço ou insira novamente para soltar o anexo de mídia em sua nova posição, ou pressione escape para cancelar.",
"upload_form.drag_and_drop.on_drag_cancel": "O arrastamento foi cancelado. O anexo da mídia {item} foi descartado.",
"upload_form.drag_and_drop.on_drag_end": "O anexo {item} foi removido.",
"upload_form.drag_and_drop.on_drag_over": "O anexo de mídia {item} foi movido.",
"upload_form.drag_and_drop.on_drag_start": "Foi coletado o anexo de mídia {item}.",
"upload_form.edit": "Editar",
"upload_form.thumbnail": "Alterar miniatura",
"upload_form.video_description": "Descrever para deficientes auditivos ou visuais",

View File

@ -85,6 +85,7 @@
"alert.rate_limited.title": "Màssimu de rechestas barigadu",
"alert.unexpected.message": "Ddoe est istada una faddina.",
"alert.unexpected.title": "Oh!",
"alt_text_badge.title": "Testu alternativu",
"announcement.announcement": "Annùntziu",
"attachments_list.unprocessed": "(non protzessadu)",
"audio.hide": "Cua s'àudio",
@ -97,6 +98,8 @@
"block_modal.title": "Boles blocare s'utente?",
"block_modal.you_wont_see_mentions": "No as a bìdere is publicatziones chi mèntovent custa persone.",
"boost_modal.combo": "Podes incarcare {combo} pro brincare custu sa borta chi benit",
"boost_modal.reblog": "Boles potentziare sa publicatzione?",
"boost_modal.undo_reblog": "Boles tzessare de potentziare sa publicatzione?",
"bundle_column_error.copy_stacktrace": "Còpia s'informe de faddina",
"bundle_column_error.error.body": "Sa pàgina pedida non faghiat a dda renderizare. Diat pòdere èssere pro neghe de una faddina in su còdighe nostru, o de unu problema de cumpatibilidade de su navigadore.",
"bundle_column_error.error.title": "Oh, no!",
@ -104,11 +107,15 @@
"bundle_column_error.network.title": "Faddina de connessione",
"bundle_column_error.retry": "Torra·bi a proare",
"bundle_column_error.return": "Torra a sa pàgina printzipale",
"bundle_column_error.routing.body": "Impossìbile agatare sa pàgina rechesta. Seguru chi s'URL in sa barra de indiritzos est curretu?",
"bundle_column_error.routing.title": "404",
"bundle_modal_error.close": "Serra",
"bundle_modal_error.message": "Faddina in su carrigamentu de custu cumponente.",
"bundle_modal_error.retry": "Torra·bi a proare",
"closed_registrations.other_server_instructions": "Dae chi Mastodon est detzentralizadu, podes creare unu contu in un'àteru serbidore e interagire cun custu.",
"closed_registrations_modal.description": "Sa creatzione de contos in {domain} no est possìbile in custu momentu, però tene in cunsideru chi non tenes bisòngiu de unu contu ispetzìficu in {domain} pro impreare Mastodon.",
"closed_registrations_modal.find_another_server": "Agata un'àteru serbidore",
"closed_registrations_modal.title": "Su registru a Mastodon",
"column.about": "Informatziones",
"column.blocks": "Persones blocadas",
"column.bookmarks": "Sinnalibros",
@ -142,6 +149,7 @@
"compose.published.open": "Aberi",
"compose.saved.body": "Publicatzione sarvada.",
"compose_form.direct_message_warning_learn_more": "Àteras informatziones",
"compose_form.encryption_warning": "Is publicatziones a Mastodon no sunt critografados a nodu terminale. Non cumpartzas informatziones delicadas in Mastodon.",
"compose_form.hashtag_warning": "Custa publicatzione no at a èssere ammustrada in peruna eticheta, dae chi no est pùblica. Isceti is publicatziones pùblicas podent èssere chircadas cun etichetas.",
"compose_form.lock_disclaimer": "Su contu tuo no est {locked}. Cale si siat persone ti podet sighire pro bìdere is messàgios tuos chi imbies a sa gente chi ti sighit.",
"compose_form.lock_disclaimer.lock": "blocadu",
@ -171,15 +179,23 @@
"confirmations.discard_edit_media.confirm": "Iscarta",
"confirmations.discard_edit_media.message": "Tenes modìficas non sarvadas a is descritziones o a is anteprimas de is cuntenutos, ddas boles iscartare su matessi?",
"confirmations.edit.confirm": "Modìfica",
"confirmations.edit.message": "Modifichende immoe as a subrascrìere su messàgiu chi ses iscriende. Seguru chi boles sighire?",
"confirmations.edit.title": "Boles subraiscrìere sa publicatzione?",
"confirmations.logout.confirm": "Essi·nche",
"confirmations.logout.message": "Seguru chi boles essire?",
"confirmations.logout.title": "Boles serrare sa sessione?",
"confirmations.mute.confirm": "A sa muda",
"confirmations.redraft.confirm": "Cantzella e torra a fàghere",
"confirmations.redraft.message": "Seguru chi boles cantzellare e torrare a fàghere custa publicatzione? As a pèrdere is preferidos e is cumpartziduras, e is rispostas a su messàgiu originale ant a abarrare òrfanas.",
"confirmations.redraft.title": "Boles cantzellare e torrare a iscrìere sa publicatzione?",
"confirmations.reply.confirm": "Risponde",
"confirmations.reply.message": "Rispondende immoe as a subrascrìere su messàgiu chi ses iscriende. Seguru chi boles sighire?",
"confirmations.reply.title": "Boles subraiscrìere sa publicatzione?",
"confirmations.unfollow.confirm": "Non sigas prus",
"confirmations.unfollow.message": "Seguru chi non boles sighire prus a {name}?",
"confirmations.unfollow.title": "Boles tzessare de sighire s'utente?",
"content_warning.hide": "Cua sa publicatzione",
"content_warning.show": "Ammustra·dda su pròpiu",
"conversation.delete": "Cantzella arresonada",
"conversation.mark_as_read": "Signala comente lèghidu",
"conversation.open": "Ammustra arresonada",
@ -193,7 +209,10 @@
"directory.recently_active": "Cun atividade dae pagu",
"disabled_account_banner.account_settings": "Cunfiguratziones de su contu",
"disabled_account_banner.text": "Su contu tuo {disabledAccount} no est ativu.",
"dismissable_banner.community_timeline": "Custas sunt is publicatziones pùblicas prus reghentes dae gente cun contu in {domain}.",
"dismissable_banner.dismiss": "Iscarta",
"dismissable_banner.explore_links": "Custas sunt is istòrias de noas prus cumpartzidas in sa rete oe. Is istòrias prus noas publicadas dae gente prus diversa ant a èssere priorizadas.",
"dismissable_banner.explore_statuses": "Custas sunt publicatziones dae sa rete detzentralizada chi sunt retzende atentzione oe. Is publicatziones prus noas cun prus cumpartziduras e preferèntzias ant a èssere priorizadas.",
"domain_block_modal.block": "Bloca su serbidore",
"domain_block_modal.block_account_instead": "Bloca imbetzes a @{name}",
"domain_block_modal.they_can_interact_with_old_posts": "Is persones de custu serbidore podent ancora interagire cun is publicatziones betzas tuas.",
@ -207,6 +226,7 @@
"domain_pill.their_handle": "S'identificadore suo:",
"domain_pill.their_server": "Sa domo digitale sua, in ue istant totu is publicatziones suas.",
"domain_pill.username": "Nòmine de utente",
"domain_pill.whats_in_a_handle": "Ite est un'identificadore?",
"domain_pill.your_handle": "S'identificadore tuo:",
"domain_pill.your_server": "Sa domo digitale tua, in ue istant totu is publicatziones tuas. Custa non t'agradat? Tràmuda serbidore in cale si siat momentu e bati·ti fintzas in fatu is sighidores tuos.",
"domain_pill.your_username": "S'identificadore ùnicu tuo in custu serbidore. Si podent agatare utentes cun su matessi nòmine de utente in àteros serbidores.",
@ -254,6 +274,7 @@
"explore.trending_links": "Noas",
"explore.trending_statuses": "Publicatziones",
"explore.trending_tags": "Etichetas",
"filter_modal.added.context_mismatch_title": "Su cuntestu non currispondet.",
"filter_modal.added.expired_title": "Filtru iscadidu.",
"filter_modal.added.review_and_configure_title": "Cunfiguratziones de filtru",
"filter_modal.added.settings_link": "pàgina de cunfiguratzione",
@ -277,7 +298,13 @@
"follow_suggestions.featured_longer": "Seberadu a manu dae s'iscuadra de {domain}",
"follow_suggestions.friends_of_friends_longer": "Populare intre persones chi sighis",
"follow_suggestions.hints.featured": "Custu profilu est istadu seberadu a manu dae s'iscuadra {domain}.",
"follow_suggestions.personalized_suggestion": "Cussìgiu personalizadu",
"follow_suggestions.popular_suggestion": "Cussìgiu populare",
"follow_suggestions.popular_suggestion_longer": "Populare a {domain}",
"follow_suggestions.similar_to_recently_followed_longer": "Profilos sìmiles a is chi as sighidu de reghente",
"follow_suggestions.view_all": "Ammustra totu",
"follow_suggestions.who_to_follow": "Chie sighire",
"followed_tags": "Etichetas sighidas",
"footer.about": "Informatziones",
"footer.directory": "Diretòriu de profilos",
"footer.get_app": "Otene s'aplicatzione",
@ -302,6 +329,11 @@
"hashtag.counter_by_uses_today": "{count, plural, one {{counter} publicatzione} other {{counter} publicatziones}} oe",
"hashtag.follow": "Sighi su hashtag",
"hashtag.unfollow": "Non sigas prus s'eticheta",
"hashtags.and_other": "… e {count, plural, one {un'àteru} other {àteros #}}",
"hints.profiles.posts_may_be_missing": "Podet èssere chi ammanchent tzertas publicatziones de custu profilu.",
"hints.profiles.see_more_posts": "Bide prus publicatziones a {domain}",
"hints.threads.replies_may_be_missing": "Podet èssere chi ammanchent rispostas dae àteros serbidores.",
"hints.threads.see_more": "Bide prus rispostas a {domain}",
"home.column_settings.show_reblogs": "Ammustra is cumpartziduras",
"home.column_settings.show_replies": "Ammustra rispostas",
"home.hide_announcements": "Cua annùntzios",
@ -309,7 +341,14 @@
"home.pending_critical_update.link": "Ammustra is atualizatziones",
"home.pending_critical_update.title": "Atualizatzione de seguresa crìtica a disponimentu.",
"home.show_announcements": "Ammustra annùntzios",
"ignore_notifications_modal.disclaimer": "Mastodon non podet informare is utentes chi as innioradu is notìficas issoro. Inniorare notìficas no at a evitare chi s'imbient is messàgios.",
"ignore_notifications_modal.filter_instead": "Opuru filtra",
"ignore_notifications_modal.filter_to_act_users": "As a pòdere ancora atzetare, refudare o sinnalare a utentes",
"ignore_notifications_modal.filter_to_avoid_confusion": "Filtrare agiudat a evitare possìbiles confusiones",
"interaction_modal.description.reply": "Podes rispòndere a custa publicatzione cun unu contu de Mastodon.",
"interaction_modal.login.action": "Torra a sa pàgina printzipale",
"interaction_modal.login.prompt": "Su domìniu de su serbidore domèsticu tuo, pro esempru mastodon.social",
"interaction_modal.no_account_yet": "Non ses in Mastodon?",
"interaction_modal.on_this_server": "In custu serbidore",
"interaction_modal.title.follow": "Sighi a {name}",
"interaction_modal.title.reply": "Risponde a sa publicatzione de {name}",
@ -353,11 +392,13 @@
"lightbox.next": "Imbeniente",
"lightbox.previous": "Pretzedente",
"limited_account_hint.title": "Custu profilu est istadu cuadu dae sa moderatzione de {domain}.",
"link_preview.shares": "{count, plural, one {{counter} publicatzione} other {{counter} publicatziones}}",
"lists.account.add": "Agiunghe a sa lista",
"lists.account.remove": "Boga dae sa lista",
"lists.delete": "Cantzella sa lista",
"lists.edit": "Modìfica sa lista",
"lists.edit.submit": "Muda su tìtulu",
"lists.exclusive": "Cua custas publicatziones dae sa pàgina printzipale",
"lists.new.create": "Agiunghe lista",
"lists.new.title_placeholder": "Tìtulu de sa lista noa",
"lists.replies_policy.followed": "Cale si siat persone chi sighis",
@ -368,7 +409,20 @@
"lists.subheading": "Is listas tuas",
"load_pending": "{count, plural, one {# elementu nou} other {# elementos noos}}",
"loading_indicator.label": "Carrighende…",
"media_gallery.hide": "Cua",
"moved_to_account_banner.text": "Su contu tuo {disabledAccount} est disativadu in custu momentu ca est istadu tramudadu a {movedToAccount}.",
"mute_modal.hide_from_notifications": "Cua dae is notìficas",
"mute_modal.hide_options": "Cua is optziones",
"mute_modal.indefinite": "Fintzas a cando no apo a torrare a ativare is notìficas",
"mute_modal.show_options": "Ammustra is optziones",
"mute_modal.they_can_mention_and_follow": "Ti podent mentovare e sighire, però no ddos as a bìdere.",
"mute_modal.they_wont_know": "No ant a ischire chi ddos as postu a sa muda.",
"mute_modal.title": "Boles pònnere a custu contu a sa muda?",
"mute_modal.you_wont_see_mentions": "No as a bìdere is publicatziones chi mèntovent a custa persone.",
"mute_modal.you_wont_see_posts": "At a pòdere bìdere is publicatziones tuas, però tue no as a bìdere cussas suas.",
"navigation_bar.about": "Informatziones",
"navigation_bar.administration": "Amministratzione",
"navigation_bar.advanced_interface": "Aberi s'interfache web avantzada",
"navigation_bar.blocks": "Persones blocadas",
"navigation_bar.bookmarks": "Sinnalibros",
"navigation_bar.community_timeline": "Lìnia de tempus locale",
@ -380,10 +434,13 @@
"navigation_bar.favourites": "Preferidos",
"navigation_bar.filters": "Faeddos a sa muda",
"navigation_bar.follow_requests": "Rechestas de sighidura",
"navigation_bar.followed_tags": "Etichetas sighidas",
"navigation_bar.follows_and_followers": "Gente chi sighis e sighiduras",
"navigation_bar.lists": "Listas",
"navigation_bar.logout": "Essi",
"navigation_bar.moderation": "Moderatzione",
"navigation_bar.mutes": "Persones a sa muda",
"navigation_bar.opened_in_classic_interface": "Publicatziones, contos e àteras pàginas ispetzìficas sunt abertas in manera predefinida in s'interfache web clàssica.",
"navigation_bar.personal": "Informatziones personales",
"navigation_bar.pins": "Publicatziones apicadas",
"navigation_bar.preferences": "Preferèntzias",
@ -391,10 +448,24 @@
"navigation_bar.search": "Chirca",
"navigation_bar.security": "Seguresa",
"not_signed_in_indicator.not_signed_in": "Ti depes identificare pro atzèdere a custa resursa.",
"notification.admin.report": "{name} at sinnaladu a {target}",
"notification.admin.report_account": "{name} at sinnaladu {count, plural, one {una publicatzione} other {# publicatziones}} dae {target} pro {category}",
"notification.admin.report_account_other": "{name} at sinnaladu {count, plural, one {una publicatzione} other {# publicatziones}} dae {target}",
"notification.admin.report_statuses": "{name} at sinnaladu a {target} pro {category}",
"notification.admin.report_statuses_other": "{name} at sinnaladu a {target}",
"notification.admin.sign_up": "{name} at aderidu",
"notification.admin.sign_up.name_and_others": "{name} e {count, plural, one {un'àtera persone} other {àteras # persones}} si sunt registradas",
"notification.favourite": "{name} at marcadu comente a preferidu s'istadu tuo",
"notification.favourite.name_and_others_with_link": "{name} e <a>{count, plural, one {un'àtera persone} other {àteras # persones}}</a> ant marcadu sa publicatzione tua comente preferida",
"notification.follow": "{name} ti sighit",
"notification.follow.name_and_others": "{name} e {count, plural, one {un'àtera persone} other {àteras # persones}} ti sighint",
"notification.follow_request": "{name} at dimandadu de ti sighire",
"notification.follow_request.name_and_others": "{name} e {count, plural, one {un'àtera persone} other {àteras # persones}} ant pedidu de ti sighire",
"notification.label.mention": "Mèntovu",
"notification.label.private_mention": "Mèntovu privadu",
"notification.label.private_reply": "Risposta privada",
"notification.label.reply": "Risposta",
"notification.mention": "Mèntovu",
"notification.moderation-warning.learn_more": "Àteras informatziones",
"notification.moderation_warning": "T'ant imbiadu un'avisu de moderatzione",
"notification.moderation_warning.action_delete_statuses": "Unas cantas de is publicatziones tuas sunt istadas cantzelladas.",
@ -407,12 +478,30 @@
"notification.own_poll": "Sondàgiu acabbadu",
"notification.poll": "Unu sondàgiu in su chi as votadu est acabbadu",
"notification.reblog": "{name} at cumpartzidu sa publicatzione tua",
"notification.reblog.name_and_others_with_link": "{name} e <a>{count, plural, one {un'àtera persone} other {àteras # persones}}</a> ant potentziadu sa publicatzione tua",
"notification.relationships_severance_event": "Connessiones pèrdidas cun {name}",
"notification.relationships_severance_event.account_suspension": "S'amministratzione de {from} at suspèndidu a {target}; custu bolet nàrrere chi non podes prus retzire atualizatziones dae in cue o interagire cun cussos contos.",
"notification.relationships_severance_event.domain_block": "S'amministratzione de {from} at blocadu a {target}, incluende {followersCount} sighiduras tuas e {followingCount, plural, one {un'àteru contu} other {àteros # contos}} chi sighis.",
"notification.relationships_severance_event.learn_more": "Àteras informatziones",
"notification.relationships_severance_event.user_domain_block": "As blocadu a {target}, bogadu a {followersCount} contos chi ti sighint e {followingCount, plural, one {un'àteru contu} other {àteros # contos}} chi sighis.",
"notification.status": "{name} at publicadu cosa",
"notification.update": "{name} at modificadu una publicatzione",
"notification_requests.accept": "Atzeta",
"notification_requests.accept_multiple": "{count, plural, one {Atzeta una rechesta…} other {Atzeta # rechestas…}}",
"notification_requests.confirm_accept_multiple.button": "{count, plural, one {Atzeta sa rechesta} other {Atzeta is rechestas}}",
"notification_requests.confirm_accept_multiple.message": "Ses atzetende {count, plural, one {una rechesta de notìfica} other {# rechestas de notìfica}}. Seguru chi boles sighire?",
"notification_requests.confirm_accept_multiple.title": "Boles atzetare is rechestas de notìfica?",
"notification_requests.confirm_dismiss_multiple.button": "{count, plural, one {Iscarta sa rechesta} other {Iscarta is rechestas}}",
"notification_requests.confirm_dismiss_multiple.message": "Ses acanta de iscartare {count, plural, one {una rechesta de notìfica} other {# rechestas de notìfica}}. No nche {count, plural, one {} other {}} as a pòdere prus atzèdere in manera sèmplitze. Seguru chi boles sighire?",
"notification_requests.confirm_dismiss_multiple.title": "Boles iscartare is rechestas de notìfica?",
"notification_requests.dismiss": "Iscarta",
"notification_requests.dismiss_multiple": "{count, plural, one {Iscarta una rechesta…} other {Iscarta # rechestas…}}",
"notification_requests.edit_selection": "Modifica",
"notification_requests.exit_selection": "Fatu",
"notification_requests.explainer_for_limited_account": "Is notìficas de custu contu sunt istadas filtradas, ca su contu est istadu limitadu dae sa moderatzione.",
"notification_requests.explainer_for_limited_remote_account": "Is notìficas de custu contu sunt istadas filtradas, ca su contu o su serbidore suo est istadu limitadu dae sa moderatzione.",
"notification_requests.maximize": "Ismànnia",
"notification_requests.minimize_banner": "Mìnima su bànner de notìficas filtradas",
"notification_requests.notifications_from": "Notìficas dae {name}",
"notification_requests.title": "Notìficas filtradas",
"notifications.clear": "Lìmpia notìficas",
@ -472,6 +561,11 @@
"poll_button.add_poll": "Agiunghe unu sondàgiu",
"poll_button.remove_poll": "Cantzella su sondàgiu",
"privacy.change": "Modìfica s'istadu de riservadesa",
"privacy.direct.long": "Totu is utentes mentovados in sa publicatzione",
"privacy.direct.short": "Persones ispetzìficas",
"privacy.private.long": "Isceti chie ti sighit",
"privacy.private.short": "Sighiduras",
"privacy.public.long": "Cale si siat persone a intro o a foras de Mastodon",
"privacy.public.short": "Pùblicu",
"privacy_policy.last_updated": "Ùrtima atualizatzione: {date}",
"privacy_policy.title": "Polìtica de riservadesa",
@ -497,34 +591,64 @@
"report.categories.legal": "Giurìdicu",
"report.categories.other": "Àteru",
"report.categories.spam": "Àliga",
"report.category.subtitle": "Sèbera sa currispondèntzia prus arta",
"report.category.title": "Nara·nos ite sutzedet cun custu {type}",
"report.category.title_account": "profilu",
"report.category.title_status": "publicatzione",
"report.close": "Fatu",
"report.comment.title": "Nch'at àteru chi depamus ischire?",
"report.forward": "Torra a imbiare a {target}",
"report.forward_hint": "Custu contu est de un'àteru serbidore. Ddi boles imbiare puru una còpia anònima de custu informe?",
"report.mute": "A sa muda",
"report.mute_explanation": "No as a bìdere is publicatziones suas. Ti podet ancora sighire e bìdere is publicatziones, ma no at a ischire chi dd'as postu a sa muda.",
"report.next": "Imbeniente",
"report.placeholder": "Cummentos additzionales",
"report.reasons.dislike": "Non mi praghet",
"report.reasons.dislike_description": "Est una cosa chi non boles bìdere",
"report.reasons.legal": "Illegale",
"report.reasons.other": "Un'àtera cosa",
"report.reasons.other_description": "Su problema non currispondet a is àteras categorias",
"report.reasons.spam": "Est àliga",
"report.rules.subtitle": "Seletziona totu is chi àplichent",
"report.statuses.subtitle": "Seletziona totu is chi àplichent",
"report.submit": "Imbia",
"report.target": "Informende de {target}",
"report.thanks.title": "Non boles bìdere custu?",
"report.thanks.title_actionable": "Gràtzias de sa sinnalatzione, dd'amus a averiguare.",
"report.unfollow": "Non sigas prus a @{name}",
"report.unfollow_explanation": "Ses sighende custu contu. Si non boles bìdere is publicatziones suas in sa pàgina printzipale tua, no ddu sigas prus.",
"report_notification.attached_statuses": "{count, plural, one {# post} other {# posts}} attached",
"report_notification.categories.legal": "Giurìdicu",
"report_notification.categories.legal_sentence": "cuntenutu illegale",
"report_notification.categories.other": "Àteru",
"report_notification.categories.other_sentence": "àteru",
"report_notification.categories.spam": "Àliga",
"report_notification.categories.spam_sentence": "àliga",
"report_notification.open": "Aberi una sinnalatzione",
"search.no_recent_searches": "Nissuna chirca reghente",
"search.placeholder": "Chirca",
"search.quick_action.account_search": "Profilos chi currispondent cun {x}",
"search.quick_action.go_to_account": "Bae a su profilu {x}",
"search.quick_action.go_to_hashtag": "Bae a s'eticheta {x}",
"search.quick_action.open_url": "Aberi s'URL in Mastodon",
"search.quick_action.status_search": "Publicatziones chi currispondent cun {x}",
"search.search_or_paste": "Chirca o incolla un'URL",
"search_popout.full_text_search_disabled_message": "No a disponimentu a {domain}.",
"search_popout.full_text_search_logged_out_message": "Isceti a disponimentu cun sa sessione aberta.",
"search_popout.language_code": "Còdighe de limba ISO",
"search_popout.options": "Optziones de chirca",
"search_popout.quick_actions": "Atziones lestras",
"search_popout.recent": "Chircas reghentes",
"search_popout.specific_date": "data ispetzìfica",
"search_popout.user": "utente",
"search_results.accounts": "Profilos",
"search_results.all": "Totus",
"search_results.hashtags": "Etichetas",
"search_results.nothing_found": "Impossìbile agatare currispondèntzias pro custos tèrmines de chirca",
"search_results.see_all": "Bide totu",
"search_results.statuses": "Publicatziones",
"search_results.title": "Chirca {q}",
"server_banner.about_active_users": "Gente chi at impreadu custu serbidore is ùrtimas 30 dies (Utentes cun Atividade a su Mese)",
"server_banner.active_users": "utentes ativos",
"server_banner.administered_by": "Amministradu dae:",
"server_banner.server_stats": "Istatìsticas de su serbidore:",

View File

@ -33,7 +33,7 @@
"account.follow": "Sledovať",
"account.follow_back": "Sledovať späť",
"account.followers": "Sledovatelia",
"account.followers.empty": "Tento účet ešte nikto nesleduje.",
"account.followers.empty": "Ešte nikto nesleduje tohto užívateľa.",
"account.followers_counter": "{count, plural, one {{counter} sledujúci} other {{counter} sledujúci}}",
"account.following": "Sledovaný účet",
"account.following_counter": "{count, plural, one {{counter} sledovaných} other {{counter} sledovaných}}",
@ -85,6 +85,7 @@
"alert.rate_limited.title": "Priveľa žiadostí",
"alert.unexpected.message": "Vyskytla sa nečakaná chyba.",
"alert.unexpected.title": "Ups!",
"alt_text_badge.title": "Alternatívny popis",
"announcement.announcement": "Oznámenie",
"attachments_list.unprocessed": "(nespracované)",
"audio.hide": "Skryť zvuk",

View File

@ -516,6 +516,7 @@
"notification.label.private_reply": "Përgjigje private",
"notification.label.reply": "Përgjigje",
"notification.mention": "Përmendje",
"notification.mentioned_you": "{name} ju ka përmendur",
"notification.moderation-warning.learn_more": "Mësoni më tepër",
"notification.moderation_warning": "Ju është dhënë një sinjalizim moderimi",
"notification.moderation_warning.action_delete_statuses": "Disa nga postimet tuaja janë hequr.",
@ -852,6 +853,11 @@
"upload_error.poll": "Me pyetësorët slejohet ngarkim kartelash.",
"upload_form.audio_description": "Përshkruajeni për persona me dëgjim të kufizuar",
"upload_form.description": "Përshkruajeni për persona me probleme shikimi",
"upload_form.drag_and_drop.instructions": "Që të merrni një bashkëngjitje media, shtypni tastin Space ose Enter. Teksa bëhet tërheqje, përdorni tastet shigjetë për ta shpënë bashkëngjitjen media në cilëndo drejtori që doni. Shtypni sërish Space ose Enter që të lihet bashkëngjitja media në pozicionin e vet të ri, ose shtypni Esc, që të anulohet veprimi.",
"upload_form.drag_and_drop.on_drag_cancel": "Tërheqja u anulua. Bashkëngjitja media {item} u la.",
"upload_form.drag_and_drop.on_drag_end": "Bashkëngjitja media {item} u la.",
"upload_form.drag_and_drop.on_drag_over": "Bashkëngjitja media {item} u lëviz.",
"upload_form.drag_and_drop.on_drag_start": "U mor bashkëngjitja media {item}.",
"upload_form.edit": "Përpunoni",
"upload_form.thumbnail": "Ndryshoni miniaturën",
"upload_form.video_description": "Përshkruajeni për persona me dëgjim të kufizuar ose probleme shikimi",

View File

@ -506,6 +506,7 @@
"notification.label.private_reply": "Privata svar",
"notification.label.reply": "Svar",
"notification.mention": "Nämn",
"notification.mentioned_you": "{name} nämnde dig",
"notification.moderation-warning.learn_more": "Läs mer",
"notification.moderation_warning": "Du har fått en moderationsvarning",
"notification.moderation_warning.action_delete_statuses": "Några av dina inlägg har tagits bort.",

View File

@ -512,6 +512,7 @@
"notification.label.private_reply": "การตอบกลับแบบส่วนตัว",
"notification.label.reply": "การตอบกลับ",
"notification.mention": "การกล่าวถึง",
"notification.mentioned_you": "{name} ได้กล่าวถึงคุณ",
"notification.moderation-warning.learn_more": "เรียนรู้เพิ่มเติม",
"notification.moderation_warning": "คุณได้รับคำเตือนการกลั่นกรอง",
"notification.moderation_warning.action_delete_statuses": "เอาโพสต์บางส่วนของคุณออกแล้ว",

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