Compare commits

...

708 commits

Author SHA1 Message Date
Hazelnoot
cd2e597223 merge: Improve performance of notes/following API (!743)
View MR for information: https://activitypub.software/TransFem-org/Sharkey/-/merge_requests/743

Approved-by: Hazelnoot <acomputerdog@gmail.com>
Approved-by: Marie <github@yuugi.dev>
2024-11-09 10:54:18 +00:00
Caramel
03559156b9 Improve performance of notes/following API 2024-11-09 00:32:03 +01:00
Julia
6ed38f53f5 merge: Bump version number (!735)
View MR for information: https://activitypub.software/TransFem-org/Sharkey/-/merge_requests/735
2024-11-05 06:14:24 +00:00
Julia Johannesen
0f07f27642
chore: Bump version number 2024-11-05 01:10:49 -05:00
Julia
680e3ac7a3 merge: release 2024.9.1 (!733)
View MR for information: https://activitypub.software/TransFem-org/Sharkey/-/merge_requests/733

Approved-by: Marie <github@yuugi.dev>
Approved-by: Julia <julia@insertdomain.name>
2024-11-05 03:59:23 +00:00
dakkar
002d0def42 comment out sharkey-specific crowdin link
we don't have it set up yet ☹
2024-11-04 20:54:48 +00:00
dakkar
a769423c15 bump version number for release 2024-11-04 18:50:26 +00:00
Julia
e783359aca merge: Revert "Experimental: dont mark backfetched notes as silent" (!703)
View MR for information: https://activitypub.software/TransFem-org/Sharkey/-/merge_requests/703

Approved-by: Julia <julia@insertdomain.name>
Approved-by: Hazelnoot <acomputerdog@gmail.com>
Approved-by: Marie <github@yuugi.dev>
2024-11-03 19:39:00 +00:00
dakkar
fa03c4cebe merge: Respect user privacy settings in federation endpoints (resolves #712) (!652)
View MR for information: https://activitypub.software/TransFem-org/Sharkey/-/merge_requests/652

Closes #712

Approved-by: Marie <github@yuugi.dev>
Approved-by: dakkar <dakkar@thenautilus.net>
2024-11-02 22:02:54 +00:00
Hazelnoot
ddf572c22f fix lint errors in FollowingEntityService.ts 2024-11-02 17:43:11 -04:00
Hazelnoot
872f987845 hide instance following / followers tabs from logged-out users 2024-11-02 17:39:16 -04:00
Hazel K
37fd454f70 factor out shared code 2024-11-02 17:39:16 -04:00
Hazel K
2e6726c81f update autogen types 2024-11-02 17:39:16 -04:00
Hazel K
3a72bf453a respect following privacy settings 2024-11-02 17:39:16 -04:00
Hazel K
65d81a4ae2 Revert "fix incorrect populated object in followers endpoint"
This reverts commit 7b9473bf4c0b55facede0e1d1e33297d14184110.
2024-11-02 17:39:16 -04:00
Hazel K
8f0df1f01c check for blocks in following / followers endpoints 2024-11-02 17:39:16 -04:00
Hazel K
c566fa1f36 require auth for followers & following endpoints 2024-11-02 17:39:16 -04:00
dakkar
1906dbe1dc merge: Fix frontend TS configs (!725)
View MR for information: https://activitypub.software/TransFem-org/Sharkey/-/merge_requests/725

Approved-by: dakkar <dakkar@thenautilus.net>
Approved-by: Marie <github@yuugi.dev>
2024-11-02 18:00:57 +00:00
Hazelnoot
b97db55a94 fix eslint in frontend / frontend-embed 2024-11-02 13:00:49 -04:00
dakkar
56023140cb merge: add FriendlyCaptcha as a captcha solution (!723)
View MR for information: https://activitypub.software/TransFem-org/Sharkey/-/merge_requests/723

Approved-by: dakkar <dakkar@thenautilus.net>
Approved-by: Hazelnoot <acomputerdog@gmail.com>
2024-11-02 15:46:25 +00:00
Hazelnoot
4ad816e0df fix frontend-embed tsconfig includes 2024-11-02 11:43:24 -04:00
Hazelnoot
5e054d0218 fix frontend tsconfig includes 2024-11-02 11:40:40 -04:00
Marie
b8b077cbad chore: replace recaptcha with frc 2024-11-02 11:02:13 +00:00
Marie
d786e96c2b
upd: add FriendlyCaptcha as a captcha solution
FriendlyCaptcha is a german captcha solution which is GDPR compliant and has a non-commerical free license
2024-11-02 02:20:35 +01:00
Hazelnoot
8824422cb5 merge: Add a clear filter option to the search widget if set (!722)
View MR for information: https://activitypub.software/TransFem-org/Sharkey/-/merge_requests/722

Closes #786

Approved-by: dakkar <dakkar@thenautilus.net>
Approved-by: Hazelnoot <acomputerdog@gmail.com>
2024-11-01 18:01:19 +00:00
Hazelnoot
bcc845cdb1 merge: Allow admins to create users (resolves #764) (!719)
View MR for information: https://activitypub.software/TransFem-org/Sharkey/-/merge_requests/719

Closes #764

Approved-by: dakkar <dakkar@thenautilus.net>
Approved-by: Marie <github@yuugi.dev>
2024-11-01 18:00:33 +00:00
Marie
c8357a410b upd: append ✔ on set filter 2024-11-01 17:45:04 +00:00
dakkar
8b16b0fce9 merge: Hide Following Feed from guest users/logged out users and also don't show the button for migrated accounts (!721)
View MR for information: https://activitypub.software/TransFem-org/Sharkey/-/merge_requests/721

Closes #787

Approved-by: Amber Null <puppygirlhornyposting@gmail.com>
Approved-by: dakkar <dakkar@thenautilus.net>
2024-11-01 17:33:39 +00:00
Hazelnoot
4da262d98c merge: fix inconsistent following feed filters on mobile (resolves #776) (!717)
View MR for information: https://activitypub.software/TransFem-org/Sharkey/-/merge_requests/717

Closes #776

Approved-by: Amber Null <puppygirlhornyposting@gmail.com>
Approved-by: Marie <github@yuugi.dev>
2024-11-01 15:40:43 +00:00
Hazelnoot
ade801ec58 check token permissions in admin/accounts/create.ts 2024-11-01 10:12:28 -04:00
Hazelnoot
37ff2bb0ca always approve the first / root user 2024-11-01 09:29:40 -04:00
Hazelnoot
f36a1a5701 allow admins to create approved users 2024-11-01 09:29:40 -04:00
Hazelnoot
173623a24b add missing copyright header to following-feed-utils.ts 2024-11-01 09:28:20 -04:00
Hazelnoot
64e4cf8277 fix inconsistent following feed filters on mobile 2024-11-01 09:27:34 -04:00
Marie
131fab1032 upd: add clear filter option if filter is set 2024-11-01 13:08:28 +00:00
Marie
9daecc27a5 upd: lock following-feed behind loginRequired and check if user has moved instances 2024-11-01 12:50:54 +00:00
Julia
1520bc1715 merge: Split character limits between local and remote notes (resolves #723) (!669)
View MR for information: https://activitypub.software/TransFem-org/Sharkey/-/merge_requests/669

Closes #723

Approved-by: dakkar <dakkar@thenautilus.net>
Approved-by: Julia <julia@insertdomain.name>
2024-10-29 03:04:25 +00:00
dakkar
276b30bdc0 merge: Collapse user activity, files, and listenbrainz on mobile (resolves #747) (!718)
View MR for information: https://activitypub.software/TransFem-org/Sharkey/-/merge_requests/718

Closes #747

Approved-by: Marie <github@yuugi.dev>
Approved-by: dakkar <dakkar@thenautilus.net>
2024-10-27 12:12:30 +00:00
dakkar
473f100b67 merge: fix inconsistent relation badges between user profile and user info block (resolves #778) (!716)
View MR for information: https://activitypub.software/TransFem-org/Sharkey/-/merge_requests/716

Closes #778

Approved-by: Marie <github@yuugi.dev>
Approved-by: dakkar <dakkar@thenautilus.net>
2024-10-27 12:07:38 +00:00
dakkar
d72c40d157 merge: fix race conditions in check_connect.js (!715)
View MR for information: https://activitypub.software/TransFem-org/Sharkey/-/merge_requests/715

Approved-by: Marie <github@yuugi.dev>
Approved-by: dakkar <dakkar@thenautilus.net>
2024-10-27 12:05:48 +00:00
Hazelnoot
6e5cbedc75 merge: Fix activity verification after key rotation (!691)
View MR for information: https://activitypub.software/TransFem-org/Sharkey/-/merge_requests/691

Approved-by: dakkar <dakkar@thenautilus.net>
Approved-by: Marie <github@yuugi.dev>
2024-10-27 02:51:07 +00:00
Hazelnoot
e87dddcca2 merge: remove stripes from posting preview (!714)
View MR for information: https://activitypub.software/TransFem-org/Sharkey/-/merge_requests/714

Approved-by: Hazelnoot <acomputerdog@gmail.com>
Approved-by: Marie <github@yuugi.dev>
2024-10-27 02:47:59 +00:00
Hazelnoot
a541eaba5e fix test errors 2024-10-26 17:34:42 -04:00
Hazelnoot
d2a4d6d9e0 fix lint errors in home.vue / index.listenbrainz.vue 2024-10-26 12:58:07 -04:00
Hazelnoot
75fc3de405 collapse user activity/files/listenbrainz by default on mobile 2024-10-26 12:51:52 -04:00
Hazelnoot
b034e1db67 fix inconsistent relation badges between user profile and user info block 2024-10-26 11:31:11 -04:00
Hazelnoot
27b502fab5 normalize re-fetch logic between InboxProcessorService and ActivityPubServerService 2024-10-26 10:40:15 -04:00
Hazelnoot
c0a5955e0a log key rotation 2024-10-26 10:40:15 -04:00
Hazelnoot
5eb9a263e2 fix public key re-fetch logic 2024-10-26 10:40:15 -04:00
Hazelnoot
78a75171c2 remove cached public keys after deletion 2024-10-26 10:40:15 -04:00
Hazelnoot
ca1cdc4ea3 fix poll option limit in masto API 2024-10-26 10:38:29 -04:00
Hazelnoot
726013057d show separate counters for text limit and CW limit 2024-10-26 10:38:16 -04:00
Hazelnoot
c5d9bde43f expose CW limit to frontend 2024-10-26 10:37:43 -04:00
Hazelnoot
01e98c75ab add separate limits for CW length 2024-10-26 10:04:23 -04:00
Hazelnoot
10d3d9f382 fix unit tests 2024-10-26 09:49:28 -04:00
Hazel K
a6befca845 clarify comment about MAX_NOTE_TEXT_LENGTH in tests 2024-10-26 09:49:28 -04:00
Hazel K
67185a5d5d fix UUID format 2024-10-26 09:49:28 -04:00
Hazel K
560ee43dcf separate character limits for local and remote notes 2024-10-26 09:49:28 -04:00
Hazelnoot
524ddb9677 fix race conditions in check_connect.js 2024-10-26 08:57:26 -04:00
Hazelnoot
55df1ad10f merge: teach eslint to check translations (!695)
View MR for information: https://activitypub.software/TransFem-org/Sharkey/-/merge_requests/695

Approved-by: Marie <github@yuugi.dev>
Approved-by: Hazelnoot <acomputerdog@gmail.com>
2024-10-25 15:23:14 +00:00
Hazelnoot
9562a830ed merge: Merge upstream security advisary (!707)
View MR for information: https://activitypub.software/TransFem-org/Sharkey/-/merge_requests/707

Approved-by: dakkar <dakkar@thenautilus.net>
Approved-by: Hazelnoot <acomputerdog@gmail.com>
2024-10-25 15:22:21 +00:00
Hazelnoot
57ce32d44f merge: fix: return getFromDb directly when fanoutTimeline is not enabled (!709)
View MR for information: https://activitypub.software/TransFem-org/Sharkey/-/merge_requests/709

Approved-by: dakkar <dakkar@thenautilus.net>
Approved-by: Hazelnoot <acomputerdog@gmail.com>
2024-10-25 15:20:06 +00:00
dakkar
991995673d remove stripes from posting preview 2024-10-24 21:40:34 +01:00
dakkar
beff26e6f4 merge: follow-up on !710: send MFM payload for notes that don't contain advanced MFM (!713)
View MR for information: https://activitypub.software/TransFem-org/Sharkey/-/merge_requests/713

Approved-by: Hazelnoot <acomputerdog@gmail.com>
Approved-by: Marie <github@yuugi.dev>
2024-10-24 17:32:00 +00:00
dakkar
d7ffc0be62 MR !710 had missed renderUpNote 2024-10-24 13:47:54 +01:00
dakkar
ca91af7fa9 merge: fix: make sure outgoing remote mentions get resolved correctly if referenced with non-canonical casing (!711)
View MR for information: https://activitypub.software/TransFem-org/Sharkey/-/merge_requests/711

Closes #646

Approved-by: dakkar <dakkar@thenautilus.net>
Approved-by: Marie <github@yuugi.dev>
2024-10-24 08:53:27 +00:00
dakkar
ff220bd372 Merge branch 'develop' into 'fix/user-lookup-capitalization'
# Conflicts:
#   packages/backend/src/core/MfmService.ts
2024-10-24 08:14:53 +00:00
dakkar
4fed355592 merge: fix: send MFM payload for notes that don't contain advanced MFM (!710)
View MR for information: https://activitypub.software/TransFem-org/Sharkey/-/merge_requests/710

Closes #647

Approved-by: Hazelnoot <acomputerdog@gmail.com>
Approved-by: dakkar <dakkar@thenautilus.net>
2024-10-24 08:10:46 +00:00
dakkar
c59852f834 merge: fix: make sure mentions of local users get rendered correctly during AP delivery (!712)
View MR for information: https://activitypub.software/TransFem-org/Sharkey/-/merge_requests/712

Closes #645

Approved-by: Hazelnoot <acomputerdog@gmail.com>
Approved-by: Marie <github@yuugi.dev>
2024-10-24 08:10:13 +00:00
Laura Hausmann
aae7fff494
fix: make sure mentions of local users get rendered correctly during AP delivery (resolves #645) 2024-10-24 05:51:30 +02:00
Laura Hausmann
724aff6e4e
fix: make sure outgoing remote mentions get resolved correctly if referenced with non-canonical casing (resolves #646) 2024-10-24 05:45:22 +02:00
Laura Hausmann
d52f4748f2
fix: send MFM payload for notes that don't contain advanced MFM (resolves #647) 2024-10-24 05:40:17 +02:00
Lhc_fl
67f977f4ff
fix: return getfromdb when FanoutTimeline is not enabled 2024-10-23 23:14:46 +08:00
饺子w (Yumechi)
e05420a92d
Merge commit from fork
[ghsa-gq5q-c77c-v236](https://github.com/misskey-dev/misskey/security/advisories/ghsa-gq5q-c77c-v236)

Signed-off-by: eternal-flame-AD <yume@yumechi.jp>
2024-10-22 22:30:17 +02:00
dakkar
f781c19df1 explicit licence in eslint files 2024-10-22 19:24:19 +01:00
dakkar
60be692a0a merge: fix: should use invite limit cycle to calculate invite/limit (!706)
View MR for information: https://activitypub.software/TransFem-org/Sharkey/-/merge_requests/706

Approved-by: Hazelnoot <acomputerdog@gmail.com>
Approved-by: dakkar <dakkar@thenautilus.net>
2024-10-22 14:07:17 +00:00
dakkar
b26b7a9570 re-add warnExternalUrl 2024-10-22 12:05:27 +01:00
dakkar
e40b3ec4c7 fix (sort of) all missing translations 2024-10-22 12:05:25 +01:00
dakkar
2fb688803f don't lint translations in translation test 2024-10-22 12:05:07 +01:00
dakkar
cff59ce2aa use en-US translations for linting 2024-10-22 12:05:07 +01:00
dakkar
6a3dc40c31 lint translations in embeds, too 2024-10-22 12:05:07 +01:00
dakkar
a7a630bfd0 fix operator 2024-10-22 12:02:24 +01:00
dakkar
d466e05eda ignore more weirdness 2024-10-22 12:02:24 +01:00
dakkar
b0bc24f01b lint Vue templates as well
the argument detection doesn't work inside templates when invoked via
the `<I18n>` component, because it's too complicated for me now
2024-10-22 12:02:24 +01:00
dakkar
f11536c927 ignore weirder cases 2024-10-22 12:02:24 +01:00
dakkar
30d53de356 fix argument/parameter checking 2024-10-22 12:02:24 +01:00
dakkar
dba3277200 fix CallExpression detection 2024-10-22 12:02:24 +01:00
dakkar
82674d8718 lint all uses of translations 2024-10-22 12:02:23 +01:00
Lhc_fl
6aaeda13b9
fix: should use invite limit cycle to calculate invite/limit 2024-10-22 18:48:24 +08:00
Hazelnoot
42e2a58642 merge: Add followers tab to following feed + fix duplication (resolves #729) (!705)
View MR for information: https://activitypub.software/TransFem-org/Sharkey/-/merge_requests/705

Closes #729

Approved-by: dakkar <dakkar@thenautilus.net>
Approved-by: Marie <github@yuugi.dev>
2024-10-22 09:19:34 +00:00
Hazelnoot
bc45ff2103 add warning about incomplete remote data on following feed 2024-10-21 17:57:54 -04:00
Hazelnoot
04654b2f84 add "followers" tab to following feed 2024-10-21 17:55:06 -04:00
Hazelnoot
053b47d78a return error when calling following feed with both includeReplies and filesOnly 2024-10-21 17:55:06 -04:00
Hazelnoot
6430a191f7 fix duplicate users in the following feed 2024-10-21 17:55:06 -04:00
dakkar
24ecef80e7 merge: Re-add missing JP i18n string for allowClickingNotifications (!702)
View MR for information: https://activitypub.software/TransFem-org/Sharkey/-/merge_requests/702

Approved-by: Hazelnoot <acomputerdog@gmail.com>
Approved-by: dakkar <dakkar@thenautilus.net>
Approved-by: Marie <github@yuugi.dev>
2024-10-21 20:14:41 +00:00
dakkar
063c597ca6 merge: re-add "copy link (origin)" that was dropped accidentally (!704)
View MR for information: https://activitypub.software/TransFem-org/Sharkey/-/merge_requests/704

Approved-by: Hazelnoot <acomputerdog@gmail.com>
Approved-by: Marie <github@yuugi.dev>
2024-10-21 16:04:38 +00:00
dakkar
d7a3ec9c5e re-add "copy link (origin)" that was dropped accidentally
there are 2 nearly identical blocks of code that generate the menu for
logged-in users and for not-logged-in… I had missed the logged-in one
2024-10-21 15:14:56 +01:00
dakkar
dfee4108f9 Revert "Experimental: dont mark backfetched notes as silent"
This reverts commit 1410f8d501.
2024-10-21 14:10:54 +01:00
CenTdemeern1
577e66e2ce Update index.d.ts 2024-10-21 14:26:17 +02:00
CenTdemeern1
1811933025 Re-add missing JP i18n string for allowClickingNotifications 2024-10-21 14:19:27 +02:00
dakkar
d103b76ab0 merge: chore: fix type errors in useNoteCapture (!701)
View MR for information: https://activitypub.software/TransFem-org/Sharkey/-/merge_requests/701

Approved-by: Marie <github@yuugi.dev>
Approved-by: dakkar <dakkar@thenautilus.net>
2024-10-21 08:04:34 +00:00
Lhc_fl
5e4ed13213
revert import sort 2024-10-21 09:03:14 +08:00
dakkar
649b525ab2 merge: parity with misskey locales (again) (!698)
View MR for information: https://activitypub.software/TransFem-org/Sharkey/-/merge_requests/698

Approved-by: Hazelnoot <acomputerdog@gmail.com>
Approved-by: dakkar <dakkar@thenautilus.net>
2024-10-20 19:35:41 +00:00
Lhc_fl
684be7d709
fix: fix type error of useNoteCapture 2024-10-21 01:38:03 +08:00
Lhc_fl
54addd0390
fix: fix type error of useNoteCapture 2024-10-21 01:35:40 +08:00
dakkar
4ccc0c4b1e merge: Optimizations to InternalStorageService (resolves #753) (!694)
View MR for information: https://activitypub.software/TransFem-org/Sharkey/-/merge_requests/694

Closes #753

Approved-by: dakkar <dakkar@thenautilus.net>
Approved-by: Marie <github@yuugi.dev>
2024-10-20 15:48:46 +00:00
Hazelnoot
90d8050df4 merge: Fix "Mark as Sensitive by default" locking files into a Sensitive state (!700)
View MR for information: https://activitypub.software/TransFem-org/Sharkey/-/merge_requests/700

Closes #760

Approved-by: dakkar <dakkar@thenautilus.net>
Approved-by: Hazelnoot <acomputerdog@gmail.com>
2024-10-20 12:17:17 +00:00
Hazelnoot
5482aac3aa merge: upd: remove file on cleaner, fix load more not working (!699)
View MR for information: https://activitypub.software/TransFem-org/Sharkey/-/merge_requests/699

Closes #762

Approved-by: dakkar <dakkar@thenautilus.net>
Approved-by: Hazelnoot <acomputerdog@gmail.com>
2024-10-20 12:14:40 +00:00
Marie
65ac5fef46
fix: default sensitive not letting users unmark files 2024-10-20 11:04:48 +02:00
Marie
5e49246c1e
upd: apply suggestion 2024-10-20 08:42:55 +02:00
Hazelnoot
fcd2c93a19 ensure that "thumbnail stored" / "web stored" messages only appear after success 2024-10-20 00:13:07 -04:00
Hazelnoot
7aee3c1617 fix comment typo in InternalStorageService.ts 2024-10-20 00:11:14 -04:00
Hazelnoot
b1d9314d6e pre-create the files directory to reduce IO operations 2024-10-20 00:10:11 -04:00
Hazelnoot
2deb64486b use async IO for InternalStorageService 2024-10-20 00:10:10 -04:00
Marie
8bf7495c92
upd: remove file on cleaner, fix load more not working 2024-10-20 01:58:35 +02:00
piuvas
61e33cb7e3
bring in portuguese locales just because 2024-10-19 08:38:35 -03:00
piuvas
f43aec7c88
merge misskey's locales 2024-10-19 08:29:35 -03:00
piuvas
aa19418037
move new strings to sharkey-locales 2024-10-19 08:28:55 -03:00
dakkar
ba17776b19 merge: version 2024.9.0 (!675)
View MR for information: https://activitypub.software/TransFem-org/Sharkey/-/merge_requests/675

Approved-by: Julia <julia@insertdomain.name>
Approved-by: Marie <github@yuugi.dev>
2024-10-18 21:14:49 +00:00
dakkar
2a4c91efcc Merge branch 'develop' into feature/2024.9.0 2024-10-18 22:09:11 +01:00
Marie
290bfd2075 merge: Allow logged in users to refresh polls (!686)
View MR for information: https://activitypub.software/TransFem-org/Sharkey/-/merge_requests/686

Closes #743

Approved-by: Hazelnoot <acomputerdog@gmail.com>
Approved-by: dakkar <dakkar@thenautilus.net>
2024-10-18 21:03:07 +00:00
dakkar
52e291af67 Merge branch 'develop' into feature/2024.9.0 2024-10-18 22:00:07 +01:00
Marie
d4ef030fd9 merge: Free up Usernames after deny/decline (!696)
View MR for information: https://activitypub.software/TransFem-org/Sharkey/-/merge_requests/696

Closes #752 and #759

Approved-by: Hazelnoot <acomputerdog@gmail.com>
Approved-by: dakkar <dakkar@thenautilus.net>
2024-10-18 18:13:43 +00:00
Marie
ed064b2193
upd: remove type username to confirm dialog
resolves # 759
2024-10-18 01:09:46 +02:00
Marie
fea7889e0c
upd: add recommended checks 2024-10-17 21:56:43 +02:00
Marie
5152192e09
fix: add missing type 2024-10-17 20:22:16 +02:00
Marie
42530b5a39
upd: add additional check from delete endpoint 2024-10-17 20:15:20 +02:00
Marie
360a127ad7
chore: indent 2024-10-17 20:14:25 +02:00
Marie
1d9cb4fad9
upd: add decline endpoint and free up username on decline 2024-10-17 20:11:10 +02:00
dakkar
786677b079 merge: Feat: Implement clickable notifications (!685)
View MR for information: https://activitypub.software/TransFem-org/Sharkey/-/merge_requests/685

Approved-by: Hazelnoot <acomputerdog@gmail.com>
Approved-by: dakkar <dakkar@thenautilus.net>
2024-10-17 15:56:05 +00:00
Hazelnoot
31039821a1 add scripts to run eslint on all packages 2024-10-16 10:30:57 -04:00
Hazelnoot
fbe6b31878 fix eslint errors in all projects due to over-including files 2024-10-16 10:30:38 -04:00
Hazelnoot
6c30c94b92 fix eslint errors in frontend / frontend-embed 2024-10-16 09:55:29 -04:00
Hazelnoot
2c8af72168 fix formatting in boot.js 2024-10-16 09:15:03 -04:00
Hazelnoot
0c2e113e8e update fast-xml-parser to patch security issue (DoS) 2024-10-15 22:03:42 -04:00
Hazelnoot
af3bb7346e update axios and ws to patch security issue (unexploitable in our case) 2024-10-15 22:00:39 -04:00
Hazelnoot
1f53df66d4 update katex to patch security issue (DoS + 2 more unexploitable) 2024-10-15 21:51:11 -04:00
Hazelnoot
5f3cb09eb1 fix lint errors in SkFormula.vue 2024-10-15 21:50:05 -04:00
Hazelnoot
2bd87fa481 add "lint-all" script to lazy-fail and print all errors at once 2024-10-15 21:42:25 -04:00
Hazelnoot
1a9f2f84b3 fix linting and type checks in all packages 2024-10-15 21:41:36 -04:00
Hazelnoot
b20e671452 disable linting in megalodon, as it's 3rd party code 2024-10-15 21:41:23 -04:00
Hazelnoot
45ac7e50bc fix locales versioning in service worker 2024-10-15 21:40:20 -04:00
Hazelnoot
b5a1c54d65 fix lint errors in backend unit tests 2024-10-15 21:40:20 -04:00
Hazelnoot
7431866d86 fix locales versioning in backend client 2024-10-15 21:40:20 -04:00
Hazelnoot
9b06347882 fix TS errors in NoteCreateService / NoteEditService 2024-10-15 21:31:34 -04:00
Hazelnoot
de61781c4a fix TS errors in vite config files 2024-10-15 21:23:03 -04:00
Hazelnoot
7e220d6e31 fix lint error in const.ts 2024-10-15 21:22:46 -04:00
Hazelnoot
c5f1279d4b fix lint / TS errors in create-notification.ts 2024-10-15 21:22:23 -04:00
Marie
4128b38724 chore: update misskey-js 2024-10-15 18:21:09 -04:00
Marie
dedb24fe74 chore: change permission kind 2024-10-15 18:21:09 -04:00
Marie
6b56163931 upd: change condition 2024-10-15 18:21:08 -04:00
Marie
61cb46b171 upd: hide refresh if logged out and if local, change blocked error message 2024-10-15 18:21:08 -04:00
Marie
00bb958874 chore: change string to locale 2024-10-15 18:21:08 -04:00
Marie
dd58a4aa92 upd: add ability to refresh poll 2024-10-15 18:21:08 -04:00
Hazelnoot
8a34d8e9d2 Merge branch 'develop' into feature/2024.9.0
# Conflicts:
#	locales/en-US.yml
#	locales/ja-JP.yml
#	packages/backend/src/core/NoteCreateService.ts
#	packages/backend/src/core/NoteDeleteService.ts
#	packages/backend/src/core/NoteEditService.ts
#	packages/frontend-shared/js/config.ts
#	packages/frontend/src/boot/common.ts
#	packages/frontend/src/pages/following-feed.vue
#	packages/misskey-js/src/autogen/endpoint.ts
2024-10-15 18:09:11 -04:00
Hazelnoot
68b90df00b merge: Refresh locales after any change, not just a version update (resolves #732) (!692)
View MR for information: https://activitypub.software/TransFem-org/Sharkey/-/merge_requests/692

Closes #732

Approved-by: dakkar <dakkar@thenautilus.net>
Approved-by: Marie <github@yuugi.dev>
2024-10-15 21:50:56 +00:00
Marie
7647aa637a merge: Improvements and tweaks to latest note handling (resolves #744) (!688)
View MR for information: https://activitypub.software/TransFem-org/Sharkey/-/merge_requests/688

Closes #744

Approved-by: dakkar <dakkar@thenautilus.net>
Approved-by: Marie <github@yuugi.dev>
2024-10-15 21:50:32 +00:00
Hazelnoot
de9b99c937 merge: Add filter options to following feed (resolves #726) (!671)
View MR for information: https://activitypub.software/TransFem-org/Sharkey/-/merge_requests/671

Closes #726

Approved-by: dakkar <dakkar@thenautilus.net>
Approved-by: Marie <github@yuugi.dev>
2024-10-15 21:50:26 +00:00
Hazelnoot
16847ba491 merge: Restore report forwarding to Pleroma (resolves #641) (!690)
View MR for information: https://activitypub.software/TransFem-org/Sharkey/-/merge_requests/690

Closes #641

Approved-by: dakkar <dakkar@thenautilus.net>
Approved-by: Marie <github@yuugi.dev>
2024-10-15 21:24:57 +00:00
Hazelnoot
e781be3c72 add unit tests for SkLatestNote.areEquivalent 2024-10-15 14:17:19 -04:00
Hazelnoot
e19193c9d0 unify logic of SkLatestNote.areEquivalent and SkLatestNote.keyFor 2024-10-15 14:17:19 -04:00
Hazelnoot
5dc700938d update latest_note for edits 2024-10-15 14:17:19 -04:00
Hazelnoot
93cf2f9045 factor out latest_note logic into LatestNoteService 2024-10-15 14:17:19 -04:00
Hazelnoot
c55af9c3b3 update latest note in background (don't await the result) 2024-10-15 14:17:19 -04:00
Hazelnoot
b18d7c0f3f move upgrade notes to separate file 2024-10-15 14:16:46 -04:00
Hazelnoot
fa687ecb33 fix is-renote tests 2024-10-15 14:16:46 -04:00
Hazelnoot
d3792ab201 fix test failures 2024-10-15 14:16:46 -04:00
Hazelnoot
9b1bae653d add "show bots" toggle to following feed 2024-10-15 14:16:46 -04:00
Hazelnoot
24fd35e03d revert accidental change to postgres.ts 2024-10-15 14:16:46 -04:00
Hazelnoot
e3c79b0c83 fix typos in track-latest-note-type migration 2024-10-15 14:16:46 -04:00
Hazel K
158cd3649d docs: add post-upgrade query to backfill following feed 2024-10-15 14:16:46 -04:00
Hazel K
fb7ac68ece match following endpoint default values with frontend defaults 2024-10-15 14:16:46 -04:00
Hazel K
499e8895c5 save filters for following feed 2024-10-15 14:16:46 -04:00
Hazel K
463b9ac59d add filters for following feed 2024-10-15 14:16:46 -04:00
Hazel K
56e7d7e0b1 remove un-necessary assignment to query 2024-10-15 14:16:46 -04:00
Hazel K
9d3292e6e9 add type columns to SkLatestNote 2024-10-15 14:16:46 -04:00
Hazel K
fea993f6b2 correct name of SkLatestNote 2024-10-15 14:16:46 -04:00
Hazelnoot
86a693b182 factor out tuple logic into from-tuple.ts 2024-10-15 14:03:57 -04:00
Hazelnoot
4e592fb1c9 federate Flag.object as an array to fix Pleroma compatibility 2024-10-15 13:54:28 -04:00
Hazelnoot
5c1d16947c fix import order in common.ts 2024-10-15 12:28:40 -04:00
Hazelnoot
8897b191d9 fix indentation in build-assets.mjs 2024-10-15 12:28:22 -04:00
Hazelnoot
652cc8602c refresh locales after any change, not just a version update 2024-10-15 12:23:18 -04:00
CenTdemeern1
6213018e62 Add Japanese translation 2024-10-15 14:14:59 +02:00
Julia Johannesen
d04e44b552
Fix indentation on locales/generateDTS.js 2024-10-14 15:15:24 -04:00
Hazelnoot
b15f25758a merge: feat: Allow users to view pending follow requests they sent (!663)
View MR for information: https://activitypub.software/TransFem-org/Sharkey/-/merge_requests/663

Approved-by: Hazelnoot <acomputerdog@gmail.com>
Approved-by: Marie <github@yuugi.dev>
2024-10-14 15:52:02 +00:00
Hazelnoot
2cd41228d8 Merge branch 'develop' into feature/2024.9.0 2024-10-13 11:35:10 -04:00
Hazelnoot
bd2cdd9363 restore missing hasPendingReceivedFollowRequest in navbar 2024-10-13 01:09:49 -04:00
Lhc_fl
edce54ad0f add new i18n pendingFollowRequests 2024-10-13 01:04:41 -04:00
Lhc_fl
19a1f3111b fix default followreq tab 2024-10-13 01:04:41 -04:00
Lhc_fl
0c03f9ead0 fix default followreq tab 2024-10-13 01:04:40 -04:00
Lhc_fl
0e6ba9ccd4 ux: should not show follow requests tab when have no pending sent follow req 2024-10-13 01:04:40 -04:00
Lhc_fl
1eacf0772c FEAT: Allow users to view pending follow requests they sent
This commit implements the `following/requests/sent` interface firstly
implemented on Firefish, and provides a UI interface to view the pending
follow requests users sent.
2024-10-13 01:04:40 -04:00
Marie
45974a53f8 merge: try to avoid insert races in FederatedInstanceService (!683)
View MR for information: https://activitypub.software/TransFem-org/Sharkey/-/merge_requests/683

Approved-by: Hazelnoot <acomputerdog@gmail.com>
Approved-by: Marie <github@yuugi.dev>
2024-10-13 00:17:16 +00:00
Marie
75ed3843fa merge: CONTRIBUTING.md: fix command to generate new migration (resolves #727) (!673)
View MR for information: https://activitypub.software/TransFem-org/Sharkey/-/merge_requests/673

Closes #727

Approved-by: Marie <github@yuugi.dev>
Approved-by: Tess K <me@thvxl.se>
2024-10-13 00:13:49 +00:00
Marie
fdfb0faab0 merge: Add missing rejectReports field to show-instance API response (!679)
View MR for information: https://activitypub.software/TransFem-org/Sharkey/-/merge_requests/679

Approved-by: Marie <github@yuugi.dev>
Approved-by: Tess K <me@thvxl.se>
2024-10-13 00:13:26 +00:00
CenTdemeern1
808963189e Autogen seems to have generated this file
This doesn't seem related so I'm putting it in its own commit so it can be dropped easily if needed
2024-10-13 01:03:29 +02:00
CenTdemeern1
5085c39440 Implement clickable notifications
I'm not sure about the get function pattern here as it doesn't include a value to base reactivity on; I might be too used to Svelte though and maybe that's fine
2024-10-13 01:03:29 +02:00
Hazelnoot
3093707469 merge: Prevent usernames from overflowing the reactions hover-list (resolves #737) (!682)
View MR for information: https://activitypub.software/TransFem-org/Sharkey/-/merge_requests/682

Closes #737

Approved-by: Marie <github@yuugi.dev>
Approved-by: Tess K <me@thvxl.se>
2024-10-12 21:46:04 +00:00
dakkar
a44d58781f Merge branch 'develop' into feature/2024.9.0 2024-10-12 20:00:40 +01:00
dakkar
80fdb595a6 fix editing notes 2024-10-12 19:45:47 +01:00
dakkar
14e21d00b9 honour prefers-reduced-motion in embeds 2024-10-12 19:45:35 +01:00
Hazelnoot
669e5c6ca0 merge: ignore stale users/show responses - fixes #741 (!684)
View MR for information: https://activitypub.software/TransFem-org/Sharkey/-/merge_requests/684

Closes #741

Approved-by: Hazelnoot <acomputerdog@gmail.com>
Approved-by: Marie <github@yuugi.dev>
2024-10-12 17:57:39 +00:00
dakkar
bf6ca8efdc also ignore stale *failed* responses - #741
since `misskeyApi` doesn't pass us the request, we close over a copy
of the username we requested, to make sure it still matches the
current username value
2024-10-12 18:23:20 +01:00
dakkar
5af38db74b ignore stale users/show responses - fixes #741
* person starts typing "abcd"
* request for user "abcd" is sent to server
* person continues typing "ef"
* request for user "abcdef" is sent to server
* response for user "abcdef" arrives, icon for user "abcdef" is shown
* response for user "abcd" arrives, icon for user "abcd" was shown –
  with this commit, this response is ignored instead

This is not just "showing the wrong avatar", btw: `MkSignin` uses the
`user` variable to decide whether to use 2FA, so having the wrong data
in user can make a login attempt fail.
2024-10-12 18:16:06 +01:00
Marie
464fb22710 fix: accidental double backslash in DEFAULT_INFO_IMAGE_URL 2024-10-12 11:41:20 +00:00
dakkar
06bd29f209 try to avoid insert races in FederatedInstanceService
Despite the cache, different processes can race to insert a row for
the same remote host.

This is particularly apparent in our unit tests, with
`test/unit/activitypub.ts` randomly failing.

This is a (somewhat clumsy) attempt at working around that race: trap
the "duplicate key value" error, and fetch the record.

Tests pass, with or without values in the cache.
2024-10-12 10:57:57 +01:00
dakkar
98f1f30e72 fix "federation allowed" check in our code 2024-10-12 09:35:45 +01:00
Hazelnoot
a1375c8ab7 prevent usernames from overflowing the reactions hover-list 2024-10-12 00:29:40 -04:00
Marie
f68c0ac05d fix: broken error images 2024-10-11 22:06:37 +00:00
Hazelnoot
adbea34c11 generate missing type for UserLite.isSilenced 2024-10-11 14:10:13 -04:00
Hazelnoot
b27b398717 fix calculation of instance-info.isSuspended when instance is null 2024-10-11 14:07:31 -04:00
Hazelnoot
148bf98f21 Merge branch 'develop' into feature/2024.9.0
# Conflicts:
#	packages/frontend/src/pages/instance-info.vue
2024-10-11 14:06:21 -04:00
Marie
f3e6b43ea4 merge: New logo (!681)
View MR for information: https://activitypub.software/TransFem-org/Sharkey/-/merge_requests/681

Approved-by: dakkar <dakkar@thenautilus.net>
Approved-by: Marie <github@yuugi.dev>
2024-10-11 18:04:32 +00:00
Hazelnoot
883168bc00 merge: Replace "suspend delivery" button with a toggle (resolves #725) (!677)
View MR for information: https://activitypub.software/TransFem-org/Sharkey/-/merge_requests/677

Closes #725

Approved-by: dakkar <dakkar@thenautilus.net>
Approved-by: Marie <github@yuugi.dev>
2024-10-11 18:03:12 +00:00
Ruben
69483bb55b
new logo 2024-10-11 11:32:35 -05:00
Hazelnoot
7837852149 copy iAmModerator check to other instance-info controls 2024-10-11 11:25:10 -04:00
Hazelnoot
66a88c89b5 fix TypeScript and ESLint errors in instance-info.vue 2024-10-11 11:24:39 -04:00
Hazelnoot
a39f5c92b4 add missing rejectReports field to show-instance response 2024-10-11 10:21:32 -04:00
Hazelnoot
f496d4b88b re-implement suspension toggle to match other controls 2024-10-11 10:16:57 -04:00
Hazelnoot
5a49955064 fix typo in "Server is suspended due to no responding" 2024-10-11 09:52:59 -04:00
Hazelnoot
87a12c020f convert "suspend deliver" button into a toggle 2024-10-11 09:52:59 -04:00
Hazelnoot
eb2ea85d40 merge: Minor improvements to relation badges on user profiles (!674)
View MR for information: https://activitypub.software/TransFem-org/Sharkey/-/merge_requests/674

Approved-by: Marie <github@yuugi.dev>
Approved-by: dakkar <dakkar@thenautilus.net>
2024-10-11 13:28:55 +00:00
dakkar
fb9b6b1208 thank you linters 2024-10-11 12:20:08 +01:00
dakkar
3cec5f927e fix some linting in frontends 2024-10-11 11:24:49 +01:00
dakkar
2ecaa57cd5 fix nyaize test 2024-10-11 10:25:07 +01:00
dakkar
02d36c4518 Merge branch 'develop' into feature/2024.9.0 2024-10-11 10:10:16 +01:00
dakkar
a12815eabe fix some (all?) Misskey references 2024-10-11 09:59:21 +01:00
Marie
fefdd1c1e8 merge: Fix: Finding emoji that include capital letters (!676)
View MR for information: https://activitypub.software/TransFem-org/Sharkey/-/merge_requests/676

Closes #522

Approved-by: Marie <github@yuugi.dev>
Approved-by: dakkar <dakkar@thenautilus.net>
2024-10-10 20:11:03 +00:00
CenTdemeern1
5cebb4da54 fix: Finding emoji that include capital letters
Custom emoji names and aliases that include capital letters can now be found in the emoji picker.
I kind of hate copy-pasting `.toLowerCase()` like this but apparently I'm not allowed to refactor Misskey code.
2024-10-10 21:48:53 +02:00
Hazelnoot
ffff1dfc7d merge: Reduce federation log spam (maybe resolves #689) (!649)
View MR for information: https://activitypub.software/TransFem-org/Sharkey/-/merge_requests/649

Closes #689

Approved-by: dakkar <dakkar@thenautilus.net>
Approved-by: Marie <github@yuugi.dev>
2024-10-10 19:43:39 +00:00
Hazelnoot
a7076ed3e0 show "blocking you" indicator to instance staff only 2024-10-10 14:01:40 -04:00
Hazelnoot
523ad3d60c add "following" and "mutuals" relation badges 2024-10-10 14:01:40 -04:00
Hazelnoot
1b106d92e0 fix HTML semantics of relational info-badges 2024-10-10 14:01:40 -04:00
Hazelnoot
2be802131f merge: On user profiles, move pinned notes down with the other note tabs (resolves #555) (!651)
View MR for information: https://activitypub.software/TransFem-org/Sharkey/-/merge_requests/651

Closes #555

Approved-by: dakkar <dakkar@thenautilus.net>
Approved-by: Marie <github@yuugi.dev>
2024-10-10 16:33:39 +00:00
Marie
8e85487f64 merge: Add show bots toggle to hamburger menu (!664)
View MR for information: https://activitypub.software/TransFem-org/Sharkey/-/merge_requests/664

Approved-by: dakkar <dakkar@thenautilus.net>
Approved-by: Marie <github@yuugi.dev>
2024-10-10 16:31:20 +00:00
Marie
4da6f9a2b2 merge: Add option to disable external url warning (!672)
View MR for information: https://activitypub.software/TransFem-org/Sharkey/-/merge_requests/672

Approved-by: Hazelnoot <acomputerdog@gmail.com>
Approved-by: dakkar <dakkar@thenautilus.net>
2024-10-10 16:29:40 +00:00
codingneko
1b278f5630 Remove show bots from client settings 2024-10-10 16:15:59 +00:00
dakkar
2da85e1163 (not related to the merge) fix instance name in severAllFollowRelations 2024-10-10 14:09:36 +01:00
dakkar
9ea618c4a5 fix some DI mistakes after the merge 2024-10-10 13:55:52 +01:00
dakkar
a2d47f686f replace icons in embeds 2024-10-10 13:50:20 +01:00
dakkar
7628fe9c46 show image comment as title in embeds 2024-10-10 13:48:40 +01:00
dakkar
e87b1d2b11 set isBlock for mfm render in embeds 2024-10-10 13:48:39 +01:00
dakkar
abb93f1d79 use sfm for embeds 2024-10-10 13:48:39 +01:00
dakkar
faa7b26344 maybe update embed mfm to our changes 2024-10-10 13:48:39 +01:00
Hazel K
830565787a docs: fix command to generate new migration 2024-10-09 23:41:26 -04:00
Marie
7bd971c036
upd: add option to disable external url warning 2024-10-10 02:00:41 +02:00
dakkar
ebe5f678f6 fix imports in channels bubble-timeline 2024-10-09 17:57:58 +01:00
dakkar
dec81d32d3 fix type in channel.ts 2024-10-09 17:56:40 +01:00
dakkar
671d71b3ba probably use correct icons in embeds 2024-10-09 17:24:33 +01:00
dakkar
43bdae4cc4 use injected meta in search-by-tag 2024-10-09 17:19:50 +01:00
dakkar
3b3bd68645 use injected meta in MastodonApiServerService 2024-10-09 17:18:38 +01:00
dakkar
9200d35f57 use injected meta in stream bubble-timeline 2024-10-09 17:17:27 +01:00
dakkar
7b7bc8b7b3 use injected meta in claim-achievement.ts 2024-10-09 17:15:27 +01:00
dakkar
96e77f8d39 use injected meta in like.ts
also, add extra errors copied from reactions/create.ts
2024-10-09 17:15:04 +01:00
dakkar
81376bcd1b use injected meta in SigninApiService 2024-10-09 17:10:02 +01:00
dakkar
ee439f9c7f remove MetaService from ActivityPubServerService 2024-10-09 17:07:43 +01:00
dakkar
f449e8ffe6 use injected meta is ApRendererService 2024-10-09 17:05:59 +01:00
dakkar
c31ee21485 fix meta in SignupService 2024-10-09 17:04:31 +01:00
dakkar
e6a78d8027 use injected meta in SponsorsService 2024-10-09 17:03:46 +01:00
dakkar
b04568f378 use injected meta in bubble-timeline 2024-10-09 17:00:38 +01:00
dakkar
ad33886bbb always use this.meta in SignupApiService 2024-10-09 16:53:46 +01:00
dakkar
afbed7f605 check redisForReactions at startup 2024-10-09 16:49:49 +01:00
dakkar
11e3c95026 replace isBlockedHost with isFederationAllowedHost 2024-10-09 16:39:24 +01:00
dakkar
60c6267d7a replace new icons with ours 2024-10-09 16:24:10 +01:00
dakkar
0a7075044a fix deleteAndEdit danger class 2024-10-09 16:10:03 +01:00
dakkar
10aab285d1 fix import 2024-10-09 16:07:37 +01:00
dakkar
50120371f7 fix import 2024-10-09 16:07:30 +01:00
dakkar
5856858f49 try to fix icons 2024-10-09 15:52:42 +01:00
dakkar
20928ef710 cleanup CONTRIBUTING 2024-10-09 15:52:42 +01:00
dakkar
73abf3204e fix following-feed imports 2024-10-09 15:52:42 +01:00
dakkar
c5ff081557 fix MkUrlWarningDialog imports 2024-10-09 15:52:42 +01:00
dakkar
7519f98462 copy changes from MkNoteDetailed to SkNoteDetailed 2024-10-09 15:52:42 +01:00
dakkar
3fca2ba2f6 copy changes from MkNote to SkNote 2024-10-09 15:52:42 +01:00
dakkar
1a656e8eb5 copy changes from NoteCreateService to NoteEditService 2024-10-09 15:40:00 +01:00
dakkar
b4c53687b4 oops, missed a closing tag 2024-10-09 15:27:05 +01:00
dakkar
f00576bce6 Merge remote-tracking branch 'misskey/master' into feature/2024.9.0 2024-10-09 15:17:22 +01:00
dakkar
2d6f1ed464 Merge branch 'merge-requests/668' into feature/2024.9.0 2024-10-09 10:41:22 +01:00
piuvas
14ae00b563
make en-US our crowdin source 2024-10-08 15:20:52 -03:00
piuvas
38fbf58943
use en-US to generate types 2024-10-08 15:16:58 -03:00
Marie
72a0f16b38 merge: Show instance sponsors if OC is set as donation url (!642)
View MR for information: https://activitypub.software/TransFem-org/Sharkey/-/merge_requests/642

Approved-by: Hazelnoot <acomputerdog@gmail.com>
Approved-by: Julia <julia@insertdomain.name>
2024-10-08 18:07:58 +00:00
Hazel K
a5316c06ed don't log job name unless it has one 2024-10-08 11:01:24 -04:00
Hazel K
5171ba7113 collapse AbortErrors 2024-10-08 10:43:58 -04:00
Hazel K
d867c2089b further condense error details 2024-10-08 10:43:51 -04:00
Hazel K
d8e1e4890d normalize ID logging 2024-10-08 10:33:48 -04:00
Hazel K
f62cd8941c condense error info 2024-10-08 10:33:34 -04:00
Hazel K
b4d10aa8f8 fix maxAttempts calculation 2024-10-08 10:29:03 -04:00
Hazel K
786702e076 condense job info 2024-10-08 10:27:55 -04:00
Hazel K
83869e1c47 fix lint errors 2024-10-08 10:14:33 -04:00
piuvas
96d1d16aaa
reintroduce sharkey changes from other languages 2024-10-08 11:14:28 -03:00
Hazel K
20dd66f735 improve error summaries 2024-10-08 10:14:26 -04:00
piuvas
6447167bc5
update upstream locales 2024-10-08 11:13:48 -03:00
Hazel K
ed0570110b reduce federation log spam
* Don't record stack trace for unrecoverable errors.
* Avoid logging duplicate stace traces.
2024-10-08 09:30:08 -04:00
Marie
80c3acf731 merge: Count CW text in the character limit (resolves #724) (!667)
View MR for information: https://activitypub.software/TransFem-org/Sharkey/-/merge_requests/667

Closes #724

Approved-by: dakkar <dakkar@thenautilus.net>
Approved-by: Marie <github@yuugi.dev>
2024-10-08 09:08:37 +00:00
piuvas
672c4f746c
inform users about sharkey specific localization 2024-10-08 00:33:16 -03:00
piuvas
6c1f2c6d11
update crowdin.yml 2024-10-07 20:51:45 -03:00
piuvas
6f7c0c2de3
merge translations (based part) 2024-10-07 20:38:42 -03:00
piuvas
5145afb625
fix pt-BR thing (i also changed this for misskey dw) 2024-10-07 20:38:08 -03:00
Hazel K
eb5a2b023e count CW for character limit 2024-10-07 19:25:03 -04:00
Hazelnoot
a90b4d487a merge: Increase character hard limits (resolves #686 and #696) (!647)
View MR for information: https://activitypub.software/TransFem-org/Sharkey/-/merge_requests/647

Closes #686 and #696

Approved-by: Marie <github@yuugi.dev>
Approved-by: dakkar <dakkar@thenautilus.net>
2024-10-07 23:20:14 +00:00
piuvas
52fcdb290b
empty out new languages 2024-10-07 20:18:51 -03:00
piuvas
819b1b324a
reverted to misskey locales 2024-10-07 19:44:23 -03:00
piuvas
b0921189a4
separated locales 2024-10-07 19:44:06 -03:00
Hazel K
5f435f7250 restore sorting of pinned notes 2024-10-07 16:26:30 -04:00
Hazel K
c783ccf8cb sort pinned notes by date 2024-10-07 16:20:40 -04:00
Hazel K
35114df6d4 always default to latest notes instead of pins 2024-10-07 16:20:40 -04:00
Hazel K
3003affe6a fix extra gap above user notes 2024-10-07 16:20:40 -04:00
Hazel K
60ec877d3c on user profiles, move pinned notes down with the other notes 2024-10-07 16:20:40 -04:00
codingneko
3defc831c3 Fix formatting issues 2024-10-07 21:51:55 +02:00
Marie
ba5eec2129 merge: Prevent deletion or suspension of system accounts (resolves #625) (!666)
View MR for information: https://activitypub.software/TransFem-org/Sharkey/-/merge_requests/666

Closes #625

Approved-by: dakkar <dakkar@thenautilus.net>
Approved-by: Marie <github@yuugi.dev>
2024-10-07 19:34:26 +00:00
Marie
f7e9ffb99a merge: Display instance follow/following relationships in instance view (partial implementation of 648) (!665)
View MR for information: https://activitypub.software/TransFem-org/Sharkey/-/merge_requests/665

Approved-by: Hazelnoot <acomputerdog@gmail.com>
Approved-by: Marie <github@yuugi.dev>
2024-10-07 19:30:48 +00:00
Hazel K
cd9bce3072 prevent login and password reset for system accounts 2024-10-07 14:58:39 -04:00
Hazel K
126a2fcf15 Merge branch 'develop' into hazelnoot/625-protect-system-accounts 2024-10-07 14:10:45 -04:00
dakkar
32a97a5a05 merge: Add feed of latest posts by followed users (!640)
View MR for information: https://activitypub.software/TransFem-org/Sharkey/-/merge_requests/640

Approved-by: dakkar <dakkar@thenautilus.net>
Approved-by: Marie <github@yuugi.dev>
2024-10-07 17:15:33 +00:00
Hazel K
39214431f4 check for host 2024-10-07 11:45:58 -04:00
Hazel K
9137ae1eef update autogen types 2024-10-07 11:21:52 -04:00
Hazel K
6cfadb1f61 add prefix to components 2024-10-07 11:21:37 -04:00
Hazel K
12de9fcb18 fix error display 2024-10-07 11:18:08 -04:00
PrivateGER
46e53e294e
Parameterize followee as well 2024-10-07 16:47:15 +02:00
Hazel K
0da7f9b3f6 Merge branch 'develop' into hazelnoot/following-timeline 2024-10-07 10:45:16 -04:00
Hazel K
adc7b91e3b fix UI hiding on admin-user.vue 2024-10-07 10:41:41 -04:00
Hazel K
c77e90d98a update autogen types 2024-10-07 10:41:18 -04:00
Hazel K
844dfaaf5d model missing "approved" property in show-user response 2024-10-07 10:40:44 -04:00
PrivateGER
1c3495ef59
Make including followers in response a parameter 2024-10-07 16:23:24 +02:00
Hazel K
a790fef261 prevent deletion or suspension of system accounts 2024-10-07 10:02:55 -04:00
PrivateGER
bfd812720e Move styling to MkA elements 2024-10-07 12:46:28 +02:00
PrivateGER
80cbf00eac Add following and follower relationship view 2024-10-07 12:30:49 +02:00
PrivateGER
a292e46f84 Pack other side of relation into response as well 2024-10-07 11:56:18 +02:00
codingneko
347dc25bb8 Add show bots toggle 2024-10-07 03:12:29 +02:00
Hazelnoot
934e007698 merge: Add controls to delete all files or sever all relations with a remote instance (!654)
View MR for information: https://activitypub.software/TransFem-org/Sharkey/-/merge_requests/654

Approved-by: Marie <github@yuugi.dev>
Approved-by: Hazelnoot <acomputerdog@gmail.com>
2024-10-06 21:33:39 +00:00
PrivateGER
fadae347ff Merge branch 'develop' of https://activitypub.software/TransFem-org/Sharkey into feat/instance-admin-ui 2024-10-06 23:13:10 +02:00
Marie
28bfd87537 merge: Add option to reject reports from an instance (Resolves #579, #715, #716) (!662)
View MR for information: https://activitypub.software/TransFem-org/Sharkey/-/merge_requests/662

Closes #579, #715, and #716

Approved-by: dakkar <dakkar@thenautilus.net>
Approved-by: Marie <github@yuugi.dev>
2024-10-06 19:39:38 +00:00
PrivateGER
f028795483 Move text into translation files 2024-10-06 20:31:41 +02:00
Hazelnoot
42dbe999e1 merge: Change the recent external url warning popup to the one from Cherrypick/MisskeyIO (!648)
View MR for information: https://activitypub.software/TransFem-org/Sharkey/-/merge_requests/648

Approved-by: dakkar <dakkar@thenautilus.net>
Approved-by: Hazelnoot <acomputerdog@gmail.com>
2024-10-06 17:56:36 +00:00
PrivateGER
941a200f35 Move button into button group 2024-10-06 19:53:10 +02:00
Marie
939f07fa55
upd: fix returns 2024-10-06 19:08:32 +02:00
Hazel K
047563bdde Merge branch 'develop' into hazelnoot/579-reject-reports
# Conflicts:
#	packages/frontend/src/pages/instance-info.vue
2024-10-06 12:26:25 -04:00
Hazel K
60d0e3df7b preserve refresh button on mobile UI 2024-10-06 12:20:06 -04:00
Hazel K
01fb606fee fix weird left-alignment 2024-10-06 12:18:15 -04:00
Hazel K
d016ef7675 fix display size reactivity 2024-10-06 12:02:56 -04:00
Marie
6d7c7357ab merge: Warn when a domain is implicitly blocked because a base domain is blocked (resolves #564) (!661)
View MR for information: https://activitypub.software/TransFem-org/Sharkey/-/merge_requests/661

Closes #564

Approved-by: dakkar <dakkar@thenautilus.net>
Approved-by: Marie <github@yuugi.dev>
2024-10-06 15:54:46 +00:00
Hazelnoot
702bb9e5e0 merge: Set visitor dashboard's menu button z-index to 50 (!656)
View MR for information: https://activitypub.software/TransFem-org/Sharkey/-/merge_requests/656

Approved-by: Marie <github@yuugi.dev>
Approved-by: Hazelnoot <acomputerdog@gmail.com>
Approved-by: dakkar <dakkar@thenautilus.net>
2024-10-06 15:44:57 +00:00
Hazel K
4ca27692ac Merge branch 'develop' into hazelnoot/following-timeline 2024-10-06 11:16:43 -04:00
Hazel K
b9e89edbc7 add missing translation 2024-10-06 11:16:18 -04:00
Hazel K
eec4a5082d fix OpenAPI definition for admin/meta.silencedHosts 2024-10-06 11:03:28 -04:00
Hazel K
605c22b55e add lockout for isMediaSilenced 2024-10-06 10:58:27 -04:00
Hazel K
008ac89672 fix translation string 2024-10-06 10:58:06 -04:00
Hazel K
9b11aead5a Merge branch 'develop' into hazelnoot/564-warn-when-base-domain-is-blocked 2024-10-06 10:48:20 -04:00
Hazel K
2bc9ce93b8 add missing import 2024-10-06 10:47:55 -04:00
Hazelnoot
ad4054f4e4 merge: Dont mark backfetched notes as silent (!655)
View MR for information: https://activitypub.software/TransFem-org/Sharkey/-/merge_requests/655

Approved-by: Hazelnoot <acomputerdog@gmail.com>
Approved-by: dakkar <dakkar@thenautilus.net>
2024-10-06 13:56:44 +00:00
Marie
5f7730bd5c merge: Show yes/no options instead of ok/cancel when pasting long text (resolves #584) (!658)
View MR for information: https://activitypub.software/TransFem-org/Sharkey/-/merge_requests/658

Closes #584

Approved-by: Marie <github@yuugi.dev>
Approved-by: dakkar <dakkar@thenautilus.net>
2024-10-06 10:51:22 +00:00
Marie
88f3f0c7eb merge: Indicate that a user is blocked / muted (resolves #557) (!659)
View MR for information: https://activitypub.software/TransFem-org/Sharkey/-/merge_requests/659

Closes #557

Approved-by: dakkar <dakkar@thenautilus.net>
Approved-by: Marie <github@yuugi.dev>
2024-10-06 10:48:48 +00:00
Marie
17617b6355 merge: Include Mastodon's "indexable" property on federated user profiles (resolves #713) (!660)
View MR for information: https://activitypub.software/TransFem-org/Sharkey/-/merge_requests/660

Closes #713

Approved-by: Marie <github@yuugi.dev>
Approved-by: dakkar <dakkar@thenautilus.net>
2024-10-06 10:47:14 +00:00
Marie
f77eb34225 merge: Check if time-based achievements are unlocked before initializing them in main-boot (!657)
View MR for information: https://activitypub.software/TransFem-org/Sharkey/-/merge_requests/657

Approved-by: Hazelnoot <acomputerdog@gmail.com>
Approved-by: Marie <github@yuugi.dev>
2024-10-06 10:38:51 +00:00
Marie
7347d03907 merge: Don't depend on launcher.moe for status assets (!653)
View MR for information: https://activitypub.software/TransFem-org/Sharkey/-/merge_requests/653

Approved-by: Hazelnoot <acomputerdog@gmail.com>
Approved-by: Marie <github@yuugi.dev>
2024-10-06 10:34:22 +00:00
Hazel K
7dd296017b fix modlog and translations for "Mark as NSFW" 2024-10-05 22:43:34 -04:00
Hazel K
61124699da fix lint errors 2024-10-05 22:21:00 -04:00
Hazel K
4da0d4be71 add option to reject reports from an instance 2024-10-05 22:01:55 -04:00
Hazel K
b23d650a15 warn when a domain is hard-blocked by a base domain 2024-10-05 20:42:31 -04:00
Hazel K
c315f9ccf5 include Mastodon's "indexable" property on federated user profiles 2024-10-05 19:48:35 -04:00
Hazel K
e622ab7cc7 indicate if a user is blocked / muted by the current user 2024-10-05 19:13:09 -04:00
Hazel K
c635992616 restore primary highlighting 2024-10-05 18:47:50 -04:00
Hazel K
ca98107eee respect following privacy settings 2024-10-05 18:25:13 -04:00
Evan Paterakis
c0702fd92f
Check if time-based achievements are unlocked before initializing them in main-boot 2024-10-05 22:58:43 +03:00
Evan Paterakis
5cd44433a0
Set visitor dashboard's menu button z-index to 50 2024-10-05 21:10:33 +03:00
PrivateGER
996d079476 Make remove-all-following remove follows in both directions 2024-10-05 19:59:50 +02:00
PrivateGER
1410f8d501 Experimental: dont mark backfetched notes as silent 2024-10-05 19:17:49 +02:00
PrivateGER
b3f925c426 Fix breaking follow relationships + add warning counts to dialogue 2024-10-05 19:06:05 +02:00
PrivateGER
99a0f756ff Expose instance-moderation endpoints in UI 2024-10-05 19:06:05 +02:00
Evan Paterakis
d633fe41bc
Don't depend on launcher.moe for status assets 2024-10-05 14:49:29 +03:00
Hazel K
95a0e814bc remove numeric separators 2024-10-04 09:15:12 -04:00
Hazel K
8da3b064b7 fix lint errors 2024-10-04 09:14:17 -04:00
Hazel K
fb7bc2ff01 preserve scroll positions when navigating 2024-10-04 08:58:32 -04:00
Hazel K
4273640530 fix extra scroll bar on mobile 2024-10-04 08:31:25 -04:00
Marie
4b31004c2b
upd: apply suggestions 2024-10-04 08:41:23 +02:00
Marie
323c075483
fix: add props before url 2024-10-04 02:34:34 +02:00
Marie
67d739cf71
upd: add script and check to MkUrl 2024-10-04 02:34:01 +02:00
Marie
b0568e2baa
chore: remove unused locale 2024-10-04 02:33:02 +02:00
Marie
d5b372f7a9
upd&merge: Merge Cherrypick/MisskeyIO's external url popup, delete old popup warning and modify script to handle undefined domains 2024-10-04 02:31:22 +02:00
Hazel K
3842a1ee8c fix length validation 2024-10-03 20:05:15 -04:00
Hazel K
063b2ff266 increase character limits and share between text and CW 2024-10-03 19:53:57 -04:00
Marie
ac1e5a0fb5 merge: Feat: Implement "Show Below Avatar" for Avatar Decorations (!645)
View MR for information: https://activitypub.software/TransFem-org/Sharkey/-/merge_requests/645

Approved-by: dakkar <dakkar@thenautilus.net>
Approved-by: Marie <github@yuugi.dev>
2024-10-03 20:40:34 +00:00
CenTdemeern1
9b130b3390 Update automatically generated API type definitions 2024-10-03 22:27:14 +02:00
Marie
aedc5fba81 merge: Disabling cat speak on the client (!609)
View MR for information: https://activitypub.software/TransFem-org/Sharkey/-/merge_requests/609

Closes #604

Approved-by: fEmber <acomputerdog@gmail.com>
Approved-by: Marie <github@yuugi.dev>
2024-10-03 19:51:35 +00:00
Hazel K
bdd8e54be9 add missing copyright header 2024-10-03 15:19:05 -04:00
Hazel K
fddf078b52 improve per-user view on mobile 2024-10-03 15:16:07 -04:00
Marie
4d011e7fe0
chore: change typing, remove unusued imports 2024-10-03 20:02:55 +02:00
Hazel K
97a16c2ebc Merge branch 'develop' into hazelnoot/following-timeline 2024-10-03 14:00:06 -04:00
dakkar
ef002e00b6 cover case of author speaking as cat while not being cat
as @Marie pointed out, if you disable "is cat" without first disabling
"speak as cat", you don't want to speak as a cat!
2024-10-03 18:51:05 +01:00
dakkar
c2cc718f03 extract SponsorsService, use RedisKVCache
Please someone add types…
2024-10-03 18:48:11 +01:00
Marie
f6e0a04053 merge: maybe fix #510 - try to not edit visibility (!631)
View MR for information: https://activitypub.software/TransFem-org/Sharkey/-/merge_requests/631

Closes #510

Approved-by: fEmber <acomputerdog@gmail.com>
Approved-by: Marie <github@yuugi.dev>
2024-10-03 17:45:26 +00:00
Marie
0f71dc6a07 merge: fix #332 - classic view navbar now respects "side (icon only)" (!630)
View MR for information: https://activitypub.software/TransFem-org/Sharkey/-/merge_requests/630

Closes #332

Approved-by: fEmber <acomputerdog@gmail.com>
Approved-by: Marie <github@yuugi.dev>
2024-10-03 17:39:32 +00:00
Marie
66ddf965b5 merge: alert when searching notes from widget, and search is disabled - fixes #275 (!629)
View MR for information: https://activitypub.software/TransFem-org/Sharkey/-/merge_requests/629

Closes #275

Approved-by: fEmber <acomputerdog@gmail.com>
Approved-by: Marie <github@yuugi.dev>
2024-10-03 17:32:20 +00:00
Marie
85b0dad84e merge: missing bubble timeline translations (!605)
View MR for information: https://activitypub.software/TransFem-org/Sharkey/-/merge_requests/605

Approved-by: fEmber <acomputerdog@gmail.com>
Approved-by: Marie <github@yuugi.dev>
2024-10-03 17:30:01 +00:00
CenTdemeern1
25e90f9c07 Add JP localization for Show Below Avatar 2024-10-03 19:29:38 +02:00
CenTdemeern1
cb264dae75 Use negative z-index to position decorations behind the avatar
Co-authored-by: dakkar <dakkar@thenautilus.net>
2024-10-03 19:12:10 +02:00
Hazel K
d82c0ddba9 fix "fetch user info during animation sync" 2024-10-03 12:03:21 -04:00
dakkar
c85913d4b0 nicer wordinc 2024-10-03 16:59:37 +01:00
dakkar
fa71e54812 backup/restore disableCatSpeak 2024-10-03 16:59:08 +01:00
dakkar
491a499c58 store disableCatSpeak per account 2024-10-03 16:59:08 +01:00
Leah
49eb673c40 fix nyaize line 2024-10-03 16:59:08 +01:00
Leah
4281f08a75 moved translation 2024-10-03 16:59:07 +01:00
Leah
d8474ceda5 Fixed grammar 2024-10-03 16:58:50 +01:00
Leah
d55c86548d You can now disable cat speak in settings (client side) 2024-10-03 16:58:49 +01:00
dakkar
bc8c6592ea merge: make MkAbuseReport more friendly for smaller screen sizes (!646)
View MR for information: https://activitypub.software/TransFem-org/Sharkey/-/merge_requests/646

Approved-by: dakkar <dakkar@thenautilus.net>
Approved-by: fEmber <acomputerdog@gmail.com>
2024-10-03 15:57:19 +00:00
fEmber
e2beec33f8 merge: Minor issue fixes on the frontend (!625)
View MR for information: https://activitypub.software/TransFem-org/Sharkey/-/merge_requests/625

Closes #659, #656, #651, #661, #632, and #710

Approved-by: dakkar <dakkar@thenautilus.net>
Approved-by: fEmber <acomputerdog@gmail.com>
2024-10-03 15:52:00 +00:00
dakkar
8b7482f9c0 fix linting 2024-10-03 16:49:20 +01:00
blueb
04c729e504 fix: lint error in MkAbuseReport 2024-10-03 11:43:04 -04:00
Hazel K
21b935aa78 add toggle for "only with files" 2024-10-03 11:33:03 -04:00
Hazel K
2fbb697bf9 fetch user info during animation sync 2024-10-03 11:32:51 -04:00
Hazel K
9b572be0df use standard mute logic 2024-10-03 11:32:23 -04:00
CenTdemeern1
e43c58a955 Simplify the getDecorationZIndex function 2024-10-03 16:55:24 +02:00
blueb
5ef58c90ae replace brs with margin in MkAbuseReport 2024-10-03 09:12:25 -04:00
Hazel K
7ad36d33e9 add comments for mute logic 2024-10-03 00:49:47 -04:00
Hazel K
72d59b459a respect word mutes 2024-10-03 00:45:49 -04:00
Hazel K
fcb1218bbc add missing import 2024-10-03 00:43:45 -04:00
blueb
cbecaad5ae don't make MkAbuseReport harder to see if resolved 2024-10-03 00:06:20 -04:00
blueb
a32a8e0404 improvement: make MkAbuseReport more friendly for smaller screen sizes 2024-10-03 00:02:04 -04:00
Hazel K
64c737036f more lint fixes 2024-10-02 23:35:40 -04:00
Hazel K
40179a5591 lint fixes 2024-10-02 22:00:32 -04:00
Hazel K
5c87ed8488 add missing import 2024-10-02 20:32:54 -04:00
Hazel K
444b02ecdd reload user info when switching tabs 2024-10-02 20:26:22 -04:00
Hazel K
508e76b672 scroll both columns separately 2024-10-02 20:20:51 -04:00
CenTdemeern1
28aa99b273 Implement "Show Below Avatar" for Avatar Decorations 2024-10-02 23:49:30 +02:00
Hazel K
9ddab63a6a hide actions in mobile layout 2024-10-02 17:08:12 -04:00
Hazel K
484a39c658 Merge branch 'develop' into hazelnoot/following-timeline 2024-10-02 15:02:29 -04:00
Hazel K
19d7d44d0e use QueryService for blocks and mutes 2024-10-02 15:02:22 -04:00
Marie
007384c536
upd: fix random bg on post button in classic view
This does basically nothing in classic view besides breaking the custom wallpapers function
2024-10-02 20:40:58 +02:00
Marie
da7a5add33
upd: use @click.prevent instead of @click 2024-10-02 20:11:41 +02:00
dakkar
a357e9bca2 merge: fix exception when logging IP addresses (!644)
View MR for information: https://activitypub.software/TransFem-org/Sharkey/-/merge_requests/644

Approved-by: dakkar <dakkar@thenautilus.net>
Approved-by: Marie <github@yuugi.dev>
2024-10-02 17:59:03 +00:00
Marie
f08ef28d54
upd: fix broken returns and change if statement 2024-10-02 19:39:06 +02:00
Marie
9dd51bc9eb
upd: fix donationUrl check position 2024-10-02 19:31:46 +02:00
Marie
6b459be117
upd: move totalSponsors and donationUrl check 2024-10-02 19:27:26 +02:00
Hazel K
49e00c39cf Merge branch 'develop' into hazelnoot/following-timeline 2024-10-02 13:23:04 -04:00
Hazel K
d7f1e3f823 respect blocks and mutes for replies and renotes 2024-10-02 13:23:01 -04:00
Marie
34cbf55239
upd: apply suggestion 2024-10-02 19:16:54 +02:00
Marie
e2010caaff
Merge branch 'develop' into upd/instancesponsor 2024-10-02 18:57:49 +02:00
fEmber
72baaaabef merge: chore: lint (!643)
View MR for information: https://activitypub.software/TransFem-org/Sharkey/-/merge_requests/643

Approved-by: dakkar <dakkar@thenautilus.net>
Approved-by: fEmber <acomputerdog@gmail.com>
2024-10-02 16:56:43 +00:00
Marie
a87ced64ca
chore: lint 2024-10-02 18:51:07 +02:00
Hazel K
3defed6a19 fix exception when logging IP addresses 2024-10-02 12:47:01 -04:00
Hazel K
f43cb514b0 add menu to toggle user replies / boosts 2024-10-02 12:41:08 -04:00
Marie
0897458c72
Merge branch 'develop' into upd/instancesponsor 2024-10-02 18:39:45 +02:00
Hazel K
7603ecddac respect domain mutes 2024-10-02 12:28:41 -04:00
Marie
dcd6eee627
upd: cache instance sponsors 2024-10-02 18:27:11 +02:00
Marie
cc1017b2af
upd: add sponsors to instance information 2024-10-02 18:25:23 +02:00
Marie
3529042cb1
fix: api returns all backers on users so check if tier exists 2024-10-02 18:25:06 +02:00
Hazel K
7b2bc12ff9 Merge branch 'develop' into hazelnoot/following-timeline 2024-10-02 12:18:29 -04:00
fEmber
b151d19325 merge: fix type error for sidebarLogoUrl (!641)
View MR for information: https://activitypub.software/TransFem-org/Sharkey/-/merge_requests/641

Approved-by: dakkar <dakkar@thenautilus.net>
Approved-by: fEmber <acomputerdog@gmail.com>
2024-10-02 16:05:18 +00:00
Marie
2e036d14c5
fix: sidebarLogoUrl type 2024-10-02 17:53:44 +02:00
Hazel K
705ae79eb1 Merge branch 'develop' into hazelnoot/following-timeline 2024-10-02 11:45:09 -04:00
Hazel K
ef7cde6bc6 fixes from peer review 2024-10-02 11:38:21 -04:00
Marie
321e7daab5
chore: add comments 2024-10-02 17:26:23 +02:00
Marie
1e0d372eb5
upd(backend): add support for instance oc urls 2024-10-02 17:20:30 +02:00
dakkar
0bd6d48c7e merge: Customize Sidebar/Visitor/About separately from app icon. (!632)
View MR for information: https://activitypub.software/TransFem-org/Sharkey/-/merge_requests/632

Approved-by: dakkar <dakkar@thenautilus.net>
Approved-by: Marie <github@yuugi.dev>
2024-10-02 14:55:20 +00:00
dakkar
5746675bba merge: fix mcaptcha on docker compose. (!628)
View MR for information: https://activitypub.software/TransFem-org/Sharkey/-/merge_requests/628

Approved-by: dakkar <dakkar@thenautilus.net>
Approved-by: Marie <github@yuugi.dev>
2024-10-02 14:45:07 +00:00
dakkar
bf85d22a66 merge: Enhance: Add back buttons to Antenna and List Timelines, Tag Search, and Role Detail page. (!637)
View MR for information: https://activitypub.software/TransFem-org/Sharkey/-/merge_requests/637

Approved-by: dakkar <dakkar@thenautilus.net>
Approved-by: Marie <github@yuugi.dev>
2024-10-02 14:43:37 +00:00
dakkar
7bc0d4efff merge: Respect CWs in note previews (resolves #690) (!639)
View MR for information: https://activitypub.software/TransFem-org/Sharkey/-/merge_requests/639

Closes #690

Approved-by: dakkar <dakkar@thenautilus.net>
Approved-by: Marie <github@yuugi.dev>
2024-10-02 14:43:07 +00:00
dakkar
9420bd32a0 merge: Make post form attachments accessible (!638)
View MR for information: https://activitypub.software/TransFem-org/Sharkey/-/merge_requests/638

Closes #705

Approved-by: fEmber <acomputerdog@gmail.com>
Approved-by: Marie <github@yuugi.dev>
2024-10-02 14:43:00 +00:00
Hazel K
c0583e5d5c don't leak boost / quote / reply contents when CW is in effect 2024-10-02 00:54:35 -04:00
Hazel K
19204851a0 Revert "respect CWs in note summaries"
This reverts commit cf49701c2a.
2024-10-02 00:49:26 -04:00
Hazel K
5a36c91bf1 Revert "avoid TS errors in get-note-summary"
This reverts commit 6785996960.
2024-10-02 00:49:25 -04:00
Hazel K
2cad08001a Revert "preserve non-text details in note summaries"
This reverts commit 23659ab013.
2024-10-02 00:49:25 -04:00
Hazel K
fa176ab543 Revert "expose prop to force-collapse MkNote / SkNote"
This reverts commit c5117552ca.
2024-10-02 00:48:23 -04:00
Hazel K
93a4008d42 disable the per-user feed on mobile 2024-10-02 00:45:41 -04:00
Hazel K
09b0de13bf fix comment typo 2024-10-02 00:44:26 -04:00
Hazel K
e031877a9e rename some CSS and JS names 2024-10-02 00:20:39 -04:00
Hazel K
eb2c2e261b remove extraneous "user preview" from feed entries 2024-10-02 00:15:52 -04:00
Hazel K
21277eab8f auto-select the first user in the following feed 2024-10-02 00:11:57 -04:00
Hazel K
2a11c1ecf6 emit "init" event from MkPagination 2024-10-02 00:09:32 -04:00
Hazel K
8f14fec45b fix error handling for following-feed 2024-10-02 00:09:10 -04:00
Hazel K
ce5c156e42 translate alt text for "no notes found" image 2024-10-02 00:08:52 -04:00
Hazel K
c8abbcaa33 fix link to post 2024-10-01 22:40:19 -04:00
Hazel K
779b5ef257 show two lines of text for feed entries 2024-10-01 22:27:08 -04:00
Hazel K
d2cf675569 show user info over user feed 2024-10-01 22:21:08 -04:00
Hazel K
cb10fe91bb preserve non-text details in note summaries 2024-10-01 18:28:25 -04:00
Hazel K
204e734192 include user feed 2024-10-01 18:28:04 -04:00
Hazel K
23659ab013 preserve non-text details in note summaries 2024-10-01 18:26:59 -04:00
Hazel K
94ce7272a7 avoid TS errors in get-note-summary 2024-10-01 14:47:06 -04:00
Hazel K
34aeeb0862 respect CWs in note summaries 2024-10-01 14:47:06 -04:00
Hazel K
6785996960 avoid TS errors in get-note-summary 2024-10-01 14:44:34 -04:00
Hazel K
cf49701c2a respect CWs in note summaries 2024-10-01 14:44:16 -04:00
Hazel K
ae3863bed0 use compact rendering for following feed 2024-10-01 14:37:09 -04:00
Julia Johannesen
91889dfed3
Add spacing in type signature
Again, to match the upstream PR.
2024-10-01 13:07:32 -04:00
Julia Johannesen
0aec0bb402
Fix to match upstream
Upstreams linter was mad about the attributes not being before the event
handlers, so this fixes that to match upstream when we end up merging
2024.9 (assuming it gets included in that release)
2024-10-01 10:30:02 -04:00
Julia Johannesen
7a1596cad9
Make post form attachments accessible
Adds a role="button", tabindex, and @keydown to MkPostFormAttaches in
order to make it accessible to keyboard users.
2024-10-01 10:06:40 -04:00
Hazel K
6cb4ee7879 fix page icon 2024-09-30 14:47:35 -04:00
Hazel K
e022148875 add refresh button 2024-09-30 13:56:10 -04:00
Hazel K
acc0c7867f exclude boosts from featured timeline 2024-09-30 13:29:15 -04:00
Hazel K
8d3367dee3 fix more copyright headers 2024-09-30 12:14:00 -04:00
Hazel K
168ff64b03 fix copyright header 2024-09-30 12:06:44 -04:00
Hazel K
6a42874eac add following-feed page 2024-09-30 12:06:00 -04:00
Hazel K
c5117552ca expose prop to force-collapse MkNote / SkNote 2024-09-30 12:04:44 -04:00
Hazel K
58080ad14f add locale string "mutuals" 2024-09-30 12:04:09 -04:00
Hazel K
502e642b4a update misskey-js for notes/following endpoint 2024-09-30 12:03:48 -04:00
Hazel K
04baad2f9c fix icon mappings for ti-user-check and ti-user-heart 2024-09-30 12:03:21 -04:00
Hazel K
3479c2c13a add mutuals-only option 2024-09-30 01:12:29 -04:00
Hazel K
072f4b4608 add /notes/following endpoint 2024-09-30 00:49:45 -04:00
Hazel K
ebff2eec87 track latest note for each user 2024-09-29 23:24:22 -04:00
Hazel K
7b104ffe94 fix crash during startup 2024-09-29 23:22:58 -04:00
Hazel K
01ec9635c1 remove duplicate generated columns from LatestNote 2024-09-29 22:51:24 -04:00
Hazel K
0a09e6d86a clean up copy constructor 2024-09-29 22:50:39 -04:00
Hazel K
d1b5b54bad remove extra space 2024-09-29 22:50:29 -04:00
Hazel K
06932710f0 move migration to correct folder 2024-09-29 22:39:06 -04:00
Hazel K
a3d67b58ed add copy constructor to LatestNote 2024-09-29 21:52:57 -04:00
Hazel K
80b3da531e fix name of LatestNotesRepository 2024-09-29 21:52:43 -04:00
Hazel K
f8b55d357d add latest_note table 2024-09-29 21:27:38 -04:00
piuvas
de33ade423
fix wording for the branding setting 2024-09-29 11:45:35 -03:00
piuvas
4edce0cb48
classic view 2024-09-29 09:04:21 -03:00
misskey-release-bot[bot]
5fc8b3bc50
Merge pull request #14580 from misskey-dev/develop
Release: 2024.9.0
2024-09-29 11:42:24 +00:00
github-actions[bot]
781e64aa7f Release: 2024.9.0 2024-09-29 11:42:16 +00:00
github-actions[bot]
d6e1f022d4 Bump version to 2024.9.0-beta.14 2024-09-29 11:37:44 +00:00
piuvas
08711e144b
fix iconOnly view 2024-09-29 08:29:50 -03:00
github-actions[bot]
2ea49703f6 Bump version to 2024.9.0-alpha.13 2024-09-29 09:58:32 +00:00
zyoshoka
1184436461
fix(backend): update and re-enable Bull Dashboard (#14648) 2024-09-29 18:44:55 +09:00
syuilo
0871156780
New Crowdin updates (#14629)
* New translations ja-jp.yml (English)

* New translations ja-jp.yml (Portuguese)

* New translations ja-jp.yml (Catalan)

* New translations ja-jp.yml (Italian)

* New translations ja-jp.yml (Russian)

* New translations ja-jp.yml (Chinese Traditional)

* New translations ja-jp.yml (Indonesian)

* New translations ja-jp.yml (Romanian)

* New translations ja-jp.yml (French)

* New translations ja-jp.yml (Spanish)

* New translations ja-jp.yml (Czech)

* New translations ja-jp.yml (German)

* New translations ja-jp.yml (Korean)

* New translations ja-jp.yml (Polish)

* New translations ja-jp.yml (Slovak)

* New translations ja-jp.yml (Ukrainian)

* New translations ja-jp.yml (Chinese Simplified)

* New translations ja-jp.yml (Vietnamese)

* New translations ja-jp.yml (Bengali)

* New translations ja-jp.yml (Thai)

* New translations ja-jp.yml (Uzbek)

* New translations ja-jp.yml (Japanese, Kansai)

* New translations ja-jp.yml (Korean (Gyeongsang))

* New translations ja-jp.yml (Chinese Simplified)

* New translations ja-jp.yml (Chinese Traditional)

* New translations ja-jp.yml (Chinese Simplified)

* New translations ja-jp.yml (Chinese Traditional)

* New translations ja-jp.yml (Chinese Simplified)

* New translations ja-jp.yml (Italian)

* New translations ja-jp.yml (Italian)

* New translations ja-jp.yml (Chinese Traditional)

* New translations ja-jp.yml (Korean)

* New translations ja-jp.yml (Chinese Traditional)

* New translations ja-jp.yml (Chinese Traditional)
2024-09-29 18:24:58 +09:00
かっこかり
088707c114
enhance(frontend): cwでも絵文字メニューを開けるように (#14647)
* fix(frontend): cwでも絵文字メニューを開けるように

* Update Changelog
2024-09-29 18:24:34 +09:00
syuilo
15f2e1425c tweak MkCondensedLine
#14642
2024-09-29 17:30:16 +09:00
github-actions[bot]
57effa9ef0 Bump version to 2024.9.0-alpha.12 2024-09-28 09:19:30 +00:00
syuilo
f0d0cd2e50
wip (#14643) 2024-09-28 18:15:32 +09:00
syuilo
c3b0e1a2bd Merge branch 'develop' of https://github.com/misskey-dev/misskey into develop 2024-09-28 16:45:59 +09:00
syuilo
afbba1ff1c Update WebhookTestService.ts 2024-09-28 16:45:57 +09:00
syuilo
6964b919f8
Update ja-JP.yml 2024-09-28 14:42:07 +09:00
syuilo
e5856c6b3b 🎨 2024-09-28 14:02:48 +09:00
syuilo
3f3c59e1ae 🎨 2024-09-28 13:45:53 +09:00
syuilo
f49d7927aa 🎨 2024-09-28 13:41:31 +09:00
丈槍由紀
025b2467b2 Add back button to the Roles page. 2024-09-27 23:00:08 -04:00
丈槍由紀
d9ba0f9f0d Add back button to antenna, list, and tag timelines. 2024-09-27 23:00:02 -04:00
syuilo
9e9198086d enhance(backend): add user.score for moderation purpose 2024-09-28 11:54:40 +09:00
github-actions[bot]
ca022b9349 Bump version to 2024.9.0-alpha.11 2024-09-28 01:22:47 +00:00
FineArchs
25670b5f16
Mk:C:containerのborderStyleとborderRadiusを設定できるように (#14638)
* borderStyle and borderRadius

* changelog
2024-09-28 10:06:01 +09:00
syuilo
6fdb2b13f4 update deps 2024-09-28 10:04:16 +09:00
syuilo
28e9d4e483
feat: フォローされた際のメッセージを設定できるようにする (#14430)
* feat: フォローされた際のメッセージを設定できるようにする

Resolve #14425

* Update CHANGELOG.md

* 既にフォローしているユーザーのメッセージも見れるように

* Update packages/frontend/src/components/MkNotification.vue

Co-authored-by: かっこかり <67428053+kakkokari-gtyih@users.noreply.github.com>

* fix indent

* Update users.ts

* wip

* Update users.ts

---------

Co-authored-by: かっこかり <67428053+kakkokari-gtyih@users.noreply.github.com>
2024-09-28 09:55:21 +09:00
syuilo
e4d4cc5277 🎨 2024-09-28 09:52:40 +09:00
FineArchs
27a256b502
show shown (#14639) 2024-09-28 08:12:12 +09:00
Yuri Lee
b83a2f33ff
test(backend): Add test for Passkey API (#14635) 2024-09-28 08:09:30 +09:00
かっこかり
d8a2eeb7ed
feat: エクスポート完了時に通知を発行するように (#14484)
* feat: エクスポート完了時に通知を発行するように

* Update Changelog

* entitity -> entity

* fix: ペイロードを含むように

* fix icon

* exportableEntities -> userExportableEntities
2024-09-26 14:15:03 +09:00
syuilo
89841e4c9a enhance(frontend): 絵文字ピッカーをドロワー表示するか自由に設定可能に 2024-09-26 12:41:48 +09:00
syuilo
31988db547 🎨 2024-09-26 11:35:40 +09:00
KOBA789
7134d24c1f
perf(backend): Defer instance metadata update (#14558)
* Defer instance metadata update

* Fix last new line

* Fix typo

* Add license notice

* Fix syntax

* Perform deferred jobs on shutdown

* Fix missing async/await

* Fix typo :)

* Update collapsed-queue.ts

---------

Co-authored-by: syuilo <4439005+syuilo@users.noreply.github.com>
2024-09-26 10:25:20 +09:00
syuilo
4c76ea1fa6 Update CHANGELOG.md 2024-09-26 08:26:13 +09:00
Yuri Lee
d8dd1683c9
Add Sign in with passkey Button (#14577)
* Sign in with passkey (PoC)

* 💄 Added "Login with Passkey" Button

* refactor: Improve error response when WebAuthn challenge fails

* signinResponse should be placed under the SigninWithPasskeyResponse object.

* Frontend fix

* Fix: Rate limiting key for passkey signin

Use specific rate limiting key: 'signin-with-passkey'  for passkey sign-in API to avoid collisions with signin rate-limit.

* Refactor: enhance Passkey sign-in flow and error handling

- Increased the rate limit for Passkey sign-in attempts to accommodate the two API calls needed per sign-in.
- Improved error messages and handling in both the `WebAuthnService` and the `SigninWithPasskeyApiService`, providing more context and better usability.
- Updated error messages to provide more specific and helpful details to the user.

These changes aim to enhance the Passkey sign-in experience by providing more robust error handling, improving security by limiting API calls, and delivering a more user-friendly interface.

* Refactor: Streamline 2FA flow and remove redundant Passkey button.

- Separate the flow of 1FA and 2FA.
- Remove duplicate passkey buttons

* Fix: Add error messages to MkSignin

* chore: Hide passkey button if the entered user does not use passkey login

* Update CHANGELOG.md

* Refactor: Rename functions and Add comments

* Update locales/ja-JP.yml

Co-authored-by: syuilo <4439005+syuilo@users.noreply.github.com>

* Fix: Update translation

- update index.d.ts
- update ko-KR.yml, en-US.yml
- Fix: Reflect Changed i18n key on MkSignin

---------

Co-authored-by: Squarecat-meow <kw7551@gmail.com>
Co-authored-by: syuilo <4439005+syuilo@users.noreply.github.com>
2024-09-26 08:25:33 +09:00
syuilo
fde94f638b Update about-misskey.vue 2024-09-26 08:18:23 +09:00
かっこかり
aee984813d
fix(backend): embedの動作に必要な値を復活させる (#14633) 2024-09-25 19:27:50 +09:00
zyoshoka
f2385a8ffc
fix(misskey-js): correct noteUpdated event type (#14632) 2024-09-25 17:35:54 +09:00
かっこかり
0f8b15f0fe
fix(frontend-embed): fix instanceticker, remove directives (#14631) 2024-09-25 16:28:32 +09:00
かっこかり
8c3be57ab3
fix(frontend-embed): URLエンコードされた文字列が正常に読み込めない問題を修正 (#14630)
* fix(frontend-embed): URLエンコードされた文字列が正常に読み込めない問題を修正

* fix(frontend-embed): bring back missing bits
2024-09-25 16:12:34 +09:00
syuilo
5c62cbcca8 tweak style 2024-09-25 16:07:23 +09:00
syuilo
5c94b4cb49 🎨 2024-09-25 13:02:31 +09:00
かっこかり
244bcafc5d
fix(docs): RBTの表記ゆれを訂正 (#14628)
* fix(docs): RBTの表記ゆれを訂正

* add changelog for #14600

* fix
2024-09-25 12:56:53 +09:00
github-actions[bot]
8890a7a0b7 Bump version to 2024.9.0-alpha.10 2024-09-25 03:43:12 +00:00
syuilo
4b3ecd49de
New Crowdin updates (#14434)
* New translations ja-jp.yml (Korean)

* New translations ja-jp.yml (Korean)

* New translations ja-jp.yml (Korean (Gyeongsang))

* New translations ja-jp.yml (Korean (Gyeongsang))

* New translations ja-jp.yml (Korean)

* New translations ja-jp.yml (Korean)

* New translations ja-jp.yml (Chinese Simplified)

* New translations ja-jp.yml (Portuguese)

* New translations ja-jp.yml (Spanish)

* New translations ja-jp.yml (Spanish)

* New translations ja-jp.yml (English)

* New translations ja-jp.yml (Indonesian)

* New translations ja-jp.yml (Portuguese)

* New translations ja-jp.yml (Portuguese)

* New translations ja-jp.yml (Portuguese)

* New translations ja-jp.yml (Chinese Traditional)

* New translations ja-jp.yml (Portuguese)

* New translations ja-jp.yml (Russian)

* New translations ja-jp.yml (Russian)

* New translations ja-jp.yml (Portuguese)

* New translations ja-jp.yml (Catalan)

* New translations ja-jp.yml (Catalan)

* New translations ja-jp.yml (Russian)

* New translations ja-jp.yml (English)

* New translations ja-jp.yml (Russian)

* New translations ja-jp.yml (Russian)

* New translations ja-jp.yml (English)

* New translations ja-jp.yml (Russian)

* New translations ja-jp.yml (Russian)

* New translations ja-jp.yml (Russian)

* New translations ja-jp.yml (Russian)

* New translations ja-jp.yml (Russian)

* New translations ja-jp.yml (Russian)

* New translations ja-jp.yml (Italian)

* New translations ja-jp.yml (Russian)

* New translations ja-jp.yml (Italian)

* New translations ja-jp.yml (Italian)

* New translations ja-jp.yml (Russian)

* New translations ja-jp.yml (Russian)

* New translations ja-jp.yml (Portuguese)

* New translations ja-jp.yml (Chinese Simplified)

* New translations ja-jp.yml (Chinese Traditional)

* New translations ja-jp.yml (Italian)

* New translations ja-jp.yml (Chinese Traditional)

* New translations ja-jp.yml (Chinese Traditional)

* New translations ja-jp.yml (Catalan)

* New translations ja-jp.yml (Korean)

* New translations ja-jp.yml (Korean)

* New translations ja-jp.yml (English)

* New translations ja-jp.yml (Catalan)

* New translations ja-jp.yml (Catalan)

* New translations ja-jp.yml (Catalan)

* New translations ja-jp.yml (Catalan)

* New translations ja-jp.yml (Catalan)

* New translations ja-jp.yml (Chinese Simplified)

* New translations ja-jp.yml (Chinese Simplified)

* New translations ja-jp.yml (Portuguese)

* New translations ja-jp.yml (Catalan)

* New translations ja-jp.yml (Catalan)

* New translations ja-jp.yml (Catalan)

* New translations ja-jp.yml (English)

* New translations ja-jp.yml (Chinese Traditional)

* New translations ja-jp.yml (Chinese Traditional)

* New translations ja-jp.yml (Korean)

* New translations ja-jp.yml (Chinese Simplified)

* New translations ja-jp.yml (Italian)

* New translations ja-jp.yml (Korean)

* New translations ja-jp.yml (Chinese Traditional)

* New translations ja-jp.yml (Catalan)

* New translations ja-jp.yml (Korean)

* New translations ja-jp.yml (Chinese Simplified)

* New translations ja-jp.yml (Catalan)

* New translations ja-jp.yml (Chinese Traditional)

* New translations ja-jp.yml (Korean)

* New translations ja-jp.yml (Chinese Simplified)

* New translations ja-jp.yml (Russian)

* New translations ja-jp.yml (Italian)

* New translations ja-jp.yml (Korean)

* New translations ja-jp.yml (Russian)

* New translations ja-jp.yml (Chinese Traditional)

* New translations ja-jp.yml (Korean)
2024-09-25 12:32:12 +09:00
かっこかり
dd124a8aed
Fix: <link rel="alternate">を追って照会するのはOKレスポンスが返却された場合のみに (#14627)
* Only accept HTML `<link rel="alternate">` on success

(cherry picked from commit 6ea48be84a)

* Use `res.ok` instead of 200-299

(cherry picked from commit b667a68bd4)

* jsdomに戻す

* Update Changelog

* Revert "jsdomに戻す"

This reverts commit c03603611b74d16df52e77e44c558e958a82f3f4.

* 🎨

---------

Co-authored-by: Julia Johannesen <julia@insertdomain.name>
2024-09-25 12:31:37 +09:00
syuilo
53682f5cc6 🎨 2024-09-25 12:31:04 +09:00
syuilo
c88957c037 🎨 2024-09-25 09:39:12 +09:00
syuilo
9d3a331286 🎨 2024-09-25 07:55:24 +09:00
syuilo
1679a40c76 🎨 2024-09-24 21:02:22 +09:00
かっこかり
c9819babfe
fix(frontend-embed): #14613 で抜け落ちた処理を戻す (#14623) 2024-09-24 19:27:20 +09:00
github-actions[bot]
7045547e46 Bump version to 2024.9.0-alpha.9 2024-09-24 09:32:19 +00:00
かっこかり
6a1a2bef43
fix(backend): RBTの修正 (#14621)
* fix(backend): 絵文字の変換処理が不十分なのを修正

* enhance: リアクションバッファリングが無効になったら即bakeするように

* attempt to fix test

* fix
2024-09-24 18:29:02 +09:00
syuilo
1d8bfe4f1c 🎨 2024-09-24 18:24:28 +09:00
syuilo
ca967e83bd 🎨 2024-09-24 17:52:14 +09:00
syuilo
423bfc8798 🎨 2024-09-24 17:48:49 +09:00
syuilo
6ee55e1ab3 Update CONTRIBUTING.md 2024-09-24 17:41:56 +09:00
syuilo
9612195fc3 enhance(frontend): tweak control panel 2024-09-24 15:54:47 +09:00
syuilo
4be307f223 refactor 2024-09-24 13:55:35 +09:00
github-actions[bot]
1b2b95e199 Bump version to 2024.9.0-alpha.8 2024-09-24 01:22:57 +00:00
FineArchs
aef15069a2
Playの編集画面の保存ボタン等をstickyにする など (#14429)
* flash: sticky buttons

* sticky save buttons

* fix

* add spacer

* fix design

* Update CHANGELOG.md

* revert experimental background

* add background

* Update CHANGELOG.md

---------

Co-authored-by: かっこかり <67428053+kakkokari-gtyih@users.noreply.github.com>
2024-09-24 10:12:58 +09:00
かっこかり
3674e9b1cb
feat: adminのファイル一覧画面で、ファイルが添付されているノートを一覧できるように (#14403)
* enhance(moderation): モデレーターがファイルが添付されているノートを照会できるように (MisskeyIO#680)

Co-authored-by: riku6460 <17585784+riku6460@users.noreply.github.com>
Co-authored-by: nenohi <kimutipartylove@gmail.com>
Co-authored-by: まっちゃとーにゅ <17376330+u1-liquid@users.noreply.github.com>
(cherry picked from commit b059162324d2cfc697d1af9f3b6fb49fad2734e0)

* Update Changelog

* ✌️

Co-authored-by: riku6460 <17585784+riku6460@users.noreply.github.com>
Co-authored-by: nenohi <kimutipartylove@gmail.com>
Co-authored-by: まっちゃとーにゅ <17376330+u1-liquid@users.noreply.github.com>

---------

Co-authored-by: Yuuki <yukikum57@gmail.com>
Co-authored-by: riku6460 <17585784+riku6460@users.noreply.github.com>
Co-authored-by: nenohi <kimutipartylove@gmail.com>
Co-authored-by: まっちゃとーにゅ <17376330+u1-liquid@users.noreply.github.com>
2024-09-24 10:11:09 +09:00
おさむのひと
98de7ca526
fix(frontend): 連合一覧等のページネーションが壊れていたのを修正 (#14439)
* fix

* fix

* fix CHANGELOG.md

* 開発環境以外でログが出ないように

---------

Co-authored-by: kakkokari-gtyih <67428053+kakkokari-gtyih@users.noreply.github.com>
2024-09-24 10:09:55 +09:00
Kisaragi
23a07c2706
ci: fix syntax error (#14602) 2024-09-24 09:50:18 +09:00
Aleteoryx
689848943b
Fix: Continue importing from file if single emoji import fails (#14461)
* Fix: Continue importing from file if single emoji import fails

* Fix indentation

---------

Co-authored-by: かっこかり <67428053+kakkokari-gtyih@users.noreply.github.com>
Co-authored-by: syuilo <4439005+syuilo@users.noreply.github.com>
2024-09-24 09:50:00 +09:00
zyoshoka
a37df2cd8e
fix(frontend): weird AP delivered chart in control panel (#14481)
* fix(frontend): `Out: Fail` was negative number

* fix(frontend): don't stack AP delivered chart

* test(#10336): add `pages/admin/overview.ap-requests.vue` story

* Update CHANGELOG.md

---------

Co-authored-by: syuilo <4439005+syuilo@users.noreply.github.com>
2024-09-24 09:47:31 +09:00
piuvas silly
41edc4cfbd Update 4 files
- /packages/frontend/src/pages/admin/branding.vue
- /packages/backend/src/models/Meta.ts
- /packages/backend/src/server/api/endpoints/admin/meta.ts
- /packages/backend/src/server/api/endpoints/admin/update-meta.ts
2024-09-23 16:34:29 +00:00
piuvas silly
3ebef6ac47 Update navbar-for-mobile.vue 2024-09-23 16:26:33 +00:00
piuvas silly
15167d98c5 Update navbar.vue 2024-09-23 16:25:34 +00:00
piuvas silly
a220d327cd Update navbar-for-mobile.vue 2024-09-23 16:24:57 +00:00
piuvas silly
6c916af4ee Update InstanceEntityService.ts 2024-09-23 16:23:57 +00:00
github-actions[bot]
6378dfbffc Bump version to 2024.9.0-alpha.7 2024-09-23 13:00:04 +00:00
かっこかり
cd247b99ee
fix(frontend): MkRangeのタッチ操作時にtooltipが複数重なって表示されないように (#14548)
* fix: directiveでのtooltip表示との競合を解消 (#265)

(cherry picked from commit 6d15d379a76b1b153ec2996e22bf0fc29ced5fda)

* code style

* Update Changelog

* record origin

* fix: ホバー時にもツールチップが出るように

---------

Co-authored-by: CaffeinePower <86540016+cffnpwr@users.noreply.github.com>
Co-authored-by: syuilo <4439005+syuilo@users.noreply.github.com>
2024-09-23 21:53:51 +09:00
かっこかり
0c6d1ec524
refactor(frontend): popupMenuの項目作成時に三項演算子をなるべく使わないように (#14554)
* refactor(frontend): popupMenuの項目作成時に三項演算子をなるべく使わないように

* type import

* fix

* lint
2024-09-23 21:50:30 +09:00
かっこかり
e673c143a9
fix(backend): happy-domを使用後にcloseするように (#14615)
* Add `DetachedWindowAPI.close` calls to `MfmService`

(cherry picked from commit ceaec33249)

* fix

* update changelog

* fix

---------

Co-authored-by: Julia Johannesen <julia@insertdomain.name>
2024-09-23 21:43:48 +09:00
かっこかり
7f7445ad7a
refactor(misskey-games): Misskey Games系パッケージのlint修正+Lint CI整備 (#14612)
* chore(lint): Fix linting in misskey-reversi

(cherry picked from commit 894934a1a7743472b2d051e2690007ae373efd76)

* chore(lint): Fix linting in misskey-bubble-game

(cherry picked from commit 1ba9c37a8d5e4ae6a98494026b87f6f6439790c7)

* enhance(gh): add lint ci for misskey games packages

* enhance(gh): fix lint ci

* fix

* revert some changes that nothing to do with lint rules

* fix

* lint fixes

* refactor: strict type def

* lint fixes

* 🎨

* 🎨

---------

Co-authored-by: 4censord <mail@4censord.de>
2024-09-23 21:25:23 +09:00
github-actions[bot]
733fd56058 Bump version to 2024.9.0-alpha.6 2024-09-23 10:53:19 +00:00
syuilo
3f0aaaa41e
perf(embed): improve embed performance (#14613)
* wip

* wip

* wip

* refactor

* refactor

---------

Co-authored-by: かっこかり <67428053+kakkokari-gtyih@users.noreply.github.com>
2024-09-23 19:49:52 +09:00
syuilo
2aebdb8cc5 enhance(frontend): tweak control panel 2024-09-23 17:18:37 +09:00
syuilo
cd52dc73bb 🎨 2024-09-23 14:51:34 +09:00
syuilo
1ba09e1eee enhance(frontend): improve forms usability 2024-09-23 14:42:38 +09:00
zyoshoka
2c615357f2
fix(misskey-js): wrong hashtag channel param type (#14611) 2024-09-23 09:53:50 +09:00
piuvas
4ac8e1bd52
improve jp 2024-09-22 17:36:56 -03:00
piuvas
4ee2973303
requested fixes! 2024-09-22 17:32:46 -03:00
piuvas silly
0f2e30f5ba Merge branch Sharkey:develop into sidebarswag 2024-09-22 18:37:49 +00:00
piuvas
73c0b11d1c
fix icon-only sidebar bug. 2024-09-22 15:36:10 -03:00
piuvas
d839c1eee1
sidebarlogo localization 2024-09-22 15:28:10 -03:00
piuvas
5eedbe153e
sidebarlogo migration 2024-09-22 15:10:12 -03:00
piuvas
34392ff11a
fix formatting 2024-09-22 14:50:35 -03:00
piuvas
ec5b3c8788
frontend changes 2024-09-22 14:47:04 -03:00
piuvas
1af6f8c5da
backend configuring 2024-09-22 14:47:04 -03:00
Esurio
7aa956aca9
fix: use i18n in settings 2024-09-22 14:47:04 -03:00
cuteBoiButt
e8cdec2278
We don't need the whole Logger class here 2024-09-22 14:46:51 -03:00
cuteBoiButt
b4bd9508ee
Use proper logging facilities in WebfingerService 2024-09-22 14:46:50 -03:00
Marie
1a6c4e3714
upd: remove duplication 2024-09-22 19:13:50 +02:00
github-actions[bot]
76b9bc478a Bump version to 2024.9.0-alpha.5 2024-09-22 11:49:02 +00:00
syuilo
f93a575c3a 🎨 2024-09-22 20:44:24 +09:00
syuilo
e6e4182b53 enhance(frontend): tweak control panel 2024-09-22 20:23:20 +09:00
syuilo
736d8283c1 refactor 2024-09-22 20:21:06 +09:00
syuilo
0041ad3e69 enhance(frontend): tweak control panel 2024-09-22 20:14:19 +09:00
syuilo
973d8366c3 🎨 2024-09-22 20:14:09 +09:00
syuilo
2762e29f7f 🎨 2024-09-22 20:02:47 +09:00
かっこかり
0bbeb40c0a
fix typo (#14609) 2024-09-22 19:30:36 +09:00
かっこかり
e87cbd2a36
fix(frontend): lint fixe for tweak control panel (#14610) 2024-09-22 19:13:30 +09:00
github-actions[bot]
1d5a3023f4 Bump version to 2024.9.0-alpha.4 2024-09-22 09:44:00 +00:00
syuilo
bd5f25c678 fix rbt bug? 2024-09-22 18:40:05 +09:00
syuilo
6ba97a7763 enhance(frontend): tweak control panel 2024-09-22 18:35:10 +09:00
syuilo
d435d04eaf enhance(frontend): tweak control panel 2024-09-22 18:26:21 +09:00
かっこかり
01ec708020
ffix(frontend): lint fixes for tweak control panel (#14607) 2024-09-22 17:50:54 +09:00
syuilo
0e92cbf905 enhance(frontend): tweak control panel 2024-09-22 16:24:53 +09:00
syuilo
8ad9f7209b enhance(frontend): tweak control panel 2024-09-22 16:16:50 +09:00
syuilo
3df1bb2d71 enhance(frontend): tweak control panel 2024-09-22 16:01:13 +09:00
github-actions[bot]
891bbcf475 Bump version to 2024.9.0-alpha.3 2024-09-22 03:56:51 +00:00
syuilo
023fa30280
refactor/perf(backend): provide metadata statically (#14601)
* wip

* Update ReactionService.ts

* Update ApiCallService.ts

* Update timeline.ts

* Update GlobalModule.ts

* Update GlobalModule.ts

* Update NoteEntityService.ts

* wip

* wip

* wip

* Update ApPersonService.ts

* wip

* Update GlobalModule.ts

* Update mock-resolver.ts

* Update RoleService.ts

* Update activitypub.ts

* Update activitypub.ts

* Update activitypub.ts

* Update activitypub.ts

* Update activitypub.ts

* clean up

* Update utils.ts

* Update UtilityService.ts

* Revert "Update utils.ts"

This reverts commit a27d4be764b78c1b5a9eac685e261fee49331d89.

* Revert "Update UtilityService.ts"

This reverts commit e5fd9e004c482cf099252201c0c1aa888e001430.

* vuwa-

* Revert "vuwa-"

This reverts commit 0c3bd12472b4b9938cdff2d6f131e6800bc3724c.

* Update entry.ts

* Update entry.ts

* Update entry.ts

* Update entry.ts

* Update jest.setup.ts
2024-09-22 12:53:13 +09:00
syuilo
3ad5c753fa 🎨 2024-09-22 12:44:09 +09:00
syuilo
76408667f3
update deps (#14594)
* wip

* Update ClientServerService.ts

* eslint

* Update fetch-resource.ts

* wip
2024-09-22 12:32:01 +09:00
woxtu
9ac4d3da0a
Check SPDX information properly (#14604) 2024-09-22 07:43:56 +09:00
Marie
730bdab5fa upd: add onCancel to esc 2024-09-21 18:04:31 +00:00
dakkar
d3710f0872 maybe fix #510 - try to not edit visibility
the frontend part is pretty straightforward, the backend part is ugly
but it shouldn't make things worse than they already are
2024-09-21 18:24:57 +01:00
dakkar
2017b763f2 fix #332 - classic view navbar now respects "side (icon only)"
* removed `menuDisplay` computed variable
* directly access `defaultStore` in `calcViewState`
* actually call `calcViewState` at setup!

all three these changes were copied from `universal.vue`, the default
view.
2024-09-21 17:10:05 +01:00
dakkar
1b58326dd6 alert when searching notes from widget, and search is disabled 2024-09-21 16:29:23 +01:00
github-actions[bot]
67a5119072 Bump version to 2024.9.0-alpha.2 2024-09-21 11:17:18 +00:00
syuilo
00ccc2251a Merge branch 'develop' of https://github.com/misskey-dev/misskey into develop 2024-09-21 19:44:17 +09:00
syuilo
3d92ef193e fix rbt 2024-09-21 19:44:14 +09:00
syuilo
e9085e455f 🎨 2024-09-21 19:41:55 +09:00
かっこかり
85f46f88c6
fix(backend): Retry-Afterヘッダーが実際には送信されなかった問題を修正 (#14597)
* move rate-limit-exceeded error reporting, earlier

a rate-limit-exceeded error has `kind:'client'`, so the branch that
adds the `Retry-After` would never get taken

(cherry picked from commit 8a982c61c0)

* Update Changelog

* fix

* indent

---------

Co-authored-by: dakkar <dakkar@thenautilus.net>
2024-09-21 18:20:45 +09:00
Kisaragi
9cd784cdee
ci: api.jsonの差分がない時は折りたたみを生成しないようにする (#14598) 2024-09-21 18:19:09 +09:00
Esurio/1673beta
d4d15f338e
fix: EmailServiceでインラインスタイルを適用するように (#14600)
Co-authored-by: Esurio <esurio@esurio1673.net>
2024-09-21 18:18:52 +09:00
piuvas silly
dc806e0605 Update compose_example.yml 2024-09-21 00:27:34 +00:00
piuvas silly
1f7044c752 fix mcaptcha. 2024-09-21 00:09:33 +00:00
github-actions[bot]
d3f1b0f090 Bump version to 2024.9.0-alpha.1 2024-09-20 12:37:51 +00:00
dependabot[bot]
2ee19ee22e
chore(deps-dev): bump vite in /scripts/changelog-checker (#14569)
Bumps [vite](https://github.com/vitejs/vite/tree/HEAD/packages/vite) from 5.0.12 to 5.4.6.
- [Release notes](https://github.com/vitejs/vite/releases)
- [Changelog](https://github.com/vitejs/vite/blob/v5.4.6/packages/vite/CHANGELOG.md)
- [Commits](https://github.com/vitejs/vite/commits/v5.4.6/packages/vite)

---
updated-dependencies:
- dependency-name: vite
  dependency-type: direct:development
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-09-20 21:10:21 +09:00
dependabot[bot]
a18a6ac264
chore(deps): bump actions/setup-node from 4.0.3 to 4.0.4 (#14590)
Bumps [actions/setup-node](https://github.com/actions/setup-node) from 4.0.3 to 4.0.4.
- [Release notes](https://github.com/actions/setup-node/releases)
- [Commits](https://github.com/actions/setup-node/compare/v4.0.3...v4.0.4)

---
updated-dependencies:
- dependency-name: actions/setup-node
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-09-20 21:05:35 +09:00
かっこかり
7e9d54fa3a
fix(frontend): ファイルの詳細ページのファイルの説明で改行が正しく表示されない問題を修正 (#14588)
* upd: don't ignore new lines on file info

* Update Changelog

* ✌️

---------

Co-authored-by: Marie <github@yuugi.dev>
2024-09-20 21:05:20 +09:00
かっこかり
f0834ca14c
enhance: ユーザーコンテンツのインポート操作の実行可否をロールで制御できるように (#14583)
* enhance: インポート操作の実行可否をロールで制御できるように

* Update Changelog
2024-09-20 21:04:58 +09:00
syuilo
0b062f1407
Misskey® Reactions Buffering Technology™ (#14579)
* wip

* wip

* Update ReactionsBufferingService.ts

* Update ReactionsBufferingService.ts

* wip

* wip

* wip

* Update ReactionsBufferingService.ts

* wip

* wip

* wip

* Update NoteEntityService.ts

* wip

* wip

* wip

* wip

* Update CHANGELOG.md
2024-09-20 21:03:53 +09:00
かっこかり
f585f70dcb
Update CHANGELOG.md (埋め込み機能のドキュメントへのリンク) 2024-09-20 14:36:36 +09:00
かっこかり
8d23122fd6
fix(frontend): run pnpm build-assets (#14585) 2024-09-20 00:08:14 +09:00
github-actions[bot]
2d0e9e0544 Bump version to 2024.9.0-alpha.0 2024-09-19 11:55:43 +00:00
かっこかり
f5563c8304
Update CHANGELOG.md (書き方を揃える) 2024-09-19 17:30:13 +09:00
おさむのひと
4ac8aad50a
feat: UserWebhook/SystemWebhookのテスト送信機能を追加 (#14489)
* feat: UserWebhook/SystemWebhookのテスト送信機能を追加

* fix CHANGELOG.md

* 一部設定をパラメータから上書き出来るように修正

* remove async

* regenerate autogen
2024-09-19 17:20:50 +09:00
かっこかり
ceb4640669
fix(frontend): viteの一時ファイルがgitの変更に含まれないように (#14571) 2024-09-18 19:23:05 +09:00
かっこかり
3bf63dd9c5
fix(frontend): 設定変更時のリロード確認ダイアログが複数個表示されることがある問題を修正 (#14543)
* fix(frontend): reloadAskが同時に複数実行されないように

* Update Changelog

* fix

* フラグ解除が確実に行われるように

* reloadAskを汎用化、理由を受け取るように

* fix
2024-09-17 22:18:06 +09:00
かっこかり
ce95323e49
fix(antenna): src=list && userListId=null の場合クエリータイムアウトが発生する問題を修正 (MisskeyIO#721) (#14568)
(cherry picked from commit 47b6b97c9c6d9583dd1b11acbf8f94059e81ebaf)

Co-authored-by: まっちゃとーにゅ <17376330+u1-liquid@users.noreply.github.com>
2024-09-17 22:02:34 +09:00
FineArchs
daf9ae5d4a
ScratchpadにUIインスペクターを追加 (#14565)
* add ui list

* Update scratchpad.vue

* experiment

* design change

* redesign

* redesign

* Update ja-JP.yml

* redesign

* component properties

* whole json

* use textarea

* fix import

* stringify function

* Update CHANGELOG.md

* UI Component Monitor -> UI Inspector

* uiInspectorOpenedFlags -> uiInspectorOpenedComponents

Co-authored-by: syuilo <4439005+syuilo@users.noreply.github.com>

* fix

* change key i -> c.value.id

---------

Co-authored-by: syuilo <4439005+syuilo@users.noreply.github.com>
2024-09-17 20:11:50 +09:00
syuilo
a5e61b8c19 Revert "refactor"
This reverts commit 0134e6e420.
2024-09-17 17:05:52 +09:00
syuilo
cacdf9d939 refactor
MkMisskeyFlavoredMarkdown -> MkMfm
2024-09-17 17:03:09 +09:00
syuilo
0134e6e420 refactor 2024-09-17 17:00:48 +09:00
かっこかり
6bd6af440f
fix(frontend): 絵文字関連のスタイルが崩れているのを修正 (#14559)
* fix(frontend): 絵文字関連のスタイルが崩れていたのを修正 (MisskeyIO#725)

(cherry picked from commit 00fd684a7b382aaeb3355a1c80dc24078a5caa61)

* Update Changelog

* ✌️

---------

Co-authored-by: Yuuki <yukikum57@gmail.com>
2024-09-17 15:41:52 +09:00
Marie
c5c3c26271
chore: vue lint 2024-09-16 02:11:41 +02:00
Marie
7d449b9009
chore: add spacing between { and } 2024-09-16 01:17:12 +02:00
Marie
696c76768d
chore: lint 2024-09-16 01:14:31 +02:00
Marie
d2564836ed
upd: prompt for confirmation on external links 2024-09-16 01:12:20 +02:00
Marie
e21e2530e6
fix: don't show quoted toast on cancel of quote note 2024-09-16 00:35:26 +02:00
Marie
bde6bb0bd2
upd: don't ignore new lines on file info 2024-09-16 00:15:06 +02:00
Marie
67257ee5c6
upd: fix audio showing multiple warnings 2024-09-16 00:08:15 +02:00
Marie
9b7301fb2e
upd: Prompt for confirmation when Plugin:open_url is used 2024-09-15 23:54:31 +02:00
かっこかり
7d7a12d7d6
fix(deps): broken lockfile (#14556) 2024-09-15 21:57:22 +09:00
dependabot[bot]
887c709647
chore(deps): bump body-parser from 1.20.2 to 1.20.3 in /packages/backend (#14550)
Bumps [body-parser](https://github.com/expressjs/body-parser) from 1.20.2 to 1.20.3.
- [Release notes](https://github.com/expressjs/body-parser/releases)
- [Changelog](https://github.com/expressjs/body-parser/blob/master/HISTORY.md)
- [Commits](https://github.com/expressjs/body-parser/compare/1.20.2...1.20.3)

---
updated-dependencies:
- dependency-name: body-parser
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-09-15 20:54:26 +09:00
かっこかり
0e4b6d1dad
enhance(frontend): adminのファイルリストでセンシティブファイルに枠線を追加 (#14510)
* enhance(frontend): adminのファイルリストでセンシティブファイルに枠線を追加

* Update Changelog
2024-09-15 17:50:25 +09:00
Juan Aguilar Santillana
07f26bc8dd
refactor(backend): use Reflet for autobind deco (#14482)
Using Reflect.defineProperty instead of Object.defineProperty
gives a more consistent behavior with the rest of the modern
JavaScript features.
2024-09-15 17:43:24 +09:00
syuilo
366b79e459
Update CHANGELOG.md 2024-09-15 15:14:13 +09:00
Kisaragi
6b2072f4b1
fix(backend/antenna): キーワードが与えられなかった場合のエラーをApiErrorとして投げる (#14491)
* fix(backend/antenna): report validation failure as ApiError on update

* test(backend/antenna): reflect change in previous commit

* fix(backend/antenna): report validation failure as ApiError on create

* test(backend/antenna): reflect change in previous commit

* test(backend/antenna): semi

* test(backend/antenna): bring being spread parameters first in object literal

* chore: add CHANGELOG entry

---------

Co-authored-by: syuilo <4439005+syuilo@users.noreply.github.com>
2024-09-15 15:13:46 +09:00
かっこかり
1544ba9153
refactor(frontend): 非推奨の表現を改める (#14517) 2024-09-15 12:31:17 +09:00
かっこかり
be0906a6c7
fix(backend): happy-domで外部HTMLをパースする際に関連リソースが読み込まれる問題を修正 (#14521)
* bump happy-dom, disable all JS&c when parsing

version 10 didn't quite support disabling all of that

I have tested that `MfmService` (the other code that uses `happy-dom`)
still works fine: the RSS feed for a user is generated correctly, with
HTML rendered from MFM

(cherry picked from commit 26e0412fbb)

* Update Changelog

* lint

* fix possible memory leak

---------

Co-authored-by: dakkar <dakkar@thenautilus.net>
2024-09-15 12:30:27 +09:00
かっこかり
e0f54d6a68
fix(frontend): MkDateSeparatedListで月の違う同じ日はセパレータが出ないのを修正 (#14545)
* fix(frontend): MkDateSeparatedListで月の違う同じ日はセパレータが出ないのを修正

* Update Changelog
2024-09-15 12:20:29 +09:00
dakkar
8822f7efda fix Japanese "memo"→"note" 2024-09-14 11:52:45 +01:00
dakkar
a36a504a60 fix Japanese spelling of "bubble"
thanks to @esurio
2024-09-14 11:01:59 +01:00
かっこかり
837a8e15d8
refactor(frontend): frontend-embed/src/to-be-sharedを共通化 (#14536)
* refactor(frontend): shouldCollapsedを共通化

* refactor(frontend): config.js, worker-multi-dispatch.js, intl-const.jsを共通化

* fix(frontend-shared): fix type error

* refactor(frontend): is-link.jsと、同一の振る舞いをする記述を共通化

* fix

* fix lint

* lint fixes
2024-09-10 18:39:53 +09:00
KanariKanaru
0c2cfe31a3
Dev: cypressをdev containerで実行可に(e2e-dev-container) (#14526) 2024-09-10 16:33:14 +09:00
かっこかり
05c944c2cc
Update CHANGELOG.md (書き方を揃える) 2024-09-10 16:25:36 +09:00
かっこかり
f393b6b898
fix(frontend/frontend-embed): インポートパス・テーマまわりなどの修正 (#14535)
* fix(frontend/frontend-embed): wrong imports

* enhance(frontend-embed): サーバーデフォルトのテーマがある場合はそちらを利用するように

* 🎨

* 🎨

* 🎨
2024-09-10 16:14:02 +09:00
かっこかり
672779a15f
fix(frontend-embed): 不足していたスタイル・インポートを追加 (#14531)
* fix(frontend-embed): add missing imports

* fix(frontend-embed): add missing styles
2024-09-09 22:44:39 +09:00
かっこかり
2cbe1d1210
feat(frontend): ノート・ユーザータイムライン埋め込み (#13929)
* fix

* navhookをbootに移動

* サーバーサイドのbootも分けるように

* 埋め込みページかどうかの判定は最初の一回だけに

* tooltipは出せるように

* fix design

* 埋め込み独自のtooltipを削除

* ロジックの分岐が多かったMkNoteDetailedを分離

* fix indent

* プレビュー用iframeにフォーカスが当たるのを修正

* popupの制御を出す側で行うように

* パラメータが逆になっていたのを修正

* Update MkEmbedCodeGenDialog.vue

* fix

* eliminate misskey-js lint warns

* fix

* add appropriate attributes to embed html

* enhance: サーバーサイドのembed系をさらに分離

* enhance: embed routerを分離(route定義をboot時に変更できるようにする改修を含む)

* type

* lint

* fix indent

* server-side styleを完全に分離

* Revert "refactor: 画面サイズのしきい値をconstにまとめる"

This reverts commit 05ca36f400889456981e89489ae0ae242fa09b67.

* fix

* revert all changes in base.pug

* embedドメインをまとめた

* embedドメインをまとめた

* prevent calling contextmenu in embed page by stopping at the caller

* fix import

* fix import

* improve directory structure

* fix import

* register timeline ui as a container

* wa-

* rename

* wa-

* Update EmMediaList.vue

* Update EmMediaList.vue

* Update EmMediaList.vue

* Update EmMediaImage.vue

* Update EmNote.vue

* revert mkmedialist changes

* 戻し漏れ

* wip

* tweak embed media ui

* revert original media components

* Update boot.embed.js

* rename

* wip

* Update MkNote.vue

* wip

* Update MkSubNoteContent.vue

* Update EmNote.vue

* Update packages/frontend/src/router/definition.ts

* Revert "Update packages/frontend/src/router/definition.ts"

This reverts commit 937ae44521cdb0f250796943b20142b65f8ed944.

* refactor EmMediaImage

* fix import

* remove unused imports

* Update router.ts

* wip

* Update boot.ts

* wip

* wip

* wip

* wip

* Update EmNote.vue

* Update EmNote.vue

* Create EmA.vue

* Create EmAvatar.vue

* Update EmAvatar.vue

* wip

* wip

* wip

* Create EmImgWithBlurhash.vue

* Update EmImgWithBlurhash.vue

* Create EmPagination.vue

* wip

* Update boot.ts

* wip

* wip

* wi@p

* wip

* wip

* wiop

* wip

* wip

* wip

* wip

* wip

* wip

* wip

* wip

* wip

* wip

* Update boot.ts

* wip

* Update MkMisskeyFlavoredMarkdown.ts

* wip

* wip

* wip

* wip

* wip

* Update post-message.ts

* wip

* Update EmNoteDetailed.vue

* Update EmNoteDetailed.vue

* Create instance.ts

* Update EmNoteDetailed.vue

* wip

* Update EmNoteDetailed.vue

* wip

* wip

* wip

* Update pnpm-lock.yaml

* wip

* wip

* wp

* wip

* Update ClientServerService.ts

* wip

* Update boot.ts

* Update vite.config.local-dev.ts

* Update vite.config.ts

* Create index.html

* wa-

* wip

* Update boot.ts

* wip

* wip

* wip

* wip

* wip

* wip

* wip

* wip

* wip

* Create EmLink.vue

* Create EmMention.vue

* Update EmMfm.ts

* wip

* wip

* wip

* wip

* Update vite.config.ts

* Update boot.ts

* Update EmA.vue

* うぃp

* wip

* wip

* Create EmError.vue

* wip

* Update MkEmbedCodeGenDialog.vue

* Update EmNote.vue

* wip

* wip

* Update user-timeline.vue

* Update check-spdx-license-id.yml

* wip

* wip

* style(frontend-shared): lint fixes on build.js

* fix(frontend-shared): include `*.{js,json}` files in js-built

* wip

* use alias

* refactor

* refactor

* Update scroll.ts

* refactor

* refactor

* refactor

* wip

* wip

* wip

* wip

* Update roles.vue

* Update branding.vue

* wip

* wip

* wip

* Update page.vue

* wip

* fix import

* add missing css variables

* 絵文字をtwemojiに変更

クライアントデフォルトにあわせるため

* force empoll readonly

* fix compiler error

* fix broken imports

* tweak button style

* run api extractor

* fix storybook theme preloads

* fix storybook instance imports

* Update preview.ts

* Update preview.ts

* Update preview.ts

* Revert "Update preview.ts"

This reverts commit 12bab1c6fbd3baf753515df760ff19d027b85155.

* Revert "Update preview.ts"

This reverts commit 5c0ce01dbdf2194ffe94aba950f747a9968f29c4.

* Revert "Update preview.ts"

This reverts commit f4863524d7e5ca0f25470808849c24a72bea000a.

* Revert "fix storybook instance imports"

This reverts commit ed8eabb246edf731d31adffbe3c77c539e53ae9e.

* Revert "wip"

This reverts commit d3c1926519878155193a1654f49141e515d49683.

* Revert "Update page.vue"

This reverts commit 27c7900b0c1ae296b56075e8a9c22585d9cd744b.

* Revert "Update branding.vue"

This reverts commit c08ccb65ba66774c3e2b3dcfc6153004b5c0aa16.

* Revert "Update roles.vue"

This reverts commit 1488b670660cb1803d17d8f5c78f2d79e59fa52d.

* Revert "wip"

This reverts commit aab1c769814b08c257cad3025422a0eea3bfba4f.

* refactor: use common media proxy

* fix imports

* fix

* fix: MediaProxyの初期化を保証する(storybook対策?)

* enhance(frontend-embed): improve embedParams provide

* fix(backend): MK_DEV_PREFER=backendのときにembed viteが読み込めないのを修正

* fix

* embed-pageを共通化

* fix import

* fix import

* fix import

* const.jsを共通化

(たぶんrevertしすぎた)

* fix type error

* fix duplicated import

* fix lint

* fix

* コメントとして残す

* sharedとembedをlint対象にする

* lint

* attempt to fix eslint (frontend-shared)

* lint fixes

---------

Co-authored-by: syuilo <4439005+syuilo@users.noreply.github.com>
Co-authored-by: zyoshoka <107108195+zyoshoka@users.noreply.github.com>
2024-09-09 20:57:36 +09:00
かっこかり
0d0cd738f8
refactor(misskey-js): warnを除去 (#14520) 2024-09-07 02:38:01 +09:00
かっこかり
567acea2a3
fix(frontend): instance infoページで不必要なapiリクエストが飛ぶのを抑止 (#14515)
* fix(frontend): instance infoページで不必要なapiリクエストが飛ぶのを抑止

* fix
2024-09-06 17:23:40 +09:00
かっこかり
8d19bdbb65
fix(misskey-js): content-typeはapplication/jsonでないもののみを記録するように (#14508) 2024-09-06 17:22:45 +09:00
かっこかり
cdb0566c5b
refactor(frontend): scss deprecated 警告に対応 (#14513) 2024-09-06 16:12:14 +09:00
かっこかり
f7398faeac
enhance(frontend): アイコンデコレーション管理画面にプレビューを追加 (#14511)
* enhance(frontend): アイコンデコレーション管理画面にプレビューを追加

* Update Changelog

* tweak
2024-09-06 15:37:03 +09:00
taiy
c8f49b6ae7
chore(ci/lint): ESLintのキャッシュが保存できない問題を修正 (#14506) 2024-09-06 14:45:53 +09:00
syuilo
74c93fcebe Update .gitignore 2024-09-05 14:07:36 +09:00
zyoshoka
8be624aa44
refactor(sw): fix type errors (#14478)
* style(sw): lint fixes

* refactor(sw): fix type errors

* chore(sw): disable `noImplicitAny`

* ci(sw): enable typecheck ci

* ci(sw): build `misskey-js` before typecheck
2024-08-30 15:53:04 +09:00
zyoshoka
3fe7e37f10
fix(frontend): server metrics look strange after reload (#14467) 2024-08-30 10:59:23 +09:00
zyoshoka
7fe3035059
fix(backend): use prefixItems in admin/queue/*-delayed endpoint schema (#14468)
* fix(backend): represent tuples with `prefixItems`

* refactor(frontend): fix type errors

* fix(backend): add `prefixItems` in `SchemaType`

* fix(backend): add `unevaluatedItems: false` to disallow extra items

* refactor(frontend): consolidate `'deliver' | 'queue'` type def into `queue.vue`

* fix(backend): add `unevaluatedItems` in `SchemaType`
2024-08-30 10:58:59 +09:00
zyoshoka
06855f769f
refactor(sw): use fully typed locales (#14470)
* refactor(sw): use fully typed locales

* fix(backend): enumerate achievement notification type
2024-08-30 10:58:11 +09:00
zyoshoka
3e85052754
fix(backend): correct app-type notification schema (#14471) 2024-08-29 18:57:44 +09:00
syuilo
b6fdd71957 消し忘れ 2024-08-27 20:40:11 +09:00
syuilo
36dff66883 refactor 2024-08-27 20:36:43 +09:00
Kisaragi
255c8bd1b9
fix: 投稿フォームの字数上限計算を実際の投稿内容に合わせる (#14466) 2024-08-26 15:55:38 +09:00
dakkar
87adf67752 some maybe-not-terrible descriptions of the Bubble timeline
the Japanese entries are translated by machine
2024-08-25 15:23:33 +01:00
syuilo
44f62160cb enhance(frontend): error message i18n 2024-08-24 16:59:17 +09:00
syuilo
8032a4e12a enhance(frontend): サイズ制限を超過するファイルをアップロードしようとした際にエラーを出すように 2024-08-23 16:40:11 +09:00
syuilo
2f009f7d49 add note 2024-08-23 16:31:16 +09:00
syuilo
f85aa7b641 fix(backend): ファイルがサイズの制限を超えてアップロードされた際にエラーを返さなかった問題を修正 2024-08-23 16:29:05 +09:00
syuilo
1008fa32a0
better boot error screen 2024-08-22 14:03:11 +09:00
dakkar
a99f99d798 placeholders for the missing bubble bits 2024-08-21 22:15:46 +01:00
atsuchan
043ab1f69b
fix(backend): Fix chart generation non-matching blockedHosts (#14441) 2024-08-20 13:49:42 +09:00
かっこかり
21a3095eb0
fix button translation (#14444)
that Japanese string exactly matches that i18n key

(cherry picked from commit a408d32bb7)

Co-authored-by: dakkar <dakkar@thenautilus.net>
2024-08-20 12:39:01 +09:00
syuilo
1b5f0571f7 🎨 2024-08-20 10:51:02 +09:00
syuilo
59e83605ac refactor 2024-08-19 19:41:06 +09:00
syuilo
130ff361c3 refactor 2024-08-19 17:32:27 +09:00
syuilo
e78110a5cd refactor 2024-08-19 13:13:32 +09:00
github-actions[bot]
6c5593d456 [skip ci] Update CHANGELOG.md (prepend template) 2024-08-18 08:08:49 +00:00
778 changed files with 29285 additions and 10857 deletions

View file

@ -167,8 +167,18 @@ id: 'aidx'
# IP address family used for outgoing request (ipv4, ipv6 or dual)
#outgoingAddressFamily: ipv4
# Amount of characters that can be used when writing notes (maximum: 8192, minimum: 1)
maxNoteLength: 3000
# Amount of characters that can be used when writing notes. Longer notes will be rejected. (minimum: 1)
#maxNoteLength: 3000
# Amount of characters that will be saved for remote notes. Longer notes will be truncated to this length. (minimum: 1)
#maxRemoteNoteLength: 100000
# Amount of characters that can be used when writing content warnings. Longer warnings will be rejected. (minimum: 1)
#maxCwLength: 500
# Amount of characters that will be saved for remote content warnings. Longer warnings will be truncated to this length. (minimum: 1)
#maxRemoteCwLength: 5000
# Amount of characters that can be used when writing media descriptions (alt text). Longer descriptions will be rejected. (minimum: 1)
#maxAltTextLength: 20000
# Amount of characters that will be saved for remote media descriptions (alt text). Longer descriptions will be truncated to this length. (minimum: 1)
#maxRemoteAltTextLength: 100000
# Proxy for HTTP/HTTPS
#proxy: http://127.0.0.1:3128

View file

@ -0,0 +1,224 @@
#━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
# Misskey configuration
#━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
# ┌─────┐
#───┘ URL └─────────────────────────────────────────────────────
# Final accessible URL seen by a user.
url: 'http://misskey.local'
# ONCE YOU HAVE STARTED THE INSTANCE, DO NOT CHANGE THE
# URL SETTINGS AFTER THAT!
# ┌───────────────────────┐
#───┘ Port and TLS settings └───────────────────────────────────
#
# Misskey requires a reverse proxy to support HTTPS connections.
#
# +----- https://example.tld/ ------------+
# +------+ |+-------------+ +----------------+|
# | User | ---> || Proxy (443) | ---> | Misskey (3000) ||
# +------+ |+-------------+ +----------------+|
# +---------------------------------------+
#
# You need to set up a reverse proxy. (e.g. nginx)
# An encrypted connection with HTTPS is highly recommended
# because tokens may be transferred in GET requests.
# The port that your Misskey server should listen on.
port: 61812
# ┌──────────────────────────┐
#───┘ PostgreSQL configuration └────────────────────────────────
db:
host: db
port: 5432
# Database name
db: misskey
# Auth
user: postgres
pass: postgres
# Whether disable Caching queries
#disableCache: true
# Extra Connection options
#extra:
# ssl: true
dbReplications: false
# You can configure any number of replicas here
#dbSlaves:
# -
# host:
# port:
# db:
# user:
# pass:
# -
# host:
# port:
# db:
# user:
# pass:
# ┌─────────────────────┐
#───┘ Redis configuration └─────────────────────────────────────
redis:
host: redis
port: 6379
#family: 0 # 0=Both, 4=IPv4, 6=IPv6
#pass: example-pass
#prefix: example-prefix
#db: 1
#redisForPubsub:
# host: redis
# port: 6379
# #family: 0 # 0=Both, 4=IPv4, 6=IPv6
# #pass: example-pass
# #prefix: example-prefix
# #db: 1
#redisForJobQueue:
# host: redis
# port: 6379
# #family: 0 # 0=Both, 4=IPv4, 6=IPv6
# #pass: example-pass
# #prefix: example-prefix
# #db: 1
#redisForTimelines:
# host: redis
# port: 6379
# #family: 0 # 0=Both, 4=IPv4, 6=IPv6
# #pass: example-pass
# #prefix: example-prefix
# #db: 1
#redisForReactions:
# host: redis
# port: 6379
# #family: 0 # 0=Both, 4=IPv4, 6=IPv6
# #pass: example-pass
# #prefix: example-prefix
# #db: 1
# ┌───────────────────────────┐
#───┘ MeiliSearch configuration └─────────────────────────────
#meilisearch:
# host: meilisearch
# port: 7700
# apiKey: ''
# ssl: true
# index: ''
# ┌───────────────┐
#───┘ ID generation └───────────────────────────────────────────
# You can select the ID generation method.
# You don't usually need to change this setting, but you can
# change it according to your preferences.
# Available methods:
# aid ... Short, Millisecond accuracy
# aidx ... Millisecond accuracy
# meid ... Similar to ObjectID, Millisecond accuracy
# ulid ... Millisecond accuracy
# objectid ... This is left for backward compatibility
# ONCE YOU HAVE STARTED THE INSTANCE, DO NOT CHANGE THE
# ID SETTINGS AFTER THAT!
id: 'aidx'
# ┌────────────────┐
#───┘ Error tracking └──────────────────────────────────────────
# Sentry is available for error tracking.
# See the Sentry documentation for more details on options.
#sentryForBackend:
# enableNodeProfiling: true
# options:
# dsn: 'https://examplePublicKey@o0.ingest.sentry.io/0'
#sentryForFrontend:
# options:
# dsn: 'https://examplePublicKey@o0.ingest.sentry.io/0'
# ┌─────────────────────┐
#───┘ Other configuration └─────────────────────────────────────
# Whether disable HSTS
#disableHsts: true
# Number of worker processes
#clusterLimit: 1
# Job concurrency per worker
# deliverJobConcurrency: 128
# inboxJobConcurrency: 16
# Job rate limiter
# deliverJobPerSec: 128
# inboxJobPerSec: 32
# Job attempts
# deliverJobMaxAttempts: 12
# inboxJobMaxAttempts: 8
# IP address family used for outgoing request (ipv4, ipv6 or dual)
#outgoingAddressFamily: ipv4
# Amount of characters that can be used when writing notes. Longer notes will be rejected. (minimum: 1)
#maxNoteLength: 3000
# Amount of characters that will be saved for remote notes. Longer notes will be truncated to this length. (minimum: 1)
#maxRemoteNoteLength: 100000
# Amount of characters that can be used when writing content warnings. Longer warnings will be rejected. (minimum: 1)
#maxCwLength: 500
# Amount of characters that will be saved for remote content warnings. Longer warnings will be truncated to this length. (minimum: 1)
#maxRemoteCwLength: 5000
# Amount of characters that can be used when writing media descriptions (alt text). Longer descriptions will be rejected. (minimum: 1)
#maxAltTextLength: 20000
# Amount of characters that will be saved for remote media descriptions (alt text). Longer descriptions will be truncated to this length. (minimum: 1)
#maxRemoteAltTextLength: 100000
# Proxy for HTTP/HTTPS
#proxy: http://127.0.0.1:3128
proxyBypassHosts:
- api.deepl.com
- api-free.deepl.com
- www.recaptcha.net
- hcaptcha.com
- challenges.cloudflare.com
# Proxy for SMTP/SMTPS
#proxySmtp: http://127.0.0.1:3128 # use HTTP/1.1 CONNECT
#proxySmtp: socks4://127.0.0.1:1080 # use SOCKS4
#proxySmtp: socks5://127.0.0.1:1080 # use SOCKS5
# Media Proxy
#mediaProxy: https://example.com/proxy
# Proxy remote files (default: true)
proxyRemoteFiles: true
# Sign to ActivityPub GET request (default: true)
signToActivityPubGet: true
allowedPrivateNetworks: [
'127.0.0.1/32'
]
# Upload or download file size limits (bytes)
#maxFileSize: 262144000

View file

@ -163,6 +163,14 @@ redis:
# #prefix: example-prefix
# #db: 1
#redisForReactions:
# host: redis
# port: 6379
# #family: 0 # 0=Both, 4=IPv4, 6=IPv6
# #pass: example-pass
# #prefix: example-prefix
# #db: 1
# ┌───────────────────────────┐
#───┘ MeiliSearch configuration └─────────────────────────────
@ -242,8 +250,18 @@ id: 'aidx'
# IP address family used for outgoing request (ipv4, ipv6 or dual)
#outgoingAddressFamily: ipv4
# Amount of characters that can be used when writing notes (maximum: 8192, minimum: 1)
maxNoteLength: 3000
# Amount of characters that can be used when writing notes. Longer notes will be rejected. (minimum: 1)
#maxNoteLength: 3000
# Amount of characters that will be saved for remote notes. Longer notes will be truncated to this length. (minimum: 1)
#maxRemoteNoteLength: 100000
# Amount of characters that can be used when writing content warnings. Longer warnings will be rejected. (minimum: 1)
#maxCwLength: 500
# Amount of characters that will be saved for remote content warnings. Longer warnings will be truncated to this length. (minimum: 1)
#maxRemoteCwLength: 5000
# Amount of characters that can be used when writing media descriptions (alt text). Longer descriptions will be rejected. (minimum: 1)
#maxAltTextLength: 20000
# Amount of characters that will be saved for remote media descriptions (alt text). Longer descriptions will be truncated to this length. (minimum: 1)
#maxRemoteAltTextLength: 100000
# Proxy for HTTP/HTTPS
#proxy: http://127.0.0.1:3128

View file

@ -172,6 +172,16 @@ redis:
# # You can specify more ioredis options...
# #username: example-username
#redisForReactions:
# host: localhost
# port: 6379
# #family: 0 # 0=Both, 4=IPv4, 6=IPv6
# #pass: example-pass
# #prefix: example-prefix
# #db: 1
# # You can specify more ioredis options...
# #username: example-username
# ┌───────────────────────────┐
#───┘ MeiliSearch configuration └─────────────────────────────
@ -251,8 +261,18 @@ id: 'aidx'
# IP address family used for outgoing request (ipv4, ipv6 or dual)
#outgoingAddressFamily: ipv4
# Amount of characters that can be used when writing notes (maximum: 8192, minimum: 1)
maxNoteLength: 3000
# Amount of characters that can be used when writing notes. Longer notes will be rejected. (minimum: 1)
#maxNoteLength: 3000
# Amount of characters that will be saved for remote notes. Longer notes will be truncated to this length. (minimum: 1)
#maxRemoteNoteLength: 100000
# Amount of characters that can be used when writing content warnings. Longer warnings will be rejected. (minimum: 1)
#maxCwLength: 500
# Amount of characters that will be saved for remote content warnings. Longer warnings will be truncated to this length. (minimum: 1)
#maxRemoteCwLength: 5000
# Amount of characters that can be used when writing media descriptions (alt text). Longer descriptions will be rejected. (minimum: 1)
#maxAltTextLength: 20000
# Amount of characters that will be saved for remote media descriptions (alt text). Longer descriptions will be truncated to this length. (minimum: 1)
#maxRemoteAltTextLength: 100000
# Proxy for HTTP/HTTPS
#proxy: http://127.0.0.1:3128

View file

@ -103,6 +103,14 @@ redis:
# #prefix: example-prefix
# #db: 1
#redisForReactions:
# host: redis
# port: 6379
# #family: 0 # 0=Both, 4=IPv4, 6=IPv6
# #pass: example-pass
# #prefix: example-prefix
# #db: 1
# ┌───────────────────────────┐
#───┘ MeiliSearch configuration └─────────────────────────────

View file

@ -3,6 +3,8 @@
set -xe
sudo chown node node_modules
sudo apt-get update
sudo apt-get -y install libgtk2.0-0 libgtk-3-0 libgbm-dev libnotify-dev libnss3 libxss1 libasound2 libxtst6 xauth xvfb
git config --global --add safe.directory /workspace
git submodule update --init
corepack install
@ -12,3 +14,4 @@ pnpm install --frozen-lockfile
cp .devcontainer/devcontainer.yml .config/default.yml
pnpm build
pnpm migrate
pnpm exec cypress install

10
.gitignore vendored
View file

@ -38,6 +38,7 @@ coverage
!/.config/example.yml
!/.config/docker_example.yml
!/.config/docker_example.env
!/.config/cypress-devcontainer.yml
docker-compose.yml
compose.yml
.devcontainer/compose.yml
@ -47,6 +48,7 @@ compose.yml
/build
built
built-test
js-built
/data
/.cache-loader
/db
@ -66,8 +68,9 @@ temp
tsdoc-metadata.json
misskey-assets
# Sharkey
/packages/megalodon/lib
# Vite temporary files
vite.config.js.timestamp-*
vite.config.ts.timestamp-*
# blender backups
*.blend1
@ -78,3 +81,6 @@ misskey-assets
# VSCode addon
.favorites.json
# Sharkey
/packages/megalodon/lib

View file

@ -20,9 +20,9 @@ testCommit:
- pnpm install --frozen-lockfile
- pnpm run build
- pnpm run migrate
- pnpm run --filter='!megalodon' --workspace-concurrency=1 test
- pnpm run --filter=backend lint
- pnpm run --filter=frontend eslint
- pnpm run --filter='!megalodon' test
- pnpm run --filter=backend --filter=misskey-js lint
- pnpm run --filter=frontend --filter=frontend-embed eslint
cache:
key: test
policy: pull-push

View file

@ -1,3 +1,56 @@
## 2024.9.0
### General
- Feat: ノート単体・ユーザーのノート・クリップのノートの埋め込み機能
- 埋め込みコードやウェブサイトへの実装方法の詳細は https://misskey-hub.net/docs/for-users/features/embed/ をご覧ください
- Feat: パスキーでログインボタンを実装 (#14574)
- Feat: フォローされた際のメッセージを設定できるように
- Feat: 連合をホワイトリスト制にできるように
- Feat: UserWebhookとSystemWebhookのテスト送信機能を追加 (#14445)
- Feat: モデレーターはユーザーにかかわらずファイルが添付されているノートを検索できるように
(Cherry-picked from https://github.com/MisskeyIO/misskey/pull/680)
- Feat: データエクスポートが完了した際に通知を発行するように
- Enhance: ユーザーによるコンテンツインポートの可否をロールポリシーで制御できるように
- Enhance: 依存関係の更新
- Enhance: l10nの更新
### Client
- Enhance: サイズ制限を超過するファイルをアップロードしようとした際にエラーを出すように
- Enhance: アイコンデコレーション管理画面にプレビューを追加
- Enhance: コントロールパネル内のファイル一覧でセンシティブなファイルを区別しやすく
- Enhance: ScratchpadにUIインスペクターを追加
- Enhance: Play編集画面の項目の並びを少しリデザイン
- Enhance: 各種メニューをドロワー表示するかどうか設定可能に
- Enhance: AiScriptのMk:C:containerのオプションに`borderStyle`と`borderRadius`を追加
- Enhance: CWでも絵文字をクリックしてメニューを表示できるように
- Fix: サーバーメトリクスが2つ以上あるとリロード直後の表示がおかしくなる問題を修正
- Fix: コントロールパネル内のAp requests内のチャートの表示がおかしかった問題を修正
- Fix: 月の違う同じ日はセパレータが表示されないのを修正
- Fix: タッチ画面でレンジスライダーを操作するとツールチップが複数表示される問題を修正
(Cherry-picked from https://github.com/taiyme/misskey/pull/265)
- Fix: 縦横比が極端なカスタム絵文字を表示する際にレイアウトが崩れる箇所があるのを修正
(Cherry-picked from https://github.com/MisskeyIO/misskey/pull/725)
- Fix: 設定変更時のリロード確認ダイアログが複数個表示されることがある問題を修正
- Fix: ファイルの詳細ページのファイルの説明で改行が正しく表示されない問題を修正
(Cherry-picked from https://activitypub.software/TransFem-org/Sharkey/-/commit/bde6bb0bd2e8b0d027e724d2acdb8ae0585a8110)
- Fix: 一部画面のページネーションが動作しにくくなっていたのを修正 ( #12766 , #11449 )
### Server
- Feat: Misskey® Reactions Boost Technology™ (RBT)により、リアクションの作成負荷を低減することが可能に
- Fix: アンテナの書き込み時にキーワードが与えられなかった場合のエラーをApiErrorとして投げるように
- この変更により、公式フロントエンドでは入力の不備が内部エラーとして報告される代わりに一般的なエラーダイアログで報告されます
- Fix: ファイルがサイズの制限を超えてアップロードされた際にエラーを返さなかった問題を修正
- Fix: 外部ページを解析する際に、ページに紐づけられた関連リソースも読み込まれてしまう問題を修正
(Cherry-picked from https://activitypub.software/TransFem-org/Sharkey/-/commit/26e0412fbb91447c37e8fb06ffb0487346063bb8)
- Fix: Continue importing from file if single emoji import fails
- Fix: `Retry-After`ヘッダーが送信されなかった問題を修正
(Cherry-picked from https://activitypub.software/TransFem-org/Sharkey/-/commit/8a982c61c01909e7540ff1be9f019df07c3f0624)
- Fix: サーバーサイドのDOM解析完了時にリソースを開放するように
(Cherry-picked from https://activitypub.software/TransFem-org/Sharkey/-/merge_requests/634)
- Fix: `<link rel="alternate">`を追って照会するのはOKレスポンスが返却された場合のみに
(Cherry-picked from https://activitypub.software/TransFem-org/Sharkey/-/merge_requests/633)
- Fix: メールにスタイルが適用されていなかった問題を修正
## 2024.8.0
### General

View file

@ -529,7 +529,8 @@ enumの列挙の内容の削除は、その値をもつレコードを全て削
### Migration作成方法
packages/backendで:
```sh
pnpm dlx typeorm migration:generate -d ormconfig.js -o <migration name>
pnpm run build
pnpm dlx typeorm migration:generate -d ormconfig.js -o migration/<migration name>
```
- 生成後、ファイルをmigration下に移してください
@ -573,6 +574,26 @@ marginはそのコンポーネントを使う側が設定する
### indexというファイル名を使うな
ESMではディレクトリインポートは廃止されているのと、ディレクトリインポートせずともファイル名が index だと何故か一部のライブラリ?でディレクトリインポートだと見做されてエラーになる
## CSS Recipe
### Lighten CSS vars
``` css
color: hsl(from var(--accent) h s calc(l + 10));
```
### Darken CSS vars
``` css
color: hsl(from var(--accent) h s calc(l - 10));
```
### Add alpha to CSS vars
``` css
color: color(from var(--accent) srgb r g b / 0.5);
```
## Merging from Misskey into Sharkey
Make sure you have both remotes in the same clone (`git remote add misskey
@ -590,15 +611,11 @@ seems to do a decent job)
*after that commit*, do all the extra work, on the same branch:
* copy all changes (commit after each step):
* in `packages/backend/src/core/NoteCreateService.ts`, from `create` to
`import` (and vice versa if `git` got confused!)
* in
`packages/backend/src/core/activitypub/models/ApNoteService.ts`,
from `createNote` to `updateNote`
* from `packages/backend/src/core/NoteCreateService.ts` to
`packages/backend/src/core/NoteEditService.vue`
* in `packages/backend/src/core/activitypub/models/ApNoteService.ts`,
from `createNote` to `updateNote`
* from `packages/backend/src/server/api/endpoints/notes/create.ts`
to `packages/backend/src/server/api/endpoints/notes/edit.ts`
* from `packages/frontend/src/components/MkNote*.vue` to
@ -614,9 +631,9 @@ seems to do a decent job)
* check the changes against our `develop` (`git diff develop`) and
against Misskey (`git diff misskey/develop`)
* re-generate `misskey-js` (`pnpm build-misskey-js-with-types`) and commit
* build the frontend: `rm -rf built/; NODE_ENV=development pnpm --filter=frontend
build` (the `development` tells it to keep some of the original
filenames in the built files)
* build the frontend: `rm -rf built/; NODE_ENV=development pnpm
--filter=frontend --filter=frontend-embed build` (the `development`
tells it to keep some of the original filenames in the built files)
* make sure there aren't any new `ti-*` classes (Tabler Icons), and
replace them with appropriate `ph-*` ones (Phosphor Icons):
`grep -rP '["'\'']ti[ -](?!fw)' -- built/` should show you what to change.

View file

@ -23,9 +23,10 @@ RUN --mount=type=cache,target=/root/.local/share/pnpm/store,sharing=locked \
RUN pnpm build
RUN node scripts/trim-deps.mjs
RUN mv packages/frontend/assets sharkey-assets
RUN mv packages/frontend-embed/assets sharkey-embed-assets
RUN --mount=type=cache,target=/root/.local/share/pnpm/store,sharing=locked \
pnpm prune
RUN rm -r node_modules packages/frontend packages/sw
RUN rm -r node_modules packages/frontend packages/frontend-shared packages/frontend-embed packages/sw
RUN --mount=type=cache,target=/root/.local/share/pnpm/store,sharing=locked \
pnpm i --prod --frozen-lockfile --aggregate-output
RUN rm -rf .git
@ -64,6 +65,7 @@ COPY --chown=sharkey:sharkey --from=build /sharkey/packages/megalodon/lib ./pack
COPY --chown=sharkey:sharkey --from=build /sharkey/fluent-emojis ./fluent-emojis
COPY --chown=sharkey:sharkey --from=build /sharkey/tossface-emojis/dist ./tossface-emojis/dist
COPY --chown=sharkey:sharkey --from=build /sharkey/sharkey-assets ./packages/frontend/assets
COPY --chown=sharkey:sharkey --from=build /sharkey/sharkey-embed-assets ./packages/frontend-embed/assets
COPY --chown=sharkey:sharkey pnpm-workspace.yaml ./pnpm-workspace.yaml
COPY --chown=sharkey:sharkey packages/backend/package.json ./packages/backend/package.json

41
UPGRADE_NOTES.md Normal file
View file

@ -0,0 +1,41 @@
# Upgrade Notes
## 2024.9.0
### Following Feed
When upgrading an existing instance to version 2024.9.0, the Following Feed will initially be empty.
The feed will gradually fill as new posts federate, but it may be desirable to back-fill the feed with existing data.
This database script will populate the feed with the latest post of each type for all users, ensuring that data is fully populated after the update.
Run this after migrations but before starting the instance.
Warning: the script may take a long time to execute!
```postgresql
INSERT INTO latest_note (user_id, note_id, is_public, is_reply, is_quote)
SELECT
"userId" as user_id,
id as note_id,
visibility = 'public' AS is_public,
"replyId" IS NOT NULL AS is_reply,
(
"renoteId" IS NOT NULL
AND (
text IS NOT NULL
OR cw IS NOT NULL
OR "replyId" IS NOT NULL
OR "hasPoll"
OR "fileIds" != '{}'
)
) AS is_quote
FROM note
WHERE ( -- Exclude pure renotes (boosts)
"renoteId" IS NULL
OR text IS NOT NULL
OR cw IS NOT NULL
OR "replyId" IS NOT NULL
OR "hasPoll"
OR "fileIds" != '{}'
)
ORDER BY id DESC -- This part is very important: it ensures that we only load the *latest* notes of each type. Do not remove it!
ON CONFLICT DO NOTHING; -- Any conflicts are guaranteed to be older notes that we can ignore.
```

View file

@ -124,6 +124,14 @@ redis:
# #prefix: example-prefix
# #db: 1
#redisForReactions:
# host: redis
# port: 6379
# #family: 0 # 0=Both, 4=IPv4, 6=IPv6
# #pass: example-pass
# #prefix: example-prefix
# #db: 1
# ┌───────────────────────────┐
#───┘ MeiliSearch configuration └─────────────────────────────

View file

@ -53,7 +53,7 @@ services:
# restart: always
# image: mcaptcha/mcaptcha:latest
# networks:
# shonks:
# shonk:
# aliases:
# - localhost
# ports:
@ -63,6 +63,8 @@ services:
# environment:
# PORT: 7493
# MCAPTCHA_redis_URL: "redis://mcaptcha_redis/"
# MCAPTCHA_allow_registration: true
# MCAPTCHA_server_DOMAIN: "example.tld"
# depends_on:
# db:
# condition: service_healthy
@ -72,7 +74,7 @@ services:
# mcaptcha_redis:
# image: mcaptcha/cache:latest
# networks:
# - shonks
# - shonk
# healthcheck:
# test: "redis-cli ping"
# interval: 5s

View file

@ -1,4 +1,4 @@
files:
- source: /locales/ja-JP.yml
translation: /locales/%locale%.yml
- source: /sharkey-locales/en-US.yml
translation: /sharkey-locales/%locale%.yml
update_option: update_as_unapproved

251
eslint/locale.js Normal file
View file

@ -0,0 +1,251 @@
/*
* SPDX-FileCopyrightText: dakkar and other Sharkey contributors
* SPDX-License-Identifier: AGPL-3.0-only
*/
/* This is a ESLint rule to report use of the `i18n.ts` and `i18n.tsx`
* objects that reference translation items that don't actually exist
* in the lexicon (the `locale/` files)
*/
/* given a MemberExpression node, collects all the member names
*
* e.g. for a bit of code like `foo=one.two.three`, `collectMembers`
* called on the node for `three` would return `['one', 'two',
* 'three']`
*/
function collectMembers(node) {
if (!node) return [];
if (node.type !== 'MemberExpression') return [];
// this is something like `foo[bar]`
if (node.computed) return [];
return [ node.property.name, ...collectMembers(node.parent) ];
}
/* given an object and an array of names, recursively descends the
* object via those names
*
* e.g. `walkDown({one:{two:{three:15}}},['one','two','three'])` would
* return 15
*/
function walkDown(locale, path) {
if (!locale) return null;
if (!path || path.length === 0 || !path[0]) return locale;
return walkDown(locale[path[0]], path.slice(1));
}
/* given a MemberExpression node, returns its attached CallExpression
* node if present
*
* e.g. for a bit of code like `foo=one.two.three()`,
* `findCallExpression` called on the node for `three` would return
* the node for function call (which is the parent of the `one` and
* `two` nodes, and holds the nodes for the argument list)
*
* if the code had been `foo=one.two.three`, `findCallExpression`
* would have returned null, because there's no function call attached
* to the MemberExpressions
*/
function findCallExpression(node) {
if (!node.parent) return null;
// the second half of this guard protects from cases like
// `foo(one.two.three)` where the CallExpression is parent of the
// MemberExpressions, but via `arguments`, not `callee`
if (node.parent.type === 'CallExpression' && node.parent.callee === node) return node.parent;
if (node.parent.type === 'MemberExpression') return findCallExpression(node.parent);
return null;
}
// same, but for Vue expressions (`<I18n :src="i18n.ts.foo">`)
function findVueExpression(node) {
if (!node.parent) return null;
if (node.parent.type.match(/^VExpr/) && node.parent.expression === node) return node.parent;
if (node.parent.type === 'MemberExpression') return findVueExpression(node.parent);
return null;
}
function areArgumentsOneObject(node) {
return node.arguments.length === 1 &&
node.arguments[0].type === 'ObjectExpression';
}
// only call if `areArgumentsOneObject(node)` is true
function getArgumentObjectProperties(node) {
return new Set(node.arguments[0].properties.map(
p => {
if (p.key && p.key.type === 'Identifier') return p.key.name;
return null;
},
));
}
function getTranslationParameters(translation) {
return new Set(Array.from(translation.matchAll(/\{(\w+)\}/g)).map( m => m[1] ));
}
function setDifference(a,b) {
const result = [];
for (const element of a.values()) {
if (!b.has(element)) {
result.push(element);
}
}
return result;
}
/* the actual rule body
*/
function theRuleBody(context,node) {
// we get the locale/translations via the options; it's the data
// that goes into a specific language's JSON file, see
// `scripts/build-assets.mjs`
const locale = context.options[0];
// sometimes we get MemberExpression nodes that have a
// *descendent* with the right identifier: skip them, we'll get
// the right ones as well
if (node.object?.name !== 'i18n') {
return;
}
// `method` is going to be `'ts'` or `'tsx'`, `path` is going to
// be the various translation steps/names
const [ method, ...path ] = collectMembers(node);
const pathStr = `i18n.${method}.${path.join('.')}`;
// does that path point to a real translation?
const translation = walkDown(locale, path);
if (!translation) {
context.report({
node,
message: `translation missing for ${pathStr}`,
});
return;
}
// we hit something weird, assume the programmers know what
// they're doing (this is usually some complicated slicing of
// the translation structure)
if (typeof(translation) !== 'string') return;
const callExpression = findCallExpression(node);
const vueExpression = findVueExpression(node);
// some more checks on how the translation is called
if (method === 'ts') {
// the `<I18n> component gets parametric translations via
// `i18n.ts.*`, but we error out elsewhere
if (translation.match(/\{/) && !vueExpression) {
context.report({
node,
message: `translation for ${pathStr} is parametric, but called via 'ts'`,
});
return;
}
if (callExpression) {
context.report({
node,
message: `translation for ${pathStr} is not parametric, but is called as a function`,
});
}
}
if (method === 'tsx') {
if (!translation.match(/\{/)) {
context.report({
node,
message: `translation for ${pathStr} is not parametric, but called via 'tsx'`,
});
return;
}
if (!callExpression && !vueExpression) {
context.report({
node,
message: `translation for ${pathStr} is parametric, but not called as a function`,
});
return;
}
// we're not currently checking arguments when used via the
// `<I18n>` component, because it's too complicated (also, it
// would have to be done inside the `if (method === 'ts')`)
if (!callExpression) return;
if (!areArgumentsOneObject(callExpression)) {
context.report({
node,
message: `translation for ${pathStr} should be called with a single object as argument`,
});
return;
}
const translationParameters = getTranslationParameters(translation);
const parameterCount = translationParameters.size;
const callArguments = getArgumentObjectProperties(callExpression);
const argumentCount = callArguments.size;
if (parameterCount !== argumentCount) {
context.report({
node,
message: `translation for ${pathStr} has ${parameterCount} parameters, but is called with ${argumentCount} arguments`,
});
}
// node 20 doesn't have `Set.difference`...
const extraArguments = setDifference(callArguments, translationParameters);
const missingArguments = setDifference(translationParameters, callArguments);
if (extraArguments.length > 0) {
context.report({
node,
message: `translation for ${pathStr} passes unused arguments ${extraArguments.join(' ')}`,
});
}
if (missingArguments.length > 0) {
context.report({
node,
message: `translation for ${pathStr} does not pass arguments ${missingArguments.join(' ')}`,
});
}
}
}
function theRule(context) {
// we get the locale/translations via the options; it's the data
// that goes into a specific language's JSON file, see
// `scripts/build-assets.mjs`
const locale = context.options[0];
// for all object member access that have an identifier 'i18n'...
return context.getSourceCode().parserServices.defineTemplateBodyVisitor(
{
// this is for <template> bits, needs work
'MemberExpression:has(Identifier[name=i18n])': (node) => theRuleBody(context, node),
},
{
// this is for normal code
'MemberExpression:has(Identifier[name=i18n])': (node) => theRuleBody(context, node),
},
);
}
module.exports = {
meta: {
type: 'problem',
docs: {
description: 'assert that all translations used are present in the locale files',
},
schema: [
// here we declare that we need the locale/translation as a
// generic object
{ type: 'object', additionalProperties: true },
],
},
create: theRule,
};

54
eslint/locale.test.js Normal file
View file

@ -0,0 +1,54 @@
/*
* SPDX-FileCopyrightText: dakkar and other Sharkey contributors
* SPDX-License-Identifier: AGPL-3.0-only
*/
const {RuleTester} = require("eslint");
const localeRule = require("./locale");
const locale = { foo: { bar: 'ok', baz: 'good {x}' }, top: '123' };
const ruleTester = new RuleTester({
languageOptions: {
parser: require('vue-eslint-parser'),
ecmaVersion: 2015,
},
});
function testCase(code,errors) {
return { code, errors, options: [ locale ], filename: 'test.ts' };
}
function testCaseVue(code,errors) {
return { code, errors, options: [ locale ], filename: 'test.vue' };
}
ruleTester.run(
'sharkey-locale',
localeRule,
{
valid: [
testCase('i18n.ts.foo.bar'),
testCase('i18n.ts.top'),
testCase('i18n.tsx.foo.baz({x:1})'),
testCase('whatever.i18n.ts.blah.blah'),
testCase('whatever.i18n.tsx.does.not.matter'),
testCase('whatever(i18n.ts.foo.bar)'),
testCaseVue('<template><p>{{ i18n.ts.foo.bar }}</p></template>'),
testCaseVue('<template><I18n :src="i18n.ts.foo.baz"/></template>'),
// we don't detect the problem here, but should still accept it
testCase('i18n.ts.foo["something"]'),
testCase('i18n.ts.foo[something]'),
],
invalid: [
testCase('i18n.ts.not', 1),
testCase('i18n.tsx.deep.not', 1),
testCase('i18n.tsx.deep.not({x:12})', 1),
testCase('i18n.tsx.top({x:1})', 1),
testCase('i18n.ts.foo.baz', 1),
testCase('i18n.tsx.foo.baz', 1),
testCase('i18n.tsx.foo.baz({y:2})', 2),
testCaseVue('<template><p>{{ i18n.ts.not }}</p></template>', 1),
testCaseVue('<template><I18n :src="i18n.ts.not"/></template>', 1),
],
},
);

41
idea/MkDisableSection.vue Normal file
View file

@ -0,0 +1,41 @@
<!--
SPDX-FileCopyrightText: syuilo and misskey-project
SPDX-License-Identifier: AGPL-3.0-only
-->
<template>
<div :class="[$style.root]">
<div :inert="disabled" :class="[{ [$style.disabled]: disabled }]">
<slot></slot>
</div>
<div v-if="disabled" :class="[$style.cover]"></div>
</div>
</template>
<script lang="ts" setup>
defineProps<{
disabled?: boolean;
}>();
</script>
<style lang="scss" module>
.root {
position: relative;
}
.disabled {
opacity: 0.7;
}
.cover {
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
cursor: not-allowed;
--color: color(from var(--error) srgb r g b / 0.25);
background-size: auto auto;
background-image: repeating-linear-gradient(135deg, transparent, transparent 10px, var(--color) 4px, var(--color) 14px);
}
</style>

1
idea/README.md Normal file
View file

@ -0,0 +1 @@
使われなくなったけど消すのは勿体ない(将来使えるかもしれない)コードを入れておくとこ

View file

@ -626,10 +626,7 @@ abuseReported: "أُرسل البلاغ، شكرًا لك"
reporter: "المُبلّغ"
reporteeOrigin: "أصل البلاغ"
reporterOrigin: "أصل المُبلّغ"
forwardReport: "وجّه البلاغ إلى المثيل البعيد"
forwardReportIsAnonymous: "في المثيل البعيد سيظهر المبلّغ كحساب مجهول."
send: "أرسل"
abuseMarkAsResolved: "علّم البلاغ كمحلول"
openInNewTab: "افتح في لسان جديد"
defaultNavigationBehaviour: "سلوك الملاحة الافتراضي"
editTheseSettingsMayBreakAccount: "تعديل هذه الإعدادات قد يسبب عطبًا لحسابك"
@ -1255,7 +1252,6 @@ _theme:
buttonBg: "خلفية الأزرار"
buttonHoverBg: "خلفية الأزرار (عند التمرير فوقها)"
inputBorder: "حواف حقل الإدخال"
listItemHoverBg: "خلفية عناصر القائمة (عند التمرير فوقها)"
driveFolderBg: "خلفية مجلد قرص التخزين"
messageBg: "خلفية المحادثة"
_sfx:
@ -1533,6 +1529,7 @@ _notification:
reaction: "التفاعل"
receiveFollowRequest: "طلبات المتابعة"
followRequestAccepted: "طلبات المتابعة المقبولة"
login: "لِج"
app: "إشعارات التطبيقات المرتبطة"
_actions:
followBack: "تابعك بالمثل"

View file

@ -451,7 +451,6 @@ or: "অথবা"
language: "ভাষা"
uiLanguage: "UI এর ভাষা"
aboutX: "{x} সম্পর্কে"
disableDrawer: "ড্রয়ার মেনু প্রদর্শন করবেন না"
noHistory: "কোনো ইতিহাস নেই"
signinHistory: "প্রবেশ করার ইতিহাস"
doing: "প্রক্রিয়া করছে..."
@ -625,10 +624,7 @@ abuseReported: "আপনার অভিযোগটি দাখিল কর
reporter: "অভিযোগকারী"
reporteeOrigin: "অভিযোগটির উৎস"
reporterOrigin: "অভিযোগকারীর উৎস"
forwardReport: "রিমোট ইন্সত্যান্সে অভিযোগটি পাঠান"
forwardReportIsAnonymous: "আপনার তথ্য রিমোট ইন্সত্যান্সে পাঠানো হবে না এবং একটি বেনামী সিস্টেম অ্যাকাউন্ট হিসাবে প্রদর্শিত হবে।"
send: "পাঠান"
abuseMarkAsResolved: "অভিযোগটিকে সমাধাকৃত হিসাবে চিহ্নিত করুন"
openInNewTab: "নতুন ট্যাবে খুলুন"
openInSideView: "সাইড ভিউতে খুলুন"
defaultNavigationBehaviour: "ডিফল্ট নেভিগেশন"
@ -1021,7 +1017,6 @@ _theme:
buttonBg: "বাটনের পটভূমি"
buttonHoverBg: "বাটনের পটভূমি (হভার)"
inputBorder: "ইনপুট ফিল্ডের বর্ডার"
listItemHoverBg: "লিস্ট আইটেমের পটভূমি (হোভার)"
driveFolderBg: "ড্রাইভ ফোল্ডারের পটভূমি"
wallpaperOverlay: "ওয়ালপেপার ওভারলে"
badge: "ব্যাজ"
@ -1314,6 +1309,7 @@ _notification:
pollEnded: "পোল শেষ"
receiveFollowRequest: "প্রাপ্ত অনুসরণের অনুরোধসমূহ"
followRequestAccepted: "গৃহীত অনুসরণের অনুরোধসমূহ"
login: "প্রবেশ করুন"
app: "লিঙ্ক করা অ্যাপ থেকে বিজ্ঞপ্তি"
_actions:
followBack: "ফলো ব্যাক করেছে"

View file

@ -8,6 +8,8 @@ search: "Cercar"
notifications: "Notificacions"
username: "Nom d'usuari"
password: "Contrasenya"
initialPasswordForSetup: "Contrasenya inicial per la configuració inicial"
initialPasswordIsIncorrect: "La contrasenya no és correcta."
forgotPassword: "Contrasenya oblidada"
fetchingAsApObject: "Cercant en el Fediverse..."
ok: "OK"
@ -60,6 +62,7 @@ copyFileId: "Copiar ID d'arxiu"
copyFolderId: "Copiar ID de carpeta"
copyProfileUrl: "Copiar URL del perfil"
searchUser: "Cercar un usuari"
searchThisUsersNotes: "Cerca les publicacions de l'usuari"
reply: "Respondre"
loadMore: "Carregar més"
showMore: "Veure més"
@ -108,11 +111,14 @@ enterEmoji: "Introduir un emoji"
renote: "Impulsa"
unrenote: "Anul·la l'impuls"
renoted: "S'ha impulsat"
renotedToX: "Impulsat per {name}."
cantRenote: "No es pot impulsar aquesta publicació"
cantReRenote: "No es pot impulsar l'impuls."
quote: "Cita"
inChannelRenote: "Renotar només al Canal"
inChannelQuote: "Citar només al Canal"
renoteToChannel: "Impulsa a un canal"
renoteToOtherChannel: "Impulsa a un altre canal"
pinnedNote: "Nota fixada"
pinned: "Fixar al perfil"
you: "Tu"
@ -151,6 +157,7 @@ editList: "Editar llista"
selectChannel: "Selecciona un canal"
selectAntenna: "Tria una antena"
editAntenna: "Modificar antena"
createAntenna: "Crea una antena"
selectWidget: "Triar un giny"
editWidgets: "Editar ginys"
editWidgetsExit: "Fet"
@ -177,6 +184,10 @@ addAccount: "Afegeix un compte"
reloadAccountsList: "Recarregar la llista de contactes"
loginFailed: "S'ha produït un error al accedir."
showOnRemote: "Navega més en el perfil original"
continueOnRemote: "Veure perfil original"
chooseServerOnMisskeyHub: "Escull un servidor des del Hub de Misskey"
specifyServerHost: "Especifica un servidor directament"
inputHostName: "Introdueix el domini"
general: "General"
wallpaper: "Fons de Pantalla"
setWallpaper: "Defineix el fons de pantalla"
@ -187,6 +198,7 @@ followConfirm: "Estàs segur que vols deixar de seguir {name}?"
proxyAccount: "Compte de proxy"
proxyAccountDescription: "Un compte proxy és un compte que actua com a seguidor remot per als usuaris en determinades condicions. Per exemple, quan un usuari afegeix un usuari remot a la llista, l'activitat de l'usuari remot no es lliurarà al servidor si cap usuari local segueix aquest usuari, de manera que el compte proxy el seguirà."
host: "Amfitrió"
selectSelf: "Escollir manualment"
selectUser: "Selecciona usuari/a"
recipient: "Destinatari"
annotation: "Comentaris"
@ -202,6 +214,7 @@ perDay: "Per dia"
stopActivityDelivery: "Deixa d'enviar activitats"
blockThisInstance: "Deixa d'enviar activitats"
silenceThisInstance: "Silencia aquesta instància "
mediaSilenceThisInstance: "Silenciar els arxius d'aquesta instància "
operations: "Accions"
software: "Programari"
version: "Versió"
@ -223,6 +236,10 @@ blockedInstances: "Instàncies bloquejades"
blockedInstancesDescription: "Llista els enllaços d'amfitrió de les instàncies que vols bloquejar separades per un salt de pàgina. Les instàncies llistades no podran comunicar-se amb aquesta instància."
silencedInstances: "Instàncies silenciades"
silencedInstancesDescription: "Llista els enllaços d'amfitrió de les instàncies que vols silenciar. Tots els comptes de les instàncies llistades s'establiran com silenciades i només podran fer sol·licitacions de seguiment, i no podran mencionar als comptes locals si no els segueixen. Això no afectarà les instàncies bloquejades."
mediaSilencedInstances: "Instàncies amb els arxius silenciats"
mediaSilencedInstancesDescription: "Llista els noms dels servidors que vulguis silenciar els arxius, un servidor per línia. Tots els comptes que pertanyin als servidors llistats seran tractats com sensibles i no podran fer servir emojis personalitzats. Això no tindrà efecte sobre els servidors blocats."
federationAllowedHosts: "Llista de servidors federats"
federationAllowedHostsDescription: "Llista dels servidors amb els quals es federa."
muteAndBlock: "Silencia i bloca"
mutedUsers: "Usuaris silenciats"
blockedUsers: "Usuaris bloquejats"
@ -313,6 +330,7 @@ selectFile: "Selecciona fitxers"
selectFiles: "Selecciona fitxers"
selectFolder: "Selecció de carpeta"
selectFolders: "Selecció de carpeta"
fileNotSelected: "Cap fitxer seleccionat"
renameFile: "Canvia el nom del fitxer"
folderName: "Nom de la carpeta"
createFolder: "Crea una carpeta"
@ -320,6 +338,7 @@ renameFolder: "Canvia el nom de la carpeta"
deleteFolder: "Elimina la carpeta"
folder: "Carpeta "
addFile: "Afegeix un fitxer"
showFile: "Mostrar fitxer"
emptyDrive: "La teva unitat és buida"
emptyFolder: "La carpeta està buida"
unableToDelete: "No es pot eliminar"
@ -434,6 +453,7 @@ totpDescription: "Escriu una contrasenya d'un sol us fent servir l'aplicació d'
moderator: "Moderador/a"
moderation: "Moderació"
moderationNote: "Nota de moderació "
moderationNoteDescription: "Pots escriure notes que es compartiran entre els moderadors."
addModerationNote: "Afegir una nota de moderació "
moderationLogs: "Registre de moderació "
nUsersMentioned: "{n} usuaris mencionats"
@ -468,10 +488,12 @@ retype: "Torneu a introduir-la"
noteOf: "Publicació de: {user}"
quoteAttached: "Frase adjunta"
quoteQuestion: "Vols annexar-la com a cita?"
attachAsFileQuestion: "El text copiat és massa llarg. Vols adjuntar-lo com un fitxer de text?"
noMessagesYet: "Encara no hi ha missatges"
newMessageExists: "Has rebut un nou missatge"
onlyOneFileCanBeAttached: "Només pots adjuntar un fitxer a un missatge"
signinRequired: "Si us plau, Registra't o inicia la sessió abans de continuar"
signinOrContinueOnRemote: "Per continuar necessites moure el teu servidor o registrar-te / iniciar sessió en aquest servidor."
invitations: "Convida"
invitationCode: "Codi d'invitació"
checking: "Comprovació en curs..."
@ -493,7 +515,10 @@ uiLanguage: "Idioma de l'interfície"
aboutX: "Respecte a {x}"
emojiStyle: "Estil d'emoji"
native: "Nadiu"
disableDrawer: "No mostrar els menús en calaixos"
menuStyle: "Estil de menú"
style: "Estil"
drawer: "Calaix"
popup: "Emergent"
showNoteActionsOnlyHover: "Només mostra accions de la nota en passar amb el cursor"
showReactionsCount: "Mostra el nombre de reaccions a les publicacions"
noHistory: "No hi ha un registre previ"
@ -540,10 +565,10 @@ objectStorageRegion: "Regió "
objectStorageRegionDesc: "Especifica una regió com 'xx-east-1'. Si el teu servei no diferència regions has de posar 'us-east-1'. Deixa'l buit si fas servir variables d'entorn o un arxiu de configuració d'AWS."
objectStorageUseSSL: "Fes servir SSL"
objectStorageUseSSLDesc: "Desactiva'l si no tens pensat fer servir HTTPS per les connexions de l'API"
objectStorageUseProxy: "Connectar-se mitjançant un Proxy"
objectStorageUseProxy: "Connectar-se mitjançant un Proxy"
objectStorageUseProxyDesc: "Desactiva'l si no faràs servir un Proxy per les connexions de l'API"
objectStorageSetPublicRead: "Configurar les pujades com públiques "
s3ForcePathStyleDesc: "Si s3ForcePathStyle es troba activat el nom del dipòsit s'ha d'incloure a l'adreça URL en comtes del nom del host. Potser que necessitis activar-ho quan facis servir, per exemple, Minio a un servidor propi."
s3ForcePathStyleDesc: "Si s3ForcePathStyle es troba activat el nom del cubell s'haurà d'especificar com a part de l'adreça URL en comptes del nom del servidor. Podria ser que necessitis activar aquesta opció quan facis servir serveis com ara l'allotjament a un servidor propi."
serverLogs: "Registres del servidor"
deleteAll: "Elimina-ho tot"
showFixedPostForm: "Mostrar el formulari per escriure a l'inici de la línia de temps"
@ -576,6 +601,8 @@ ascendingOrder: "Ascendent"
descendingOrder: "Descendent"
scratchpad: "Bloc de proves"
scratchpadDescription: "El bloc de proves proporciona un entorn experimental per AiScript. Pot escriure i verificar els resultats que interactuen amb Misskey."
uiInspector: "Inspector de la interfície"
uiInspectorDescription: "Podeu visualitzar una llista d'elements UI presents en la memòria. Els components de la interfície d'usuari són generats per les funcions Ui:C:."
output: "Sortida"
script: "Script"
disablePagesScript: "Desactivar AiScript a les pàgines "
@ -692,10 +719,7 @@ abuseReported: "La teva denúncia s'ha enviat. Moltes gràcies."
reporter: "Denunciant "
reporteeOrigin: "Origen de la denúncia "
reporterOrigin: "Origen del denunciant"
forwardReport: "Transferir la denúncia a una instància remota"
forwardReportIsAnonymous: "En lloc del teu compte, es farà servir un compte anònim com a denunciant al servidor remot."
send: "Envia"
abuseMarkAsResolved: "Marca la denúncia com a resolta"
openInNewTab: "Obre a una pestanya nova"
openInSideView: "Obre a una vista lateral"
defaultNavigationBehaviour: "Navegació per defecte"
@ -832,6 +856,7 @@ administration: "Administració"
accounts: "Comptes"
switch: "Canvia"
noMaintainerInformationWarning: "La informació de l'administrador no s'ha configurat"
noInquiryUrlWarning: "No s'ha desat l'URL de consulta."
noBotProtectionWarning: "La protecció contra bots no s'ha configurat."
configure: "Configurar"
postToGallery: "Crear una nova publicació a la galeria"
@ -896,6 +921,7 @@ followersVisibility: "Visibilitat dels seguidors"
continueThread: "Veure la continuació del fil"
deleteAccountConfirm: "Això eliminarà el teu compte irreversiblement. Procedir?"
incorrectPassword: "Contrasenya incorrecta."
incorrectTotp: "La contrasenya no és correcta, o ha caducat."
voteConfirm: "Confirma el teu vot \"{choice}\""
hide: "Amagar"
useDrawerReactionPickerForMobile: "Mostrar el selector de reaccions com un calaix al mòbil "
@ -1021,6 +1047,7 @@ thisPostMayBeAnnoyingHome: "Publicar a la línia de temps d'Inici"
thisPostMayBeAnnoyingCancel: "Cancel·lar "
thisPostMayBeAnnoyingIgnore: "Publicar de totes maneres"
collapseRenotes: "Col·lapsar les renotes que ja has vist"
collapseRenotesDescription: "Col·lapse les notes a les quals ja has reaccionat o que ja has renotat"
internalServerError: "Error intern del servidor"
internalServerErrorDescription: "El servidor ha fallat de manera inexplicable."
copyErrorInfo: "Copiar la informació de l'error "
@ -1094,6 +1121,8 @@ preservedUsernames: "Noms d'usuaris reservats"
preservedUsernamesDescription: "Llistat de noms d'usuaris que no es poden fer servir separats per salts de linia. Aquests noms d'usuaris no estaran disponibles quan es creï un compte d'usuari normal, però els administradors els poden fer servir per crear comptes manualment. Per altre banda els comptes ja creats amb aquests noms d'usuari no es veure'n afectats."
createNoteFromTheFile: "Compon una nota des d'aquest fitxer"
archive: "Arxiu"
archived: "Arxivat"
unarchive: "Desarxivar"
channelArchiveConfirmTitle: "Vols arxivar {name}?"
channelArchiveConfirmDescription: "Un Canal arxivat no apareixerà a la llista de canals o als resultats de cerca. Tampoc es poden afegir noves entrades."
thisChannelArchived: "Aquest Canal ha sigut arxivat."
@ -1104,6 +1133,9 @@ preventAiLearning: "Descartar l'ús d'aprenentatge automàtic (IA Generativa)"
preventAiLearningDescription: "Demanar els indexadors no fer servir els texts, imatges, etc. en cap conjunt de dades per alimentar l'aprenentatge automàtic (IA Predictiva/ Generativa). Això s'aconsegueix afegint la etiqueta \"noai\" com a resposta HTML al contingut corresponent. Prevenir aquest ús totalment pot ser que no sigui aconseguit, ja que molts indexadors poden obviar aquesta etiqueta."
options: "Opcions"
specifyUser: "Especificar usuari"
lookupConfirm: "Vols fer una cerca?"
openTagPageConfirm: "Vols obrir una pàgina d'etiquetes?"
specifyHost: "Especifica un servidor"
failedToPreviewUrl: "Vista prèvia no disponible"
update: "Actualitzar"
rolesThatCanBeUsedThisEmojiAsReaction: "Rols que poden fer servir aquest emoji com a reacció "
@ -1146,7 +1178,7 @@ currentAnnouncements: "Informes actuals"
pastAnnouncements: "Informes passats"
youHaveUnreadAnnouncements: "Tens informes per llegir."
useSecurityKey: "Segueix les instruccions del teu navegador O dispositiu per fer servir el teu passkey."
replies: "Respostes"
replies: "Respondre"
renotes: "Impulsa"
loadReplies: "Mostrar les respostes"
loadConversation: "Mostrar la conversació "
@ -1172,7 +1204,10 @@ confirmShowRepliesAll: "Aquesta opció no té marxa enrere. Vols mostrar les tev
confirmHideRepliesAll: "Aquesta opció no té marxa enrere. Vols ocultar les teves respostes a tots els usuaris que segueixes a la línia de temps?"
externalServices: "Serveis externs"
sourceCode: "Codi font"
sourceCodeIsNotYetProvided: "El codi font encara no es troba disponible. Contacta amb l'administrador per solucionar aquest problema."
repositoryUrl: "URL del repositori"
repositoryUrlDescription: "Si estàs fent servir Misskey tal com és (sense cap canvi al codi font), introdueix https://github.com/misskey-dev/misskey"
repositoryUrlOrTarballRequired: "Si no ofereixes cap repositori, publica un fitxer tarball. Dona una ullada a .config/example.yml per a més informació."
feedback: "Opinió"
feedbackUrl: "URL per a opinar"
impressum: "Impressum"
@ -1211,6 +1246,7 @@ showReplay: "Veure reproducció"
replay: "Reproduir"
replaying: "Reproduint"
endReplay: "Tanca la redifusió"
copyReplayData: "Copia les dades de la resposta"
ranking: "Classificació"
lastNDays: "Últims {n} dies"
backToTitle: "Torna al títol"
@ -1224,12 +1260,60 @@ gameRetry: "Torna a provar"
notUsePleaseLeaveBlank: "Si no voleu usar-ho, deixeu-ho en blanc"
useTotp: "Usa una contrasenya d'un sol ús"
useBackupCode: "Usa un codi de recuperació"
launchApp: "Inicia l'aplicació "
useNativeUIForVideoAudioPlayer: "Fes servir la UI del navegador quan reprodueixis vídeo i àudio "
keepOriginalFilename: "Desa el nom del fitxer original"
keepOriginalFilenameDescription: "Si desactives aquesta opció els noms dels fitxers se substituiran per una cadena aleatòria quan carreguis nous fitxers de forma automàtica."
noDescription: "No hi ha una descripció "
alwaysConfirmFollow: "Confirma sempre els seguiments"
inquiry: "Contacte"
tryAgain: "Intenta-ho més tard."
confirmWhenRevealingSensitiveMedia: "Confirmació quan revelis contingut sensible "
sensitiveMediaRevealConfirm: "Aquest contingut potser sensible. Segur que ho vols revelar?"
createdLists: "Llistes creades "
createdAntennas: "Antenes creades"
fromX: "De {x}"
genEmbedCode: "Obtenir el codi per incrustar"
noteOfThisUser: "Notes d'aquest usuari"
clipNoteLimitExceeded: "No es poden afegir més notes a aquest clip."
performance: "Rendiment"
modified: "Modificat"
discard: "Descarta"
thereAreNChanges: "Hi ha(n) {n} canvi(s)"
signinWithPasskey: "Inicia sessió amb Passkey"
unknownWebAuthnKey: "Passkey desconeguda"
passkeyVerificationFailed: "La verificació a fallat"
passkeyVerificationSucceededButPasswordlessLoginDisabled: "La verificació de la passkey a estat correcta, però s'ha deshabilitat l'inici de sessió sense contrasenya."
messageToFollower: "Missatge als meus seguidors"
target: "Assumpte "
testCaptchaWarning: "És una característica dissenyada per a la prova de CAPTCHA. <strong>No l'utilitzes en l'entorn real.</strong>"
_abuseUserReport:
forward: "Reenviar "
forwardDescription: "Reenvia l'informe a una altra instància com un compte del sistema anònima."
resolve: "Solució "
accept: "Acceptar "
reject: "Rebutjar"
resolveTutorial: "Si l'informe és legítim selecciona \"Acceptar\" per resoldre'l positivament. Però si l'informe no és legítim selecciona \"Rebutjar\" per resoldre'l negativament."
_delivery:
status: "Estat d'entrega "
stop: "Suspés"
resume: "Torna a enviar"
_type:
none: "S'està publicant"
manuallySuspended: "Suspendre manualment"
goneSuspended: "Servidor suspès perquè el servidor s'ha esborrat"
autoSuspendedForNotResponding: "Servidor suspès perquè el servidor no respon"
_bubbleGame:
howToPlay: "Com es juga"
hold: "Mantenir"
_score:
score: "Puntuació "
scoreYen: "Diners guanyats"
highScore: "Millor puntuació "
maxChain: "Nombre màxim de combos"
yen: "{yen}Ien"
estimatedQty: "{qty}peces"
scoreSweets: "{onigiriQtyWithUnit}ongiris"
_howToPlay:
section1: "Ajusta la posició i deixa caure l'objecte dintre la caixa."
section2: "Quan dos objectes del mateix tipus es toquen, canviaran en un objecte diferent i guanyares punts."
@ -1281,10 +1365,10 @@ _initialTutorial:
_reaction:
title: "Què són les Reaccions?"
description: "Es poden reaccionar a les Notes amb diferents emoticones. Les reaccions et permeten expressar matisos que hi són més enllà d'un simple m'agrada."
letsTryReacting: "Es poden afegir reaccions fent clic al botó '{reaction}'. Prova reaccionant a aquesta nota!"
letsTryReacting: "Es poden afegir reaccions fent clic al botó '+'. Prova reaccionant a aquesta nota!"
reactToContinue: "Afegeix una reacció per continuar."
reactNotification: "Rebràs notificacions en temps real quan un usuari reaccioni a les teves notes."
reactDone: "Pots desfer una reacció fent clic al botó '{undo}'."
reactDone: "Pots desfer una reacció fent clic al botó '-'."
_timeline:
title: "El concepte de les línies de temps"
description1: "Misskey mostra diferents línies de temps basades en l'ús (algunes poden no estar disponibles depenent de la política del servidor)"
@ -1344,6 +1428,10 @@ _serverSettings:
fanoutTimelineDescription: "Quan es troba activat millora bastant el rendiment quan es recuperen les línies de temps i redueix la carrega de la base de dades. Com a contrapunt, l'ús de memòria de Redis es veurà incrementada. Considera d'estabilitat aquesta opció en cas de tenir un servidor amb poca memòria o si tens problemes de inestabilitat."
fanoutTimelineDbFallback: "Carregar de la base de dades"
fanoutTimelineDbFallbackDescription: "Quan s'activa, la línia de temps fa servir la base de dades per consultes adicionals si la línia de temps no es troba a la memòria cau. Si és desactiva la càrrega del servidor és veure reduïda, però també és reduirà el nombre de línies de temps que és poden obtenir."
reactionsBufferingDescription: "Quan s'activa aquesta opció millora bastant el rendiment en recuperar les línies de temps reduint la càrrega de la base. Com a contrapunt, augmentarà l'ús de memòria de Redís. Desactiva aquesta opció en cas de tenir un servidor amb poca memòria o si tens problemes d'inestabilitat."
inquiryUrl: "URL de consulta "
inquiryUrlDescription: "Escriu adreça URL per al formulari de consulta per al mantenidor del servidor o una pàgina web amb el contacte d'informació."
thisSettingWillAutomaticallyOffWhenModeratorsInactive: "Si no es detecta activitat per part del moderador durant un període de temps, aquesta opció es desactiva automàticament per evitar el correu brossa."
_accountMigration:
moveFrom: "Migrar un altre compte a aquest"
moveFromSub: "Crear un àlies per un altre compte"
@ -1651,6 +1739,7 @@ _role:
gtlAvailable: "Pot veure la línia de temps global"
ltlAvailable: "Pot veure la línia de temps local"
canPublicNote: "Pot enviar notes públiques"
mentionMax: "Nombre màxim de mencions a una nota"
canInvite: "Pot crear invitacions a la instància "
inviteLimit: "Límit d'invitacions "
inviteLimitCycle: "Temps de refresc de les invitacions"
@ -1659,6 +1748,7 @@ _role:
canManageAvatarDecorations: "Gestiona les decoracions dels avatars "
driveCapacity: "Capacitat del disc"
alwaysMarkNsfw: "Marca sempre els fitxers com a sensibles"
canUpdateBioMedia: "Permet l'edició d'una icona o un bàner"
pinMax: "Nombre màxim de notes fixades"
antennaMax: "Nombre màxim d'antenes"
wordMuteMax: "Nombre màxim de caràcters permesos a les paraules silenciades"
@ -1673,9 +1763,20 @@ _role:
canSearchNotes: "Pot cercar notes"
canUseTranslator: "Pot fer servir el traductor"
avatarDecorationLimit: "Nombre màxim de decoracions que es poden aplicar els avatars"
canImportAntennas: "Autoritza la importació d'antenes "
canImportBlocking: "Autoritza la importació de bloquejats"
canImportFollowing: "Autoritza la importació de seguidors"
canImportMuting: "Autoritza la importació de silenciats"
canImportUserLists: "Autoritza la importació de llistes d'usuaris "
_condition:
roleAssignedTo: "Assignat a rols manuals"
isLocal: "Usuari local"
isRemote: "Usuari remot"
isCat: "Usuaris gats"
isBot: "Usuaris bots"
isSuspended: "Usuari suspès"
isLocked: "Comptes privats"
isExplorable: "Fes que el compte aparegui a les cerques"
createdLessThan: "Han passat menys de X a passat des de la creació del compte"
createdMoreThan: "Han passat més de X des de la creació del compte"
followersLessThanOrEq: "Té menys de X seguidors"
@ -1739,12 +1840,13 @@ _email:
_follow:
title: "t'ha seguit"
_receiveFollowRequest:
title: "Has rebut una sol·licitud de seguiment"
title: "Has rebut una sol·licitud de seguiment"
_plugin:
install: "Instal·lar un afegit "
installWarn: "Si us plau, no instal·lis afegits que no siguin de confiança."
manage: "Gestionar els afegits"
viewSource: "Veure l'origen "
viewLog: "Mostra el registre"
_preferencesBackups:
list: "Llista de còpies de seguretat"
saveNew: "Fer una còpia de seguretat nova"
@ -1774,6 +1876,8 @@ _aboutMisskey:
contributors: "Col·laboradors principals"
allContributors: "Tots els col·laboradors "
source: "Codi font"
original: "Original"
thisIsModifiedVersion: "En {name} fa servir una versió modificada de Misskey."
translation: "Tradueix Misskey"
donate: "Fes un donatiu a Misskey"
morePatrons: "També agraïm el suport d'altres col·laboradors que no surten en aquesta llista. Gràcies! 🥰"
@ -1881,7 +1985,6 @@ _theme:
buttonBg: "Fons botó "
buttonHoverBg: "Fons botó (en passar-hi per sobre)"
inputBorder: "Contorn del cap d'introducció "
listItemHoverBg: "Fons dels elements d'una llista"
driveFolderBg: "Fons de la carpeta Disc"
wallpaperOverlay: "Superposició del fons de pantalla "
badge: "Insígnia "
@ -1901,6 +2004,7 @@ _soundSettings:
driveFileTypeWarnDescription: "Seleccionar un fitxer d'àudio "
driveFileDurationWarn: "L'àudio és massa llarg"
driveFileDurationWarnDescription: "Els àudios molt llargs pot interrompre l'ús de Misskey. Vols continuar?"
driveFileError: "El so no es pot carregar. Canvia la configuració"
_ago:
future: "Futur "
justNow: "Ara mateix"
@ -1953,6 +2057,7 @@ _2fa:
backupCodesDescription: "Si l'aplicació d'autenticació no es pot utilitzar, es pot accedir al compte utilitzant els següents codis de còpia de seguretat. Assegura't de mantenir aquests codis en un lloc segur. Cada codi es pot utilitzar només una vegada."
backupCodeUsedWarning: "Es va utilitzar un codi de còpia de seguretat. Si l'aplicació de certificació està disponible, reconfigura l'aplicació d'autenticació tan aviat com sigui possible."
backupCodesExhaustedWarning: "Es van utilitzar tots els codis de còpia de seguretat. Si no es pot utilitzar l'aplicació d'autenticació, ja no es pot accedir al compte. Torna a registrar l'aplicació d'autenticació."
moreDetailedGuideHere: "Aquí tens una guia al detall"
_permissions:
"read:account": "Veure la informació del compte."
"write:account": "Editar la informació del compte."
@ -2026,22 +2131,73 @@ _permissions:
"read:admin:emoji": "Veure emojis"
"write:admin:queue": "Gestionar la cua de feines"
"read:admin:queue": "Veure la cua de feines"
"write:admin:promo": "Gestiona les notes promocionals"
"write:admin:drive": "Gestiona el disc de l'usuari"
"read:admin:drive": "Veure la informació del disc de l'usuari"
"read:admin:stream": "Fes servir l'API sobre Websocket per l'administració"
"write:admin:ad": "Gestiona la publicitat"
"read:admin:ad": "Veure anuncis"
"write:invite-codes": "Crear codis d'invitació"
"read:invite-codes": "Obtenir codis d'invitació"
"write:clip-favorite": "Gestionar els clips favorits"
"read:clip-favorite": "Veure clips favorits"
"read:federation": "Veure dades de federació"
"write:report-abuse": "Informar d'un abús"
_auth:
shareAccessTitle: "Concedeix permisos a l'aplicació"
shareAccess: "Vols que {name} pugui accedir al vostre compte?"
shareAccessAsk: "Segur que vols que aquesta aplicació pugui accedir al vostre compte?"
permission: "{name} demana els següents permisos"
permissionAsk: "Aquesta aplicació demana els següents permisos"
pleaseGoBack: "Si us plau, torna a l'aplicació"
callback: "Tornant a l'aplicació"
denied: "Accés denegat"
pleaseLogin: "Si us plau, identificat per autoritzar l'aplicació."
_antennaSources:
all: "Totes les publicacions"
homeTimeline: "Publicacions dels usuaris seguits"
users: "Publicacions d'usuaris específics"
userList: "Publicacions d'una llista d'usuaris"
userBlacklist: "Totes les notes excepte les d'un o alguns usuaris especificats"
_weekday:
sunday: "Diumenge"
monday: "Dilluns"
tuesday: "Dimarts"
wednesday: "Dimecres"
thursday: "Dijous"
friday: "Divendres"
saturday: "Dissabte"
_widgets:
profile: "Perfil"
instanceInfo: "Informació del fitxer d'instal·lació"
memo: "Notes adhesives"
notifications: "Notificacions"
timeline: "Línia de temps"
calendar: "Calendari"
trends: "Tendència"
clock: "Rellotge"
rss: "Lector RSS"
rssTicker: "RSS ticker"
activity: "Activitat"
photos: "Fotografies"
digitalClock: "Rellotge digital"
unixClock: "Rellotge UNIX"
federation: "Federació"
instanceCloud: "Núvol d'instàncies"
postForm: "Formulari de publicació"
slideshow: "Presentació"
button: "Botó "
onlineUsers: "Usuaris actius"
jobQueue: "Cua de tasques"
serverMetric: "Mètriques del servidor"
aiscript: "Consola AiScript"
aiscriptApp: "Aplicació AiScript"
aichan: "Ai"
userList: "Llistat d'usuaris"
_userList:
chooseList: "Tria una llista"
clicker: "Clicker"
birthdayFollowings: "Usuaris que fan l'aniversari avui"
_cw:
hide: "Amagar"
show: "Carregar més"
@ -2105,27 +2261,79 @@ _profile:
changeBanner: "Canviar el bàner "
verifiedLinkDescription: "Escrivint una adreça URL que enllaci a aquest perfil, una icona de propietat verificada es mostrarà al costat del camp."
avatarDecorationMax: "Pot afegir un màxim de {max} decoracions."
followedMessage: "Missatge als nous seguidors"
followedMessageDescription: "Es pot configurar un missatge curt que es mostra a l'altra persona quan comença a seguir-te."
followedMessageDescriptionForLockedAccount: "Si comencen a seguir-te es mostra un missatge de quan es permet aquesta sol·licitud. "
_exportOrImport:
allNotes: "Totes les publicacions"
favoritedNotes: "Notes preferides"
clips: "Retalls"
followingList: "Seguint"
muteList: "Silencia"
blockingList: "Bloqueja"
userLists: "Llistes"
excludeMutingUsers: "Exclou usuaris silenciats"
excludeInactiveUsers: "Exclou usuaris inactius"
withReplies: "Inclou a la línia de temps les respostes d'usuaris importats"
_charts:
federation: "Federació"
apRequest: "Peticions"
usersIncDec: "Diferència entre el nombre d'usuaris"
usersTotal: "Nombre total d'usuaris"
activeUsers: "Usuaris actius"
notesIncDec: "Diferència entre el nombre de notes"
localNotesIncDec: "Diferencia en el nombre de notes locals"
remoteNotesIncDec: "Diferencia en el nombre de notes remotes"
notesTotal: "Nombre total de notes"
filesIncDec: "Diferencia en el nombre de fitxers"
filesTotal: "Nombre total de fitxers"
storageUsageIncDec: "Diferencia en l'emmagatzematge usat"
storageUsageTotal: "Emmagatzematge usat"
_instanceCharts:
requests: "Peticions"
users: "Diferència entre el nombre d'usuaris"
usersTotal: "Usuaris totals acumulats"
notes: "Diferència entre el nombre de notes"
notesTotal: "Notes totals acumulades"
ff: "Diferència en nombre d'usuaris seguits / seguidors"
ffTotal: "Nombre total acumulat d'usuaris seguits / seguidors"
cacheSize: "Diferència a la mida de la memòria cau"
cacheSizeTotal: "Total acumulat de la mida de la memòria cau"
files: "Diferència al nombre d'arxius"
filesTotal: "Nombre acumulatiu de fitxers"
_timelines:
home: "Inici"
local: "Local"
social: "Social"
global: "Global"
_play:
new: "Crear un guió"
edit: "Editar guió"
created: "Guió creat"
updated: "Guió editat"
deleted: "Guió esborrat"
pageSetting: "Configuració del guió"
editThisPage: "Edita aquest guió"
viewSource: "Veure l'origen "
my: "Els meus guions"
liked: "Guions que m'han agradat"
featured: "Popular"
title: "Títol "
script: "Script"
summary: "Descripció"
visibilityDescription: ""
_pages:
newPage: "pa"
editPage: "Editar la pàgina"
readPage: "Veure el codi font d'aquesta pàgina"
created: "La pàgina ha sigut creada correctament"
updated: "La pàgina s'ha editat correctament"
deleted: "La pàgina s'ha esborrat sense problemes"
pageSetting: "Configuració de la pàgina"
nameAlreadyExists: "L'adreça URL de la pàgina ja existeix"
invalidNameTitle: "L'adreça URL de la pàgina no és vàlida"
invalidNameText: "Assegurat que el títol de la pàgina no és buit"
editThisPage: "Editar la pàgina"
viewSource: "Veure l'origen "
viewPage: "Veure les teves pàgines "
like: "M'agrada "
@ -2148,6 +2356,7 @@ _pages:
eyeCatchingImageSet: "Escull una miniatura"
eyeCatchingImageRemove: "Esborrar la miniatura"
chooseBlock: "Afegeix un bloc"
enterSectionTitle: "Escriu el títol de la secció"
selectType: "Seleccionar tipus"
contentBlocks: "Contingut"
inputBlocks: "Entrada "
@ -2158,6 +2367,8 @@ _pages:
section: "Secció "
image: "Imatges"
button: "Botó "
dynamic: "Blocs dinàmics"
dynamicDescription: "Aquest bloc és antic. Ara en endavant fes servir {play}"
note: "Incorporar una Nota"
_note:
id: "ID de la publicació"
@ -2187,29 +2398,54 @@ _notification:
sendTestNotification: "Enviar notificació de prova"
notificationWillBeDisplayedLikeThis: "Les notificacions és veure'n així "
reactedBySomeUsers: "Han reaccionat {n} usuaris"
likedBySomeUsers: "A {n} usuaris els hi agrada la teva nota"
renotedBySomeUsers: "L'han impulsat {n} usuaris"
followedBySomeUsers: "Et segueixen {n} usuaris"
flushNotification: "Netejar notificacions"
exportOfXCompleted: "Completada l'exportació de {n}"
_types:
all: "Tots"
note: "Notes noves"
follow: "Seguint"
mention: "Menció"
reply: "Respostes"
renote: "Renotar"
quote: "Citar"
reaction: "Reaccions"
pollEnded: "Enquesta terminada"
receiveFollowRequest: "Rebuda una petició de seguiment"
followRequestAccepted: "Petició de seguiment acceptada"
roleAssigned: "Rol donat"
achievementEarned: "Assoliment desbloquejat"
exportCompleted: "Exportació completada"
login: "Iniciar sessió"
test: "Prova la notificació"
app: "Notificacions d'aplicacions"
_actions:
followBack: "t'ha seguit també"
reply: "Respondre"
renote: "Renotar"
_deck:
alwaysShowMainColumn: "Mostrar sempre la columna principal"
columnAlign: "Alinea les columnes"
addColumn: "Afig una columna"
newNoteNotificationSettings: "Configuració de notificacions per a notes noves"
configureColumn: "Configuració de columnes"
swapLeft: "Mou a lesquerra"
swapRight: "Mou a la dreta"
swapUp: "Mou cap amunt"
swapDown: "Mou cap avall"
stackLeft: "Pila a la columna esquerra"
popRight: "Col·loca a la dreta"
profile: "Perfil"
newProfile: "Perfil nou"
deleteProfile: "Elimina el perfil"
introduction: "Crea la interfície perfecta posant les columnes allà on vulguis!"
introduction2: "Fes clic al botó + de la dreta per afegir noves columnes sempre que vulguis."
widgetsIntroduction: "Selecciona \"Editar ginys\" a la columna del menú i afegeix un."
useSimpleUiForNonRootPages: "Usa una interfície senzilla per a les pàgines navegades"
usedAsMinWidthWhenFlexible: "L'amplada mínima es farà servir quan \"Ajust automàtic de l'amplada\" estigui activat"
flexible: "Ajust automàtic de l'amplada"
_columns:
main: "Principal"
widgets: "Ginys"
@ -2220,21 +2456,82 @@ _deck:
channel: "Canals"
mentions: "Mencions"
direct: "Publicacions directes"
roleTimeline: "Línia de temps dels rols"
_dialog:
charactersExceeded: "Has arribat al màxim de caràcters! Actualment és {current} de {max}"
charactersBelow: "Ets per sota del mínim de caràcters! Actualment és {current} de {min}"
_disabledTimeline:
title: "Línia de tems desactivada"
description: "No pots fer servir aquesta línia de temps amb els teus rols actuals."
_drivecleaner:
orderBySizeDesc: "Mida del fitxer descendent"
orderByCreatedAtAsc: "Data ascendent"
_webhookSettings:
createWebhook: "Crear un Webhook"
modifyWebhook: "Modificar un Webhook"
name: "Nom"
secret: "Secret"
trigger: "Activador"
active: "Activat"
_events:
follow: "Quan se segueix a un usuari"
followed: "Quan et segueixen"
note: "Quan es publica una nota"
reply: "Quan es rep una resposta"
renote: "Quan es renoti"
reaction: "Quan es rep una reacció "
mention: "Quan et mencionen"
_systemEvents:
abuseReport: "Quan reps un nou informe de moderació "
abuseReportResolved: "Quan resols un informe de moderació "
userCreated: "Quan es crea un usuari"
deleteConfirm: "Segur que vols esborrar el webhook?"
testRemarks: "Si feu clic al botó a la dreta de l'interruptor, podeu enviar un webhook de prova amb dades dummy."
_abuseReport:
_notificationRecipient:
createRecipient: "Afegeix un destinatari a l'informe de moderació "
modifyRecipient: "Editar un destinatari en l'informe de moderació "
recipientType: "Tipus de notificació "
_recipientType:
mail: "Correu electrònic"
webhook: "Webhook"
_captions:
mail: "Enviar un correu electrònic a tots els moderadors quan es rep un informe de moderació "
webhook: "Enviar una notificació al SystemWebhook quan es rebi o es resolgui un informe de moderació "
keywords: "Paraules clau"
notifiedUser: "Usuaris que s'han de notificar "
notifiedWebhook: "Webhook que s'ha de fer servir"
deleteConfirm: "Segur que vols esborrar el destinatari de l'informe de moderació?"
_moderationLogTypes:
createRole: "Rol creat"
deleteRole: "Rol esborrat"
updateRole: "Rol actualitzat"
assignRole: "Assignat al rol"
unassignRole: "Esborrat del rol"
suspend: "Suspèn"
unsuspend: "Suspensió treta"
addCustomEmoji: "Afegit emoji personalitzat"
updateCustomEmoji: "Actualitzat emoji personalitzat"
deleteCustomEmoji: "Esborrat emoji personalitzat"
updateServerSettings: "Configuració del servidor actualitzada"
updateUserNote: "Nota de moderació actualitzada"
deleteDriveFile: "Fitxer esborrat"
deleteNote: "Nota esborrada"
createGlobalAnnouncement: "Anunci global creat"
createUserAnnouncement: "Anunci individual creat"
updateGlobalAnnouncement: "Anunci global actualitzat"
updateUserAnnouncement: "Anunci individual actualitzat "
deleteGlobalAnnouncement: "Anunci global esborrat"
deleteUserAnnouncement: "Anunci individual esborrat "
resetPassword: "Restableix la contrasenya"
suspendRemoteInstance: "Servidor remot suspès "
unsuspendRemoteInstance: "S'ha tret la suspensió del servidor remot"
updateRemoteInstanceNote: "Nota de moderació de la instància remota actualitzada"
markSensitiveDriveFile: "Fitxer marcat com a sensible"
unmarkSensitiveDriveFile: "S'ha tret la marca de sensible del fitxer"
resolveAbuseReport: "Informe resolt"
forwardAbuseReport: "Informe reenviat"
updateAbuseReportNote: "Nota de moderació d'un informe actualitzat"
createInvitation: "Crear codi d'invitació "
createAd: "Anunci creat"
deleteAd: "Anunci esborrat"
@ -2244,6 +2541,16 @@ _moderationLogTypes:
deleteAvatarDecoration: "S'ha esborrat la decoració de l'avatar "
unsetUserAvatar: "Esborrar l'avatar d'aquest usuari"
unsetUserBanner: "Esborrar el bàner d'aquest usuari"
createSystemWebhook: "Crear un SystemWebhook"
updateSystemWebhook: "Actualitzar SystemWebhook"
deleteSystemWebhook: "Esborrar SystemWebhook"
createAbuseReportNotificationRecipient: "Crear un destinatari per l'informe de moderació "
updateAbuseReportNotificationRecipient: "Actualitzar destinatari per l'informe de moderació "
deleteAbuseReportNotificationRecipient: "Esborrar destinatari de l'informe de moderació "
deleteAccount: "Esborrar el compte "
deletePage: "Esborrar la pàgina"
deleteFlash: "Esborrar el guió"
deleteGalleryPost: "Esborrar la publicació de la galeria"
_fileViewer:
title: "Detall del fitxer"
type: "Tipus de fitxer"
@ -2270,5 +2577,54 @@ _externalResourceInstaller:
_errors:
_invalidParams:
title: "Paràmetres no vàlids "
description: "No hi ha suficient informació per carregar les dades del lloc extern. Confirma l'URL que hi ha escrita."
_resourceTypeNotSupported:
title: "El recurs extern no està suportat."
description: "Aquesta mena de recurs no està suportat. Contacta amb l'administrador."
_failedToFetch:
title: "Ha fallat l'obtenció de dades"
fetchErrorDescription: "Ha aparegut un error comunicant-se amb el lloc extern. Si després d'intentar-ho un altre cop no es resol, contacta amb l'administrador."
parseErrorDescription: "Ha aparegut un error processant les dades carregades del lloc extern. Contacta amb l'administrador."
_hashUnmatched:
title: "Ha fallat la verificació de les dades"
description: "Ha aparegut un error verificant les dades obtingudes. Com a mesura de seguretat la instal·lació no pot continuar. Contacta amb l'administrador."
_pluginParseFailed:
title: "Error d'AiScript"
description: "Les dades sol·licitades s'han obtingut correctament, però hem trobat un error durant el processament d'AiScript. Contacta amb l'autor de l'afegit. Detalls de l'error es pot veure a la consola JavaScript."
_pluginInstallFailed:
title: "La instal·lació de l'afegit a fallat"
description: "Ha aparegut un error durant la instal·lació de l'afegit. Intenta-ho una altra vegada. El detall de l'error es pot veure a la consola JavaScript."
_themeParseFailed:
title: "Ha fallat el processament del tema"
description: "Les dades sol·licitades s'han obtingut correctament, però hem trobat un error durant el processament del tema. Contacta amb l'autor de l'afegit. Detalls de l'error es pot veure a la consola JavaScript."
_themeInstallFailed:
title: "La instal·lació del tema a fallat"
description: "Ha aparegut un error durant la instal·lació del tema. Intenta-ho una altra vegada. El detall de l'error es pot veure a la consola JavaScript."
_dataSaver:
_media:
title: "Carregant multimèdia "
description: "Desactiva la càrrega automàtica d'imatges i vídeos. Les imatges i els vídeos amagats es carregaran quan es faci clic a sobre."
_avatar:
title: "Avatars animats"
description: "Detenir l'animació dels avatars animats. Les imatges animades solen tenir un pes més gran que les imatges normals, reduint el tràfic disponible."
_urlPreview:
title: "Miniatures vista prèvia de l'URL"
description: "Les imatges en miniatura que serveixen com a vista prèvia de les URLs no es tornaran a carregar."
_code:
title: "Ressaltat del codi "
_reversi:
total: "Total"
_embedCodeGen:
title: "Personalitza el codi per incrustar"
header: "Mostrar la capçalera"
autoload: "Carregar automàticament (no recomanat)"
maxHeight: "Alçada màxima"
maxHeightDescription: "0 anul·la la configuració màxima. Per evitar que continuï creixent verticalment, especifiqui qualsevol valor."
maxHeightWarn: "El límit màxim d'alçada és nul (0). Si això no és un canvi previst, estableix el màxim d'alçada a un cert valor."
previewIsNotActual: "La visualització és diferent de la que es mostra quan s'implanta."
rounded: "Angle recte"
border: "Afegeix un marc al contenidor"
applyToPreview: "Aplica a la vista prèvia"
generateCode: "Crea el codi per incrustar"
codeGenerated: "Codi generat"
codeGeneratedDescription: "Si us plau, enganxeu el codi generat al lloc web."

View file

@ -471,7 +471,6 @@ uiLanguage: "Jazyk uživatelského rozhraní"
aboutX: "O {x}"
emojiStyle: "Styl emoji"
native: "Výchozí"
disableDrawer: "Nepoužívat šuplíkové menu"
showNoteActionsOnlyHover: "Zobrazit akce poznámky jenom při naběhnutí myši"
noHistory: "Žádná historie"
signinHistory: "Historie přihlášení"
@ -658,10 +657,7 @@ abuseReported: "Nahlášení bylo odesláno. Děkujeme převelice."
reporter: "Nahlásil"
reporteeOrigin: "Původ nahlášení"
reporterOrigin: "Původ nahlasovače"
forwardReport: "Přeposlat nahlášení do vzdálené instance"
forwardReportIsAnonymous: "Místo vašeho účtu se ve vzdálené instanci zobrazí anonymní systémový účet jako nahlašovač."
send: "Odeslat"
abuseMarkAsResolved: "Označit nahlášení jako vyřešené"
openInNewTab: "Otevřít v nové kartě"
openInSideView: "Otevřít v bočním panelu"
defaultNavigationBehaviour: "Výchozí chování navigace"
@ -1093,7 +1089,7 @@ doYouAgree: "Souhlasíte?"
beSureToReadThisAsItIsImportant: "Přečtěte si prosím tyto důležité informace."
iHaveReadXCarefullyAndAgree: "Přečetl jsem si text \"{x}\" a souhlasím s ním."
icon: "Avatar"
replies: "Odpovědi"
replies: "Odpovědět"
renotes: "Přeposlat"
sourceCode: "Zdrojový kód"
flip: "Otočit"
@ -1633,7 +1629,6 @@ _theme:
buttonBg: "Pozadí tlačítka"
buttonHoverBg: "Pozadí tlačítka (Hover)"
inputBorder: "Ohraničení vstupního pole"
listItemHoverBg: "Pozadí položky seznamu (Hover)"
driveFolderBg: "Pozadí složky disku"
wallpaperOverlay: "Překrytí tapety"
badge: "Odznak"
@ -1963,6 +1958,7 @@ _notification:
receiveFollowRequest: "Obdržené žádosti o sledování"
followRequestAccepted: "Přijaté žádosti o sledování"
achievementEarned: "Úspěch odemčen"
login: "Přihlásit se"
app: "Oznámení z propojených aplikací"
_actions:
followBack: "vás začal sledovat zpět"

View file

@ -1,8 +1,8 @@
---
_lang_: "Deutsch"
headlineMisskey: "Ein durch Notizen verbundenes Netzwerk"
introMisskey: "Willkommen! Sharkey ist eine dezentralisierte Open-Source Microblogging-Platform.\nVerfasse „Notizen“ um mitzuteilen, was gerade passiert oder um Ereignisse mit anderen zu teilen. 📡\nMit „Reaktionen“ kannst du außerdem schnell deine Gefühle über Notizen anderer Benutzer zum Ausdruck bringen. 👍\nEine neue Welt wartet auf dich! 🚀"
poweredByMisskeyDescription: "{name} ist einer der durch die Open-Source-Plattform <b>Sharkey</b> betriebenen Dienste die auf Misskey basiert ist (meist als \"Misskey-Instanz\" bezeichnet)."
introMisskey: "Willkommen! Misskey ist eine dezentralisierte Open-Source Microblogging-Platform.\nVerfasse „Notizen“ um mitzuteilen, was gerade passiert oder um Ereignisse mit anderen zu teilen. 📡\nMit „Reaktionen“ kannst du außerdem schnell deine Gefühle über Notizen anderer Benutzer zum Ausdruck bringen. 👍\nEine neue Welt wartet auf dich! 🚀"
poweredByMisskeyDescription: "{name} ist einer der durch die Open-Source-Plattform <b>Misskey</b> betriebenen Dienste."
monthAndDay: "{day}.{month}."
search: "Suchen"
notifications: "Benachrichtigungen"
@ -15,7 +15,7 @@ gotIt: "Verstanden!"
cancel: "Abbrechen"
noThankYou: "Nein, danke"
enterUsername: "Benutzername eingeben"
renotedBy: "Geboostet von {user}"
renotedBy: "Renote von {user}"
noNotes: "Keine Notizen gefunden"
noNotifications: "Keine Benachrichtigungen gefunden"
instance: "Instanz"
@ -105,13 +105,13 @@ followRequests: "Follow-Anfragen"
unfollow: "Entfolgen"
followRequestPending: "Follow-Anfrage ausstehend"
enterEmoji: "Gib ein Emoji ein"
renote: "Boost"
unrenote: "Boost zurücknehmen"
renoted: "Boost getätigt."
cantRenote: "Boosten dieses Beitrags nicht möglich."
cantReRenote: "Boosten von einen Boost nicht möglich."
renote: "Renote"
unrenote: "Renote zurücknehmen"
renoted: "Renote getätigt."
cantRenote: "Renote dieses Beitrags nicht möglich."
cantReRenote: "Renote einer Renote nicht möglich."
quote: "Zitieren"
inChannelRenote: "Kanal-interner Boost"
inChannelRenote: "Kanal-interner Renote"
inChannelQuote: "Kanal-internes Zitat"
pinnedNote: "Angeheftete Notiz"
pinned: "Angeheftet"
@ -166,7 +166,7 @@ youCanCleanRemoteFilesCache: "Klicke auf den 🗑️-Knopf der Dateiverwaltungsa
cacheRemoteSensitiveFiles: "Sensitive Dateien von fremden Instanzen im Cache speichern"
cacheRemoteSensitiveFilesDescription: "Ist diese Einstellung deaktiviert, so werden sensitive Dateien fremder Instanzen direkt von dort ohne Zwischenspeicherung geladen."
flagAsBot: "Als Bot markieren"
flagAsBotDescription: "Aktiviere diese Option, falls dieses Benutzerkonto durch ein Programm gesteuert wird. Falls aktiviert, agiert es als Flag für andere Entwickler zur Verhinderung von endlosen Kettenreaktionen mit anderen Bots und lässt Sharkeys interne Systeme dieses Benutzerkonto als Bot behandeln."
flagAsBotDescription: "Aktiviere diese Option, falls dieses Benutzerkonto durch ein Programm gesteuert wird. Falls aktiviert, agiert es als Flag für andere Entwickler zur Verhinderung von endlosen Kettenreaktionen mit anderen Bots und lässt Misskeys interne Systeme dieses Benutzerkonto als Bot behandeln."
flagAsCat: "Als Katze markieren"
flagAsCatDescription: "Aktiviere diese Option, um dieses Benutzerkonto als Katze zu markieren."
flagShowTimelineReplies: "Antworten in der Chronik anzeigen"
@ -229,7 +229,7 @@ noUsers: "Keine Benutzer gefunden"
editProfile: "Profil bearbeiten"
noteDeleteConfirm: "Möchtest du diese Notiz wirklich löschen?"
pinLimitExceeded: "Du kannst nicht noch mehr Notizen anheften."
intro: "Sharkey ist installiert! Lass uns nun ein Administratorkonto einrichten."
intro: "Misskey ist installiert! Lass uns nun ein Administratorkonto einrichten."
done: "Fertig"
processing: "In Bearbeitung …"
preview: "Vorschau"
@ -422,7 +422,7 @@ exploreFediverse: "Das Fediverse erkunden"
popularTags: "Beliebte Schlagwörter"
userList: "Liste"
about: "Über"
aboutMisskey: "Über Sharkey"
aboutMisskey: "Über Misskey"
administrator: "Administrator"
token: "Token"
2fa: "Zwei-Faktor-Authentifizierung"
@ -491,7 +491,6 @@ uiLanguage: "Sprache der Benutzeroberfläche"
aboutX: "Über {x}"
emojiStyle: "Emoji-Stil"
native: "Nativ"
disableDrawer: "Keine ausfahrbaren Menüs verwenden"
showNoteActionsOnlyHover: "Notizmenü nur bei Mouseover anzeigen"
noHistory: "Kein Verlauf gefunden"
signinHistory: "Anmeldungsverlauf"
@ -572,7 +571,7 @@ sort: "Sortieren"
ascendingOrder: "Aufsteigende Reihenfolge"
descendingOrder: "Absteigende Reihenfolge"
scratchpad: "Testumgebung"
scratchpadDescription: "Die Testumgebung bietet einen Bereich für AiScript-Experimente. Dort kannst du AiScript schreiben, ausführen sowie dessen Auswirkungen auf Sharkey überprüfen."
scratchpadDescription: "Die Testumgebung bietet einen Bereich für AiScript-Experimente. Dort kannst du AiScript schreiben, ausführen sowie dessen Auswirkungen auf Misskey überprüfen."
output: "Ausgabe"
script: "Skript"
disablePagesScript: "AiScript auf Seiten deaktivieren"
@ -687,10 +686,7 @@ abuseReported: "Deine Meldung wurde versendet. Vielen Dank."
reporter: "Melder"
reporteeOrigin: "Herkunft des Gemeldeten"
reporterOrigin: "Herkunft des Meldenden"
forwardReport: "Meldung an fremde Instanz weiterleiten"
forwardReportIsAnonymous: "Anstatt deines Benutzerkontos wird bei der fremden Instanz ein anonymes Systemkonto als Melder angezeigt."
send: "Senden"
abuseMarkAsResolved: "Meldung als gelöst markieren"
openInNewTab: "In neuem Tab öffnen"
openInSideView: "In Seitenansicht öffnen"
defaultNavigationBehaviour: "Standardnavigationsverhalten"
@ -709,14 +705,14 @@ unclip: "Aus Clip entfernen"
confirmToUnclipAlreadyClippedNote: "Diese Notiz ist bereits im \"{name}\" Clip enthalten. Möchtest du sie aus diesem Clip entfernen?"
public: "Öffentlich"
private: "Privat"
i18nInfo: "Sharkey wird durch freiwillige Helfer in viele verschiedene Sprachen übersetzt. Auf {link} kannst du mithelfen."
i18nInfo: "Misskey wird durch freiwillige Helfer in viele verschiedene Sprachen übersetzt. Auf {link} kannst du mithelfen."
manageAccessTokens: "Zugriffstokens verwalten"
accountInfo: "Benutzerkonto-Informationen"
notesCount: "Anzahl der Notizen"
repliesCount: "Anzahl gesendeter Antworten"
renotesCount: "Anzahl getätigter Renotes"
repliedCount: "Anzahl erhaltener Antworten"
renotedCount: "Anzahl erhaltener Boosts"
renotedCount: "Anzahl erhaltener Renotes"
followingCount: "Anzahl gefolgter Benutzer"
followersCount: "Anzahl an Followern"
sentReactionsCount: "Anzahl gesendeter Reaktionen"
@ -763,7 +759,7 @@ onlineUsersCount: "{n} Benutzer sind online"
nUsers: "{n} Benutzer"
nNotes: "{n} Notizen"
sendErrorReports: "Fehlerberichte senden"
sendErrorReportsDescription: "Ist diese Option aktiviert, so werden beim Auftreten von Fehlern detaillierte Fehlerinformationen an Sharkey weitergegeben, was zur Verbesserung der Qualität von Sharkey beiträgt.\nEnthalten in diesen Informationen sind u.a. die Version deines Betriebssystems, welchen Browser du verwendest und ein Verlauf deiner Aktivitäten innerhalb Sharkey."
sendErrorReportsDescription: "Ist diese Option aktiviert, so werden beim Auftreten von Fehlern detaillierte Fehlerinformationen an Misskey weitergegeben, was zur Verbesserung der Qualität von Misskey beiträgt.\nEnthalten in diesen Informationen sind u.a. die Version deines Betriebssystems, welchen Browser du verwendest und ein Verlauf deiner Aktivitäten innerhalb Misskey."
myTheme: "Mein Farbschema"
backgroundColor: "Hintergrundfarbe"
accentColor: "Akzentfarbe"
@ -857,7 +853,7 @@ hashtags: "Hashtags"
troubleshooting: "Problembehandlung"
useBlurEffect: "Weichzeichnungseffekt in der Benutzeroberfläche verwenden"
learnMore: "Mehr erfahren"
misskeyUpdated: "Sharkey wurde aktualisiert!"
misskeyUpdated: "Misskey wurde aktualisiert!"
whatIsNew: "Änderungen anzeigen"
translate: "Übersetzen"
translatedFrom: "Aus {x} übersetzt"
@ -984,9 +980,8 @@ numberOfLikes: "\"Gefällt mir\"-Anzahl"
show: "Anzeigen"
neverShow: "Nicht wieder anzeigen"
remindMeLater: "Vielleicht später"
didYouLikeMisskey: "Gefällt dir Sharkey?"
pleaseDonate: "Sharkey ist die kostenlose Software, die von {host} verwendet wird. Wir würden uns über Spenden freuen, damit dessen Entwicklung weitergeführt werden kann!"
pleaseDonateInstance: "Du kannst {host} auch direkt unterstützen, indem du an deine Instanz Administration spendest."
didYouLikeMisskey: "Gefällt dir Misskey?"
pleaseDonate: "Misskey ist die kostenlose Software, die von {host} verwendet wird. Wir würden uns über Spenden freuen, damit dessen Entwicklung weitergeführt werden kann!"
roles: "Rollen"
role: "Rolle"
noRole: "Rolle nicht gefunden"
@ -1006,7 +1001,7 @@ permissionDeniedError: "Aktion verweigert"
permissionDeniedErrorDescription: "Dieses Benutzerkonto besitzt nicht die Berechtigung, um diese Aktion auszuführen."
preset: "Vorlage"
selectFromPresets: "Aus Vorlagen wählen"
achievements: "Erfolge"
achievements: "Errungenschaften"
gotInvalidResponseError: "Ungültige Antwort des Servers"
gotInvalidResponseErrorDescription: "Eventuell ist der Server momentan nicht erreichbar oder untergeht Wartungsarbeiten. Bitte versuche es später noch einmal."
thisPostMayBeAnnoying: "Dieser Beitrag stört eventuell andere Benutzer."
@ -1101,7 +1096,7 @@ rolesThatCanBeUsedThisEmojiAsReactionPublicRoleWarn: "Diese Rollen müssen öffe
cancelReactionConfirm: "Möchtest du deine Reaktion wirklich löschen?"
changeReactionConfirm: "Möchtest du deine Reaktion wirklich ändern?"
later: "Später"
goToMisskey: "Zu Sharkey"
goToMisskey: "Zu Misskey"
additionalEmojiDictionary: "Zusätzliche Emoji-Wörterbücher"
installed: "Installiert"
branding: "Branding"
@ -1166,8 +1161,6 @@ impressumDescription: "In manchen Ländern, wie Deutschland und dessen Umgebung,
privacyPolicy: "Datenschutzerklärung"
privacyPolicyUrl: "Datenschutzerklärungs-URL"
tosAndPrivacyPolicy: "Nutzungsbedingungen und Datenschutzerklärung"
donation: "Spenden"
donationUrl: "Spenden-URL"
avatarDecorations: "Profilbilddekoration"
attach: "Anbringen"
detach: "Entfernen"
@ -1271,7 +1264,7 @@ _accountMigration:
moveTo: "Dieses Konto zu einem neuen migrieren"
moveToLabel: "Umzugsziel:"
moveCannotBeUndone: "Die Migration eines Benutzerkontos ist unwiderruflich."
moveAccountDescription: "Hierdurch wird dein Konto zu einem anderen migriert.\n ・Follower von diesem Konto werden automatisch auf das neue Konto migriert\n ・Dieses Konto wird allen Nutzern, denen es derzeit folgt, nicht mehr folgen\n ・Mit diesem Konto können keine neuen Notizen usw. erstellt werden\n\nWährend die Migration der Follower automatisch erfolgt, muss die Migration der Konten, denen du folgst, manuell vorbereitet werden. Exportiere hierzu die Liste der gefolgten Nutzer über das Einstellungsmenu, und importiere diese Liste im neuen Konto. Das gleiche Verfahren gilt für erstellte Listen und stummgeschaltete oder blockierte Nutzer.\n\n(Diese Erklärung gilt für Sharkey v13.12.0 oder später. Die Funktionsweise andere ActivityPub-Software, beispielsweise Mastodon, kann hiervon abweichen.)"
moveAccountDescription: "Hierdurch wird dein Konto zu einem anderen migriert.\n ・Follower von diesem Konto werden automatisch auf das neue Konto migriert\n ・Dieses Konto wird allen Nutzern, denen es derzeit folgt, nicht mehr folgen\n ・Mit diesem Konto können keine neuen Notizen usw. erstellt werden\n\nWährend die Migration der Follower automatisch erfolgt, muss die Migration der Konten, denen du folgst, manuell vorbereitet werden. Exportiere hierzu die Liste der gefolgten Nutzer über das Einstellungsmenu, und importiere diese Liste im neuen Konto. Das gleiche Verfahren gilt für erstellte Listen und stummgeschaltete oder blockierte Nutzer.\n\n(Diese Erklärung gilt für Misskey v13.12.0 oder später. Die Funktionsweise andere ActivityPub-Software, beispielsweise Mastodon, kann hiervon abweichen.)"
moveAccountHowTo: "Um ein Konto zu migrieren, erstelle zuerst auf dem Umzugsziel einen Alias für dieses Konto.\nGib dann das Umzugsziel in folgendem Format ein: @username@server.example.com"
startMigration: "Migrieren"
migrationConfirm: "Dieses Konto wirklich zu {account} umziehen? Sobald der Umzug beginnt, kann er nicht rückgängig gemacht werden, und dieses Konto nicht wieder im ursprünglichen Zustand verwendet werden."
@ -1282,26 +1275,26 @@ _achievements:
earnedAt: "Freigeschaltet am"
_types:
_notes1:
title: "Hallo Sharkey!"
title: "Hallo Misskey!"
description: "Sende deine erste Notiz"
flavor: "Hab eine schöne Zeit mit Sharkey!"
flavor: "Hab eine schöne Zeit mit Misskey!"
_notes10:
title: "Notizblog"
title: "Ein paar Notizen"
description: "10 Notizen gesendet"
_notes100:
title: "Schreiberling"
title: "Viele Notizen"
description: "100 Notizen gesendet"
_notes500:
title: "Autor"
title: "Überschüttet mit Notizen"
description: "500 Notizen gesendet"
_notes1000:
title: "Bestseller"
title: "Berg an Notizen"
description: "1.000 Notizen gesendet"
_notes5000:
title: "Dicker Wälzer"
title: "Überquellende Notizen"
description: "5.000 Notizen gesendet"
_notes10000:
title: "Verlagshaus"
title: "Supernotiz"
description: "10.000 Notizen gesendet"
_notes20000:
title: "Brauche... mehr... Notizen..."
@ -1328,28 +1321,28 @@ _achievements:
title: "Notizversum"
description: "90.000 Notizen gesendet"
_notes100000:
title: "ALL YOUR NOTES ARE BELONG TO US"
title: "ALL YOUR NOTE ARE BELONG TO US"
description: "100.000 Notizen gesendet"
flavor: "Du hast wirklich viel zu sagen."
_login3:
title: "Neuling "
title: "Anfänger "
description: "An 3 Tagen eingeloggt"
flavor: "Nenn' mich ab heute Misskist"
_login7:
title: "Neuling Ⅱ"
title: "Anfänger Ⅱ"
description: "An 7 Tagen eingeloggt"
flavor: "Na, eingewöht?"
_login15:
title: "Neuling Ⅲ"
title: "Anfänger Ⅲ"
description: "An 15 Tagen eingeloggt"
_login30:
title: "Fedizen "
title: "Misskist "
description: "An 30 Tagen eingeloggt"
_login60:
title: "Fedizen Ⅱ"
title: "Misskist Ⅱ"
description: "An 60 Tagen eingeloggt"
_login100:
title: "Fedizen Ⅲ"
title: "Misskist Ⅲ"
description: "An 100 Tagen eingeloggt"
flavor: "Violent Misskist"
_login200:
@ -1362,14 +1355,14 @@ _achievements:
title: "Stammbesucher Ⅲ"
description: "An 400 Tagen eingeloggt"
_login500:
title: "Alter Hase "
title: "Veteran "
description: "An 500 Tagen eingeloggt"
flavor: "Meine Kameraden, ich liebe sie, die Notizen."
_login600:
title: "Alter Hase Ⅱ"
title: "Veteran Ⅱ"
description: "An 600 Tagen eingeloggt"
_login700:
title: "Alter Hase Ⅲ"
title: "Veteran Ⅲ"
description: "An 700 Tagen eingeloggt"
_login800:
title: "Meister der Notizen "
@ -1378,39 +1371,39 @@ _achievements:
title: "Meister der Notizen Ⅱ"
description: "An 900 Tagen eingeloggt"
_login1000:
title: "Wie die Zeit vergeht"
title: "Meister der Notizen Ⅲ"
description: "An 1000 Tagen eingeloggt"
flavor: "Danke, dass du Sharkey nutzt!"
flavor: "Danke, dass du Misskey nutzt!"
_noteClipped1:
title: "Das merk ich mir"
title: "Muss... clippen..."
description: "Die erste Notiz geclippt"
_noteFavorited1:
title: "Sternengucker"
description: "Eine Notiz als Favorit markiert"
_myNoteFavorited1:
title: "Hilfreich"
title: "Sternensucher"
description: "Ein anderer Benutzer hat eine deiner Notizen als Favoriten markiert"
_profileFilled:
title: "Perfekte Vorbereitung"
description: "Fülle dein Profil aus"
_markedAsCat:
title: "Das Königreich der Katzen"
description: "Markiere dein Profil als Katze"
flavor: "Einen Namen bekommst du später~ "
title: "Ich der Kater"
description: "Markiere dein Konto als Katze"
flavor: "Einen Namen bekommst du später. "
_following1:
title: "Immer auf dem neusten Stand"
title: "Das Folgen beginnt"
description: "Du folgst deiner ersten Person"
_following10:
title: "Folge ihnen... folge ihnen..."
description: "Du folgst über 10 Leuten"
_following50:
title: "Lieblingsposter"
title: "Viele Freunde"
description: "Du folgst über 50 Leuten"
_following100:
title: "Die Top 100"
title: "100 Freunde"
description: "Du folgst über 100 Leuten"
_following300:
title: "Folgen, folgen, folgen!"
title: "Freundeüberschuss"
description: "Du folgst über 300 Leuten"
_followers1:
title: "Der erste Follower"
@ -1425,7 +1418,7 @@ _achievements:
title: "Beliebt"
description: "Die Anzahl deiner Follower hat 100 überschritten"
_followers300:
title: "Teil des Schiffs, Teil der Crew"
title: "Eine geordnete Reihe, bitte!"
description: "Die Anzahl deiner Follower hat 300 überschritten"
_followers500:
title: "Funkmast"
@ -1434,31 +1427,31 @@ _achievements:
title: "Influencer"
description: "Die Anzahl deiner Follower hat 1000 überschritten"
_collectAchievements30:
title: "Sammler der Erfolge"
title: "Sammler der Errungenschaften"
description: "Schalte 30 Errungenschaften frei"
_viewAchievements3min:
title: "Ausstellung"
title: "Fan von Errungenschaften"
description: "Schau dir die Liste deiner Errungenschaften für mindestens 3 Minuten an"
_iLoveMisskey:
title: "I Love Sharkey"
description: "Sende \"I ❤ #Sharkey\""
flavor: "Danke, dass du Sharkey verwendest! - vom Entwicklerteam"
title: "I Love Misskey"
description: "Sende \"I ❤ #Misskey\""
flavor: "Danke, dass du Misskey verwendest! - vom Entwicklerteam"
_foundTreasure:
title: "Schatzsuche"
description: "Du hast einen verborgenen Schatz gefunden"
_client30min:
title: "Kurze Pause"
description: "Habe Sharkey für mindestens 30 Minuten geöffnet"
description: "Habe Misskey für mindestens 30 Minuten geöffnet"
_client60min:
title: "Munter mit Sharkey"
description: "Habe Sharkey für mindestens 60 Minuten geöffnet"
title: "Munter mit Misskey"
description: "Habe Misskey für mindestens 60 Minuten geöffnet"
_noteDeletedWithin1min:
title: "Katze auf der Tastatur"
title: "Ups"
description: "Lösche eine Notiz innerhalb von 1 Minute nachdem sie gesendet wurde"
_postedAtLateNight:
title: "Nachtaktiv"
description: "Sende mitten in der Nacht eine Notiz"
flavor: "Echte Katzen sind nunmal nachtaktiv~"
flavor: "Geh bald schlafen."
_postedAt0min0sec:
title: "Zeitansage"
description: "Sende um 00:00 eine Notiz"
@ -1473,7 +1466,7 @@ _achievements:
title: "Analyst"
description: "Schau dir die Messwerte der Instanz an"
_outputHelloWorldOnScratchpad:
title: "Junghacker"
title: "Hallo Welt!"
description: "Gib \"hello world\" in der Testumgebung aus"
_open3windows:
title: "Splitscreen"
@ -1482,25 +1475,25 @@ _achievements:
title: "Zyklischer Verweis"
description: "Versuche, in Drive einen Zirkelbezug von Ordnern herzustellen"
_reactWithoutRead:
title: "Erst reagieren, dann lesen"
title: "Hast du das wirklich gelesen?"
description: "Reagiere auf eine Notiz mit mindestens 100 Zeichen innerhalb von 3 Sekunden der Erstellung der Notiz"
_clickedClickHere:
title: "Klicke hier"
description: "Du hast hier geklickt"
_justPlainLucky:
title: "Glück 100"
title: "Pures Glück"
description: "Kann alle 10 Sekunden mit einer Warscheinlichkeit von 0.005% erhalten werden"
_setNameToSyuilo:
title: "Gottkomplex"
description: "Setze deinen Namen auf \"syuilo\""
_passedSinceAccountCreated1:
title: "Davon erzähle ich meinen Enkeln"
title: "Einjahresjubiläum"
description: "Seit der Erstellung deines Kontos ist 1 Jahr vergangen"
_passedSinceAccountCreated2:
title: "Diese Software hat mich zur Katze gemacht"
title: "Zweijahresjubiläum"
description: "Seit der Erstellung deines Kontos sind 2 Jahre vergangen"
_passedSinceAccountCreated3:
title: "Goldene Zeit"
title: "Dreijahresjubiläum"
description: "Seit der Erstellung deines Kontos sind 3 Jahre vergangen"
_loggedInOnBirthday:
title: "Alles Gute Zum Geburtstag"
@ -1508,15 +1501,15 @@ _achievements:
_loggedInOnNewYearsDay:
title: "Frohes Neujahr"
description: "Logge dich am Neujahrstag ein"
flavor: "Auf ein weiteres tolles Jahr in diesem Universum!"
flavor: "Auf ein weiteres tolles Jahr in dieser Instanz"
_cookieClicked:
title: "Kreise klicken für Omas"
title: "Ein Spiel, in dem du auf einen Keks klickst"
description: "Den Keks geklickt"
flavor: "Bist du hier richtig?"
_brainDiver:
title: "Brain Diver"
description: "Sende den Link zu Brain Diver"
flavor: "Sharkey-Sharkey La-Tu-Ma"
flavor: "Misskey-Misskey La-Tu-Ma"
_smashTestNotificationButton:
title: "Testüberfluss"
description: "Betätige den Benachrichtigungstest mehrfach innerhalb einer extrem kurzen Zeitspanne"
@ -1681,12 +1674,12 @@ _registry:
domain: "Domain"
createKey: "Schlüssel erstellen"
_aboutMisskey:
about: "Sharkey ist Open-Source-Software basiert auf Misskey welche von syuilo seit 2014 entwickelt wird."
about: "Misskey ist Open-Source-Software, welche von syuilo seit 2014 entwickelt wird."
contributors: "Hauptmitwirkende"
allContributors: "Alle Mitwirkenden"
source: "Quellcode"
translation: "Sharkey übersetzen"
donate: "An Sharkey spenden"
translation: "Misskey übersetzen"
donate: "An Misskey spenden"
morePatrons: "Wir schätzen ebenso die Unterstützung vieler anderer hier nicht gelisteter Personen sehr. Danke! 🥰"
patrons: "UnterstützerInnen"
projectMembers: "Projektmitglieder"
@ -1791,7 +1784,6 @@ _theme:
buttonBg: "Hintergrund von Schaltflächen"
buttonHoverBg: "Hintergrund von Schaltflächen (Mouseover)"
inputBorder: "Rahmen von Eingabefeldern"
listItemHoverBg: "Hintergrund von Listeneinträgen (Mouseover)"
driveFolderBg: "Hintergrund von Drive-Ordnern"
wallpaperOverlay: "Hintergrundbild-Overlay"
badge: "Wappen"
@ -2116,7 +2108,7 @@ _notification:
youGotMention: "{name} hat dich erwähnt"
youGotReply: "{name} hat dir geantwortet"
youGotQuote: "{name} hat dich zitiert"
youRenoted: "Boost deiner Notiz von {name}"
youRenoted: "Renote deiner Notiz von {name}"
youWereFollowed: "ist dir gefolgt"
youReceivedFollowRequest: "Du hast eine Follow-Anfrage erhalten"
yourFollowRequestAccepted: "Deine Follow-Anfrage wurde akzeptiert"
@ -2145,6 +2137,7 @@ _notification:
receiveFollowRequest: "Erhaltene Follow-Anfragen"
followRequestAccepted: "Akzeptierte Follow-Anfragen"
achievementEarned: "Errungenschaft freigeschaltet"
login: "Anmelden"
app: "Benachrichtigungen von Apps"
_actions:
followBack: "folgt dir nun auch"

View file

@ -378,6 +378,7 @@ _notification:
renote: "Κοινοποίηση σημειώματος"
quote: "Παράθεση"
reaction: "Αντιδράσεις"
login: "Σύνδεση"
_actions:
reply: "Απάντηση"
renote: "Κοινοποίηση σημειώματος"

File diff suppressed because it is too large Load diff

View file

@ -109,11 +109,14 @@ enterEmoji: "Ingresar emojis"
renote: "Renotar"
unrenote: "Quitar renota"
renoted: "Renotado"
renotedToX: "{name} usuarios han renotado。"
cantRenote: "No se puede renotar este post"
cantReRenote: "No se puede renotar una renota"
quote: "Citar"
inChannelRenote: "Renota sólo del canal"
inChannelQuote: "Cita sólo del canal"
renoteToChannel: "Renotar a otro canal"
renoteToOtherChannel: "Renotar a otro canal"
pinnedNote: "Nota fijada"
pinned: "Fijar al perfil"
you: "Tú"
@ -152,6 +155,7 @@ editList: "Editar lista"
selectChannel: "Seleccionar canal"
selectAntenna: "Seleccionar antena"
editAntenna: "Editar antena"
createAntenna: "Crear una antena"
selectWidget: "Seleccionar widget"
editWidgets: "Editar widgets"
editWidgetsExit: "Terminar edición"
@ -178,6 +182,10 @@ addAccount: "Agregar Cuenta"
reloadAccountsList: "Recargar lista de cuentas"
loginFailed: "Error al iniciar sesión."
showOnRemote: "Ver en una instancia remota"
continueOnRemote: "Ver en una instancia remota"
chooseServerOnMisskeyHub: "Elegir un servidor en Misskey Hub"
specifyServerHost: "Especifica una instancia directamente"
inputHostName: "Introduzca el dominio"
general: "General"
wallpaper: "Fondo de pantalla"
setWallpaper: "Establecer fondo de pantalla"
@ -406,7 +414,7 @@ antennaKeywordsDescription: "Separar con espacios es una declaración AND, separ
notifyAntenna: "Notificar nueva nota"
withFileAntenna: "Sólo notas con archivos adjuntados"
enableServiceworker: "Activar ServiceWorker"
antennaUsersDescription: "Elegir nombres de usuarios separados por una linea nueva. Utilice \"*@instance.com\" para especificar todos los usuarios de una instancia."
antennaUsersDescription: "Elegir nombres de usuarios separados por una linea nueva"
caseSensitive: "Distinguir mayúsculas de minúsculas"
withReplies: "Incluir respuestas"
connectedTo: "Estas cuentas están conectadas"
@ -494,7 +502,6 @@ uiLanguage: "Idioma de visualización de la interfaz"
aboutX: "Acerca de {x}"
emojiStyle: "Estilo de emoji"
native: "Nativo"
disableDrawer: "No mostrar los menús en cajones"
showNoteActionsOnlyHover: "Mostrar acciones de la nota sólo al pasar el cursor"
showReactionsCount: "Mostrar el número de reacciones en las notas"
noHistory: "No hay datos en el historial"
@ -693,10 +700,7 @@ abuseReported: "Se ha enviado el reporte. Muchas gracias."
reporter: "Reportador"
reporteeOrigin: "Reportar a"
reporterOrigin: "Origen del reporte"
forwardReport: "Transferir un informe a una instancia remota"
forwardReportIsAnonymous: "No puede ver su información de la instancia remota y aparecerá como una cuenta anónima del sistema"
send: "Enviar"
abuseMarkAsResolved: "Marcar reporte como resuelto"
openInNewTab: "Abrir en una Nueva Pestaña"
openInSideView: "Abrir en una vista al costado"
defaultNavigationBehaviour: "Navegación por defecto"
@ -868,7 +872,7 @@ whatIsNew: "Mostrar cambios"
translate: "Traducir"
translatedFrom: "Traducido de {x}"
accountDeletionInProgress: "La eliminación de la cuenta está en curso"
usernameInfo: "Un nombre que identifique su cuenta de otras en este servidor. Puede utilizar el alfabeto (a~z, A~Z), dígitos (0~9) o guiones bajos (_). Los nombres de usuario no se pueden cambiar posteriormente."
usernameInfo: "Un nombre que identifique su cuenta de otras en este servidor. Puede utilizar el alfabeto (a~z, A~Z), dígitos (0~9) o guiones bajos (_). Los nombres de usuario no se pueden cambiar posteriormente."
aiChanMode: "Modo Ai"
devMode: "Modo de desarrollador"
keepCw: "Mantener la advertencia de contenido"
@ -1095,6 +1099,8 @@ preservedUsernames: "Nombre de usuario reservado"
preservedUsernamesDescription: "La lista de nombres de usuario para reservar tienen que separarse con saltos de línea.\nEstos estarán indisponibles durante la creación de cuentas, pero pueden ser usados para que los administradores puedan crear esas cuentas manualmente. Las cuentas existentes con esos nombres de usuario no se verán afectadas."
createNoteFromTheFile: "Componer una nota desde éste archivo"
archive: "Archivo"
archived: "Archivado"
unarchive: "Desarchivar"
channelArchiveConfirmTitle: "¿Seguro de archivar {name}?"
channelArchiveConfirmDescription: "Un canal archivado no aparecerá en la lista de canales ni en los resultados. Las nuevas publicaciones tampoco serán añadidas."
thisChannelArchived: "El canal ha sido archivado."
@ -1147,8 +1153,8 @@ currentAnnouncements: "Anuncios actuales"
pastAnnouncements: "Anuncios anteriores"
youHaveUnreadAnnouncements: "Hay anuncios sin leer"
useSecurityKey: "Por favor, sigue las instrucciones de tu dispositivo o navegador para usar tu clave de seguridad o tu clave de paso."
replies: "Respuestas"
renotes: "Renotas"
replies: "Responder"
renotes: "Renotar"
loadReplies: "Ver respuestas"
loadConversation: "Ver conversación"
pinnedList: "Lista fijada"
@ -1300,10 +1306,10 @@ _initialTutorial:
_reaction:
title: "¿Qué son las reacciones?"
description: "Se puede reaccionar a las Notas con diferentes emojis. Las reacciones te permiten expresar matices que no se pueden transmitir con un simple 'me gusta'."
letsTryReacting: "Puedes añadir reacciones pulsando en el botón '{reaction}' de la nota. ¡Intenta reaccionar a esta nota de ejemplo!"
letsTryReacting: "Puedes añadir reacciones pulsando en el botón '+' de la nota. ¡Intenta reaccionar a esta nota de ejemplo!"
reactToContinue: "Añade una reacción para continuar."
reactNotification: "Recibirás notificaciones en tiempo real cuando alguien reaccione a tu nota."
reactDone: "Puedes deshacer una reacción pulsando en el botón '{undo}'."
reactDone: "Puedes deshacer una reacción pulsando en el botón '-'."
_timeline:
title: "El concepto de Línea de tiempo"
description1: "Misskey proporciona múltiples líneas de tiempo basadas en su uso (algunas pueden no estar disponibles dependiendo de las políticas de la instancia)."
@ -1909,7 +1915,6 @@ _theme:
buttonBg: "Fondo de botón"
buttonHoverBg: "Fondo de botón (hover)"
inputBorder: "Borde de los campos de entrada"
listItemHoverBg: "Fondo de elemento de listas (hover)"
driveFolderBg: "Fondo de capeta del drive"
wallpaperOverlay: "Transparencia del fondo de pantalla"
badge: "Medalla"
@ -2149,7 +2154,6 @@ _poll:
remainingHours: "Quedan {h} horas y {m} minutos para que finalice"
remainingMinutes: "Quedan {m} minutos y {s} segundos para que finalice"
remainingSeconds: "Quedan {s} segundos para que finalice"
multiple: "Opciones múltiples"
_visibility:
public: "Público"
publicDescription: "Visible para todos los usuarios"
@ -2335,6 +2339,7 @@ _notification:
followRequestAccepted: "El seguimiento fue aceptado"
roleAssigned: "Rol asignado"
achievementEarned: "Logro desbloqueado"
login: "Iniciar sesión"
app: "Notificaciones desde aplicaciones"
_actions:
followBack: "Te sigue de vuelta"
@ -2355,7 +2360,7 @@ _deck:
newProfile: "Nuevo perfil"
deleteProfile: "Eliminar perfil"
introduction: "¡Crea la interfaz perfecta para tí organizando las columnas libremente!"
introduction2: "Presiona en la + de la derecha de la pantalla para añadir nuevas columnas donde quieras."
introduction2: "Presiona en la + de la derecha de la pantalla para añadir nuevas columnas donde quieras."
widgetsIntroduction: "Por favor selecciona \"Editar Widgets\" en el menú columna y agrega un widget."
useSimpleUiForNonRootPages: "Mostrar páginas no pertenecientes a la raíz con la interfaz simple"
usedAsMinWidthWhenFlexible: "Se usará el ancho mínimo cuando la opción \"Autoajustar ancho\" esté habilitada"
@ -2397,6 +2402,8 @@ _abuseReport:
_notificationRecipient:
_recipientType:
mail: "Correo"
webhook: "Webhook"
keywords: "Palabras Clave"
_moderationLogTypes:
createRole: "Rol creado"
deleteRole: "Rol eliminado"
@ -2500,6 +2507,7 @@ _hemisphere:
S: "Hemisferio sur"
_reversi:
reversi: "Reversi"
rules: "Reglas"
won: "{name} ha ganado"
total: "Total"
_urlPreviewSetting:

View file

@ -493,7 +493,6 @@ uiLanguage: "Langue daffichage de linterface"
aboutX: "À propos de {x}"
emojiStyle: "Style des émojis"
native: "Natif"
disableDrawer: "Les menus ne s'affichent pas dans le tiroir"
showNoteActionsOnlyHover: "Afficher les actions de note uniquement au survol"
showReactionsCount: "Afficher le nombre de réactions des notes"
noHistory: "Pas d'historique"
@ -692,10 +691,7 @@ abuseReported: "Le rapport est envoyé. Merci."
reporter: "Signalé par"
reporteeOrigin: "Origine du signalement"
reporterOrigin: "Signalé par"
forwardReport: "Transférer le signalement à linstance distante"
forwardReportIsAnonymous: "L'instance distante ne sera pas en mesure de voir vos informations et apparaîtra comme un compte anonyme du système."
send: "Envoyer"
abuseMarkAsResolved: "Marquer le signalement comme résolu"
openInNewTab: "Ouvrir dans un nouvel onglet"
openInSideView: "Ouvrir en vue latérale"
defaultNavigationBehaviour: "Navigation par défaut"
@ -1250,7 +1246,7 @@ _announcement:
end: "Archiver l'annonce"
tooManyActiveAnnouncementDescription: "Un grand nombre d'annonces actives peut baisser l'expérience utilisateur. Considérez d'archiver les annonces obsolètes."
readConfirmTitle: "Marquer comme lu ?"
readConfirmText: "Cela marquera le contenu de « {title} » comme lu."
readConfirmText: "Cela marquera le contenu de « {title} » comme lu."
shouldNotBeUsedToPresentPermanentInfo: "Puisque cela pourrait nuire considérablement à l'expérience utilisateur pour les nouveaux utilisateurs, il est recommandé d'utiliser les annonces pour afficher des informations temporaires plutôt que des informations persistantes."
dialogAnnouncementUxWarn: "Avoir deux ou plus annonces de style dialogue en même temps pourrait nuire considérablement à l'expérience utilisateur. Veuillez les utiliser avec caution."
silence: "Ne pas me notifier"
@ -1283,10 +1279,10 @@ _initialTutorial:
_reaction:
title: "Qu'est-ce que les réactions ?"
description: "Vous pouvez ajouter des « réactions » aux notes. Les réactions vous permettent d'exprimer à l'aise des nuances qui ne peuvent pas être exprimées par des mentions j'aime."
letsTryReacting: "Des réactions peuvent être ajoutées en cliquant sur le bouton « {reaction} » de la note. Essayez d'ajouter une réaction à cet exemple de note !"
letsTryReacting: "Des réactions peuvent être ajoutées en cliquant sur le bouton « + » de la note. Essayez d'ajouter une réaction à cet exemple de note !"
reactToContinue: "Ajoutez une réaction pour procéder."
reactNotification: "Vous recevez des notifications en temps réel lorsque quelqu'un réagit à votre note."
reactDone: "Vous pouvez annuler la réaction en cliquant sur le bouton « {undo} » ."
reactDone: "Vous pouvez annuler la réaction en cliquant sur le bouton « - » ."
_timeline:
title: "Fonctionnement des fils"
description1: "Misskey offre plusieurs fils selon l'usage (certains peuvent être désactivés par le serveur)."
@ -1350,7 +1346,7 @@ _achievements:
earnedAt: "Date d'obtention"
_types:
_notes1:
title: "Je viens tout juste de configurer mon shonk"
title: "Je viens tout juste de configurer mon msky"
description: "Publiez votre première note"
flavor: "Passez un bon moment avec Misskey !"
_notes10:
@ -1705,7 +1701,6 @@ _theme:
buttonBg: "Arrière-plan du bouton"
buttonHoverBg: "Arrière-plan du bouton (survolé)"
inputBorder: "Cadre de la zone de texte"
listItemHoverBg: "Arrière-plan d'item de liste (survolé)"
driveFolderBg: "Arrière-plan du dossier de disque"
wallpaperOverlay: "Superposition de fond d'écran"
badge: "Badge"
@ -2038,6 +2033,7 @@ _notification:
followRequestAccepted: "Demande d'abonnement acceptée"
roleAssigned: "Rôle reçu"
achievementEarned: "Déverrouillage d'accomplissement"
login: "Se connecter"
app: "Notifications provenant des apps"
_actions:
followBack: "Suivre"

View file

@ -3,6 +3,7 @@ import { fileURLToPath } from 'node:url';
import { dirname } from 'node:path';
import * as yaml from 'js-yaml';
import ts from 'typescript';
import { merge } from './index.js';
const __filename = fileURLToPath(import.meta.url);
const __dirname = dirname(__filename);
@ -56,7 +57,10 @@ function createMembers(record) {
}
export default function generateDTS() {
const locale = yaml.load(fs.readFileSync(`${__dirname}/ja-JP.yml`, 'utf-8'));
const sharkeyLocale = yaml.load(fs.readFileSync(`${__dirname}/../sharkey-locales/en-US.yml`, 'utf-8'));
const misskeyLocale = yaml.load(fs.readFileSync(`${__dirname}/ja-JP.yml`, 'utf-8'));
const locale = merge(misskeyLocale, sharkeyLocale);
const members = createMembers(locale);
const elements = [
ts.factory.createVariableStatement(

View file

@ -96,6 +96,7 @@ _notification:
renote: "Renote"
quote: "Idézet"
reaction: "Reakciók"
login: "Bejelentkezés"
_actions:
renote: "Renote"
_deck:

View file

@ -60,6 +60,7 @@ copyFileId: "Salin Berkas"
copyFolderId: "Salin Folder"
copyProfileUrl: "Salin Alamat Web Profil"
searchUser: "Cari pengguna"
searchThisUsersNotes: "Mencari catatan pengguna"
reply: "Balas"
loadMore: "Selebihnya"
showMore: "Selebihnya"
@ -154,6 +155,7 @@ editList: "Sunting daftar"
selectChannel: "Pilih kanal"
selectAntenna: "Pilih Antena"
editAntenna: "Sunting antena"
createAntenna: "Membuat antena."
selectWidget: "Pilih gawit"
editWidgets: "Sunting gawit"
editWidgetsExit: "Selesai"
@ -502,7 +504,6 @@ uiLanguage: "Bahasa antarmuka pengguna"
aboutX: "Tentang {x}"
emojiStyle: "Gaya emoji"
native: "Native"
disableDrawer: "Jangan gunakan menu bergaya laci"
showNoteActionsOnlyHover: "Hanya tampilkan aksi catatan saat ditunjuk"
showReactionsCount: "Lihat jumlah reaksi dalam catatan"
noHistory: "Tidak ada riwayat"
@ -584,7 +585,7 @@ sort: "Urutkan"
ascendingOrder: "Urutkan naik"
descendingOrder: "Urutkan menurun"
scratchpad: "Scratchpad"
scratchpadDescription: "Scratchpad menyediakan lingkungan eksperimen untuk AiScript. Kamu bisa menulis, mengeksuksi, serta mengecek hasil yang berinteraksi dengan Misskey."
scratchpadDescription: "Scratchpad menyediakan lingkungan eksperimen untuk AiScript. Kamu bisa menulis, mengeksuksi, serta mengecek hasil yang berinteraksi dengan Misskey."
output: "Keluaran"
script: "Script"
disablePagesScript: "Nonaktifkan script pada halaman"
@ -701,10 +702,7 @@ abuseReported: "Laporan kamu telah dikirimkan. Terima kasih."
reporter: "Pelapor"
reporteeOrigin: "Yang dilaporkan"
reporterOrigin: "Pelapor"
forwardReport: "Teruskan laporan ke instansi luar"
forwardReportIsAnonymous: "Untuk melindungi privasi akun kamu, akun anonim dari sistem akan digunakan sebagai pelapor pada instansi luar."
send: "Kirim"
abuseMarkAsResolved: "Tandai laporan sebagai selesai"
openInNewTab: "Buka di tab baru"
openInSideView: "Buka di tampilan samping"
defaultNavigationBehaviour: "Navigasi bawaan"
@ -1155,7 +1153,7 @@ currentAnnouncements: "Pengumuman Saat Ini"
pastAnnouncements: "Pengumuman Terdahulu"
youHaveUnreadAnnouncements: "Terdapat pengumuman yang belum dibaca"
useSecurityKey: "Mohon ikuti instruksi peramban atau perangkat kamu untuk menggunakan kunci pengaman atau passkey."
replies: "Balasan"
replies: "Balas"
renotes: "Renote"
loadReplies: "Tampilkan balasan"
loadConversation: "Tampilkan percakapan"
@ -1316,10 +1314,10 @@ _initialTutorial:
_reaction:
title: "Apa itu Reaksi?"
description: "Catatan dapat direaksi dengan berbagai emoji. Reaksi memperbolehkan kamu untuk mengekspresikan nuansa yang tidak dapat disampaikan hanya dengan sebuah \"suka\"."
letsTryReacting: "Reaksi dapat ditambahkan dengan mengklik tombol '{reaction}' pada catatan. Coba lakukan mereaksi contoh catatan ini!"
letsTryReacting: "Reaksi dapat ditambahkan dengan mengklik tombol '+' pada catatan. Coba lakukan mereaksi contoh catatan ini!"
reactToContinue: "Tambahkan reaksi untuk melanjutkan."
reactNotification: "Kamu akan menerima notifikasi real0time ketika seseorang mereaksi catatan kamu."
reactDone: "Kamu dapat mengurungkan reaksi dengan menekan tombol '{undo}'."
reactDone: "Kamu dapat mengurungkan reaksi dengan menekan tombol '-'."
_timeline:
title: "Konsep Lini Masa"
description1: "Misskey menyediakan berbagai lini masa sesuai dengan penggunaan (beberapa mungkin tidak tersedia karena bergantung dengan kebijakan peladen)."
@ -1926,7 +1924,6 @@ _theme:
buttonBg: "Latar belakang tombol"
buttonHoverBg: "Latar belakang tombol (Mengambang)"
inputBorder: "Batas bidang masukan"
listItemHoverBg: "Latar belakang daftar item (Mengambang)"
driveFolderBg: "Latar belakang folder drive"
wallpaperOverlay: "Lapisan wallpaper"
badge: "Lencana"
@ -2353,6 +2350,7 @@ _notification:
followRequestAccepted: "Permintaan mengikuti disetujui"
roleAssigned: "Peran Diberikan"
achievementEarned: "Pencapaian didapatkan"
login: "Masuk"
app: "Notifikasi dari aplikasi tertaut"
_actions:
followBack: "Ikuti Kembali"

2085
locales/index.d.ts vendored

File diff suppressed because it is too large Load diff

View file

@ -5,7 +5,7 @@
import * as fs from 'node:fs';
import * as yaml from 'js-yaml';
const merge = (...args) => args.reduce((a, c) => ({
export const merge = (...args) => args.reduce((a, c) => ({
...a,
...c,
...Object.entries(a)
@ -60,7 +60,10 @@ export function build() {
// https://github.com/vitest-dev/vitest/issues/3988#issuecomment-1686599577
// https://github.com/misskey-dev/misskey/pull/14057#issuecomment-2192833785
const metaUrl = import.meta.url;
const locales = languages.reduce((a, c) => (a[c] = yaml.load(clean(fs.readFileSync(new URL(`${c}.yml`, metaUrl), 'utf-8'))) || {}, a), {});
const sharkeyLocales = languages.reduce((a, c) => (a[c] = yaml.load(clean(fs.readFileSync(new URL(`../sharkey-locales/${c}.yml`, metaUrl), 'utf-8'))) || {}, a), {});
const misskeyLocales = languages.reduce((a, c) => (a[c] = yaml.load(clean(fs.readFileSync(new URL(`${c}.yml`, metaUrl), 'utf-8'))) || {}, a), {});
// merge sharkey and misskey's locales. the second argument (sharkey) overwrites the first argument (misskey).
const locales = merge(misskeyLocales, sharkeyLocales);
// 空文字列が入ることがあり、フォールバックが動作しなくなるのでプロパティごと消す
const removeEmpty = (obj) => {

View file

@ -1,6 +1,6 @@
---
_lang_: "Italiano"
headlineMisskey: "Rete collegata tramite note"
headlineMisskey: "Rete collegata tramite Note"
introMisskey: "Eccoci! Misskey è un servizio di microblogging decentralizzato, libero e aperto. \n\n📡 Puoi pubblicare «Note» per condividere ciò che sta succedendo o per dire a tutti qualcosa su di te. \n\n👍 Puoi reagire inviando emoji rapidi alle «Note» provenienti da altri profili nel Fediverso.\n\n🚀 Esplora un nuovo mondo insieme a noi!"
poweredByMisskeyDescription: "{name} è uno dei servizi (chiamati istanze) che utilizzano la piattaforma open source <b>Misskey</b>."
monthAndDay: "{day}/{month}"
@ -8,6 +8,9 @@ search: "Cerca"
notifications: "Notifiche"
username: "Nome utente"
password: "Password"
initialPasswordForSetup: "Password iniziale, per avviare le impostazioni"
initialPasswordIsIncorrect: "Password iniziale, sbagliata."
initialPasswordForSetupDescription: "Se hai installato Misskey di persona, usa la password che hai indicato nel file di configurazione.\nSe stai utilizzando un servizio di hosting Misskey, usa la password fornita dal gestore.\nSe non hai una password preimpostata, lascia il campo vuoto e continua."
forgotPassword: "Hai dimenticato la password?"
fetchingAsApObject: "Recuperando dal Fediverso..."
ok: "OK"
@ -54,13 +57,13 @@ addToAntenna: "Aggiungi all'antenna"
sendMessage: "Invia messaggio"
copyRSS: "Copia RSS"
copyUsername: "Copia nome utente"
openRemoteProfile: "Apri profilo remoto"
copyUserId: "Copia ID del profilo"
copyNoteId: "Copia ID della Nota"
copyFileId: "Copia ID del file"
copyFolderId: "Copia ID della cartella"
copyProfileUrl: "Copia URL del profilo"
searchUser: "Cerca profilo"
searchThisUsersNotes: "Cerca le sue Note"
reply: "Rispondi"
loadMore: "Mostra di più"
showMore: "Espandi"
@ -155,6 +158,7 @@ editList: "Modifica Lista"
selectChannel: "Seleziona canale"
selectAntenna: "Scegli un'antenna"
editAntenna: "Modifica Antenna"
createAntenna: "Crea Antenna"
selectWidget: "Seleziona il riquadro"
editWidgets: "Modifica i riquadri"
editWidgetsExit: "Conferma le modifiche"
@ -195,6 +199,7 @@ followConfirm: "Vuoi seguire {name}?"
proxyAccount: "Profilo proxy"
proxyAccountDescription: "Un profilo proxy funziona come follower per i profili remoti, sotto certe condizioni. Ad esempio, quando un profilo locale ne inserisce uno remoto in una lista (senza seguirlo), se nessun altro segue quel profilo remoto, le attività non possono essere distribuite. Dunque, il profilo proxy le seguirà per tutti."
host: "Host"
selectSelf: "Segli me"
selectUser: "Seleziona profilo"
recipient: "Destinatario"
annotation: "Annotazione preventiva"
@ -210,6 +215,7 @@ perDay: "giornaliero"
stopActivityDelivery: "Interrompi la distribuzione di attività"
blockThisInstance: "Bloccare l'istanza"
silenceThisInstance: "Silenziare l'istanza"
mediaSilenceThisInstance: "Silenzia i media dell'istanza"
operations: "Operazioni"
software: "Software"
version: "Versione"
@ -231,6 +237,10 @@ blockedInstances: "Istanze bloccate"
blockedInstancesDescription: "Elenca le istanze che vuoi bloccare, una per riga. Esse non potranno più interagire con la tua istanza."
silencedInstances: "Istanze silenziate"
silencedInstancesDescription: "Elenca i nomi host delle istanze che vuoi silenziare. Tutti i profili nelle istanze silenziate vengono trattati come tali. Possono solo inviare richieste di follow e menzionare soltanto i profili locali che seguono. Le istanze bloccate non sono interessate."
mediaSilencedInstances: "Istanze coi media silenziati"
mediaSilencedInstancesDescription: "Elenca i nomi host delle istanze di cui vuoi silenziare i media, uno per riga. Tutti gli allegati dei profili nelle istanze silenziate per via degli allegati espliciti, verranno impostati come tali, le emoji personalizzate non saranno disponibili. Le istanze bloccate sono escluse."
federationAllowedHosts: "Server a cui consentire la federazione"
federationAllowedHostsDescription: "Indica gli host dei server a cui è consentita la federazione, uno per ogni linea."
muteAndBlock: "Silenziare e bloccare"
mutedUsers: "Profili silenziati"
blockedUsers: "Profili bloccati"
@ -329,6 +339,7 @@ renameFolder: "Rinomina cartella"
deleteFolder: "Elimina cartella"
folder: "Cartella"
addFile: "Allega"
showFile: "Visualizza file"
emptyDrive: "Il Drive è vuoto"
emptyFolder: "La cartella è vuota"
unableToDelete: "Eliminazione impossibile"
@ -443,6 +454,7 @@ totpDescription: "Puoi autenticarti inserendo un codice OTP tramite la tua App d
moderator: "Moderatore"
moderation: "moderazione"
moderationNote: "Promemoria di moderazione"
moderationNoteDescription: "Puoi scrivere promemoria condivisi solo tra moderatori."
addModerationNote: "Aggiungi promemoria di moderazione"
moderationLogs: "Cronologia di moderazione"
nUsersMentioned: "{n} profili ne parlano"
@ -450,7 +462,7 @@ securityKeyAndPasskey: "Chiave di sicurezza e accesso"
securityKey: "Chiave di sicurezza"
lastUsed: "Ultima attività"
lastUsedAt: "Uso più recente: {t}"
unregister: "Annulla l'iscrizione"
unregister: "Rimuovi autenticazione a due fattori (2FA/MFA)"
passwordLessLogin: "Accedi senza password"
passwordLessLoginDescription: "Accedi senza password, usando la chiave di sicurezza"
resetPassword: "Ripristina la password"
@ -504,7 +516,10 @@ uiLanguage: "Lingua di visualizzazione dell'interfaccia"
aboutX: "Informazioni su {x}"
emojiStyle: "Stile emoji"
native: "Nativo"
disableDrawer: "Non mostrare il menù sul drawer"
menuStyle: "Stile menu"
style: "Stile"
drawer: "Drawer"
popup: "Popup"
showNoteActionsOnlyHover: "Mostra le azioni delle Note solo al passaggio del mouse"
showReactionsCount: "Visualizza il numero di reazioni su una nota"
noHistory: "Nessuna cronologia"
@ -560,7 +575,7 @@ deleteAll: "Cancella cronologia"
showFixedPostForm: "Visualizzare la finestra di pubblicazione in cima alla timeline"
showFixedPostFormInChannel: "Per i canali, mostra il modulo di pubblicazione in cima alla timeline"
withRepliesByDefaultForNewlyFollowed: "Quando segui nuovi profili, includi le risposte in TL come impostazione predefinita"
newNoteRecived: "Nuove note da leggere"
newNoteRecived: "Nuove Note da leggere"
sounds: "Impostazioni suoni"
sound: "Suono"
listen: "Ascolta"
@ -587,6 +602,8 @@ ascendingOrder: "Aumenta"
descendingOrder: "Diminuisce"
scratchpad: "ScratchPad"
scratchpadDescription: "Lo Scratchpad offre un ambiente per esperimenti di AiScript. È possibile scrivere, eseguire e confermare i risultati dell'interazione del codice con Misskey."
uiInspector: "UI Inspector"
uiInspectorDescription: "Puoi visualizzare un elenco di elementi UI presenti in memoria. I componenti dell'interfaccia utente vengono generati dalle funzioni Ui:C:."
output: "Uscita"
script: "Script"
disablePagesScript: "Disabilita AiScript nelle pagine"
@ -703,10 +720,7 @@ abuseReported: "La segnalazione è stata inviata. Grazie."
reporter: "il corrispondente"
reporteeOrigin: "Segnalazione a"
reporterOrigin: "Segnalazione da"
forwardReport: "Inoltro di un report a un'istanza remota."
forwardReportIsAnonymous: "L'istanza remota non vedrà le tue informazioni, apparirai come profilo di sistema, anonimo."
send: "Inviare"
abuseMarkAsResolved: "Risolvi segnalazione"
openInNewTab: "Apri in una nuova scheda"
openInSideView: "Apri in vista laterale"
defaultNavigationBehaviour: "Navigazione preimpostata"
@ -765,8 +779,6 @@ thisIsExperimentalFeature: "Questa è una funzionalità sperimentale. Potrebbe e
developer: "Sviluppatore"
makeExplorable: "Profilo visibile pubblicamente nella pagina \"Esplora\""
makeExplorableDescription: "Disabilitando questa opzione, il tuo profilo non verrà elencato nella pagina \"Esplora\"."
makeIndexable: "Non indicizzare le note pubbliche"
makeIndexableDescription: "Le tue note pubbliche non saranno cercabili"
showGapBetweenNotesInTimeline: "Mostrare un intervallo tra le note sulla timeline"
duplicate: "Duplica"
left: "Sinistra"
@ -830,7 +842,7 @@ onlineStatus: "Stato di connessione"
hideOnlineStatus: "Modalità invisibile"
hideOnlineStatusDescription: "Attivando questa opzione potresti ridurre l'usabilità di alcune funzioni, come la ricerca."
online: "Online"
active: "Attività"
active: "Attivo"
offline: "Offline"
notRecommended: "Sconsigliato"
botProtection: "Protezione contro i bot"
@ -910,6 +922,7 @@ followersVisibility: "Visibilità dei profili che ti seguono"
continueThread: "Altre conversazioni"
deleteAccountConfirm: "Così verrà eliminato il profilo. Vuoi procedere?"
incorrectPassword: "La password è errata."
incorrectTotp: "Il codice OTP è sbagliato, oppure scaduto."
voteConfirm: "Votare per「{choice}」?"
hide: "Nascondere"
useDrawerReactionPickerForMobile: "Mostra sul drawer da dispositivo mobile"
@ -1001,7 +1014,6 @@ cannotLoad: "Caricamento impossibile"
numberOfProfileView: "Visualizzazioni profilo"
like: "Mi piace!"
unlike: "Non mi piace"
defaultLike: "Emoji predefinita per \"mi piace\""
numberOfLikes: "Numero di Like"
show: "Visualizza"
neverShow: "Non mostrare più"
@ -1075,6 +1087,7 @@ retryAllQueuesConfirmTitle: "Vuoi ritentare adesso?"
retryAllQueuesConfirmText: "Potrebbe sovraccaricare il server temporaneamente."
enableChartsForRemoteUser: "Abilita i grafici per i profili remoti"
enableChartsForFederatedInstances: "Abilita i grafici per le istanze federate"
enableStatsForFederatedInstances: "Informazioni statistiche sui server federati"
showClipButtonInNoteFooter: "Aggiungi il bottone Clip tra le azioni delle Note"
reactionsDisplaySize: "Grandezza delle reazioni"
limitWidthOfReaction: "Limita la larghezza delle reazioni e ridimensionale"
@ -1110,6 +1123,8 @@ preservedUsernames: "Nomi utente riservati"
preservedUsernamesDescription: "Elenca, uno per linea, i nomi utente che non possono essere registrati durante la creazione del profilo. La restrizione non si applica agli amministratori. Inoltre, i profili già registrati sono esenti."
createNoteFromTheFile: "Crea Nota da questo file"
archive: "Archivio"
archived: "Archiviato"
unarchive: "Annulla archiviazione"
channelArchiveConfirmTitle: "Vuoi davvero archiviare {name}?"
channelArchiveConfirmDescription: "Un canale archiviato non compare nell'elenco canali, nemmeno nei risultati di ricerca. Non può ricevere nemmeno nuove Note."
thisChannelArchived: "Questo canale è stato archiviato."
@ -1120,6 +1135,9 @@ preventAiLearning: "Impedisci l'apprendimento della IA"
preventAiLearningDescription: "Aggiungendo il campo \"noai\" alla risposta HTML, si indica ai Robot esterni di non usare testi e allegati per addestrare sistemi di Machine Learning (IA predittiva/generativa). Anche se è impossibile sapere se la richiesta venga onorata o semplicemente ignorata."
options: "Opzioni del ruolo"
specifyUser: "Profilo specifico"
lookupConfirm: "Vuoi davvero richiedere informazioni?"
openTagPageConfirm: "Vuoi davvero aprire la pagina dell'hashtag?"
specifyHost: "Specifica l'host"
failedToPreviewUrl: "Anteprima non disponibile"
update: "Aggiorna"
rolesThatCanBeUsedThisEmojiAsReaction: "Ruoli che possono usare questa emoji come reazione"
@ -1254,10 +1272,38 @@ inquiry: "Contattaci"
tryAgain: "Per favore riprova"
confirmWhenRevealingSensitiveMedia: "Richiedi conferma prima di mostrare gli allegati espliciti"
sensitiveMediaRevealConfirm: "Questo allegato è esplicito, vuoi vederlo?"
createdLists: "Liste create"
createdAntennas: "Antenne create"
fromX: "Da {x}"
genEmbedCode: "Ottieni il codice di incorporamento"
noteOfThisUser: "Elenco di Note di questo profilo"
clipNoteLimitExceeded: "Non è possibile aggiungere ulteriori Note a questa Clip."
performance: "Prestazioni"
modified: "Modificato"
discard: "Scarta"
thereAreNChanges: "Ci sono {n} cambiamenti"
signinWithPasskey: "Accedi con passkey"
unknownWebAuthnKey: "Questa è una passkey sconosciuta."
passkeyVerificationFailed: "La verifica della passkey non è riuscita."
passkeyVerificationSucceededButPasswordlessLoginDisabled: "La verifica della passkey è riuscita, ma l'accesso senza password è disabilitato."
messageToFollower: "Messaggio ai follower"
target: "Riferimento"
testCaptchaWarning: "Questa funzione è destinata al test CAPTCHA. <strong>Da non utilizzare in ambiente di produzione.</strong>"
prohibitedWordsForNameOfUser: "Parole proibite (nome utente)"
prohibitedWordsForNameOfUserDescription: "Il sistema rifiuta di rinominare un utente, se il nome contiene qualsiasi parola nell'elenco. Sono esenti i profili con privilegi di moderazione."
yourNameContainsProhibitedWords: "Il nome che hai scelto contiene una o più parole vietate"
yourNameContainsProhibitedWordsDescription: "Se desideri comunque utilizzare questo nome, contatta l''amministrazione."
_abuseUserReport:
forward: "Inoltra"
forwardDescription: "Inoltra il report al server remoto, per mezzo di account di sistema, anonimo."
resolve: "Risolvi"
accept: "Approva"
reject: "Rifiuta"
resolveTutorial: "Se moderi una segnalazione legittima, scegli \"Approva\" per risolvere positivamente.\nSe la segnalazione non è legittima, seleziona \"Rifiuta\" per risolvere negativamente."
_delivery:
status: "Stato della distribuzione di attività"
stop: "Sospendi la distribuzione di attività"
resume: "Riprendi la distribuzione di attività"
status: "Stato della consegna"
stop: "Sospensione"
resume: "Riprendi la consegna"
_type:
none: "Pubblicazione"
manuallySuspended: "Sospesa manualmente"
@ -1281,16 +1327,16 @@ _bubbleGame:
_announcement:
forExistingUsers: "Solo ai profili attuali"
forExistingUsersDescription: "L'annuncio sarà visibile solo ai profili esistenti in questo momento. Se disabilitato, sarà visibile anche ai profili che verranno creati dopo la pubblicazione di questo annuncio."
needConfirmationToRead: "Richiede la conferma di lettura"
needConfirmationToReadDescription: "Sarà visualizzata una finestra di dialogo che richiede la conferma di lettura. Inoltre, non è soggetto a conferme di lettura massicce."
needConfirmationToRead: "Conferma di lettura obbligatoria"
needConfirmationToReadDescription: "I profili riceveranno una finestra di dialogo che richiede di accettare obbligatoriamente per procedere. Tale richiesta è esente da \"conferma tutte\"."
end: "Archivia l'annuncio"
tooManyActiveAnnouncementDescription: "L'esperienza delle persone può peggiorare se ci sono troppi annunci attivi. Considera anche l'archiviazione degli annunci conclusi."
readConfirmTitle: "Segnare come già letto?"
readConfirmText: "Hai già letto \"{title}˝?"
shouldNotBeUsedToPresentPermanentInfo: "Ti consigliamo di utilizzare gli annunci per pubblicare informazioni tempestive e limitate nel tempo, anziché informazioni importanti a lungo andare nel tempo, poiché potrebbero risultare difficili da ritrovare e peggiorare la fruibilità del servizio, specialmente alle nuove persone iscritte."
dialogAnnouncementUxWarn: "Ti consigliamo di usarli con cautela, poiché è molto probabile che avere più di un annuncio in stile \"finestra di dialogo\" peggiori sensibilmente la fruibilità del servizio, specialmente alle nuove persone iscritte."
silence: "Silenziare gli annunci"
silenceDescription: "Se attivi questa opzione, non riceverai notifiche sugli annunci, evitando di contrassegnarle come già lette."
silence: "Annuncio silenzioso"
silenceDescription: "Attivando questa opzione, non invierai la notifica, evitando che debba essere contrassegnata come già letta."
_initialAccountSetting:
accountCreated: "Il tuo profilo è stato creato!"
letsStartAccountSetup: "Per iniziare, impostiamo il tuo profilo."
@ -1308,7 +1354,7 @@ _initialAccountSetting:
skipAreYouSure: "Vuoi davvero saltare la configurazione iniziale?"
laterAreYouSure: "Vuoi davvero rimandare la configurazione iniziale?"
_initialTutorial:
launchTutorial: "Guarda il tutorial"
launchTutorial: "Inizia il tutorial"
title: "Tutorial"
wellDone: "Ottimo lavoro!"
skipAreYouSure: "Vuoi davvero interrompere il tutorial?"
@ -1318,17 +1364,17 @@ _initialTutorial:
_note:
title: "Cosa sono le Note?"
description: "Gli status su Misskey sono chiamati \"Note\". Le Note sono elencate in ordine cronologico nelle timeline e vengono aggiornate in tempo reale."
reply: "Puoi rispondere alle Note. Puoi anche rispondere alle risposte e continuare i dialoghi come un conversazioni."
renote: "Puoi ri-condividere le Note, facendole rifluire sulla Timeline. Puoi anche aggiungere testo e citare altri profili."
reaction: "Puoi aggiungere una reazione. Nella pagina successiva spiegheremo i dettagli."
menu: "Puoi svolgere varie attività, come visualizzare i dettagli delle Note o copiare i collegamenti."
reply: "Puoi rispondere alle Note, alle altre risposte e dialogare in conversazioni."
renote: "Puoi ri-condividere le Note, ritorneranno sulla Timeline. Aggiungendo del testo, scriverai una Citazione."
reaction: "Puoi aggiungere una reazione. Nella pagina successiva ti spiego come."
menu: "Per altre attività, ad esempio, vedere i dettagli delle Note o copiare i collegamenti."
_reaction:
title: "Cosa sono le Reazioni?"
description: "Puoi reagire alle Note. Le sensazioni che non si riescono a trasmettere con i \"Mi piace\" si possono esprimere facilmente inviando una reazione."
letsTryReacting: "Puoi aggiungere una Reazione cliccando il bottone \"{reaction}\" della relativa Nota. Prova ad aggiungerne una a questa Nota di esempio!"
description: "Reazioni alle Note. Le sensazioni che non si possono descrivere con \"Mi piace\" si esprimono facilmente con le reazioni."
letsTryReacting: "Puoi aggiungere una Reazione cliccando il bottone \"+\" (più) della relativa Nota. Prova ad aggiungerne una a questa Nota di esempio!"
reactToContinue: "Aggiungere la Reazione ti consentirà di procedere col tutorial."
reactNotification: "Quando qualcuno reagisce alle tue Note, ricevi una notifica in tempo reale."
reactDone: "Annulla la tua Reazione premendo il bottone \"{undo}\""
reactDone: "Annulla la tua Reazione premendo il bottone \"ー\" (meno)"
_timeline:
title: "Come funziona la Timeline"
description1: "Misskey fornisce alcune Timeline (sequenze cronologiche di Note). Una di queste potrebbe essere stata disattivata dagli amministratori."
@ -1337,7 +1383,7 @@ _initialTutorial:
social: "sia le Note della Timeline Home che quelle della Timeline Locale, insieme!"
global: "le Note da pubblicate da tutte le altre istanze federate con la nostra."
description2: "Nella parte superiore dello schermo, puoi scegliere una Timeline o l'altra in qualsiasi momento."
description3: "Ci sono anche sequenze temporali di elenchi, sequenze temporali di canali, ecc. Per ulteriori dettagli, consultare il {link}.\nPuoi vedere anche Timeline delle liste di profili (se ne hai create), canali, ecc... Per i dettagli, visita {link}."
description3: "Ci sono anche sequenze temporali di elenchi, sequenze temporali di canali, ecc. Per ulteriori dettagli, consultare la {link}.\nPuoi vedere anche Timeline delle liste di profili (se ne hai create), canali, ecc... Per i dettagli, c'è la {link}."
_postNote:
title: "La Nota e le sue impostazioni"
description1: "Quando scrivi una Nota su Misskey, hai a disposizione varie opzioni. Il modulo di invio è simile a questo."
@ -1388,8 +1434,10 @@ _serverSettings:
fanoutTimelineDescription: "Attivando questa funzionalità migliori notevolmente la capacità delle Timeline di collezionare Note, riducendo il carico sul database. Tuttavia, aumenterà l'impiego di memoria RAM per Redis. Disattiva se il tuo server ha poca RAM o la funzionalità è irregolare."
fanoutTimelineDbFallback: "Elaborazione dati alternativa"
fanoutTimelineDbFallbackDescription: "Attivando l'elaborazione alternativa, verrà interrogato ulteriormente il database se la timeline non è nella cache. \nDisattivando, si può ridurre ulteriormente il carico del server, evitando l'elaborazione alternativa, ma limitando l'intervallo recuperabile delle timeline."
reactionsBufferingDescription: "Attivando questa opzione, puoi migliorare significativamente le prestazioni durante la creazione delle reazioni e ridurre il carico sul database. Tuttavia, aumenterà l'impiego di memoria Redis."
inquiryUrl: "URL di contatto"
inquiryUrlDescription: "Specificare l'URL al modulo di contatto, oppure le informazioni con i dati di contatto dell'amministrazione."
thisSettingWillAutomaticallyOffWhenModeratorsInactive: "Per prevenire SPAM, questa impostazione verrà disattivata automaticamente, se non si rileva alcuna attività di moderazione durante un certo periodo di tempo."
_accountMigration:
moveFrom: "Migra un altro profilo dentro a questo"
moveFromSub: "Crea un alias verso un altro profilo remoto"
@ -1721,6 +1769,11 @@ _role:
canSearchNotes: "Ricercare nelle Note"
canUseTranslator: "Tradurre le Note"
avatarDecorationLimit: "Numero massimo di decorazioni foto profilo installabili"
canImportAntennas: "Può importare Antenne"
canImportBlocking: "Può importare Blocchi"
canImportFollowing: "Può importare Following"
canImportMuting: "Può importare Silenziati"
canImportUserLists: "Può importare liste di Profili"
_condition:
roleAssignedTo: "Assegnato a ruoli manualmente"
isLocal: "Profilo locale"
@ -1783,7 +1836,7 @@ _ad:
_forgotPassword:
enterEmail: "Inserisci l'indirizzo di posta elettronica che hai registrato nel tuo profilo. Il collegamento necessario per ripristinare la password verrà inviato a questo indirizzo."
ifNoEmail: "Se il tuo indirizzo email non risulta registrato, contatta l'amministrazione dell'istanza."
contactAdmin: "Poiché questa istanza non permette di impostare l'indirizzo mail, contatta l'amministrazione per ripristinare la password.\n"
contactAdmin: "Poiché questa istanza non permette di impostare l'indirizzo mail, contatta l'amministrazione per ripristinare la password.\n"
_gallery:
my: "Le mie pubblicazioni"
liked: "Pubblicazioni che mi piacciono"
@ -1848,7 +1901,6 @@ _serverDisconnectedBehavior:
reload: "Ricarica automaticamente"
dialog: "Apri avviso in finestra"
quiet: "Visualizza avviso in modo discreto"
disabled: "Non visualizzare l'avviso"
_channel:
create: "Nuovo canale"
edit: "Gerisci canale"
@ -1939,7 +1991,6 @@ _theme:
buttonBg: "Sfondo del pulsante"
buttonHoverBg: "Sfondo del pulsante (sorvolato)"
inputBorder: "Inquadra casella di testo"
listItemHoverBg: "Sfondo della voce di elenco (sorvolato)"
driveFolderBg: "Sfondo della cartella di disco"
wallpaperOverlay: "Sovrapposizione dello sfondo"
badge: "Distintivo"
@ -1959,6 +2010,7 @@ _soundSettings:
driveFileTypeWarnDescription: "Per favore, scegli un file di tipo audio"
driveFileDurationWarn: "La durata dell'audio è troppo lunga"
driveFileDurationWarnDescription: "Scegliere un audio lungo potrebbe interferire con l'uso di Misskey. Vuoi continuare lo stesso?"
driveFileError: "Impossibile caricare l'audio. Si prega di modificare le impostazioni"
_ago:
future: "Futuro"
justNow: "Adesso"
@ -2151,7 +2203,7 @@ _widgets:
_userList:
chooseList: "Seleziona una lista"
clicker: "Cliccaggio"
birthdayFollowings: "Chi nacque oggi"
birthdayFollowings: "Compleanni del giorno"
_cw:
hide: "Nascondere"
show: "Continua la lettura..."
@ -2215,6 +2267,9 @@ _profile:
changeBanner: "Cambia intestazione"
verifiedLinkDescription: "Puoi verificare il tuo profilo mostrando una icona. Devi inserire la URL alla pagina che contiene un link al tuo profilo."
avatarDecorationMax: "Puoi aggiungere fino a {max} decorazioni."
followedMessage: "Messaggio, quando qualcuno ti segue"
followedMessageDescription: "Puoi impostare un breve messaggio da mostrare agli altri profili quando ti seguono."
followedMessageDescriptionForLockedAccount: "Quando approvi una richiesta di follow, verrà visualizzato questo testo."
_exportOrImport:
allNotes: "Tutte le note"
favoritedNotes: "Note preferite"
@ -2307,6 +2362,7 @@ _pages:
eyeCatchingImageSet: "Imposta un'immagine attraente"
eyeCatchingImageRemove: "Elimina immagine attraente"
chooseBlock: "Aggiungi blocco"
enterSectionTitle: "Inserisci il titolo della sezione"
selectType: "Seleziona tipo"
contentBlocks: "Contenuto"
inputBlocks: "Blocchi di input"
@ -2352,6 +2408,8 @@ _notification:
renotedBySomeUsers: "{n} Rinota"
followedBySomeUsers: "{n} follower"
flushNotification: "Azzera le notifiche"
exportOfXCompleted: "Abbiamo completato l'esportazione di {x}"
login: "Autenticazione avvenuta"
_types:
all: "Tutto"
note: "Nuove Note"
@ -2366,6 +2424,9 @@ _notification:
followRequestAccepted: "Richiesta di follow accettata"
roleAssigned: "Ruolo concesso"
achievementEarned: "Risultato raggiunto"
exportCompleted: "Esportazione completata"
login: "Accedi"
test: "Prova la notifica"
app: "Notifiche da applicazioni"
_actions:
followBack: "Segui"
@ -2405,7 +2466,7 @@ _deck:
roleTimeline: "Timeline Ruolo"
_dialog:
charactersExceeded: "Hai superato il limite di {max} caratteri! ({current})"
charactersBelow: "Sei al di sotto del minimo di {min} caratteri! ({current})"
charactersBelow: "Sei al di sotto del minimo di {min} caratteri! ({current})"
_disabledTimeline:
title: "Timeline disabilitata"
description: "Il ruolo in cui sei non ti permette di leggere questa timeline"
@ -2417,6 +2478,7 @@ _webhookSettings:
modifyWebhook: "Modifica Webhook"
name: "Nome"
secret: "Segreto"
trigger: "Trigger"
active: "Attivo"
_events:
follow: "Quando segui un profilo"
@ -2429,7 +2491,11 @@ _webhookSettings:
_systemEvents:
abuseReport: "Quando arriva una segnalazione"
abuseReportResolved: "Quando una segnalazione è risolta"
userCreated: "Quando viene creato un profilo"
inactiveModeratorsWarning: "Quando un profilo moderatore rimane inattivo per un determinato periodo"
inactiveModeratorsInvitationOnlyChanged: "Quando la moderazione è rimasta inattiva per un determinato periodo e il sistema è cambiato in modalità \"solo inviti\""
deleteConfirm: "Vuoi davvero eliminare il Webhook?"
testRemarks: "Clicca il bottone a destra dell'interruttore, per provare l'invio di un webhook con dati fittizi."
_abuseReport:
_notificationRecipient:
createRecipient: "Aggiungi destinatario della segnalazione"
@ -2473,6 +2539,8 @@ _moderationLogTypes:
markSensitiveDriveFile: "File nel Drive segnato come esplicito"
unmarkSensitiveDriveFile: "File nel Drive segnato come non esplicito"
resolveAbuseReport: "Segnalazione risolta"
forwardAbuseReport: "Segnalazione inoltrata"
updateAbuseReportNote: "Ha aggiornato la segnalazione"
createInvitation: "Genera codice di invito"
createAd: "Banner creato"
deleteAd: "Banner eliminato"
@ -2488,6 +2556,10 @@ _moderationLogTypes:
createAbuseReportNotificationRecipient: "Crea destinatario per le notifiche di segnalazioni"
updateAbuseReportNotificationRecipient: "Aggiorna destinatario notifiche di segnalazioni"
deleteAbuseReportNotificationRecipient: "Elimina destinatario notifiche di segnalazioni"
deleteAccount: "Quando viene eliminato un profilo"
deletePage: "Pagina eliminata"
deleteFlash: "Play eliminato"
deleteGalleryPost: "Eliminazione pubblicazione nella Galleria"
_fileViewer:
title: "Dettagli del file"
type: "Tipo di file"
@ -2619,3 +2691,22 @@ _mediaControls:
pip: "Sovraimpressione"
playbackRate: "Velocità di riproduzione"
loop: "Ripetizione infinita"
_contextMenu:
title: "Menu contestuale"
app: "Applicazione"
appWithShift: "Applicazione Shift+Tasto"
native: "Interfaccia utente del browser"
_embedCodeGen:
title: "Personalizza il codice di incorporamento"
header: "Mostra la testata"
autoload: "Carica automaticamente di più (sconsigliato)"
maxHeight: "Altezza massima"
maxHeightDescription: "Specifica un valore per evitare che continui a crescere verticalmente. Il valore 0 disabilita il limite d'altezza."
maxHeightWarn: "L'altezza massima è disabilitata (0). Se l'effetto è indesiderato, prova a impostare l'altezza massima a un valore specifico."
previewIsNotActual: "Poiché supera l'intervallo che può essere visualizzato in anteprima, la visualizzazione vera e propria sarà diversa quando effettivamente incorporata."
rounded: "Bordo arrotondato"
border: "Aggiungi un bordo al contenitore"
applyToPreview: "Applica all'anteprima"
generateCode: "Crea il codice di incorporamento"
codeGenerated: "Codice generato"
codeGeneratedDescription: "Incolla il codice appena generato sul tuo sito web."

View file

@ -1,13 +1,16 @@
_lang_: "日本語"
headlineMisskey: "ノートでつながるネットワーク"
introMisskey: "ようこそ!Sharkeyは、オープンソースの分散型マイクロブログサービスです。\n「ート」を作成して、いま起こっていることを共有したり、あなたについて皆に発信しよう📡\n「リアクション」機能で、皆のートに素早く反応を追加することもできます👍\n新しい世界を探検しよう🚀"
poweredByMisskeyDescription: "{name}は、オープンソースのプラットフォーム<b>Sharkey</b>のサーバーのひとつです。"
introMisskey: "ようこそ!Misskeyは、オープンソースの分散型マイクロブログサービスです。\n「ート」を作成して、いま起こっていることを共有したり、あなたについて皆に発信しよう📡\n「リアクション」機能で、皆のートに素早く反応を追加することもできます👍\n新しい世界を探検しよう🚀"
poweredByMisskeyDescription: "{name}は、オープンソースのプラットフォーム<b>Misskey</b>のサーバーのひとつです。"
monthAndDay: "{month}月 {day}日"
search: "検索"
notifications: "通知"
username: "ユーザー名"
password: "パスワード"
initialPasswordForSetup: "初期設定開始用パスワード"
initialPasswordIsIncorrect: "初期設定開始用のパスワードが違います。"
initialPasswordForSetupDescription: "Misskeyを自分でインストールした場合は、設定ファイルに入力したパスワードを使用してください。\nMisskeyのホスティングサービスなどを使用している場合は、提供されたパスワードを使用してください。\nパスワードを設定していない場合は、空欄にしたまま続行してください。"
forgotPassword: "パスワードを忘れた"
fetchingAsApObject: "連合に照会中"
ok: "OK"
@ -15,7 +18,7 @@ gotIt: "わかった"
cancel: "キャンセル"
noThankYou: "やめておく"
enterUsername: "ユーザー名を入力"
renotedBy: "{user}がブースト"
renotedBy: "{user}がリノート"
noNotes: "ノートはありません"
noNotifications: "通知はありません"
instance: "サーバー"
@ -34,7 +37,6 @@ signup: "新規登録"
uploading: "アップロード中"
save: "保存"
users: "ユーザー"
approvals: "承認"
addUser: "ユーザーを追加"
favorite: "お気に入り"
favorites: "お気に入り"
@ -46,16 +48,15 @@ pin: "ピン留め"
unpin: "ピン留め解除"
copyContent: "内容をコピー"
copyLink: "リンクをコピー"
copyLinkRenote: "ブーストのリンクをコピー"
copyLinkRenote: "リノートのリンクをコピー"
delete: "削除"
deleteAndEdit: "削除して編集"
deleteAndEditConfirm: "このノートを削除してもう一度編集しますか?このノートへのリアクション、ブースト、返信も全て削除されます。"
deleteAndEditConfirm: "このノートを削除してもう一度編集しますか?このノートへのリアクション、リノート、返信も全て削除されます。"
addToList: "リストに追加"
addToAntenna: "アンテナに追加"
sendMessage: "メッセージを送信"
copyRSS: "RSSをコピー"
copyUsername: "ユーザー名をコピー"
openRemoteProfile: "リモートプロフィールを開く"
copyUserId: "ユーザーIDをコピー"
copyNoteId: "ートIDをコピー"
copyFileId: "ファイルIDをコピー"
@ -108,16 +109,14 @@ followRequests: "フォロー申請"
unfollow: "フォロー解除"
followRequestPending: "フォロー許可待ち"
enterEmoji: "絵文字を入力"
renote: "ブースト"
unrenote: "ブースト解除"
renoted: "ブーストしました。"
renotedToX: "{name} にブーストしました。"
quoted: "引用。"
rmboost: "ブースト解除しました。"
cantRenote: "この投稿はブーストできません。"
cantReRenote: "ブーストをブーストすることはできません。"
renote: "リノート"
unrenote: "リノート解除"
renoted: "リノートしました。"
renotedToX: "{name} にリノートしました。"
cantRenote: "この投稿はリノートできません。"
cantReRenote: "リノートをリノートすることはできません。"
quote: "引用"
inChannelRenote: "チャンネル内ブースト"
inChannelRenote: "チャンネル内リノート"
inChannelQuote: "チャンネル内引用"
renoteToChannel: "チャンネルにリノート"
renoteToOtherChannel: "他のチャンネルにリノート"
@ -144,19 +143,15 @@ unmarkAsSensitive: "センシティブを解除する"
enterFileName: "ファイル名を入力"
mute: "ミュート"
unmute: "ミュート解除"
renoteMute: "ブーストをミュート"
renoteUnmute: "ブーストのミュートを解除"
renoteMute: "リノートをミュート"
renoteUnmute: "リノートのミュートを解除"
block: "ブロック"
unblock: "ブロック解除"
markAsNSFW: "ユーザーのすべてのメディアをNSFWとしてマークする"
suspend: "凍結"
unsuspend: "解凍"
blockConfirm: "ブロックしますか?"
unblockConfirm: "ブロック解除しますか?"
nsfwConfirm: "このアカウントからのすべてのメディアをNSFWとしてマークしてもよろしいですか"
unNsfwConfirm: "このアカウントのすべてのメディアをNSFWとしてマーク解除してもよろしいですか"
suspendConfirm: "凍結しますか?"
approveConfirm: "このアカウントを承認してもよろしいですか?"
unsuspendConfirm: "解凍しますか?"
selectList: "リストを選択"
editList: "リストを編集"
@ -180,11 +175,9 @@ youCanCleanRemoteFilesCache: "ファイル管理の🗑️ボタンで全ての
cacheRemoteSensitiveFiles: "リモートのセンシティブなファイルをキャッシュする"
cacheRemoteSensitiveFilesDescription: "この設定を無効にすると、リモートのセンシティブなファイルはキャッシュせず直リンクするようになります。"
flagAsBot: "Botとして設定"
flagAsBotDescription: "このアカウントがプログラムによって運用される場合は、このフラグをオンにします。オンにすると、反応の連鎖を防ぐためのフラグとして他の開発者に役立ったり、Sharkeyのシステム上での扱いがBotに合ったものになります。"
flagAsBotDescription: "このアカウントがプログラムによって運用される場合は、このフラグをオンにします。オンにすると、反応の連鎖を防ぐためのフラグとして他の開発者に役立ったり、Misskeyのシステム上での扱いがBotに合ったものになります。"
flagAsCat: "にゃああああああああああああああ!!!!!!!!!!!!"
flagAsCatDescription: "にゃにゃにゃ??"
flagSpeakAsCat: "猫語で話す"
flagSpeakAsCatDescription: "有効にすると、あなたの投稿の 「な」を「にゃ」にします。"
flagShowTimelineReplies: "タイムラインにノートへの返信を表示する"
flagShowTimelineRepliesDescription: "オンにすると、タイムラインにユーザーのノート以外にもそのユーザーの他のノートへの返信を表示します。"
autoAcceptFollowed: "フォロー中ユーザーからのフォロリクを自動承認"
@ -246,6 +239,8 @@ silencedInstances: "サイレンスしたサーバー"
silencedInstancesDescription: "サイレンスしたいサーバーのホストを改行で区切って設定します。サイレンスされたサーバーに所属するアカウントはすべて「サイレンス」として扱われ、フォローがすべてリクエストになります。ブロックしたインスタンスには影響しません。"
mediaSilencedInstances: "メディアサイレンスしたサーバー"
mediaSilencedInstancesDescription: "メディアサイレンスしたいサーバーのホストを改行で区切って設定します。メディアサイレンスされたサーバーに所属するアカウントによるファイルはすべてセンシティブとして扱われ、カスタム絵文字が使用できないようになります。ブロックしたインスタンスには影響しません。"
federationAllowedHosts: "連合を許可するサーバー"
federationAllowedHostsDescription: "連合を許可するサーバーのホストを改行で区切って設定します。"
muteAndBlock: "ミュートとブロック"
mutedUsers: "ミュートしたユーザー"
blockedUsers: "ブロックしたユーザー"
@ -253,7 +248,7 @@ noUsers: "ユーザーはいません"
editProfile: "プロフィールを編集"
noteDeleteConfirm: "このノートを削除しますか?"
pinLimitExceeded: "これ以上ピン留めできません"
intro: "Sharkeyのインストールが完了しました管理者アカウントを作成しましょう。"
intro: "Misskeyのインストールが完了しました管理者アカウントを作成しましょう。"
done: "完了"
processing: "処理中"
preview: "プレビュー"
@ -331,7 +326,6 @@ lightThemes: "明るいテーマ"
darkThemes: "暗いテーマ"
syncDeviceDarkMode: "デバイスのダークモードと同期する"
drive: "ドライブ"
driveSearchbarPlaceholder: "検索ドライブ"
fileName: "ファイル名"
selectFile: "ファイルを選択"
selectFiles: "ファイルを選択"
@ -345,6 +339,7 @@ renameFolder: "フォルダー名を変更"
deleteFolder: "フォルダーを削除"
folder: "フォルダー"
addFile: "ファイルを追加"
showFile: "ファイルを表示"
emptyDrive: "ドライブは空です"
emptyFolder: "フォルダーは空です"
unableToDelete: "削除できません"
@ -357,7 +352,6 @@ copyUrl: "URLをコピー"
rename: "名前を変更"
avatar: "アイコン"
banner: "バナー"
background: "背景"
displayOfSensitiveMedia: "センシティブなメディアの表示"
whenServerDisconnected: "サーバーとの接続が失われたとき"
disconnectedFromServer: "サーバーから切断されました"
@ -450,7 +444,7 @@ exploreFediverse: "Fediverseを探索"
popularTags: "人気のタグ"
userList: "リスト"
about: "情報"
aboutMisskey: "Sharkeyについて"
aboutMisskey: "Misskeyについて"
administrator: "管理者"
token: "確認コード"
2fa: "二要素認証"
@ -460,6 +454,7 @@ totpDescription: "認証アプリを使ってワンタイムパスワードを
moderator: "モデレーター"
moderation: "モデレーション"
moderationNote: "モデレーションノート"
moderationNoteDescription: "モデレーター間でだけ共有されるメモを記入することができます。"
addModerationNote: "モデレーションノートを追加する"
moderationLogs: "モデログ"
nUsersMentioned: "{n}人が投稿"
@ -492,8 +487,6 @@ enable: "有効にする"
next: "次"
retype: "再入力"
noteOf: "{user}のノート"
expandAllCws: "すべての返信の内容を表示する"
collapseAllCws: "すべての返信の内容を隠す"
quoteAttached: "引用付き"
quoteQuestion: "引用として添付しますか?"
attachAsFileQuestion: "クリップボードのテキストが長いです。テキストファイルとして添付しますか?"
@ -523,7 +516,10 @@ uiLanguage: "UIの表示言語"
aboutX: "{x}について"
emojiStyle: "絵文字のスタイル"
native: "ネイティブ"
disableDrawer: "メニューをドロワーで表示しない"
menuStyle: "メニューのスタイル"
style: "スタイル"
drawer: "ドロワー"
popup: "ポップアップ"
showNoteActionsOnlyHover: "ノートのアクションをホバー時のみ表示する"
showReactionsCount: "ノートのリアクション数を表示する"
noHistory: "履歴はありません"
@ -538,12 +534,10 @@ createAccount: "アカウントを作成"
existingAccount: "既存のアカウント"
regenerate: "再生成"
fontSize: "フォントサイズ"
cornerRadius: "コーナーの丸み"
mediaListWithOneImageAppearance: "画像が1枚のみのメディアリストの高さ"
limitTo: "{x}を上限に"
noFollowRequests: "フォロー申請はありません"
openImageInNewTab: "画像を新しいタブで開く"
warnForMissingAltText: "代替テキストを入れ忘れたときに警告する"
dashboard: "ダッシュボード"
local: "ローカル"
remote: "リモート"
@ -576,8 +570,6 @@ objectStorageUseProxy: "Proxyを利用する"
objectStorageUseProxyDesc: "API接続にproxyを利用しない場合はオフにしてください"
objectStorageSetPublicRead: "アップロード時に'public-read'を設定する"
s3ForcePathStyleDesc: "s3ForcePathStyleを有効にすると、バケット名をURLのホスト名ではなくパスの一部として指定することを強制します。セルフホストされたMinioなどの使用時に有効にする必要がある場合があります。"
deeplFreeMode: "DeepLX-JS を使用する (認証キー不要)"
deeplFreeModeDescription: "DeepLX-JSの設定方法については、ドキュメントを参照してください。"
serverLogs: "サーバーログ"
deleteAll: "全て削除"
showFixedPostForm: "タイムライン上部に投稿フォームを表示する"
@ -593,7 +585,7 @@ popout: "ポップアウト"
volume: "音量"
masterVolume: "マスター音量"
notUseSound: "サウンドを出力しない"
useSoundOnlyWhenActive: "Sharkeyがアクティブな時のみサウンドを出力する"
useSoundOnlyWhenActive: "Misskeyがアクティブな時のみサウンドを出力する"
details: "詳細"
chooseEmoji: "絵文字を選択"
unableToProcess: "操作を完了できません"
@ -609,7 +601,9 @@ sort: "ソート"
ascendingOrder: "昇順"
descendingOrder: "降順"
scratchpad: "スクラッチパッド"
scratchpadDescription: "スクラッチパッドは、AiScriptの実験環境を提供します。Sharkeyと対話するコードの記述、実行、結果の確認ができます。"
scratchpadDescription: "スクラッチパッドは、AiScriptの実験環境を提供します。Misskeyと対話するコードの記述、実行、結果の確認ができます。"
uiInspector: "UIインスペクター"
uiInspectorDescription: "メモリ上に存在しているUIコンポーネントのインスタンスの一覧を見ることができます。UIコンポーネントはUi:C:系関数により生成されます。"
output: "出力"
script: "スクリプト"
disablePagesScript: "Pagesのスクリプトを無効にする"
@ -707,11 +701,6 @@ channel: "チャンネル"
create: "作成"
notificationSetting: "通知設定"
notificationSettingDesc: "表示する通知の種別を選択してください。"
enableFaviconNotificationDot: "未読の通知があるときにタブのアイコンを目立たせる"
verifyNotificationDotWorkingButton: "タブアイコン強調機能の動作確認"
notificationDotNotWorking: "このサーバーは現時点ではタブアイコン強調機能をサポートしていません。"
notificationDotWorking: "タブアイコン強調機能は、このサーバーで正しく機能しています。"
notificationDotNotWorkingAdvice: "タブアイコン強調機能が機能しない場合は、管理者にドキュメントを確認するように依頼してください {link}"
useGlobalSetting: "グローバル設定を使う"
useGlobalSettingDesc: "オンにすると、アカウントの通知設定が使用されます。オフにすると、個別に設定できるようになります。"
other: "その他"
@ -724,17 +713,14 @@ behavior: "動作"
sample: "サンプル"
abuseReports: "通報"
reportAbuse: "通報"
reportAbuseRenote: "ブーストを通報"
reportAbuseRenote: "リノートを通報"
reportAbuseOf: "{name}を通報する"
fillAbuseReportDescription: "通報理由の詳細を記入してください。対象のートやページなどがある場合はそのURLも記入してください。"
abuseReported: "内容が送信されました。ご報告ありがとうございました。"
reporter: "通報者"
reporteeOrigin: "通報先"
reporterOrigin: "通報元"
forwardReport: "リモートサーバーに通報を転送する"
forwardReportIsAnonymous: "リモートサーバーからはあなたの情報は見れず、匿名のシステムアカウントとして表示されます。"
send: "送信"
abuseMarkAsResolved: "対応済みにする"
openInNewTab: "新しいタブで開く"
openInSideView: "サイドビューで開く"
defaultNavigationBehaviour: "デフォルトのナビゲーション"
@ -753,14 +739,14 @@ unclip: "クリップ解除"
confirmToUnclipAlreadyClippedNote: "このノートはすでにクリップ「{name}」に含まれています。ノートをこのクリップから除外しますか?"
public: "パブリック"
private: "非公開"
i18nInfo: "Sharkeyは有志によって様々な言語に翻訳されています。{link}で翻訳に協力できます。"
i18nInfo: "Misskeyは有志によって様々な言語に翻訳されています。{link}で翻訳に協力できます。"
manageAccessTokens: "アクセストークンの管理"
accountInfo: "アカウント情報"
notesCount: "ノートの数"
repliesCount: "返信した数"
renotesCount: "ブーストした数"
renotesCount: "リノートした数"
repliedCount: "返信された数"
renotedCount: "ブーストされた数"
renotedCount: "リノートされた数"
followingCount: "フォロー数"
followersCount: "フォロワー数"
sentReactionsCount: "リアクションした数"
@ -776,11 +762,6 @@ noCrawleDescription: "外部の検索エンジンにあなたのユーザーペ
lockedAccountInfo: "フォローを承認制にしても、ノートの公開範囲を「フォロワー」にしない限り、誰でもあなたのノートを見ることができます。"
alwaysMarkSensitive: "デフォルトでメディアをセンシティブ設定にする"
loadRawImages: "添付画像のサムネイルをオリジナル画質にする"
showTickerOnReplies: "返信にサーバー情報を表示する"
searchEngine: "検索MFMの検索エンジン"
searchEngineOther: "カスタム"
searchEngineCustomURIDescription: "カスタム検索エンジンのURIは、\"https://www.google.com/search?q=\\{query}\" や \"https://www.google.com/search?q=%s\" のような形式で入力する必要があります。"
searchEngineCusomURI: "カスタム検索エンジン URI"
disableShowingAnimatedImages: "アニメーション画像を再生しない"
highlightSensitiveMedia: "メディアがセンシティブであることを分かりやすく表示"
verificationEmailSent: "確認のメールを送信しました。メールに記載されたリンクにアクセスして、設定を完了してください。"
@ -798,15 +779,13 @@ thisIsExperimentalFeature: "これは実験的な機能です。仕様が変更
developer: "開発者"
makeExplorable: "アカウントを見つけやすくする"
makeExplorableDescription: "オフにすると、「みつける」にアカウントが載らなくなります。"
makeIndexable: "公開ノートをインデックス不可にする"
makeIndexableDescription: "ノート検索があなたの公開ノートをインデックス化しないようにします。"
showGapBetweenNotesInTimeline: "タイムラインのノートを離して表示"
duplicate: "複製"
left: "左"
center: "中央"
wide: "広い"
narrow: "狭い"
reloadToApplySetting: "設定はページリロード後に反映されます。今すぐリロードしますか?"
reloadToApplySetting: "設定はページリロード後に反映されます。"
needReloadToApply: "反映には再起動が必要です。"
showTitlebar: "タイトルバーを表示する"
clearCache: "キャッシュをクリア"
@ -814,7 +793,7 @@ onlineUsersCount: "{n}人がオンライン"
nUsers: "{n}ユーザー"
nNotes: "{n}ノート"
sendErrorReports: "エラーリポートを送信"
sendErrorReportsDescription: "オンにすると、問題が発生したときにエラーの詳細情報がSharkeyに共有され、ソフトウェアの品質向上に役立てることができます。エラー情報には、OSのバージョン、ブラウザの種類、行動履歴などが含まれます。"
sendErrorReportsDescription: "オンにすると、問題が発生したときにエラーの詳細情報がMisskeyに共有され、ソフトウェアの品質向上に役立てることができます。エラー情報には、OSのバージョン、ブラウザの種類、行動履歴などが含まれます。"
myTheme: "マイテーマ"
backgroundColor: "背景"
accentColor: "アクセント"
@ -909,7 +888,7 @@ hashtags: "ハッシュタグ"
troubleshooting: "トラブルシューティング"
useBlurEffect: "UIにぼかし効果を使用"
learnMore: "詳しく"
misskeyUpdated: "Sharkeyが更新されました"
misskeyUpdated: "Misskeyが更新されました"
whatIsNew: "更新情報を見る"
translate: "翻訳"
translatedFrom: "{x}から翻訳"
@ -929,7 +908,6 @@ itsOff: "オフになっています"
on: "オン"
off: "オフ"
emailRequiredForSignup: "アカウント登録にメールアドレスを必須にする"
approvalRequiredForSignup: "アカウント登録を承認制にする"
unread: "未読"
filter: "フィルタ"
controlPanel: "コントロールパネル"
@ -944,8 +922,8 @@ followersVisibility: "フォロワーの公開範囲"
continueThread: "さらにスレッドを見る"
deleteAccountConfirm: "アカウントが削除されます。よろしいですか?"
incorrectPassword: "パスワードが間違っています。"
incorrectTotp: "ワンタイムパスワードが間違っているか、期限切れになっています。"
voteConfirm: "「{choice}」に投票しますか?"
voteConfirmMulti: "「{choice}」に投票しますか?\n 確認後、選択肢を増やすことができます。"
hide: "隠す"
useDrawerReactionPickerForMobile: "モバイルデバイスのときドロワーで表示"
welcomeBackWithName: "おかえりなさい、{name}さん"
@ -981,7 +959,6 @@ recentNHours: "直近{n}時間"
recentNDays: "直近{n}日"
noEmailServerWarning: "メールサーバーの設定がされていません。"
thereIsUnresolvedAbuseReportWarning: "未対応の通報があります。"
pendingUserApprovals: "承認待ちのユーザーがいます。"
recommended: "推奨"
check: "チェック"
driveCapOverrideLabel: "このユーザーのドライブ容量上限を変更"
@ -990,20 +967,9 @@ requireAdminForView: "閲覧するには管理者アカウントでログイン
isSystemAccount: "システムにより自動で作成・管理されているアカウントです。"
typeToConfirm: "この操作を行うには {x} と入力してください"
deleteAccount: "アカウント削除"
approveAccount: "承認する"
denyAccount: "拒否と削除"
approved: "承認済み"
notApproved: "承認されていない"
approvalStatus: "承認状況"
document: "ドキュメント"
numberOfPageCache: "ページキャッシュ数"
numberOfPageCacheDescription: "多くすると利便性が向上しますが、負荷とメモリ使用量が増えます。"
numberOfReplies: "スレッド内の返信数"
numberOfRepliesDescription: "この数値を大きくすると、より多くの返信が表示されます。この値を大きくしすぎると、UIが窮屈になって読みにくくなることがあります。"
boostSettings: "ブースト設定"
showVisibilitySelectorOnBoost: "公開範囲セレクターを表示"
showVisibilitySelectorOnBoostDescription: "無効の場合、以下で設定したデフォルトの公開範囲が使用され、セレクターは表示されません。"
visibilityOnBoost: "デフォルトのブースト公開範囲"
logoutConfirm: "ログアウトしますか?"
lastActiveDate: "最終利用日時"
statusbar: "ステータスバー"
@ -1048,14 +1014,12 @@ cannotLoad: "読み込めません"
numberOfProfileView: "プロフィール表示回数"
like: "いいね!"
unlike: "いいねを解除"
defaultLike: "絵文字のようなデフォルト"
numberOfLikes: "いいね数"
show: "表示"
neverShow: "今後表示しない"
remindMeLater: "また後で"
didYouLikeMisskey: "Sharkeyを気に入っていただけましたか"
pleaseDonate: "Sharkeyは{host}が使用している無料のソフトウェアです。これからも開発を続けられるように、ぜひ寄付をお願いします!"
pleaseDonateInstance: "インスタンス管理者への寄付によって{host}を直接サポートすることもできます。"
didYouLikeMisskey: "Misskeyを気に入っていただけましたか"
pleaseDonate: "Misskeyは{host}が使用している無料のソフトウェアです。これからも開発を続けられるように、ぜひ寄付をお願いします!"
correspondingSourceIsAvailable: "対応するソースコードは{anchor}から利用可能です。"
roles: "ロール"
role: "ロール"
@ -1083,16 +1047,8 @@ thisPostMayBeAnnoying: "この投稿は迷惑になる可能性があります
thisPostMayBeAnnoyingHome: "ホームに投稿"
thisPostMayBeAnnoyingCancel: "やめる"
thisPostMayBeAnnoyingIgnore: "このまま投稿"
thisPostIsMissingAltTextCancel: "やめる"
thisPostIsMissingAltTextIgnore: "このまま投稿"
thisPostIsMissingAltText: "代替テキストがないファイルが添付されています。すべての添付ファイルに代替テキストを含むようにしてください。"
collapseRenotes: "ブーストのスマート省略"
collapseRenotesDescription: "リアクションやブーストをしたことがあるノートをたたんで表示します。"
collapseNotesRepliedTo: "返信元のノートを折りたたむ"
collapseFiles: "ファイルを折りたたむ"
uncollapseCW: "CWを展開する"
expandLongNote: "長い投稿を常に展開する"
autoloadConversation: "会話スレッドを自動で読み込む"
collapseRenotes: "リノートのスマート省略"
collapseRenotesDescription: "リアクションやリノートをしたことがあるノートをたたんで表示します。"
internalServerError: "サーバー内部エラー"
internalServerErrorDescription: "サーバー内部で予期しないエラーが発生しました。"
copyErrorInfo: "エラー情報をコピー"
@ -1103,7 +1059,6 @@ disableFederationConfirm: "連合なしにしますか?"
disableFederationConfirmWarn: "連合なしにしても投稿は非公開になりません。ほとんどの場合、連合なしにする必要はありません。"
disableFederationOk: "連合なしにする"
invitationRequiredToRegister: "現在このサーバーは招待制です。招待コードをお持ちの方のみ登録できます。"
approvalRequiredToRegister: "現在このサーバーは承認制です。参加したい理由を記入し、承認された方のみ登録できます。"
emailNotSupported: "このサーバーではメール配信はサポートされていません"
postToTheChannel: "チャンネルに投稿"
cannotBeChangedLater: "後から変更できません。"
@ -1132,6 +1087,7 @@ retryAllQueuesConfirmTitle: "今すぐ再試行しますか?"
retryAllQueuesConfirmText: "一時的にサーバーの負荷が増大することがあります。"
enableChartsForRemoteUser: "リモートユーザーのチャートを生成"
enableChartsForFederatedInstances: "リモートサーバーのチャートを生成"
enableStatsForFederatedInstances: "リモートサーバーの情報を取得"
showClipButtonInNoteFooter: "ノートのアクションにクリップを追加"
reactionsDisplaySize: "リアクションの表示サイズ"
limitWidthOfReaction: "リアクションの最大横幅を制限し、縮小して表示する"
@ -1146,11 +1102,10 @@ accountMoved: "このユーザーは新しいアカウントに移行しまし
accountMovedShort: "このアカウントは移行されています"
operationForbidden: "この操作はできません"
forceShowAds: "常に広告を表示する"
oneko: "にゃんこフレンド :3"
addMemo: "メモを追加"
editMemo: "メモを編集"
reactionsList: "リアクション一覧"
renotesList: "ブースト一覧"
renotesList: "リノート一覧"
notificationDisplay: "通知の表示"
leftTop: "左上"
rightTop: "右上"
@ -1191,15 +1146,11 @@ rolesThatCanBeUsedThisEmojiAsReactionPublicRoleWarn: "ロールは公開ロー
cancelReactionConfirm: "リアクションを取り消しますか?"
changeReactionConfirm: "リアクションを変更しますか?"
later: "あとで"
goToMisskey: "Sharkeyへ"
goToMisskey: "Misskeyへ"
additionalEmojiDictionary: "絵文字の追加辞書"
installed: "インストール済み"
branding: "ブランディング"
enableServerMachineStats: "サーバーのマシン情報を公開する"
enableAchievements: "実績を有効にする"
turnOffAchievements: "オフにすると実績システムは無効になります。"
enableBotTrending: "botのハッシュタグ追加を許可する"
turnOffBotTrending: "オフにするとボットがハッシュタグを入力しなくなります。"
enableIdenticonGeneration: "ユーザーごとのIdenticon生成を有効にする"
turnOffToImprovePerformance: "オフにするとパフォーマンスが向上します。"
createInviteCode: "招待コードを作成"
@ -1230,20 +1181,18 @@ pastAnnouncements: "過去のお知らせ"
youHaveUnreadAnnouncements: "未読のお知らせがあります。"
useSecurityKey: "ブラウザまたはデバイスの指示に従って、セキュリティキーまたはパスキーを使用してください。"
replies: "返信"
renotes: "ブースト"
renotes: "リノート"
loadReplies: "返信を見る"
loadConversation: "会話を見る"
pinnedList: "ピン留めされたリスト"
keepScreenOn: "デバイスの画面を常にオンにする"
clickToOpen: "クリックしてノートを開く"
showBots: "ボットをタイムラインに表示"
verifiedLink: "このリンク先の所有者であることが確認されました"
notifyNotes: "投稿を通知"
unnotifyNotes: "投稿の通知を解除"
authentication: "認証"
authenticationRequiredToContinue: "続けるには認証を行ってください"
dateAndTime: "日時"
showRenotes: "ブーストを表示"
showRenotes: "リノートを表示"
edited: "編集済み"
notificationRecieveConfig: "通知の受信設定"
mutualFollow: "相互フォロー"
@ -1259,7 +1208,7 @@ externalServices: "外部サービス"
sourceCode: "ソースコード"
sourceCodeIsNotYetProvided: "ソースコードはまだ提供されていません。この問題の修正について管理者に問い合わせてください。"
repositoryUrl: "リポジトリURL"
repositoryUrlDescription: "ソースコードが公開されているリポジトリがある場合、そのURLを記入します。Sharkeyを現状のままソースコードにいかなる変更も加えずに使用している場合は https://activitypub.software/TransFem-org/Sharkey/ と記入します。"
repositoryUrlDescription: "ソースコードが公開されているリポジトリがある場合、そのURLを記入します。Misskeyを現状のままソースコードにいかなる変更も加えずに使用している場合は https://github.com/misskey-dev/misskey と記入します。"
repositoryUrlOrTarballRequired: "リポジトリを公開していない場合、代わりにtarballを提供する必要があります。詳細は.config/example.ymlを参照してください。"
feedback: "フィードバック"
feedbackUrl: "フィードバックURL"
@ -1269,8 +1218,6 @@ impressumDescription: "ドイツなどの一部の国と地域では表示が義
privacyPolicy: "プライバシーポリシー"
privacyPolicyUrl: "プライバシーポリシーURL"
tosAndPrivacyPolicy: "利用規約・プライバシーポリシー"
donation: "寄付する"
donationUrl: "寄付URL"
avatarDecorations: "アイコンデコレーション"
attach: "付ける"
detach: "外す"
@ -1327,6 +1274,33 @@ confirmWhenRevealingSensitiveMedia: "センシティブなメディアを表示
sensitiveMediaRevealConfirm: "センシティブなメディアです。表示しますか?"
createdLists: "作成したリスト"
createdAntennas: "作成したアンテナ"
fromX: "{x}から"
genEmbedCode: "埋め込みコードを生成"
noteOfThisUser: "このユーザーのノート一覧"
clipNoteLimitExceeded: "これ以上このクリップにノートを追加できません。"
performance: "パフォーマンス"
modified: "変更あり"
discard: "破棄"
thereAreNChanges: "{n}件の変更があります"
signinWithPasskey: "パスキーでログイン"
unknownWebAuthnKey: "登録されていないパスキーです。"
passkeyVerificationFailed: "パスキーの検証に失敗しました。"
passkeyVerificationSucceededButPasswordlessLoginDisabled: "パスキーの検証に成功しましたが、パスワードレスログインが無効になっています。"
messageToFollower: "フォロワーへのメッセージ"
target: "対象"
testCaptchaWarning: "CAPTCHAのテストを目的とした機能です。<strong>本番環境で使用しないでください。</strong>"
prohibitedWordsForNameOfUser: "禁止ワード(ユーザーの名前)"
prohibitedWordsForNameOfUserDescription: "このリストに含まれる文字列がユーザーの名前に含まれる場合、ユーザーの名前の変更を拒否します。モデレーター権限を持つユーザーはこの制限の影響を受けません。"
yourNameContainsProhibitedWords: "変更しようとした名前に禁止された文字列が含まれています"
yourNameContainsProhibitedWordsDescription: "名前に禁止されている文字列が含まれています。この名前を使用したい場合は、サーバー管理者にお問い合わせください。"
_abuseUserReport:
forward: "転送"
forwardDescription: "匿名のシステムアカウントとして、リモートサーバーに通報を転送します。"
resolve: "解決"
accept: "是認"
reject: "否認"
resolveTutorial: "内容が正当である通報に対応した場合は「是認」を選択し、肯定的にケースが解決されたことをマークします。\n内容が正当でない通報の場合は「否認」を選択し、否定的にケースが解決されたことをマークします。"
_delivery:
status: "配信状態"
@ -1380,7 +1354,7 @@ _initialAccountSetting:
pushNotificationDescription: "プッシュ通知を有効にすると{name}の通知をお使いのデバイスで受け取ることができます。"
initialAccountSettingCompleted: "初期設定が完了しました!"
haveFun: "{name}をお楽しみください!"
youCanContinueTutorial: "このまま{name}(Sharkey)の使い方についてのチュートリアルに進むこともできますが、ここで中断してすぐに使い始めることもできます。"
youCanContinueTutorial: "このまま{name}(Misskey)の使い方についてのチュートリアルに進むこともできますが、ここで中断してすぐに使い始めることもできます。"
startTutorial: "チュートリアルを開始"
skipAreYouSure: "初期設定をスキップしますか?"
laterAreYouSure: "初期設定をあとでやり直しますか?"
@ -1392,10 +1366,10 @@ _initialTutorial:
skipAreYouSure: "チュートリアルを終了しますか?"
_landing:
title: "チュートリアルへようこそ"
description: "ここでは、Sharkeyの基本的な使い方や機能を確認できます。"
description: "ここでは、Misskeyの基本的な使い方や機能を確認できます。"
_note:
title: "ノートって何?"
description: "Sharkeyでの投稿は「ート」と呼びます。ートはタイムラインに時系列で並んでいて、リアルタイムで更新されていきます。"
description: "Misskeyでの投稿は「ート」と呼びます。ートはタイムラインに時系列で並んでいて、リアルタイムで更新されていきます。"
reply: "返信することができます。返信に対しての返信も可能で、スレッドのように会話を続けることもできます。"
renote: "そのノートを自分のタイムラインに流して共有することができます。テキストを追加して引用することも可能です。"
reaction: "リアクションをつけることができます。詳しくは次のページで解説します。"
@ -1403,13 +1377,13 @@ _initialTutorial:
_reaction:
title: "リアクションって何?"
description: "ノートには「リアクション」をつけることができます。「いいね」では伝わらないニュアンスも、リアクションで簡単・気軽に表現できます。"
letsTryReacting: "リアクションは、ノートの「{reaction}」ボタンをクリックするとつけられます。試しにこのサンプルのノートにリアクションをつけてみてください!"
letsTryReacting: "リアクションは、ノートの「」ボタンをクリックするとつけられます。試しにこのサンプルのノートにリアクションをつけてみてください!"
reactToContinue: "リアクションをつけると先に進めるようになります。"
reactNotification: "あなたのノートが誰かにリアクションされると、リアルタイムで通知を受け取ります。"
reactDone: "「{undo}」ボタンを押すとリアクションを取り消すことができます。"
reactDone: "「」ボタンを押すとリアクションを取り消すことができます。"
_timeline:
title: "タイムラインのしくみ"
description1: "Sharkeyには、使い方に応じて複数のタイムラインが用意されていますサーバーによってはいずれかが無効になっていることがあります。"
description1: "Misskeyには、使い方に応じて複数のタイムラインが用意されていますサーバーによってはいずれかが無効になっていることがあります。"
home: "あなたがフォローしているアカウントの投稿を見られます。"
local: "このサーバーにいるユーザー全員の投稿を見られます。"
social: "ホームタイムラインとローカルタイムラインの投稿が両方表示されます。"
@ -1418,12 +1392,12 @@ _initialTutorial:
description3: "その他にも、リストタイムラインやチャンネルタイムラインなどがあります。詳しくは{link}をご覧ください。"
_postNote:
title: "ノートの投稿設定"
description1: "Sharkeyにートを投稿する際には、様々なオプションの設定が可能です。投稿フォームはこのようになっています。"
description1: "Misskeyにートを投稿する際には、様々なオプションの設定が可能です。投稿フォームはこのようになっています。"
_visibility:
description: "ノートを表示できる相手を制限できます。"
public: "すべてのユーザーに公開。"
home: "ホームタイムラインのみに公開。フォロワー・プロフィールを見に来た人・ブーストから、他のユーザーも見ることができます。"
followers: "フォロワーにのみ公開。本人以外がブーストすることはできず、またフォロワー以外は閲覧できません。"
home: "ホームタイムラインのみに公開。フォロワー・プロフィールを見に来た人・リノートから、他のユーザーも見ることができます。"
followers: "フォロワーにのみ公開。本人以外がリノートすることはできず、またフォロワー以外は閲覧できません。"
direct: "指定したユーザーにのみ公開され、また相手に通知が入ります。ダイレクトメッセージのかわりにお使いいただけます。"
doNotSendConfidencialOnDirect1: "機密情報は送信する際は注意してください。"
doNotSendConfidencialOnDirect2: "送信先のサーバーの管理者は投稿内容を見ることが可能なので、信頼できないサーバーのユーザーにダイレクト投稿を送信する場合は、機密情報の扱いに注意が必要です。"
@ -1446,7 +1420,7 @@ _initialTutorial:
doItToContinue: "画像をセンシティブに設定すると先に進めるようになります。"
_done:
title: "チュートリアルは終了です🎉"
description: "ここで紹介した機能はほんの一部にすぎません。Sharkeyの使い方をより詳しく知るには、{link}をご覧ください。"
description: "ここで紹介した機能はほんの一部にすぎません。Misskeyの使い方をより詳しく知るには、{link}をご覧ください。"
_timelineDescription:
home: "ホームタイムラインでは、あなたがフォローしているアカウントの投稿を見られます。"
@ -1469,8 +1443,10 @@ _serverSettings:
fanoutTimelineDescription: "有効にすると、各種タイムラインを取得する際のパフォーマンスが大幅に向上し、データベースへの負荷を軽減することが可能です。ただし、Redisのメモリ使用量は増加します。サーバーのメモリ容量が少ない場合、または動作が不安定な場合は無効にすることができます。"
fanoutTimelineDbFallback: "データベースへのフォールバック"
fanoutTimelineDbFallbackDescription: "有効にすると、タイムラインがキャッシュされていない場合にDBへ追加で問い合わせを行うフォールバック処理を行います。無効にすると、フォールバック処理を行わないことでさらにサーバーの負荷を軽減することができますが、タイムラインが取得できる範囲に制限が生じます。"
reactionsBufferingDescription: "有効にすると、リアクション作成時のパフォーマンスが大幅に向上し、データベースへの負荷を軽減することが可能です。ただし、Redisのメモリ使用量は増加します。"
inquiryUrl: "問い合わせ先URL"
inquiryUrlDescription: "サーバー運営者へのお問い合わせフォームのURLや、運営者の連絡先等が記載されたWebページのURLを指定します。"
thisSettingWillAutomaticallyOffWhenModeratorsInactive: "一定期間モデレーターのアクティビティが検出されなかった場合、スパム防止のためこの設定は自動でオフになります。"
_accountMigration:
moveFrom: "別のアカウントからこのアカウントに移行"
@ -1480,7 +1456,7 @@ _accountMigration:
moveTo: "このアカウントを新しいアカウントへ移行"
moveToLabel: "移行先のアカウント:"
moveCannotBeUndone: "アカウントを移行すると、取り消すことはできません。"
moveAccountDescription: "新しいアカウントへ移行します。\n ・フォロワーが新しいアカウントを自動でフォローします\n ・このアカウントからのフォローは全て解除されます\n ・このアカウントではートの作成などができなくなります\n\nフォロワーの移行は自動ですが、フォローの移行は手動で行う必要があります。移行前にこのアカウントでフォローエクスポートし、移行後すぐに移行先アカウントでインポートを行なってください。\nリスト・ミュート・ブロックについても同様ですので、手動で移行する必要があります。\n\nこの説明はこのサーバーSharkey v13.12.0以降の仕様です。Mastodonなどの他のActivityPubソフトウェアでは挙動が異なる場合があります。"
moveAccountDescription: "新しいアカウントへ移行します。\n ・フォロワーが新しいアカウントを自動でフォローします\n ・このアカウントからのフォローは全て解除されます\n ・このアカウントではートの作成などができなくなります\n\nフォロワーの移行は自動ですが、フォローの移行は手動で行う必要があります。移行前にこのアカウントでフォローエクスポートし、移行後すぐに移行先アカウントでインポートを行なってください。\nリスト・ミュート・ブロックについても同様ですので、手動で移行する必要があります。\n\nこの説明はこのサーバーMisskey v13.12.0以降の仕様です。Mastodonなどの他のActivityPubソフトウェアでは挙動が異なる場合があります。"
moveAccountHowTo: "アカウントの移行には、まずは移行先のアカウントでこのアカウントに対しエイリアスを作成します。\nエイリアス作成後、移行先のアカウントを次のように入力してください: @username@server.example.com"
startMigration: "移行する"
migrationConfirm: "本当にこのアカウントを {account} に移行しますか?一度移行すると取り消せず、二度とこのアカウントを元の状態で使用できなくなります。"
@ -1492,9 +1468,9 @@ _achievements:
earnedAt: "獲得日時"
_types:
_notes1:
title: "just setting up my shonk"
title: "just setting up my msky"
description: "初めてノートを投稿した"
flavor: "良いSharkeyライフを"
flavor: "良いMisskeyライフを"
_notes10:
title: "いくつかのノート"
description: "ートを10回投稿した"
@ -1590,7 +1566,7 @@ _achievements:
_login1000:
title: "ノートマスターⅢ"
description: "通算ログイン日数が1,000日"
flavor: "Sharkeyを使ってくれてありがとう"
flavor: "Misskeyを使ってくれてありがとう"
_noteClipped1:
title: "クリップせずにはいられないな"
description: "初めてノートをクリップした"
@ -1650,9 +1626,9 @@ _achievements:
title: "実績好き"
description: "実績一覧を3分以上眺め続けた"
_iLoveMisskey:
title: "I Love Sharkey"
description: "\"I ❤ #Sharkey\"を投稿した"
flavor: "Sharkeyを使ってくださりありがとうございます by 開発チーム"
title: "I Love Misskey"
description: "\"I ❤ #Misskey\"を投稿した"
flavor: "Misskeyを使ってくださりありがとうございます by 開発チーム"
_foundTreasure:
title: "宝探し"
description: "隠されたお宝を発見した"
@ -1660,7 +1636,7 @@ _achievements:
title: "ひとやすみ"
description: "クライアントを起動してから30分以上経過した"
_client60min:
title: "Sharkeyの見すぎ"
title: "Misskeyの見すぎ"
description: "クライアントを起動してから60分以上経過した"
_noteDeletedWithin1min:
title: "いまのなし"
@ -1731,7 +1707,7 @@ _achievements:
title: "テスト過剰"
description: "通知のテストをごく短時間のうちに連続して行った"
_tutorialCompleted:
title: "Sharkey初心者講座 修了証"
title: "Misskey初心者講座 修了証"
description: "チュートリアルを完了した"
_bubbleGameExplodingHead:
title: "🤯"
@ -1779,10 +1755,8 @@ _role:
high: "高"
_options:
gtlAvailable: "グローバルタイムラインの閲覧"
btlAvailable: "バブルタイムラインの閲覧"
ltlAvailable: "ローカルタイムラインの閲覧"
canPublicNote: "パブリック投稿の許可"
canImportNotes: "ノートのインポートが可能"
mentionMax: "ノート内の最大メンション数"
canInvite: "サーバー招待コードの発行"
inviteLimit: "招待コードの作成可能数"
@ -1807,6 +1781,11 @@ _role:
canSearchNotes: "ノート検索の利用"
canUseTranslator: "翻訳機能の利用"
avatarDecorationLimit: "アイコンデコレーションの最大取付個数"
canImportAntennas: "アンテナのインポートを許可"
canImportBlocking: "ブロックのインポートを許可"
canImportFollowing: "フォローのインポートを許可"
canImportMuting: "ミュートのインポートを許可"
canImportUserLists: "リストのインポートを許可"
_condition:
roleAssignedTo: "マニュアルロールにアサイン済み"
isLocal: "ローカルユーザー"
@ -1854,8 +1833,6 @@ _signup:
almostThere: "ほとんど完了です"
emailAddressInfo: "あなたが使っているメールアドレスを入力してください。メールアドレスが公開されることはありません。"
emailSent: "入力されたメールアドレス({email})宛に確認のメールが送信されました。メールに記載されたリンクにアクセスすると、アカウントの作成が完了します。メールに記載されているリンクの有効期限は30分です。"
approvalPending: "アカウントが作成され、承認待ちの状態です。"
reasonInfo: "インスタンスに参加したい理由を入力してください。"
_accountDelete:
accountDelete: "アカウントの削除"
@ -1926,20 +1903,17 @@ _registry:
createKey: "キーを作成"
_aboutMisskey:
about: "Sharkeyは、Misskeyをベースにしたオープンソースのソフトウェアです。"
contributors: "主なコントリビューター"
about: "Misskeyはsyuiloによって2014年から開発されている、オープンソースのソフトウェアです。"
contributors: "コントリビューター"
allContributors: "全てのコントリビューター"
source: "ソースコード"
original: "Misskey オリジナル"
original_sharkey: "Sharkey オリジナル"
thisIsModifiedVersion: "{name}はオリジナルのSharkeyを改変したバージョンを使用しています。"
translation: "Sharkeyを翻訳"
original: "オリジナル"
thisIsModifiedVersion: "{name}はオリジナルのMisskeyを改変したバージョンを使用しています。"
translation: "Misskeyを翻訳"
donate: "Misskeyに寄付"
donate_sharkey: "Sharkeyに寄付"
morePatrons: "他にも多くの方が支援してくれています。ありがとうございます🥰"
patrons: "支援者"
projectMembers: "プロジェクトメンバー"
testers: "テスター"
_displayOfSensitiveMedia:
respect: "センシティブ設定されたメディアを隠す"
@ -1955,7 +1929,6 @@ _serverDisconnectedBehavior:
reload: "自動でリロード"
dialog: "ダイアログで警告"
quiet: "控えめに警告"
disabled: "警告を無効にする"
_channel:
create: "チャンネルを作成"
@ -1969,7 +1942,7 @@ _channel:
notesCount: "{n}投稿があります"
nameAndDescription: "名前と説明"
nameOnly: "名前のみ"
allowRenoteToExternal: "チャンネル外へのブーストと引用ブーストを許可する"
allowRenoteToExternal: "チャンネル外へのリノートと引用リノートを許可する"
_menuDisplay:
sideFull: "横"
@ -1983,7 +1956,7 @@ _wordMute:
muteWordsDescription2: "キーワードをスラッシュで囲むと正規表現になります。"
_instanceMute:
instanceMuteDescription: "ミュートしたサーバーのユーザーへの返信を含めて、設定したサーバーの全てのノートとブーストをミュートします。"
instanceMuteDescription: "ミュートしたサーバーのユーザーへの返信を含めて、設定したサーバーの全てのノートとRenoteをミュートします。"
instanceMuteDescription2: "改行で区切って設定します"
title: "設定したサーバーのノートを隠します。"
heading: "ミュートするサーバー"
@ -2037,7 +2010,7 @@ _theme:
hashtag: "ハッシュタグ"
mention: "メンション"
mentionMe: "あなた宛てメンション"
renote: "Boost"
renote: "Renote"
modalBg: "モーダルの背景"
divider: "分割線"
scrollbarHandle: "スクロールバーの取っ手"
@ -2052,7 +2025,6 @@ _theme:
buttonBg: "ボタンの背景"
buttonHoverBg: "ボタンの背景 (ホバー)"
inputBorder: "入力ボックスの縁取り"
listItemHoverBg: "リスト項目の背景 (ホバー)"
driveFolderBg: "ドライブフォルダーの背景"
wallpaperOverlay: "壁紙のオーバーレイ"
badge: "バッジ"
@ -2073,7 +2045,7 @@ _soundSettings:
driveFileTypeWarn: "このファイルは対応していません"
driveFileTypeWarnDescription: "音声ファイルを選択してください"
driveFileDurationWarn: "音声が長すぎます"
driveFileDurationWarnDescription: "長い音声を使用するとSharkeyの使用に支障をきたす可能性があります。それでも続行しますか"
driveFileDurationWarnDescription: "長い音声を使用するとMisskeyの使用に支障をきたす可能性があります。それでも続行しますか"
driveFileError: "音声が読み込めませんでした。設定を変更してください"
_ago:
@ -2276,7 +2248,6 @@ _widgets:
_userList:
chooseList: "リストを選択"
clicker: "クリッカー"
search: "検索"
birthdayFollowings: "今日誕生日のユーザー"
_cw:
@ -2307,7 +2278,6 @@ _poll:
remainingHours: "終了まであと{h}時間{m}分"
remainingMinutes: "終了まであと{m}分{s}秒"
remainingSeconds: "終了まであと{s}秒"
multiple: "複数の選択肢"
_visibility:
public: "パブリック"
@ -2345,13 +2315,11 @@ _profile:
metadataContent: "内容"
changeAvatar: "アイコン画像を変更"
changeBanner: "バナー画像を変更"
updateBanner: "更新バナー"
removeBanner: "バナーを削除"
changeBackground: "背景を変更する"
updateBackground: "背景を更新する"
removeBackground: "背景を削除する"
verifiedLinkDescription: "内容にURLを設定すると、リンク先のWebサイトに自分のプロフィールへのリンクが含まれている場合に所有者確認済みアイコンを表示させることができます。"
avatarDecorationMax: "最大{max}つまでデコレーションを付けられます。"
followedMessage: "フォローされた時のメッセージ"
followedMessageDescription: "フォローされた時に相手に表示する短いメッセージを設定できます。"
followedMessageDescriptionForLockedAccount: "フォローを承認制にしている場合、フォローリクエストを許可した時に表示されます。"
_exportOrImport:
allNotes: "全てのノート"
@ -2398,7 +2366,6 @@ _timelines:
local: "ローカル"
social: "ソーシャル"
global: "グローバル"
bubble: "バッッブル"
_play:
new: "Playの作成"
@ -2481,12 +2448,11 @@ _notification:
youGotMention: "{name}からのメンション"
youGotReply: "{name}からのリプライ"
youGotQuote: "{name}による引用"
youRenoted: "{name}がBoostしました"
youRenoted: "{name}がRenoteしました"
youWereFollowed: "フォローされました"
youReceivedFollowRequest: "フォローリクエストが来ました"
yourFollowRequestAccepted: "フォローリクエストが承認されました"
pollEnded: "アンケートの結果が出ました"
edited: "投稿が編集されました"
newNote: "新しい投稿"
unreadAntennaNote: "アンテナ {name}"
roleAssigned: "ロールが付与されました"
@ -2501,6 +2467,8 @@ _notification:
renotedBySomeUsers: "{n}人がリノートしました"
followedBySomeUsers: "{n}人にフォローされました"
flushNotification: "通知の履歴をリセットする"
exportOfXCompleted: "{x}のエクスポートが完了しました"
login: "ログインがありました"
_types:
all: "すべて"
@ -2508,7 +2476,7 @@ _notification:
follow: "フォロー"
mention: "メンション"
reply: "リプライ"
renote: "Boost"
renote: "Renote"
quote: "引用"
reaction: "リアクション"
pollEnded: "アンケートが終了"
@ -2516,13 +2484,15 @@ _notification:
followRequestAccepted: "フォローが受理された"
roleAssigned: "ロールが付与された"
achievementEarned: "実績の獲得"
exportCompleted: "エクスポートが完了した"
login: "ログイン"
test: "通知のテスト"
app: "連携アプリからの通知"
edited: "編集済み"
_actions:
followBack: "フォローバック"
reply: "返信"
renote: "ブースト"
renote: "Renote"
_deck:
alwaysShowMainColumn: "常にメインカラムを表示"
@ -2582,14 +2552,17 @@ _webhookSettings:
followed: "フォローされたとき"
note: "ノートを投稿したとき"
reply: "返信されたとき"
renote: "Boostされたとき"
renote: "Renoteされたとき"
reaction: "リアクションがあったとき"
mention: "メンションされたとき"
_systemEvents:
abuseReport: "ユーザーから通報があったとき"
abuseReportResolved: "ユーザーからの通報を処理したとき"
userCreated: "ユーザーが作成されたとき"
inactiveModeratorsWarning: "モデレーターが一定期間非アクティブになったとき"
inactiveModeratorsInvitationOnlyChanged: "モデレーターが一定期間非アクティブだったため、システムにより招待制へと変更されたとき"
deleteConfirm: "Webhookを削除しますか"
testRemarks: "スイッチの右にあるボタンをクリックするとダミーのデータを使用したテスト用Webhookを送信できます。"
_abuseReport:
_notificationRecipient:
@ -2613,7 +2586,6 @@ _moderationLogTypes:
updateRole: "ロールを更新"
assignRole: "ロールへアサイン"
unassignRole: "ロールのアサイン解除"
approve: "承認済み"
suspend: "凍結"
unsuspend: "凍結解除"
addCustomEmoji: "カスタム絵文字追加"
@ -2636,6 +2608,8 @@ _moderationLogTypes:
markSensitiveDriveFile: "ファイルをセンシティブ付与"
unmarkSensitiveDriveFile: "ファイルをセンシティブ解除"
resolveAbuseReport: "通報を解決"
forwardAbuseReport: "通報を転送"
updateAbuseReportNote: "通報のモデレーションノート更新"
createInvitation: "招待コードを作成"
createAd: "広告を作成"
deleteAd: "広告を削除"
@ -2656,87 +2630,6 @@ _moderationLogTypes:
deleteFlash: "Playを削除"
deleteGalleryPost: "ギャラリーの投稿を削除"
_mfm:
uncommonFeature: "この機能は一般的に普及していないため、他のMisskeyフォークを含めた多くのFediverseソフトウェアで表示できないことがあります。"
intro: "MFM はMisskey, Sharkey, Firefish, Akkomaなど、多くの場所で使用できるマークアップ言語です。ここでは、利用できるMFM構文の一覧をご覧いただけます。"
dummy: "SharkeyでFediverseの世界が広がります"
mention: "メンション"
mentionDescription: "アットマーク + ユーザー名で、特定のユーザーを示すことができます。"
hashtag: "ハッシュタグ"
hashtagDescription: "ナンバーサイン + タグで、ハッシュタグを示すことができます。"
url: "URL"
urlDescription: "URLを示すことができます。"
link: "リンク"
linkDescription: "文章の特定の範囲を、URLに紐づけることができます。"
bold: "太字"
boldDescription: "文字を太く表示して強調することができます。"
small: "小文字"
smallDescription: "内容を小さく・薄く表示させることができます。"
center: "中央寄せ"
centerDescription: "内容を中央寄せで表示させることができます。"
inlineCode: "コード(インライン)"
inlineCodeDescription: "プログラムなどのコードをインラインでシンタックスハイライトします。"
blockCode: "コード(ブロック)"
blockCodeDescription: "複数行のプログラムなどのコードをブロックでシンタックスハイライトします。"
inlineMath: "数式(インライン)"
inlineMathDescription: "数式 KaTeX形式をインラインで表示します。"
blockMath: "数式(ブロック)"
blockMathDescription: "数式 KaTeX形式をブロックで表示します。"
quote: "引用"
quoteDescription: "内容が引用であることを示すことができます。"
emoji: "カスタム絵文字"
emojiDescription: "コロンでカスタム絵文字名を囲むと、カスタム絵文字を表示させることができます。"
search: "検索"
searchDescription: "検索ボックスを表示できます。"
flip: "反転"
flipDescription: "内容を上下または左右に反転させます。"
jelly: "アニメーション(びよんびよん)"
jellyDescription: "ゼリーが揺れるような感じのアニメーションをさせます。"
tada: "アニメーション(じゃーん)"
tadaDescription: "「じゃーん!」と強調するような感じのアニメーションをさせます。"
jump: "アニメーション(ジャンプ)"
jumpDescription: "跳ねるアニメーションをさせます。"
bounce: "アニメーション(バウンド)"
bounceDescription: "跳ねて着地するようなアニメーションをさせます。"
shake: "アニメーション(ぶるぶる)"
shakeDescription: "震えるアニメーションをさせます。"
twitch: "アニメーション(ガタガタ)"
twitchDescription: "より激しく震えるアニメーションをさせます。"
spin: "アニメーション(回転)"
spinDescription: "内容を回転させます。"
x2: "大"
x2Description: "内容を大きく表示させます。"
x3: "特大"
x3Description: "内容をより大きく表示させます。"
x4: "超特大"
x4Description: "内容をさらに大きく表示させます。"
blur: "ぼかし"
blurDescription: "内容をぼかすことができます。ポインターを上に乗せるとはっきり見えるようになります。"
font: "フォント"
fontDescription: "内容のフォントを指定することができます。"
rainbow: "レインボー"
rainbowDescription: "内容を虹色で表示させます。"
sparkle: "キラキラ"
sparkleDescription: "キラキラと星型のパーティクルを表示させます。"
rotate: "角度変更"
rotateDescription: "指定した角度で回転させます。"
position: "位置変更"
positionDescription: "位置をずらすことができます。"
crop: "切り取り"
cropDescription: "内容を切り抜きます。"
followMouse: "マウス追従"
followMouseDescription: "内容がマウスに追従します。スマホの場合はタップした場所に追従します。"
scale: "拡大"
scaleDescription: "内容を引き伸ばして表示します。"
foreground: "文字色"
foregroundDescription: "文字色を変更します。"
fade: 'フェード'
fadeDescription: '内容をフェードイン・フェードアウトさせます。'
background: "背景色"
backgroundDescription: "背景色を変更します。"
plain: "Plain"
plainDescription: "内側の構文を全て無効にします。"
_fileViewer:
title: "ファイルの詳細"
type: "ファイルタイプ"
@ -2788,19 +2681,6 @@ _externalResourceInstaller:
title: "テーマのインストールに失敗しました"
description: "テーマのインストール中に問題が発生しました。もう一度お試しください。エラーの詳細はJavascriptコンソールをご覧ください。"
_animatedMFM:
play: "MFMアニメーションを再生"
stop: "MFMアニメーション停止"
_alert:
text: "MFMアニメーションには、高速で点滅したり動いたりするテキスト・絵文字を含む場合があります。"
confirm: "再生する"
_dataRequest:
title: "データリクエスト"
warn: "データリクエストは3日ごとに可能です。"
text: "データの保存が完了すると、このアカウントに登録されているメールアドレスにメールが送信されます。"
button: "データリクエスト実行"
_dataSaver:
_media:
title: "メディアの読み込みを無効化"
@ -2894,3 +2774,18 @@ _contextMenu:
app: "アプリケーション"
appWithShift: "Shiftキーでアプリケーション"
native: "ブラウザのUI"
_embedCodeGen:
title: "埋め込みコードをカスタマイズ"
header: "ヘッダーを表示"
autoload: "自動で続きを読み込む(非推奨)"
maxHeight: "高さの最大値"
maxHeightDescription: "0で最大値の設定が無効になります。ウィジェットが縦に伸び続けるのを防ぐために、何らかの値に指定してください。"
maxHeightWarn: "高さの最大値制限が無効0になっています。これが意図した変更ではない場合は、高さの最大値を何らかの値に設定してください。"
previewIsNotActual: "プレビュー画面で表示可能な範囲を超えたため、実際に埋め込んだ際とは表示が異なります。"
rounded: "角丸にする"
border: "外枠に枠線をつける"
applyToPreview: "プレビューに反映"
generateCode: "埋め込みコードを作成"
codeGenerated: "コードが生成されました"
codeGeneratedDescription: "生成されたコードをウェブサイトに貼り付けてご利用ください。"

View file

@ -1,8 +1,8 @@
---
_lang_: "日本語 (関西弁)"
headlineMisskey: "ノートでつながるネットワーク"
introMisskey: "ようお越し!Sharkeyは、オープンソースの分散型マイクロブログサービスやねん。\n「ート」を作って、いま起こっとることを共有したり、あんたについて皆に発信しよう📡\n「ツッコミ」機能で、皆のートに素早く反応を追加したりもできるで✌\nほな、新しい世界を探検しよか🚀"
poweredByMisskeyDescription: "{name}は、オープンソースのプラットフォーム<b>Sharkey</b>のサーバーのひとつなんやで。"
introMisskey: "ようお越し!Misskeyは、オープンソースの分散型マイクロブログサービスやねん。\n「ート」を作って、いま起こっとることを共有したり、あんたについて皆に発信しよう📡\n「ツッコミ」機能で、皆のートに素早く反応を追加したりもできるで✌\nほな、新しい世界を探検しよか🚀"
poweredByMisskeyDescription: "{name}は、オープンソースのプラットフォーム<b>Misskey</b>のサーバーのひとつなんやで。"
monthAndDay: "{month}月 {day}日"
search: "探す"
notifications: "通知"
@ -15,7 +15,7 @@ gotIt: "ほい"
cancel: "やめとく"
noThankYou: "やめとく"
enterUsername: "ユーザー名を入れてや"
renotedBy: "{user}がブーストしたで"
renotedBy: "{user}がリノートしたで"
noNotes: "ノートはあらへん"
noNotifications: "通知はあらへん"
instance: "サーバー"
@ -45,10 +45,10 @@ pin: "ピン留めしとく"
unpin: "やっぱピン留めせん"
copyContent: "内容をコピー"
copyLink: "リンクをコピー"
copyLinkRenote: "ブーストのリンクをコピーするで?"
copyLinkRenote: "リノートのリンクをコピーするで?"
delete: "ほかす"
deleteAndEdit: "ほかして直す"
deleteAndEditConfirm: "このノートをほかしてもっかい直す?このノートへのツッコミ、ブースト、返信も全部消えるんやけどそれでもええん?"
deleteAndEditConfirm: "このノートをほかしてもっかい直す?このノートへのツッコミ、リノート、返信も全部消えるんやけどそれでもええん?"
addToList: "リストに入れたる"
addToAntenna: "アンテナに入れる"
sendMessage: "メッセージを送る"
@ -113,7 +113,7 @@ renotedToX: "{name}にリノートしたで"
cantRenote: "この投稿はリノートできへんっぽい。"
cantReRenote: "リノート自体はリノートできへんで。"
quote: "引用"
inChannelRenote: "チャンネルの中でブースト"
inChannelRenote: "チャンネルの中でリノート"
inChannelQuote: "チャンネル内引用"
renoteToChannel: "チャンネルにリノート"
renoteToOtherChannel: "他のチャンネルにリノート"
@ -140,8 +140,8 @@ unmarkAsSensitive: "そこまでアカンことないやろ"
enterFileName: "ファイル名を入れてや"
mute: "ミュート"
unmute: "ミュートやめたる"
renoteMute: "ブーストは見いひん"
renoteUnmute: "ブーストもやっぱ見るわ"
renoteMute: "リノートは見いひん"
renoteUnmute: "リノートもやっぱ見るわ"
block: "ブロック"
unblock: "ブロックやめたる"
suspend: "凍結"
@ -172,11 +172,9 @@ youCanCleanRemoteFilesCache: "ファイル管理にある🗑️ボタンでキ
cacheRemoteSensitiveFiles: "リモートのきわどいファイルをキャッシュに突っ込む"
cacheRemoteSensitiveFilesDescription: "この設定を切ると、リモートのきわどいファイルはキャッシュせず直でリンクするようになるで。"
flagAsBot: "Botにするで"
flagAsBotDescription: "もしこのアカウントをプログラム使うて運用するんやったら、このフラグをオンにしてや。オンにすれば、反応がバーッて連鎖せんように開発者が使うたり、Sharkeyのシステム上での扱いがBotに合ったもんになるからな。"
flagAsBotDescription: "もしこのアカウントをプログラム使うて運用するんやったら、このフラグをオンにしてや。オンにすれば、反応がバーッて連鎖せんように開発者が使うたり、Misskeyのシステム上での扱いがBotに合ったもんになるからな。"
flagAsCat: "猫や。かわええな。"
flagAsCatDescription: "ネコになりたいんならこれつけとき。"
flagSpeakAsCat: "猫語で話すで"
flagSpeakAsCatDescription: "有効にすると、あなたの投稿の 「な」を「にゃ」にするでー。"
flagShowTimelineReplies: "タイムラインにノートへの返信を表示するで"
flagShowTimelineRepliesDescription: "オンにしたら、タイムラインにユーザーのノートの他にもそのユーザーの他のノートへの返信を表示するで。"
autoAcceptFollowed: "フォローしとるユーザーからのフォローリクエストを勝手に許可しとく"
@ -245,7 +243,7 @@ noUsers: "ユーザーはおらん"
editProfile: "プロフィールをいじる"
noteDeleteConfirm: "このノートをほかしてええか?"
pinLimitExceeded: "これ以上ピン留めできひん"
intro: "Sharkeyのインストールが完了したで管理者アカウントを作ってや。"
intro: "Misskeyのインストールが完了したで管理者アカウントを作ってや。"
done: "でけた"
processing: "処理しとる"
preview: "プレビュー"
@ -440,7 +438,7 @@ exploreFediverse: "Fediverseを探ってみる"
popularTags: "人気のタグ"
userList: "リスト"
about: "情報"
aboutMisskey: "Sharkeyってなんや"
aboutMisskey: "Misskeyってなんや"
administrator: "管理者"
token: "確認コード"
2fa: "二要素認証"
@ -511,7 +509,6 @@ uiLanguage: "UIの表示言語"
aboutX: "{x}について"
emojiStyle: "絵文字のスタイル"
native: "ネイティブ"
disableDrawer: "メニューをドロワーで表示せえへん"
showNoteActionsOnlyHover: "ノートの操作部をホバー時のみ表示するで"
showReactionsCount: "ノートのリアクション数を表示する"
noHistory: "履歴はないわ。"
@ -577,7 +574,7 @@ popout: "ポップアウト"
volume: "やかましさ"
masterVolume: "全体のやかましさ"
notUseSound: "音出さへん"
useSoundOnlyWhenActive: "Sharkeyがアクティブなときだけ音出す"
useSoundOnlyWhenActive: "Misskeyがアクティブなときだけ音出す"
details: "もっと"
chooseEmoji: "絵文字を選ぶ"
unableToProcess: "なんか奥の方で詰まってもうた"
@ -593,7 +590,7 @@ sort: "仕分ける"
ascendingOrder: "小さい順"
descendingOrder: "大きい順"
scratchpad: "スクラッチパッド"
scratchpadDescription: "スクラッチパッドではAiScriptを色々試すことができるんや。Sharkeyに対して色々できるコードを書いて動かしてみたり、結果を見たりできるで。"
scratchpadDescription: "スクラッチパッドではAiScriptを色々試すことができるんや。Misskeyに対して色々できるコードを書いて動かしてみたり、結果を見たりできるで。"
output: "出力"
script: "スクリプト"
disablePagesScript: "Pagesのスクリプトを無効にしてや"
@ -703,17 +700,14 @@ behavior: "動作"
sample: "サンプル"
abuseReports: "通報"
reportAbuse: "通報"
reportAbuseRenote: "ブースト苦情だすで?"
reportAbuseRenote: "リノート苦情だすで?"
reportAbuseOf: "{name}を通報する"
fillAbuseReportDescription: "細かい通報理由を書いてなー。対象ートがある時はそのURLも書いといてなー。"
abuseReported: "無事内容が送信されたみたいやで。おおきに〜。"
reporter: "通報者"
reporteeOrigin: "通報先"
reporterOrigin: "通報元"
forwardReport: "リモートサーバーに通報を転送するで"
forwardReportIsAnonymous: "リモートサーバーからはあんたの情報は見えんなって、匿名のシステムアカウントとして表示されるで。"
send: "送信"
abuseMarkAsResolved: "対応したで"
openInNewTab: "新しいタブで開く"
openInSideView: "サイドビューで開く"
defaultNavigationBehaviour: "デフォルトのナビゲーション"
@ -732,14 +726,14 @@ unclip: "クリップやめとく"
confirmToUnclipAlreadyClippedNote: "このノートはもう「{name}」に含まれとるで。ノート、このクリップから外そか?"
public: "パブリック"
private: "非公開"
i18nInfo: "Sharkeyは有志がいろんな言語に訳しとるで。{link}で翻訳に協力したってやー。"
i18nInfo: "Misskeyは有志がいろんな言語に訳しとるで。{link}で翻訳に協力したってやー。"
manageAccessTokens: "アクセストークンの管理"
accountInfo: "アカウント情報"
notesCount: "ノートの数やで"
repliesCount: "返信した数やで"
renotesCount: "ブーストした数やで"
renotesCount: "リノートした数やで"
repliedCount: "返信された数やで"
renotedCount: "ブーストされた数やで"
renotedCount: "リノートされた数やで"
followingCount: "フォロー数やで"
followersCount: "フォロワー数やで"
sentReactionsCount: "ツッコんだ数"
@ -786,7 +780,7 @@ onlineUsersCount: "{n}人が起きとるで"
nUsers: "{n}ユーザー"
nNotes: "{n}ノート"
sendErrorReports: "エラーリポートを送る"
sendErrorReportsDescription: "オンにしたら、なんか変なことが起きたとき、詳しいのが全部Sharkeyに送られて、ソフトウェアをもっと良うするで。エラー情報には、OSのバージョン、ブラウザの種類、行動履歴なんかが含まれるな。"
sendErrorReportsDescription: "オンにしたら、なんか変なことが起きたとき、詳しいのが全部Misskeyに送られて、ソフトウェアをもっと良うするで。エラー情報には、OSのバージョン、ブラウザの種類、行動履歴なんかが含まれるな。"
myTheme: "マイテーマ"
backgroundColor: "背景"
accentColor: "アクセント"
@ -881,7 +875,7 @@ hashtags: "ハッシュタグ"
troubleshooting: "トラブルシューティング"
useBlurEffect: "UIにぼかし効果を使うで"
learnMore: "詳しく"
misskeyUpdated: "Sharkeyが更新されたで\nモデレーターの人らに感謝せなあかんで"
misskeyUpdated: "Misskeyが更新されたで\nモデレーターの人らに感謝せなあかんで"
whatIsNew: "更新情報を見るで"
translate: "翻訳"
translatedFrom: "{x}から翻訳するで"
@ -1010,8 +1004,8 @@ numberOfLikes: "いいね数"
show: "表示"
neverShow: "今後表示しない"
remindMeLater: "また後で"
didYouLikeMisskey: "Sharkey気に入ってくれた"
pleaseDonate: "Sharkeyは{host}が使うとる無料のソフトウェアやで。これからも開発を続けれるように、寄付したってな~。"
didYouLikeMisskey: "Misskey気に入ってくれた"
pleaseDonate: "Misskeyは{host}が使うとる無料のソフトウェアやで。これからも開発を続けれるように、寄付したってな~。"
correspondingSourceIsAvailable: "{anchor}"
roles: "ロール"
role: "ロール"
@ -1039,8 +1033,8 @@ thisPostMayBeAnnoying: "この投稿は迷惑かもしらんで。"
thisPostMayBeAnnoyingHome: "ホームに投稿"
thisPostMayBeAnnoyingCancel: "やめとく"
thisPostMayBeAnnoyingIgnore: "このまま投稿"
collapseRenotes: "見たことあるブーストは飛ばして表示するで"
collapseRenotesDescription: "リアクションやブーストをしたことがあるノートをたたんで表示するで。"
collapseRenotes: "見たことあるリノートは飛ばして表示するで"
collapseRenotesDescription: "リアクションやリノートをしたことがあるノートをたたんで表示するで。"
internalServerError: "サーバー内部エラー"
internalServerErrorDescription: "サーバーでなんか変なこと起こっとるわ。"
copyErrorInfo: "エラー情報をコピるで"
@ -1096,7 +1090,7 @@ forceShowAds: "いっつも広告を映す"
addMemo: "メモを足す"
editMemo: "メモをいらう"
reactionsList: "ツッコミ一覧"
renotesList: "ブースト一覧"
renotesList: "リノート一覧"
notificationDisplay: "通知見せる"
leftTop: "左上"
rightTop: "右上"
@ -1137,7 +1131,7 @@ rolesThatCanBeUsedThisEmojiAsReactionPublicRoleWarn: "ロールは公開ロー
cancelReactionConfirm: "ツッコむんをやっぱやめるか?"
changeReactionConfirm: "ツッコミを別のに変えるか?"
later: "あとで"
goToMisskey: "Sharkeyへ"
goToMisskey: "Misskeyへ"
additionalEmojiDictionary: "絵文字の追加辞書"
installed: "インストールしとる"
branding: "ブランディング"
@ -1172,7 +1166,7 @@ pastAnnouncements: "過去のお知らせやで"
youHaveUnreadAnnouncements: "あんたまだこのお知らせ読んどらんやろ。"
useSecurityKey: "ブラウザまたはデバイスの言う通りに、セキュリティキーまたはパスキーを使ってや。"
replies: "返事"
renotes: "ブースト"
renotes: "リノート"
loadReplies: "返信を見るで"
loadConversation: "会話を見るで"
pinnedList: "ピン留めしはったリスト"
@ -1183,7 +1177,7 @@ unnotifyNotes: "投稿の通知やめる"
authentication: "認証"
authenticationRequiredToContinue: "続けるんなら認証してや。"
dateAndTime: "日時"
showRenotes: "ブースト出す"
showRenotes: "リノート出す"
edited: "いじったやつ"
notificationRecieveConfig: "通知もらうかの設定"
mutualFollow: "お互いフォローしてんで"
@ -1314,7 +1308,7 @@ _initialAccountSetting:
pushNotificationDescription: "プッシュ通知を有効にすると{name}の通知をあんたのデバイスで受け取れるで。"
initialAccountSettingCompleted: "初期設定終わりや!"
haveFun: "{name}、楽しんでな~"
youCanContinueTutorial: "こんまま{name}(Sharkey)の使い方のチュートリアルにも行けるけど、ここでやめてすぐに使い始めてもええで。"
youCanContinueTutorial: "こんまま{name}(Misskey)の使い方のチュートリアルにも行けるけど、ここでやめてすぐに使い始めてもええで。"
startTutorial: "チュートリアルはじめる"
skipAreYouSure: "初期設定飛ばすか?"
laterAreYouSure: "初期設定あとでやり直すん?"
@ -1325,10 +1319,10 @@ _initialTutorial:
skipAreYouSure: "チュートリアルやめるか?"
_landing:
title: "チュートリアルによう来たな"
description: "ここでは、Sharkeyのカンタンな使い方とか機能を確かめれんで。"
description: "ここでは、Misskeyのカンタンな使い方とか機能を確かめれんで。"
_note:
title: "ノートってなんや?"
description: "Sharkeyでの投稿は「ート」って呼ばれてんで。ートは順々にタイムラインに載ってて、リアルタイムで新しくなってってんで。"
description: "Misskeyでの投稿は「ート」って呼ばれてんで。ートは順々にタイムラインに載ってて、リアルタイムで新しくなってってんで。"
reply: "返信もできるで。返信の返信もできるから、スレッドっぽく会話をそのまま続けれもするで。"
renote: "そのノートを自分のタイムラインに流して共有できるで。テキスト入れて引用してもええな。"
reaction: "ツッコミをつけることもできるで。細かいことは次のページや。"
@ -1336,13 +1330,13 @@ _initialTutorial:
_reaction:
title: "ツッコミってなんや?"
description: "ノートには「ツッコミ」できんねん。「いいね」とか何言っとるかわからんし、簡単に表現できるのはええことやん?"
letsTryReacting: "ノートの「{reaction}」ボタンでツッコめるわ。試しに下のノートにツッコんでみ。"
letsTryReacting: "ノートの「」ボタンでツッコめるわ。試しに下のノートにツッコんでみ。"
reactToContinue: "ツッコんだら進めるようになるで。"
reactNotification: "あんたのノートが誰かにツッコまれたら、すぐ通知するで。"
reactDone: "「{undo}」ボタンでツッコミやめれるで。"
reactDone: "「」ボタンでツッコミやめれるで。"
_timeline:
title: "タイムラインのしくみ"
description1: "Sharkeyには、いろいろタイムラインがあんでただ、サーバーによっては無効化されてるところもあるな。"
description1: "Misskeyには、いろいろタイムラインがあんでただ、サーバーによっては無効化されてるところもあるな。"
home: "あんたがフォローしてるアカウントの投稿が見れんねん。"
local: "このサーバーの中におる全員の投稿が見れるで。"
social: "ホームタイムラインの投稿もローカルタイムラインのも一緒に見れるで。"
@ -1351,12 +1345,12 @@ _initialTutorial:
description3: "その他にも、リストタイムラインとかチャンネルタイムラインとかがあんねん。詳しいのは{link}を見とき。"
_postNote:
title: "ノートの投稿設定"
description1: "Sharkeyにートを投稿するとき、いろんなオプションが付けれるで。投稿画面はこんな感じや。"
description1: "Misskeyにートを投稿するとき、いろんなオプションが付けれるで。投稿画面はこんな感じや。"
_visibility:
description: "ノートを見れる相手を制限できるわ。"
public: "みんなに見せるで。"
home: "ホームタイムラインにだけ見せるで。フォロワーとか、プロフィールを見に来た人、ブーストからも見れるから、実質は全員見れるけどな。あんまし広がりにくいってことや。"
followers: "フォロワーにだけ見せるで。自分以外はブーストできへんし、フォロワー以外は絶対に見れへん。"
home: "ホームタイムラインにだけ見せるで。フォロワーとか、プロフィールを見に来た人、リノートからも見れるから、実質は全員見れるけどな。あんまし広がりにくいってことや。"
followers: "フォロワーにだけ見せるで。自分以外はリノートできへんし、フォロワー以外は絶対に見れへん。"
direct: "指定した人にだけ公開されて、ついでに通知も送るで。ダイレクトメールの代わりとして使ってな。"
doNotSendConfidencialOnDirect1: "機密情報を送るときは十分注意せえよ。"
doNotSendConfidencialOnDirect2: "送信先のサーバーの管理者は投稿内容が見れるから、信用できへんサーバーのひとにダイレクト投稿するときには、めっちゃ用心しとくんやで。"
@ -1422,7 +1416,7 @@ _achievements:
_notes1:
title: "まいど!"
description: "初めてノート投稿したった"
flavor: "Sharkeyを楽しんでな"
flavor: "Misskeyを楽しんでな"
_notes10:
title: "ノートの天保山"
description: "ートを10回投稿した"
@ -1518,7 +1512,7 @@ _achievements:
_login1000:
title: "ノートマイスターⅢ"
description: "通算1,000日ログインした"
flavor: "Sharkeyようさん使てもろておおきにな"
flavor: "Misskeyようさん使てもろておおきにな"
_noteClipped1:
title: "アカンどれもクリップしたいわ"
description: "初めてノートをクリップした"
@ -1578,9 +1572,9 @@ _achievements:
title: "実績好き"
description: "実績一覧を3分以上眺め続けた"
_iLoveMisskey:
title: "Sharkey好きやねん"
description: "\"I ❤ #Sharkey\"を投稿した"
flavor: "Sharkeyを使ってくれておおきにな by 開発チーム"
title: "Misskey好きやねん"
description: "\"I ❤ #Misskey\"を投稿した"
flavor: "Misskeyを使ってくれておおきにな by 開発チーム"
_foundTreasure:
title: "なんでも鑑定団"
description: "隠されたお宝を発見した"
@ -1588,7 +1582,7 @@ _achievements:
title: "ねんね"
description: "クライアントを起動してから30分以上経過した"
_client60min:
title: "Sharkeyの見過ぎや"
title: "Misskeyの見過ぎや"
description: "クライアント付けてから1時間経ってもうたで。"
_noteDeletedWithin1min:
title: "*おおっと*"
@ -1659,7 +1653,7 @@ _achievements:
title: "心配性"
description: "通知のテストしすぎやって"
_tutorialCompleted:
title: "Sharkeyひよっこ講座 修了証"
title: "Misskeyひよっこ講座 修了証"
description: "チュートリアル全部やった"
_bubbleGameExplodingHead:
title: "🤯"
@ -1836,14 +1830,14 @@ _registry:
domain: "ドメイン"
createKey: "キーを作る"
_aboutMisskey:
about: "Sharkeyは、Misskeyをベースにしたオープンソースなソフトウェアや。"
about: "Misskeyはsyuiloが2014年からずっと作ってはる、オープンソースなソフトウェアや。"
contributors: "主な貢献者"
allContributors: "全ての貢献者"
source: "ソースコード"
original: "オリジナル"
thisIsModifiedVersion: "{name}はオリジナルのSharkeyをいじったバージョンをつこうてるで。"
translation: "Sharkeyを翻訳"
donate: "Sharkeyに寄付"
thisIsModifiedVersion: "{name}はオリジナルのMisskeyをいじったバージョンをつこうてるで。"
translation: "Misskeyを翻訳"
donate: "Misskeyに寄付"
morePatrons: "他にもぎょうさんの人からサポートしてもろてんねん。ほんまおおきに🥰"
patrons: "支援者"
projectMembers: ""
@ -1871,7 +1865,7 @@ _channel:
notesCount: "{n}こ投稿があるで"
nameAndDescription: "名前と説明"
nameOnly: "名前だけ"
allowRenoteToExternal: "チャンネルの外にブーストできるようにする"
allowRenoteToExternal: "チャンネルの外にリノートできるようにする"
_menuDisplay:
sideFull: "横"
sideIcon: "横(アイコン)"
@ -1949,7 +1943,6 @@ _theme:
buttonBg: "ボタンの背景"
buttonHoverBg: "ボタンの背景 (ホバー)"
inputBorder: "入力ボックスの縁取り"
listItemHoverBg: "リスト項目の背景 (ホバー)"
driveFolderBg: "ドライブフォルダーの背景"
wallpaperOverlay: "壁紙のオーバーレイ"
badge: "バッジ"
@ -1968,7 +1961,7 @@ _soundSettings:
driveFileTypeWarn: "このファイルは対応しとらへん"
driveFileTypeWarnDescription: "音声ファイルを選びや"
driveFileDurationWarn: "音が長すぎるわ"
driveFileDurationWarnDescription: "長い音使うたらSharkey使うのに良うないかもしれへんで。それでもええか"
driveFileDurationWarnDescription: "長い音使うたらMisskey使うのに良うないかもしれへんで。それでもええか"
driveFileError: "音声が読み込めへんかったで。設定を変更せえや"
_ago:
future: "未来"
@ -2344,7 +2337,7 @@ _notification:
youGotMention: "{name}からのメンション"
youGotReply: "{name}からのリプライ"
youGotQuote: "{name}による引用"
youRenoted: "{name}がブーストしたみたいやで"
youRenoted: "{name}がリノートしたみたいやで"
youWereFollowed: "フォローされたで"
youReceivedFollowRequest: "フォロー許可してほしいみたいやな"
yourFollowRequestAccepted: "フォローさせてもろたで"
@ -2360,7 +2353,7 @@ _notification:
notificationWillBeDisplayedLikeThis: "通知はこのように表示されるで"
reactedBySomeUsers: "{n}人がツッコんだで"
likedBySomeUsers: "{n}人がいいねしたで"
renotedBySomeUsers: "{n}人がブーストしたで"
renotedBySomeUsers: "{n}人がリノートしたで"
followedBySomeUsers: "{n}人にフォローされたで"
flushNotification: "通知の履歴をリセットする"
_types:
@ -2377,6 +2370,7 @@ _notification:
followRequestAccepted: "フォローが受理されたで"
roleAssigned: "ロールが付与された"
achievementEarned: "実績の獲得"
login: "ログイン"
app: "連携アプリからの通知や"
_actions:
followBack: "フォローバック"
@ -2435,7 +2429,7 @@ _webhookSettings:
followed: "フォローもらったとき~!"
note: "ノートを投稿したとき~!"
reply: "返信があるとき~!"
renote: "ブーストされるとき~!"
renote: "リノートされるとき~!"
reaction: "ツッコまれたとき~!"
mention: "メンションがあるとき~!"
_systemEvents:

View file

@ -77,6 +77,8 @@ _profile:
username: "ಬಳಕೆಹೆಸರು"
_notification:
youWereFollowed: "ಹಿಂಬಾಲಿಸಿದರು"
_types:
login: "ಪ್ರವೇಶ"
_actions:
reply: "ಉತ್ತರಿಸು"
_deck:

View file

@ -476,7 +476,6 @@ uiLanguage: "UI 표시 언어"
aboutX: "{x}에 대해서"
emojiStyle: "이모지 모양"
native: "기본"
disableDrawer: "드로어 메뉴 쓰지 않기"
showNoteActionsOnlyHover: "마우스 올맀을 때만 노트 액션 버턴 보이기"
noHistory: "기록이 없십니다"
signinHistory: "로그인 기록"
@ -583,6 +582,9 @@ describeFile: "캡션 옇기"
enterFileDescription: "캡션 서기"
author: "맨던 사람"
manage: "간리"
large: "커게"
medium: "엔갆게"
small: "쪼맪게"
emailServer: "전자우펜 서버"
email: "전자우펜"
emailAddress: "전자우펜 주소"
@ -599,7 +601,6 @@ reportAbuseOf: "{name}님얼 신고하기"
reporter: "신고한 사람"
reporteeOrigin: "신고덴 사람"
reporterOrigin: "신고한 곳"
forwardReport: "웬겍 서버에 신고 보내기"
waitingFor: "{x}(얼)럴 지달리고 잇십니다"
random: "무작이"
system: "시스템"
@ -613,12 +614,14 @@ followersCount: "팔로워 수"
noteFavoritesCount: "질겨찾기한 노트 수"
clips: "클립 맨걸기"
clearCache: "캐시 비우기"
nUsers: "{n} 사용자"
typingUsers: "{users} 님이 서고 잇어예"
unlikeConfirm: "좋네예럴 무룹니꺼?"
info: "정보"
selectAccount: "계정 개리기"
user: "사용자"
administration: "간리"
middle: "엔갆게"
translatedFrom: "{x}서 번옉"
on: "킴"
off: "껌"
@ -633,6 +636,7 @@ oneMonth: "한 달"
file: "파일"
typeToConfirm: "게속할라먼 {x}럴 누질라 주이소"
pleaseSelect: "개리 주이소"
remoteOnly: "웬겍만"
tools: "도구"
like: "좋네예!"
unlike: "좋네예 무루기"
@ -643,7 +647,10 @@ role: "옉할"
noRole: "옉할이 어ᇝ십니다"
thisPostMayBeAnnoyingCancel: "아이예"
likeOnly: "좋네예마"
hiddenTags: "수ᇚ훈 해시태그"
myClips: "내 클립"
preservedUsernames: "예약 사용자 이럼"
specifyUser: "사용자 지정"
icon: "아바타"
replies: "답하기"
renotes: "리노트"
@ -709,6 +716,16 @@ _achievements:
description: "0분 0초에 노트를 섰어예"
_tutorialCompleted:
description: "길라잡이럴 껕냇십니다"
_role:
displayOrder: "보기 순서"
_priority:
middle: "엔갆게"
_options:
canHideAds: "강고 수ᇚ후기"
_condition:
isRemote: "웬겍 사용자"
isCat: "갱이 사용자"
isBot: "자동 사용자"
_gallery:
my: "내 걸"
liked: "좋네예한 걸"
@ -794,6 +811,7 @@ _notification:
mention: "멘션"
quote: "따오기"
reaction: "반엉"
login: "로그인"
_actions:
reply: "답하기"
_deck:

View file

@ -8,6 +8,9 @@ search: "검색"
notifications: "알림"
username: "유저명"
password: "비밀번호"
initialPasswordForSetup: "초기 설정용 비밀번호"
initialPasswordIsIncorrect: "초기 설정용 비밀번호가 올바르지 않습니다."
initialPasswordForSetupDescription: "Misskey를 직접 설치하는 경우, 설정 파일에 입력해둔 비밀번호를 사용하세요.\nMisskey 설치를 도와주는 호스팅 서비스 등을 사용하는 경우, 서비스 제공자로부터 받은 비밀번호를 사용하세요.\n비밀번호를 따로 설정하지 않은 경우, 아무것도 입력하지 않아도 됩니다."
forgotPassword: "비밀번호 재설정"
fetchingAsApObject: "연합에서 찾아보는 중"
ok: "확인"
@ -52,14 +55,15 @@ deleteAndEditConfirm: "이 노트를 삭제한 뒤 다시 편집하시겠습니
addToList: "리스트에 추가"
addToAntenna: "안테나에 추가"
sendMessage: "메시지 보내기"
copyRSS: "RSS 주소 복사"
copyRSS: "RSS 복사"
copyUsername: "유저명 복사"
copyUserId: "유저 ID 복사"
copyNoteId: "노트 ID 복사"
copyFileId: "파일 ID 복사"
copyFolderId: "폴더 ID 복사"
copyProfileUrl: "프로필 URL 복사"
searchUser: "유저 검색"
searchUser: "사용자 검색"
searchThisUsersNotes: "사용자의 노트 검색"
reply: "답글"
loadMore: "더 보기"
showMore: "더 보기"
@ -154,6 +158,7 @@ editList: "리스트 편집"
selectChannel: "채널 선택"
selectAntenna: "안테나 선택"
editAntenna: "안테나 편집"
createAntenna: "안테나 만들기"
selectWidget: "위젯 선택"
editWidgets: "위젯 편집"
editWidgetsExit: "편집 종료"
@ -194,6 +199,7 @@ followConfirm: "{name}님을 팔로우 하시겠습니까?"
proxyAccount: "프록시 계정"
proxyAccountDescription: "프록시 계정은 특정 조건 하에서 유저의 리모트 팔로우를 대행하는 계정입니다. 예를 들면, 유저가 리모트 유저를 리스트에 넣었을 때, 리스트에 들어간 유저를 아무도 팔로우한 적이 없다면 액티비티가 서버로 배달되지 않기 때문에, 대신 프록시 계정이 해당 유저를 팔로우하도록 합니다."
host: "호스트"
selectSelf: "본인을 선택"
selectUser: "유저 선택"
recipient: "수신인"
annotation: "내용에 대한 주석"
@ -209,6 +215,7 @@ perDay: "1일마다"
stopActivityDelivery: "액티비티 보내지 않기"
blockThisInstance: "이 서버를 차단"
silenceThisInstance: "서버를 사일런스"
mediaSilenceThisInstance: "서버의 미디어를 사일런스"
operations: "작업"
software: "소프트웨어"
version: "버전"
@ -230,6 +237,10 @@ blockedInstances: "차단된 서버"
blockedInstancesDescription: "차단하려는 서버의 호스트 이름을 줄바꿈으로 구분하여 설정합니다. 차단된 인스턴스는 이 인스턴스와 통신할 수 없게 됩니다."
silencedInstances: "사일런스한 서버"
silencedInstancesDescription: "사일런스하려는 서버의 호스트명을 한 줄에 하나씩 입력합니다. 사일런스된 서버에 소속된 유저는 모두 '사일런스'된 상태로 취급되며, 이 서버로부터의 팔로우가 프로필 설정과 무관하게 승인제로 변경되고, 팔로워가 아닌 로컬 유저에게는 멘션할 수 없게 됩니다. 정지된 서버에는 적용되지 않습니다."
mediaSilencedInstances: "미디어를 사일런스한 서버"
mediaSilencedInstancesDescription: "미디어를 사일런스 하려는 서버의 호스트를 한 줄에 하나씩 입력합니다. 미디어가 사일런스된 서버의 유저가 업로드한 파일은 모두 민감한 미디어로 처리되며, 커스텀 이모지를 사용할 수 없게 됩니다. 또한, 차단한 인스턴스에는 적용되지 않습니다."
federationAllowedHosts: "연합을 허가하는 서버"
federationAllowedHostsDescription: "연합을 허가하는 서버의 호스트를 엔터로 구분해서 설정합니다."
muteAndBlock: "뮤트 및 차단"
mutedUsers: "뮤트한 유저"
blockedUsers: "차단한 유저"
@ -328,6 +339,7 @@ renameFolder: "폴더 이름 바꾸기"
deleteFolder: "폴더 삭제"
folder: "폴더"
addFile: "파일 추가"
showFile: "파일 표시하기"
emptyDrive: "드라이브가 비어 있습니다"
emptyFolder: "폴더가 비어 있습니다"
unableToDelete: "삭제할 수 없습니다"
@ -373,7 +385,7 @@ registration: "등록"
enableRegistration: "신규 회원가입을 활성화"
invite: "초대"
driveCapacityPerLocalAccount: "로컬 유저 한 명당 드라이브 용량"
driveCapacityPerRemoteAccount: "리모트 유저 한 명당 드라이브 용량"
driveCapacityPerRemoteAccount: "원격 사용자별 드라이브 용량"
inMb: "메가바이트 단위"
bannerUrl: "배너 이미지 URL"
backgroundImageUrl: "배경 이미지 URL"
@ -442,6 +454,7 @@ totpDescription: "인증 앱을 사용하여 일회성 비밀번호 입력"
moderator: "모더레이터"
moderation: "조정"
moderationNote: "조정 기록"
moderationNoteDescription: "모더레이터 역할을 가진 유저만 보이는 메모를 적을 수 있습니다."
addModerationNote: "조정 기록 추가하기"
moderationLogs: "모더레이션 로그"
nUsersMentioned: "{n}명이 언급함"
@ -503,7 +516,10 @@ uiLanguage: "UI 표시 언어"
aboutX: "{x}에 대하여"
emojiStyle: "이모지 스타일"
native: "기본"
disableDrawer: "드로어 메뉴를 사용하지 않기"
menuStyle: "메뉴 스타일"
style: "스타일"
drawer: "서랍"
popup: "팝업"
showNoteActionsOnlyHover: "마우스가 올라간 때에만 노트 동작 버튼을 표시하기"
showReactionsCount: "노트의 반응 수를 표시하기"
noHistory: "기록이 없습니다"
@ -586,6 +602,8 @@ ascendingOrder: "오름차순"
descendingOrder: "내림차순"
scratchpad: "스크래치 패드"
scratchpadDescription: "스크래치 패드는 AiScript 의 테스트 환경을 제공합니다. Misskey 와 상호 작용하는 코드를 작성, 실행 및 결과를 확인할 수 있습니다."
uiInspector: "UI 인스펙터"
uiInspectorDescription: "메모리에 있는 UI 컴포넌트의 인스턴트 목록을 볼 수 있습니다. UI 컴포넌트는 Ui:C: 계열 함수로 만들어집니다."
output: "출력"
script: "스크립트"
disablePagesScript: "Pages 에서 AiScript 를 사용하지 않음"
@ -702,10 +720,7 @@ abuseReported: "신고를 보냈습니다. 신고해 주셔서 감사합니다."
reporter: "신고자"
reporteeOrigin: "피신고자"
reporterOrigin: "신고자"
forwardReport: "리모트 서버에도 신고 내용 보내기"
forwardReportIsAnonymous: "리모트 서버에서는 나의 정보를 볼 수 없으며, 익명의 시스템 계정으로 표시됩니다."
send: "전송"
abuseMarkAsResolved: "해결됨으로 표시"
openInNewTab: "새 탭에서 열기"
openInSideView: "사이드뷰로 열기"
defaultNavigationBehaviour: "기본 탐색 동작"
@ -907,6 +922,7 @@ followersVisibility: "팔로워의 공개 범위"
continueThread: "글타래 더 보기"
deleteAccountConfirm: "계정이 삭제되고 되돌릴 수 없게 됩니다. 계속하시겠습니까? "
incorrectPassword: "비밀번호가 올바르지 않습니다."
incorrectTotp: "OTP 번호가 틀렸거나 유효기간이 만료되어 있을 수 있습니다."
voteConfirm: "\"{choice}\"에 투표하시겠습니까?"
hide: "숨기기"
useDrawerReactionPickerForMobile: "모바일에서 드로어 메뉴로 표시"
@ -1071,6 +1087,7 @@ retryAllQueuesConfirmTitle: "지금 다시 시도하시겠습니까?"
retryAllQueuesConfirmText: "일시적으로 서버의 부하가 증가할 수 있습니다."
enableChartsForRemoteUser: "리모트 유저의 차트를 생성"
enableChartsForFederatedInstances: "리모트 서버의 차트를 생성"
enableStatsForFederatedInstances: "리모트 서버 정보 받아오기"
showClipButtonInNoteFooter: "노트 동작에 클립을 추가"
reactionsDisplaySize: "리액션 표시 크기"
limitWidthOfReaction: "리액션의 최대 폭을 제한하고 작게 표시하기"
@ -1106,6 +1123,8 @@ preservedUsernames: "예약한 사용자 이름"
preservedUsernamesDescription: "예약할 사용자명을 한 줄에 하나씩 입력합니다. 여기에서 지정한 사용자명으로는 계정을 생성할 수 없게 됩니다. 단, 관리자 권한으로 계정을 생성할 때에는 해당되지 않으며, 이미 존재하는 계정도 영향을 받지 않습니다."
createNoteFromTheFile: "이 파일로 노트를 작성"
archive: "아카이브"
archived: "아카이브 됨"
unarchive: "보관 취소"
channelArchiveConfirmTitle: "{name} 채널을 보존하시겠습니까?"
channelArchiveConfirmDescription: "보존한 채널은 채널 목록과 검색 결과에 표시되지 않으며 새로운 노트도 작성할 수 없습니다."
thisChannelArchived: "이 채널은 보존되었습니다."
@ -1116,6 +1135,9 @@ preventAiLearning: "기계학습(생성형 AI)으로의 사용을 거부"
preventAiLearningDescription: "외부의 문장 생성 AI나 이미지 생성 AI에 대해 제출한 노트나 이미지 등의 콘텐츠를 학습의 대상으로 사용하지 않도록 요구합니다. 다만, 이 요구사항을 지킬 의무는 없기 때문에 학습을 완전히 방지하는 것은 아닙니다."
options: "옵션"
specifyUser: "사용자 지정"
lookupConfirm: "조회 할까요?"
openTagPageConfirm: "해시태그의 페이지를 열까요?"
specifyHost: "호스트 지정"
failedToPreviewUrl: "미리 볼 수 없음"
update: "업데이트"
rolesThatCanBeUsedThisEmojiAsReaction: "이 이모지를 리액션으로 사용할 수 있는 역할"
@ -1249,6 +1271,35 @@ alwaysConfirmFollow: "팔로우일 때 항상 확인하기"
inquiry: "문의하기"
tryAgain: "다시 시도해 주세요."
confirmWhenRevealingSensitiveMedia: "민감한 미디어를 열 때 두 번 확인"
sensitiveMediaRevealConfirm: "민감한 미디어입니다. 표시할까요?"
createdLists: "만든 리스트"
createdAntennas: "만든 안테나"
fromX: "{x}부터"
genEmbedCode: "임베디드 코드 만들기"
noteOfThisUser: "이 유저의 노트 목록"
clipNoteLimitExceeded: "더 이상 이 클립에 노트를 추가 할 수 없습니다."
performance: "퍼포먼스"
modified: "변경 있음"
discard: "파기"
thereAreNChanges: "{n}건 변경이 있습니다."
signinWithPasskey: "패스키로 로그인"
unknownWebAuthnKey: "등록되지 않은 패스키입니다."
passkeyVerificationFailed: "패스키 검증을 실패했습니다."
passkeyVerificationSucceededButPasswordlessLoginDisabled: "패스키를 검증했으나, 비밀번호 없이 로그인하기가 꺼져 있습니다."
messageToFollower: "팔로워에 보낼 메시지"
target: "대상"
testCaptchaWarning: "CAPTCHA를 테스트하기 위한 기능입니다. <strong>실제 환경에서는 사용하지 마세요.</strong>"
prohibitedWordsForNameOfUser: "금지 단어 (사용자 이름)"
prohibitedWordsForNameOfUserDescription: "이 목록에 포함되는 키워드가 사용자 이름에 있는 경우, 일반 사용자는 이름을 바꿀 수 없습니다. 모더레이터 권한을 가진 사용자는 제한 대상에서 제외됩니다."
yourNameContainsProhibitedWords: "바꾸려는 이름에 금지된 키워드가 포함되어 있습니다."
yourNameContainsProhibitedWordsDescription: "이름에 금지된 키워드가 있습니다. 이름을 사용해야 하는 경우, 서버 관리자에 문의하세요."
_abuseUserReport:
forward: "전달"
forwardDescription: "익명 시스템 계정을 사용하여 리모트 서버에 신고 내용을 전달할 수 있습니다."
resolve: "해결됨"
accept: "인용"
reject: "기각"
resolveTutorial: "적절한 신고 내용에 대응한 경우, \"인용\"을 선택하여 \"해결됨\"으로 기록합니다.\n적절하지 않은 신고를 받은 경우, \"기각\"을 선택하여 \"기각\"으로 기록합니다."
_delivery:
status: "전송 상태"
stop: "정지됨"
@ -1320,10 +1371,10 @@ _initialTutorial:
_reaction:
title: "'리액션'이 무엇인가요?"
description: "노트에 '리액션'을 보낼 수 있습니다. '좋아요'만으로는 충분히 전해지지 않는 감정을, 이모지에 실어서 가볍게 보낼 수 있습니다."
letsTryReacting: "리액션은 노트의 '{reaction}' 버튼을 클릭하여 붙일 수 있습니다. 지금 표시되는 샘플 노트에 리액션을 달아 보세요!"
letsTryReacting: "리액션은 노트의 '+' 버튼을 클릭하여 붙일 수 있습니다. 지금 표시되는 샘플 노트에 리액션을 달아 보세요!"
reactToContinue: "다음으로 진행하려면 리액션을 보내세요."
reactNotification: "누군가가 나의 노트에 리액션을 보내면 실시간으로 알림을 받게 됩니다."
reactDone: "'{undo}' 버튼을 눌러서 리액션을 취소할 수 있습니다."
reactDone: "'-' 버튼을 눌러서 리액션을 취소할 수 있습니다."
_timeline:
title: "타임라인에 대하여"
description1: "Misskey에는 종류에 따라 여러 가지의 타임라인으로 구성되어 있습니다.(서버에 따라서는 일부 타임라인을 사용할 수 없는 경우가 있습니다)"
@ -1383,8 +1434,10 @@ _serverSettings:
fanoutTimelineDescription: "활성화하면 각종 타임라인을 가져올 때의 성능을 대폭 향상하며, 데이터베이스의 부하를 줄일 수 있습니다. 단, Redis의 메모리 사용량이 증가합니다. 서버의 메모리 용량이 작거나, 서비스가 불안정해지는 경우 비활성화할 수 있습니다."
fanoutTimelineDbFallback: "데이터베이스를 예비로 사용하기"
fanoutTimelineDbFallbackDescription: "활성화하면 타임라인의 캐시되어 있지 않은 부분에 대해 DB에 질의하여 정보를 가져옵니다. 비활성화하면 이를 실행하지 않음으로써 서버의 부하를 줄일 수 있지만, 타임라인에서 가져올 수 있는 게시물 범위가 한정됩니다."
reactionsBufferingDescription: "활성화 한 경우, 리액션 작성 퍼포먼스가 대폭 향상되어 DB의 부하를 줄일 수 있으나, Redis의 메모리 사용량이 많아집니다."
inquiryUrl: "문의처 URL"
inquiryUrlDescription: "서버 운영자에게 보내는 문의 양식의 URL이나 운영자의 연락처 등이 적힌 웹 페이지의 URL을 설정합니다."
thisSettingWillAutomaticallyOffWhenModeratorsInactive: "일정 기간동안 모더레이터의 활동이 감지되지 않는 경우, 스팸 방지를 위해 이 설정은 자동으로 꺼집니다."
_accountMigration:
moveFrom: "다른 계정에서 이 계정으로 이사"
moveFromSub: "다른 계정에 대한 별칭을 생성"
@ -1716,10 +1769,15 @@ _role:
canSearchNotes: "노트 검색 이용 가능 여부"
canUseTranslator: "번역 기능의 사용"
avatarDecorationLimit: "아바타 장식의 최대 붙임 개수"
canImportAntennas: "안테나 가져오기 허용"
canImportBlocking: "차단 목록 가져오기 허용"
canImportFollowing: "팔로우 가져오기 허용"
canImportMuting: "뮤트 목록 가져오기 허용"
canImportUserLists: "리스트 목록 가져오기 허용"
_condition:
roleAssignedTo: "수동 역할에 이미 할당됨"
isLocal: "로컬 사용자"
isRemote: "리모트 사용자"
isRemote: "원격 사용자"
isCat: "고양이 사용자"
isBot: "봇 사용자"
isSuspended: "정지된 사용자"
@ -1933,7 +1991,6 @@ _theme:
buttonBg: "버튼 배경"
buttonHoverBg: "버튼 배경 (호버)"
inputBorder: "입력 필드 테두리"
listItemHoverBg: "리스트 항목 배경 (호버)"
driveFolderBg: "드라이브 폴더 배경"
wallpaperOverlay: "배경화면 오버레이"
badge: "배지"
@ -1949,10 +2006,11 @@ _sfx:
_soundSettings:
driveFile: "드라이브에 있는 오디오를 사용"
driveFileWarn: "드라이브에 있는 파일을 선택하세요."
driveFileTypeWarn: "이 파일은 지원되지 않습니다."
driveFileTypeWarn: "이 파"
driveFileTypeWarnDescription: "오디오 파일을 선택하세요."
driveFileDurationWarn: "오디오가 너무 깁니다"
driveFileDurationWarnDescription: "긴 오디오로 설정할 경우 미스키 사용에 지장이 갈 수도 있습니다. 그래도 괜찮습니까?"
driveFileError: "오디오를 불러올 수 없습니다. 설정을 바꿔주세요."
_ago:
future: "미래"
justNow: "방금 전"
@ -2209,6 +2267,9 @@ _profile:
changeBanner: "배너 이미지 변경"
verifiedLinkDescription: "내용에 자신의 프로필로 향하는 링크가 포함된 페이지의 URL을 삽입하면 소유자 인증 마크가 표시됩니다."
avatarDecorationMax: "최대 {max}개까지 장식을 할 수 있습니다."
followedMessage: "팔로우 받았을 때 메시지"
followedMessageDescription: "팔로우 받았을 때 상대방에게 보여줄 단문 메시지를 설정할 수 있습니다."
followedMessageDescriptionForLockedAccount: "팔로우를 승인제로 한 경우, 팔로우 요청을 수락했을 때 보여줍니다."
_exportOrImport:
allNotes: "모든 노트"
favoritedNotes: "즐겨찾기한 노트"
@ -2301,6 +2362,7 @@ _pages:
eyeCatchingImageSet: "아이캐치 이미지를 설정"
eyeCatchingImageRemove: "아이캐치 이미지를 삭제"
chooseBlock: "블록 추가"
enterSectionTitle: "섹션 타이틀을 입력하기"
selectType: "종류 선택"
contentBlocks: "콘텐츠"
inputBlocks: "입력"
@ -2346,6 +2408,8 @@ _notification:
renotedBySomeUsers: "{n}명이 리노트했습니다"
followedBySomeUsers: "{n}명에게 팔로우됨"
flushNotification: "알림 이력을 초기화"
exportOfXCompleted: "{x} 추출에 성공했습니다."
login: "로그인 알림이 있습니다"
_types:
all: "전부"
note: "사용자의 새 글"
@ -2360,6 +2424,9 @@ _notification:
followRequestAccepted: "팔로우 요청이 승인되었을 때"
roleAssigned: "역할이 부여 됨"
achievementEarned: "도전 과제 획득"
exportCompleted: "추출을 성공함"
login: "로그인"
test: "알림 테스트"
app: "연동된 앱을 통한 알림"
_actions:
followBack: "팔로우"
@ -2411,6 +2478,7 @@ _webhookSettings:
modifyWebhook: "Webhook 수정"
name: "이름"
secret: "시크릿"
trigger: "트리거"
active: "활성화"
_events:
follow: "누군가를 팔로우했을 때"
@ -2421,15 +2489,18 @@ _webhookSettings:
reaction: "누군가 내 노트에 리액션했을 때"
mention: "누군가 나를 멘션했을 때"
_systemEvents:
abuseReport: "유저로부터 신고를 받았을 때"
abuseReport: "유저"
abuseReportResolved: "받은 신고를 처리했을 때"
userCreated: "유저가 생성되었을 때"
inactiveModeratorsWarning: "모더레이터가 일정 기간동안 활동하지 않은 경우"
inactiveModeratorsInvitationOnlyChanged: "모더레이터가 일정 기간 활동하지 않아 시스템에 의해 초대제로 바뀐 경우"
deleteConfirm: "Webhook을 삭제할까요?"
testRemarks: "스위치 오른쪽에 있는 버튼을 클릭하여 더미 데이터를 사용한 테스트용 웹 훅을 보낼 수 있습니다."
_abuseReport:
_notificationRecipient:
createRecipient: "신고 수신자 추가"
modifyRecipient: "신고 수신자 편집"
recipientType: "알림 수신 유형"
recipientType: "알림 종류"
_recipientType:
mail: "이메일"
webhook: "Webhook"
@ -2437,7 +2508,7 @@ _abuseReport:
mail: "모더레이터 권한을 가진 사용자의 이메일 주소에 알림을 보냅니다 (신고를 받은 때에만)"
webhook: "지정한 SystemWebhook에 알림을 보냅니다 (신고를 받은 때와 해결했을 때에 송신)"
keywords: "키워드"
notifiedUser: "신고 알림을 보낼 유저"
notifiedUser: "알릴 사용자"
notifiedWebhook: "사용할 Webhook"
deleteConfirm: "수신자를 삭제하시겠습니까?"
_moderationLogTypes:
@ -2468,6 +2539,8 @@ _moderationLogTypes:
markSensitiveDriveFile: "파일에 열람주의를 설정"
unmarkSensitiveDriveFile: "파일에 열람주의를 해제"
resolveAbuseReport: "신고 처리"
forwardAbuseReport: "신고 전달"
updateAbuseReportNote: "신고 조정 노트 갱신"
createInvitation: "초대 코드 생성"
createAd: "광고 생성"
deleteAd: "광고 삭제"
@ -2483,6 +2556,10 @@ _moderationLogTypes:
createAbuseReportNotificationRecipient: "신고 알림 수신자 생성"
updateAbuseReportNotificationRecipient: "신고 알림 수신자 편집"
deleteAbuseReportNotificationRecipient: "신고 알림 수신자 삭제"
deleteAccount: "계정을 삭제"
deletePage: "페이지를 삭제"
deleteFlash: "Play를 삭제"
deleteGalleryPost: "갤러리 포스트를 삭제"
_fileViewer:
title: "파일 상세"
type: "파일 유형"
@ -2603,7 +2680,7 @@ _urlPreviewSetting:
timeoutDescription: "미리보기를 로딩하는데 걸리는 시간이 정한 시간보다 오래 걸리는 경우, 미리보기를 생성하지 않습니다."
maximumContentLength: "Content-Length의 최대치 (byte)"
maximumContentLengthDescription: "Content-Length가 이 값을 넘어서면 미리보기를 생성하지 않습니다."
requireContentLength: "Content-Length를 얻었을 때만 미리보기 만들기"
requireContentLength: "Content-Length를 받아온 경우에만 "
requireContentLengthDescription: "상대 서버가 Content-Length를 되돌려주지 않는다면 미리보기를 만들지 않습니다."
userAgent: "User-Agent"
userAgentDescription: "미리보기를 얻을 때 사용한 User-Agent를 설정합니다. 비어 있다면 기본값의 User-Agent를 사용합니다."
@ -2614,3 +2691,22 @@ _mediaControls:
pip: "화면 속 화면"
playbackRate: "재생 속도"
loop: "반복 재생"
_contextMenu:
title: "컨텍스트 메뉴"
app: "애플리케이션"
appWithShift: "Shift 키로 애플리케이션"
native: "브라우저의 UI"
_embedCodeGen:
title: "임베디드 코드를 커스터마이즈"
header: "해더를 표시"
autoload: "자동으로 다음 코드를 실행 (비권장)"
maxHeight: "최대 높이"
maxHeightDescription: "최대 값을 무시하려면 0을 입력하세요. 위젯이 상하로 길어지는 것을 방지하려면, 임의의 값을 입력해 주세요."
maxHeightWarn: "높이 최대 값이 설정되어져 있지 않습니다(0). 의도적으로 설정 하지 않았다면 임의의 값을 설정해주세요."
previewIsNotActual: "미리보기로 표시할 수 있는 크기보다 큽니다. 실제로 넣은 코드의 표시가 다른 경우가 있습니다."
rounded: "외곽선을 둥글게 하기"
border: "외곽선에 테두리를 씌우기"
applyToPreview: "미리보기에 반영"
generateCode: "임베디드 코드를 만들기"
codeGenerated: "코드를 만들었습니다."
codeGeneratedDescription: "만들어진 코드를 웹 사이트에 붙여서 사용하세요."

View file

@ -456,6 +456,7 @@ _notification:
renote: "Renote"
quote: "ອ້າງອີງ"
reaction: "Reaction"
login: "ເຂົ້າ​ສູ່​ລະ​ບົບ"
_actions:
reply: "ຕອບ​ກັບ"
renote: "Renote"

View file

@ -251,7 +251,7 @@ upload: "Uploaden"
keepOriginalUploading: "Origineel beeld behouden."
keepOriginalUploadingDescription: "Bewaar de originele versie bij het uploaden van afbeeldingen. Indien uitgeschakeld, wordt bij het uploaden een alternatieve versie voor webpublicatie genereert."
fromDrive: "Van schijf"
fromUrl: "Van URL"
fromUrl: "Van URL"
uploadFromUrl: "Uploaden vanaf een URL"
uploadFromUrlDescription: "URL van het bestand dat je wil uploaden"
uploadFromUrlRequested: "Uploadverzoek"
@ -427,7 +427,7 @@ windowMaximize: "Maximaliseren"
windowRestore: "Herstellen"
loggedInAsBot: "Momenteel als bot ingelogd"
icon: "Avatar"
replies: "Antwoorden"
replies: "Antwoord"
renotes: "Herdelen"
_delivery:
stop: "Opgeschort"
@ -486,6 +486,7 @@ _notification:
renote: "Herdelen"
quote: "Quote"
reaction: "Reacties"
login: "Inloggen"
_actions:
reply: "Antwoord"
renote: "Herdelen"

View file

@ -701,6 +701,7 @@ _notification:
renote: "Renotes"
quote: "Sitater"
reaction: "Reaksjoner"
login: "Logg inn"
_actions:
reply: "Svar"
renote: "Renote"

View file

@ -81,7 +81,7 @@ exportRequested: "Zażądałeś eksportu. Może to zająć trochę czasu. Po zak
importRequested: "Zażądano importu. Może to zająć chwilę."
lists: "Listy"
noLists: "Nie masz żadnych list"
note: "Wpis"
note: "Utwórz wpis"
notes: "Wpisy"
following: "Obserwowani"
followers: "Obserwujący"
@ -492,7 +492,6 @@ uiLanguage: "Język wyświetlania UI"
aboutX: "O {x}"
emojiStyle: "Styl emoji"
native: "Natywny"
disableDrawer: "Nie używaj menu w stylu szuflady"
showNoteActionsOnlyHover: "Pokazuj akcje notatek tylko po najechaniu myszką"
showReactionsCount: "Wyświetl liczbę reakcji na notatkę"
noHistory: "Brak historii"
@ -690,10 +689,7 @@ abuseReported: "Twoje zgłoszenie zostało wysłane. Dziękujemy."
reporter: "Zgłaszający"
reporteeOrigin: "Pochodzenie zgłoszonego"
reporterOrigin: "Pochodzenie zgłaszającego"
forwardReport: "Przekaż zgłoszenie do innej instancji"
forwardReportIsAnonymous: "Zamiast twojego konta, anonimowe konto systemowe będzie wyświetlone jako zgłaszający na instancji zdalnej."
send: "Wyślij"
abuseMarkAsResolved: "Oznacz zgłoszenie jako rozwiązane"
openInNewTab: "Otwórz w nowej karcie"
openInSideView: "Otwórz w bocznym widoku"
defaultNavigationBehaviour: "Domyślne zachowanie nawigacji"
@ -865,7 +861,7 @@ whatIsNew: "Pokaż zmiany"
translate: "Przetłumacz"
translatedFrom: "Przetłumaczone z {x}"
accountDeletionInProgress: "Trwa usuwanie konta"
usernameInfo: "Nazwa, która identyfikuje Twoje konto spośród innych na tym serwerze. Możesz użyć alfabetu (a~z, A~Z), cyfr (0~9) lub podkreślników (_). Nazwy użytkownika nie mogą być później zmieniane."
usernameInfo: "Nazwa, która identyfikuje Twoje konto spośród innych na tym serwerze. Możesz użyć alfabetu (a~z, A~Z), cyfr (0~9) lub podkreślników (_). Nazwy użytkownika nie mogą być później zmieniane."
aiChanMode: "Tryb Ai"
devMode: "Tryb programisty"
keepCw: "Zostaw ostrzeżenia o zawartości"
@ -1016,8 +1012,8 @@ emailNotSupported: "Wysyłanie wiadomości E-mail nie jest obsługiwane na tym s
postToTheChannel: "Publikuj na kanale"
youFollowing: "Śledzeni"
icon: "Awatar"
replies: "Odpowiedzi"
renotes: "Udostępni"
replies: "Odpowiedz"
renotes: "Udostępnij"
sourceCode: "Kod źródłowy"
flip: "Odwróć"
lastNDays: "W ciągu ostatnich {n} dni"
@ -1209,7 +1205,6 @@ _theme:
buttonBg: "Tło przycisku"
buttonHoverBg: "Tło przycisku (po najechaniu)"
inputBorder: "Obramowanie pola wejścia"
listItemHoverBg: "Tło elementu listy (po najechaniu)"
driveFolderBg: "Tło folderu na dysku"
wallpaperOverlay: "Nakładka tapety"
badge: "Odznaka"
@ -1510,6 +1505,7 @@ _notification:
reaction: "Reakcja"
receiveFollowRequest: "Otrzymano prośbę o możliwość obserwacji"
followRequestAccepted: "Przyjęto prośbę o możliwość obserwacji"
login: "Zaloguj się"
app: "Powiadomienia z aplikacji"
_actions:
followBack: "zaobserwował cię z powrotem"

View file

@ -82,7 +82,7 @@ exportRequested: "A sua solicitação de exportação foi enviada. Isso pode lev
importRequested: "A sua solicitação de importação foi enviada. Isso pode levar algum tempo."
lists: "Listas"
noLists: "Não possui nenhuma lista"
note: "Post"
note: "Publicar"
notes: "Posts"
following: "Seguindo"
followers: "Seguidores"
@ -296,7 +296,7 @@ explore: "Explorar"
messageRead: "Lida"
noMoreHistory: "Não existe histórico anterior"
startMessaging: "Iniciar conversação"
nUsersRead: "{n} Pessoas leem"
nUsersRead: "{n} pessoas leram"
agreeTo: "Eu concordo com {0}"
agree: "Concordar"
agreeBelow: "Eu concordo com o seguinte"
@ -312,7 +312,7 @@ birthday: "Aniversário"
yearsOld: "{age} anos"
registeredDate: "Data de registro"
location: "Localização"
theme: "tema"
theme: "Tema"
themeForLightMode: "Temas usados no modo de luz"
themeForDarkMode: "Temas usados no modo escuro"
light: "Claro"
@ -509,7 +509,6 @@ uiLanguage: "Idioma de exibição da interface "
aboutX: "Sobre {x}"
emojiStyle: "Estilo de emojis"
native: "Nativo"
disableDrawer: "Não mostrar o menu em formato de gaveta"
showNoteActionsOnlyHover: "Exibir as ações da nota somente ao passar o cursor sobre ela"
showReactionsCount: "Ver o número de reações nas notas"
noHistory: "Ainda não há histórico"
@ -708,10 +707,7 @@ abuseReported: "Denúncia enviada. Obrigado por sua ajuda."
reporter: "Denunciante"
reporteeOrigin: "Origem da denúncia"
reporterOrigin: "Origem do denunciante"
forwardReport: "Encaminhar a denúncia para o servidor remoto"
forwardReportIsAnonymous: "No servidor remoto, suas informações não serão visíveis, e você será apresentado como uma conta do sistema anônima."
send: "Enviar"
abuseMarkAsResolved: "Marcar denúncia como resolvida"
openInNewTab: "Abrir em nova aba"
openInSideView: "Abrir em visão lateral"
defaultNavigationBehaviour: "Navegação padrão"
@ -1062,7 +1058,7 @@ resetPasswordConfirm: "Deseja realmente mudar a sua senha?"
sensitiveWords: "Palavras sensíveis"
sensitiveWordsDescription: "A visibilidade de todas as notas contendo as palavras configuradas será colocadas como \"Início\" automaticamente. Você pode listar várias delas separando-as por linha."
sensitiveWordsDescription2: "Utilizar espaços irá criar expressões aditivas (AND) e cercar palavras-chave com barras irá transformá-las em expressões regulares (RegEx)"
prohibitedWords: "Palavras proibídas"
prohibitedWords: "Palavras proibidas"
prohibitedWordsDescription: "Habilita um erro ao tentar publicar uma nota contendo as palavras escolhidas. Várias palavras podem ser escolhidas, separando-as por linha."
prohibitedWordsDescription2: "Utilizar espaços irá criar expressões aditivas (AND) e cercar palavras-chave com barras irá transformá-las em expressões regulares (RegEx)"
hiddenTags: "Hashtags escondidas"
@ -1420,7 +1416,7 @@ _achievements:
_types:
_notes1:
title: "Configurando o meu misskey"
description: "Post uma nota pela primeira vez"
description: "Poste uma nota pela primeira vez"
flavor: "Divirta-se com o Misskey!"
_notes10:
title: "Algumas notas"
@ -1948,7 +1944,6 @@ _theme:
buttonBg: "Plano de fundo de botão"
buttonHoverBg: "Plano de fundo de botão (Selecionado)"
inputBorder: "Borda de campo digitável"
listItemHoverBg: "Plano de fundo do item de uma lista (Selecionado)"
driveFolderBg: "Plano de fundo da pasta no Drive"
wallpaperOverlay: "Sobreposição do papel de parede."
badge: "Emblema"
@ -2377,6 +2372,7 @@ _notification:
followRequestAccepted: "Aceitou pedidos de seguidor"
roleAssigned: "Cargo dado"
achievementEarned: "Conquista desbloqueada"
login: "Iniciar sessão"
app: "Notificações de aplicativos conectados"
_actions:
followBack: "te seguiu de volta"

View file

@ -453,7 +453,6 @@ or: "Sau"
language: "Limbă"
uiLanguage: "Limba interfeței"
aboutX: "Despre {x}"
disableDrawer: "Nu folosi meniuri în stil sertar"
noHistory: "Nu există istoric"
signinHistory: "Istoric autentificări"
doing: "Se procesează..."
@ -626,10 +625,7 @@ abuseReported: "Raportul tău a fost trimis. Mulțumim."
reporter: "Raportorul"
reporteeOrigin: "Originea raportatului"
reporterOrigin: "Originea raportorului"
forwardReport: "Redirecționează raportul către instanța externă"
forwardReportIsAnonymous: "În locul contului tău, va fi afișat un cont anonim, de sistem, ca raportor către instanța externă."
send: "Trimite"
abuseMarkAsResolved: "Marchează raportul ca rezolvat"
openInNewTab: "Deschide în tab nou"
openInSideView: "Deschide în vedere laterală"
defaultNavigationBehaviour: "Comportament de navigare implicit"
@ -649,7 +645,7 @@ searchByGoogle: "Caută"
file: "Fișiere"
show: "Arată"
icon: "Avatar"
replies: "Răspunsuri"
replies: "Răspunde"
renotes: "Re-notează"
_delivery:
stop: "Suspendat"
@ -715,6 +711,7 @@ _notification:
renote: "Re-notează"
quote: "Citează"
reaction: "Reacție"
login: "Autentifică-te"
_actions:
reply: "Răspunde"
renote: "Re-notează"

View file

@ -2,7 +2,7 @@
_lang_: "Русский"
headlineMisskey: "Сеть, сплетённая из заметок"
introMisskey: "Добро пожаловать! Misskey — это децентрализованный сервис микроблогов с открытым исходным кодом.\nПишите «заметки» — делитесь со всеми происходящим вокруг или рассказывайте о себе 📡\nСтавьте «реакции» — выражайте свои чувства и эмоции от заметок других 👍\nОткройте для себя новый мир 🚀"
poweredByMisskeyDescription: "{name} сервис на платформе с открытым исходным кодом <b>Misskey</b>, называемый инстансом Misskey."
poweredByMisskeyDescription: "{name} сервис на платформе с открытым исходным кодом <b>Misskey</b>, называемый экземпляром Misskey."
monthAndDay: "{day}.{month}"
search: "Поиск"
notifications: "Уведомления"
@ -10,15 +10,15 @@ username: "Имя пользователя"
password: "Пароль"
forgotPassword: "Забыли пароль?"
fetchingAsApObject: "Приём с других сайтов"
ok: "Окей"
ok: "Подтвердить"
gotIt: "Ясно!"
cancel: "Отмена"
noThankYou: "Нет, спасибо"
enterUsername: "Введите имя пользователя"
renotedBy: "{user} делится"
renotedBy: "{user} репостнул(а)"
noNotes: "Нет ни одной заметки"
noNotifications: "Нет уведомлений"
instance: "Инстанс"
instance: "Экземпляр"
settings: "Настройки"
notificationSettings: "Настройки уведомлений"
basicSettings: "Основные настройки"
@ -45,22 +45,24 @@ pin: "Закрепить в профиле"
unpin: "Открепить от профиля"
copyContent: "Скопировать содержимое"
copyLink: "Скопировать ссылку"
copyLinkRenote: "Скопировать ссылку на репост"
delete: "Удалить"
deleteAndEdit: "Удалить и отредактировать"
deleteAndEditConfirm: "Удалить эту заметку и создать отредактированную? Все реакции, ссылки и ответы на существующую будут будут потеряны."
deleteAndEditConfirm: "Удалить этот пост и отредактировать заново? Все реакции, репосты и ответы на него также будут удалены."
addToList: "Добавить в список"
addToAntenna: "Добавить к антенне"
sendMessage: "Отправить сообщение"
copyRSS: "Скопировать RSS"
copyUsername: "Скопировать имя пользователя"
copyUserId: "Скопировать идентификатор пользователя"
copyNoteId: "Скопировать идентификатор заметки"
copyUserId: "Скопировать ID пользователя"
copyNoteId: "Скопировать ID поста"
copyFileId: "Скопировать ID файла"
copyFolderId: "Скопировать ID папки"
copyProfileUrl: "Скопировать URL профиля "
copyProfileUrl: "Скопировать ссылку на профиль"
searchUser: "Поиск людей"
searchThisUsersNotes: "Искать по заметкам пользователя"
reply: "Ответ"
loadMore: "Показать еще"
loadMore: "Загрузить ещё"
showMore: "Показать ещё"
showLess: "Закрыть"
youGotNewFollower: "Новый подписчик"
@ -107,11 +109,14 @@ enterEmoji: "Введите эмодзи"
renote: "Репост"
unrenote: "Отмена репоста"
renoted: "Репост совершён."
renotedToX: "Репостнуть в {name}."
cantRenote: "Это нельзя репостить."
cantReRenote: "Невозможно репостить репост."
quote: "Цитата"
inChannelRenote: "В канале"
inChannelQuote: "Заметки в канале"
renoteToChannel: "Репостнуть в канал"
renoteToOtherChannel: "Репостнуть в другой канал"
pinnedNote: "Закреплённая заметка"
pinned: "Закрепить в профиле"
you: "Вы"
@ -150,6 +155,7 @@ editList: "Редактировать список"
selectChannel: "Выберите канал"
selectAntenna: "Выберите антенну"
editAntenna: "Редактировать антенну"
createAntenna: "Создать антенну"
selectWidget: "Выберите виджет"
editWidgets: "Редактировать виджеты"
editWidgetsExit: "Готово"
@ -157,11 +163,12 @@ customEmojis: "Собственные эмодзи"
emoji: "Эмодзи"
emojis: "Эмодзи"
emojiName: "Название эмодзи"
emojiUrl: "URL эмодзи"
emojiUrl: "Ссылка на эмодзи"
addEmoji: "Добавить эмодзи"
settingGuide: "Рекомендуемые настройки"
cacheRemoteFiles: "Кешировать внешние файлы"
cacheRemoteFilesDescription: "Когда эта настройка отключена, файлы с других сайтов будут загружаться прямо оттуда. Это сэкономит место на сервере, но увеличит трафик, так как не будут создаваться эскизы."
youCanCleanRemoteFilesCache: "Вы можете очистить кэш, нажав на кнопку 🗑️ в меню управления файлами."
cacheRemoteSensitiveFiles: "Кэшировать внешние файлы «не для всех»"
cacheRemoteSensitiveFilesDescription: "Если отключено, файлы «не для всех» загружаются непосредственно с удалённых серверов, не кэшируясь."
flagAsBot: "Аккаунт бота"
@ -175,6 +182,10 @@ addAccount: "Добавить учётную запись"
reloadAccountsList: "Обновить список учётных записей"
loginFailed: "Неудачная попытка входа"
showOnRemote: "Перейти к оригиналу на сайт"
continueOnRemote: "Продолжить на удалённом сервере"
chooseServerOnMisskeyHub: "Выбрать сервер с Misskey Hub"
specifyServerHost: "Укажите сервер напрямую"
inputHostName: "Введите домен"
general: "Общее"
wallpaper: "Обои"
setWallpaper: "Установить обои"
@ -185,6 +196,7 @@ followConfirm: "Подписаться на {name}?"
proxyAccount: "Учётная запись прокси"
proxyAccountDescription: "Учетная запись прокси предназначена служить подписчиком на пользователей с других сайтов. Например, если пользователь добавит кого-то с другого сайта а список, деятельность того не отобразится, пока никто с этого же сайта не подписан на него. Чтобы это стало возможным, на него подписывается прокси."
host: "Хост"
selectSelf: "Выбрать себя"
selectUser: "Выберите пользователя"
recipient: "Кому"
annotation: "Описание"
@ -199,6 +211,7 @@ perHour: "По часам"
perDay: "По дням"
stopActivityDelivery: "Остановить отправку обновлений активности"
blockThisInstance: "Блокировать этот инстанс"
silenceThisInstance: "Заглушить этот инстанс"
operations: "Операции"
software: "Программы"
version: "Версия"
@ -218,6 +231,7 @@ clearCachedFiles: "Очистить кэш"
clearCachedFilesConfirm: "Удалить все закэшированные файлы с других сайтов?"
blockedInstances: "Заблокированные инстансы"
blockedInstancesDescription: "Введите список инстансов, которые хотите заблокировать. Они больше не смогут обмениваться с вашим инстансом."
silencedInstances: "Заглушённые инстансы"
muteAndBlock: "Скрытие и блокировка"
mutedUsers: "Скрытые пользователи"
blockedUsers: "Заблокированные пользователи"
@ -236,7 +250,7 @@ noJobs: "Нет заданий"
federating: "Федерируется"
blocked: "Заблокировано"
suspended: "Заморожено"
all: "Всё"
all: "Все"
subscribing: "Подписка"
publishing: "Публикация"
notResponding: "Нет ответа"
@ -268,7 +282,7 @@ messaging: "Сообщения"
upload: "Загрузить"
keepOriginalUploading: "Сохранить исходное изображение"
keepOriginalUploadingDescription: "Сохраняет исходную версию при загрузке изображений. Если выключить, то при загрузке браузер генерирует изображение для публикации."
fromDrive: "С «диска»"
fromDrive: "С Диска"
fromUrl: "По ссылке"
uploadFromUrl: "Загрузить по ссылке"
uploadFromUrlDescription: "Ссылка на файл, который хотите загрузить"
@ -308,6 +322,7 @@ selectFile: "Выберите файл"
selectFiles: "Выберите файлы"
selectFolder: "Выберите папку"
selectFolders: "Выберите папки"
fileNotSelected: "Файл не выбран"
renameFile: "Переименовать файл"
folderName: "Имя папки"
createFolder: "Создать папку"
@ -359,8 +374,8 @@ disablingTimelinesInfo: "У администраторов и модератор
registration: "Регистрация"
enableRegistration: "Разрешить регистрацию"
invite: "Пригласить"
driveCapacityPerLocalAccount: "Объём диска на одного локального пользователя"
driveCapacityPerRemoteAccount: "Объём диска на одного пользователя с другого сайта"
driveCapacityPerLocalAccount: "Объём Диска на одного локального пользователя"
driveCapacityPerRemoteAccount: "Объём Диска на одного пользователя с другого экземпляра"
inMb: "В мегабайтах"
bannerUrl: "Ссылка на изображение в шапке"
backgroundImageUrl: "Ссылка на фоновое изображение"
@ -379,6 +394,7 @@ mcaptcha: "mCaptcha"
enableMcaptcha: "Включить mCaptcha"
mcaptchaSiteKey: "Ключ сайта"
mcaptchaSecretKey: "Секретный ключ"
mcaptchaInstanceUrl: "Ссылка на сервер mCaptcha"
recaptcha: "reCAPTCHA"
enableRecaptcha: "Включить reCAPTCHA"
recaptchaSiteKey: "Ключ сайта"
@ -393,7 +409,8 @@ manageAntennas: "Настройки антенн"
name: "Название"
antennaSource: "Источник антенны"
antennaKeywords: "Ключевые слова"
antennaExcludeKeywords: "Исключения"
antennaExcludeKeywords: "Чёрный список слов"
antennaExcludeBots: "Исключать ботов"
antennaKeywordsDescription: "Пишите слова через пробел в одной строке, чтобы ловить их появление вместе; на отдельных строках располагайте слова, или группы слов, чтобы ловить любые из них."
notifyAntenna: "Уведомлять о новых заметках"
withFileAntenna: "Только заметки с вложениями"
@ -426,6 +443,7 @@ totp: "Приложение-аутентификатор"
totpDescription: "Описание приложения-аутентификатора"
moderator: "Модератор"
moderation: "Модерация"
moderationLogs: "Журнал модерации"
nUsersMentioned: "Упомянуло пользователей: {n}"
securityKeyAndPasskey: "Ключ безопасности и парольная фраза"
securityKey: "Ключ безопасности"
@ -458,10 +476,12 @@ retype: "Введите ещё раз"
noteOf: "Что пишет {user}"
quoteAttached: "Цитата"
quoteQuestion: "Хотите добавить цитату?"
attachAsFileQuestion: "Текста в буфере обмена слишком много. Прикрепить как текстовый файл?"
noMessagesYet: "Пока ни одного сообщения"
newMessageExists: "Новое сообщение"
onlyOneFileCanBeAttached: "К сообщению можно прикрепить только один файл"
signinRequired: "Пожалуйста, войдите"
signinOrContinueOnRemote: "Чтобы продолжить, вам необходимо войти в аккаунт на своём сервере или зарегистрироваться / войти в аккаунт на этом."
invitations: "Приглашения"
invitationCode: "Код приглашения"
checking: "Проверка"
@ -471,7 +491,7 @@ usernameInvalidFormat: "Можно использовать только лат
tooShort: "Слишком короткий"
tooLong: "Слишком длинный"
weakPassword: "Слабый пароль"
normalPassword: "Годный пароль"
normalPassword: "Хороший пароль"
strongPassword: "Надёжный пароль"
passwordMatched: "Совпали"
passwordNotMatched: "Не совпадают"
@ -483,8 +503,8 @@ uiLanguage: "Язык интерфейса"
aboutX: "Описание {x}"
emojiStyle: "Стиль эмодзи"
native: "Системные"
disableDrawer: "Не использовать выдвижные меню"
showNoteActionsOnlyHover: "Показывать кнопки у заметок только при наведении"
showReactionsCount: "Видеть количество реакций на заметках"
noHistory: "История пока пуста"
signinHistory: "Журнал посещений"
enableAdvancedMfm: "Включить расширенный MFM"
@ -547,7 +567,7 @@ popout: "Развернуть"
volume: "Громкость"
masterVolume: "Основная регулировка громкости"
notUseSound: "Выключить звук"
useSoundOnlyWhenActive: "Использовать звук, когда Misskey активен."
useSoundOnlyWhenActive: "Воспроизводить звук только когда Misskey активен."
details: "Подробнее"
chooseEmoji: "Выберите эмодзи"
unableToProcess: "Не удаётся завершить операцию"
@ -601,7 +621,7 @@ poll: "Опрос"
useCw: "Скрывать содержимое под предупреждением"
enablePlayer: "Включить проигрыватель"
disablePlayer: "Выключить проигрыватель"
expandTweet: "Развернуть твит"
expandTweet: "Развернуть заметку"
themeEditor: "Редактор темы оформления"
description: "Описание"
describeFile: "Добавить подпись"
@ -613,7 +633,7 @@ plugins: "Расширения"
preferencesBackups: "Резервная копия"
deck: "Пульт"
undeck: "Покинуть пульт"
useBlurEffectForModal: "Размывка под формой поверх всего"
useBlurEffectForModal: "Размытие за формой ввода заметки"
useFullReactionPicker: "Полнофункциональный выбор реакций"
width: "Ширина"
height: "Высота"
@ -644,7 +664,7 @@ smtpSecure: "Использовать SSL/TLS для SMTP-соединений"
smtpSecureInfo: "Выключите при использовании STARTTLS."
testEmail: "Проверка доставки электронной почты"
wordMute: "Скрытие слов"
hardWordMute: ""
hardWordMute: "Строгое скрытие слов"
regexpError: "Ошибка в регулярном выражении"
regexpErrorDescription: "В списке {tab} скрытых слов, в строке {line} обнаружена синтаксическая ошибка:"
instanceMute: "Глушение инстансов"
@ -680,10 +700,7 @@ abuseReported: "Жалоба отправлена. Большое спасибо
reporter: "Сообщивший"
reporteeOrigin: "О ком сообщено"
reporterOrigin: "Кто сообщил"
forwardReport: "Отправить жалобу на инстанс автора."
forwardReportIsAnonymous: "Жалоба на удалённый инстанс будет отправлена анонимно. Вместо ваших данных у получателя будет отображена системная учётная запись."
send: "Отправить"
abuseMarkAsResolved: "Отметить жалобу как решённую"
openInNewTab: "Открыть в новой вкладке"
openInSideView: "Открывать в боковой колонке"
defaultNavigationBehaviour: "Поведение навигации по умолчанию"
@ -726,6 +743,7 @@ lockedAccountInfo: "Даже если вы вручную подтверждае
alwaysMarkSensitive: "Отмечать файлы как «содержимое не для всех» по умолчанию"
loadRawImages: "Сразу показывать изображения в полном размере"
disableShowingAnimatedImages: "Не проигрывать анимацию"
highlightSensitiveMedia: "Выделять содержимое не для всех"
verificationEmailSent: "Вам отправлено письмо для подтверждения. Пройдите, пожалуйста, по ссылке из письма, чтобы завершить проверку."
notSet: "Не настроено"
emailVerified: "Адрес электронной почты подтверждён."
@ -743,7 +761,7 @@ makeExplorable: "Опубликовать профиль в «Обзоре»."
makeExplorableDescription: "Если выключить, ваш профиль не будет показан в разделе «Обзор»."
showGapBetweenNotesInTimeline: "Показывать разделитель между заметками в ленте"
duplicate: "Дубликат"
left: "Влево"
left: "Слева"
center: "По центру"
wide: "Толстый"
narrow: "Тонкий"
@ -822,7 +840,7 @@ noMaintainerInformationWarning: "Не заполнены сведения об
noBotProtectionWarning: "Ботозащита не настроена"
configure: "Настроить"
postToGallery: "Опубликовать в галерею"
postToHashtag: "Написать заметку с этим хэштегом"
postToHashtag: "Написать заметку с этим хештегом"
gallery: "Галерея"
recentPosts: "Недавние публикации"
popularPosts: "Популярные публикации"
@ -839,13 +857,13 @@ emailNotConfiguredWarning: "Не указан адрес электронной
ratio: "Соотношение"
previewNoteText: "Предварительный просмотр"
customCss: "Индивидуальный CSS"
customCssWarn: "Используйте эту настройку только если знаете, что делаете. Ошибки здесь чреваты тем, что сайт перестанет нормально работать у вас."
customCssWarn: "Используйте эту настройку только если знаете, что делаете. Ошибки здесь чреваты тем, что у вас перестанет нормально работать сайт."
global: "Всеобщая"
squareAvatars: "Квадратные аватарки"
sent: "Отправить"
received: "Получено"
searchResult: "Результаты поиска"
hashtags: "Хэштег"
hashtags: "Хештеги"
troubleshooting: "Разрешение проблем"
useBlurEffect: "Размытие в интерфейсе"
learnMore: "Подробнее"
@ -857,7 +875,7 @@ accountDeletionInProgress: "В настоящее время выполняет
usernameInfo: "Имя, которое отличает вашу учетную запись от других на этом сервере. Вы можете использовать алфавит (a~z, A~Z), цифры (0~9) или символы подчеркивания (_). Имена пользователей не могут быть изменены позже."
aiChanMode: "Режим Ай"
devMode: "Режим разработчика"
keepCw: "Сохраняйте Предупреждения о содержимом"
keepCw: "Сохраняйте предупреждения о содержимом"
pubSub: "Учётные записи Pub/Sub"
lastCommunication: "Последнее сообщение"
resolved: "Решено"
@ -878,6 +896,8 @@ makeReactionsPublicDescription: "Список сделанных вами реа
classic: "Классика"
muteThread: "Скрыть цепочку"
unmuteThread: "Отменить сокрытие цепочки"
followingVisibility: "Видимость подписок"
followersVisibility: "Видимость подписчиков"
continueThread: "Показать следующие ответы"
deleteAccountConfirm: "Учётная запись будет безвозвратно удалена. Подтверждаете?"
incorrectPassword: "Пароль неверен."
@ -987,6 +1007,7 @@ assign: "Назначить"
unassign: "Отменить назначение"
color: "Цвет"
manageCustomEmojis: "Управлять пользовательскими эмодзи"
manageAvatarDecorations: "Управление украшениями аватара"
youCannotCreateAnymore: "Вы достигли лимита создания."
cannotPerformTemporary: "Временно недоступен"
cannotPerformTemporaryDescription: "Это действие временно невозможно выполнить из-за превышения лимита выполнения."
@ -1003,7 +1024,8 @@ thisPostMayBeAnnoying: "Это сообщение может быть непри
thisPostMayBeAnnoyingHome: "Этот пост может быть отправлен на главную"
thisPostMayBeAnnoyingCancel: "Этот пост не может быть отменен."
thisPostMayBeAnnoyingIgnore: "Этот пост может быть проигнорирован "
collapseRenotes: "Свернуть репосты"
collapseRenotes: "Сворачивать увиденные репосты"
collapseRenotesDescription: "Сворачивать посты с которыми вы взаимодействовали."
internalServerError: "Внутренняя ошибка сервера"
internalServerErrorDescription: "Внутри сервера произошла непредвиденная ошибка."
copyErrorInfo: "Скопировать код ошибки"
@ -1027,7 +1049,10 @@ resetPasswordConfirm: "Сбросить пароль?"
sensitiveWords: "Чувствительные слова"
sensitiveWordsDescription: "Установите общедоступный диапазон заметки, содержащей заданное слово, на домашний. Можно сделать несколько настроек, разделив их переносами строк."
sensitiveWordsDescription2: "Разделение пробелом создаёт спецификацию AND, а разделение косой чертой создаёт регулярное выражение."
prohibitedWords: "Запрещённые слова"
prohibitedWordsDescription: "Включает вывод ошибки при попытке опубликовать пост, содержащий указанное слово/набор слов.\nМножество слов может быть указано, разделяемые новой строкой."
prohibitedWordsDescription2: "Разделение пробелом создаёт спецификацию AND, а разделение косой чертой создаёт регулярное выражение."
hiddenTags: "Скрытые хештеги"
notesSearchNotAvailable: "Поиск заметок недоступен"
license: "Лицензия"
unfavoriteConfirm: "Удалить избранное?"
@ -1038,9 +1063,14 @@ retryAllQueuesConfirmTitle: "Хотите попробовать ещё раз?"
retryAllQueuesConfirmText: "Нагрузка на сервер может увеличиться"
enableChartsForRemoteUser: "Создание диаграмм для удалённых пользователей"
enableChartsForFederatedInstances: "Создание диаграмм для удалённых серверов"
showClipButtonInNoteFooter: "Показать кнопку добавления в подборку в меню действий с заметкой"
reactionsDisplaySize: "Размер реакций"
limitWidthOfReaction: "Ограничить максимальную ширину реакций и отображать их в уменьшенном размере."
noteIdOrUrl: "ID или ссылка на заметку"
video: "Видео"
videos: "Видео"
audio: "Звук"
audioFiles: "Звуковые файлы"
dataSaver: "Экономия трафика"
accountMigration: "Перенос учётной записи"
accountMoved: "Учётная запись перенесена"
@ -1052,12 +1082,13 @@ editMemo: "Изменить памятку"
reactionsList: "Список реакций"
renotesList: "Репосты"
notificationDisplay: "Отображение уведомлений"
leftTop: "Влево вверх"
rightTop: "Вправо вверх"
leftBottom: "Влево вниз"
rightBottom: "Вправо вниз"
vertical: "Вертикальная"
horizontal: "Сбоку"
leftTop: "Слева вверху"
rightTop: "Справа сверху"
leftBottom: "Слева внизу"
rightBottom: "Справа внизу"
stackAxis: "Положение уведомлений"
vertical: "Вертикально"
horizontal: "Горизонтально"
position: "Позиция"
serverRules: "Правила сервера"
pleaseConfirmBelowBeforeSignup: "Для регистрации на данном сервере, необходимо согласится с нижеследующими положениями."
@ -1069,57 +1100,114 @@ createNoteFromTheFile: "Создать заметку из этого файла
archive: "Архив"
channelArchiveConfirmTitle: "Переместить {name} в архив?"
channelArchiveConfirmDescription: "Архивированные каналы перестанут отображаться в списке каналов или результатах поиска. В них также нельзя будет добавлять новые записи."
thisChannelArchived: "Этот канал находится в архиве."
displayOfNote: "Отображение заметок"
initialAccountSetting: "Настройка профиля"
youFollowing: "Подписки"
preventAiLearning: "Отказаться от использования в машинном обучении (Генеративный ИИ)"
preventAiLearningDescription: "Запросить краулеров не использовать опубликованный текст или изображения и т.д. для машинного обучения (Прогнозирующий / Генеративный ИИ) датасетов. Это достигается путём добавления \"noai\" HTTP-заголовка в ответ на соответствующий контент. Полного предотвращения через этот заголовок не избежать, так как он может быть просто проигнорирован."
options: "Настройки ролей"
specifyUser: "Указанный пользователь"
openTagPageConfirm: "Открыть страницу этого хештега?"
specifyHost: "Указать сайт"
failedToPreviewUrl: "Предварительный просмотр недоступен"
update: "Обновить"
rolesThatCanBeUsedThisEmojiAsReaction: "Роли тех, кому можно использовать эти эмодзи как реакцию"
rolesThatCanBeUsedThisEmojiAsReactionEmptyDescription: "Если здесь ничего не указать, в качестве реакции эту эмодзи сможет использовать каждый."
rolesThatCanBeUsedThisEmojiAsReactionPublicRoleWarn: "Эти роли должны быть общедоступными."
cancelReactionConfirm: "Вы действительно хотите удалить свою реакцию?"
later: "Позже"
goToMisskey: "К Misskey"
additionalEmojiDictionary: "Дополнительные словари эмодзи"
installed: "Установлено"
branding: "Бренд"
enableServerMachineStats: "Опубликовать характеристики сервера"
enableIdenticonGeneration: "Включить генерацию иконки пользователя"
turnOffToImprovePerformance: "Отключение этого параметра может повысить производительность."
createInviteCode: "Создать код приглашения"
createCount: "Количество приглашений"
expirationDate: "Дата истечения"
unused: "Неиспользуемый"
noExpirationDate: "Бессрочно"
unused: "Неиспользованное"
used: "Использован"
expired: "Срок действия приглашения истёк"
doYouAgree: "Согласны?"
icon: "Аватар"
replies: "Ответы"
renotes: "Репост"
loadReplies: "Показать ответы"
pinnedList: "Закреплённый список"
keepScreenOn: "Держать экран включённым"
showRenotes: "Показывать репосты"
mutualFollow: "Взаимные подписки"
followingOrFollower: "Подписки или подписчики"
fileAttachedOnly: "Только заметки с файлами"
showRepliesToOthersInTimeline: "Показывать ответы в ленте"
showRepliesToOthersInTimelineAll: "Показывать в ленте ответы пользователей, на которых вы подписаны"
hideRepliesToOthersInTimelineAll: "Скрывать в ленте ответы пользователей, на которых вы подписаны"
sourceCode: "Исходный код"
sourceCodeIsNotYetProvided: "Исходный код пока не доступен. Свяжитесь с администратором, чтобы исправить эту проблему."
repositoryUrl: "Ссылка на репозиторий"
repositoryUrlDescription: "Если вы используете Misskey как есть (без изменений в исходном коде), введите https://github.com/misskey-dev/misskey"
privacyPolicy: "Политика Конфиденциальности"
privacyPolicyUrl: "Ссылка на Политику Конфиденциальности"
attach: "Прикрепить"
angle: "Угол"
flip: "Переворот"
disableStreamingTimeline: "Отключить обновление ленты в режиме реального времени"
useGroupedNotifications: "Отображать уведомления сгруппировано"
doReaction: "Добавить реакцию"
code: "Код"
remainingN: "Остаётся: {n}"
seasonalScreenEffect: "Эффект времени года на экране"
decorate: "Украсить"
addMfmFunction: "Добавить MFM"
lastNDays: "Последние {n} сут"
hemisphere: "Место проживания"
enableHorizontalSwipe: "Смахните в сторону, чтобы сменить вкладки"
surrender: "Этот пост не может быть отменен."
useNativeUIForVideoAudioPlayer: "Использовать интерфейс браузера при проигрывании видео и звука"
keepOriginalFilename: "Сохранять исходное имя файла"
keepOriginalFilenameDescription: "Если вы выключите данную настройку, имена файлов будут автоматически заменены случайной строкой при загрузке."
alwaysConfirmFollow: "Всегда подтверждать подписку"
inquiry: "Связаться"
_delivery:
stop: "Заморожено"
_type:
none: "Публикация"
_announcement:
tooManyActiveAnnouncementDescription: "Большое количество оповещений может ухудшить пользовательский опыт. Рассмотрите архивирование неактуальных оповещений. "
_initialAccountSetting:
accountCreated: "Аккаунт успешно создан!"
letsStartAccountSetup: "Давайте настроим вашу учётную запись."
profileSetting: "Настройки профиля"
privacySetting: "Настройки конфиденциальности"
initialAccountSettingCompleted: "Первоначальная настройка успешно завершена!"
startTutorial: "Пройти Обучение"
skipAreYouSure: "Пропустить настройку?"
_initialTutorial:
launchTutorial: "Пройти обучение"
_note:
description: "Посты в Misskey называются 'Заметками.' Заметки отсортированы в хронологическом порядке в ленте и обновляются в режиме реального времени."
_reaction:
reactToContinue: "Добавьте реакцию, чтобы продолжить."
_postNote:
_visibility:
public: "Твоя заметка будет видна всем."
doNotSendConfidencialOnDirect2: "Администратор целевого сервера может видеть что вы отправляете. Будьте осторожны с конфиденциальной информацией, когда отправляете личные заметки пользователям с ненадёжных серверов."
_timelineDescription:
home: "В персональной ленте располагаются заметки тех, на которых вы подписаны."
local: "Местная лента показывает заметки всех пользователей этого сайта."
local: "Местная лента показывает заметки всех пользователей этого экземпляра."
social: "В социальной ленте собирается всё, что есть в персональной и местной лентах."
global: "В глобальную ленту попадает вообще всё со связанных инстансов."
global: "В глобальную ленту попадает вообще всё со связанных экземпляров."
_serverSettings:
iconUrl: "Адрес на иконку роли"
_accountMigration:
moveFrom: "Перенести другую учётную запись сюда"
moveTo: "Перенести учётную запись на другой сервер"
moveAccountDescription: "Это действие перенесёт ваш аккаунт на другой сервер.\n ・Подписчики с этого аккаунта автоматически подпишутся на новый\n ・Этот аккаунт отпишется от всех пользователей, на которых подписан сейчас\n Вы не сможете создавать новые заметки и т.д. на этом аккаунте\n\nТогда как перенос подписчиков происходит автоматически, вы должны будете подготовиться, сделав некоторые шаги, чтобы перенести список пользователей, на которых вы подписаны. Чтобы сделать это, экспортируйте список подписчиков в файл, который затем импортируете на новом аккаунте в меню настроек. То же самое необходимо будет сделать со списками, также как и со скрытыми и заблокированными пользователями.\n\n(Это объяснение применяется к Misskey v13.12.0 и выше. Другое ActivityPub программное обеспечение, такое, как Mastodon, может работать по-другому."
startMigration: "Перенести"
movedAndCannotBeUndone: "Аккаунт был перемещён. Это действие необратимо."
_achievements:
earnedAt: "Разблокировано в"
_types:
@ -1395,6 +1483,7 @@ _role:
canPublicNote: "Может публиковать общедоступные заметки"
canInvite: "Может создавать пригласительные коды"
canManageCustomEmojis: "Управлять пользовательскими эмодзи"
canManageAvatarDecorations: "Управление украшениями аватара"
driveCapacity: "Доступное пространство на «диске»"
alwaysMarkNsfw: "Всегда отмечать файлы как «не для всех»"
pinMax: "Доступное количество закреплённых заметок"
@ -1505,6 +1594,11 @@ _aboutMisskey:
donate: "Пожертвование на Misskey"
morePatrons: "Большое спасибо и многим другим, кто принял участие в этом проекте! 🥰"
patrons: "Материальная поддержка"
projectMembers: "Участники проекта"
_displayOfSensitiveMedia:
respect: "Скрывать содержимое не для всех"
ignore: "Показывать содержимое не для всех"
force: "Скрывать всё содержимое"
_instanceTicker:
none: "Не показывать"
remote: "Только для других сайтов"
@ -1533,7 +1627,7 @@ _wordMute:
muteWordsDescription: "Пишите слова через пробел в одной строке, чтобы фильтровать их появление вместе; а если хотите фильтровать любое из них, пишите в отдельных строках."
muteWordsDescription2: "Здесь можно использовать регулярные выражения — просто заключите их между двумя дробными чертами (/)."
_instanceMute:
instanceMuteDescription: "Заметки и репосты с указанных здесь инстансов, а также ответы пользователям оттуда же не будут отображаться."
instanceMuteDescription: "Любые активности, затрагивающие инстансы из данного списка, будут скрыты."
instanceMuteDescription2: "Пишите каждый инстанс на отдельной строке"
title: "Скрывает заметки с заданных инстансов."
heading: "Список скрытых инстансов"
@ -1582,7 +1676,7 @@ _theme:
navActive: "Текст на боковой панели (активирован)"
navIndicator: "Индикатор на боковой панели"
link: "Ссылка"
hashtag: "Хэштег"
hashtag: "Хештег"
mention: "Упоминание"
mentionMe: "Упоминания вас"
renote: "Репост"
@ -1600,7 +1694,6 @@ _theme:
buttonBg: "Фон кнопки"
buttonHoverBg: "Текст кнопки"
inputBorder: "Рамка поля ввода"
listItemHoverBg: "Фон пункта списка (под указателем)"
driveFolderBg: "Фон папки «Диска»"
wallpaperOverlay: "Слой обоев"
badge: "Значок"
@ -1612,6 +1705,10 @@ _sfx:
note: "Заметки"
noteMy: "Собственные заметки"
notification: "Уведомления"
reaction: "При выборе реакции"
_soundSettings:
driveFile: "Использовать аудиофайл с Диска."
driveFileWarn: "Выбрать аудиофайл с Диска."
_ago:
future: "Из будущего"
justNow: "Только что"
@ -1690,6 +1787,7 @@ _permissions:
"write:gallery": "Редактирование галереи"
"read:gallery-likes": "Просмотр списка понравившегося в галерее"
"write:gallery-likes": "Изменение списка понравившегося в галерее"
"write:admin:reset-password": "Сбросить пароль пользователю"
_auth:
shareAccessTitle: "Разрешения для приложений"
shareAccess: "Дать доступ для «{name}» к вашей учётной записи?"
@ -1743,6 +1841,7 @@ _widgets:
_userList:
chooseList: "Выберите список"
clicker: "Счётчик щелчков"
birthdayFollowings: "Пользователи, у которых сегодня день рождения"
_cw:
hide: "Спрятать"
show: "Показать"
@ -1796,7 +1895,7 @@ _profile:
name: "Имя"
username: "Имя пользователя"
description: "О себе"
youCanIncludeHashtags: "Можете использовать здесь хэштеги"
youCanIncludeHashtags: "Можете использовать здесь хештеги."
metadata: "Дополнительные сведения"
metadataEdit: "Редактировать дополнительные сведения"
metadataDescription: "Можно добавить до четырёх дополнительных граф в профиль."
@ -1804,6 +1903,8 @@ _profile:
metadataContent: "Содержимое"
changeAvatar: "Поменять аватар"
changeBanner: "Поменять изображение в шапке"
verifiedLinkDescription: "Указывая здесь URL, содержащий ссылку на профиль, иконка владения ресурсом может быть отображена рядом с полем"
avatarDecorationMax: "Вы можете добавить до {max} украшений."
_exportOrImport:
allNotes: "Все заметки\n"
favoritedNotes: "Избранное"
@ -1926,6 +2027,9 @@ _notification:
unreadAntennaNote: "Антенна {name}"
emptyPushNotificationMessage: "Обновлены push-уведомления"
achievementEarned: "Получено достижение"
checkNotificationBehavior: "Проверить внешний вид уведомления"
sendTestNotification: "Отправить тестовое уведомление"
flushNotification: "Очистить уведомления"
_types:
all: "Все"
follow: "Подписки"
@ -1938,6 +2042,7 @@ _notification:
receiveFollowRequest: "Получен запрос на подписку"
followRequestAccepted: "Запрос на подписку одобрен"
achievementEarned: "Получение достижений"
login: "Войти"
app: "Уведомления из приложений"
_actions:
followBack: "отвечает взаимной подпиской"
@ -1977,19 +2082,57 @@ _dialog:
_disabledTimeline:
title: "Лента отключена"
description: "Ваша текущая роль не позволяет пользоваться этой лентой."
_drivecleaner:
orderBySizeDesc: "Размеры файлов по убыванию"
orderByCreatedAtAsc: "По увеличению даты"
_webhookSettings:
createWebhook: "Создать вебхук"
modifyWebhook: "Изменить Вебхук"
name: "Название"
secret: "Секрет"
trigger: "Условие срабатывания"
active: "Вкл."
_events:
follow: "Когда подписались на пользователя"
followed: "Когда на вас подписались"
note: "Когда создали заметку"
reply: "Когда получили ответ на заметку"
renote: "Когда вас репостнули"
reaction: "Когда получили реакцию"
mention: "Когда вас упоминают"
_systemEvents:
abuseReport: "Когда приходит жалоба"
abuseReportResolved: "Когда разрешается жалоба"
userCreated: "Когда создан пользователь"
deleteConfirm: "Вы уверены, что хотите удалить этот Вебхук?"
_abuseReport:
_notificationRecipient:
_recipientType:
mail: "Электронная почта"
webhook: "Вебхук"
_captions:
webhook: "Отправить уведомление Системному Вебхуку при получении или разрешении жалоб."
notifiedWebhook: "Используемый Вебхук"
_moderationLogTypes:
suspend: "Заморозить"
addCustomEmoji: "Добавлено эмодзи"
updateCustomEmoji: "Изменено эмодзи"
deleteCustomEmoji: "Удалено эмодзи"
deleteDriveFile: "Файл удалён"
resetPassword: "Сброс пароля:"
createInvitation: "Создать код приглашения"
createSystemWebhook: "Создать Системный Вебхук"
updateSystemWebhook: "Обновить Системый Вебхук"
deleteSystemWebhook: "Удалить Системный Вебхук"
_fileViewer:
url: "Ссылка"
attachedNotes: "Закреплённые заметки"
_dataSaver:
_code:
title: "Подсветка кода"
_hemisphere:
N: "Северное полушарие"
S: "Южное полушарие"
caption: "Используется для некоторых настроек клиента для определения сезона."
_reversi:
total: "Всего"

View file

@ -17,3 +17,6 @@ _sfx:
note: "නෝට්"
_profile:
username: "පරිශීලක නාමය"
_notification:
_types:
login: "පිවිසෙන්න"

View file

@ -454,7 +454,6 @@ uiLanguage: "Jazyk používateľského prostredia"
aboutX: "O {x}"
emojiStyle: "Štýl emoji"
native: "Natívne"
disableDrawer: "Nepoužívať šuflíkové menu"
showNoteActionsOnlyHover: "Ovládacie prvky poznámky sa zobrazujú len po nabehnutí myši"
noHistory: "Žiadna história"
signinHistory: "História prihlásení"
@ -632,10 +631,7 @@ abuseReported: "Vaše nahlásenie je odoslané. Veľmi pekne ďakujeme."
reporter: "Nahlásil"
reporteeOrigin: "Pôvod nahláseného"
reporterOrigin: "Pôvod nahlasovača"
forwardReport: "Preposlať nahlásenie na server"
forwardReportIsAnonymous: "Namiesto vášho účtu bude zobrazený anonymný systémový účet na vzdialenom serveri ako autor nahlásenia."
send: "Poslať"
abuseMarkAsResolved: "Označiť nahlásenia ako vyriešené"
openInNewTab: "Otvoriť v novom tabe"
openInSideView: "Otvoriť v bočnom paneli"
defaultNavigationBehaviour: "Predvolené správanie navigácie"
@ -917,7 +913,7 @@ color: "Farba"
horizontal: "Strana"
youFollowing: "Sledované"
icon: "Avatar"
replies: "Odpovede"
replies: "Odpoved"
renotes: "Preposlať"
sourceCode: "Zdrojový kód"
flip: "Preklopiť"
@ -1112,7 +1108,6 @@ _theme:
buttonBg: "Pozadie tlačidla"
buttonHoverBg: "Pozadie tlačidla (pod kurzorom)"
inputBorder: "Okraj vstupného poľa"
listItemHoverBg: "Pozadie položky zoznamu (pod kurzorom)"
driveFolderBg: "Pozadie priečinu disku"
wallpaperOverlay: "Vrstvenie pozadia"
badge: "Odznak"
@ -1410,6 +1405,7 @@ _notification:
pollEnded: "Hlasovanie skončilo"
receiveFollowRequest: "Doručené žiadosti o sledovanie"
followRequestAccepted: "Schválené žiadosti o sledovanie"
login: "Prihlásiť sa"
app: "Oznámenia z prepojených aplikácií"
_actions:
followBack: "Sledovať späť\n"

View file

@ -486,7 +486,7 @@ pleaseDonate: "Misskey är en gratis programvara som används på {host}. Donera
resetPasswordConfirm: "Återställ verkligen ditt lösenord?"
dataSaver: "Databesparing"
icon: "Profilbild"
replies: "Svar"
replies: "Svara"
renotes: "Omnotera"
_delivery:
stop: "Suspenderad"
@ -562,6 +562,7 @@ _notification:
renote: "Omnotera"
quote: "Citat"
reaction: "Reaktioner"
login: "Logga in"
_actions:
reply: "Svara"
renote: "Omnotera"

View file

@ -509,7 +509,6 @@ uiLanguage: "ภาษาอินเทอร์เฟซผู้ใช้ง
aboutX: "เกี่ยวกับ {x}"
emojiStyle: "สไตล์ของเอโมจิ"
native: "ภาษาแม่"
disableDrawer: "ไม่แสดงเมนูในรูปแบบลิ้นชัก"
showNoteActionsOnlyHover: "แสดงการดำเนินการโน้ตเมื่อโฮเวอร์(วางเมาส์เหนือ)เท่านั้น"
showReactionsCount: "แสดงจำนวนรีแอกชั่นในโน้ต"
noHistory: "ไม่มีประวัติ"
@ -708,10 +707,7 @@ abuseReported: "เราได้ส่งรายงานของคุณ
reporter: "ผู้รายงาน"
reporteeOrigin: "ปลายทางรายงาน"
reporterOrigin: "แหล่งผู้รายงาน"
forwardReport: "ส่งต่อรายงานไปยังเซิร์ฟเวอร์ระยะไกล"
forwardReportIsAnonymous: "ข้อมูลของคุณจะไม่ปรากฏบนเซิร์ฟเวอร์ระยะไกลและปรากฏเป็นบัญชีระบบที่ไม่ระบุชื่อ"
send: "ส่ง"
abuseMarkAsResolved: "ทำเครื่องหมายรายงานว่าแก้ไขแล้ว"
openInNewTab: "เปิดในแท็บใหม่"
openInSideView: "เปิดในมุมมองด้านข้าง"
defaultNavigationBehaviour: "พฤติกรรมการนำทางที่เป็นค่าเริ่มต้น"
@ -1334,10 +1330,10 @@ _initialTutorial:
_reaction:
title: "รีแอคชั่นคืออะไร?"
description: "โน้ตสามารถ“รีแอคชั่น”ด้วยเอโมจิต่างๆ ซึ่งทำให้สามารถแสดงความแตกต่างเล็กๆ น้อยๆ ที่อาจไม่สามารถสื่อออกมาได้ด้วยการแค่การกด “ถูกใจ”"
letsTryReacting: "คุณสามารถเพิ่มรีแอคชั่นได้ด้วยการคลิกปุ่ม “{reaction}” บนโน้ต ลองรีแอคชั่นโน้ตตัวอย่างนี้ดูสิ!"
letsTryReacting: "คุณสามารถเพิ่มรีแอคชั่นได้ด้วยการคลิกปุ่ม “+” บนโน้ต ลองรีแอคชั่นโน้ตตัวอย่างนี้ดูสิ!"
reactToContinue: "เพิ่มรีแอคชั่นเพื่อดำเนินการต่อ"
reactNotification: "คุณจะได้รับการแจ้งเตือนแบบเรียลไทม์เมื่อมีคนตอบรีแอคชั่นโน้ตของคุณ"
reactDone: "คุณสามารถยกเลิกรีแอคชั่นได้โดยการกดปุ่ม “{undo}”"
reactDone: "คุณสามารถยกเลิกรีแอคชั่นได้โดยการกดปุ่ม “-”"
_timeline:
title: "แนวคิดเรื่องของไทม์ไลน์"
description1: "Misskey มีหลายไทม์ไลน์ขึ้นอยู่กับวิธีการใช้งานของคุณ (บางไทม์ไลน์อาจไม่สามารถใช้ได้ขึ้นอยู่กับนโยบายของเซิร์ฟเวอร์)"
@ -1418,7 +1414,7 @@ _achievements:
earnedAt: "ได้รับเมื่อ"
_types:
_notes1:
title: "just setting up my shonk"
title: "just setting up my msky"
description: "โพสต์โน้ตเป็นครั้งแรก"
flavor: "ขอให้มีช่วงเวลาที่ดีกับ Misskey นะคะ!"
_notes10:
@ -1947,7 +1943,6 @@ _theme:
buttonBg: "ปุ่มพื้นหลัง"
buttonHoverBg: "ปุ่มพื้นหลัง (โฮเวอร์)"
inputBorder: "เส้นขอบของช่องป้อนข้อมูล"
listItemHoverBg: "รายการไอเทมพื้นหลัง (โฮเวอร์)"
driveFolderBg: "พื้นหลังโฟลเดอร์ไดรฟ์"
wallpaperOverlay: "วอลล์เปเปอร์ซ้อนทับ"
badge: "ตรา"
@ -2375,6 +2370,7 @@ _notification:
followRequestAccepted: "อนุมัติให้ติดตามแล้ว"
roleAssigned: "ให้บทบาท"
achievementEarned: "ปลดล็อกความสำเร็จแล้ว"
login: "เข้าสู่ระบบ"
app: "การแจ้งเตือนจากแอปที่มีลิงก์"
_actions:
followBack: "ติดตามกลับด้วย"

View file

@ -359,7 +359,7 @@ smtpUser: "Kullanıcı Adı"
smtpPass: "Şifre"
notificationSetting: "Bildirim ayarları"
instanceTicker: "Notların sunucu bilgileri"
noCrawleDescription: "Arama motorlarından profilinde, notlarında, sayfalarında vb. dolaşılmamasını ve dizine eklememesini talep et."
noCrawleDescription: "Arama motorlarından profilinde, notlarında, sayfalarında vb. dolaşılmamasını ve dizine eklememesini talep et."
clearCache: "Ön belleği temizle"
onlineUsersCount: "{n} kullanıcı çevrim içi"
user: "Kullanıcı"
@ -446,6 +446,7 @@ _notification:
reaction: "Tepkiler"
receiveFollowRequest: "Takip isteği alındı"
followRequestAccepted: "Takip isteği kabul edildi"
login: "Giriş Yap "
_actions:
reply: "yanıt"
renote: "vazgeçme"

View file

@ -17,3 +17,6 @@ _2fa:
renewTOTPCancel: "ئۇنى توختىتىڭ"
_widgets:
profile: "profile"
_notification:
_types:
login: "كىرىش"

View file

@ -452,7 +452,6 @@ language: "Мова"
uiLanguage: "Мова інтерфейсу"
aboutX: "Про {x}"
native: "місцевий"
disableDrawer: "Не використовувати висувні меню"
noHistory: "Історія порожня"
signinHistory: "Історія входів"
enableAdvancedMfm: "Увімкнути розширений MFM"
@ -631,10 +630,7 @@ abuseReported: "Дякуємо, вашу скаргу було відправл
reporter: "Репортер"
reporteeOrigin: "Про кого повідомлено"
reporterOrigin: "Хто повідомив"
forwardReport: "Переслати звіт на віддалений інстанс"
forwardReportIsAnonymous: "Замість вашого облікового запису анонімний системний обліковий запис буде відображатися як доповідач на віддаленому інстансі"
send: "Відправити"
abuseMarkAsResolved: "Позначити скаргу як вирішену"
openInNewTab: "Відкрити в новій вкладці"
openInSideView: "Відкрити збоку"
defaultNavigationBehaviour: "Поведінка навігації за замовчуванням"
@ -1306,7 +1302,6 @@ _theme:
buttonBg: "Фон кнопки"
buttonHoverBg: "Фон кнопки (при наведенні)"
inputBorder: "Край поля вводу"
listItemHoverBg: "Фон елементу в списку (при наведенні)"
driveFolderBg: "Фон папки на диску"
wallpaperOverlay: "Накладання шпалер"
badge: "Значок"
@ -1588,6 +1583,7 @@ _notification:
reaction: "Реакції"
receiveFollowRequest: "Запити на підписку"
followRequestAccepted: "Прийняті підписки"
login: "Увійти"
app: "Сповіщення від додатків"
_actions:
reply: "Відповісти"

View file

@ -443,7 +443,7 @@ text: "Matn"
enable: "Yoqish"
next: "Keyingisi"
retype: "Qayta kiriting"
noteOf: "{user} tomonidan joylandi\n"
noteOf: "{user} tomonidan joylandi\n"
quoteAttached: "Iqtibos"
quoteQuestion: "Iqtibos sifatida qo'shilsinmi?"
noMessagesYet: "Bu yerda xabarlar yo'q"
@ -471,7 +471,6 @@ uiLanguage: "Interfeys tili"
aboutX: "{x} haqida"
emojiStyle: "Emoji ko'rinishi"
native: "Mahalliy"
disableDrawer: "Slayd menyusidan foydalanmang"
showNoteActionsOnlyHover: "Eslatma amallarini faqat sichqonchani olib borganda korsatish"
noHistory: "Tarix yo'q"
signinHistory: "kirish tarixi"
@ -630,10 +629,7 @@ abuseReported: "Shikoyatingiz yetkazildi. Ma'lumot uchun rahmat."
reporter: "Shikoyat qiluvchi"
reporteeOrigin: "Xabarning kelib chiqishi"
reporterOrigin: "Xabarchining joylashuvi"
forwardReport: "Xabarni masofadagi serverga yuborish"
forwardReportIsAnonymous: "Sizning yuborayotgan xabaringiz o'z akkountingiz emas balki anonim tarzda qoladi"
send: "Yuborish"
abuseMarkAsResolved: "Yuborilgan xabarni hal qilingan deb belgilash"
openInNewTab: "Yangi tab da ochish"
openInSideView: "Yon panelda ochish"
defaultNavigationBehaviour: "Standart navigatsiya harakati"
@ -843,7 +839,7 @@ rolesAssignedToMe: "Mening rollarim"
resetPasswordConfirm: "Qayta parol o'rnatmoqchimisiz?"
sensitiveWords: "Ta'sirchan so'zlar"
icon: "Avatar"
replies: "Javoblar"
replies: "Javob berish"
renotes: "Qayta qayd etish"
flip: "Teskari"
_delivery:
@ -1058,6 +1054,7 @@ _notification:
quote: "Iqtibos keltirish"
reaction: "Reaktsiyalar"
receiveFollowRequest: "Qabul qilingan kuzatuv so'rovlari"
login: "Kirish"
_actions:
reply: "Javob berish"
renote: "Qayta qayd qilish"

1
locales/version.d.ts vendored Normal file
View file

@ -0,0 +1 @@
export const localesVersion: string;

14
locales/version.js Normal file
View file

@ -0,0 +1,14 @@
import { createHash } from 'crypto';
import locales from './index.js';
// MD5 is acceptable because we don't need cryptographic security.
const hash = createHash('md5');
// Derive the version hash from locale content exclusively.
// This avoids the problem of "stuck" translations after modifying locale files.
const localesText = JSON.stringify(locales);
hash.update(localesText, 'utf8');
// We can't use regular base64 since this becomes part of a filename.
// Base64URL avoids special characters that would cause an issue.
export const localesVersion = hash.digest().toString('base64url');

View file

@ -486,7 +486,6 @@ uiLanguage: "Ngôn ngữ giao diện"
aboutX: "Giới thiệu {x}"
emojiStyle: "Kiểu cách Emoji"
native: "Bản xứ"
disableDrawer: "Không dùng menu thanh bên"
showNoteActionsOnlyHover: "Chỉ hiển thị các hành động ghi chú khi di chuột"
noHistory: "Không có dữ liệu"
signinHistory: "Lịch sử đăng nhập"
@ -676,10 +675,7 @@ abuseReported: "Báo cáo đã được gửi. Cảm ơn bạn nhiều."
reporter: "Người báo cáo"
reporteeOrigin: "Bị báo cáo"
reporterOrigin: "Máy chủ người báo cáo"
forwardReport: "Chuyển tiếp báo cáo cho máy chủ từ xa"
forwardReportIsAnonymous: "Thay vì tài khoản của bạn, một tài khoản hệ thống ẩn danh sẽ được hiển thị dưới dạng người báo cáo ở máy chủ từ xa."
send: "Gửi"
abuseMarkAsResolved: "Đánh dấu đã xử lý"
openInNewTab: "Mở trong tab mới"
openInSideView: "Mở trong thanh bên"
defaultNavigationBehaviour: "Thao tác điều hướng mặc định"
@ -1163,7 +1159,7 @@ _achievements:
earnedAt: "Ngày thu nhận"
_types:
_notes1:
title: "just setting up my shonk"
title: "just setting up my msky"
description: "Lần đầu tiên đăng bài"
flavor: "Chúc bạn trên Miskey vui vẻ nha!!"
_notes10:
@ -1288,7 +1284,7 @@ _achievements:
_iLoveMisskey:
title: "Tôi Yêu Misskey"
description: "Đăng lời nói \"I ❤ #Misskey\""
flavor: "Xin chân thành cảm ơn bạn đã sử dụng Misskey!! by Đội ngũ phát triển"
flavor: "Xin chân thành cảm ơn bạn đã sử dụng Misskey!! by Đội ngũ phát triển"
_foundTreasure:
title: "Tìm kiếm kho báu"
description: "Tìm thấy được những kho báu cất giấu"
@ -1329,7 +1325,7 @@ _achievements:
description: "Bấm chỗ này"
_justPlainLucky:
title: "Chỉ là một cuộc máy mắn"
description: "Mỗi 10 giây thu nhận được với tỷ lệ 0.005%"
description: "Mỗi 10 giây thu nhận được với tỷ lệ 0.005%"
_setNameToSyuilo:
title: "Ngưỡng mộ với vị thần"
description: "Đạt tên là syuilo"
@ -1483,7 +1479,7 @@ _wordMute:
muteWordsDescription: "Separate with spaces for an AND condition or with line breaks for an OR condition."
muteWordsDescription2: "Bao quanh các từ khóa bằng dấu gạch chéo để sử dụng cụm từ thông dụng."
_instanceMute:
instanceMuteDescription: "Thao tác này sẽ ẩn mọi tút/lượt đăng lại từ các máy chủ được liệt kê, bao gồm cả những tút dạng trả lời từ máy chủ bị ẩn."
instanceMuteDescription: "Thao tác này sẽ ẩn mọi tút/lượt đăng lại từ các máy chủ được liệt kê, bao gồm cả những tút dạng trả lời từ máy chủ bị ẩn."
instanceMuteDescription2: "Tách bằng cách xuống dòng"
title: "Ẩn tút từ những máy chủ đã liệt kê."
heading: "Danh sách những máy chủ bị ẩn"
@ -1550,7 +1546,6 @@ _theme:
buttonBg: "Nền nút"
buttonHoverBg: "Nền nút (Chạm)"
inputBorder: "Đường viền khung soạn thảo"
listItemHoverBg: "Nền mục liệt kê (Chạm)"
driveFolderBg: "Nền thư mục Ổ đĩa"
wallpaperOverlay: "Lớp phủ hình nền"
badge: "Huy hiệu"
@ -1879,6 +1874,7 @@ _notification:
receiveFollowRequest: "Yêu cầu theo dõi"
followRequestAccepted: "Yêu cầu theo dõi được chấp nhận"
achievementEarned: "Hoàn thành Achievement"
login: "Đăng nhập"
app: "Từ app liên kết"
_actions:
followBack: "đã theo dõi lại bạn"

View file

@ -8,6 +8,9 @@ search: "搜索"
notifications: "通知"
username: "用户名"
password: "密码"
initialPasswordForSetup: "初始化密码"
initialPasswordIsIncorrect: "初始化密码不正确"
initialPasswordForSetupDescription: "如果是自己安装的 Misskey请输入配置文件里设好的密码。\n如果使用的是 Misskey 的托管服务等,请输入服务商提供的密码。\n如果没有设置密码请留空并继续。"
forgotPassword: "忘记密码"
fetchingAsApObject: "在联邦宇宙查询中..."
ok: "OK"
@ -90,7 +93,7 @@ followsYou: "正在关注你"
createList: "创建列表"
manageLists: "管理列表"
error: "错误"
somethingHappened: "出现了一些问题!"
somethingHappened: "出错了"
retry: "重试"
pageLoadError: "页面加载失败。"
pageLoadErrorDescription: "这通常是由于网络或浏览器缓存的原因。请清除缓存或等待片刻后重试。"
@ -167,7 +170,7 @@ emojiUrl: "emoji 地址"
addEmoji: "添加表情符号"
settingGuide: "推荐配置"
cacheRemoteFiles: "缓存远程文件"
cacheRemoteFilesDescription: "启用此设定时,将在此服务器上缓存远程文件。虽然可以加快图片显示的速度,但是相对的会消耗大量的服务器存储空间。用户角色内的网盘容量决定了这个远程用户能在服务器上保留保留多少缓存。当超出了这个限制时,旧的文件将从缓存中被删除,成为链接。当禁用此设定时,则是从一开始就将远程文件保留为链接。此时推荐将 default.yml 的 proxyRemoteFiles 设置为 true 以优化缩略图生成及保护用户隐私。"
cacheRemoteFilesDescription: "启用此设定时,将在此服务器上缓存远程文件。虽然可以加快图片显示的速度,但是相对的会消耗大量的服务器存储空间。用户角色内的网盘容量决定了这个远程用户能在服务器上保留多少缓存。当超出了这个限制时,旧的文件将从缓存中被删除,成为链接。当禁用此设定时,则是从一开始就将远程文件保留为链接。此时推荐将 default.yml 的 proxyRemoteFiles 设置为 true 以优化缩略图生成及保护用户隐私。"
youCanCleanRemoteFilesCache: "可以使用文件管理的🗑️按钮来删除所有的缓存。"
cacheRemoteSensitiveFiles: "缓存远程敏感媒体文件"
cacheRemoteSensitiveFilesDescription: "如果禁用这项设定,远程服务器的敏感媒体将不会被缓存,而是直接链接。"
@ -236,6 +239,8 @@ silencedInstances: "被静音的服务器"
silencedInstancesDescription: "设置要静音的服务器,以换行分隔。被静音的服务器内所有的账户将默认处于「静音」状态,仅能发送关注请求,并且在未关注状态下无法提及本地账户。被阻止的实例不受影响。"
mediaSilencedInstances: "已隐藏媒体文件的服务器"
mediaSilencedInstancesDescription: "设置要隐藏媒体文件的服务器,以换行分隔。被设置为隐藏媒体文件服务器内所有账号的文件均按照「敏感内容」处理,且将无法使用自定义表情符号。被阻止的实例不受影响。"
federationAllowedHosts: "允许联合的服务器"
federationAllowedHostsDescription: "设定允许联合的服务器,以换行分隔。"
muteAndBlock: "静音/拉黑"
mutedUsers: "已静音用户"
blockedUsers: "已拉黑的用户"
@ -334,6 +339,7 @@ renameFolder: "重命名文件夹"
deleteFolder: "删除文件夹"
folder: "文件夹"
addFile: "添加文件"
showFile: "显示文件"
emptyDrive: "网盘中无文件"
emptyFolder: "此文件夹中无文件"
unableToDelete: "无法删除"
@ -448,6 +454,7 @@ totpDescription: "使用验证器输入一次性密码"
moderator: "监察员"
moderation: "管理"
moderationNote: "管理笔记"
moderationNoteDescription: "可以用来记录仅在管理员之间共享的笔记。"
addModerationNote: "添加管理笔记"
moderationLogs: "管理日志"
nUsersMentioned: "{n} 被提到"
@ -509,7 +516,10 @@ uiLanguage: "显示语言"
aboutX: "关于 {x}"
emojiStyle: "表情符号的样式"
native: "原生"
disableDrawer: "不显示抽屉菜单"
menuStyle: "菜单样式"
style: "样式"
drawer: "抽屉"
popup: "弹窗"
showNoteActionsOnlyHover: "仅在悬停时显示帖子操作"
showReactionsCount: "显示帖子的回应数"
noHistory: "没有历史记录"
@ -592,6 +602,8 @@ ascendingOrder: "升序"
descendingOrder: "降序"
scratchpad: "AiScript 控制台"
scratchpadDescription: "AiScript 控制台为 AiScript 提供了实验环境。您可以编写代码与 Misskey 交互,运行并查看结果。"
uiInspector: "UI 检查器"
uiInspectorDescription: "查看所有内存中由 UI 组件生成出的实例。UI 组件由 UI:C 系列函数所生成。"
output: "输出"
script: "脚本"
disablePagesScript: "禁用页面脚本"
@ -708,10 +720,7 @@ abuseReported: "内容已发送。感谢您提交信息。"
reporter: "举报者"
reporteeOrigin: "举报来源"
reporterOrigin: "举报者来源"
forwardReport: "将该举报信息转发给远程服务器"
forwardReportIsAnonymous: "在远程实例上显示的报告者是匿名的系统账号,而不是您的账号。"
send: "发送"
abuseMarkAsResolved: "处理完毕"
openInNewTab: "在新标签页中打开"
openInSideView: "在侧边栏中打开"
defaultNavigationBehaviour: "默认导航"
@ -913,6 +922,7 @@ followersVisibility: "关注者的公开范围"
continueThread: "查看更多帖子"
deleteAccountConfirm: "将要删除账户。是否确认?"
incorrectPassword: "密码错误"
incorrectTotp: "一次性密码不正确或已过期"
voteConfirm: "确定投给 “{choice}” "
hide: "隐藏"
useDrawerReactionPickerForMobile: "在移动设备上使用抽屉显示"
@ -1077,6 +1087,7 @@ retryAllQueuesConfirmTitle: "要再尝试一次吗?"
retryAllQueuesConfirmText: "可能会使服务器负荷在一定时间内增加"
enableChartsForRemoteUser: "生成远程用户的图表"
enableChartsForFederatedInstances: "生成远程服务器的图表"
enableStatsForFederatedInstances: "获取远程服务器的信息"
showClipButtonInNoteFooter: "在贴文下方显示便签按钮"
reactionsDisplaySize: "回应显示大小"
limitWidthOfReaction: "限制回应的最大宽度,并将其缩小显示"
@ -1189,10 +1200,10 @@ followingOrFollower: "关注中或关注者"
fileAttachedOnly: "仅限媒体"
showRepliesToOthersInTimeline: "在时间线中包含给别人的回复"
hideRepliesToOthersInTimeline: "在时间线中隐藏给别人的回复"
showRepliesToOthersInTimelineAll: "在时间线中包含现在关注的所有人的回复"
hideRepliesToOthersInTimelineAll: "在时间线中隐藏现在关注的所有人的回复"
confirmShowRepliesAll: "此操作不可撤销。确认要在时间线中包含现在关注的所有人的回复吗?"
confirmHideRepliesAll: "此操作不可撤销。确认要在时间线中隐藏现在关注的所有人的回复吗?"
showRepliesToOthersInTimelineAll: "在时间线中显示所有现在关注的人的回复"
hideRepliesToOthersInTimelineAll: "在时间线中隐藏所有现在关注的人的回复"
confirmShowRepliesAll: "此操作不可撤销。确认要在时间线中显示所有现在关注的人的回复吗?"
confirmHideRepliesAll: "此操作不可撤销。确认要在时间线中隐藏所有现在关注的人的回复吗?"
externalServices: "外部服务"
sourceCode: "源代码"
sourceCodeIsNotYetProvided: "还未提供源代码。要解决此问题请联系管理员。"
@ -1263,6 +1274,32 @@ confirmWhenRevealingSensitiveMedia: "显示敏感内容前需要确认"
sensitiveMediaRevealConfirm: "这是敏感内容。是否显示?"
createdLists: "已创建的列表"
createdAntennas: "已创建的天线"
fromX: "从 {x}"
genEmbedCode: "生成嵌入代码"
noteOfThisUser: "此用户的帖子"
clipNoteLimitExceeded: "无法再往此便签内添加更多帖子"
performance: "性能"
modified: "有变更"
discard: "取消"
thereAreNChanges: "有 {n} 处更改"
signinWithPasskey: "使用通行密钥登录"
unknownWebAuthnKey: "此通行密钥未注册。"
passkeyVerificationFailed: "验证通行密钥失败。"
passkeyVerificationSucceededButPasswordlessLoginDisabled: "通行密钥验证成功,但账户未开启无密码登录。"
messageToFollower: "给关注者的消息"
target: "对象"
testCaptchaWarning: "此功能为测试 CAPTCHA 用。<strong>请勿在正式环境中使用。</strong>"
prohibitedWordsForNameOfUser: "用户名中禁止的词"
prohibitedWordsForNameOfUserDescription: "更改用户名时,如果用户名中包含此列表里的词汇,用户的改名请求将被拒绝。持有管理员权限的用户不受此限制。"
yourNameContainsProhibitedWords: "目标用户名包含违禁词"
yourNameContainsProhibitedWordsDescription: "用户名内含有违禁词。若想使用此用户名,请联系服务器管理员。"
_abuseUserReport:
forward: "转发"
forwardDescription: "目标是匿名系统账户,将把举报转发给远程服务器。"
resolve: "解决"
accept: "确认"
reject: "拒绝"
resolveTutorial: "如果举报内容有理且已解决,选择「确认」将案件以肯定的态度标记为已解决。\n如果举报内容站不住脚选择「拒绝」将案件以否定的态度标记为已解决。"
_delivery:
status: "投递状态"
stop: "停止投递"
@ -1334,10 +1371,10 @@ _initialTutorial:
_reaction:
title: "什么是回应?"
description: "您可以在帖子中添加“回应”。 您可以使用反应轻松地表达点“赞”所无法传达的细微差别。"
letsTryReacting: "回应可以通过点击帖子中的「{reaction}」按钮来添加。试着给这个示例帖子添加一个回应!"
letsTryReacting: "回应可以通过点击帖子中的「+」按钮来添加。试着给这个示例帖子添加一个回应!"
reactToContinue: "添加一个回应来继续"
reactNotification: "当您的帖子被某人添加了回应时,将实时收到通知。"
reactDone: "通过按下「{undo}」按钮,可以取消已经添加的回应"
reactDone: "通过按下「」按钮,可以取消已经添加的回应"
_timeline:
title: "时间线的运作方式"
description1: "Misskey 根据使用方式提供了多个时间线(根据服务器的设定,可能有一些被禁用)。"
@ -1397,8 +1434,10 @@ _serverSettings:
fanoutTimelineDescription: "当启用时,可显著提高获取各种时间线时的性能,并减轻数据库的负荷。但是相对的 Redis 的内存使用量将会增加。如果服务器的内存不是很大,又或者运行不稳定的话可以把它关掉。"
fanoutTimelineDbFallback: "回退到数据库"
fanoutTimelineDbFallbackDescription: "当启用时,若时间线未被缓存,则将额外查询数据库。禁用该功能可通过不执行回退处理进一步减少服务器负载,但会限制可检索的时间线范围。"
reactionsBufferingDescription: "开启时可显著提高发送回应时的性能,及减轻数据库负荷。但 Redis 的内存用量会相应增加。"
inquiryUrl: "联络地址"
inquiryUrlDescription: "用来指定诸如向服务运营商咨询的论坛地址,或记载了运营商联系方式之类的网页地址。"
thisSettingWillAutomaticallyOffWhenModeratorsInactive: "若在一段时间内没有检测到管理活动,为防止垃圾信息,此设定将自动关闭。"
_accountMigration:
moveFrom: "从别的账号迁移到此账户"
moveFromSub: "为另一个账户建立别名"
@ -1598,7 +1637,7 @@ _achievements:
_postedAt0min0sec:
title: "报时"
description: "在 0 点发布一篇帖子"
flavor: "嘣 嘣 嘣 Biu——"
flavor: "嘟 · 嘟 · 嘟 · 哔——"
_selfQuote:
title: "自我引用"
description: "引用了自己的帖子"
@ -1647,8 +1686,8 @@ _achievements:
flavor: "今年也请对本服务器多多指教!"
_cookieClicked:
title: "点击饼干小游戏"
description: "点击了可疑的饼干"
flavor: "是不是软件有问题"
description: "点击了饼干"
flavor: "用错软件了"
_brainDiver:
title: "Brain Diver"
description: "发布了包含 Brain Diver 链接的帖子"
@ -1665,7 +1704,7 @@ _achievements:
_bubbleGameDoubleExplodingHead:
title: "两个🤯"
description: "你合成出了2个游戏里最大的Emoji"
flavor: ""
flavor: "大约能 装满 这些便当盒 🤯 🤯 (比划)"
_role:
new: "创建角色"
edit: "编辑角色"
@ -1730,6 +1769,11 @@ _role:
canSearchNotes: "是否可以搜索帖子"
canUseTranslator: "使用翻译功能"
avatarDecorationLimit: "可添加头像挂件的最大个数"
canImportAntennas: "允许导入天线"
canImportBlocking: "允许导入拉黑列表"
canImportFollowing: "允许导入关注列表"
canImportMuting: "允许导入屏蔽列表"
canImportUserLists: "允许导入用户列表"
_condition:
roleAssignedTo: "已分配给手动角色"
isLocal: "是本地用户"
@ -1947,7 +1991,6 @@ _theme:
buttonBg: "按钮背景"
buttonHoverBg: "按钮背景(悬停)"
inputBorder: "输入框边框"
listItemHoverBg: "下拉列表项目背景(悬停)"
driveFolderBg: "网盘的文件夹背景"
wallpaperOverlay: "壁纸叠加层"
badge: "徽章"
@ -2224,6 +2267,9 @@ _profile:
changeBanner: "修改横幅"
verifiedLinkDescription: "如果将内容设置为 URL当链接所指向的网页内包含自己的个人资料链接时可以显示一个已验证图标。"
avatarDecorationMax: "最多可添加 {max} 个挂件"
followedMessage: "被关注时显示的消息"
followedMessageDescription: "可以设置被关注时向对方显示的短消息。"
followedMessageDescriptionForLockedAccount: "需要批准才能关注的情况下,消息是在请求被批准后显示。"
_exportOrImport:
allNotes: "所有帖子"
favoritedNotes: "收藏的帖子"
@ -2362,6 +2408,8 @@ _notification:
renotedBySomeUsers: "{n} 人转发了"
followedBySomeUsers: "被 {n} 人关注"
flushNotification: "重置通知历史"
exportOfXCompleted: "已完成 {x} 个导出"
login: "有新的登录"
_types:
all: "全部"
note: "用户的新帖子"
@ -2376,6 +2424,9 @@ _notification:
followRequestAccepted: "关注请求已通过"
roleAssigned: "授予的角色"
achievementEarned: "取得的成就"
exportCompleted: "已完成导出"
login: "登录"
test: "测试通知"
app: "关联应用的通知"
_actions:
followBack: "回关"
@ -2441,7 +2492,10 @@ _webhookSettings:
abuseReport: "当收到举报时"
abuseReportResolved: "当举报被处理时"
userCreated: "当用户被创建时"
inactiveModeratorsWarning: "当管理员在一段时间内不活跃时"
inactiveModeratorsInvitationOnlyChanged: "当因为管理员在一段时间内不活跃,导致服务器变为邀请制时"
deleteConfirm: "要删除 webhook 吗?"
testRemarks: "点击开关右侧的按钮,可以发送使用假数据的测试 Webhook。"
_abuseReport:
_notificationRecipient:
createRecipient: "新建举报通知"
@ -2485,6 +2539,8 @@ _moderationLogTypes:
markSensitiveDriveFile: "标记网盘文件为敏感媒体"
unmarkSensitiveDriveFile: "取消标记网盘文件为敏感媒体"
resolveAbuseReport: "处理举报"
forwardAbuseReport: "转发举报"
updateAbuseReportNote: "更新举报用管理笔记"
createInvitation: "生成邀请码"
createAd: "创建了广告"
deleteAd: "删除了广告"
@ -2640,3 +2696,17 @@ _contextMenu:
app: "应用"
appWithShift: "Shift 键应用"
native: "浏览器的用户界面"
_embedCodeGen:
title: "自定义嵌入代码"
header: "显示标题"
autoload: "连续加载(不推荐)"
maxHeight: "最大高度"
maxHeightDescription: "若将最大值设为 0 则不限制最大高度。为防止小工具无限增高,建议设置一下。"
maxHeightWarn: "最大高度限制已禁用0。若这不是您想要的效果请将最大高度设一个值。"
previewIsNotActual: "由于超出了预览画面可显示的范围,因此显示内容会与实际嵌入时有所不同。"
rounded: "圆角"
border: "外边框"
applyToPreview: "应用预览"
generateCode: "生成嵌入代码"
codeGenerated: "已生成代码"
codeGeneratedDescription: "将生成的代码贴到网站上来使用。"

View file

@ -8,6 +8,9 @@ search: "搜尋"
notifications: "通知"
username: "使用者名稱"
password: "密碼"
initialPasswordForSetup: "初始設定用的密碼"
initialPasswordIsIncorrect: "初始設定用的密碼錯誤。"
initialPasswordForSetupDescription: "如果您自己安裝了 Misskey請使用您在設定檔中輸入的密碼。\n如果您使用 Misskey 的託管服務之類的服務,請使用提供的密碼。\n如果您尚未設定密碼請將其留空並繼續。"
forgotPassword: "忘記密碼"
fetchingAsApObject: "從聯邦宇宙取得中..."
ok: "OK"
@ -236,6 +239,8 @@ silencedInstances: "被禁言的伺服器"
silencedInstancesDescription: "設定要禁言的伺服器主機名稱,以換行分隔。隸屬於禁言伺服器的所有帳戶都將被視為「禁言帳戶」,只能發出「追隨請求」,而且無法提及未追隨的本地帳戶。這不會影響已封鎖的實例。"
mediaSilencedInstances: "媒體被禁言的伺服器"
mediaSilencedInstancesDescription: "設定您想要對媒體設定禁言的伺服器,以換行符號區隔。來自被媒體禁言的伺服器所屬帳戶的所有檔案都會被視為敏感檔案,且自訂表情符號不能使用。被封鎖的伺服器不受影響。"
federationAllowedHosts: "允許聯邦通訊的伺服器"
federationAllowedHostsDescription: "設定允許聯邦通訊的伺服器主機,以換行符號分隔。"
muteAndBlock: "靜音和封鎖"
mutedUsers: "被靜音的使用者"
blockedUsers: "被封鎖的使用者"
@ -334,6 +339,7 @@ renameFolder: "重新命名資料夾"
deleteFolder: "刪除資料夾"
folder: "資料夾"
addFile: "加入附件"
showFile: "瀏覽文件"
emptyDrive: "雲端硬碟為空"
emptyFolder: "資料夾為空"
unableToDelete: "無法刪除"
@ -448,6 +454,7 @@ totpDescription: "以驗證應用程式輸入一次性密碼"
moderator: "審查員"
moderation: "審查"
moderationNote: "管理筆記"
moderationNoteDescription: "您可以編寫僅在審查員之間共用的註解。"
addModerationNote: "新增管理筆記"
moderationLogs: "管理日誌"
nUsersMentioned: "被 {n} 個人提及"
@ -509,8 +516,11 @@ uiLanguage: "介面語言"
aboutX: "關於{x}"
emojiStyle: "表情符號的風格"
native: "原生"
disableDrawer: "不顯示下拉式選單"
showNoteActionsOnlyHover: "僅在游標停留時顯示貼文的操作選項"
menuStyle: "選單風格"
style: "風格"
drawer: "側邊欄"
popup: "彈出式視窗"
showNoteActionsOnlyHover: "僅在游標停留時顯示貼文的"
showReactionsCount: "顯示貼文的反應數目"
noHistory: "沒有歷史紀錄"
signinHistory: "登入歷史"
@ -592,6 +602,8 @@ ascendingOrder: "昇冪"
descendingOrder: "降冪"
scratchpad: "暫存記憶體"
scratchpadDescription: "AiScript 控制臺為 AiScript 的實驗環境。您可以在此編寫、執行和確認程式碼與 Misskey 互動的結果。"
uiInspector: "UI 檢查"
uiInspectorDescription: "您可以看到記憶體中存在的 UI 元件實例的清單。 UI 元件由 Ui:C: 系列函數產生。"
output: "輸出"
script: "腳本"
disablePagesScript: "停用頁面的 AiScript 腳本"
@ -708,10 +720,7 @@ abuseReported: "檢舉完成。感謝您的報告。"
reporter: "檢舉者"
reporteeOrigin: "檢舉來源"
reporterOrigin: "檢舉者來源"
forwardReport: "將報告轉送給遠端伺服器"
forwardReportIsAnonymous: "在遠端實例上看不到您的資訊,顯示的報告者是匿名的系统帳戶。"
send: "發送"
abuseMarkAsResolved: "處理完畢"
openInNewTab: "在新分頁中開啟"
openInSideView: "在側欄中開啟"
defaultNavigationBehaviour: "預設導航"
@ -913,6 +922,7 @@ followersVisibility: "追隨者的可見性"
continueThread: "查看更多貼文"
deleteAccountConfirm: "將要刪除帳戶。是否確定?"
incorrectPassword: "密碼錯誤。"
incorrectTotp: "一次性密碼錯誤,或者已過期。"
voteConfirm: "確定投給「{choice}」?"
hide: "隱藏"
useDrawerReactionPickerForMobile: "在移動設備上使用抽屜顯示"
@ -1009,7 +1019,7 @@ show: "檢視"
neverShow: "不再顯示"
remindMeLater: "以後再說"
didYouLikeMisskey: "您喜歡 Misskey 嗎?"
pleaseDonate: "Misskey 是由 {host} 使用的免費軟體。請贊助我們,讓開發得以持續!"
pleaseDonate: "Misskey是由{host}使用的免費軟體。請贊助我們,讓開發的工作能夠持續!"
correspondingSourceIsAvailable: "對應的原始碼可以在 {anchor} 處找到。"
roles: "角色"
role: "角色"
@ -1077,6 +1087,7 @@ retryAllQueuesConfirmTitle: "要現在重試嗎?"
retryAllQueuesConfirmText: "伺服器的負荷可能會暫時增加。"
enableChartsForRemoteUser: "生成遠端使用者的圖表"
enableChartsForFederatedInstances: "生成遠端伺服器的圖表"
enableStatsForFederatedInstances: "取得遠端伺服器資訊"
showClipButtonInNoteFooter: "新增摘錄按鈕至貼文"
reactionsDisplaySize: "反應的顯示尺寸"
limitWidthOfReaction: "限制反應的最大寬度,並縮小顯示尺寸。"
@ -1185,8 +1196,8 @@ showRenotes: "顯示其他人的轉發貼文"
edited: "已編輯"
notificationRecieveConfig: "接受通知的設定"
mutualFollow: "互相追隨"
followingOrFollower: "追隨中或追隨者"
fileAttachedOnly: "顯示包含附件的貼文"
followingOrFollower: "追隨中或追隨者"
fileAttachedOnly: "顯示包含附件的貼文"
showRepliesToOthersInTimeline: "顯示給其他人的回覆"
hideRepliesToOthersInTimeline: "在時間軸上隱藏給其他人的回覆"
showRepliesToOthersInTimelineAll: "在時間軸包含追隨中所有人的回覆"
@ -1256,13 +1267,39 @@ useNativeUIForVideoAudioPlayer: "使用瀏覽器的 UI 播放影片與音訊"
keepOriginalFilename: "保留原始檔名"
keepOriginalFilenameDescription: "如果關閉此設置,上傳時檔案名稱會自動替換為隨機字串。"
noDescription: "沒有說明文字"
alwaysConfirmFollow: "點擊追隨時總是顯示確認訊息"
alwaysConfirmFollow: "跟隨時總是確認"
inquiry: "聯絡我們"
tryAgain: "請再試一次。"
confirmWhenRevealingSensitiveMedia: "要顯示敏感媒體時需確認"
sensitiveMediaRevealConfirm: "這是敏感媒體。確定要顯示嗎?"
createdLists: "已建立的清單"
createdAntennas: "已建立的天線"
fromX: "自 {x}"
genEmbedCode: "產生嵌入程式碼"
noteOfThisUser: "這個使用者的貼文列表"
clipNoteLimitExceeded: "沒辦法在這個摘錄中增加更多貼文了。"
performance: "性能"
modified: "已變更"
discard: "取消"
thereAreNChanges: "有 {n} 處的變更"
signinWithPasskey: "使用密碼金鑰登入"
unknownWebAuthnKey: "未註冊的金鑰。"
passkeyVerificationFailed: "驗證金鑰失敗。"
passkeyVerificationSucceededButPasswordlessLoginDisabled: "雖然驗證金鑰成功,但是無密碼登入的方式是停用的。"
messageToFollower: "給追隨者的訊息"
target: "目標 "
testCaptchaWarning: "此功能用於 CAPTCHA 的測試。<strong>請勿在正式環境中使用。</strong>"
prohibitedWordsForNameOfUser: "禁止使用的字詞(使用者名稱)"
prohibitedWordsForNameOfUserDescription: "如果使用者名稱包含此清單中的任何字串,則拒絕重新命名使用者。 具有審查員權限的使用者不受此限制的影響。"
yourNameContainsProhibitedWords: "您嘗試更改的名稱包含禁止的字串"
yourNameContainsProhibitedWordsDescription: "名稱中包含禁止使用的字串。 如果您想使用此名稱,請聯絡您的伺服器管理員。"
_abuseUserReport:
forward: "轉發"
forwardDescription: "以匿名系統帳戶將檢舉轉發至遠端伺服器。"
resolve: "解決"
accept: "接受"
reject: "拒絕"
resolveTutorial: "如果您已回覆正當的檢舉,請選擇「接受」以將案件標記為已解決。\n 如果檢舉的內容不正當,請選擇「拒絕」將案件標記為已解決。"
_delivery:
status: "傳送狀態"
stop: "停止發送"
@ -1334,10 +1371,10 @@ _initialTutorial:
_reaction:
title: "什麼是反應?"
description: "您可以在貼文中添加「反應」。您可以使用反應輕鬆隨意地表達「最愛/大心」所無法傳達的細微差別。"
letsTryReacting: "可以透過點擊貼文上的「{reaction}」按鈕來添加反應。請嘗試在此範例貼文添加反應!"
letsTryReacting: "可以透過點擊貼文上的「+」按鈕來添加反應。請嘗試在此範例貼文添加反應!"
reactToContinue: "添加反應以繼續教學課程。"
reactNotification: "當有人對您的貼文做出反應時會即時接收到通知。"
reactDone: "按下「{undo}」按鈕可以取消反應。"
reactDone: "按下「-」按鈕可以取消反應。"
_timeline:
title: "時間軸如何運作"
description1: "Misskey根據使用方式提供了多個時間軸伺服器可能會將部份時間軸停用。"
@ -1397,8 +1434,10 @@ _serverSettings:
fanoutTimelineDescription: "如果啟用的話檢索各個時間軸的性能會顯著提昇資料庫的負荷也會減少。不過Redis 的記憶體使用量會增加。如果伺服器的記憶體容量比較少或者運行不穩定,可以停用。"
fanoutTimelineDbFallback: "資料庫的回退"
fanoutTimelineDbFallbackDescription: "若啟用,在時間軸沒有快取的情況下將執行回退處理以額外查詢資料庫。若停用,可以透過不執行回退處理來進一步減少伺服器的負荷,但會限制可取得的時間軸範圍。"
reactionsBufferingDescription: "啟用時,可以顯著提高建立反應時的效能並減少資料庫的負載。 但是Redis 記憶體使用量會增加。"
inquiryUrl: "聯絡表單網址"
inquiryUrlDescription: "指定伺服器運營者的聯絡表單網址,或包含運營者聯絡資訊網頁的網址。"
thisSettingWillAutomaticallyOffWhenModeratorsInactive: "為了防止 spam如果一段期間內沒有偵測到審查員的活動此設定將自動關閉。"
_accountMigration:
moveFrom: "從其他帳戶遷移到這個帳戶"
moveFromSub: "為另一個帳戶建立別名"
@ -1412,7 +1451,7 @@ _accountMigration:
startMigration: "遷移"
migrationConfirm: "確定要將這個帳戶遷移至 {account} 嗎?一旦遷移就無法撤銷,也就無法以原來的狀態使用這個帳戶。\n另外請確認在要遷移到的帳戶已經建立了一個別名。"
movedAndCannotBeUndone: "帳戶已遷移。\n遷移無法撤消。"
postMigrationNote: "在完成遷移的 24 小時後解除此帳戶的追隨。此帳戶的追隨中、追隨者數量變為 0。由於不會解除追隨者你的追隨者仍然可以繼續檢視這個帳戶發布給追隨者的貼文。"
postMigrationNote: "取消追蹤此帳戶將在遷移操作後 24 小時執行。\n 此帳戶有 0 個關注者/關注者。 您的關注者仍然可以看到此帳戶的關注者帖子,因為您不會被取消關注。"
movedTo: "要遷移到的帳戶:"
_achievements:
earnedAt: "獲得日期"
@ -1532,7 +1571,7 @@ _achievements:
_markedAsCat:
title: "我是貓"
description: "已將帳戶設定為貓"
flavor: "沒有名字。"
flavor: "沒有名字。"
_following1:
title: "首次追隨"
description: "首次追隨了"
@ -1546,7 +1585,7 @@ _achievements:
title: "一百位朋友"
description: "追隨超過100人了"
_following300:
title: "朋友多"
title: "朋友多"
description: "追隨超過300人了"
_followers1:
title: "第一個追隨者"
@ -1730,6 +1769,11 @@ _role:
canSearchNotes: "可否搜尋貼文"
canUseTranslator: "使用翻譯功能"
avatarDecorationLimit: "頭像裝飾的最大設置量"
canImportAntennas: "允許匯入天線"
canImportBlocking: "允許匯入封鎖名單"
canImportFollowing: "允許匯入跟隨名單"
canImportMuting: "允許匯入靜音名單"
canImportUserLists: "允許匯入清單"
_condition:
roleAssignedTo: "手動指派角色完成"
isLocal: "本地使用者"
@ -1867,7 +1911,7 @@ _channel:
following: "追隨中"
usersCount: "有 {n} 人參與"
notesCount: "有 {n} 篇貼文"
nameAndDescription: "名稱與說明"
nameAndDescription: "名稱"
nameOnly: "僅名稱"
allowRenoteToExternal: "允許在頻道外轉發和引用"
_menuDisplay:
@ -1947,7 +1991,6 @@ _theme:
buttonBg: "按鈕背景"
buttonHoverBg: "按鈕背景 (漂浮)"
inputBorder: "輸入框邊框"
listItemHoverBg: "列表物品背景 (漂浮)"
driveFolderBg: "雲端硬碟文件夾背景"
wallpaperOverlay: "壁紙覆蓋層"
badge: "徽章"
@ -2224,6 +2267,9 @@ _profile:
changeBanner: "變更橫幅圖像"
verifiedLinkDescription: "如果輸入包含您個人資料的網站 URL欄位旁邊將出現驗證圖示。"
avatarDecorationMax: "最多可以設置 {max} 個裝飾。"
followedMessage: "被追隨時的訊息"
followedMessageDescription: "可以設定被追隨時顯示給對方的訊息。"
followedMessageDescriptionForLockedAccount: "如果追隨是需要審核的話,在允許追隨請求之後顯示。"
_exportOrImport:
allNotes: "所有貼文"
favoritedNotes: "「我的最愛」貼文"
@ -2362,6 +2408,8 @@ _notification:
renotedBySomeUsers: "{n}人做了轉發"
followedBySomeUsers: "被{n}人追隨了"
flushNotification: "重置通知歷史紀錄"
exportOfXCompleted: "{x} 的匯出已完成。"
login: "已登入"
_types:
all: "全部 "
note: "使用者的最新貼文"
@ -2376,6 +2424,9 @@ _notification:
followRequestAccepted: "追隨請求已接受"
roleAssigned: "已授予角色"
achievementEarned: "獲得成就"
exportCompleted: "已完成匯出。"
login: "登入"
test: "通知測試"
app: "應用程式通知"
_actions:
followBack: "追隨回去"
@ -2441,7 +2492,10 @@ _webhookSettings:
abuseReport: "當使用者檢舉時"
abuseReportResolved: "當處理了使用者的檢舉時"
userCreated: "使用者被新增時"
inactiveModeratorsWarning: "當審查員在一段時間內沒有活動時"
inactiveModeratorsInvitationOnlyChanged: "當審查員在一段時間內不活動時,系統會將模式變更為邀請制"
deleteConfirm: "請問是否要刪除 Webhook"
testRemarks: "按下切換開關右側的按鈕,就會將假資料發送至 Webhook。"
_abuseReport:
_notificationRecipient:
createRecipient: "新增接收檢舉的通知對象"
@ -2454,7 +2508,7 @@ _abuseReport:
mail: "寄送到擁有監察員權限的使用者電子郵件地址(僅在收到檢舉時)"
webhook: "向指定的 SystemWebhook 發送通知(在收到檢舉和解決檢舉時發送)"
keywords: "關鍵字"
notifiedUser: "通知的使用者"
notifiedUser: "通知的使用者"
notifiedWebhook: "使用的 Webhook"
deleteConfirm: "確定要刪除通知對象嗎?"
_moderationLogTypes:
@ -2485,6 +2539,8 @@ _moderationLogTypes:
markSensitiveDriveFile: "標記為敏感檔案"
unmarkSensitiveDriveFile: "撤銷標記為敏感檔案"
resolveAbuseReport: "解決檢舉"
forwardAbuseReport: "轉發檢舉"
updateAbuseReportNote: "更新檢舉的審查備註"
createInvitation: "建立邀請碼"
createAd: "建立廣告"
deleteAd: "刪除廣告"
@ -2640,3 +2696,17 @@ _contextMenu:
app: "應用程式"
appWithShift: "Shift 鍵應用程式"
native: "瀏覽器的使用者介面"
_embedCodeGen:
title: "自訂嵌入程式碼"
header: "檢視標頭 "
autoload: "自動繼續載入(不建議)"
maxHeight: "最大高度"
maxHeightDescription: "設定為 0 時代表沒有最大值。請指定某個值以避免小工具持續在縱向延伸。"
maxHeightWarn: "最大高度限制已停用0。如果這個變更不是您想要的請將最大高度設定為某個值。"
previewIsNotActual: "由於超出了預覽畫面可顯示的範圍,因此顯示內容會與實際嵌入時有所不同。"
rounded: "圓角"
border: "給外框加上邊框"
applyToPreview: "反映在預覽中"
generateCode: "建立嵌入程式碼"
codeGenerated: "已產生程式碼"
codeGeneratedDescription: "請將產生的程式碼貼到您的網站上。"

View file

@ -1,6 +1,6 @@
{
"name": "sharkey",
"version": "2024.9.0-dev",
"version": "2024.10.0-dev",
"codename": "shonk",
"repository": {
"type": "git",
@ -8,7 +8,9 @@
},
"packageManager": "pnpm@9.6.0",
"workspaces": [
"packages/frontend-shared",
"packages/frontend",
"packages/frontend-embed",
"packages/backend",
"packages/sw",
"packages/misskey-js",
@ -32,9 +34,13 @@
"watch": "pnpm dev",
"dev": "node scripts/dev.mjs",
"lint": "pnpm -r lint",
"lint-all": "pnpm -r --no-bail lint",
"eslint": "pnpm -r eslint",
"eslint-all": "pnpm -r --no-bail eslint",
"cy:open": "pnpm cypress open --browser --e2e --config-file=cypress.config.ts",
"cy:run": "pnpm cypress run",
"e2e": "pnpm start-server-and-test start:test http://localhost:61812 cy:run",
"e2e-dev-container": "cp ./.config/cypress-devcontainer.yml ./.config/test.yml && pnpm start-server-and-test start:test http://localhost:61812 cy:run",
"jest": "cd packages/backend && pnpm jest",
"jest-and-coverage": "cd packages/backend && pnpm jest-and-coverage",
"test": "pnpm -r test",
@ -53,11 +59,11 @@
"fast-glob": "3.3.2",
"ignore-walk": "6.0.5",
"js-yaml": "4.1.0",
"postcss": "8.4.40",
"postcss": "8.4.47",
"tar": "6.2.1",
"terser": "5.31.3",
"typescript": "5.5.4",
"esbuild": "0.23.0",
"terser": "5.33.0",
"typescript": "5.6.2",
"esbuild": "0.23.1",
"glob": "11.0.0"
},
"devDependencies": {
@ -66,10 +72,10 @@
"@typescript-eslint/eslint-plugin": "7.17.0",
"@typescript-eslint/parser": "7.17.0",
"cross-env": "7.0.3",
"cypress": "13.13.1",
"cypress": "13.14.2",
"eslint": "9.8.0",
"globals": "15.8.0",
"globals": "15.9.0",
"ncp": "2.0.0",
"start-server-and-test": "2.0.4"
"start-server-and-test": "2.0.8"
}
}

View file

@ -0,0 +1,31 @@
/*
* SPDX-FileCopyrightText: syuilo and misskey-project
* SPDX-License-Identifier: MIT
*/
//@ts-check
(() => {
/** @type {NodeListOf<HTMLIFrameElement>} */
const els = document.querySelectorAll('iframe[data-misskey-embed-id]');
window.addEventListener('message', function (event) {
els.forEach((el) => {
if (event.source !== el.contentWindow) {
return;
}
const id = el.dataset.misskeyEmbedId;
if (event.data.type === 'misskey:embed:ready') {
el.contentWindow?.postMessage({
type: 'misskey:embedParent:registerIframeId',
payload: {
iframeId: id,
}
}, '*');
}
if (event.data.type === 'misskey:embed:changeHeight' && event.data.iframeId === id) {
el.style.height = event.data.payload.height + 'px';
}
});
});
})();

View file

@ -1,5 +1,6 @@
import tsParser from '@typescript-eslint/parser';
import sharedConfig from '../shared/eslint.config.js';
import globals from 'globals';
export default [
...sharedConfig,
@ -43,4 +44,25 @@ export default [
}],
},
},
{
files: ['src/server/web/**/*.js', 'src/server/web/**/*.ts'],
languageOptions: {
globals: {
...globals.browser,
LANGS: true,
CLIENT_ENTRY: true,
LANGS_VERSION: true,
},
},
},
{
ignores: [
"**/lib/",
"**/temp/",
"**/built/",
"**/coverage/",
"**/node_modules/",
"**/migration/",
]
},
];

View file

@ -0,0 +1,16 @@
/*
* SPDX-FileCopyrightText: syuilo and misskey-project
* SPDX-License-Identifier: AGPL-3.0-only
*/
export class ExternalWebsiteWarn1711008460816 {
name = 'ExternalWebsiteWarn1711008460816'
async up(queryRunner) {
await queryRunner.query(`ALTER TABLE "meta" ADD "trustedLinkUrlPatterns" character varying(3072) array NOT NULL DEFAULT '{}'`);
}
async down(queryRunner) {
await queryRunner.query(`ALTER TABLE "meta" DROP COLUMN "trustedLinkUrlPatterns"`);
}
}

View file

@ -0,0 +1,16 @@
/*
* SPDX-FileCopyrightText: syuilo and misskey-project
* SPDX-License-Identifier: AGPL-3.0-only
*/
export class FollowedMessage1723944246767 {
name = 'FollowedMessage1723944246767';
async up(queryRunner) {
await queryRunner.query('ALTER TABLE "user_profile" ADD "followedMessage" character varying(256)');
}
async down(queryRunner) {
await queryRunner.query('ALTER TABLE "user_profile" DROP COLUMN "followedMessage"');
}
}

View file

@ -0,0 +1,16 @@
/*
* SPDX-FileCopyrightText: syuilo and misskey-project
* SPDX-License-Identifier: AGPL-3.0-only
*/
export class ReactionsBuffering1726804538569 {
name = 'ReactionsBuffering1726804538569'
async up(queryRunner) {
await queryRunner.query(`ALTER TABLE "meta" ADD "enableReactionsBuffering" boolean NOT NULL DEFAULT false`);
}
async down(queryRunner) {
await queryRunner.query(`ALTER TABLE "meta" DROP COLUMN "enableReactionsBuffering"`);
}
}

View file

@ -0,0 +1,16 @@
/*
* SPDX-FileCopyrightText: piuvas and other Sharkey contributors
* SPDX-License-Identifier: AGPL-3.0-only
*/
export class SidebarLogo1727027985575 {
name = 'SidebarLogo1727027985575';
async up(queryRunner) {
await queryRunner.query(`ALTER TABLE "meta" ADD "sidebarLogoUrl" character varying(1024)`);
}
async down(queryRunner) {
await queryRunner.query(`ALTER TABLE "meta" DROP COLUMN "sidebarLogoUrl"`);
}
}

View file

@ -0,0 +1,16 @@
/*
* SPDX-FileCopyrightText: syuilo and misskey-project
* SPDX-License-Identifier: AGPL-3.0-only
*/
export class UserScore1727491883993 {
name = 'UserScore1727491883993'
async up(queryRunner) {
await queryRunner.query(`ALTER TABLE "user" ADD "score" integer NOT NULL DEFAULT '0'`);
}
async down(queryRunner) {
await queryRunner.query(`ALTER TABLE "user" DROP COLUMN "score"`);
}
}

View file

@ -0,0 +1,18 @@
/*
* SPDX-FileCopyrightText: syuilo and misskey-project
* SPDX-License-Identifier: AGPL-3.0-only
*/
export class MetaFederation1727512908322 {
name = 'MetaFederation1727512908322'
async up(queryRunner) {
await queryRunner.query(`ALTER TABLE "meta" ADD "federation" character varying(128) NOT NULL DEFAULT 'all'`);
await queryRunner.query(`ALTER TABLE "meta" ADD "federationHosts" character varying(1024) array NOT NULL DEFAULT '{}'`);
}
async down(queryRunner) {
await queryRunner.query(`ALTER TABLE "meta" DROP COLUMN "federationHosts"`);
await queryRunner.query(`ALTER TABLE "meta" DROP COLUMN "federation"`);
}
}

View file

@ -0,0 +1,20 @@
/*
* SPDX-FileCopyrightText: hazelnoot and other Sharkey contributors
* SPDX-License-Identifier: AGPL-3.0-only
*/
export class AddLatestNote1727659258948 {
name = 'AddLatestNote1727659258948';
async up(queryRunner) {
await queryRunner.query('CREATE TABLE "latest_note" ("user_id" character varying(32) NOT NULL, "note_id" character varying(32) NOT NULL, CONSTRAINT "PK_f619b62bfaafabe68f52fb50c9a" PRIMARY KEY ("user_id"))');
await queryRunner.query('ALTER TABLE "latest_note" ADD CONSTRAINT "FK_20e346fffe4a2174585005d6d80" FOREIGN KEY ("user_id") REFERENCES "user"("id") ON DELETE CASCADE ON UPDATE NO ACTION');
await queryRunner.query('ALTER TABLE "latest_note" ADD CONSTRAINT "FK_47a38b1c13de6ce4e5090fb1acd" FOREIGN KEY ("note_id") REFERENCES "note"("id") ON DELETE CASCADE ON UPDATE NO ACTION');
}
async down(queryRunner) {
await queryRunner.query('ALTER TABLE "latest_note" DROP CONSTRAINT "FK_47a38b1c13de6ce4e5090fb1acd"');
await queryRunner.query('ALTER TABLE "latest_note" DROP CONSTRAINT "FK_20e346fffe4a2174585005d6d80"');
await queryRunner.query('DROP TABLE "latest_note"');
}
}

View file

@ -0,0 +1,18 @@
/*
* SPDX-FileCopyrightText: hazelnoot and other Sharkey contributors
* SPDX-License-Identifier: AGPL-3.0-only
*/
export class IncreaseCharacterLimits1727998351561 {
name = 'IncreaseCharacterLimits1727998351561'
async up(queryRunner) {
await queryRunner.query(`ALTER TABLE "drive_file" ALTER COLUMN "comment" TYPE varchar(100000)`);
await queryRunner.query(`ALTER TABLE "note" ALTER COLUMN "cw" TYPE text`);
}
async down(queryRunner) {
await queryRunner.query(`ALTER TABLE "note" ALTER COLUMN "cw" TYPE varchar(512)`);
await queryRunner.query(`ALTER TABLE "drive_file" ALTER COLUMN "comment" TYPE varchar(8192)`);
}
}

View file

@ -0,0 +1,16 @@
/*
* SPDX-FileCopyrightText: hazelnoot and other Sharkey contributors
* SPDX-License-Identifier: AGPL-3.0-only
*/
export class AddRejectReports1728177700920 {
name = 'AddRejectReports1728177700920'
async up(queryRunner) {
await queryRunner.query(`ALTER TABLE "instance" ADD "rejectReports" boolean NOT NULL DEFAULT false`);
}
async down(queryRunner) {
await queryRunner.query(`ALTER TABLE "instance" DROP COLUMN "rejectReports"`);
}
}

View file

@ -0,0 +1,16 @@
/*
* SPDX-FileCopyrightText: hazelnoot and other Sharkey contributors
* SPDX-License-Identifier: AGPL-3.0-only
*/
export class SoftLimitDriveComment1728348353115 {
name = 'SoftLimitDriveComment1728348353115'
async up(queryRunner) {
await queryRunner.query(`ALTER TABLE "drive_file" ALTER COLUMN "comment" TYPE text`);
}
async down(queryRunner) {
await queryRunner.query(`ALTER TABLE "drive_file" ALTER COLUMN "comment" TYPE varchar(100000)`);
}
}

View file

@ -0,0 +1,24 @@
/*
* SPDX-FileCopyrightText: hazelnoot and other Sharkey contributors
* SPDX-License-Identifier: AGPL-3.0-only
*/
export class TrackLatestNoteType1728420772835 {
name = 'TrackLatestNoteType1728420772835'
async up(queryRunner) {
await queryRunner.query(`ALTER TABLE "latest_note" DROP CONSTRAINT "PK_f619b62bfaafabe68f52fb50c9a"`);
await queryRunner.query(`ALTER TABLE "latest_note" ADD "is_public" boolean NOT NULL DEFAULT false`);
await queryRunner.query(`ALTER TABLE "latest_note" ADD "is_reply" boolean NOT NULL DEFAULT false`);
await queryRunner.query(`ALTER TABLE "latest_note" ADD "is_quote" boolean NOT NULL DEFAULT false`);
await queryRunner.query(`ALTER TABLE "latest_note" ADD CONSTRAINT "PK_a44ac8ca9cb916faeefc0912abd" PRIMARY KEY ("user_id", is_public, is_reply, is_quote)`);
}
async down(queryRunner) {
await queryRunner.query(`ALTER TABLE "latest_note" DROP CONSTRAINT "PK_a44ac8ca9cb916faeefc0912abd"`);
await queryRunner.query(`ALTER TABLE "latest_note" DROP COLUMN is_quote`);
await queryRunner.query(`ALTER TABLE "latest_note" DROP COLUMN is_reply`);
await queryRunner.query(`ALTER TABLE "latest_note" DROP COLUMN is_public`);
await queryRunner.query(`ALTER TABLE "latest_note" ADD CONSTRAINT "PK_f619b62bfaafabe68f52fb50c9a" PRIMARY KEY ("user_id")`);
}
}

View file

@ -0,0 +1,16 @@
/*
* SPDX-FileCopyrightText: marie and sharkey-project
* SPDX-License-Identifier: AGPL-3.0-only
*/
export class DefaultSensitive1729414690009 {
name = 'DefaultSensitive1729414690009'
async up(queryRunner) {
await queryRunner.query(`ALTER TABLE "user_profile" ADD "defaultSensitive" boolean NOT NULL DEFAULT false`);
}
async down(queryRunner) {
await queryRunner.query(`ALTER TABLE "user_profile" DROP COLUMN "defaultSensitive"`);
}
}

View file

@ -0,0 +1,20 @@
/*
* SPDX-FileCopyrightText: marie and other Sharkey contributors
* SPDX-License-Identifier: AGPL-3.0-only
*/
export class friendlyCaptcha1730505338000 {
name = 'friendlyCaptcha1730505338000';
async up(queryRunner) {
await queryRunner.query(`ALTER TABLE "meta" ADD "enableFC" boolean NOT NULL DEFAULT false`, undefined);
await queryRunner.query(`ALTER TABLE "meta" ADD "fcSiteKey" character varying(1024)`, undefined);
await queryRunner.query(`ALTER TABLE "meta" ADD "fcSecretKey" character varying(1024)`, undefined);
}
async down(queryRunner) {
await queryRunner.query(`ALTER TABLE "meta" DROP COLUMN "fcSecretKey"`, undefined);
await queryRunner.query(`ALTER TABLE "meta" DROP COLUMN "fcSiteKey"`, undefined);
await queryRunner.query(`ALTER TABLE "meta" DROP COLUMN "enableFC"`, undefined);
}
}

View file

@ -20,7 +20,7 @@
"restart": "pnpm build && pnpm start",
"dev": "node ./scripts/dev.mjs",
"typecheck": "pnpm --filter megalodon build && tsc --noEmit && tsc -p test --noEmit",
"eslint": "eslint --quiet \"src/**/*.ts\" --cache",
"eslint": "eslint --quiet \"{src,test,js,@types}/**/*.{js,jsx,ts,tsx,vue}\" --cache",
"lint": "pnpm typecheck && pnpm eslint",
"jest": "cross-env NODE_ENV=test node --experimental-vm-modules --experimental-import-meta-resolve node_modules/jest/bin/jest.js --forceExit --config jest.config.unit.cjs",
"jest:e2e": "cross-env NODE_ENV=test node --experimental-vm-modules --experimental-import-meta-resolve node_modules/jest/bin/jest.js --forceExit --config jest.config.e2e.cjs",
@ -65,24 +65,24 @@
"dependencies": {
"@aws-sdk/client-s3": "3.620.0",
"@aws-sdk/lib-storage": "3.620.0",
"@bull-board/api": "5.21.1",
"@bull-board/fastify": "5.21.1",
"@bull-board/ui": "5.21.1",
"@discordapp/twemoji": "15.0.3",
"@fastify/accepts": "4.3.0",
"@fastify/cookie": "9.3.1",
"@fastify/cors": "9.0.1",
"@fastify/express": "3.0.0",
"@fastify/http-proxy": "9.5.0",
"@fastify/multipart": "8.3.0",
"@fastify/static": "7.0.4",
"@fastify/view": "9.1.0",
"@bull-board/api": "6.0.0",
"@bull-board/fastify": "6.0.0",
"@bull-board/ui": "6.0.0",
"@discordapp/twemoji": "15.1.0",
"@fastify/accepts": "5.0.0",
"@fastify/cookie": "10.0.0",
"@fastify/cors": "10.0.0",
"@fastify/express": "4.0.0",
"@fastify/http-proxy": "10.0.0",
"@fastify/multipart": "9.0.0",
"@fastify/static": "8.0.0",
"@fastify/view": "10.0.0",
"@misskey-dev/sharp-read-bmp": "1.2.0",
"@misskey-dev/summaly": "5.1.0",
"@napi-rs/canvas": "^0.1.53",
"@nestjs/common": "10.3.10",
"@nestjs/core": "10.3.10",
"@nestjs/testing": "10.3.10",
"@napi-rs/canvas": "0.1.56",
"@nestjs/common": "10.4.3",
"@nestjs/core": "10.4.3",
"@nestjs/testing": "10.4.3",
"@peertube/http-signature": "1.7.0",
"@sentry/node": "8.20.0",
"@sentry/profiling-node": "8.20.0",
@ -100,8 +100,8 @@
"async-mutex": "0.5.0",
"bcryptjs": "2.4.3",
"blurhash": "2.0.5",
"body-parser": "1.20.2",
"bullmq": "5.10.4",
"body-parser": "1.20.3",
"bullmq": "5.13.2",
"cacheable-lookup": "7.0.0",
"cbor": "9.0.2",
"chalk": "5.3.0",
@ -112,12 +112,12 @@
"content-disposition": "0.5.4",
"date-fns": "2.30.0",
"deep-email-validator": "0.1.21",
"fast-xml-parser": "^4.4.0",
"fastify": "4.28.1",
"fast-xml-parser": "4.4.1",
"fastify": "5.0.0",
"fastify-multer": "^2.0.3",
"fastify-raw-body": "4.3.0",
"fastify-raw-body": "5.0.0",
"feed": "4.2.2",
"file-type": "19.3.0",
"file-type": "19.5.0",
"fluent-ffmpeg": "2.1.3",
"form-data": "4.0.0",
"glob": "11.0.0",
@ -127,16 +127,17 @@
"htmlescape": "1.1.1",
"http-link-header": "1.1.3",
"ioredis": "5.4.1",
"ip-cidr": "4.0.1",
"ip-cidr": "4.0.2",
"ipaddr.js": "2.2.0",
"is-svg": "5.0.1",
"is-svg": "5.1.0",
"js-yaml": "4.1.0",
"jsdom": "24.1.1",
"json5": "2.2.3",
"jsonld": "8.3.2",
"jsrsasign": "11.1.0",
"megalodon": "workspace:*",
"meilisearch": "0.41.0",
"meilisearch": "0.42.0",
"juice": "11.0.0",
"microformats-parser": "2.0.2",
"mime-types": "2.1.35",
"misskey-js": "workspace:*",
@ -145,24 +146,24 @@
"nanoid": "5.0.7",
"nested-property": "4.0.0",
"node-fetch": "3.3.2",
"nodemailer": "6.9.14",
"nodemailer": "6.9.15",
"oauth": "0.10.0",
"oauth2orize": "1.12.0",
"oauth2orize-pkce": "0.1.2",
"os-utils": "0.0.14",
"otpauth": "9.3.1",
"otpauth": "9.3.2",
"parse5": "7.1.2",
"pg": "8.12.0",
"pg": "8.13.0",
"pkce-challenge": "4.1.0",
"probe-image-size": "7.2.3",
"promise-limit": "2.7.0",
"proxy-addr": "^2.0.7",
"pug": "3.0.3",
"punycode": "2.3.1",
"qrcode": "1.5.3",
"qrcode": "1.5.4",
"random-seed": "0.3.0",
"ratelimiter": "3.4.1",
"re2": "1.21.3",
"re2": "1.21.4",
"redis-lock": "0.1.4",
"reflect-metadata": "0.2.2",
"rename": "1.0.4",
@ -170,17 +171,17 @@
"rxjs": "7.8.1",
"sanitize-html": "2.13.0",
"secure-json-parse": "2.7.0",
"sharp": "0.33.4",
"sharp": "0.33.5",
"slacc": "0.0.10",
"strict-event-emitter-types": "2.0.0",
"stringz": "2.1.0",
"systeminformation": "5.22.11",
"systeminformation": "5.23.5",
"tinycolor2": "1.6.0",
"tmp": "0.2.3",
"tsc-alias": "1.8.10",
"tsconfig-paths": "4.2.0",
"typeorm": "0.3.20",
"typescript": "5.5.4",
"typescript": "5.6.2",
"ulid": "2.3.0",
"uuid": "^9.0.1",
"vary": "1.1.2",
@ -190,7 +191,7 @@
},
"devDependencies": {
"@jest/globals": "29.7.0",
"@nestjs/platform-express": "10.3.10",
"@nestjs/platform-express": "10.4.3",
"@simplewebauthn/types": "10.0.0",
"@swc/jest": "0.2.36",
"@types/accepts": "1.3.7",
@ -199,10 +200,10 @@
"@types/body-parser": "1.19.5",
"@types/color-convert": "2.0.3",
"@types/content-disposition": "0.5.8",
"@types/fluent-ffmpeg": "2.1.24",
"@types/fluent-ffmpeg": "2.1.26",
"@types/htmlescape": "1.1.3",
"@types/http-link-header": "1.0.7",
"@types/jest": "29.5.12",
"@types/jest": "29.5.13",
"@types/js-yaml": "4.0.9",
"@types/jsdom": "21.1.7",
"@types/jsonld": "1.5.15",
@ -210,11 +211,11 @@
"@types/mime-types": "2.1.4",
"@types/ms": "0.7.34",
"@types/node": "20.14.12",
"@types/nodemailer": "6.4.15",
"@types/nodemailer": "6.4.16",
"@types/oauth": "0.9.5",
"@types/oauth2orize": "1.11.5",
"@types/oauth2orize-pkce": "0.1.2",
"@types/pg": "8.11.6",
"@types/pg": "8.11.10",
"@types/proxy-addr": "^2.0.3",
"@types/pug": "2.0.10",
"@types/punycode": "2.1.4",
@ -222,7 +223,7 @@
"@types/random-seed": "0.3.5",
"@types/ratelimiter": "3.4.6",
"@types/rename": "1.0.7",
"@types/sanitize-html": "2.11.0",
"@types/sanitize-html": "2.13.0",
"@types/semver": "7.5.8",
"@types/simple-oauth2": "5.0.7",
"@types/sinonjs__fake-timers": "8.1.5",
@ -231,17 +232,17 @@
"@types/uuid": "^9.0.4",
"@types/vary": "1.1.3",
"@types/web-push": "3.6.3",
"@types/ws": "8.5.11",
"@types/ws": "8.5.12",
"@typescript-eslint/eslint-plugin": "7.17.0",
"@typescript-eslint/parser": "7.17.0",
"aws-sdk-client-mock": "4.0.1",
"cross-env": "7.0.3",
"eslint-plugin-import": "2.29.1",
"execa": "9.3.0",
"eslint-plugin-import": "2.30.0",
"execa": "9.4.0",
"fkill": "9.0.0",
"jest": "29.7.0",
"jest-mock": "29.7.0",
"nodemon": "3.1.4",
"nodemon": "3.1.7",
"pid-port": "1.0.0",
"simple-oauth2": "5.1.0"
}

View file

@ -12,26 +12,49 @@ const config = loadConfig();
// createPostgresDataSource handels primaries and replicas automatically.
// usually, it only opens connections first use, so we force it using
// .initialize()
createPostgresDataSource(config)
.initialize()
.then(c => { c.destroy() })
.catch(e => { throw e });
async function connectToPostgres(){
const source = createPostgresDataSource(config);
await source.initialize();
await source.destroy();
}
// Connect to all redis servers
function connectToRedis(redisOptions) {
const redis = new Redis(redisOptions);
redis.on('connect', () => redis.disconnect());
redis.on('error', (e) => {
throw e;
async function connectToRedis(redisOptions) {
return await new Promise(async (resolve, reject) => {
const redis = new Redis({
...redisOptions,
lazyConnect: true,
reconnectOnError: false,
showFriendlyErrorStack: true,
});
redis.on('error', e => reject(e));
try {
await redis.connect();
resolve();
} catch (e) {
reject(e);
} finally {
redis.disconnect(false);
}
});
}
// If not all of these are defined, the default one gets reused.
// so we use a Set to only try connecting once to each **uniq** redis.
(new Set([
config.redis,
config.redisForPubsub,
config.redisForJobQueue,
config.redisForTimelines,
])).forEach(connectToRedis);
const promises = Array
.from(new Set([
config.redis,
config.redisForPubsub,
config.redisForJobQueue,
config.redisForTimelines,
config.redisForReactions,
]))
.map(connectToRedis)
.concat([
connectToPostgres()
]);
await Promise.allSettled(promises);

View file

@ -13,6 +13,8 @@ import { createPostgresDataSource } from './postgres.js';
import { RepositoryModule } from './models/RepositoryModule.js';
import { allSettled } from './misc/promise-tracker.js';
import type { Provider, OnApplicationShutdown } from '@nestjs/common';
import { MiMeta } from '@/models/Meta.js';
import { GlobalEvents } from './core/GlobalEventService.js';
const $config: Provider = {
provide: DI.config,
@ -78,11 +80,76 @@ const $redisForTimelines: Provider = {
inject: [DI.config],
};
const $redisForReactions: Provider = {
provide: DI.redisForReactions,
useFactory: (config: Config) => {
return new Redis.Redis(config.redisForReactions);
},
inject: [DI.config],
};
const $meta: Provider = {
provide: DI.meta,
useFactory: async (db: DataSource, redisForSub: Redis.Redis) => {
const meta = await db.transaction(async transactionalEntityManager => {
// 過去のバグでレコードが複数出来てしまっている可能性があるので新しいIDを優先する
const metas = await transactionalEntityManager.find(MiMeta, {
order: {
id: 'DESC',
},
});
const meta = metas[0];
if (meta) {
return meta;
} else {
// metaが空のときfetchMetaが同時に呼ばれるとここが同時に呼ばれてしまうことがあるのでフェイルセーフなupsertを使う
const saved = await transactionalEntityManager
.upsert(
MiMeta,
{
id: 'x',
},
['id'],
)
.then((x) => transactionalEntityManager.findOneByOrFail(MiMeta, x.identifiers[0]));
return saved;
}
});
async function onMessage(_: string, data: string): Promise<void> {
const obj = JSON.parse(data);
if (obj.channel === 'internal') {
const { type, body } = obj.message as GlobalEvents['internal']['payload'];
switch (type) {
case 'metaUpdated': {
for (const key in body.after) {
(meta as any)[key] = (body.after as any)[key];
}
meta.proxyAccount = null; // joinなカラムは通常取ってこないので
break;
}
default:
break;
}
}
}
redisForSub.on('message', onMessage);
return meta;
},
inject: [DI.db, DI.redisForSub],
};
@Global()
@Module({
imports: [RepositoryModule],
providers: [$config, $db, $meilisearch, $redis, $redisForPub, $redisForSub, $redisForTimelines],
exports: [$config, $db, $meilisearch, $redis, $redisForPub, $redisForSub, $redisForTimelines, RepositoryModule],
providers: [$config, $db, $meta, $meilisearch, $redis, $redisForPub, $redisForSub, $redisForTimelines, $redisForReactions],
exports: [$config, $db, $meta, $meilisearch, $redis, $redisForPub, $redisForSub, $redisForTimelines, $redisForReactions, RepositoryModule],
})
export class GlobalModule implements OnApplicationShutdown {
constructor(
@ -91,6 +158,7 @@ export class GlobalModule implements OnApplicationShutdown {
@Inject(DI.redisForPub) private redisForPub: Redis.Redis,
@Inject(DI.redisForSub) private redisForSub: Redis.Redis,
@Inject(DI.redisForTimelines) private redisForTimelines: Redis.Redis,
@Inject(DI.redisForReactions) private redisForReactions: Redis.Redis,
) { }
public async dispose(): Promise<void> {
@ -103,6 +171,7 @@ export class GlobalModule implements OnApplicationShutdown {
this.redisForPub.disconnect(),
this.redisForSub.disconnect(),
this.redisForTimelines.disconnect(),
this.redisForReactions.disconnect(),
]);
}

View file

@ -51,6 +51,7 @@ type Source = {
redisForPubsub?: RedisOptionsSource;
redisForJobQueue?: RedisOptionsSource;
redisForTimelines?: RedisOptionsSource;
redisForReactions?: RedisOptionsSource;
meilisearch?: {
host: string;
port: string;
@ -72,6 +73,11 @@ type Source = {
maxFileSize?: number;
maxNoteLength?: number;
maxCwLength?: number;
maxRemoteCwLength?: number;
maxRemoteNoteLength?: number;
maxAltTextLength?: number;
maxRemoteAltTextLength?: number;
clusterLimit?: number;
@ -146,8 +152,13 @@ export type Config = {
proxySmtp: string | undefined;
proxyBypassHosts: string[] | undefined;
allowedPrivateNetworks: string[] | undefined;
maxFileSize: number | undefined;
maxFileSize: number;
maxNoteLength: number;
maxRemoteNoteLength: number;
maxCwLength: number;
maxRemoteCwLength: number;
maxAltTextLength: number;
maxRemoteAltTextLength: number;
clusterLimit: number | undefined;
id: string;
outgoingAddress: string | undefined;
@ -177,8 +188,10 @@ export type Config = {
authUrl: string;
driveUrl: string;
userAgent: string;
clientEntry: string;
clientManifestExists: boolean;
frontendEntry: string;
frontendManifestExists: boolean;
frontendEmbedEntry: string;
frontendEmbedManifestExists: boolean;
mediaProxy: string;
externalMediaProxyEnabled: boolean;
videoThumbnailGenerator: string | null;
@ -186,6 +199,7 @@ export type Config = {
redisForPubsub: RedisOptions & RedisOptionsSource;
redisForJobQueue: RedisOptions & RedisOptionsSource;
redisForTimelines: RedisOptions & RedisOptionsSource;
redisForReactions: RedisOptions & RedisOptionsSource;
sentryForBackend: { options: Partial<Sentry.NodeOptions>; enableNodeProfiling: boolean; } | undefined;
sentryForFrontend: { options: Partial<Sentry.NodeOptions> } | undefined;
perChannelMaxNoteCacheCount: number;
@ -219,10 +233,15 @@ const path = process.env.MISSKEY_CONFIG_YML
export function loadConfig(): Config {
const meta = JSON.parse(fs.readFileSync(`${_dirname}/../../../built/meta.json`, 'utf-8'));
const clientManifestExists = fs.existsSync(`${_dirname}/../../../built/_vite_/manifest.json`);
const clientManifest = clientManifestExists ?
JSON.parse(fs.readFileSync(`${_dirname}/../../../built/_vite_/manifest.json`, 'utf-8'))
const frontendManifestExists = fs.existsSync(_dirname + '/../../../built/_frontend_vite_/manifest.json');
const frontendEmbedManifestExists = fs.existsSync(_dirname + '/../../../built/_frontend_embed_vite_/manifest.json');
const frontendManifest = frontendManifestExists ?
JSON.parse(fs.readFileSync(`${_dirname}/../../../built/_frontend_vite_/manifest.json`, 'utf-8'))
: { 'src/_boot_.ts': { file: 'src/_boot_.ts' } };
const frontendEmbedManifest = frontendEmbedManifestExists ?
JSON.parse(fs.readFileSync(`${_dirname}/../../../built/_frontend_embed_vite_/manifest.json`, 'utf-8'))
: { 'src/boot.ts': { file: 'src/boot.ts' } };
const configFiles = globSync(path).sort();
@ -282,6 +301,7 @@ export function loadConfig(): Config {
redisForPubsub: config.redisForPubsub ? convertRedisOptions(config.redisForPubsub, host) : redis,
redisForJobQueue: config.redisForJobQueue ? convertRedisOptions(config.redisForJobQueue, host) : redis,
redisForTimelines: config.redisForTimelines ? convertRedisOptions(config.redisForTimelines, host) : redis,
redisForReactions: config.redisForReactions ? convertRedisOptions(config.redisForReactions, host) : redis,
sentryForBackend: config.sentryForBackend,
sentryForFrontend: config.sentryForFrontend,
id: config.id,
@ -289,8 +309,13 @@ export function loadConfig(): Config {
proxySmtp: config.proxySmtp,
proxyBypassHosts: config.proxyBypassHosts,
allowedPrivateNetworks: config.allowedPrivateNetworks,
maxFileSize: config.maxFileSize,
maxFileSize: config.maxFileSize ?? 262144000,
maxNoteLength: config.maxNoteLength ?? 3000,
maxRemoteNoteLength: config.maxRemoteNoteLength ?? 100000,
maxCwLength: config.maxCwLength ?? 500,
maxRemoteCwLength: config.maxRemoteCwLength ?? 5000,
maxAltTextLength: config.maxAltTextLength ?? 20000,
maxRemoteAltTextLength: config.maxRemoteAltTextLength ?? 100000,
clusterLimit: config.clusterLimit,
outgoingAddress: config.outgoingAddress,
outgoingAddressFamily: config.outgoingAddressFamily,
@ -313,8 +338,10 @@ export function loadConfig(): Config {
config.videoThumbnailGenerator.endsWith('/') ? config.videoThumbnailGenerator.substring(0, config.videoThumbnailGenerator.length - 1) : config.videoThumbnailGenerator
: null,
userAgent: `Misskey/${version} (${config.url})`,
clientEntry: clientManifest['src/_boot_.ts'],
clientManifestExists: clientManifestExists,
frontendEntry: frontendManifest['src/_boot_.ts'],
frontendManifestExists: frontendManifestExists,
frontendEmbedEntry: frontendEmbedManifest['src/boot.ts'],
frontendEmbedManifestExists: frontendEmbedManifestExists,
perChannelMaxNoteCacheCount: config.perChannelMaxNoteCacheCount ?? 1000,
perUserNotificationsMaxCount: config.perUserNotificationsMaxCount ?? 500,
deactivateAntennaThreshold: config.deactivateAntennaThreshold ?? (1000 * 60 * 60 * 24 * 7),
@ -455,7 +482,7 @@ function applyEnvOverrides(config: Source) {
_apply_top(['db', ['host', 'port', 'db', 'user', 'pass', 'disableCache']]);
_apply_top(['dbSlaves', Array.from((config.dbSlaves ?? []).keys()), ['host', 'port', 'db', 'user', 'pass']]);
_apply_top([
['redis', 'redisForPubsub', 'redisForJobQueue', 'redisForTimelines'],
['redis', 'redisForPubsub', 'redisForJobQueue', 'redisForTimelines', 'redisForReactions'],
['host', 'port', 'username', 'pass', 'db', 'prefix'],
]);
_apply_top(['meilisearch', ['host', 'port', 'apikey', 'ssl', 'index', 'scope']]);
@ -463,7 +490,7 @@ function applyEnvOverrides(config: Source) {
_apply_top(['sentryForBackend', 'enableNodeProfiling']);
_apply_top([['clusterLimit', 'deliverJobConcurrency', 'inboxJobConcurrency', 'relashionshipJobConcurrency', 'deliverJobPerSec', 'inboxJobPerSec', 'relashionshipJobPerSec', 'deliverJobMaxAttempts', 'inboxJobMaxAttempts']]);
_apply_top([['outgoingAddress', 'outgoingAddressFamily', 'proxy', 'proxySmtp', 'mediaProxy', 'proxyRemoteFiles', 'videoThumbnailGenerator']]);
_apply_top([['maxFileSize', 'maxNoteLength', 'pidFile']]);
_apply_top([['maxFileSize', 'maxNoteLength', 'maxRemoteNoteLength', 'maxAltTextLength', 'maxRemoteAltTextLength', 'pidFile']]);
_apply_top(['import', ['downloadTimeout', 'maxFileSize']]);
_apply_top([['signToActivityPubGet', 'checkActivityPubGetSignature']]);
}

View file

@ -3,26 +3,10 @@
* SPDX-License-Identifier: AGPL-3.0-only
*/
export const MAX_NOTE_TEXT_LENGTH = 3000;
export const USER_ONLINE_THRESHOLD = 1000 * 60 * 10; // 10min
export const USER_ACTIVE_THRESHOLD = 1000 * 60 * 60 * 24 * 3; // 3days
//#region hard limits
// If you change DB_* values, you must also change the DB schema.
/**
* Maximum note text length that can be stored in DB.
* Surrogate pairs count as one
*/
export const DB_MAX_NOTE_TEXT_LENGTH = 8192;
/**
* Maximum image description length that can be stored in DB.
* Surrogate pairs count as one
*/
export const DB_MAX_IMAGE_COMMENT_LENGTH = 8192;
//#endregion
export const PER_NOTE_REACTION_USER_PAIR_CACHE_MAX = 16;
// ブラウザで直接表示することを許可するファイルの種類のリスト
// ここに含まれないものは application/octet-stream としてレスポンスされる

View file

@ -14,10 +14,10 @@ import type {
AbuseReportNotificationRecipientRepository,
MiAbuseReportNotificationRecipient,
MiAbuseUserReport,
MiMeta,
MiUser,
} from '@/models/_.js';
import { EmailService } from '@/core/EmailService.js';
import { MetaService } from '@/core/MetaService.js';
import { RoleService } from '@/core/RoleService.js';
import { RecipientMethod } from '@/models/AbuseReportNotificationRecipient.js';
import { ModerationLogService } from '@/core/ModerationLogService.js';
@ -27,15 +27,19 @@ import { IdService } from './IdService.js';
@Injectable()
export class AbuseReportNotificationService implements OnApplicationShutdown {
constructor(
@Inject(DI.meta)
private meta: MiMeta,
@Inject(DI.abuseReportNotificationRecipientRepository)
private abuseReportNotificationRecipientRepository: AbuseReportNotificationRecipientRepository,
@Inject(DI.redisForSub)
private redisForSub: Redis.Redis,
private idService: IdService,
private roleService: RoleService,
private systemWebhookService: SystemWebhookService,
private emailService: EmailService,
private metaService: MetaService,
private moderationLogService: ModerationLogService,
private globalEventService: GlobalEventService,
) {
@ -93,10 +97,8 @@ export class AbuseReportNotificationService implements OnApplicationShutdown {
.filter(x => x != null),
);
// 送信先の鮮度を保つため、毎回取得する
const meta = await this.metaService.fetch(true);
recipientEMailAddresses.push(
...(meta.email ? [meta.email] : []),
...(this.meta.email ? [this.meta.email] : []),
);
if (recipientEMailAddresses.length <= 0) {

View file

@ -9,7 +9,7 @@ import { IsNull, In, MoreThan, Not } from 'typeorm';
import { bindThis } from '@/decorators.js';
import { DI } from '@/di-symbols.js';
import type { MiLocalUser, MiRemoteUser, MiUser } from '@/models/User.js';
import type { BlockingsRepository, FollowingsRepository, InstancesRepository, MutingsRepository, UserListMembershipsRepository, UsersRepository } from '@/models/_.js';
import type { BlockingsRepository, FollowingsRepository, InstancesRepository, MiMeta, MutingsRepository, UserListMembershipsRepository, UsersRepository } from '@/models/_.js';
import type { RelationshipJobData, ThinUser } from '@/queue/types.js';
import { IdService } from '@/core/IdService.js';
@ -22,13 +22,15 @@ import { ApRendererService } from '@/core/activitypub/ApRendererService.js';
import { UserEntityService } from '@/core/entities/UserEntityService.js';
import { ProxyAccountService } from '@/core/ProxyAccountService.js';
import { FederatedInstanceService } from '@/core/FederatedInstanceService.js';
import { MetaService } from '@/core/MetaService.js';
import InstanceChart from '@/core/chart/charts/instance.js';
import PerUserFollowingChart from '@/core/chart/charts/per-user-following.js';
@Injectable()
export class AccountMoveService {
constructor(
@Inject(DI.meta)
private meta: MiMeta,
@Inject(DI.usersRepository)
private usersRepository: UsersRepository,
@ -57,7 +59,6 @@ export class AccountMoveService {
private perUserFollowingChart: PerUserFollowingChart,
private federatedInstanceService: FederatedInstanceService,
private instanceChart: InstanceChart,
private metaService: MetaService,
private relayService: RelayService,
private queueService: QueueService,
) {
@ -276,7 +277,7 @@ export class AccountMoveService {
if (this.userEntityService.isRemoteUser(oldAccount)) {
this.federatedInstanceService.fetch(oldAccount.host).then(async i => {
this.instancesRepository.decrement({ id: i.id }, 'followersCount', localFollowerIds.length);
if ((await this.metaService.fetch()).enableChartsForFederatedInstances) {
if (this.meta.enableChartsForFederatedInstances) {
this.instanceChart.updateFollowers(i.host, false);
}
});

View file

@ -123,11 +123,14 @@ export class AntennaService implements OnApplicationShutdown {
if (antenna.src === 'home') {
// TODO
} else if (antenna.src === 'list') {
const listUsers = (await this.userListMembershipsRepository.findBy({
userListId: antenna.userListId!,
})).map(x => x.userId);
if (!listUsers.includes(note.userId)) return false;
if (antenna.userListId == null) return false;
const exists = await this.userListMembershipsRepository.exists({
where: {
userListId: antenna.userListId,
userId: note.userId,
},
});
if (!exists) return false;
} else if (antenna.src === 'users') {
const accts = antenna.users.map(x => {
const { username, host } = Acct.parse(x);

View file

@ -10,6 +10,7 @@ import { bindThis } from '@/decorators.js';
type CaptchaResponse = {
success: boolean;
'error-codes'?: string[];
'errors'?: string[];
};
@Injectable()
@ -73,6 +74,35 @@ export class CaptchaService {
}
}
@bindThis
public async verifyFriendlyCaptcha(secret: string, response: string | null | undefined): Promise<void> {
if (response == null) {
throw new Error('frc-failed: no response provided');
}
const result = await this.httpRequestService.send('https://api.friendlycaptcha.com/api/v1/siteverify', {
method: 'POST',
body: JSON.stringify({
secret: secret,
solution: response,
}),
headers: {
'Content-Type': 'application/json',
},
});
if (result.status !== 200) {
throw new Error('frc-failed: frc didn\'t return 200 OK');
}
const resp = await result.json() as CaptchaResponse;
if (resp.success !== true) {
const errorCodes = resp['errors'] ? resp['errors'].join(', ') : '';
throw new Error(`frc-failed: ${errorCodes}`);
}
}
// https://codeberg.org/Gusted/mCaptcha/src/branch/main/mcaptcha.go
@bindThis
public async verifyMcaptcha(secret: string, siteKey: string, instanceHost: string, response: string | null | undefined): Promise<void> {

View file

@ -13,6 +13,7 @@ import {
import { AbuseReportNotificationService } from '@/core/AbuseReportNotificationService.js';
import { SystemWebhookService } from '@/core/SystemWebhookService.js';
import { UserSearchService } from '@/core/UserSearchService.js';
import { WebhookTestService } from '@/core/WebhookTestService.js';
import { AccountMoveService } from './AccountMoveService.js';
import { AccountUpdateService } from './AccountUpdateService.js';
import { AnnouncementService } from './AnnouncementService.js';
@ -42,6 +43,7 @@ import { ModerationLogService } from './ModerationLogService.js';
import { NoteCreateService } from './NoteCreateService.js';
import { NoteEditService } from './NoteEditService.js';
import { NoteDeleteService } from './NoteDeleteService.js';
import { LatestNoteService } from './LatestNoteService.js';
import { NotePiningService } from './NotePiningService.js';
import { NoteReadService } from './NoteReadService.js';
import { NotificationService } from './NotificationService.js';
@ -49,6 +51,7 @@ import { PollService } from './PollService.js';
import { PushNotificationService } from './PushNotificationService.js';
import { QueryService } from './QueryService.js';
import { ReactionService } from './ReactionService.js';
import { ReactionsBufferingService } from './ReactionsBufferingService.js';
import { RelayService } from './RelayService.js';
import { RoleService } from './RoleService.js';
import { S3Service } from './S3Service.js';
@ -149,6 +152,7 @@ import { ApQuestionService } from './activitypub/models/ApQuestionService.js';
import { QueueModule } from './QueueModule.js';
import { QueueService } from './QueueService.js';
import { LoggerService } from './LoggerService.js';
import { SponsorsService } from './SponsorsService.js';
import type { Provider } from '@nestjs/common';
//#region 文字列ベースでのinjection用(循環参照対応のため)
@ -184,6 +188,7 @@ const $ModerationLogService: Provider = { provide: 'ModerationLogService', useEx
const $NoteCreateService: Provider = { provide: 'NoteCreateService', useExisting: NoteCreateService };
const $NoteEditService: Provider = { provide: 'NoteEditService', useExisting: NoteEditService };
const $NoteDeleteService: Provider = { provide: 'NoteDeleteService', useExisting: NoteDeleteService };
const $LatestNoteService: Provider = { provide: 'LatestNoteService', useExisting: LatestNoteService };
const $NotePiningService: Provider = { provide: 'NotePiningService', useExisting: NotePiningService };
const $NoteReadService: Provider = { provide: 'NoteReadService', useExisting: NoteReadService };
const $NotificationService: Provider = { provide: 'NotificationService', useExisting: NotificationService };
@ -192,6 +197,7 @@ const $ProxyAccountService: Provider = { provide: 'ProxyAccountService', useExis
const $PushNotificationService: Provider = { provide: 'PushNotificationService', useExisting: PushNotificationService };
const $QueryService: Provider = { provide: 'QueryService', useExisting: QueryService };
const $ReactionService: Provider = { provide: 'ReactionService', useExisting: ReactionService };
const $ReactionsBufferingService: Provider = { provide: 'ReactionsBufferingService', useExisting: ReactionsBufferingService };
const $RelayService: Provider = { provide: 'RelayService', useExisting: RelayService };
const $RoleService: Provider = { provide: 'RoleService', useExisting: RoleService };
const $S3Service: Provider = { provide: 'S3Service', useExisting: S3Service };
@ -211,6 +217,7 @@ const $UserAuthService: Provider = { provide: 'UserAuthService', useExisting: Us
const $VideoProcessingService: Provider = { provide: 'VideoProcessingService', useExisting: VideoProcessingService };
const $UserWebhookService: Provider = { provide: 'UserWebhookService', useExisting: UserWebhookService };
const $SystemWebhookService: Provider = { provide: 'SystemWebhookService', useExisting: SystemWebhookService };
const $WebhookTestService: Provider = { provide: 'WebhookTestService', useExisting: WebhookTestService };
const $UtilityService: Provider = { provide: 'UtilityService', useExisting: UtilityService };
const $FileInfoService: Provider = { provide: 'FileInfoService', useExisting: FileInfoService };
const $SearchService: Provider = { provide: 'SearchService', useExisting: SearchService };
@ -295,6 +302,8 @@ const $ApPersonService: Provider = { provide: 'ApPersonService', useExisting: Ap
const $ApQuestionService: Provider = { provide: 'ApQuestionService', useExisting: ApQuestionService };
//#endregion
const $SponsorsService: Provider = { provide: 'SponsorsService', useExisting: SponsorsService };
@Module({
imports: [
QueueModule,
@ -332,6 +341,7 @@ const $ApQuestionService: Provider = { provide: 'ApQuestionService', useExisting
NoteCreateService,
NoteEditService,
NoteDeleteService,
LatestNoteService,
NotePiningService,
NoteReadService,
NotificationService,
@ -340,6 +350,7 @@ const $ApQuestionService: Provider = { provide: 'ApQuestionService', useExisting
PushNotificationService,
QueryService,
ReactionService,
ReactionsBufferingService,
RelayService,
RoleService,
S3Service,
@ -359,6 +370,7 @@ const $ApQuestionService: Provider = { provide: 'ApQuestionService', useExisting
VideoProcessingService,
UserWebhookService,
SystemWebhookService,
WebhookTestService,
UtilityService,
FileInfoService,
SearchService,
@ -443,6 +455,8 @@ const $ApQuestionService: Provider = { provide: 'ApQuestionService', useExisting
ApQuestionService,
QueueService,
SponsorsService,
//#region 文字列ベースでのinjection用(循環参照対応のため)
$LoggerService,
$AbuseReportService,
@ -476,6 +490,7 @@ const $ApQuestionService: Provider = { provide: 'ApQuestionService', useExisting
$NoteCreateService,
$NoteEditService,
$NoteDeleteService,
$LatestNoteService,
$NotePiningService,
$NoteReadService,
$NotificationService,
@ -484,6 +499,7 @@ const $ApQuestionService: Provider = { provide: 'ApQuestionService', useExisting
$PushNotificationService,
$QueryService,
$ReactionService,
$ReactionsBufferingService,
$RelayService,
$RoleService,
$S3Service,
@ -503,6 +519,7 @@ const $ApQuestionService: Provider = { provide: 'ApQuestionService', useExisting
$VideoProcessingService,
$UserWebhookService,
$SystemWebhookService,
$WebhookTestService,
$UtilityService,
$FileInfoService,
$SearchService,
@ -586,6 +603,8 @@ const $ApQuestionService: Provider = { provide: 'ApQuestionService', useExisting
$ApPersonService,
$ApQuestionService,
//#endregion
$SponsorsService,
],
exports: [
QueueModule,
@ -621,6 +640,7 @@ const $ApQuestionService: Provider = { provide: 'ApQuestionService', useExisting
NoteCreateService,
NoteEditService,
NoteDeleteService,
LatestNoteService,
NotePiningService,
NoteReadService,
NotificationService,
@ -629,6 +649,7 @@ const $ApQuestionService: Provider = { provide: 'ApQuestionService', useExisting
PushNotificationService,
QueryService,
ReactionService,
ReactionsBufferingService,
RelayService,
RoleService,
S3Service,
@ -648,6 +669,7 @@ const $ApQuestionService: Provider = { provide: 'ApQuestionService', useExisting
VideoProcessingService,
UserWebhookService,
SystemWebhookService,
WebhookTestService,
UtilityService,
FileInfoService,
SearchService,
@ -731,6 +753,8 @@ const $ApQuestionService: Provider = { provide: 'ApQuestionService', useExisting
ApQuestionService,
QueueService,
SponsorsService,
//#region 文字列ベースでのinjection用(循環参照対応のため)
$LoggerService,
$AbuseReportService,
@ -764,6 +788,7 @@ const $ApQuestionService: Provider = { provide: 'ApQuestionService', useExisting
$NoteCreateService,
$NoteEditService,
$NoteDeleteService,
$LatestNoteService,
$NotePiningService,
$NoteReadService,
$NotificationService,
@ -772,6 +797,7 @@ const $ApQuestionService: Provider = { provide: 'ApQuestionService', useExisting
$PushNotificationService,
$QueryService,
$ReactionService,
$ReactionsBufferingService,
$RelayService,
$RoleService,
$S3Service,
@ -791,6 +817,7 @@ const $ApQuestionService: Provider = { provide: 'ApQuestionService', useExisting
$VideoProcessingService,
$UserWebhookService,
$SystemWebhookService,
$WebhookTestService,
$UtilityService,
$FileInfoService,
$SearchService,
@ -873,6 +900,8 @@ const $ApQuestionService: Provider = { provide: 'ApQuestionService', useExisting
$ApPersonService,
$ApQuestionService,
//#endregion
$SponsorsService,
],
})
export class CoreModule { }

View file

@ -13,6 +13,7 @@ import { GlobalEventService } from '@/core/GlobalEventService.js';
import { UserEntityService } from '@/core/entities/UserEntityService.js';
import { ApRendererService } from '@/core/activitypub/ApRendererService.js';
import { ModerationLogService } from '@/core/ModerationLogService.js';
import { isSystemAccount } from '@/misc/is-system-account.js';
@Injectable()
export class DeleteAccountService {
@ -38,6 +39,7 @@ export class DeleteAccountService {
}, moderator?: MiUser): Promise<void> {
const _user = await this.usersRepository.findOneByOrFail({ id: user.id });
if (_user.isRoot) throw new Error('cannot delete a root account');
if (isSystemAccount(_user)) throw new Error('cannot delete a system account');
if (moderator != null) {
this.moderationLogService.log(moderator, 'deleteAccount', {

View file

@ -42,7 +42,7 @@ export class DownloadService {
const timeout = options.timeout ?? 30 * 1000;
const operationTimeout = options.operationTimeout ?? 60 * 1000;
const maxSize = options.maxSize ?? this.config.maxFileSize ?? 262144000;
const maxSize = options.maxSize ?? this.config.maxFileSize;
const urlObj = new URL(url);
let filename = urlObj.pathname.split('/').pop() ?? 'untitled';

View file

@ -11,11 +11,10 @@ import { sharpBmp } from '@misskey-dev/sharp-read-bmp';
import { IsNull } from 'typeorm';
import { DeleteObjectCommandInput, PutObjectCommandInput, NoSuchKey } from '@aws-sdk/client-s3';
import { DI } from '@/di-symbols.js';
import type { DriveFilesRepository, UsersRepository, DriveFoldersRepository, UserProfilesRepository } from '@/models/_.js';
import type { DriveFilesRepository, UsersRepository, DriveFoldersRepository, UserProfilesRepository, MiMeta } from '@/models/_.js';
import type { Config } from '@/config.js';
import Logger from '@/logger.js';
import type { MiRemoteUser, MiUser } from '@/models/User.js';
import { MetaService } from '@/core/MetaService.js';
import { MiDriveFile } from '@/models/DriveFile.js';
import { IdService } from '@/core/IdService.js';
import { isDuplicateKeyValueError } from '@/misc/is-duplicate-key-value-error.js';
@ -99,6 +98,9 @@ export class DriveService {
@Inject(DI.config)
private config: Config,
@Inject(DI.meta)
private meta: MiMeta,
@Inject(DI.usersRepository)
private usersRepository: UsersRepository,
@ -115,7 +117,6 @@ export class DriveService {
private userEntityService: UserEntityService,
private driveFileEntityService: DriveFileEntityService,
private idService: IdService,
private metaService: MetaService,
private downloadService: DownloadService,
private internalStorageService: InternalStorageService,
private s3Service: S3Service,
@ -149,9 +150,7 @@ export class DriveService {
// thunbnail, webpublic を必要なら生成
const alts = await this.generateAlts(path, type, !file.uri);
const meta = await this.metaService.fetch();
if (meta.useObjectStorage) {
if (this.meta.useObjectStorage) {
//#region ObjectStorage params
let [ext] = (name.match(/\.([a-zA-Z0-9_-]+)$/) ?? ['']);
@ -170,11 +169,11 @@ export class DriveService {
ext = '';
}
const baseUrl = meta.objectStorageBaseUrl
?? `${ meta.objectStorageUseSSL ? 'https' : 'http' }://${ meta.objectStorageEndpoint }${ meta.objectStoragePort ? `:${meta.objectStoragePort}` : '' }/${ meta.objectStorageBucket }`;
const baseUrl = this.meta.objectStorageBaseUrl
?? `${ this.meta.objectStorageUseSSL ? 'https' : 'http' }://${ this.meta.objectStorageEndpoint }${ this.meta.objectStoragePort ? `:${this.meta.objectStoragePort}` : '' }/${ this.meta.objectStorageBucket }`;
// for original
const key = `${meta.objectStoragePrefix}/${randomUUID()}${ext}`;
const key = `${this.meta.objectStoragePrefix}/${randomUUID()}${ext}`;
const url = `${ baseUrl }/${ key }`;
// for alts
@ -191,7 +190,7 @@ export class DriveService {
];
if (alts.webpublic) {
webpublicKey = `${meta.objectStoragePrefix}/webpublic-${randomUUID()}.${alts.webpublic.ext}`;
webpublicKey = `${this.meta.objectStoragePrefix}/webpublic-${randomUUID()}.${alts.webpublic.ext}`;
webpublicUrl = `${ baseUrl }/${ webpublicKey }`;
this.registerLogger.info(`uploading webpublic: ${webpublicKey}`);
@ -199,7 +198,7 @@ export class DriveService {
}
if (alts.thumbnail) {
thumbnailKey = `${meta.objectStoragePrefix}/thumbnail-${randomUUID()}.${alts.thumbnail.ext}`;
thumbnailKey = `${this.meta.objectStoragePrefix}/thumbnail-${randomUUID()}.${alts.thumbnail.ext}`;
thumbnailUrl = `${ baseUrl }/${ thumbnailKey }`;
this.registerLogger.info(`uploading thumbnail: ${thumbnailKey}`);
@ -228,25 +227,33 @@ export class DriveService {
const thumbnailAccessKey = 'thumbnail-' + randomUUID();
const webpublicAccessKey = 'webpublic-' + randomUUID();
const url = this.internalStorageService.saveFromPath(accessKey, path);
let thumbnailUrl: string | null = null;
let webpublicUrl: string | null = null;
// Ugly type is just to help TS figure out that 2nd / 3rd promises are optional.
const promises: [Promise<string>, ...(Promise<string> | undefined)[]] = [
this.internalStorageService.saveFromPath(accessKey, path),
];
if (alts.thumbnail) {
thumbnailUrl = this.internalStorageService.saveFromBuffer(thumbnailAccessKey, alts.thumbnail.data);
this.registerLogger.info(`thumbnail stored: ${thumbnailAccessKey}`);
promises.push(this.internalStorageService.saveFromBuffer(thumbnailAccessKey, alts.thumbnail.data));
}
if (alts.webpublic) {
webpublicUrl = this.internalStorageService.saveFromBuffer(webpublicAccessKey, alts.webpublic.data);
promises.push(this.internalStorageService.saveFromBuffer(webpublicAccessKey, alts.webpublic.data));
}
const [url, thumbnailUrl, webpublicUrl] = await Promise.all(promises);
if (thumbnailUrl) {
this.registerLogger.info(`thumbnail stored: ${thumbnailAccessKey}`);
}
if (webpublicUrl) {
this.registerLogger.info(`web stored: ${webpublicAccessKey}`);
}
file.storedInternal = true;
file.url = url;
file.thumbnailUrl = thumbnailUrl;
file.webpublicUrl = webpublicUrl;
file.thumbnailUrl = thumbnailUrl ?? null;
file.webpublicUrl = webpublicUrl ?? null;
file.accessKey = accessKey;
file.thumbnailAccessKey = thumbnailAccessKey;
file.webpublicAccessKey = webpublicAccessKey;
@ -376,10 +383,8 @@ export class DriveService {
if (type === 'image/apng') type = 'image/png';
if (!FILE_TYPE_BROWSERSAFE.includes(type)) type = 'application/octet-stream';
const meta = await this.metaService.fetch();
const params = {
Bucket: meta.objectStorageBucket,
Bucket: this.meta.objectStorageBucket,
Key: key,
Body: stream,
ContentType: type,
@ -392,9 +397,9 @@ export class DriveService {
// 許可されているファイル形式でしか拡張子をつけない
ext ? correctFilename(filename, ext) : filename,
);
if (meta.objectStorageSetPublicRead) params.ACL = 'public-read';
if (this.meta.objectStorageSetPublicRead) params.ACL = 'public-read';
await this.s3Service.upload(meta, params)
await this.s3Service.upload(this.meta, params)
.then(
result => {
if ('Bucket' in result) { // CompleteMultipartUploadCommandOutput
@ -463,9 +468,7 @@ export class DriveService {
requestHeaders = null,
ext = null,
}: AddFileArgs): Promise<MiDriveFile> {
const instance = await this.metaService.fetch();
const userRoleNSFW = user && (await this.roleService.getUserPolicies(user.id)).alwaysMarkNsfw;
const info = await this.fileInfoService.getFileInfo(path);
this.registerLogger.info(`${JSON.stringify(info)}`);
@ -565,11 +568,11 @@ export class DriveService {
file.maybeSensitive = info.sensitive;
file.maybePorn = info.porn;
file.isSensitive = user
? this.userEntityService.isLocalUser(user) && profile!.alwaysMarkNsfw ? true :
? this.userEntityService.isLocalUser(user) && (profile!.alwaysMarkNsfw || profile!.defaultSensitive) ? true :
sensitive ?? false
: false;
if (user && this.utilityService.isMediaSilencedHost(instance.mediaSilencedHosts, user.host)) file.isSensitive = true;
if (user && this.utilityService.isMediaSilencedHost(this.meta.mediaSilencedHosts, user.host)) file.isSensitive = true;
if (info.sensitive && profile!.autoSensitive) file.isSensitive = true;
if (userRoleNSFW) file.isSensitive = true;
@ -631,7 +634,7 @@ export class DriveService {
// ローカルユーザーのみ
this.perUserDriveChart.update(file, true);
} else {
if ((await this.metaService.fetch()).enableChartsForFederatedInstances) {
if (this.meta.enableChartsForFederatedInstances) {
this.instanceChart.updateDrive(file, true);
}
}
@ -725,19 +728,19 @@ export class DriveService {
@bindThis
public async deleteFileSync(file: MiDriveFile, isExpired = false, deleter?: MiUser) {
const promises = [];
if (file.storedInternal) {
this.internalStorageService.del(file.accessKey!);
promises.push(this.internalStorageService.del(file.accessKey!));
if (file.thumbnailUrl) {
this.internalStorageService.del(file.thumbnailAccessKey!);
promises.push(this.internalStorageService.del(file.thumbnailAccessKey!));
}
if (file.webpublicUrl) {
this.internalStorageService.del(file.webpublicAccessKey!);
promises.push(this.internalStorageService.del(file.webpublicAccessKey!));
}
} else if (!file.isLink) {
const promises = [];
promises.push(this.deleteObjectStorageFile(file.accessKey!));
if (file.thumbnailUrl) {
@ -747,10 +750,10 @@ export class DriveService {
if (file.webpublicUrl) {
promises.push(this.deleteObjectStorageFile(file.webpublicAccessKey!));
}
await Promise.all(promises);
}
await Promise.all(promises);
this.deletePostProcess(file, isExpired, deleter);
}
@ -778,7 +781,7 @@ export class DriveService {
// ローカルユーザーのみ
this.perUserDriveChart.update(file, false);
} else {
if ((await this.metaService.fetch()).enableChartsForFederatedInstances) {
if (this.meta.enableChartsForFederatedInstances) {
this.instanceChart.updateDrive(file, false);
}
}
@ -800,14 +803,13 @@ export class DriveService {
@bindThis
public async deleteObjectStorageFile(key: string) {
const meta = await this.metaService.fetch();
try {
const param = {
Bucket: meta.objectStorageBucket,
Bucket: this.meta.objectStorageBucket,
Key: key,
} as DeleteObjectCommandInput;
await this.s3Service.delete(meta, param);
await this.s3Service.delete(this.meta, param);
} catch (err: any) {
if (err.name === 'NoSuchKey') {
this.deleteLogger.warn(`The object storage had no such key to delete: ${key}. Skipping this.`, err as Error);

View file

@ -5,18 +5,17 @@
import { URLSearchParams } from 'node:url';
import * as nodemailer from 'nodemailer';
import juice from 'juice';
import { Inject, Injectable } from '@nestjs/common';
import { validate as validateEmail } from 'deep-email-validator';
import { MetaService } from '@/core/MetaService.js';
import { UtilityService } from '@/core/UtilityService.js';
import { DI } from '@/di-symbols.js';
import type { Config } from '@/config.js';
import type Logger from '@/logger.js';
import type { UserProfilesRepository } from '@/models/_.js';
import type { MiMeta, UserProfilesRepository } from '@/models/_.js';
import { LoggerService } from '@/core/LoggerService.js';
import { bindThis } from '@/decorators.js';
import { HttpRequestService } from '@/core/HttpRequestService.js';
import { QueueService } from '@/core/QueueService.js';
@Injectable()
export class EmailService {
@ -26,49 +25,41 @@ export class EmailService {
@Inject(DI.config)
private config: Config,
@Inject(DI.meta)
private meta: MiMeta,
@Inject(DI.userProfilesRepository)
private userProfilesRepository: UserProfilesRepository,
private metaService: MetaService,
private loggerService: LoggerService,
private utilityService: UtilityService,
private httpRequestService: HttpRequestService,
private queueService: QueueService,
) {
this.logger = this.loggerService.getLogger('email');
}
@bindThis
public async sendEmail(to: string, subject: string, html: string, text: string) {
const meta = await this.metaService.fetch(true);
if (!meta.enableEmail) return;
if (!this.meta.enableEmail) return;
const iconUrl = `${this.config.url}/static-assets/mi-white.png`;
const emailSettingUrl = `${this.config.url}/settings/email`;
const enableAuth = meta.smtpUser != null && meta.smtpUser !== '';
const enableAuth = this.meta.smtpUser != null && this.meta.smtpUser !== '';
const transporter = nodemailer.createTransport({
host: meta.smtpHost,
port: meta.smtpPort,
secure: meta.smtpSecure,
host: this.meta.smtpHost,
port: this.meta.smtpPort,
secure: this.meta.smtpSecure,
ignoreTLS: !enableAuth,
proxy: this.config.proxySmtp,
auth: enableAuth ? {
user: meta.smtpUser,
pass: meta.smtpPass,
user: this.meta.smtpUser,
pass: this.meta.smtpPass,
} : undefined,
} as any);
try {
// TODO: htmlサニタイズ
const info = await transporter.sendMail({
from: meta.email!,
to: to,
subject: subject,
text: text,
html: `<!doctype html>
const htmlContent = `<!doctype html>
<html>
<head>
<meta charset="utf-8">
@ -133,7 +124,7 @@ export class EmailService {
<body>
<main>
<header>
<img src="${ meta.logoImageUrl ?? meta.iconUrl ?? iconUrl }"/>
<img src="${ this.meta.logoImageUrl ?? this.meta.iconUrl ?? iconUrl }"/>
</header>
<article>
<h1>${ subject }</h1>
@ -147,7 +138,18 @@ export class EmailService {
<a href="${ this.config.url }">${ this.config.host }</a>
</nav>
</body>
</html>`,
</html>`;
const inlinedHtml = juice(htmlContent);
try {
// TODO: htmlサニタイズ
const info = await transporter.sendMail({
from: this.meta.email!,
to: to,
subject: subject,
text: text,
html: inlinedHtml,
});
this.logger.info(`Message sent: ${info.messageId}`);
@ -162,8 +164,6 @@ export class EmailService {
available: boolean;
reason: null | 'used' | 'format' | 'disposable' | 'mx' | 'smtp' | 'banned' | 'network' | 'blacklist';
}> {
const meta = await this.metaService.fetch();
const exist = await this.userProfilesRepository.countBy({
emailVerified: true,
email: emailAddress,
@ -181,11 +181,11 @@ export class EmailService {
reason?: string | null,
} = { valid: true, reason: null };
if (meta.enableActiveEmailValidation) {
if (meta.enableVerifymailApi && meta.verifymailAuthKey != null) {
validated = await this.verifyMail(emailAddress, meta.verifymailAuthKey);
} else if (meta.enableTruemailApi && meta.truemailInstance && meta.truemailAuthKey != null) {
validated = await this.trueMail(meta.truemailInstance, emailAddress, meta.truemailAuthKey);
if (this.meta.enableActiveEmailValidation) {
if (this.meta.enableVerifymailApi && this.meta.verifymailAuthKey != null) {
validated = await this.verifyMail(emailAddress, this.meta.verifymailAuthKey);
} else if (this.meta.enableTruemailApi && this.meta.truemailInstance && this.meta.truemailAuthKey != null) {
validated = await this.trueMail(this.meta.truemailInstance, emailAddress, this.meta.truemailAuthKey);
} else {
validated = await validateEmail({
email: emailAddress,
@ -215,7 +215,7 @@ export class EmailService {
}
const emailDomain: string = emailAddress.split('@')[1];
const isBanned = this.utilityService.isBlockedHost(meta.bannedEmailDomains, emailDomain);
const isBanned = this.utilityService.isBlockedHost(this.meta.bannedEmailDomains, emailDomain);
if (isBanned) {
return {

View file

@ -12,6 +12,8 @@ import { IdService } from '@/core/IdService.js';
import { DI } from '@/di-symbols.js';
import { UtilityService } from '@/core/UtilityService.js';
import { bindThis } from '@/decorators.js';
import { QueryFailedError } from 'typeorm';
import { isDuplicateKeyValueError } from '@/misc/is-duplicate-key-value-error.js';
@Injectable()
export class FederatedInstanceService implements OnApplicationShutdown {
@ -56,11 +58,24 @@ export class FederatedInstanceService implements OnApplicationShutdown {
const index = await this.instancesRepository.findOneBy({ host });
if (index == null) {
const i = await this.instancesRepository.insertOne({
id: this.idService.gen(),
host,
firstRetrievedAt: new Date(),
});
let i;
try {
i = await this.instancesRepository.insertOne({
id: this.idService.gen(),
host,
firstRetrievedAt: new Date(),
});
} catch (e: unknown) {
if (e instanceof QueryFailedError) {
if (isDuplicateKeyValueError(e)) {
i = await this.instancesRepository.findOneBy({ host });
}
}
if (i == null) {
throw e;
}
}
this.federatedInstanceCache.set(host, i);
return i;

View file

@ -246,7 +246,7 @@ export interface InternalEventTypes {
avatarDecorationCreated: MiAvatarDecoration;
avatarDecorationDeleted: MiAvatarDecoration;
avatarDecorationUpdated: MiAvatarDecoration;
metaUpdated: MiMeta;
metaUpdated: { before?: MiMeta; after: MiMeta; };
followChannel: { userId: MiUser['id']; channelId: MiChannel['id']; };
unfollowChannel: { userId: MiUser['id']; channelId: MiChannel['id']; };
updateUserProfile: MiUserProfile;

View file

@ -10,16 +10,18 @@ import type { MiUser } from '@/models/User.js';
import { normalizeForSearch } from '@/misc/normalize-for-search.js';
import { IdService } from '@/core/IdService.js';
import type { MiHashtag } from '@/models/Hashtag.js';
import type { HashtagsRepository } from '@/models/_.js';
import type { HashtagsRepository, MiMeta } from '@/models/_.js';
import { UserEntityService } from '@/core/entities/UserEntityService.js';
import { bindThis } from '@/decorators.js';
import { FeaturedService } from '@/core/FeaturedService.js';
import { MetaService } from '@/core/MetaService.js';
import { UtilityService } from '@/core/UtilityService.js';
@Injectable()
export class HashtagService {
constructor(
@Inject(DI.meta)
private meta: MiMeta,
@Inject(DI.redis)
private redisClient: Redis.Redis, // TODO: 専用のRedisサーバーを設定できるようにする
@ -29,7 +31,6 @@ export class HashtagService {
private userEntityService: UserEntityService,
private featuredService: FeaturedService,
private idService: IdService,
private metaService: MetaService,
private utilityService: UtilityService,
) {
}
@ -160,10 +161,9 @@ export class HashtagService {
@bindThis
public async updateHashtagsRanking(hashtag: string, userId: MiUser['id']): Promise<void> {
const instance = await this.metaService.fetch();
const hiddenTags = instance.hiddenTags.map(t => normalizeForSearch(t));
const hiddenTags = this.meta.hiddenTags.map(t => normalizeForSearch(t));
if (hiddenTags.includes(hashtag)) return;
if (this.utilityService.isKeyWordIncluded(hashtag, instance.sensitiveWords)) return;
if (this.utilityService.isKeyWordIncluded(hashtag, this.meta.sensitiveWords)) return;
// YYYYMMDDHHmm (10分間隔)
const now = new Date();

View file

@ -4,6 +4,7 @@
*/
import * as fs from 'node:fs';
import { copyFile, mkdir, unlink, writeFile } from 'node:fs/promises';
import * as Path from 'node:path';
import { fileURLToPath } from 'node:url';
import { dirname } from 'node:path';
@ -23,6 +24,8 @@ export class InternalStorageService {
@Inject(DI.config)
private config: Config,
) {
// No one should erase the working directory *while the server is running*.
fs.mkdirSync(path, { recursive: true });
}
@bindThis
@ -36,21 +39,19 @@ export class InternalStorageService {
}
@bindThis
public saveFromPath(key: string, srcPath: string) {
fs.mkdirSync(path, { recursive: true });
fs.copyFileSync(srcPath, this.resolvePath(key));
public async saveFromPath(key: string, srcPath: string): Promise<string> {
await copyFile(srcPath, this.resolvePath(key));
return `${this.config.url}/files/${key}`;
}
@bindThis
public saveFromBuffer(key: string, data: Buffer) {
fs.mkdirSync(path, { recursive: true });
fs.writeFileSync(this.resolvePath(key), data);
public async saveFromBuffer(key: string, data: Buffer): Promise<string> {
await writeFile(this.resolvePath(key), data);
return `${this.config.url}/files/${key}`;
}
@bindThis
public del(key: string) {
fs.unlink(this.resolvePath(key), () => {});
public async del(key: string): Promise<void> {
await unlink(this.resolvePath(key));
}
}

View file

@ -0,0 +1,139 @@
import { Inject, Injectable } from '@nestjs/common';
import { Not } from 'typeorm';
import { MiNote } from '@/models/Note.js';
import { isPureRenote } from '@/misc/is-renote.js';
import { SkLatestNote } from '@/models/LatestNote.js';
import { DI } from '@/di-symbols.js';
import type { LatestNotesRepository, NotesRepository } from '@/models/_.js';
import { LoggerService } from '@/core/LoggerService.js';
import Logger from '@/logger.js';
@Injectable()
export class LatestNoteService {
private readonly logger: Logger;
constructor(
@Inject(DI.notesRepository)
private notesRepository: NotesRepository,
@Inject(DI.latestNotesRepository)
private latestNotesRepository: LatestNotesRepository,
loggerService: LoggerService,
) {
this.logger = loggerService.getLogger('LatestNoteService');
}
handleUpdatedNoteBG(before: MiNote, after: MiNote): void {
this
.handleUpdatedNote(before, after)
.catch(err => this.logger.error('Unhandled exception while updating latest_note (after update):', err));
}
async handleUpdatedNote(before: MiNote, after: MiNote): Promise<void> {
// If the key didn't change, then there's nothing to update
if (SkLatestNote.areEquivalent(before, after)) return;
// Simulate update as delete + create
await this.handleDeletedNote(before);
await this.handleCreatedNote(after);
}
handleCreatedNoteBG(note: MiNote): void {
this
.handleCreatedNote(note)
.catch(err => this.logger.error('Unhandled exception while updating latest_note (after create):', err));
}
async handleCreatedNote(note: MiNote): Promise<void> {
// Ignore DMs.
// Followers-only posts are *included*, as this table is used to back the "following" feed.
if (note.visibility === 'specified') return;
// Ignore pure renotes
if (isPureRenote(note)) return;
// Compute the compound key of the entry to check
const key = SkLatestNote.keyFor(note);
// Make sure that this isn't an *older* post.
// We can get older posts through replies, lookups, updates, etc.
const currentLatest = await this.latestNotesRepository.findOneBy(key);
if (currentLatest != null && currentLatest.noteId >= note.id) return;
// Record this as the latest note for the given user
const latestNote = new SkLatestNote({
...key,
noteId: note.id,
});
await this.latestNotesRepository.upsert(latestNote, ['userId', 'isPublic', 'isReply', 'isQuote']);
}
handleDeletedNoteBG(note: MiNote): void {
this
.handleDeletedNote(note)
.catch(err => this.logger.error('Unhandled exception while updating latest_note (after delete):', err));
}
async handleDeletedNote(note: MiNote): Promise<void> {
// If it's a DM, then it can't possibly be the latest note so we can safely skip this.
if (note.visibility === 'specified') return;
// If it's a pure renote, then it can't possibly be the latest note so we can safely skip this.
if (isPureRenote(note)) return;
// Compute the compound key of the entry to check
const key = SkLatestNote.keyFor(note);
// Check if the deleted note was possibly the latest for the user
const existingLatest = await this.latestNotesRepository.findOneBy(key);
if (existingLatest == null || existingLatest.noteId !== note.id) return;
// Find the newest remaining note for the user.
// We exclude DMs and pure renotes.
const nextLatest = await this.notesRepository
.createQueryBuilder('note')
.select()
.where({
userId: key.userId,
visibility: key.isPublic
? 'public'
: Not('specified'),
replyId: key.isReply
? Not(null)
: null,
renoteId: key.isQuote
? Not(null)
: null,
})
.andWhere(`
(
note."renoteId" IS NULL
OR note.text IS NOT NULL
OR note.cw IS NOT NULL
OR note."replyId" IS NOT NULL
OR note."hasPoll"
OR note."fileIds" != '{}'
)
`)
.orderBy({ id: 'DESC' })
.getOne();
if (!nextLatest) return;
// Record it as the latest
const latestNote = new SkLatestNote({
...key,
noteId: nextLatest.id,
});
// When inserting the latest note, it's possible that another worker has "raced" the insert and already added a newer note.
// We must use orIgnore() to ensure that the query ignores conflicts, otherwise an exception may be thrown.
await this.latestNotesRepository
.createQueryBuilder('latest')
.insert()
.into(SkLatestNote)
.values(latestNote)
.orIgnore()
.execute();
}
}

View file

@ -52,7 +52,7 @@ export class MetaService implements OnApplicationShutdown {
switch (type) {
case 'metaUpdated': {
this.cache = { // TODO: このあたりのデシリアライズ処理は各modelファイル内に関数としてexportしたい
...body,
...(body.after),
proxyAccount: null, // joinなカラムは通常取ってこないので
};
break;
@ -141,7 +141,7 @@ export class MetaService implements OnApplicationShutdown {
});
}
this.globalEventService.publishInternalEvent('metaUpdated', updated);
this.globalEventService.publishInternalEvent('metaUpdated', { before, after: updated });
return updated;
}

View file

@ -6,7 +6,7 @@
import { URL } from 'node:url';
import { Inject, Injectable } from '@nestjs/common';
import * as parse5 from 'parse5';
import { Window, DocumentFragment, XMLSerializer } from 'happy-dom';
import { Window, XMLSerializer } from 'happy-dom';
import { DI } from '@/di-symbols.js';
import type { Config } from '@/config.js';
import { intersperse } from '@/misc/prelude/array.js';
@ -412,8 +412,10 @@ export class MfmService {
mention: (node) => {
const a = doc.createElement('a');
const { username, host, acct } = node.props;
const remoteUserInfo = mentionedRemoteUsers.find(remoteUser => remoteUser.username === username && remoteUser.host === host);
a.setAttribute('href', remoteUserInfo ? (remoteUserInfo.url ? remoteUserInfo.url : remoteUserInfo.uri) : `${this.config.url}/${acct}`);
const remoteUserInfo = mentionedRemoteUsers.find(remoteUser => remoteUser.username.toLowerCase() === username.toLowerCase() && remoteUser.host?.toLowerCase() === host?.toLowerCase());
a.setAttribute('href', remoteUserInfo
? (remoteUserInfo.url ? remoteUserInfo.url : remoteUserInfo.uri)
: `${this.config.url}/${acct.endsWith(`@${this.config.url}`) ? acct.substring(0, acct.length - this.config.url.length - 1) : acct}`);
a.className = 'u-url mention';
a.textContent = acct;
return a;
@ -465,7 +467,7 @@ export class MfmService {
const serialized = new XMLSerializer().serializeToString(body);
happyDOM.close().catch(e => {});
happyDOM.close().catch(err => {});
return serialized;
}

View file

@ -8,13 +8,12 @@ import * as mfm from '@transfem-org/sfm-js';
import { In, DataSource, IsNull, LessThan } from 'typeorm';
import * as Redis from 'ioredis';
import { Inject, Injectable, OnApplicationShutdown } from '@nestjs/common';
import RE2 from 're2';
import { extractMentions } from '@/misc/extract-mentions.js';
import { extractCustomEmojisFromMfm } from '@/misc/extract-custom-emojis-from-mfm.js';
import { extractHashtags } from '@/misc/extract-hashtags.js';
import type { IMentionedRemoteUsers } from '@/models/Note.js';
import { MiNote } from '@/models/Note.js';
import type { ChannelFollowingsRepository, ChannelsRepository, FollowingsRepository, InstancesRepository, MiFollowing, MutingsRepository, NotesRepository, NoteThreadMutingsRepository, UserListMembershipsRepository, UserProfilesRepository, UsersRepository } from '@/models/_.js';
import type { ChannelFollowingsRepository, ChannelsRepository, FollowingsRepository, InstancesRepository, MiFollowing, MiMeta, MutingsRepository, NotesRepository, NoteThreadMutingsRepository, UserListMembershipsRepository, UserProfilesRepository, UsersRepository } from '@/models/_.js';
import type { MiDriveFile } from '@/models/DriveFile.js';
import type { MiApp } from '@/models/App.js';
import { concat } from '@/misc/prelude/array.js';
@ -23,11 +22,8 @@ import type { MiUser, MiLocalUser, MiRemoteUser } from '@/models/User.js';
import type { IPoll } from '@/models/Poll.js';
import { MiPoll } from '@/models/Poll.js';
import { isDuplicateKeyValueError } from '@/misc/is-duplicate-key-value-error.js';
import { checkWordMute } from '@/misc/check-word-mute.js';
import type { MiChannel } from '@/models/Channel.js';
import { normalizeForSearch } from '@/misc/normalize-for-search.js';
import { MemorySingleCache } from '@/misc/cache.js';
import type { MiUserProfile } from '@/models/UserProfile.js';
import { RelayService } from '@/core/RelayService.js';
import { FederatedInstanceService } from '@/core/FederatedInstanceService.js';
import { DI } from '@/di-symbols.js';
@ -49,9 +45,7 @@ import { ApDeliverManagerService } from '@/core/activitypub/ApDeliverManagerServ
import { NoteReadService } from '@/core/NoteReadService.js';
import { RemoteUserResolveService } from '@/core/RemoteUserResolveService.js';
import { bindThis } from '@/decorators.js';
import { DB_MAX_NOTE_TEXT_LENGTH } from '@/const.js';
import { RoleService } from '@/core/RoleService.js';
import { MetaService } from '@/core/MetaService.js';
import { SearchService } from '@/core/SearchService.js';
import { FeaturedService } from '@/core/FeaturedService.js';
import { FanoutTimelineService } from '@/core/FanoutTimelineService.js';
@ -62,6 +56,8 @@ import { isReply } from '@/misc/is-reply.js';
import { trackPromise } from '@/misc/promise-tracker.js';
import { isUserRelated } from '@/misc/is-user-related.js';
import { IdentifiableError } from '@/misc/identifiable-error.js';
import { LatestNoteService } from '@/core/LatestNoteService.js';
import { CollapsedQueue } from '@/misc/collapsed-queue.js';
type NotificationType = 'reply' | 'renote' | 'quote' | 'mention';
@ -153,11 +149,15 @@ type Option = {
@Injectable()
export class NoteCreateService implements OnApplicationShutdown {
#shutdownController = new AbortController();
private updateNotesCountQueue: CollapsedQueue<MiNote['id'], number>;
constructor(
@Inject(DI.config)
private config: Config,
@Inject(DI.meta)
private meta: MiMeta,
@Inject(DI.db)
private db: DataSource,
@ -212,7 +212,6 @@ export class NoteCreateService implements OnApplicationShutdown {
private apDeliverManagerService: ApDeliverManagerService,
private apRendererService: ApRendererService,
private roleService: RoleService,
private metaService: MetaService,
private searchService: SearchService,
private notesChart: NotesChart,
private perUserNotesChart: PerUserNotesChart,
@ -221,7 +220,10 @@ export class NoteCreateService implements OnApplicationShutdown {
private utilityService: UtilityService,
private userBlockingService: UserBlockingService,
private cacheService: CacheService,
) { }
private latestNoteService: LatestNoteService,
) {
this.updateNotesCountQueue = new CollapsedQueue(60 * 1000 * 5, this.collapseNotesCount, this.performUpdateNotesCount);
}
@bindThis
public async create(user: {
@ -254,10 +256,8 @@ export class NoteCreateService implements OnApplicationShutdown {
if (data.channel != null) data.visibleUsers = [];
if (data.channel != null) data.localOnly = true;
const meta = await this.metaService.fetch();
if (data.visibility === 'public' && data.channel == null) {
const sensitiveWords = meta.sensitiveWords;
const sensitiveWords = this.meta.sensitiveWords;
if (this.utilityService.isKeyWordIncluded(data.cw ?? data.text ?? '', sensitiveWords)) {
data.visibility = 'home';
} else if ((await this.roleService.getUserPolicies(user.id)).canPublicNote === false) {
@ -265,17 +265,17 @@ export class NoteCreateService implements OnApplicationShutdown {
}
}
const hasProhibitedWords = await this.checkProhibitedWordsContain({
const hasProhibitedWords = this.checkProhibitedWordsContain({
cw: data.cw,
text: data.text,
pollChoices: data.poll?.choices,
}, meta.prohibitedWords);
}, this.meta.prohibitedWords);
if (hasProhibitedWords) {
throw new IdentifiableError('689ee33f-f97c-479a-ac49-1b9f8140af99', 'Note contains prohibited words');
}
const inSilencedInstance = this.utilityService.isSilencedHost(meta.silencedHosts, user.host);
const inSilencedInstance = this.utilityService.isSilencedHost(this.meta.silencedHosts, user.host);
if (data.visibility === 'public' && inSilencedInstance && user.host !== null) {
data.visibility = 'home';
@ -334,9 +334,13 @@ export class NoteCreateService implements OnApplicationShutdown {
data.localOnly = true;
}
const maxTextLength = user.host == null
? this.config.maxNoteLength
: this.config.maxRemoteNoteLength;
if (data.text) {
if (data.text.length > DB_MAX_NOTE_TEXT_LENGTH) {
data.text = data.text.slice(0, DB_MAX_NOTE_TEXT_LENGTH);
if (data.text.length > maxTextLength) {
data.text = data.text.slice(0, maxTextLength);
}
data.text = data.text.trim();
if (data.text === '') {
@ -346,6 +350,22 @@ export class NoteCreateService implements OnApplicationShutdown {
data.text = null;
}
const maxCwLength = user.host == null
? this.config.maxCwLength
: this.config.maxRemoteCwLength;
if (data.cw) {
if (data.cw.length > maxCwLength) {
data.cw = data.cw.slice(0, maxCwLength);
}
data.cw = data.cw.trim();
if (data.cw === '') {
data.cw = null;
}
} else {
data.cw = null;
}
let tags = data.apHashtags;
let emojis = data.apEmojis;
let mentionedUsers = data.apMentions;
@ -368,7 +388,7 @@ export class NoteCreateService implements OnApplicationShutdown {
}
// if the host is media-silenced, custom emojis are not allowed
if (this.utilityService.isMediaSilencedHost(meta.mediaSilencedHosts, user.host)) emojis = [];
if (this.utilityService.isMediaSilencedHost(this.meta.mediaSilencedHosts, user.host)) emojis = [];
tags = tags.filter(tag => Array.from(tag).length <= 128).splice(0, 32);
@ -537,10 +557,8 @@ export class NoteCreateService implements OnApplicationShutdown {
isBot: MiUser['isBot'];
noindex: MiUser['noindex'];
}, data: Option, silent: boolean, tags: string[], mentionedUsers: MinimumUser[]) {
const meta = await this.metaService.fetch();
this.notesChart.update(note, true);
if (note.visibility !== 'specified' && (meta.enableChartsForRemoteUser || (user.host == null))) {
if (note.visibility !== 'specified' && (this.meta.enableChartsForRemoteUser || (user.host == null))) {
this.perUserNotesChart.update(user, note, true);
}
@ -548,11 +566,11 @@ export class NoteCreateService implements OnApplicationShutdown {
if (this.userEntityService.isRemoteUser(user)) {
this.federatedInstanceService.fetch(user.host).then(async i => {
if (note.renote && note.text) {
this.instancesRepository.increment({ id: i.id }, 'notesCount', 1);
this.updateNotesCountQueue.enqueue(i.id, 1);
} else if (!note.renote) {
this.instancesRepository.increment({ id: i.id }, 'notesCount', 1);
this.updateNotesCountQueue.enqueue(i.id, 1);
}
if ((await this.metaService.fetch()).enableChartsForFederatedInstances) {
if (this.meta.enableChartsForFederatedInstances) {
this.instanceChart.updateNote(i.host, note, true);
}
});
@ -560,7 +578,7 @@ export class NoteCreateService implements OnApplicationShutdown {
// ハッシュタグ更新
if (data.visibility === 'public' || data.visibility === 'home') {
if (user.isBot && meta.enableBotTrending) {
if (user.isBot && this.meta.enableBotTrending) {
this.hashtagService.updateHashtags(user, tags);
} else if (!user.isBot) {
this.hashtagService.updateHashtags(user, tags);
@ -796,6 +814,9 @@ export class NoteCreateService implements OnApplicationShutdown {
});
}
// Update the Latest Note index / following feed
this.latestNoteService.handleCreatedNoteBG(note);
// Register to search database
if (!user.noindex) this.index(note);
}
@ -934,15 +955,14 @@ export class NoteCreateService implements OnApplicationShutdown {
@bindThis
private async pushToTl(note: MiNote, user: { id: MiUser['id']; host: MiUser['host']; }) {
const meta = await this.metaService.fetch();
if (!meta.enableFanoutTimeline) return;
if (!this.meta.enableFanoutTimeline) return;
const r = this.redisForTimelines.pipeline();
if (note.channelId) {
this.fanoutTimelineService.push(`channelTimeline:${note.channelId}`, note.id, this.config.perChannelMaxNoteCacheCount, r);
this.fanoutTimelineService.push(`userTimelineWithChannel:${user.id}`, note.id, note.userHost == null ? meta.perLocalUserUserTimelineCacheMax : meta.perRemoteUserUserTimelineCacheMax, r);
this.fanoutTimelineService.push(`userTimelineWithChannel:${user.id}`, note.id, note.userHost == null ? this.meta.perLocalUserUserTimelineCacheMax : this.meta.perRemoteUserUserTimelineCacheMax, r);
const channelFollowings = await this.channelFollowingsRepository.find({
where: {
@ -952,9 +972,9 @@ export class NoteCreateService implements OnApplicationShutdown {
});
for (const channelFollowing of channelFollowings) {
this.fanoutTimelineService.push(`homeTimeline:${channelFollowing.followerId}`, note.id, meta.perUserHomeTimelineCacheMax, r);
this.fanoutTimelineService.push(`homeTimeline:${channelFollowing.followerId}`, note.id, this.meta.perUserHomeTimelineCacheMax, r);
if (note.fileIds.length > 0) {
this.fanoutTimelineService.push(`homeTimelineWithFiles:${channelFollowing.followerId}`, note.id, meta.perUserHomeTimelineCacheMax / 2, r);
this.fanoutTimelineService.push(`homeTimelineWithFiles:${channelFollowing.followerId}`, note.id, this.meta.perUserHomeTimelineCacheMax / 2, r);
}
}
} else {
@ -992,9 +1012,9 @@ export class NoteCreateService implements OnApplicationShutdown {
if (!following.withReplies) continue;
}
this.fanoutTimelineService.push(`homeTimeline:${following.followerId}`, note.id, meta.perUserHomeTimelineCacheMax, r);
this.fanoutTimelineService.push(`homeTimeline:${following.followerId}`, note.id, this.meta.perUserHomeTimelineCacheMax, r);
if (note.fileIds.length > 0) {
this.fanoutTimelineService.push(`homeTimelineWithFiles:${following.followerId}`, note.id, meta.perUserHomeTimelineCacheMax / 2, r);
this.fanoutTimelineService.push(`homeTimelineWithFiles:${following.followerId}`, note.id, this.meta.perUserHomeTimelineCacheMax / 2, r);
}
}
@ -1011,25 +1031,25 @@ export class NoteCreateService implements OnApplicationShutdown {
if (!userListMembership.withReplies) continue;
}
this.fanoutTimelineService.push(`userListTimeline:${userListMembership.userListId}`, note.id, meta.perUserListTimelineCacheMax, r);
this.fanoutTimelineService.push(`userListTimeline:${userListMembership.userListId}`, note.id, this.meta.perUserListTimelineCacheMax, r);
if (note.fileIds.length > 0) {
this.fanoutTimelineService.push(`userListTimelineWithFiles:${userListMembership.userListId}`, note.id, meta.perUserListTimelineCacheMax / 2, r);
this.fanoutTimelineService.push(`userListTimelineWithFiles:${userListMembership.userListId}`, note.id, this.meta.perUserListTimelineCacheMax / 2, r);
}
}
// 自分自身のHTL
if (note.userHost == null) {
if (note.visibility !== 'specified' || !note.visibleUserIds.some(v => v === user.id)) {
this.fanoutTimelineService.push(`homeTimeline:${user.id}`, note.id, meta.perUserHomeTimelineCacheMax, r);
this.fanoutTimelineService.push(`homeTimeline:${user.id}`, note.id, this.meta.perUserHomeTimelineCacheMax, r);
if (note.fileIds.length > 0) {
this.fanoutTimelineService.push(`homeTimelineWithFiles:${user.id}`, note.id, meta.perUserHomeTimelineCacheMax / 2, r);
this.fanoutTimelineService.push(`homeTimelineWithFiles:${user.id}`, note.id, this.meta.perUserHomeTimelineCacheMax / 2, r);
}
}
}
// 自分自身以外への返信
if (isReply(note)) {
this.fanoutTimelineService.push(`userTimelineWithReplies:${user.id}`, note.id, note.userHost == null ? meta.perLocalUserUserTimelineCacheMax : meta.perRemoteUserUserTimelineCacheMax, r);
this.fanoutTimelineService.push(`userTimelineWithReplies:${user.id}`, note.id, note.userHost == null ? this.meta.perLocalUserUserTimelineCacheMax : this.meta.perRemoteUserUserTimelineCacheMax, r);
if (note.visibility === 'public' && note.userHost == null) {
this.fanoutTimelineService.push('localTimelineWithReplies', note.id, 300, r);
@ -1038,9 +1058,9 @@ export class NoteCreateService implements OnApplicationShutdown {
}
}
} else {
this.fanoutTimelineService.push(`userTimeline:${user.id}`, note.id, note.userHost == null ? meta.perLocalUserUserTimelineCacheMax : meta.perRemoteUserUserTimelineCacheMax, r);
this.fanoutTimelineService.push(`userTimeline:${user.id}`, note.id, note.userHost == null ? this.meta.perLocalUserUserTimelineCacheMax : this.meta.perRemoteUserUserTimelineCacheMax, r);
if (note.fileIds.length > 0) {
this.fanoutTimelineService.push(`userTimelineWithFiles:${user.id}`, note.id, note.userHost == null ? meta.perLocalUserUserTimelineCacheMax / 2 : meta.perRemoteUserUserTimelineCacheMax / 2, r);
this.fanoutTimelineService.push(`userTimelineWithFiles:${user.id}`, note.id, note.userHost == null ? this.meta.perLocalUserUserTimelineCacheMax / 2 : this.meta.perRemoteUserUserTimelineCacheMax / 2, r);
}
if (note.visibility === 'public' && note.userHost == null) {
@ -1099,9 +1119,9 @@ export class NoteCreateService implements OnApplicationShutdown {
}
}
public async checkProhibitedWordsContain(content: Parameters<UtilityService['concatNoteContentsForKeyWordCheck']>[0], prohibitedWords?: string[]) {
public checkProhibitedWordsContain(content: Parameters<UtilityService['concatNoteContentsForKeyWordCheck']>[0], prohibitedWords?: string[]) {
if (prohibitedWords == null) {
prohibitedWords = (await this.metaService.fetch()).prohibitedWords;
prohibitedWords = this.meta.prohibitedWords;
}
if (
@ -1117,12 +1137,23 @@ export class NoteCreateService implements OnApplicationShutdown {
}
@bindThis
public dispose(): void {
this.#shutdownController.abort();
private collapseNotesCount(oldValue: number, newValue: number) {
return oldValue + newValue;
}
@bindThis
public onApplicationShutdown(signal?: string | undefined): void {
this.dispose();
private async performUpdateNotesCount(id: MiNote['id'], incrBy: number) {
await this.instancesRepository.increment({ id: id }, 'notesCount', incrBy);
}
@bindThis
public async dispose(): Promise<void> {
this.#shutdownController.abort();
await this.updateNotesCountQueue.performAllNow();
}
@bindThis
public async onApplicationShutdown(signal?: string | undefined): Promise<void> {
await this.dispose();
}
}

View file

@ -6,8 +6,8 @@
import { Brackets, In } from 'typeorm';
import { Injectable, Inject } from '@nestjs/common';
import type { MiUser, MiLocalUser, MiRemoteUser } from '@/models/User.js';
import type { MiNote, IMentionedRemoteUsers } from '@/models/Note.js';
import type { InstancesRepository, NotesRepository, UsersRepository } from '@/models/_.js';
import { MiNote, IMentionedRemoteUsers } from '@/models/Note.js';
import type { InstancesRepository, MiMeta, NotesRepository, UsersRepository } from '@/models/_.js';
import { RelayService } from '@/core/RelayService.js';
import { FederatedInstanceService } from '@/core/FederatedInstanceService.js';
import { DI } from '@/di-symbols.js';
@ -19,12 +19,11 @@ import { GlobalEventService } from '@/core/GlobalEventService.js';
import { ApRendererService } from '@/core/activitypub/ApRendererService.js';
import { ApDeliverManagerService } from '@/core/activitypub/ApDeliverManagerService.js';
import { UserEntityService } from '@/core/entities/UserEntityService.js';
import { NoteEntityService } from '@/core/entities/NoteEntityService.js';
import { bindThis } from '@/decorators.js';
import { MetaService } from '@/core/MetaService.js';
import { SearchService } from '@/core/SearchService.js';
import { ModerationLogService } from '@/core/ModerationLogService.js';
import { isQuote, isRenote } from '@/misc/is-renote.js';
import { LatestNoteService } from '@/core/LatestNoteService.js';
@Injectable()
export class NoteDeleteService {
@ -32,6 +31,9 @@ export class NoteDeleteService {
@Inject(DI.config)
private config: Config,
@Inject(DI.meta)
private meta: MiMeta,
@Inject(DI.usersRepository)
private usersRepository: UsersRepository,
@ -42,18 +44,17 @@ export class NoteDeleteService {
private instancesRepository: InstancesRepository,
private userEntityService: UserEntityService,
private noteEntityService: NoteEntityService,
private globalEventService: GlobalEventService,
private relayService: RelayService,
private federatedInstanceService: FederatedInstanceService,
private apRendererService: ApRendererService,
private apDeliverManagerService: ApDeliverManagerService,
private metaService: MetaService,
private searchService: SearchService,
private moderationLogService: ModerationLogService,
private notesChart: NotesChart,
private perUserNotesChart: PerUserNotesChart,
private instanceChart: InstanceChart,
private latestNoteService: LatestNoteService,
) {}
/**
@ -109,10 +110,8 @@ export class NoteDeleteService {
}
//#endregion
const meta = await this.metaService.fetch();
this.notesChart.update(note, false);
if (meta.enableChartsForRemoteUser || (user.host == null)) {
if (this.meta.enableChartsForRemoteUser || (user.host == null)) {
this.perUserNotesChart.update(user, note, false);
}
@ -131,7 +130,7 @@ export class NoteDeleteService {
} else if (!note.renoteId) {
this.instancesRepository.decrement({ id: i.id }, 'notesCount', 1);
}
if ((await this.metaService.fetch()).enableChartsForFederatedInstances) {
if (this.meta.enableChartsForFederatedInstances) {
this.instanceChart.updateNote(i.host, note, false);
}
});
@ -148,6 +147,8 @@ export class NoteDeleteService {
userId: user.id,
});
this.latestNoteService.handleDeletedNoteBG(note);
if (deleter && (note.userId !== deleter.id)) {
const user = await this.usersRepository.findOneByOrFail({ id: note.userId });
this.moderationLogService.log(deleter, 'deleteNote', {

View file

@ -8,13 +8,12 @@ import * as mfm from '@transfem-org/sfm-js';
import { DataSource, In, IsNull, LessThan } from 'typeorm';
import * as Redis from 'ioredis';
import { Inject, Injectable, OnApplicationShutdown } from '@nestjs/common';
import RE2 from 're2';
import { extractMentions } from '@/misc/extract-mentions.js';
import { extractCustomEmojisFromMfm } from '@/misc/extract-custom-emojis-from-mfm.js';
import { extractHashtags } from '@/misc/extract-hashtags.js';
import type { IMentionedRemoteUsers } from '@/models/Note.js';
import { MiNote } from '@/models/Note.js';
import type { NoteEditRepository, ChannelFollowingsRepository, ChannelsRepository, FollowingsRepository, InstancesRepository, MiFollowing, MutingsRepository, NotesRepository, NoteThreadMutingsRepository, UserListMembershipsRepository, UserProfilesRepository, UsersRepository, PollsRepository } from '@/models/_.js';
import type { NoteEditRepository, ChannelFollowingsRepository, ChannelsRepository, FollowingsRepository, InstancesRepository, MiFollowing, MiMeta, MutingsRepository, NotesRepository, NoteThreadMutingsRepository, UserListMembershipsRepository, UserProfilesRepository, UsersRepository, PollsRepository } from '@/models/_.js';
import type { MiDriveFile } from '@/models/DriveFile.js';
import type { MiApp } from '@/models/App.js';
import { concat } from '@/misc/prelude/array.js';
@ -40,9 +39,7 @@ import { ApDeliverManagerService } from '@/core/activitypub/ApDeliverManagerServ
import { NoteReadService } from '@/core/NoteReadService.js';
import { RemoteUserResolveService } from '@/core/RemoteUserResolveService.js';
import { bindThis } from '@/decorators.js';
import { DB_MAX_NOTE_TEXT_LENGTH } from '@/const.js';
import { RoleService } from '@/core/RoleService.js';
import { MetaService } from '@/core/MetaService.js';
import { SearchService } from '@/core/SearchService.js';
import { FanoutTimelineService } from '@/core/FanoutTimelineService.js';
import { UtilityService } from '@/core/UtilityService.js';
@ -52,6 +49,9 @@ import { isReply } from '@/misc/is-reply.js';
import { trackPromise } from '@/misc/promise-tracker.js';
import { isUserRelated } from '@/misc/is-user-related.js';
import { IdentifiableError } from '@/misc/identifiable-error.js';
import { LatestNoteService } from '@/core/LatestNoteService.js';
import { CollapsedQueue } from '@/misc/collapsed-queue.js';
import { NoteCreateService } from '@/core/NoteCreateService.js';
type NotificationType = 'reply' | 'renote' | 'quote' | 'mention' | 'edited';
@ -145,11 +145,15 @@ type Option = {
@Injectable()
export class NoteEditService implements OnApplicationShutdown {
#shutdownController = new AbortController();
private updateNotesCountQueue: CollapsedQueue<MiNote['id'], number>;
constructor(
@Inject(DI.config)
private config: Config,
@Inject(DI.meta)
private meta: MiMeta,
@Inject(DI.db)
private db: DataSource,
@ -207,14 +211,17 @@ export class NoteEditService implements OnApplicationShutdown {
private apDeliverManagerService: ApDeliverManagerService,
private apRendererService: ApRendererService,
private roleService: RoleService,
private metaService: MetaService,
private searchService: SearchService,
private activeUsersChart: ActiveUsersChart,
private instanceChart: InstanceChart,
private utilityService: UtilityService,
private userBlockingService: UserBlockingService,
private cacheService: CacheService,
) { }
private latestNoteService: LatestNoteService,
private noteCreateService: NoteCreateService,
) {
this.updateNotesCountQueue = new CollapsedQueue(60 * 1000 * 5, this.collapseNotesCount, this.performUpdateNotesCount);
}
@bindThis
public async edit(user: {
@ -247,6 +254,11 @@ export class NoteEditService implements OnApplicationShutdown {
data.reply = undefined;
}
// changing visibility on an edit is ill-defined, let's try to
// keep the same visibility as the original note
data.visibility = oldnote.visibility;
data.localOnly = oldnote.localOnly;
// チャンネル外にリプライしたら対象のスコープに合わせる
// (クライアントサイドでやっても良い処理だと思うけどとりあえずサーバーサイドで)
if (data.reply && data.channel && data.reply.channelId !== data.channel.id) {
@ -270,10 +282,8 @@ export class NoteEditService implements OnApplicationShutdown {
if (data.channel != null) data.localOnly = true;
if (data.updatedAt == null) data.updatedAt = new Date();
const meta = await this.metaService.fetch();
if (data.visibility === 'public' && data.channel == null) {
const sensitiveWords = meta.sensitiveWords;
const sensitiveWords = this.meta.sensitiveWords;
if (this.utilityService.isKeyWordIncluded(data.cw ?? data.text ?? '', sensitiveWords)) {
data.visibility = 'home';
} else if ((await this.roleService.getUserPolicies(user.id)).canPublicNote === false) {
@ -281,17 +291,17 @@ export class NoteEditService implements OnApplicationShutdown {
}
}
const hasProhibitedWords = await this.checkProhibitedWordsContain({
const hasProhibitedWords = this.noteCreateService.checkProhibitedWordsContain({
cw: data.cw,
text: data.text,
pollChoices: data.poll?.choices,
}, meta.prohibitedWords);
}, this.meta.prohibitedWords);
if (hasProhibitedWords) {
throw new IdentifiableError('689ee33f-f97c-479a-ac49-1b9f8140af99', 'Note contains prohibited words');
}
const inSilencedInstance = this.utilityService.isSilencedHost((meta).silencedHosts, user.host);
const inSilencedInstance = this.utilityService.isSilencedHost(this.meta.silencedHosts, user.host);
if (data.visibility === 'public' && inSilencedInstance && user.host !== null) {
data.visibility = 'home';
@ -354,9 +364,13 @@ export class NoteEditService implements OnApplicationShutdown {
data.localOnly = true;
}
const maxTextLength = user.host == null
? this.config.maxNoteLength
: this.config.maxRemoteNoteLength;
if (data.text) {
if (data.text.length > DB_MAX_NOTE_TEXT_LENGTH) {
data.text = data.text.slice(0, DB_MAX_NOTE_TEXT_LENGTH);
if (data.text.length > maxTextLength) {
data.text = data.text.slice(0, maxTextLength);
}
data.text = data.text.trim();
if (data.text === '') {
@ -366,6 +380,22 @@ export class NoteEditService implements OnApplicationShutdown {
data.text = null;
}
const maxCwLength = user.host == null
? this.config.maxCwLength
: this.config.maxRemoteCwLength;
if (data.cw) {
if (data.cw.length > maxCwLength) {
data.cw = data.cw.slice(0, maxCwLength);
}
data.cw = data.cw.trim();
if (data.cw === '') {
data.cw = null;
}
} else {
data.cw = null;
}
let tags = data.apHashtags;
let emojis = data.apEmojis;
let mentionedUsers = data.apMentions;
@ -388,7 +418,7 @@ export class NoteEditService implements OnApplicationShutdown {
}
// if the host is media-silenced, custom emojis are not allowed
if (this.utilityService.isMediaSilencedHost(meta.mediaSilencedHosts, user.host)) emojis = [];
if (this.utilityService.isMediaSilencedHost(this.meta.mediaSilencedHosts, user.host)) emojis = [];
tags = tags.filter(tag => Array.from(tag ?? '').length <= 128).splice(0, 32);
@ -429,9 +459,6 @@ export class NoteEditService implements OnApplicationShutdown {
if (data.cw !== oldnote.cw) {
update.cw = data.cw;
}
if (data.localOnly !== oldnote.localOnly) {
update.localOnly = data.localOnly;
}
if (oldnote.hasPoll !== !!data.poll) {
update.hasPoll = !!data.poll;
}
@ -496,6 +523,7 @@ export class NoteEditService implements OnApplicationShutdown {
renoteUserId: data.renote ? data.renote.userId : null,
renoteUserHost: data.renote ? data.renote.userHost : null,
userHost: user.host,
reactionAndUserPairCache: oldnote.reactionAndUserPairCache,
});
if (data.uri != null) note.uri = data.uri;
@ -544,7 +572,7 @@ export class NoteEditService implements OnApplicationShutdown {
}
setImmediate('post edited', { signal: this.#shutdownController.signal }).then(
() => this.postNoteEdited(note, user, data, silent, tags!, mentionedUsers!),
() => this.postNoteEdited(note, oldnote, user, data, silent, tags!, mentionedUsers!),
() => { /* aborted, ignore this */ },
);
@ -555,7 +583,7 @@ export class NoteEditService implements OnApplicationShutdown {
}
@bindThis
private async postNoteEdited(note: MiNote, user: {
private async postNoteEdited(note: MiNote, oldNote: MiNote, user: {
id: MiUser['id'];
username: MiUser['username'];
host: MiUser['host'];
@ -565,8 +593,8 @@ export class NoteEditService implements OnApplicationShutdown {
// Register host
if (this.userEntityService.isRemoteUser(user)) {
this.federatedInstanceService.fetch(user.host).then(async i => {
this.instancesRepository.increment({ id: i.id }, 'notesCount', 1);
if ((await this.metaService.fetch()).enableChartsForFederatedInstances) {
this.updateNotesCountQueue.enqueue(i.id, 1);
if (this.meta.enableChartsForFederatedInstances) {
this.instanceChart.updateNote(i.host, note, true);
}
});
@ -752,6 +780,9 @@ export class NoteEditService implements OnApplicationShutdown {
});
}
// Update the Latest Note index / following feed
this.latestNoteService.handleUpdatedNoteBG(oldNote, note);
// Register to search database
if (!user.noindex) this.index(note);
}
@ -852,15 +883,14 @@ export class NoteEditService implements OnApplicationShutdown {
@bindThis
private async pushToTl(note: MiNote, user: { id: MiUser['id']; host: MiUser['host']; }) {
const meta = await this.metaService.fetch();
if (!meta.enableFanoutTimeline) return;
if (!this.meta.enableFanoutTimeline) return;
const r = this.redisForTimelines.pipeline();
if (note.channelId) {
this.fanoutTimelineService.push(`channelTimeline:${note.channelId}`, note.id, this.config.perChannelMaxNoteCacheCount, r);
this.fanoutTimelineService.push(`userTimelineWithChannel:${user.id}`, note.id, note.userHost == null ? meta.perLocalUserUserTimelineCacheMax : meta.perRemoteUserUserTimelineCacheMax, r);
this.fanoutTimelineService.push(`userTimelineWithChannel:${user.id}`, note.id, note.userHost == null ? this.meta.perLocalUserUserTimelineCacheMax : this.meta.perRemoteUserUserTimelineCacheMax, r);
const channelFollowings = await this.channelFollowingsRepository.find({
where: {
@ -870,9 +900,9 @@ export class NoteEditService implements OnApplicationShutdown {
});
for (const channelFollowing of channelFollowings) {
this.fanoutTimelineService.push(`homeTimeline:${channelFollowing.followerId}`, note.id, meta.perUserHomeTimelineCacheMax, r);
this.fanoutTimelineService.push(`homeTimeline:${channelFollowing.followerId}`, note.id, this.meta.perUserHomeTimelineCacheMax, r);
if (note.fileIds.length > 0) {
this.fanoutTimelineService.push(`homeTimelineWithFiles:${channelFollowing.followerId}`, note.id, meta.perUserHomeTimelineCacheMax / 2, r);
this.fanoutTimelineService.push(`homeTimelineWithFiles:${channelFollowing.followerId}`, note.id, this.meta.perUserHomeTimelineCacheMax / 2, r);
}
}
} else {
@ -910,9 +940,9 @@ export class NoteEditService implements OnApplicationShutdown {
if (!following.withReplies) continue;
}
this.fanoutTimelineService.push(`homeTimeline:${following.followerId}`, note.id, meta.perUserHomeTimelineCacheMax, r);
this.fanoutTimelineService.push(`homeTimeline:${following.followerId}`, note.id, this.meta.perUserHomeTimelineCacheMax, r);
if (note.fileIds.length > 0) {
this.fanoutTimelineService.push(`homeTimelineWithFiles:${following.followerId}`, note.id, meta.perUserHomeTimelineCacheMax / 2, r);
this.fanoutTimelineService.push(`homeTimelineWithFiles:${following.followerId}`, note.id, this.meta.perUserHomeTimelineCacheMax / 2, r);
}
}
@ -929,25 +959,25 @@ export class NoteEditService implements OnApplicationShutdown {
if (!userListMembership.withReplies) continue;
}
this.fanoutTimelineService.push(`userListTimeline:${userListMembership.userListId}`, note.id, meta.perUserListTimelineCacheMax, r);
this.fanoutTimelineService.push(`userListTimeline:${userListMembership.userListId}`, note.id, this.meta.perUserListTimelineCacheMax, r);
if (note.fileIds.length > 0) {
this.fanoutTimelineService.push(`userListTimelineWithFiles:${userListMembership.userListId}`, note.id, meta.perUserListTimelineCacheMax / 2, r);
this.fanoutTimelineService.push(`userListTimelineWithFiles:${userListMembership.userListId}`, note.id, this.meta.perUserListTimelineCacheMax / 2, r);
}
}
// 自分自身のHTL
if (note.userHost == null) {
if (note.visibility !== 'specified' || !note.visibleUserIds.some(v => v === user.id)) {
this.fanoutTimelineService.push(`homeTimeline:${user.id}`, note.id, meta.perUserHomeTimelineCacheMax, r);
this.fanoutTimelineService.push(`homeTimeline:${user.id}`, note.id, this.meta.perUserHomeTimelineCacheMax, r);
if (note.fileIds.length > 0) {
this.fanoutTimelineService.push(`homeTimelineWithFiles:${user.id}`, note.id, meta.perUserHomeTimelineCacheMax / 2, r);
this.fanoutTimelineService.push(`homeTimelineWithFiles:${user.id}`, note.id, this.meta.perUserHomeTimelineCacheMax / 2, r);
}
}
}
// 自分自身以外への返信
if (isReply(note)) {
this.fanoutTimelineService.push(`userTimelineWithReplies:${user.id}`, note.id, note.userHost == null ? meta.perLocalUserUserTimelineCacheMax : meta.perRemoteUserUserTimelineCacheMax, r);
this.fanoutTimelineService.push(`userTimelineWithReplies:${user.id}`, note.id, note.userHost == null ? this.meta.perLocalUserUserTimelineCacheMax : this.meta.perRemoteUserUserTimelineCacheMax, r);
if (note.visibility === 'public' && note.userHost == null) {
this.fanoutTimelineService.push('localTimelineWithReplies', note.id, 300, r);
@ -956,9 +986,9 @@ export class NoteEditService implements OnApplicationShutdown {
}
}
} else {
this.fanoutTimelineService.push(`userTimeline:${user.id}`, note.id, note.userHost == null ? meta.perLocalUserUserTimelineCacheMax : meta.perRemoteUserUserTimelineCacheMax, r);
this.fanoutTimelineService.push(`userTimeline:${user.id}`, note.id, note.userHost == null ? this.meta.perLocalUserUserTimelineCacheMax : this.meta.perRemoteUserUserTimelineCacheMax, r);
if (note.fileIds.length > 0) {
this.fanoutTimelineService.push(`userTimelineWithFiles:${user.id}`, note.id, note.userHost == null ? meta.perLocalUserUserTimelineCacheMax / 2 : meta.perRemoteUserUserTimelineCacheMax / 2, r);
this.fanoutTimelineService.push(`userTimelineWithFiles:${user.id}`, note.id, note.userHost == null ? this.meta.perLocalUserUserTimelineCacheMax / 2 : this.meta.perRemoteUserUserTimelineCacheMax / 2, r);
}
if (note.visibility === 'public' && note.userHost == null) {
@ -1017,30 +1047,24 @@ export class NoteEditService implements OnApplicationShutdown {
}
}
public async checkProhibitedWordsContain(content: Parameters<UtilityService['concatNoteContentsForKeyWordCheck']>[0], prohibitedWords?: string[]) {
if (prohibitedWords == null) {
prohibitedWords = (await this.metaService.fetch()).prohibitedWords;
}
if (
this.utilityService.isKeyWordIncluded(
this.utilityService.concatNoteContentsForKeyWordCheck(content),
prohibitedWords,
)
) {
return true;
}
return false;
@bindThis
private collapseNotesCount(oldValue: number, newValue: number) {
return oldValue + newValue;
}
@bindThis
public dispose(): void {
private async performUpdateNotesCount(id: MiNote['id'], incrBy: number) {
await this.instancesRepository.increment({ id: id }, 'notesCount', incrBy);
}
@bindThis
public async dispose(): Promise<void> {
this.#shutdownController.abort();
await this.updateNotesCountQueue.performAllNow();
}
@bindThis
public onApplicationShutdown(signal?: string | undefined): void {
this.dispose();
public async onApplicationShutdown(signal?: string | undefined): Promise<void> {
await this.dispose();
}
}

View file

@ -4,26 +4,25 @@
*/
import { Inject, Injectable } from '@nestjs/common';
import type { UsersRepository } from '@/models/_.js';
import type { MiMeta, UsersRepository } from '@/models/_.js';
import type { MiLocalUser } from '@/models/User.js';
import { DI } from '@/di-symbols.js';
import { MetaService } from '@/core/MetaService.js';
import { bindThis } from '@/decorators.js';
@Injectable()
export class ProxyAccountService {
constructor(
@Inject(DI.meta)
private meta: MiMeta,
@Inject(DI.usersRepository)
private usersRepository: UsersRepository,
private metaService: MetaService,
) {
}
@bindThis
public async fetch(): Promise<MiLocalUser | null> {
const meta = await this.metaService.fetch();
if (meta.proxyAccountId == null) return null;
return await this.usersRepository.findOneByOrFail({ id: meta.proxyAccountId }) as MiLocalUser;
if (this.meta.proxyAccountId == null) return null;
return await this.usersRepository.findOneByOrFail({ id: this.meta.proxyAccountId }) as MiLocalUser;
}
}

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