Compare commits

...

205 commits

Author SHA1 Message Date
Kimberly
afd6076c1f Translated using Weblate (Spanish)
Currently translated at 94.2% (1138 of 1208 strings)

Co-authored-by: Kimberly <kimisaes@gmail.com>
Translate-URL: http://translate.akkoma.dev/projects/foundkey/foundkey/es/
Translation: Foundkey/foundkey
2023-05-12 21:49:00 +00:00
386d1bbf74
fix: update meta cache between workers 2023-05-12 19:34:08 +02:00
e6c7f4b693
refactor: use switch for receiving IPC messages 2023-05-12 19:18:17 +02:00
ac81acfe9d
tests: disable timeouts for server setup 2023-05-08 00:07:40 +02:00
2e32715d36
fix typescript error TS1015 2023-05-07 23:42:51 +02:00
5a4e300552
tests: fix visibility tests
removed a duplicate test and fixed another that i messed up when
updating tests for the changed visibility
2023-05-07 23:38:29 +02:00
d8c2cc2ef0
tests: translate some japanese to english 2023-05-07 23:37:47 +02:00
3d4df807b0
tests: refactor ffVisibility tests
Using some closures to partly generate the tests to achieve better coverage
2023-05-07 23:35:29 +02:00
352851f23f
tests: fix error codes and HTTP statuses 2023-05-07 23:34:34 +02:00
eecff514c2
tests: use bearer authentication 2023-05-07 23:33:21 +02:00
605a55e1d4
tests: fix Resolver import 2023-05-07 23:32:23 +02:00
683584fe8f
update mocha 2023-05-07 23:29:55 +02:00
0df36490c7
fix lints in foundkey-js
Fixes all lints except '@typescript-eslint/no-explicit-any'.
2023-05-07 18:07:18 +02:00
7e1ea09458
fix some lints 2023-05-07 17:12:04 +02:00
a10b8875d9
run CI on pushes to main
Since PRs seem to be much rarer than pushes to main, it makes more sense
to do it this way. Perhaps in the future, it would make sense to run it on
all pushes, but the question would be how PRs are handled.
2023-05-07 15:26:14 +02:00
642c8bcca9
disable lint '@typescript-eslint/no-explicit-any' 2023-05-07 14:28:24 +02:00
8c377b6a1a
foundkey-js: remove ads, detailed instance metadata
The distinction for "DetailedInstanceMetadata" does no longer exist
since commit 9022ab9f2a.

The `DetailedInstanceMetadata` and `LiteInstanceMetadata` have
therefore been removed, leaving only `InstanceMetadata`.

Changelog: Removed
2023-05-07 14:23:11 +02:00
0ad0ab7589 Translated using Weblate (Russian)
Currently translated at 96.1% (1161 of 1208 strings)

Co-authored-by: Chloe Kudryavtsev <code@toast.bunkerlabs.net>
Translate-URL: http://translate.akkoma.dev/projects/foundkey/foundkey/ru/
Translation: Foundkey/foundkey
2023-05-05 10:11:46 +00:00
ogur4ik
7972540e3a Translated using Weblate (Russian)
Currently translated at 96.1% (1161 of 1208 strings)

Translated using Weblate (Russian)

Currently translated at 90.5% (1094 of 1208 strings)

Co-authored-by: ogur4ik <abrew1330@gmail.com>
Translate-URL: http://translate.akkoma.dev/projects/foundkey/foundkey/ru/
Translation: Foundkey/foundkey
2023-05-05 10:11:46 +00:00
34d55e2dda
server: better matching for MFM mentions
When rendering the HTML for outgoing activities, the mentions are now
matched case insensitive and should also work properly for IDNs. The
username is also compared case insensitive. Mentions of local users
are also handled properly independed of whether the hostname was given
or omitted.

The query to get mentions is now also only executed once instead of
for each mention individually.

Changelog: Fixed
2023-04-28 23:47:48 +02:00
kazari
1d99657a45 Translated using Weblate (Japanese)
Currently translated at 99.8% (1206 of 1208 strings)

Co-authored-by: kazari <6c577a54-aac9-482a-955e-745c858445e3@simplelogin.com>
Translate-URL: http://translate.akkoma.dev/projects/foundkey/foundkey/ja/
Translation: Foundkey/foundkey
2023-04-27 17:57:55 +00:00
mondstern
bd598cd9ba Translated using Weblate (Indonesian)
Currently translated at 92.1% (1113 of 1208 strings)

Co-authored-by: mondstern <mondstern@monocles.de>
Translate-URL: http://translate.akkoma.dev/projects/foundkey/foundkey/id/
Translation: Foundkey/foundkey
2023-04-27 17:57:55 +00:00
kazari
3ef304c6ff
Translated using Weblate (Japanese)
Currently translated at 99.8% (1206 of 1208 strings)

Co-authored-by: kazari <6c577a54-aac9-482a-955e-745c858445e3@simplelogin.com>
Translate-URL: http://translate.akkoma.dev/projects/foundkey/foundkey/ja/
Translation: Foundkey/foundkey
2023-04-21 21:11:54 +02:00
df40f29a65
Translated using Weblate (Dutch)
Currently translated at 26.5% (321 of 1208 strings)

Translated using Weblate (German)

Currently translated at 100.0% (1208 of 1208 strings)

Co-authored-by: Johann <johann@qwertqwefsday.eu>
Co-authored-by: Johann150 <johann.galle@protonmail.com>
Translate-URL: http://translate.akkoma.dev/projects/foundkey/foundkey/de/
Translate-URL: http://translate.akkoma.dev/projects/foundkey/foundkey/nl/
Translation: Foundkey/foundkey
2023-04-21 21:11:54 +02:00
69e5bc4e99
Translated using Weblate (Polish)
Currently translated at 100.0% (1208 of 1208 strings)

Translated using Weblate (Polish)

Currently translated at 100.0% (1205 of 1205 strings)

Co-authored-by: Jeder <jeder@jeder.pl>
Translate-URL: http://translate.akkoma.dev/projects/foundkey/foundkey/pl/
Translation: Foundkey/foundkey
2023-04-21 21:11:49 +02:00
3787f3650e
update code of conduct to v2.1 2023-04-21 18:28:19 +02:00
9b8438cdfc
server: system accounts cannot be registered
While refactoring the previous commit, it seemed like the previous
authors expected that a system account could be registered somehow
and that this would be an error condition. However, as now made
explicit with this, it is not possible to register a system account.

This means that any account by that name could only ever have been
created by the system itself so fetching them should be fine and not
an error condition.
2023-04-20 22:10:31 +02:00
688deda218
server: dont fail if system user exists
closes FoundKeyGang/FoundKey#378

Changelog: Fixed
2023-04-20 22:05:26 +02:00
3a73f2c3de
client: improve error message on failed upload
Changelog: Fixed
Ref: https://github.com/misskey-dev/misskey/issues/8574
2023-04-20 17:58:09 +02:00
4fbbfff145
activitypub: also check incoming activity host for block 2023-04-16 19:34:15 +02:00
5f4aab6d46
translate yet another japanese comment 2023-04-16 19:33:50 +02:00
75fd42b070
server: check for valid keyId URL before parse 2023-04-16 19:33:28 +02:00
f7bd210316
server: replace Array.find with Array.some 2023-04-16 13:32:36 +02:00
ba2b7ef43c
fix including suspended users in getter 2023-04-15 21:10:57 +02:00
9a085e9d42
fixup: add missing curly braces
This is a fixup for commit b14f3e8cdc.
2023-04-15 20:27:42 +02:00
b14f3e8cdc
server: properly handle logical deletion
closes FoundKeyGang/FoundKey#329
2023-04-15 19:04:07 +02:00
71dfd229b0
remove unnecessary code 2023-04-15 18:56:46 +02:00
7b8333a21f
server: refactor user getter to throw API error
Instead of throwing an IdentifiableError which then just always gets
converted into an ApiError, the getter can just throw the same ApiError
directly. This makes it more convenient to use and thus more endpoints
have been refactored to use it to reduce code repetition.
2023-04-15 18:56:42 +02:00
ae703cfe4b
server: check that channel id is specified 2023-04-15 18:14:57 +02:00
8c47f376dc
server: fix undefined variable in streaming API 2023-04-15 17:52:48 +02:00
ceayo
101b3334dd Translated using Weblate (Dutch)
Currently translated at 26.3% (318 of 1205 strings)

Co-authored-by: ceayo <ceayo@proton.me>
Translate-URL: http://translate.akkoma.dev/projects/foundkey/foundkey/nl/
Translation: Foundkey/foundkey
2023-04-14 15:57:50 +00:00
kazari
2f33f3409c Translated using Weblate (Japanese)
Currently translated at 99.6% (1201 of 1205 strings)

Co-authored-by: kazari <6c577a54-aac9-482a-955e-745c858445e3@simplelogin.com>
Translate-URL: http://translate.akkoma.dev/projects/foundkey/foundkey/ja/
Translation: Foundkey/foundkey
2023-04-14 15:57:49 +00:00
06fb9c0a75 Translated using Weblate (German)
Currently translated at 100.0% (1205 of 1205 strings)

Translated using Weblate (German)

Currently translated at 100.0% (1203 of 1203 strings)

Co-authored-by: Johann <johann@qwertqwefsday.eu>
Co-authored-by: Johann150 <johann.galle@protonmail.com>
Translate-URL: http://translate.akkoma.dev/projects/foundkey/foundkey/de/
Translation: Foundkey/foundkey
2023-04-14 15:57:49 +00:00
Weblate
7c83cfcaa9 Update translation files
Updated by "Cleanup translation files" hook in Weblate.

Update translation files

Updated by "Cleanup translation files" hook in Weblate.

Co-authored-by: Weblate <noreply@weblate.org>
Translate-URL: http://translate.akkoma.dev/projects/foundkey/foundkey/
Translation: Foundkey/foundkey
2023-04-14 15:57:49 +00:00
digny
95a9698286 Translated using Weblate (Japanese)
Currently translated at 99.8% (1201 of 1203 strings)

Translated using Weblate (Japanese)

Currently translated at 99.6% (1199 of 1203 strings)

Translated using Weblate (Japanese)

Currently translated at 97.5% (1174 of 1203 strings)

Co-authored-by: digny <newymroo@tutamail.com>
Translate-URL: http://translate.akkoma.dev/projects/foundkey/foundkey/ja/
Translation: Foundkey/foundkey
2023-04-14 15:57:49 +00:00
9c4d37a0f5 Translated using Weblate (German)
Currently translated at 100.0% (1203 of 1203 strings)

Translated using Weblate (German)

Currently translated at 99.7% (1201 of 1204 strings)

Co-authored-by: Johann <johann@qwertqwefsday.eu>
Co-authored-by: Johann150 <johann.galle@protonmail.com>
Translate-URL: http://translate.akkoma.dev/projects/foundkey/foundkey/de/
Translation: Foundkey/foundkey
2023-04-14 15:57:49 +00:00
Kimberly
84e8069f36 Translated using Weblate (Spanish)
Currently translated at 93.4% (1124 of 1203 strings)

Translated using Weblate (Spanish)

Currently translated at 93.2% (1123 of 1204 strings)

Translated using Weblate (Spanish)

Currently translated at 92.9% (1119 of 1204 strings)

Co-authored-by: Kimberly <kimisaes@gmail.com>
Translate-URL: http://translate.akkoma.dev/projects/foundkey/foundkey/es/
Translation: Foundkey/foundkey
2023-04-14 15:57:49 +00:00
e9586e6307 Translated using Weblate (Polish)
Currently translated at 100.0% (1205 of 1205 strings)

Translated using Weblate (Polish)

Currently translated at 100.0% (1205 of 1205 strings)

Translated using Weblate (Polish)

Currently translated at 100.0% (1200 of 1200 strings)

Co-authored-by: Jeder <jeder@jeder.pl>
Translate-URL: http://translate.akkoma.dev/projects/foundkey/foundkey/pl/
Translation: Foundkey/foundkey
2023-04-14 15:57:49 +00:00
kazari
92d6550e19 Translated using Weblate (Japanese)
Currently translated at 99.6% (1201 of 1205 strings)

Translated using Weblate (Japanese)

Currently translated at 99.8% (1201 of 1203 strings)

Translated using Weblate (Japanese)

Currently translated at 99.6% (1199 of 1203 strings)

Translated using Weblate (Japanese)

Currently translated at 97.5% (1174 of 1203 strings)

Translated using Weblate (Japanese)

Currently translated at 97.0% (1167 of 1203 strings)

Translated using Weblate (Japanese)

Currently translated at 96.6% (1163 of 1203 strings)

Translated using Weblate (Japanese)

Currently translated at 95.5% (1150 of 1204 strings)

Translated using Weblate (Japanese)

Currently translated at 94.7% (1137 of 1200 strings)

Co-authored-by: kazari <6c577a54-aac9-482a-955e-745c858445e3@simplelogin.com>
Translate-URL: http://translate.akkoma.dev/projects/foundkey/foundkey/ja/
Translation: Foundkey/foundkey
2023-04-14 15:57:48 +00:00
808ad2a505
server: HTTP signature requires date header
The default of the library used is to require either of the "date" or
"x-date" headers. It does not seem sensible to pass on this default.
It may be to fix federation with another software but that software
should be considered broken, and it does not seem reasonable to
potentially get an outdated signature just to fix federation with some
buggy software.
2023-04-13 11:04:35 +02:00
95ecdeabff
docs: Add note about SELinux volume mount option in Docker guide
Something that I've discovered while trying to run FoundKey's
docker-compose config on Podman via podman-compose on my Fedora laptop.
2023-04-12 00:35:34 -04:00
340874c252
BREAKING server: remove mediaIds parameter
This parameter is a duplicate of fileIds and was marked as deprecated
before. This removes that parameter and therefore simplifies the API
endpoint's schema.

Changelog: Removed
2023-04-10 15:07:44 +02:00
aa4475ab33
client: fix drive file menu definition 2023-04-08 23:49:14 +02:00
8db49f2624
client: fix drive layout 2023-04-08 22:45:19 +02:00
c265bffab6
client: tlap tlap 2023-04-02 19:46:05 +02:00
6d63a5321f
client: make drive desgin more responsive 2023-04-02 18:19:12 +02:00
8c690622a1
client: fix drive item updates inserting duplicates
The issue was that the detection in the drive component did not see the
contents of `paginationElem.items` because the ref was not properly
exposed. The value of the exposed property was a Proxy of an empty
array that was not a reference to the actual items array. Thus, when
checking if the item already exists or not, it never saw the item and
added it as if new.

closes FoundKeyGang/FoundKey#367
closes FoundKeyGang/FoundKey#368

Changelog: Fixed
2023-04-02 00:00:49 +02:00
83fec649ea
client: refactor drive stream API code 2023-04-01 23:53:51 +02:00
24db102679 Merge pull request 'docs: Add Docker install guide' (#348) from docs/docker into main
Reviewed-on: FoundKeyGang/FoundKey#348
2023-04-01 14:22:43 +00:00
079a9e29ce
server: replace IRC with issue tracker as preferred feedback
The IRC channel is not a reliable means of communication for feedback
because I don't use it (regularly).
2023-04-01 15:10:12 +02:00
7914fcfef2
client: open links in new tab
If links are clicked while holding Ctrl or clicked with middle mouse
button, they will be opened in a new tab.

Changelog: Fixed
2023-03-31 22:19:01 +02:00
1472c21cb6
activitypub: properly handle all scopes for renotes
This was not implemented because of concerns raised in
https://github.com/misskey-dev/misskey/issues/8261
about Mastodon incorrectly interpreting the scope on renotes.
However this bug seems to be fixed so it can now be implemented.

See also https://github.com/misskey-dev/misskey/pull/10291

Co-authored-by: Kagami Sascha Rosylight <saschanaz@outlook.com>
2023-03-31 07:59:20 +02:00
7a0c2acdf6
client: reposition drive search toggle 2023-03-29 19:02:22 +02:00
e9f68e65b7
server: fix rate limit for adding reactions
Adding a reaction may delete a previous reaction to the same note,
thus consequently this needs to be in the rate limiting group if this
happens. Otherwise the rate limit can be circumvented.

Changelog: Fixed
2023-03-28 22:50:04 +02:00
48405fba3b
server: fix rate limit error propagation
Changelog: Fixed
2023-03-28 22:49:58 +02:00
1171567db2
server: remove unused API parameters
Changelog: Removed
2023-03-28 19:36:10 +02:00
6179b2e5f0
server: add pagination to file attachment timeline
As a side effect this also makes the notes appear in chronological order.

Changelog: Changed
2023-03-27 20:46:26 +02:00
3747d7ecb1
client: add page 'notes with file attached' 2023-03-27 18:43:49 +02:00
e4932085a7
client: use switch instead of if/else chain 2023-03-27 17:36:52 +02:00
6722ccfc64
client: remove separate empty drive/empty folder messages
These messages are wrong when using the newly added filter and there
are no filtering results. Instead of adding yet another separate
message for an empty pagination, just show the default empty thingy
the pagination component provides already.
2023-03-26 13:40:26 +02:00
134c3b43e6
implement filtering and sorting in drive
The `sort` parameter for /api/drive/show is now more unified with
other endpoints which use +createdAt for sort instead of +created.

closes FoundKeyGang/FoundKey#109

Changelog: Added
2023-03-26 12:03:43 +02:00
aac6a93bae
client: center drive loading ui 2023-03-26 11:05:56 +02:00
7401a0b400
client: fix drive pagination parameters 2023-03-26 11:05:56 +02:00
68f9e3e0dd
server: change pagination of drive/show endpoint
This changes the pagination of the drive/show API endpoint to use the
offset variant of pagination and allows to specify a sorting.

closes FoundKeyGang/FoundKey#362
2023-03-26 11:05:55 +02:00
94d1cf75aa
server: unify drive object types in database
Minor adjustment: The 'name' columns have the same max length.

Major adjustment: Rename both columns to be "parentId" and update
all references of this name in the backend. API parameters are not
changed, since that would be an unnecessary breaking change.
2023-03-26 11:05:55 +02:00
701054b86e
replace NBSP with SP
How did this get here in the first place?
2023-03-26 10:57:12 +02:00
77602203b2
client: replace error UUIDs with error codes
The error UUIDs were removed from the backend and trying to match against the IDs
no longer works. This can produce confusing UI behaviour when displaying errors.

closes FoundKeyGang/FoundKey#363

Changelog: Fixed
2023-03-26 10:55:27 +02:00
9b7dcb4262
Update instructions to match changes in da246ce419 2023-03-25 01:42:33 -04:00
bc51450fea
implement receiveing account moves (#309)
Reviewed-on: FoundKeyGang/FoundKey#309
Changelog: Added
2023-03-23 21:47:26 +01:00
0ef05427c8
client: fix move notification locale string 2023-03-23 21:46:00 +01:00
aa428bd1a4
client: display moved information on profile 2023-03-23 21:46:00 +01:00
c1f7ad0c14
server: add movedTo to packed user 2023-03-23 21:45:59 +01:00
e78069d904
server: implement moveTo property on actors
Co-authored-by: Mary Strodl <ipadlover8322@gmail.com>
Co-authored-by: amybones <amy@spookygirl.boo >
2023-03-23 21:43:50 +01:00
72b8489ae7
client: display move notification 2023-03-23 21:10:17 +01:00
5ad18c8626
server: add migration for movedTo user/notif 2023-03-23 21:10:16 +01:00
910976a55b
server: implement receiving Move activities
For now only creates notifications.
2023-03-23 21:10:15 +01:00
3c2092935c
server: add object hint to resolvePerson 2023-03-23 21:10:14 +01:00
3311bd866b
add move notification type 2023-03-23 21:10:08 +01:00
c8a07e58f8
server: update summaly
- updates got (CVE-2022-33987)
- now properly preview XHTML pages

Changelog: Security
2023-03-23 20:32:31 +01:00
da246ce419 docs: Update install guide to use tag-merge strategy (#117)
Adapted from @toast 's guide: https://mk.toast.cafe/notes/93o9n4tfsi

Reviewed-on: FoundKeyGang/FoundKey#117
2023-03-23 16:34:01 +00:00
5662635d45 Update branch checked out to "main" 2023-03-22 18:39:04 -04:00
5ffcb9f235 remove docker-compose.yml.example command 2023-03-22 18:39:04 -04:00
b046718d1d Use docker compose down instead of stop 2023-03-22 18:39:04 -04:00
ecbe984315 Add suggestions from @EpicKitty 2023-03-22 18:39:04 -04:00
139ccd2580 docs: Add Docker install guide
Based on Misskey's Docker guide:
https://github.com/misskey-dev/misskey-hub/blob/main/src/en/docs/install/docker.md
2023-03-22 18:39:04 -04:00
7821bbc28d
add more activitypub details to READING 2023-03-22 23:03:10 +01:00
f1d7357e75
server: fix undefined variable in getOneApId
This is a fixup for commit 48fd543d0f.

closes FoundKeyGang/FoundKey#365
2023-03-22 18:30:56 +01:00
48363a90ef
client: fix undefined variable in drive component
closes FoundKeyGang/FoundKey#360
2023-03-21 19:25:41 +01:00
59da6063cb
client: fix download button in wavesurfer
closes FoundKeyGang/FoundKey#356
2023-03-19 13:05:05 +01:00
d3fbe5e382
BREAKING server: refactor streaming API data structures
Since looking up a channel by ID should be the most often needed use
case, the data structure is now more optimized towards this. The code
is also simplified by using optional chaining where possible.

In this vein, the server will now enforce that channel IDs are unique
and not reused.

Changelog: Changed
2023-03-19 12:39:57 +01:00
7e4148880b
server: improve comments in streaming API 2023-03-19 11:09:56 +01:00
806f757cc8
client: remove unused import 2023-03-19 11:00:45 +01:00
ed9b9210a9
server: remove some casting to any 2023-03-19 10:45:57 +01:00
af49f811c1
client: refactor away a variable 2023-03-19 10:26:51 +01:00
5391ae4a1b
client: list custom themes first 2023-03-19 10:26:37 +01:00
3cf728a664
client: don't use refs for themes
I am not sure why ref's were used here before, since all changes to
those refs could only be from the same page the user was already on.
It seems the ColdDeviceStorage.ref was causing some circular thingies
that went wrong.

closes FoundKeyGang/FoundKey#353

Changelog: Fixed
2023-03-19 10:15:19 +01:00
742fa37e2b
server: show worker mode in process name
Changelog: Added
2023-03-19 09:39:33 +01:00
00332ed37f
client: fix drive file selection
closes FoundKeyGang/FoundKey#358
2023-03-19 09:28:31 +01:00
ae0a7b668f
client: return themes when fetching them 2023-03-18 10:34:25 +01:00
Richard "EpicKitty" Bowey
79a9b04d25
put the migration in its place 2023-03-17 16:16:41 +01:00
32beda4344
server: improve error message for invalidating follows
This error was broken out to be a separate error code and message.

Changelog: Changed
2023-03-16 20:42:02 +01:00
d6837814d9
Merge branch 'drive-api-combined'
Reviewed-on: FoundKeyGang/FoundKey#297
2023-03-13 19:30:24 +01:00
syuilo
1274af05a4
remove unused instance settings 2023-03-12 16:28:07 +01:00
6a17dcf4de
server: refactor to group deletion deliveries
The `quiet` argument has been removed from `deleteNote` (or `deleteNotes`
respectively) since it was not used anywhere and it does not seem a good
idea to not update statistics in some cases.

This should also fix an issue where cascade deletions mean that statistics
are not properly updated or streaming clients not properly informed of
deletions. This case was seemingly not considered before, even though
there was some handling for cascade deleted notes.

This is going to improve how cascade deletion impacts the delivery queue,
because cascade-deleted notes will now be grouped for delivery.

Changelog: Fixed
2023-03-12 12:37:20 +01:00
383ea40704
server: add function to deliver multiple activities to a relay 2023-03-11 22:23:42 +01:00
e52cf25489
server: use named export for deleteNote 2023-03-11 09:54:46 +01:00
1bce487965
activitypub: allow to group elements for delivery 2023-03-11 09:42:14 +01:00
78c93c5539
server: clean up activitypub deliver code 2023-03-11 09:42:14 +01:00
2164fda2fb
server: do AP sent statistics in request function 2023-03-11 09:42:05 +01:00
180a1c968d
remove unused locale string 2023-03-11 01:15:33 +01:00
4f6d6b681e
client: remove unused assets 2023-03-08 22:34:24 +01:00
0d470387dd
client: replace misskey icon 2023-03-08 22:32:05 +01:00
d0a021c868
client: properly center instance information 2023-03-08 21:22:11 +01:00
f455075efc
fixup: add missing import of copyToClipboard
This is a fixup for commit 74c2b79df1.
2023-03-06 00:50:01 +01:00
95afbf11ab
client: show follow button when not logged in
Changelog: Added
2023-03-06 00:41:24 +01:00
fbfbe4a72e
client: show remote interaction dialog for follow button
Changelog: Fixed
2023-03-06 00:41:16 +01:00
57241cdffe
client: remove unused code 2023-03-05 23:35:18 +01:00
ba1c4e76b9
client: give instructions on remote interaction
closes FoundKeyGang/FoundKey#279

Changelog: Added
2023-03-05 22:48:57 +01:00
8e1adfa03a
reduce remote interact dialog width 2023-03-05 14:26:02 +01:00
2759cd8174
fix formatting on remote url link 2023-03-05 14:15:24 +01:00
74c2b79df1
remove key-value component from remote interaction dialog 2023-03-05 14:10:41 +01:00
79ec44aa2c
fix variable name 2023-03-05 12:24:35 +01:00
59a7f10fdc
client: change remote interaction dialog title 2023-03-05 12:15:15 +01:00
f2350e6eba
client: add remote interaction dialog 2023-03-04 00:37:28 +01:00
49ae56a9e9
client: refactor to pleaseLoginOrRemote 2023-03-04 00:08:12 +01:00
5a263ec2c3
client: refactor pleaseLogin to pleaseLoginOrPage 2023-03-04 00:01:17 +01:00
559a17cf26
add FIXME comment 2023-03-03 23:54:42 +01:00
691c9d4972
fix typo 2023-03-03 23:47:31 +01:00
ae1e7883e7
improve docs files 2023-03-03 23:46:45 +01:00
ee2860e894
improve docs 2023-03-03 23:36:15 +01:00
a750c7ad57
server: remove unused avgColor attribute from types 2023-03-03 21:36:21 +01:00
5aa5344f2e
docs: fix schema definitions 2023-03-03 21:12:44 +01:00
68c0fa91bc Translated using Weblate (Polish)
Currently translated at 77.0% (925 of 1200 strings)

Translated using Weblate (Japanese (Kansai))

Currently translated at 63.0% (757 of 1200 strings)

Translated using Weblate (Italian)

Currently translated at 85.6% (1028 of 1200 strings)

Translated using Weblate (Indonesian)

Currently translated at 92.7% (1113 of 1200 strings)

Co-authored-by: Johann <johann@qwertqwefsday.eu>
Co-authored-by: Johann150 <johann.galle@protonmail.com>
Translate-URL: http://translate.akkoma.dev/projects/foundkey/foundkey/id/
Translate-URL: http://translate.akkoma.dev/projects/foundkey/foundkey/it/
Translate-URL: http://translate.akkoma.dev/projects/foundkey/foundkey/ja_KS/
Translate-URL: http://translate.akkoma.dev/projects/foundkey/foundkey/pl/
Translation: Foundkey/foundkey
2023-02-27 18:01:08 +00:00
6f3504a12e Translated using Weblate (Polish)
Currently translated at 77.4% (929 of 1200 strings)

Translated using Weblate (Polish)

Currently translated at 77.0% (925 of 1200 strings)

Translated using Weblate (Polish)

Currently translated at 77.0% (924 of 1200 strings)

Co-authored-by: Jeder <jeder@jeder.pl>
Translate-URL: http://translate.akkoma.dev/projects/foundkey/foundkey/pl/
Translation: Foundkey/foundkey
2023-02-27 18:01:08 +00:00
f68c41dd41 meta: Update Yarn to 3.4.1 2023-02-27 13:00:22 -05:00
e2063f4ff9
fix: correctly parse quotes 2023-02-24 23:47:50 +01:00
a5b0f5cb65
translation: change Polish _lang_ 2023-02-24 21:19:00 +01:00
145a949480
client: show own pages as first tab 2023-02-24 20:28:19 +01:00
e4a7e9f9b0
clarify that translation updates dont go in the changelog 2023-02-24 20:09:19 +01:00
Weblate
1dc2a6e452 Update translation files
Updated by "Remove blank strings" hook in Weblate.

Update translation files

Updated by "Remove blank strings" hook in Weblate.

Co-authored-by: Weblate <noreply@weblate.org>
Translate-URL: http://translate.akkoma.dev/projects/foundkey/foundkey/
Translation: Foundkey/foundkey
2023-02-24 18:48:06 +00:00
8ba8a1cd60 Translated using Weblate (French)
Currently translated at 99.8% (1198 of 1200 strings)

Co-authored-by: Chloe Kudryavtsev <code@toast.bunkerlabs.net>
Translate-URL: http://translate.akkoma.dev/projects/foundkey/foundkey/fr/
Translation: Foundkey/foundkey
2023-02-24 18:48:06 +00:00
765cb36d02 Translated using Weblate (Chinese (Traditional))
Currently translated at 92.5% (1110 of 1200 strings)

Translated using Weblate (Chinese (Simplified))

Currently translated at 92.5% (1110 of 1200 strings)

Translated using Weblate (Vietnamese)

Currently translated at 92.5% (1111 of 1200 strings)

Translated using Weblate (Ukrainian)

Currently translated at 81.2% (975 of 1200 strings)

Translated using Weblate (Turkish)

Currently translated at 4.0% (49 of 1200 strings)

Translated using Weblate (Slovak)

Currently translated at 92.5% (1110 of 1200 strings)

Translated using Weblate (Russian)

Currently translated at 91.0% (1092 of 1200 strings)

Translated using Weblate (Dutch)

Currently translated at 26.2% (315 of 1200 strings)

Translated using Weblate (Japanese (Kansai))

Currently translated at 63.0% (757 of 1200 strings)

Translated using Weblate (Italian)

Currently translated at 85.6% (1028 of 1200 strings)

Translated using Weblate (Indonesian)

Currently translated at 92.7% (1113 of 1200 strings)

Translated using Weblate (Spanish)

Currently translated at 83.0% (996 of 1200 strings)

Translated using Weblate (German)

Currently translated at 100.0% (1200 of 1200 strings)

Translated using Weblate (Catalan)

Currently translated at 10.8% (130 of 1200 strings)

Translated using Weblate (Bengali (Bangladesh))

Currently translated at 92.5% (1111 of 1200 strings)

Translated using Weblate (Arabic (Saudi Arabia))

Currently translated at 87.1% (1046 of 1200 strings)

Co-authored-by: Johann <johann@qwertqwefsday.eu>
Co-authored-by: Johann150 <johann.galle@protonmail.com>
Translate-URL: http://translate.akkoma.dev/projects/foundkey/foundkey/ar_SA/
Translate-URL: http://translate.akkoma.dev/projects/foundkey/foundkey/bn_BD/
Translate-URL: http://translate.akkoma.dev/projects/foundkey/foundkey/ca/
Translate-URL: http://translate.akkoma.dev/projects/foundkey/foundkey/de/
Translate-URL: http://translate.akkoma.dev/projects/foundkey/foundkey/es/
Translate-URL: http://translate.akkoma.dev/projects/foundkey/foundkey/id/
Translate-URL: http://translate.akkoma.dev/projects/foundkey/foundkey/it/
Translate-URL: http://translate.akkoma.dev/projects/foundkey/foundkey/ja_KS/
Translate-URL: http://translate.akkoma.dev/projects/foundkey/foundkey/nl/
Translate-URL: http://translate.akkoma.dev/projects/foundkey/foundkey/ru/
Translate-URL: http://translate.akkoma.dev/projects/foundkey/foundkey/sk/
Translate-URL: http://translate.akkoma.dev/projects/foundkey/foundkey/tr/
Translate-URL: http://translate.akkoma.dev/projects/foundkey/foundkey/uk/
Translate-URL: http://translate.akkoma.dev/projects/foundkey/foundkey/vi/
Translate-URL: http://translate.akkoma.dev/projects/foundkey/foundkey/zh_Hans/
Translate-URL: http://translate.akkoma.dev/projects/foundkey/foundkey/zh_Hant/
Translation: Foundkey/foundkey
2023-02-24 18:48:06 +00:00
c4c97f19b6
client: fix follow requests pagination
Changelog: Fixed
2023-02-24 19:47:52 +01:00
57e4971214
Revert "server: fix return of visibilityQuery function"
This reverts commit 32f4bee5e8.

It is the right thing to do in theory, but it doesn't work.
I hate typeorm.
2023-02-21 21:16:28 +01:00
32f4bee5e8
server: fix return of visibilityQuery function 2023-02-21 21:04:38 +01:00
c8731333ba
server: add new deepl languages
DeepL now also supports Norwegian (Bokmål) and Korean.

Ref: https://www.deepl.com/en/blog/welcome-korean-and-norwegian
Changelog: Added
2023-02-21 18:24:29 +01:00
0a7352eda9
server: add diagnostics for failing visibility 2023-02-20 21:08:58 +01:00
c777c2ed04
fix: perform visibility query in second stage 2023-02-20 21:08:58 +01:00
8f5952bb7d
server: handle note visibility in SQL
This allows to check visibility recursively, which should hopefully
solve problems with timelines not showing up properly.

Changelog: Changed
2023-02-20 21:08:47 +01:00
73d546372e
refactor: replace import paths containing ../ in API server
This is a big one...
2023-02-19 23:36:15 +01:00
e701bdadbe
foundkey.js: adjust API endpoints for user administration 2023-02-19 23:36:14 +01:00
2fda599a86
client: adjust API endpoints for user administration 2023-02-19 23:36:13 +01:00
bfd1adf761
BREAKING server: restructure endpoints related to user administration
- `admin/abuse-user-reports` -> `admin/reports/list`
- `admin/delete-all-files-of-a-user` -> `admin/users/delete-all-files`
- `admin/resolve-abuse-user-report` -> `admin/reports/resolve`
- `admin/accounts/create` -> `admin/users/create`
- `admin/accounts/delete` -> `admin/users/delete`
- `admin/show-user` -> `admin/users/show`
- `admin/show-users` -> `admin/users`
- `admin/silence-user` -> `admin/users/silence`
- `admin/suspend-user` -> `admin/users/suspend`
- `admin/unsilence-user` -> `admin/users/unsilence`
- `admin/unsuspend-user` -> `admin/users/unsuspend`
- `admin/reset-password` -> `admin/users/reset-password`

Changelog: Changed
2023-02-19 23:36:13 +01:00
41aa5cd18f
fix typo 2023-02-19 23:32:36 +01:00
17c9a9374d
fixup: server: parse quote tag syntax
This is a fixup for commit 5893a44ff5.
2023-02-19 19:41:11 +01:00
f207d839c4
fix changelog formatting 2023-02-19 16:55:37 +01:00
f103c86d0a
client: show waveform on audio player
Reviewed-on: FoundKeyGang/FoundKey#345
Changelog: Added
2023-02-19 16:25:08 +01:00
a6461e74d6 yay typo 2023-02-19 15:38:29 +01:00
5dd2b9ff61 fix duration format and add hours 2023-02-19 15:36:01 +01:00
98acca0a31 instead of ref 2023-02-19 15:27:20 +01:00
b85e60df0f pause music while seeking 2023-02-19 15:22:53 +01:00
add309f189 v-else 2023-02-19 15:05:22 +01:00
3acf127e1d
client: improved module tracker file detection
Reviewed-on: FoundKeyGang/FoundKey#344
Changelog: Fixed
2023-02-19 15:03:44 +01:00
3152630f27 cleanup audioEl and volumechange 2023-02-19 15:03:40 +01:00
4de0b4e4ca use includes instead of some 2023-02-19 15:01:23 +01:00
2da92eb075 lets do some wavesurfin' :3c 2023-02-19 11:44:18 +01:00
105aa511ce
Revert "client: display post content behind UI"
It doesn't work and the z-index behaviour is confusing me :(

This reverts commits 2525b59bb6
and 89757363f0.
2023-02-19 10:48:11 +01:00
eb6dbca9fd additional detection with mime-types in module tracker 2023-02-19 10:29:20 +01:00
f323c65dde Translated using Weblate (Swedish)
Currently translated at 22.9% (275 of 1200 strings)

Translated using Weblate (French)

Currently translated at 97.3% (1168 of 1200 strings)

Translated using Weblate (German)

Currently translated at 100.0% (1200 of 1200 strings)

Co-authored-by: Johann <johann@qwertqwefsday.eu>
Co-authored-by: Johann150 <johann.galle@protonmail.com>
Translate-URL: http://translate.akkoma.dev/projects/foundkey/foundkey/de/
Translate-URL: http://translate.akkoma.dev/projects/foundkey/foundkey/fr/
Translate-URL: http://translate.akkoma.dev/projects/foundkey/foundkey/sv/
Translation: Foundkey/foundkey
2023-02-18 21:50:43 +00:00
Mykola Yaroshenko
8887605e1b Translated using Weblate (Ukrainian)
Currently translated at 81.4% (975 of 1197 strings)

Co-authored-by: Mykola Yaroshenko <alokim@gmail.com>
Translate-URL: http://translate.akkoma.dev/projects/foundkey/foundkey/uk/
Translation: Foundkey/foundkey
2023-02-18 21:50:43 +00:00
Weblate
f66560fa90 Update translation files
Updated by "Cleanup translation files" hook in Weblate.

Update translation files

Updated by "Cleanup translation files" hook in Weblate.

Update translation files

Updated by "Cleanup translation files" hook in Weblate.

Update translation files

Updated by "Cleanup translation files" hook in Weblate.

Update translation files

Updated by "Cleanup translation files" hook in Weblate.

Co-authored-by: Weblate <noreply@weblate.org>
Translate-URL: http://translate.akkoma.dev/projects/foundkey/foundkey/
Translation: Foundkey/foundkey
2023-02-18 21:50:43 +00:00
89757363f0
fixup: client: display post content behind UI
This is a fixup for commit 2525b59bb6.
2023-02-18 19:11:49 +01:00
3e9dd7957d
server: dont error on generating empty RSS feed
Changelog: Fixed
2023-02-18 17:43:27 +01:00
0cf8f78e23
client: fix attached files and account switcher combination
fixes FoundKeyGang/FoundKey#342

Changelog: Fixed
2023-02-18 12:30:45 +01:00
0db3f1f8ed
client: re-add flag to require approval for bot follows
This flag was already implemented in the server but not accessible
in the native client for some reason.

Changelog: Added
2023-02-18 11:31:01 +01:00
2525b59bb6
client: display post content behind UI 2023-02-18 11:17:42 +01:00
8993d83114
replace more misskey & github branding 2023-02-17 12:49:04 +01:00
fd8fc301b4
client: fix border radius on icon on welcome page
The border radius on the welcome page clipped the foundkey floofer.
2023-02-16 21:49:47 +01:00
6aeb033507
client: change Misskey to Foundkey 2023-02-16 21:49:02 +01:00
acaca35ff7
client: fix authentication error in RSS widgets
closes FoundKeyGang/FoundKey#341

Changelog: Fixed
2023-02-15 20:42:40 +01:00
bf445964b5
improve documentation for fetch-rss endpoint
Changelog: Fixed
2023-02-15 20:42:24 +01:00
1ffa4b08e0
client: reformat notification component
who the hell is supposed to read this
2023-02-11 19:25:51 +01:00
c9d395961e
server: refactor packing User 2023-02-11 19:17:11 +01:00
3a7e8cfe50
server: check instance description length limit
Changelog: Fixed
2023-02-11 19:16:28 +01:00
b8796cb1fa
activitypub: remove _misskey_votes property
This is a duplication of `replies.totalItems` and seems unnecessary,
it is even only parsed by Misskey if the afforementioned property is
not available.

Changelog: Removed
2023-02-11 17:49:12 +01:00
68bc2e314b
activitypub: remove _misskey_reaction property
This property is duplicated by the `content` property so seems unnecessary.

Changelog: Removed
2023-02-11 17:43:44 +01:00
fff93c6965
activitypub: remove _misskey_content attribute
As already noted back in https://github.com/misskey-dev/misskey/pull/8787
the intention was to replace the `_misskey_content` attribute with the
ActivityPub-defined `source` property. Misskey and by extension Foundkey
have shipped with the `source` property and the respective parsing for
quite a while so it seems reasonable to remove it now.

Changelog: Removed
2023-02-11 17:25:24 +01:00
02aaee6050
client: select folder when entering it
As a convenience when a user is in the "select a folder" dialog,
opens a folder an then clicks on the checkmark, the currently open folder
is selected.
2022-12-23 02:21:52 +01:00
d26e2588e3
client: combine selection of files & folders 2022-12-23 02:20:36 +01:00
df9064c284
client: remove driveFolderBg theme color
Changelog: Removed
2022-12-23 02:02:20 +01:00
f7c4107ca4
client: drive uses grid instead of flexbox 2022-12-22 18:55:06 +01:00
c983c4860c
client: use combined drive endpoint 2022-12-22 17:55:13 +01:00
d96070bc80
client: fix duplicate folder when creating new folder 2022-12-22 17:32:05 +01:00
240cf98920
client: refactor drive drag&drop 2022-12-22 17:06:52 +01:00
7b39483966
server: drive endpoint to fetch files and folders
Changelog: Added
2022-12-22 16:46:48 +01:00
511 changed files with 5356 additions and 3770 deletions

View file

@ -8,15 +8,15 @@ clone:
pipeline:
install:
when:
event:
- pull_request
branch: main
event: push
image: node:18.6.0
commands:
- yarn install
build:
when:
event:
- pull_request
branch: main
event: push
image: node:18.6.0
commands:
- yarn build

View file

@ -8,15 +8,15 @@ clone:
pipeline:
install:
when:
event:
- pull_request
branch: main
event: push
image: node:18.6.0
commands:
- yarn install
lint:
when:
event:
- pull_request
branch: main
event: push
image: node:18.6.0
commands:
- yarn workspace backend run lint

View file

@ -8,15 +8,15 @@ clone:
pipeline:
install:
when:
event:
- pull_request
branch: main
event: push
image: node:18.6.0
commands:
- yarn install
lint:
when:
event:
- pull_request
branch: main
event: push
image: node:18.6.0
commands:
- yarn workspace client run lint

View file

@ -8,15 +8,15 @@ clone:
pipeline:
install:
when:
event:
- pull_request
branch: main
event: push
image: node:18.6.0
commands:
- yarn install
lint:
when:
event:
- pull_request
branch: main
event: push
image: node:18.6.0
commands:
- yarn workspace foundkey-js run lint

View file

@ -8,15 +8,15 @@ clone:
pipeline:
install:
when:
event:
- pull_request
branch: main
event: push
image: node:18.6.0
commands:
- yarn install
lint:
when:
event:
- pull_request
branch: main
event: push
image: node:18.6.0
commands:
- yarn workspace sw run lint

View file

@ -5,11 +5,14 @@ clone:
depth: 1 # CI does not need commit history
recursive: true
depends_on:
- build
pipeline:
build:
when:
event:
- pull_request
branch: main
event: push
image: node:18.6.0
commands:
- yarn install
@ -18,15 +21,15 @@ pipeline:
- yarn build
mocha:
when:
event:
- pull_request
branch: main
event: push
image: node:18.6.0
commands:
- yarn mocha
e2e:
when:
event:
- pull_request
branch: main
event: push
image: cypress/included:10.3.0
commands:
- npm run start:test &

File diff suppressed because one or more lines are too long

873
.yarn/releases/yarn-3.4.1.cjs vendored Executable file

File diff suppressed because one or more lines are too long

View file

@ -8,4 +8,4 @@ plugins:
- path: .yarn/plugins/@yarnpkg/plugin-workspace-tools.cjs
spec: "@yarnpkg/plugin-workspace-tools"
yarnPath: .yarn/releases/yarn-3.3.0.cjs
yarnPath: .yarn/releases/yarn-3.4.1.cjs

View file

@ -86,8 +86,6 @@ This release contains 6 breaking changes, including changes to the configuration
### Removed:
- **BREAKING** server: remove Twitter, Github and Discord integrations
ff31b8b06 server: remove bios and cli
a673647fb server: remove avatarColor and bannerColor properties
- **BREAKING** server: remove `api/admin/delete-account`,
You should use the API endpoint `admin/accounts/delete` instead.
It has the same parameter and the same behaviour.
@ -108,6 +106,8 @@ a673647fb server: remove avatarColor and bannerColor properties
- `/api/i/gallery/likes`
- `/api/i/gallery/posts`
- `/api/users/gallery/posts`
- server: remove bios and cli
- server: remove avatarColor and bannerColor properties
- server: remove application level websocket ping
This pinging mechanism was unused in `foundkey-js`, and we expect other usage to be low.
You can use the pinging mechanism built into the websocket protocol if you wish.

View file

@ -1,46 +1,134 @@
# Contributor Covenant Code of Conduct
## Our Pledge
In the interest of fostering an open and welcoming environment, we as contributors and maintainers pledge to making participation in our project and our community a harassment-free experience for everyone, regardless of age, body size, disability, ethnicity, gender identity and expression, level of experience, nationality, personal appearance, race, religion, or sexual identity and orientation.
We as members, contributors, and leaders pledge to make participation in our
community a harassment-free experience for everyone, regardless of age, body
size, visible or invisible disability, ethnicity, sex characteristics, gender
identity and expression, level of experience, education, socio-economic status,
nationality, personal appearance, race, caste, color, religion, or sexual
identity and orientation.
We pledge to act and interact in ways that contribute to an open, welcoming,
diverse, inclusive, and healthy community.
## Our Standards
Examples of behavior that contributes to creating a positive environment include:
Examples of behavior that contributes to a positive environment for our
community include:
* Using welcoming and inclusive language
* Being respectful of differing viewpoints and experiences
* Gracefully accepting constructive criticism
* Focusing on what is best for the community
* Showing empathy towards other community members
* Demonstrating empathy and kindness toward other people
* Being respectful of differing opinions, viewpoints, and experiences
* Giving and gracefully accepting constructive feedback
* Accepting responsibility and apologizing to those affected by our mistakes,
and learning from the experience
* Focusing on what is best not just for us as individuals, but for the overall
community
Examples of unacceptable behavior by participants include:
Examples of unacceptable behavior include:
* The use of sexualized language or imagery and unwelcome sexual attention or advances
* Trolling, insulting/derogatory comments, and personal or political attacks
* The use of sexualized language or imagery, and sexual attention or advances of
any kind
* Trolling, insulting or derogatory comments, and personal or political attacks
* Public or private harassment
* Publishing others' private information, such as a physical or electronic address, without explicit permission
* Other conduct which could reasonably be considered inappropriate in a professional setting
* Publishing others' private information, such as a physical or email address,
without their explicit permission
* Other conduct which could reasonably be considered inappropriate in a
professional setting
## Our Responsibilities
## Enforcement Responsibilities
Project maintainers are responsible for clarifying the standards of acceptable behavior and are expected to take appropriate and fair corrective action in response to any instances of unacceptable behavior.
Community leaders are responsible for clarifying and enforcing our standards of
acceptable behavior and will take appropriate and fair corrective action in
response to any behavior that they deem inappropriate, threatening, offensive,
or harmful.
Project maintainers have the right and responsibility to remove, edit, or reject comments, commits, code, wiki edits, issues, and other contributions that are not aligned to this Code of Conduct, or to ban temporarily or permanently any contributor for other behaviors that they deem inappropriate, threatening, offensive, or harmful.
Community leaders have the right and responsibility to remove, edit, or reject
comments, commits, code, wiki edits, issues, and other contributions that are
not aligned to this Code of Conduct, and will communicate reasons for moderation
decisions when appropriate.
## Scope
This Code of Conduct applies both within project spaces and in public spaces when an individual is representing the project or its community. Examples of representing a project or community include using an official project e-mail address, posting via an official social media account, or acting as an appointed representative at an online or offline event. Representation of a project may be further defined and clarified by project maintainers.
This Code of Conduct applies within all community spaces, and also applies when
an individual is officially representing the community in public spaces.
Examples of representing our community include using an official e-mail address,
posting via an official social media account, or acting as an appointed
representative at an online or offline event.
## Enforcement
Instances of abusive, harassing, or otherwise unacceptable behavior may be reported by contacting the project team at syuilotan@yahoo.co.jp. The project team will review and investigate all complaints, and will respond in a way that it deems appropriate to the circumstances. The project team is obligated to maintain confidentiality with regard to the reporter of an incident. Further details of specific enforcement policies may be posted separately.
Instances of abusive, harassing, or otherwise unacceptable behavior may be
reported to the community leaders responsible for enforcement via email at
johann<EFBFBD>qwertqwefsday.eu and/or toast<73>bunkerlabs.net .
All complaints will be reviewed and investigated promptly and fairly.
Project maintainers who do not follow or enforce the Code of Conduct in good faith may face temporary or permanent repercussions as determined by other members of the project's leadership.
All community leaders are obligated to respect the privacy and security of the
reporter of any incident.
## Enforcement Guidelines
Community leaders will follow these Community Impact Guidelines in determining
the consequences for any action they deem in violation of this Code of Conduct:
### 1. Correction
**Community Impact**: Use of inappropriate language or other behavior deemed
unprofessional or unwelcome in the community.
**Consequence**: A private, written warning from community leaders, providing
clarity around the nature of the violation and an explanation of why the
behavior was inappropriate. A public apology may be requested.
### 2. Warning
**Community Impact**: A violation through a single incident or series of
actions.
**Consequence**: A warning with consequences for continued behavior. No
interaction with the people involved, including unsolicited interaction with
those enforcing the Code of Conduct, for a specified period of time. This
includes avoiding interactions in community spaces as well as external channels
like social media. Violating these terms may lead to a temporary or permanent
ban.
### 3. Temporary Ban
**Community Impact**: A serious violation of community standards, including
sustained inappropriate behavior.
**Consequence**: A temporary ban from any sort of interaction or public
communication with the community for a specified period of time. No public or
private interaction with the people involved, including unsolicited interaction
with those enforcing the Code of Conduct, is allowed during this period.
Violating these terms may lead to a permanent ban.
### 4. Permanent Ban
**Community Impact**: Demonstrating a pattern of violation of community
standards, including sustained inappropriate behavior, harassment of an
individual, or aggression toward or disparagement of classes of individuals.
**Consequence**: A permanent ban from any sort of public interaction within the
community.
## Attribution
This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4, available at [http://contributor-covenant.org/version/1/4][version]
This Code of Conduct is adapted from the [Contributor Covenant][homepage],
version 2.1, available at
[https://www.contributor-covenant.org/version/2/1/code_of_conduct.html][v2.1].
Community Impact Guidelines were inspired by
[Mozilla's code of conduct enforcement ladder][Mozilla CoC].
For answers to common questions about this code of conduct, see the FAQ at
[https://www.contributor-covenant.org/faq][FAQ]. Translations are available at
[https://www.contributor-covenant.org/translations][translations].
[homepage]: https://www.contributor-covenant.org
[v2.1]: https://www.contributor-covenant.org/version/2/1/code_of_conduct.html
[Mozilla CoC]: https://github.com/mozilla/diversity
[FAQ]: https://www.contributor-covenant.org/faq
[translations]: https://www.contributor-covenant.org/translations
[homepage]: http://contributor-covenant.org
[version]: http://contributor-covenant.org/version/1/4/

View file

@ -34,6 +34,7 @@ For a production environment you might not want to follow the `main` branch dire
This project follows [Semantic Versioning 2.0.0](https://semver.org/spec/v2.0.0.html).
Significant changes should be listed in the changelog (i.e. the file called `CHANGELOG.md`, see also section "Changelog Trailer" below).
Although Semantic Versioning talks about "the API", changes to the user interface should also be tracked.
However, changes to translation files are not considered notable enough to be listed in the changelog.
Consider if any of the existing documentation has to be updated because of your contribution.

View file

@ -40,15 +40,27 @@ After that the actual endpoint code is run by `call.ts` after checking some more
ActivityPub related code is in `/packages/backend/src/remote/activitypub/`
Both incoming and outgoing ActivityPub request are handled through queues, to e.g. allow for retrying a request when it fails, or spikes of many incoming requests.
#### Incoming Activities
Remote ActivityPub implementations will HTTP POST to the resource `/user/:userId/inbox` or `/inbox` (the latter is also known as the "shared inbox").
The behaviour for these routes is exactly the same: They add all the received data into the inbox queue.
This is defined in `/packages/backend/src/server/activitypub.ts`.
The inbox processor will do some basic things like verify signatures.
Incoming ActivityPub requests are processed by the code in `kernel/`.
The files/directories are generally named the same as the Activities that they process, which should help with orientation.
The entry point for processing an activity is `processOneActivity` in the `kernel/index.ts` file in that directory.
Parts of incoming activities may also be processed by `models/`.
The bodys of outgoing ActivityPub requests are "rendered" using `renderer/`.
#### Outgoing Activities
Outgoing activities are usually initiated in the logic of the API endpoints.
The bodies of outgoing ActivityPub requests are "rendered" using `renderer/`.
These files define several functions that are meant to be used together, e.g. `renderCreate(await renderNote(note, false), note)`.
The invocation of these functions is placed either in the API endpoints directly or in the services code.
Both incoming and outgoing ActivityPub request are handled through queues, to e.g. allow for retrying a request when it fails, or spikes of many incoming requests.
The rendered bodies of the functions and the recipients are put into the deliver queue to be delivered.
### Services

View file

@ -6,7 +6,9 @@ FoundKey is a free and open source microblogging server compatible with Activity
See the [changelog](./CHANGELOG.md) and [roadmap](./ROADMAP.md) for more on what's changed and future plans.
## Documentation
FoundKey's documentation is a work in progress. In the meantime, much of the documentation on the [Misskey Hub](https://misskey-hub.net/) will also apply to FoundKey.
FoundKey's documentation is a work in progress, which can be found in the `docs/` folder.
In the meantime, much of the documentation on the [Misskey Hub](https://misskey-hub.net/) will also apply to FoundKey.
## Contributing
If you're interested in helping out with the project, please read the [contributing guide](./CONTRIBUTING.md).

View file

@ -1,2 +0,0 @@
# Changing the default Reaction
You can change the default reaction that is used when an ActivityPub "Like" is received from '👍' to '⭐' by changing the boolean value `meta.useStarForReactionFallback` in the databse respectively.

84
docs/install-docker.md Normal file
View file

@ -0,0 +1,84 @@
# Create FoundKey instance with Docker Compose
This guide describes how to install and setup FoundKey with Docker Compose.
**WARNING:**
Never change the domain name (hostname) of an instance once you start using it!
## Requirements
- Docker or Podman
- Docker Compose plugin (or podman-compose)
If using Podman, replace `docker` with `podman`. Commands using `docker compose` should be replaced with `podman-compose`.
You may need to prefix `docker` commands with `sudo` unless your user is in the `docker` group or you are running Docker in rootless mode.
## Get the repository
```sh
git clone https://akkoma.dev/FoundKeyGang/FoundKey.git
cd FoundKey
```
To make it easier to perform your own changes on top, we suggest making a branch based on the latest tag.
In this example, we'll use `v13.0.0-preview1` as the tag to check out and `my-branch` as the branch name.
```sh
git checkout tags/v13.0.0-preview1 -b my-branch
```
## Configure
Copy example configuration files with following:
```sh
cp .config/docker_example.yml .config/default.yml
cp .config/docker_example.env .config/docker.env
```
Edit `default.yml` and `docker.env` according to the instructions in the files.
You will need to set the database host to `db` and Redis host to `redis` in order to use the internal container network for these services.
Edit `docker-compose.yml` if necessary. (e.g. if you want to change the port).
If you are using SELinux (eg. you're on Fedora or a RHEL derivative), you'll want to add the `Z` mount flag to the volume mounts to allow the containers to access the contents of those volumes.
## Build and initialize
The following command will build FoundKey and initialize the database.
This will take some time.
``` shell
docker compose build
docker compose run --rm web yarn run init
```
## Launch
You can start FoundKey with the following command:
```sh
docker compose up -d
```
In case you are encountering issues, you can run `docker compose logs -f` to get the log output of the running containers.
## How to update your FoundKey server
When updating, be sure to check the [release notes](https://akkoma.dev/FoundKeyGang/FoundKey/src/branch/main/CHANGELOG.md) to know in advance the changes and whether or not additional work is required (in most cases, it is not).
To update your branch to the latest tag (in this example `v13.0.0-preview2`), you can do the following:
```sh
git fetch -t
# Use --squash if you want to merge all of the changes in the tag into a single commit.
# Useful if you have made additional changes.
git merge tags/v13.0.0-preview2
# Rebuild and restart the docker container.
docker compose build
docker compose down && docker compose up -d
```
It may take some time depending on the contents of the update and the size of the database.
## How to execute CLI commands
```sh
docker compose run --rm web node packages/backend/built/tools/foo bar
```

View file

@ -38,22 +38,29 @@ Create a separate non-root user to run FoundKey:
adduser --disabled-password --disabled-login foundkey
```
The following steps will require logging into the `foundkey` user, so do that now.
```sh
su - foundkey
```
## Install FoundKey
1. Login to the `foundkey` user
We recommend using a local branch and merging in upstream releases as they get tagged. This allows for easy local customization of your install.
`su - foundkey`
First, clone the FoundKey repo:
```sh
git clone https://akkoma.dev/FoundKeyGang/FoundKey
cd FoundKey
```
2. Clone the FoundKey repository
Now create your local branch. In this example, we'll be using `toast.cafe` as the local branch name and release `v13.0.0-preview1` as the tag to track. To create that branch:
```sh
git checkout tags/v13.0.0-preview1 -b toast.cafe
```
`git clone --recursive https://akkoma.dev/FoundKeyGang/FoundKey foundkey`
3. Navigate to the repository
`cd foundkey`
4. Install FoundKey's dependencies
`yarn install`
Updating will be covered in a later section. For now you'll want to install the dependencies using Yarn:
```sh
yarn install
```
## Configure FoundKey
1. Copy `.config/example.yml` to `.config/default.yml`.
@ -64,6 +71,13 @@ adduser --disabled-password --disabled-login foundkey
- Make sure you set the PostgreSQL and Redis settings correctly.
- Use a strong password for the PostgreSQL user and take note of it since it'll be needed later.
### Reverse proxy
For production use and for HTTPS termination you will have to use a reverse proxy.
There are instructions for setting up [nginx](./nginx.md) for this purpose.
### Changing the default Reaction
You can change the default reaction that is used when an ActivityPub "Like" is received from '👍' to '⭐' by changing the boolean value `meta.useStarForReactionFallback` in the databse respectively.
## Build FoundKey
Build foundkey with the following:
@ -178,14 +192,22 @@ rc-service foundkey start
You can check if the service is running with `rc-service foundkey status`.
### Updating FoundKey
Use git to pull in the latest changes and rerun the build and migration commands:
When a new release comes out, simply fetch and merge in the new tag. If you plan on making additional changes on top of that tag, we suggest using the `--squash` option with `git merge`.
```sh
git fetch -t
git merge tags/v13.0.0-preview2
# you are now on the "next" release
```
Now you'll want to update your dependencies and rebuild:
```sh
git pull
git submodule update --init
yarn install
# Use build-parallel if your system has 4GB or more RAM and want faster builds
NODE_ENV=production yarn build
```
Next, run the database migrations:
```sh
yarn migrate
```

View file

@ -10,7 +10,7 @@
4. Run `sudo nginx -t` to verify that the configuration file will be loaded successfully.
5. Run `sudo systemctl restart nginx` to restart nginx.
# Nginx cofig example
# Nginx config example
```nginx
# For WebSocket

View file

@ -11,9 +11,9 @@ username: "اسم المستخدم"
password: "الكلمة السرية"
forgotPassword: "نسيتَ كلمة السر"
fetchingAsApObject: "جارٍ جلبه مِن الفديفرس…"
ok: " حسناً"
ok: "حسناً"
gotIt: "فهِمت"
cancel: " إلغاء"
cancel: "إلغاء"
renotedBy: "أعاد نشرها {user}"
noNotes: "لم يُعثر على أية ملاحظات"
noNotifications: "ليس هناك أية اشعارات"
@ -144,7 +144,7 @@ youHaveNoLists: "لا تمتلك أية قائمة"
followConfirm: "أتريد متابعة {name}؟"
proxyAccount: "حساب وكيل البروكسي"
proxyAccountDescription: "يتصرف حساب الوكيل كمتابع بعيد لمستخدمين تحت ظروف معينة.\
\ على سبيل المثال ، عندما يضيف مستخدم مستخدمًا بعيدًا إلى قائمة فإن ملاحظاته لن\
\ على سبيل المثال ، عندما يضيف مستخدم مستخدمًا بعيدًا إلى قائمة فإن ملاحظاته لن\
\ تُرسل إلى المثيل ما لم يُتابعه مستخدم محلي. وبالتالي فإن حساب الوكيل سوف يتابع\
\ هذا المستخدم لكي تُرسل ملاحظاته."
host: "المضيف"
@ -222,7 +222,7 @@ fromUrl: "عبر رابط"
uploadFromUrl: "ارفع عبر رابط"
uploadFromUrlDescription: "رابط الملف المراد رفعه"
uploadFromUrlRequested: "الرفع مطلوب"
uploadFromUrlMayTakeTime: "سيستغرق بعض الوقت لاتمام الرفع "
uploadFromUrlMayTakeTime: "سيستغرق بعض الوقت لاتمام الرفع"
explore: "استكشاف"
messageRead: "مقروءة"
noMoreHistory: "لا يوجد المزيد من التاريخ"
@ -258,8 +258,6 @@ createFolder: "أنشئ مجلدًا"
renameFolder: "إعادة تسمية المجلد"
deleteFolder: "احذف هذا المجلد"
addFile: "إضافة ملف"
emptyDrive: "قرص التخزين فارغ"
emptyFolder: "هذا المجلد فارغ"
unableToDelete: "لا يمكن حذفه"
inputNewFileName: "ادخل الإسم الجديد للملف"
inputNewDescription: "أدخل تعليقًا توضيحيًا"
@ -484,7 +482,7 @@ description: "الوصف"
describeFile: "أضف تعليقًا توضيحيًا"
author: "الكاتب"
leaveConfirm: "لديك تغييرات غير محفوظة. أتريد المتابعة دون حفظها؟"
manage: "إدارة "
manage: "إدارة"
plugins: "الإضافات"
width: "العرض"
height: "الإرتفاع"
@ -502,7 +500,7 @@ useStarForReactionFallback: "استخدم ★ كبديل إذا كان التف
emailServer: "خادم البريد الإلكتروني"
emailConfigInfo: "يستخدم لتأكيد عنوان بريدك الإلكتروني ولإعادة تعيين كلمة المرور إن\
\ نسيتها."
email: "البريد الإلكتروني "
email: "البريد الإلكتروني"
emailAddress: "عنوان البريد الالكتروني"
smtpConfig: "إعدادات خادم SMTP"
smtpHost: "المضيف"
@ -645,16 +643,13 @@ enabled: "مفعّل"
disabled: "معطّل"
quickAction: "الإجراءات السّريعة"
user: "المستخدمون"
administration: "إدارة "
administration: "إدارة"
accounts: "الحسابات"
switch: "بدّل"
noMaintainerInformationWarning: "لم تُضبط معلومات المدير"
noBotProtectionWarning: "لم تضبط الحماية من الحسابات الآلية"
configure: "اضبط"
postToGallery: "انشر في المعرض"
gallery: "المعرض"
recentPosts: "المشاركات الحديثة"
popularPosts: "المشاركات المتداولة"
shareWithNote: "شاركه في ملاحظة"
emailNotConfiguredWarning: "لم تعيّن بريدًا إلكترونيًا"
ratio: "النسبة"
@ -743,11 +738,6 @@ _forgotPassword:
ifNoEmail: "إذا لم تربط حسابك ببريد إلكتروني سيتوجب عليك التواصل مع مدير الموقع."
contactAdmin: "هذا المثيل لا يدعم استخدام البريد الإلكتروني، إن أردت إعادة تعيين\
\ كلمة المرور تواصل مع المدير."
_gallery:
my: "معرضي"
liked: "المشاركات المُعجب بها"
like: "أعجبني"
unlike: "أزل الإعجاب"
_email:
_follow:
title: "يتابعك"
@ -772,7 +762,7 @@ _nsfw:
force: "اخف كل الوسائط"
_mfm:
cheatSheet: "مرجع ملخص عن MFM"
intro: "MFM هي لغة ترميزية مخصصة يمكن استخدامها في عدّة أماكن في ميسكي. يمكنك مراجعة\
intro: "MFM هي لغة ترميزية مخصصة يمكن استخدامها في عدّة أماكن في ميسكي. يمكنك مراجعة\
\ كل تعابيرها مع كيفية استخدامها هنا."
mention: "أشر الى"
mentionDescription: "يمكنك الإشارة لمستخدم معيّن من خلال كتابة @ متبوعة باسم مستخدم."
@ -950,7 +940,6 @@ _permissions:
"write:notes": "أنشئ أو احذف ملاحظات"
"read:notifications": "اظهر الإشعارات"
"write:notifications": "إدارة الإشعارات"
"read:reactions": "اعرض تفاعلاتك"
"write:reactions": "عدّل تفاعلاتك"
"write:votes": "صوّت"
"read:pages": "اعرض صفحاتك"
@ -960,9 +949,6 @@ _permissions:
"write:user-groups": "عدّل أو احذف فِرق المستخدمين"
"read:channels": "طالع قنواتك"
"write:channels": "عدّل القنوات"
"read:gallery": "اعرض المعرض"
"write:gallery": "عدّل المعرض"
"read:gallery-likes": "يعرض ما أعجبك من مشاركات المعرض"
_auth:
shareAccess: "أتريد التفويض لـ \"{name}\" بالوصول لحسابك؟"
shareAccessAsk: "هل تخول لهذا التطبيق الوصول لحسابك؟"

View file

@ -3,7 +3,7 @@ headlineMisskey: "নোট ব্যাবহার করে সংযুক
introMisskey: "স্বাগতম! মিসকি একটি ওপেন সোর্স, ডিসেন্ট্রালাইজড মাইক্রোব্লগিং পরিষেবা।\
\ \n\"নোট\" তৈরির মাধ্যমে যা ঘটছে তা সবার সাথে শেয়ার করুন \U0001F4E1\n\"রিঅ্যাকশন\"\
\ গুলির মাধ্যমে যেকোনো নোট সম্পর্কে আপনার অনুভূতি ব্যাক্ত করতে পারেন \U0001F44D\n\
একটি নতুন দুনিয়া ঘুরে দেখুন \U0001F680\n"
একটি নতুন দুনিয়া ঘুরে দেখুন \U0001F680"
monthAndDay: "{day}/{month}"
search: "খুঁজুন"
notifications: "বিজ্ঞপ্তি"
@ -65,7 +65,7 @@ driveFileDeleteConfirm: "আপনি কি নিশ্চিত যে আপ
unfollowConfirm: "{name} কে আনফলোও করার ব্যাপারে নিশ্চিত?"
exportRequested: "আপনার তথ্যসমূহ রপ্তানির জন্য অনুরোধ করেছেন। এতে কিছু সময় লাগতে পারে।\
\ রপ্তানি সম্পন্ন হলে তা আপনার ড্রাইভে সংরক্ষিত হবে।"
importRequested: "আপনার তথ্যসমূহ আমদানির জন্য অনুরোধ করেছেন। এতে কিছু সময় লাগতে পারে। "
importRequested: "আপনার তথ্যসমূহ আমদানির জন্য অনুরোধ করেছেন। এতে কিছু সময় লাগতে পারে।."
lists: "লিস্ট"
note: "নোট"
notes: "নোটগুলি"
@ -79,10 +79,10 @@ somethingHappened: "একটি ত্রুটি হয়েছে"
retry: "আবার চেষ্টা করুন"
pageLoadError: "পেজ লোড করা যায়নি"
pageLoadErrorDescription: "এটি সাধারনত নেটওয়ার্কের সমস্যার বা ব্রাউজার ক্যাশের কারণে\
\ ঘটে থাকে। ব্রাউজার এর ক্যাশ পরিষ্কার করুন এবং একটু পর আবার চেষ্টা করুন। "
\ ঘটে থাকে। ব্রাউজার এর ক্যাশ পরিষ্কার করুন এবং একটু পর আবার চেষ্টা করুন।."
serverIsDead: "এই সার্ভার বর্তমানে সাড়া দিচ্ছে না। একটু পরে আবার চেষ্টা করুন।"
youShouldUpgradeClient: "এই পেজ দেখার জন্য আপনার ব্রাউজার রিফ্রেশ করে ক্লায়েন্ট আপডেট\
\ করুন। "
\ করুন।."
enterListName: "লিস্টের নাম লিখুন"
privacy: "গোপনীয়তা"
makeFollowManuallyApprove: "অনুসরণ করার অনুরোধগুলি গৃহীত হওয়ার জন্য আপনার অনুমতি লাগবে"
@ -93,7 +93,7 @@ followRequests: "অনুসরণ করার অনুরোধসমূহ"
unfollow: "অনুসরণ বাতিল"
followRequestPending: "অনুসরণ করার অনুরোধ বিচারাধীন"
renote: "রিনোট"
unrenote: "রিনোট সরান "
unrenote: "রিনোট সরান"
quote: "উদ্ধৃতি"
pinnedNote: "পিন করা নোট"
you: "আপনি"
@ -103,7 +103,7 @@ add: "যুক্ত করুন"
reaction: "প্রতিক্রিয়া"
reactionSettingDescription2: "পুনরায় সাজাতে টেনে আনুন, মুছতে ক্লিক করুন, যোগ করতে\
\ + টিপুন।"
attachCancel: "অ্যাটাচমেন্ট সরান "
attachCancel: "অ্যাটাচমেন্ট সরান"
markAsSensitive: "সংবেদনশীল হিসাবে চিহ্নিত করুন"
unmarkAsSensitive: "সংবেদনশীল চিহ্ন সরান"
enterFileName: "ফাইলের নাম লিখুন"
@ -129,7 +129,7 @@ addEmoji: "ইমোজি যুক্ত করুন"
cacheRemoteFiles: "রিমোট ফাইলসমুহ ক্যাশ করুন"
cacheRemoteFilesDescription: "যখন এই অপশনটি বন্ধ থাকে তখন রিমোট ফাইল সমূহ সরাসরি রিমোট\
\ ইন্সট্যান্স থেকে লোড করা হয়। এই অপশনটি বন্ধ করলে স্টোরেজ এর ব্যাবহার কমবে তবে\
\ থাম্বনেইল তৈরি না করার কারণে নেটওয়ার্ক ব্যান্ডউইথ বেশী লাগবে। "
\ থাম্বনেইল তৈরি না করার কারণে নেটওয়ার্ক ব্যান্ডউইথ বেশী লাগবে।"
flagAsBot: "বট হিসাবে চিহ্নিত করুন"
flagAsBotDescription: "এই অ্যাকাউন্টটি যদি একটি প্রোগ্রাম দ্বারা পরিচালিত হয়, তাহলে\
\ এই অপশনটি চালু করুন। ইন্টারঅ্যাকশান চেইনিং রোধ করতে, মিস্কির সিস্টেম পরিচালনাকে\
@ -184,7 +184,7 @@ clearCachedFiles: "ক্যাশ পরিষ্কার করুন"
clearCachedFilesConfirm: "আপনি কি ক্যাশ পরিষ্কার করার ব্যাপারে নিশ্চিত?"
blockedInstances: "ব্লককৃত ইন্সট্যান্সসমুহ"
blockedInstancesDescription: "আপনি যে ইন্সট্যান্সগুলি ব্লক করতে চান তার হোস্টনেমগুলি\
\ প্রত্যেকটি আলাদা লাইনে লিখুন। ব্লককৃত ইন্সট্যান্সগুলি এই ইন্সট্যান্সের সাথে যোগাযোগ\
\ প্রত্যেকটি আলাদা লাইনে লিখুন। ব্লককৃত ইন্সট্যান্সগুলি এই ইন্সট্যান্সের সাথে যোগাযোগ\
\ করতে পারবেনা৷"
muteAndBlock: "মিউট এবং ব্লকগুলি"
mutedUsers: "নিঃশব্দকৃত ব্যবহারকারী"
@ -273,8 +273,6 @@ createFolder: "ফোল্ডার তৈরি করুন"
renameFolder: "ফোল্ডার পুনঃনামকরন"
deleteFolder: "ফোল্ডার মুছুন"
addFile: "ফাইল যোগ করুন"
emptyDrive: "আপনার ড্রাইভ খালি"
emptyFolder: "এই ফোল্ডার খালি"
unableToDelete: "মুছে ফেলা যায়নি"
inputNewFileName: "ফাইলের নতুন নাম লিখুন"
inputNewDescription: "নতুন ক্যাপশন লিখুন"
@ -292,7 +290,7 @@ reload: "আবার লোড করুন"
doNothing: "কিছু করবেন না"
reloadConfirm: "আপনি কি রিলোড করতে চান?"
watch: "বিজ্ঞপ্তি পান"
unwatch: "বিজ্ঞপ্তি পাওয়া বন্ধ করুন "
unwatch: "বিজ্ঞপ্তি পাওয়া বন্ধ করুন"
accept: "অনুমোদন"
reject: "প্রত্যাখ্যান"
normal: "স্বাভাবিক"
@ -422,7 +420,7 @@ uiLanguage: "UI এর ভাষা"
groupInvited: "আপনি একটি গ্রুপে আমন্ত্রিত হয়েছেন"
useOsNativeEmojis: "অপারেটিং সিস্টেমের নেটিভ ইমোজি ব্যবহার করুন"
disableDrawer: "ড্রয়ার মেনু প্রদর্শন করবেন না"
youHaveNoGroups: "আপনার কোন গ্রুপ নেই "
youHaveNoGroups: "আপনার কোন গ্রুপ নেই"
joinOrCreateGroup: "একটি বিদ্যমান গ্রুপের আমন্ত্রণ পান বা একটি নতুন গ্রুপ তৈরি করুন৷"
noHistory: "কোনো ইতিহাস নেই"
signinHistory: "প্রবেশ করার ইতিহাস"
@ -447,7 +445,7 @@ objectStorageBaseUrl: "Base URL"
objectStorageBaseUrlDesc: "রেফারেন্স হিসাবে ব্যবহৃত URL। আপনি একটি CDN বা প্রক্সি\
\ ব্যবহার করলে URL, S3: 'https://<bucket>.s3.amazonaws.com', GCS: 'https://storage.googleapis.com/<bucket>'।"
objectStorageBucket: "Bucket"
objectStorageBucketDesc: "ব্যবহার করা পরিষেবার bucket এর নাম লিখুন। "
objectStorageBucketDesc: "ব্যবহার করা পরিষেবার bucket এর নাম লিখুন।."
objectStoragePrefix: "Prefix"
objectStoragePrefixDesc: "ফাইলসমূহ এই prefix যুক্ত ফোল্ডারের অধীনে সংরক্ষণ করা হবে।"
objectStorageEndpoint: "এন্ডপয়েন্ট"
@ -495,7 +493,7 @@ deleteAllFilesConfirm: "সকল ফাইল ডিলিট করতে চ
removeAllFollowing: "সকল অনুসরণ বাতিল করুন"
removeAllFollowingDescription: "{host} এর সকল ব্যাবহারকারীকে আর ফলোও করবেন না । যদি\
\ ইন্সত্যান্সটির কোন সমস্যা (যেমনঃ ইন্সত্যান্সটি আর নেই) হয়ে থাকে তবে এটি ব্যাবহার\
\ করুন । "
\ করুন ।."
userSuspended: "এই ব্যাবহারকারির অ্যাকাউন্ট স্থগিত করা হয়েছে"
userSilenced: "এই ব্যাবহারকারিকে মিউট করা হয়েছে"
yourAccountSuspendedTitle: "এই অ্যাকাউন্টটি স্থগিত করা হয়েছে"
@ -625,7 +623,7 @@ driveFilesCount: "ড্রাইভে ফাইল এর সংখ্যা"
driveUsage: "ড্রাইভ এর ব্যাবহার"
noCrawle: "ক্রলার ইন্ডেক্সিং বন্ধ করুন"
noCrawleDescription: "সার্চ ইঞ্জিনগুলিকে আপনার প্রোফাইল, নোট, পেজ ইত্যাদি ইনডেক্স\
\ করতে নিষেধ করুন। "
\ করতে নিষেধ করুন।."
lockedAccountInfo: "এমনকি আপনি আপনার অনুসরণকারীদের বেছে বেছে অনুমোদন করলেও, যে কেউ\
\ আপনার নোটগুলি দেখতে পাবে, যতক্ষণ না আপনি আপনার নোটগুলিকে \"অনুসারীদের জন্য\" হিসাবে\
\ সেট না করেন৷"
@ -640,7 +638,7 @@ pageLikesCount: "পেজ লাইক করেছেন"
pageLikedCount: "পেজ লাইক পেয়েছেন"
contact: "পরিচিতি সমূহ"
useSystemFont: "সিস্টেম ফন্ট ব্যাবহার করুন"
clips: "ক্লিপগুলি "
clips: "ক্লিপগুলি"
makeExplorable: "অ্যাকাউন্ট \"ঘুরে দেখুন\" পৃষ্ঠায় দেখান"
makeExplorableDescription: "আপনি এটি বন্ধ করলে, আপনার অ্যাকাউন্ট \"ঘুরে দেখুন\" পৃষ্ঠায়\
\ প্রদর্শিত হবে না।"
@ -671,7 +669,6 @@ editCode: "কোড সম্পাদনা করুন"
apply: "প্রয়োগ করুন"
receiveAnnouncementFromInstance: "এই ইন্সট্যান্স থেকে বিজ্ঞপ্তি পান"
emailNotification: "ইমেইল বিজ্ঞপ্তি"
publish: "প্রকাশ"
useReactionPickerForContextMenu: "রাইট ক্লিকের মাধ্যমে রিঅ্যাকশন পিকার খুলুন"
typingUsers: "{users} লেখছে"
jumpToSpecifiedDate: "একটি নির্দিষ্ট তারিখে যান"
@ -710,10 +707,7 @@ switch: "পাল্টান"
noMaintainerInformationWarning: "প্রশাসকের তথ্য সেট করা হয়নি।"
noBotProtectionWarning: "বট প্রোটেকশন সেট করা হয়নি।"
configure: "কনফিগার করুন"
postToGallery: "গ্যালারী পোস্ট তৈরি করুন"
gallery: "গ্যালারী"
recentPosts: "নতুন পোস্ট"
popularPosts: "জনপ্রিয় পোস্ট"
shareWithNote: "নোটের মাধ্যমে শেয়ার করুন"
emailNotConfiguredWarning: "ইমেইল অ্যাড্রেস সেট করা হয়নি।"
ratio: "অনুপাত"
@ -721,7 +715,7 @@ previewNoteText: "প্রিভিউ দেখান"
customCss: "কাস্টম CSS"
customCssWarn: "এই ব্যাপারে অভিজ্ঞতা না থাকলে এই সেটিংটি ব্যাবহার করবেন না। অনুপযুক্ত\
\ সেটিংস ক্লায়েন্টকে স্বাভাবিকভাবে ব্যবহার করতে বাধা দিতে পারে।"
squareAvatars: "চারকোনা প্রোফাইল পিকচার দেখান "
squareAvatars: "চারকোনা প্রোফাইল পিকচার দেখান"
searchResult: "অনুসন্ধানের ফলাফল"
hashtags: "হ্যাশট্যাগ"
troubleshooting: "ট্রাবলশুটিং"
@ -765,7 +759,7 @@ hide: "লুকান"
leaveGroup: "গ্রুপ ছেড়ে চলে যান"
leaveGroupConfirm: "\"{name}\" গ্রুপ ছেড়ে চলে যেতে চান?"
useDrawerReactionPickerForMobile: "মোবাইলে রিঅ্যাকশন পিকারকে ড্রয়ারে প্রদর্শন করুন"
clickToFinishEmailVerification: " [{ok}] ক্লিক করার মাধ্যমে আপনার ইমেল ঠিকানা নিশ্চিত\
clickToFinishEmailVerification: "[{ok}] ক্লিক করার মাধ্যমে আপনার ইমেল ঠিকানা নিশ্চিত\
\ করুন।"
overridedDeviceKind: "ডিভাইসের ধরন"
smartphone: "স্মার্টফোন"
@ -785,12 +779,12 @@ oneDay: "একদিন"
oneWeek: "এক সপ্তাহ"
reflectMayTakeTime: "এটির কাজ দেখা যেতে কিছুটা সময় লাগতে পারে।"
failedToFetchAccountInformation: "অ্যাকাউন্টের তথ্য উদ্ধার করা যায়নি"
rateLimitExceeded: "রেট লিমিট ছাড়িয়ে গেছে "
rateLimitExceeded: "রেট লিমিট ছাড়িয়ে গেছে"
_emailUnavailable:
used: "এই ইমেইল ঠিকানাটি ইতোমধ্যে ব্যবহৃত হয়েছে"
format: "এই ইমেল ঠিকানাটি সঠিকভাবে লিখা হয়নি"
disposable: "অস্থায়ী ইমেইল ঠিকানা ব্যাবহার করা যাবে না"
mx: "ইমেইল সার্ভারটি ঠিক না"
mx: "ইমেইল সার্ভারটি ঠিক না"
smtp: "ইমেইল সার্ভারটি সাড়া দিচ্ছে না"
_ffVisibility:
public: "প্রকাশ"
@ -819,11 +813,6 @@ _forgotPassword:
\ প্রশাসকের সাথে যোগাযোগ করুন।"
contactAdmin: "এই ইন্সট্যান্সটি ইমেইল ব্যাবহার করে না, তাই আপনার পাসওয়ার্ড পুনরায়\
\ সেট করতে প্রশাসকের সাথে যোগাযোগ করুন৷"
_gallery:
my: "আমার গ্যালারী"
liked: "পছন্দ করা পোস্ট"
like: "পছন্দ করা"
unlike: "পছন্দ সরান"
_email:
_follow:
title: "আপনাকে অনুসরণ করছে"
@ -867,8 +856,7 @@ _mfm:
center: "সেন্টার"
centerDescription: "লেখা মাঝ বরাবর দেখানো হবে"
inlineCode: "কোড (ইনলাইন)"
inlineCodeDescription: " প্রোগ্রামের কোডের জন্য ইনলাইন সিনট্যাক্স হাইলাইটিং করা\
\ হবে"
inlineCodeDescription: "প্রোগ্রামের কোডের জন্য ইনলাইন সিনট্যাক্স হাইলাইটিং করা হবে."
blockCode: "কোড (ব্লক)"
blockCodeDescription: "মাল্টি-লাইন প্রোগ্রামের কোডের জন্য সিনট্যাক্স হাইলাইট করে।"
inlineMath: "গাণিতিক সূত্র (ইনলাইন)"
@ -1015,7 +1003,7 @@ _tutorial:
\ পছন্দ করেন তাকে বেছে নিতে এবং অনুসরণ করতে পারেন, অথবা {explore}-এ জনপ্রিয় ব্যবহারকারীদের\
\ দেখতে পারেন৷"
step5_3: "একজন ব্যবহারকারীকে অনুসরণ করতে, ব্যবহারকারীর আইকনে ক্লিক করুন এবং ব্যবহারকারীর\
\ পৃষ্ঠাতে \"অনুসরণ করুন\" বাটনে ক্লিক করুন।"
\ পৃষ্ঠাতে \"অনুসরণ করুন\" বাটনে ক্লিক করুন।"
step5_4: "যদি ব্যবহারকারীর নামের পাশে একটি লক আইকন থাকে তাহলে আপনার অনুসরণের অনুরোধ\
\ গ্রহণ করার জন্য তারা কিছু সময় নিতে পারে।"
step6_1: "সবকিছু ঠিক থাকলে আপনি টাইমলাইনে অন্য ব্যবহারকারীদের নোট দেখতে পাবেন।"
@ -1055,7 +1043,6 @@ _permissions:
"write:notes": "নোট লিখা"
"read:notifications": "বিজ্ঞপ্তিগুলি দেখুন"
"write:notifications": "বিজ্ঞপ্তি নিয়ে কাজ করে"
"read:reactions": "রিঅ্যাকশনগুলি দেখুন"
"write:reactions": "রিঅ্যাকশনগুলি সম্পাদনা করুন"
"write:votes": "ভোট দিন"
"read:pages": "আপনার পেজগুলি দেখুন"
@ -1066,10 +1053,6 @@ _permissions:
"write:user-groups": "ব্যাবহারকারী গ্রুপগুলি সম্পাদনা করুন"
"read:channels": "চ্যানেলগুলি দেখুন"
"write:channels": "চ্যানেলগুলি সম্পাদনা করুন"
"read:gallery": "গ্যালারী দেখুন"
"write:gallery": "গ্যালারী সম্পাদনা করুন"
"read:gallery-likes": "গ্যালারীর পছন্দগুলি দেখুন"
"write:gallery-likes": "গ্যালারীর পছন্দগুলি সম্পাদনা করুন"
_auth:
shareAccess: "\"{name}\" কে অ্যাকাউন্টের অ্যাক্সেস দিবেন?"
shareAccessAsk: "অ্যাপ্লিকেশনটিকে অ্যাকাউন্টের অ্যাক্সেস দিবেন?"

View file

@ -14,7 +14,7 @@ fetchingAsApObject: "Cercant en el Fediverse..."
ok: "OK"
gotIt: "Ho he entès!"
cancel: "Cancel·lar"
renotedBy: "Resignat per {usuari}"
renotedBy: "Resignat per {user}"
noNotes: "Cap nota"
noNotifications: "Cap notificació"
instance: "Instàncies"

View file

@ -249,7 +249,6 @@ createFolder: "Vytvořit složku"
renameFolder: "Přejmenovat složku"
deleteFolder: "Odstranit složku"
addFile: "Přidat soubor"
emptyFolder: "Tato složka je prázdná"
unableToDelete: "Nelze smazat"
inputNewFileName: "Zadejte nový název"
copyUrl: "Kopírovat URL"

View file

@ -194,8 +194,8 @@ blockedInstances: "Blockierte Instanzen"
blockedInstancesDescription: "Gib die Hostnamen der Instanzen, welche blockiert werden\
\ sollen, durch Zeilenumbrüche getrennt an. Blockierte Instanzen können mit dieser\
\ Instanz nicht mehr kommunizieren. Hostnamen, die nicht-ASCII-Zeichen enthalten,\
\ müssen zuvor in Punycode umgewandelt werden. Ein Asterisk (*) kann als Platzhalter\
\ für beliebig viele Zeichen verwendet werden."
\ müssen zuvor in Punycode umgewandelt werden. Subdomains der aufgelisteten Hostnamen\
\ werden ebenfalls blockiert."
muteAndBlock: "Stummschaltungen und Blockierungen"
mutedUsers: "Stummgeschaltete Benutzer"
blockedUsers: "Blockierte Benutzer"
@ -284,8 +284,6 @@ createFolder: "Ordner erstellen"
renameFolder: "Ordner umbenennen"
deleteFolder: "Ordner löschen"
addFile: "Datei hinzufügen"
emptyDrive: "Deine Drive ist leer"
emptyFolder: "Dieser Ordner ist leer"
unableToDelete: "Nicht löschbar"
inputNewFileName: "Gib einen neuen Dateinamen ein"
inputNewDescription: "Gib eine neue Beschreibung ein"
@ -337,9 +335,9 @@ pinnedUsers: "Angeheftete Benutzer"
pinnedUsersDescription: "Gib durch Leerzeichen getrennte Benutzer an, die an die \"\
Erkunden\"-Seite angeheftet werden sollen."
hcaptchaSiteKey: "Site key"
hcaptchaSecretKey: "Secret key"
recaptchaSiteKey: "Site key"
recaptchaSecretKey: "Secret key"
hcaptchaSecretKey: "Geheimer Schlüssel"
recaptchaSiteKey: "Site-Schlüssel"
recaptchaSecretKey: "Geheimer Schlüssel"
antennas: "Antennen"
manageAntennas: "Antennen verwalten"
name: "Name"
@ -693,7 +691,6 @@ editCode: "Code bearbeiten"
apply: "Anwenden"
receiveAnnouncementFromInstance: "Benachrichtigungen von dieser Instanz empfangen"
emailNotification: "Email-Benachrichtigungen"
publish: "Veröffentlichen"
useReactionPickerForContextMenu: "Reaktionsauswahl durch Rechtsklick öffnen"
typingUsers: "{users} ist/sind am schreiben …"
jumpToSpecifiedDate: "Zu bestimmtem Datum springen"
@ -732,11 +729,7 @@ switch: "Wechseln"
noMaintainerInformationWarning: "Betreiberinformationen sind nicht konfiguriert."
noBotProtectionWarning: "Schutz vor Bots ist nicht konfiguriert."
configure: "Konfigurieren"
postToGallery: "Neuen Galeriebeitrag erstellen"
attachmentRequired: "Mindestens 1 Anhang ist erforderlich."
gallery: "Galerie"
recentPosts: "Neue Beiträge"
popularPosts: "Beliebte Beiträge"
shareWithNote: "Mit Notiz teilen"
emailNotConfiguredWarning: "Keine Email-Adresse hinterlegt."
ratio: "Verhältnis"
@ -851,11 +844,6 @@ _forgotPassword:
\ wende dich bitte an den Administrator."
contactAdmin: "Diese Instanz unterstützt die Verwendung von Email-Adressen nicht.\
\ Wende dich an den Administrator, um dein Passwort zurückzusetzen."
_gallery:
my: "Meine Galerie"
liked: "Mit \"Gefällt mir\" markierte Beiträge"
like: "Gefällt mir"
unlike: "\"Gefällt mir\" entfernen"
_email:
_follow:
title: "Du hast einen neuen Follower"
@ -979,9 +967,9 @@ _wordMute:
\ trennen."
muteWordsDescription2: "Umgib Schlüsselworter mit Schrägstrichen, um Reguläre Ausdrücke\
\ zu verwenden."
softDescription: "Notizen, die die angegebenen Konditionen erfüllen, in der Chronik\
softDescription: "Notizen, welche die angegebenen Konditionen erfüllen, in der Chronik\
\ ausblenden."
hardDescription: "Verhindern, dass Notizen, die die angegebenen Konditionen erfüllen,\
hardDescription: "Verhindern, dass Notizen, welche die angegebenen Konditionen erfüllen,\
\ der Chronik hinzugefügt werden. Zudem werden diese Notizen auch nicht der Chronik\
\ hinzugefügt, falls die Konditionen geändert werden."
soft: "Leicht"
@ -1083,40 +1071,39 @@ _2fa:
\ deinem Gerät auch Anmeldung mit Hilfe eines FIDO2-kompatiblen Hardware-Sicherheitsschlüssels\
\ einrichten."
_permissions:
"read:account": "Deine Benutzerkontoinformationen lesen"
"write:account": "Deine Benutzerkontoinformationen bearbeiten"
"read:blocks": "Die Liste deiner blockierten Benutzer lesen"
"write:blocks": "Die Liste deiner blockierten Benutzer bearbeiten"
"read:drive": "Deine Drive-Dateien und Ordner lesen"
"write:drive": "Deine Drive-Dateien und Ordner bearbeiten oder löschen"
"read:favorites": "Deine Favoriten-Liste lesen"
"write:favorites": "Deine Favoriten-Liste bearbeiten"
"read:following": "Die Liste der Benutzer, denen du folgst, lesen"
"read:account": "Benutzerkonto-Informationen lesen"
"write:account": "Benutzerkonto-Informationen bearbeiten"
"read:blocks": "Liste der blockierten Benutzer lesen"
"write:blocks": "Liste der blockierten Benutzer bearbeiten"
"read:drive": "Drive-Dateien und -Ordner auflisten"
"write:drive": "Drive-Dateien und -Ordner erstellen, bearbeiten oder löschen"
"read:favorites": "Favorisierte Notizen auflisten"
"write:favorites": "Favorisierung von Notizen hinzufügen oder entfernen"
"read:following": "Gefolgte und folgende Benutzer auflisten"
"write:following": "Anderen Benutzern folgen oder entfolgen"
"read:messaging": "Chats lesen"
"write:messaging": "Chats bedienen"
"read:mutes": "Stummschaltungen lesen"
"write:mutes": "Stummschaltungen bearbeiten"
"read:messaging": "Chats und Chatverläufe lesen"
"write:messaging": "Chatnachrichten erstellen oder löschen"
"read:mutes": "Stummschaltungen und Renote-Stummschaltungen auflisten"
"write:mutes": "Stummschaltungen und Renote-Stummschaltungen bearbeiten"
"write:notes": "Notizen schreiben oder löschen"
"read:notifications": "Benachrichtigungen lesen"
"write:notifications": "Benachrichtigungen bedienen"
"read:reactions": "Reaktionen lesen"
"write:reactions": "Reaktionen bedienen"
"write:votes": "Umfragen bedienen"
"read:pages": "Deine Seiten lesen"
"write:pages": "Deine Seiten bearbeiten oder löschen"
"read:page-likes": "Liste der Seiten, die mir gefallen, lesen"
"write:page-likes": "Liste der Seiten, die mir gefallen, bearbeiten"
"read:user-groups": "Benutzergruppen lesen"
"write:user-groups": "Benutzergruppen bearbeiten oder löschen"
"read:channels": "Kanäle lesen"
"write:channels": "Kanäle bedienen"
"read:gallery": "Beiträge deiner Galerie lesen"
"write:gallery": "Deine Galerie bearbeiten"
"read:gallery-likes": "Liste deiner mit \"Gefällt mir\" markierten Galerie-Beiträge\
\ lesen"
"write:gallery-likes": "Liste deiner mit \"Gefällt mir\" markierten Galerie-Beiträge\
\ bearbeiten"
"write:notifications": "Benachrichtigungen als gelesen markieren oder App-Benachrichtigungen\
\ erstellen"
"write:reactions": "Reaktionen erstellen oder löschen"
"write:votes": "In Umfragen abstimmen"
"read:pages": "Deine Seiten auflisten und lesen"
"write:pages": "Seiten erstellen, bearbeiten oder löschen"
"read:page-likes": "Seiten, die mir gefallen, auflisten und auslesen"
"write:page-likes": "\"Gefällt mir\"-Markierung von Seiten bearbeiten"
"read:user-groups": "beigetretene, erstellte und eingeladene Benutzergruppen auflisten\
\ und lesen"
"write:user-groups": "Benutzergruppen erstellen, bearbeiten, löschen, übertragen,\
\ zu diesen beitreten oder diese verlassen. Andere Benutzer zu diesen Einladen\
\ oder Benutzer aus diesen Bannen. Einladungen zu Benutzergruppen annehmen oder\
\ ablehnen."
"read:channels": "gefolgte und beigetretene Kanäle auflisten und lesen"
"write:channels": "Kanäle erstellen, bearbeiten, diesen folgen und entfolgen"
"read:reactions": Reaktionen ansehen
_auth:
shareAccess: "Möchtest du „{name}“ authorisieren, auf dieses Benutzerkonto zugreifen\
\ zu können?"
@ -1289,7 +1276,7 @@ _pages:
hideTitleWhenPinned: "Seitentitel wenn angeheftet ausblenden"
font: "Schriftart"
fontSerif: "Serif"
fontSansSerif: "Sans Serif"
fontSansSerif: "serifenlos"
eyeCatchingImageSet: "Vorschaubild festlegen"
eyeCatchingImageRemove: "Vorschaubild entfernen"
_relayStatus:
@ -1324,6 +1311,7 @@ _notification:
followRequestAccepted: "Akzeptierte Follow-Anfragen"
groupInvited: "Erhaltene Gruppeneinladungen"
app: "Benachrichtigungen von Apps"
move: Account-Umzüge
_actions:
followBack: "folgt dir nun auch"
reply: "Antworten"
@ -1366,7 +1354,7 @@ confirmToUnclipAlreadyClippedNote: "Diese Notiz ist bereits im \"{name}\" Clip e
noEmailServerWarning: "Es ist kein Email-Server konfiguriert."
thereIsUnresolvedAbuseReportWarning: "Es liegen ungelöste Meldungen vor."
recommended: "Empfehlung"
check: "Check"
check: "Überprüfen"
maxCustomEmojiPicker: Maximale Anzahl vorgeschlagener benutzerdefinierter Emoji
maxUnicodeEmojiPicker: Maximale Anzahl vorgeschlagener Unicode-Emoji
documentation: Dokumentation
@ -1399,3 +1387,28 @@ selectAll: Alle auswählen
renoteUnmute: Renotes zeigen
renoteMute: Renotes verstecken
externalCssSnippets: Einige CSS-Schnipsel zur Inspiration (nicht durch FoundKey verwaltet)
botFollowRequiresApproval: Follow-Anfragen von als Bot markierten Accounts benötigen
Bestätigung
unrenoteAll: alle Renotes zurücknehmen
unrenoteAllConfirm: Bist du sicher, dass du alle Renotes zurücknehmen möchtest?
deleteAllFiles: Alle Dateien löschen
cannotAttachFileWhenAccountSwitched: Kann keine Dateien anhängen, während ein anderer
Account eingestellt ist.
cannotSwitchAccountWhenFileAttached: Kann keinen anderen Account einstellen, solange
Dateien angehängt sind.
oauthErrorGoBack: Bei der Authentifizierung einer Drittanbieter-Anwendung ist ein
Fehler aufgetreten. Bitte geh zurück und versuche es erneut.
appAuthorization: Anwendungs-Authorisierung
noPermissionsRequested: (Keine Berechtigungen angefordert.)
_remoteInteract:
title: Es tut mir leid, aber das kann ich nicht tun.
description: Diese Aktion kann gerade nicht ausgeführt werden. Vermutlich musst
du diese Aktion auf deiner eigenen Instanz ausführen, oder dich anmelden.
urlInstructions: Kopiere diese URL. Wenn du sie auf deiner Instanz in das Suchfeld
einfügst, solltest du zum richtigen Ort gelangen.
movedTo: Diese Person ist umgezogen zu {handle}.
attachedToNotes: Notizen mit dieser Datei
showAttachedNotes: Zeige Notizen mit dieser Datei
uploadFailed: Hochladen fehlgeschlagen
uploadFailedDescription: Die Datei konnte nicht hochgeladen werden.
uploadFailedSize: Die Datei ist zu groß.

View file

@ -88,6 +88,7 @@ youShouldUpgradeClient: "To view this page, please refresh to update your client
enterListName: "Enter a name for the list"
privacy: "Privacy"
makeFollowManuallyApprove: "Follow requests require approval"
botFollowRequiresApproval: "Follow requests from accounts marked as bots require approval"
defaultNoteVisibility: "Default visibility"
follow: "Follow"
followRequest: "Send follow request"
@ -232,6 +233,9 @@ resetAreYouSure: "Really reset?"
saved: "Saved"
messaging: "Chat"
upload: "Upload"
uploadFailed: "Upload failed"
uploadFailedDescription: "The file could not be uploaded."
uploadFailedSize: "The file is too large to be uploaded."
keepOriginalUploading: "Keep original image"
keepOriginalUploadingDescription: "Saves the originally uploaded image as-is. If turned\
\ off, a version to display on the web will be generated on upload."
@ -277,8 +281,6 @@ createFolder: "Create a folder"
renameFolder: "Rename this folder"
deleteFolder: "Delete this folder"
addFile: "Add a file"
emptyDrive: "Your Drive is empty"
emptyFolder: "This folder is empty"
unableToDelete: "Unable to delete"
inputNewFileName: "Enter a new filename"
inputNewDescription: "Enter new caption"
@ -348,6 +350,8 @@ withReplies: "Include replies"
connectedTo: "Following account(s) are connected"
notesAndReplies: "Notes and replies"
withFiles: "Including files"
attachedToNotes: "Notes with this file"
showAttachedNotes: "Show notes with this file"
silence: "Silence"
silenceConfirm: "Are you sure that you want to silence this user?"
unsilence: "Undo silencing"
@ -709,6 +713,8 @@ botProtection: "Bot Protection"
instanceBlocking: "Blocked Instances"
selectAccount: "Select account"
switchAccount: "Switch account"
cannotAttachFileWhenAccountSwitched: "You cannot attach a file while switched to another account."
cannotSwitchAccountWhenFileAttached: "You cannot switch accounts while files are attached."
enabled: "Enabled"
disabled: "Disabled"
quickAction: "Quick actions"
@ -826,6 +832,7 @@ oauthErrorGoBack: "An error happened while trying to authenticate a 3rd party ap
\ Please go back and try again."
appAuthorization: "App authorization"
noPermissionsRequested: "(No permissions requested.)"
movedTo: "This user has moved to {handle}."
_emailUnavailable:
used: "This email address is already being used"
format: "The format of this email address is invalid"
@ -1303,6 +1310,7 @@ _notification:
receiveFollowRequest: "Received follow requests"
followRequestAccepted: "Accepted follow requests"
groupInvited: "Group invitations"
move: "Others moving accounts"
app: "Notifications from linked apps"
_actions:
followBack: "followed you back"
@ -1336,3 +1344,7 @@ _translationService:
_libreTranslate:
endpoint: "LibreTranslate API Endpoint"
authKey: "LibreTranslate Auth Key (optional)"
_remoteInteract:
title: "I'm sorry, I'm afraid I can't do that."
description: "You cannot perform this action right now. You probably need to do it on your own instance, or sign in."
urlInstructions: "You can copy this URL. If you paste it into the search field on your instance, you should be taken to the right location."

View file

@ -185,16 +185,17 @@ clearQueueConfirmText: "Las notas aún no entregadas no se federarán. Normalmen
clearCachedFiles: "Limpiar caché"
clearCachedFilesConfirm: "¿Desea borrar todos los archivos remotos cacheados?"
blockedInstances: "Instancias bloqueadas"
blockedInstancesDescription: "Seleccione los hosts de las instancias que desea bloquear,\
\ separadas por una linea nueva. Las instancias bloqueadas no podrán comunicarse\
\ con esta instancia."
blockedInstancesDescription: "Seleccione los hosts de las instancias que desea bloquear.\
\ Las instancias listadas no podrán comunicarse con esta instancia. Los nombres\
\ de dominios Non-ASCII deben ser codificados con punycode.\nLos sub dominios de\
\ la lista de instancias serán bloqueados también."
muteAndBlock: "Silenciar y bloquear"
mutedUsers: "Usuarios silenciados"
blockedUsers: "Usuarios bloqueados"
noUsers: "No hay usuarios"
editProfile: "Editar perfil"
noteDeleteConfirm: "¿Desea borrar esta nota?"
pinLimitExceeded: "Ya no se pueden fijar más posts"
pinLimitExceeded: "Ya no se pueden fijar más notas."
intro: "¡La instalación de FoundKey ha terminado! Crea el usuario administrador."
done: "Terminado"
processing: "Procesando"
@ -275,8 +276,6 @@ createFolder: "Crear carpeta"
renameFolder: "Renombrar carpeta"
deleteFolder: "Borrar carpeta"
addFile: "Agregar archivo"
emptyDrive: "El drive está vacío"
emptyFolder: "La carpeta está vacía"
unableToDelete: "No se puede borrar"
inputNewFileName: "Ingrese un nuevo nombre de archivo"
inputNewDescription: "Ingrese nueva descripción"
@ -471,7 +470,7 @@ objectStorageUseSSLDesc: "Desactive esto si no va a usar HTTPS para la conexión
objectStorageUseProxy: "Conectarse a través de Proxy"
objectStorageUseProxyDesc: "Desactive esto si no va a usar Proxy para la conexión\
\ de Almacenamiento de objetos"
objectStorageSetPublicRead: "Seleccionar \"public-read\" al subir "
objectStorageSetPublicRead: "Seleccionar \"public-read\" al subir"
showFixedPostForm: "Mostrar el formulario de las entradas encima de la línea de tiempo"
newNoteRecived: "Tienes una nota nuevo"
sounds: "Sonidos"
@ -558,7 +557,7 @@ smtpPass: "Contraseña"
emptyToDisableSmtpAuth: "Deje el nombre del usuario y la contraseña en blanco para\
\ deshabilitar la autenticación SMTP"
smtpSecure: "Usar SSL/TLS implícito en la conexión SMTP"
smtpSecureInfo: "Apagar cuando se use STARTTLS"
smtpSecureInfo: "Apagar cuando se use STARTTLS."
testEmail: "Prueba de envío"
wordMute: "Silenciar palabras"
instanceMute: "Instancias silenciadas"
@ -599,7 +598,7 @@ openInNewTab: "Abrir en una Nueva Pestaña"
defaultNavigationBehaviour: "Navegación por defecto"
instanceTicker: "Información de notas de la instancia"
system: "Sistema"
switchUi: "Cambiar interfaz de usuario"
switchUi: "Cambiar interfaz"
desktop: "Escritorio"
clip: "Clip"
createNew: "Crear"
@ -675,7 +674,6 @@ editCode: "Editar código"
apply: "Aplicar"
receiveAnnouncementFromInstance: "Recibir notificaciones de la instancia"
emailNotification: "Notificaciones por correo electrónico"
publish: "Publicar"
useReactionPickerForContextMenu: "Haga clic con el botón derecho para abrir el menu\
\ de reacciones"
typingUsers: "{users} está escribiendo"
@ -692,7 +690,7 @@ notSpecifiedMentionWarning: "Algunas menciones no están incluidas en el destino
info: "Información"
userInfo: "Información del usuario"
unknown: "Desconocido"
hideOnlineStatus: "mostrarse como desconectado"
hideOnlineStatus: "Mostrarse como desconectado"
hideOnlineStatusDescription: "Ocultar su estado en línea puede reducir la eficacia\
\ de algunas funciones, como la búsqueda"
online: "En línea"
@ -713,10 +711,7 @@ switch: "Cambiar"
noMaintainerInformationWarning: "No se ha establecido la información del administrador"
noBotProtectionWarning: "La protección contra los bots no está configurada"
configure: "Configurar"
postToGallery: "Crear una nueva publicación en la galería"
gallery: "Galería"
recentPosts: "Posts recientes"
popularPosts: "Más vistos"
shareWithNote: "Compartir con una nota"
emailNotConfiguredWarning: "No se ha configurado una dirección de correo electrónico."
ratio: "Proporción"
@ -734,7 +729,7 @@ misskeyUpdated: "¡FoundKey ha sido actualizado!"
whatIsNew: "Mostrar cambios"
translate: "Traducir"
translatedFrom: "Traducido de {x}"
accountDeletionInProgress: "La eliminación de la cuenta está en curso"
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."
@ -761,52 +756,60 @@ ffVisibility: "Visibilidad de seguidores y seguidos"
hide: "Ocultar"
indefinitely: "Sin límite de tiempo"
_ffVisibility:
public: "Publicar"
public: "Público"
private: Privado
followers: Visible solo a seguidores
_accountDelete:
accountDelete: "Eliminar Cuenta"
started: La eliminación ha iniciado.
sendEmail: Cuando se complete la eliminación de la cuenta, un correo será enviado
a la dirección registrada de la cuenta.
requestAccountDelete: Solicitar eliminación de cuenta
inProgress: Eliminación en progreso
mayTakeTime: Como la eliminación de la cuenta es un proceso que consume muchos recursos,
puede llevar algún tiempo según la cantidad de contenido que se haya creado y
la cantidad de archivos que cargados.
_forgotPassword:
contactAdmin: "Esta instancia no admite el uso de direcciones de correo electrónico,\
\ póngase en contacto con el administrador de la instancia para restablecer su\
\ contraseña"
_gallery:
my: "Mi galería"
liked: "Publicaciones que me gustan"
like: "¡Muy bien!"
unlike: "Quitar me gusta"
\ contraseña."
enterEmail: Ingrese el correo que se uso para el registro. Se enviará un link para
que resetear la contraseña.
ifNoEmail: Si no se utilizó un correo durante el registro, por favor contacte con
el administrador de la instancia.
_email:
_follow:
title: "te ha seguido"
title: "Tienes un nuevo seguidor"
_receiveFollowRequest:
title: "Has recibido una solicitud de seguimiento"
_plugin:
install: "Instalar plugins"
installWarn: "Por favor no instale plugins que no son de confianza"
installWarn: "Por favor no instale plugins que no son de confianza."
_registry:
scope: "Alcance"
key: "Clave"
keys: "Clave"
keys: "Claves"
domain: "Dominio"
createKey: "Crear una llave"
_aboutMisskey:
about: "FoundKey es un software de código abierto, desarrollado por syuilo desde\
\ el 2014"
about: "FoundKey es una bifurcación de Misskey desarrollada desde Julio de 2022."
allContributors: "Todos los colaboradores"
source: "Código fuente"
_nsfw:
respect: "Ocultar medios NSFW"
ignore: "No esconder medios NSFW "
ignore: "No esconder medios NSFW"
force: "Ocultar todos los medios"
_mfm:
cheatSheet: "Hoja de referencia de MFM"
intro: "MFM es un lenguaje de marcado dedicado que se puede usar en varios lugares\
\ dentro de FoundKey. Aquí puede ver una lista de sintaxis disponibles en MFM."
dummy: "FoundKey expande el mundo de la Fediverso"
dummy: "FoundKey expande el mundo del Fediverso"
mention: "Menciones"
mentionDescription: "El signo @ seguido de un nombre de usuario se puede utilizar\
\ para notificar a un usuario en particular."
hashtag: "Hashtag"
hashtag: "Hashtag #"
url: "URL"
urlDescription: "Se pueden mostrar las URL"
urlDescription: "Se pueden mostrar las URL."
link: "Vínculo"
bold: "Negrita"
center: "Centrar"
@ -821,6 +824,48 @@ _mfm:
\ / derecha."
font: "Fuente"
rotate: "Rotar"
jump: Animación (Salto)
jumpDescription: Da al contenido un salto animado.
bounce: Animación (Bounce)
centerDescription: Muestra el contenido de manera centrada.
inlineCode: Código (Inline)
blockMath: 'Función matemática (Block)'
blockMathDescription: Muestra líneas múltiples de fórmulas matemáticas (KaTeX) en
un bloque.
inlineCodeDescription: Muestra resaltado de sintaxis en línea para el código (program).
quoteDescription: Muestra el contenido en una cita.
searchDescription: Muestra un cuadro de búsqueda con texto pre introducido.
jellyDescription: Le da al contenido una animación del tipo Jelly.
tada: Animación (Tada)
shake: Animación (Shake)
hashtagDescription: Puedes especificar un hashtag usando un número, signo y texto.
linkDescription: Partes especificas del texto pueden ser mostradas como URL.
boldDescription: Resalta las letras haciéndolas más gruesas.
small: Pequeño
smallDescription: Muestra el contenido de manera pequeña y delgada.
inlineMathDescription: Muestra fórmulas matemáticas (KaTeX) en linea.
tadaDescription: Da al contenido un "Tada!" del tipo animación.
bounceDescription: Brinda al contenido una animación de rebote.
emojiDescription: Al colocar dos puntos en un emoji personalizado, se puede mostrar
un emoji personalizado.
jelly: Animación (Jelly)
twitchDescription: Da al contenido una animación fuertemente temblorosa.
twitch: Animación (Twitch)
spin: Animación (Spin)
shakeDescription: Brinda al contenido una animación temblorosa.
inlineMath: Función matemática (Inline)
rainbow: Arcoíris
x4Description: Muestra el contenido de la manera más grandemente posible.
blurDescription: Muestra borroso el contenido. Se mostrará con claridad cuando se
cubra.
spinDescription: Da al contenido una animación de girar.
x2: Grande
x2Description: Muestra en grande el contenido.
x3Description: Muestra más grande el contenido.
x4: Increíblemente grande
blur: Borroso
fontDescription: Agrega la fuente para mostrar contenido.
x3: Muy grande
_instanceTicker:
none: "No mostrar"
remote: "Mostrar a usuarios remotos"
@ -960,7 +1005,6 @@ _permissions:
"write:notes": "Crear/borrar notas"
"read:notifications": "Ver notificaciones"
"write:notifications": "Administrar notificaciones"
"read:reactions": "Ver reacciones"
"write:reactions": "Administrar reacciones"
"write:votes": "Votar"
"read:pages": "Ver páginas"
@ -1144,7 +1188,7 @@ _notification:
youWereFollowed: "te ha seguido"
youReceivedFollowRequest: "Has mandado una solicitud de seguimiento"
yourFollowRequestAccepted: "Tu solicitud de seguimiento fue aceptada"
youWereInvitedToGroup: "Invitado al grupo"
youWereInvitedToGroup: "{userName} invitado al grupo"
_types:
follow: "Siguiendo"
mention: "Menciones"
@ -1179,3 +1223,116 @@ _deck:
mentions: "Menciones"
direct: "Mensaje directo"
_services: {}
translationService: Servicio de traducción
translationSettings: Ajustes de traducción
selectAll: Seleccionar todo
setCategory: Establecer categoría
unlimited: Ilimitado
setTag: Establecer tag
recentNHours: Últimas {n} horas
check: Verificar
unrenoteAll: Quitar todas las renotas
unclip: Desenganchar
deleteAllFiles: Borrar todos los archivos.
voteConfirm: ¿Confirmas tu voto para "{choice}"?
tenMinutes: 10 minutos
oneHour: Una hora
failedToFetchAccountInformation: No se pudo obtener la información de la cuenta
rateLimitExceeded: Límite de velocidad excedido
cropImage: Cortar imagen
recentNDays: Últimos {n} días
typeToConfirm: Por favor ingrese {x} para confirmar
cropImageAsk: ¿Desea cortar esta imagen?
cannotAttachFileWhenAccountSwitched: No puedes adjuntar un archivo mientras cambias
de cuenta.
cannotSwitchAccountWhenFileAttached: No puedes cambiar de cuenta mientras se adjuntan
archivos.
threadMuteNotificationsDesc: Selecciona las notificaciones que deseas ver de este
hilo. Los ajustes globales de notificación también se aplicarán. La desactivación
tiene prioridad.
ffVisibilityDescription: Permite configurar quien puede ver a quienes sigues y quienes
te siguen.
deleteAccountConfirm: Esto borrará se manera irreversible tu cuenta {handle}. ¿Quieres
proceder?
incorrectPassword: Contraseña incorrecta.
leaveGroup: Dejar grupo
overridedDeviceKind: Tipo de dispositivo
smartphone: Smartphone
auto: Automático
themeColor: Color de teletipo de instancia
size: Tamaño
numberOfColumn: Número de columnas
instanceDefaultLightTheme: Tema claro predeterminado para la instancia
oneDay: Un día
oneWeek: Una semana
numberOfPageCache: Número de páginas en caché
confirmToUnclipAlreadyClippedNote: Esta nota ya forma parte del clip "{name}". ¿Quieres
eliminarlo de este clip en su lugar?
noEmailServerWarning: Correo del servidor no configurado.
thereIsUnresolvedAbuseReportWarning: Hay reportes sin resolver.
recommended: Recomendado
addTag: Agregar tag
removeTag: Quitar tag
_emailUnavailable:
used: El correo ya se encuentra en uso
format: El formato del correo es invalido
disposable: No se puede utilizar direcciones de correo electrónico desechables
mx: El servidor del correo es inválido
smtp: El servido del correo no responde
exportAll: Exportar todo
exportSelected: Exportar seleccionados
botFollowRequiresApproval: Solicitudes de seguimiento de cuentas marcadas como "bots"
necesitan aprobación
unrenoteAllConfirm: ¿Estas seguro de querer quitar todas las renotas de esta nota?
signinHistoryExpires: Los datos de los intentos de sesión serán borrados automáticamente
luego de 60 días, debido a regulaciones de privacidad.
tablet: Tableta
mutePeriod: Duración de mute
reflectMayTakeTime: Puede tomar cierto tiempo en que se reflejen los cambios.
isSystemAccount: Una cuenta creada y operada automáticamente por el sistema.
deleteAccount: Eliminar cuenta
numberOfPageCacheDescription: Aumentar este número mejorará la comodidad para los
usuarios, pero provocará una mayor carga del servidor y más memoria se utilizará.
externalCssSnippets: Algunos fragmentos de CSS para inspirar (no administrados por
FoundKey)
_signup:
emailSent: Se envió un correo de confirmación a ({email}). Por favor haz click en
link adjunto para completar la creación de cuenta.
almostThere: Ya casi
emailAddressInfo: Por favor ingresa tu correo electrónico. No sera público.
instanceDefaultThemeDescription: Ingrese el código de tema en el formato del objeto
stopActivityDeliveryDescription: Las actividades locales no serán enviadas a esta
instancia. Las actividades recibidas de recepción funcionan como antes.
documentation: Documentación
file: Archivo
federateBlocks: Bloques Federados
federateBlocksDescription: Si esta deshabilitado, las actividades bloqueadas no serán
enviadas.
useDrawerReactionPickerForMobile: Mostrar selección de reacción como cajón en móvil
leaveGroupConfirm: ¿Estas seguro de salir "{name}"?
clickToFinishEmailVerification: Por favor presiona [{ok}] para completar la verificación
email.
oauthErrorGoBack: Ocurrió un error al tratar de autenticar una app de terceros. Por
favor regresa e intenta de nuevo.
appAuthorization: Autorización de app
noPermissionsRequested: (No hay permisos solicitados).
selectMode: Selección múltiple
renoteMute: Ocultar renotas
renoteUnmute: Mostrar renotas
blockThisInstanceDescription: Las actividades locales no serán enviadas a esta instancia.
Las actividades de esta instancia serán descartadas.
instanceDefaultDarkTheme: Tema oscuro predeterminado para la instancia
showLess: Mostrar menos
regexpError: Error de Expresión Regular
regexpErrorDescription: 'Hay un error en la expresión regular de la linea {line} de
{tab} palabras silenciadas:'
unlikeConfirm: ¿En verdad quieres remover tu like?
breakFollow: Quitar seguidor
reporter: Reportero
continueThread: Ver la continuación del hilo
uploadFailedSize: El archivo es muy grande para subirse.
uploadFailed: Subida fallida
uploadFailedDescription: No se pudo subir el archivo.
movedTo: Este usuario se ha movido a {handle}.
attachedToNotes: Notas del archivo
showAttachedNotes: Mostrar notas del archivo

View file

@ -71,8 +71,8 @@ importRequested: "Vous avez initié un import. Cela pourrait prendre un peu de t
lists: "Listes"
note: "Notes"
notes: "Notes"
following: "Abonnements"
followers: "Abonné·e·s"
following: "Suivis"
followers: "Vous suivent"
followsYou: "Vous suit"
createList: "Créer une liste"
manageLists: "Gérer les listes"
@ -88,15 +88,15 @@ youShouldUpgradeClient: "Si la page ne s'affiche pas correctement, rechargez-la
\ mettre votre client à jour."
enterListName: "Nom de la liste"
privacy: "Confidentialité"
makeFollowManuallyApprove: "Accepter manuellement les demandes dabonnement"
makeFollowManuallyApprove: "Accepter manuellement les demandes de suivi"
defaultNoteVisibility: "Visibilité des notes par défaut"
follow: "Sabonner"
followRequest: "Demande dabonnement"
followRequests: "Demandes dabonnement"
unfollow: "Se désabonner"
followRequestPending: "Demande d'abonnement en attente de confirmation"
follow: "Suivre"
followRequest: "Demande de suivi"
followRequests: "Demandes de suivi"
unfollow: "Ne plus suivre"
followRequestPending: "Demande de suivi en attente de confirmation"
renote: "Renoter"
unrenote: "Annuler la Renote"
unrenote: "Retirer la renote"
quote: "Citer"
pinnedNote: "Note épinglée"
you: "Vous"
@ -188,7 +188,9 @@ clearCachedFilesConfirm: "Êtes-vous sûr·e de vouloir vider tout le cache de f
\ distants ?"
blockedInstances: "Instances bloquées"
blockedInstancesDescription: "Listez les instances que vous désirez bloquer, une par\
\ ligne. Ces instances ne seront plus en capacité d'interagir avec votre instance."
\ ligne. Ces instances ne seront plus en capacité d'interagir avec votre instance.\
\ Les noms de domaine non-ASCII doivent être encodés en punycode. Les sous-domaines\
\ de ces instances seront aussi bloqués."
muteAndBlock: "Masqué·e·s / Bloqué·e·s"
mutedUsers: "Utilisateur·rice·s en sourdine"
blockedUsers: "Utilisateur·rice·s bloqué·e·s"
@ -275,8 +277,6 @@ createFolder: "Créer un dossier"
renameFolder: "Renommer le dossier"
deleteFolder: "Supprimer le dossier"
addFile: "Ajouter un fichier"
emptyDrive: "Le Drive est vide"
emptyFolder: "Le dossier est vide"
unableToDelete: "Suppression impossible"
inputNewFileName: "Entrez un nouveau nom de fichier"
inputNewDescription: "Veuillez entrer une nouvelle description"
@ -683,7 +683,6 @@ editCode: "Modifier le code"
apply: "Appliquer"
receiveAnnouncementFromInstance: "Recevoir les messages d'information de l'instance"
emailNotification: "Notifications par mail"
publish: "Public"
useReactionPickerForContextMenu: "Clic-droit pour ouvrir le panneau de réactions"
typingUsers: "{users} est en train d'écrire..."
jumpToSpecifiedDate: "Se rendre à la date"
@ -722,10 +721,7 @@ switch: "Remplacer"
noMaintainerInformationWarning: "Informations administrateur non configurées."
noBotProtectionWarning: "La protection contre les bots n'est pas configurée."
configure: "Configurer"
postToGallery: "Publier dans la galerie"
gallery: "Galerie"
recentPosts: "Les plus récentes"
popularPosts: "Les plus consultées"
shareWithNote: "Partager dans une note"
emailNotConfiguredWarning: "Vous n'avez pas configuré d'adresse e-mail."
ratio: "Ratio"
@ -831,11 +827,6 @@ _forgotPassword:
contactAdmin: "Cette instance ne permettant pas l'utilisation d'adresses e-mail,\
\ prenez contact avec l'administrateur·rice pour procéder à la réinitialisation\
\ de votre mot de passe."
_gallery:
my: "Mes publications"
liked: "Publications que j'ai aimées"
like: "J'aime"
unlike: "Je naime pas"
_email:
_follow:
title: "Vous suit"
@ -1063,38 +1054,34 @@ _2fa:
step2Url: 'Vous pouvez aussi entrer cette URL si vous utilisez un client lourd sur
ordinateur :'
_permissions:
"read:account": "Afficher les informations du compte"
"write:account": "Mettre à jour les informations de votre compte"
"read:blocks": "Voir les comptes bloqués"
"write:blocks": "Gérer les comptes bloqués"
"read:drive": "Parcourir le Drive"
"write:drive": "Écrire sur le Drive"
"read:favorites": "Afficher les favoris"
"write:favorites": "Gérer les favoris"
"read:following": "Voir les informations de vos abonnements"
"write:following": "Abonnements/Se désabonner"
"read:messaging": "Voir vos discussions"
"write:messaging": "Gérer les discussions"
"read:mutes": "Voir les comptes masqués"
"write:mutes": "Gérer les comptes masqués"
"write:notes": "Créer / supprimer des notes"
"read:notifications": "Afficher les notifications"
"write:notifications": "Gérer vos notifications"
"read:reactions": "Lire les réactions"
"write:reactions": "Gérer vos réactions"
"write:votes": "Voter"
"read:pages": "Voir vos pages"
"read:account": "Lire les informations du compte"
"write:account": "Mettre à jour les informations du compte"
"read:blocks": "Lire les utilisateurs bloqués"
"write:blocks": "Bloquer et Débloquer des comptes"
"read:drive": "Lister les fichiers et dossiers du drive"
"write:drive": "Créer, changer et supprimer des fichiers du drive"
"read:favorites": "Lister les notes favorites"
"write:favorites": "Gérer les notes favorites"
"read:following": "Lister les comptes suivis et les comptes qui vous suivent"
"write:following": "Abonner et désabonner autres comptes"
"read:messaging": "Voir vos discussions et leur historique"
"write:messaging": "Créer et supprimer les messages des discussions"
"read:mutes": "Lister les comptes desquels vous masquez les notes ou les renotes"
"write:mutes": "Masquer et démasquer les notes ou les renotes des comptes"
"write:notes": "Gérer les notes"
"read:notifications": "Lire vos notifications"
"write:notifications": "Gérer vos notifications et en créer"
"write:reactions": "Gérer les réactions"
"write:votes": "Voter dans les sondages"
"read:pages": "Lister et lire les pages"
"write:pages": "Gérer les pages"
"read:page-likes": "Voir les mentions « J'aime » des pages"
"write:page-likes": "Gérer les mentions « J'aime » sur les pages"
"read:user-groups": "Voir les groupes d'utilisateur·rice·s"
"write:user-groups": "Éditer les groupes des utilisateur·rice·s"
"read:channels": "Lire les canaux"
"read:channels": "Lister et lire les canaux suivis et rejoints"
"write:channels": "Gérer les canaux"
"read:gallery": "Voir la galerie"
"write:gallery": "Éditer la galerie"
"read:gallery-likes": "Voir les mentions « J'aime » dans la galerie"
"write:gallery-likes": "Gérer les mentions « J'aime » dans la galerie"
"read:reactions": Lister les réactions
_auth:
shareAccess: "Autoriser \"{name}\" à accéder à votre compte ?"
shareAccessAsk: "Voulez-vous vraiment autoriser cette application à accéder à votre\
@ -1393,6 +1380,19 @@ regexpErrorDescription: "Il y a une erreur dans l'expression régulière de la l
\ {line} de vos mots ignorées {tab} :"
forwardReportIsAnonymous: Un compte système anonyme sera affiché, à la place de votre
compte, lors du signalement à l'instance distante.
attachmentRequired: Un attachement au moins est nécessaire.
useDrawerReactionPickerForMobile: Sur mobile afficher un tiroir pour le panneau de
réaction
appAuthorization: Authorisation de l'application
noPermissionsRequested: (Aucune permission demandée.)
oauthErrorGoBack: Une erreur est survenue pendant l'authentification d'une application
tierce. Veuillez réessayer.
botFollowRequiresApproval: Accepter manuellement les demandes de suivi des comptes
marqués « robots »
unrenoteAllConfirm: Étes-vous certain·e de vouloir retirer toutes les renotes de cette
note ?
unrenoteAll: Retirer toutes les renotes
deleteAllFiles: Supprimer tous les fichiers
cannotAttachFileWhenAccountSwitched: Vous ne pouvez pas joindre un fichier à partir
d'un autre compte.
cannotSwitchAccountWhenFileAttached: Vous ne pouvez pas changer de compte tant qu'il
y a des pièces jointes.

View file

@ -12,7 +12,7 @@ password: "Kata sandi"
forgotPassword: "Lupa Kata Sandi"
fetchingAsApObject: "Mengambil data dari Fediverse..."
ok: "OK"
gotIt: "Saya mengerti"
gotIt: "Saya mengerti!"
cancel: "Batalkan"
renotedBy: "direnote oleh {user}"
noNotes: "Tidak ada catatan"
@ -24,7 +24,7 @@ otherSettings: "Pengaturan lainnya"
openInWindow: "Buka di jendela"
profile: "Profil"
timeline: "Linimasa"
noAccountDescription: "Pengguna ini belum menulis bio"
noAccountDescription: "Pengguna ini belum menulis biodata mereka."
login: "Masuk"
loggingIn: "Sedang masuk"
logout: "Keluar"
@ -62,8 +62,8 @@ files: "Berkas"
download: "Unduh"
driveFileDeleteConfirm: "Hapus {name}? Catatan dengan berkas terkait juga akan terhapus."
unfollowConfirm: "Berhenti mengikuti {name}?"
exportRequested: "Kamu telah meminta ekspor. Ini akan memakan waktu sesaat. Setelah\
\ ekspor selesai, berkas yang dihasilkan akan ditambahkan ke Drive"
exportRequested: "Anda telah meminta ekspor. Ini mungkin memerlukan waktu beberapa\
\ saat. File ini akan ditambahkan ke Drive Anda setelah selesai."
importRequested: "Kamu telah meminta impor. Ini akan memakan waktu sesaat."
lists: "Daftar"
note: "Catat"
@ -100,8 +100,8 @@ clickToShow: "Klik untuk melihat"
sensitive: "Konten sensitif"
add: "Tambahkan"
reaction: "Reaksi"
reactionSettingDescription2: "Geser untuk memindah urutkan, klik untuk menghapus,\
\ tekan \"+\" untuk menambahkan"
reactionSettingDescription2: "Seret untuk menyusun ulang, klik untuk menghapus, tekan\
\ \"+\" untuk menambahkan."
attachCancel: "Hapus lampiran"
markAsSensitive: "Tandai sebagai konten sensitif"
unmarkAsSensitive: "Hapus tanda konten sensitif"
@ -193,10 +193,10 @@ blockedUsers: "Pengguna yang diblokir"
noUsers: "Tidak ada pengguna"
editProfile: "Sunting profil"
noteDeleteConfirm: "Apakah kamu yakin ingin menghapus catatan ini?"
pinLimitExceeded: "Kamu tidak dapat menyematkan catatan lagi"
pinLimitExceeded: "Anda tidak dapat menyematkan catatan lagi."
intro: "Instalasi FoundKey telah selesai! Mohon untuk membuat pengguna admin."
done: "Selesai"
processing: "Memproses"
processing: "Pemrosesan..."
preview: "Pratinjau"
default: "Bawaan"
noCustomEmojis: "Tidak ada emoji kustom"
@ -210,7 +210,7 @@ publishing: "Sedang menyiarkan langsung"
notResponding: "Tidak ada respon"
changePassword: "Ubah kata sandi"
security: "Keamanan"
retypedNotMatch: "Input tidak sama"
retypedNotMatch: "Input tidak cocok."
currentPassword: "Kata sandi saat ini"
newPassword: "Kata sandi baru"
newPasswordRetype: "Ulangi kata sandi baru"
@ -237,7 +237,7 @@ fromUrl: "Dari URL"
uploadFromUrl: "Unggah dari URL"
uploadFromUrlDescription: "URL berkas yang ingin kamu unggah"
uploadFromUrlRequested: "Pengunggahan telah diminta"
uploadFromUrlMayTakeTime: "Membutuhkan beberapa waktu hingga pengunggahan selesai"
uploadFromUrlMayTakeTime: "Mungkin diperlukan waktu hingga unggahan selesai."
explore: "Jelajahi"
messageRead: "Telah dibaca"
noMoreHistory: "Tidak ada sejarah lagi"
@ -274,8 +274,6 @@ createFolder: "Buat folder"
renameFolder: "Ubah nama folder"
deleteFolder: "Hapus folder"
addFile: "Tambahkan berkas"
emptyDrive: "Drive kosong"
emptyFolder: "Folder kosong"
unableToDelete: "Tidak dapat menghapus"
inputNewFileName: "Masukkan nama berkas yang baru"
inputNewDescription: "Masukkan keterangan disini"
@ -405,7 +403,7 @@ newMessageExists: "Kamu mendapatkan pesan baru"
onlyOneFileCanBeAttached: "Kamu hanya dapat melampirkan satu berkas ke dalam pesan"
signinRequired: "Silahkan login"
invitationCode: "Kode undangan"
checking: "Memeriksa"
checking: "Memeriksa..."
available: "Tersedia"
unavailable: "Tidak tersedia"
usernameInvalidFormat: "Hanya dapat menerima karakter a-z, A-Z dan angka 0-9."
@ -447,11 +445,10 @@ showFeaturedNotesInTimeline: "Tampilkan catatan yang diunggulkan di linimasa"
objectStorage: "Object Storage"
useObjectStorage: "Gunakan object storage"
objectStorageBaseUrl: "Base URL"
objectStorageBaseUrlDesc: "Prefix URL digunakan untuk mengkonstruksi URL ke object\
\ (media) referencing. Tentukan URL jika kamu menggunakan CDN atau Proxy, jika tidak\
\ tentukan alamat yang dapat diakses secara publik sesuai dengan panduan dari layanan\
\ yang akan kamu gunakan, contohnya. 'https://<bucket>.s3.amazonaws.com' untuk AWS\
\ S3, dan 'https://storage.googleapis.com/<bucket>' untuk GCS."
objectStorageBaseUrlDesc: "URL yang digunakan sebagai referensi. Tentukan URL CDN\
\ atau Proksi Anda jika Anda menggunakan keduanya.\nUntuk S3 gunakan 'https://<bucket>.s3.amazonaws.com'\
\ dan untuk GCS atau layanan yang setara gunakan 'https://storage.googleapis.com/<bucket>',\
\ dst."
objectStorageBucket: "Bucket"
objectStorageBucketDesc: "Mohon tentukan nama bucket yang digunakan pada layanan yang\
\ telah dikonfigurasi."
@ -495,7 +492,7 @@ 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\
\ Kamu bisa menulis, mengeksuksi, serta mengecek hasil yang berinteraksi dengan\
\ FoundKey."
output: "Keluaran"
updateRemoteUser: "Perbaharui informasi pengguna luar"
@ -649,8 +646,8 @@ contact: "Kontak"
useSystemFont: "Gunakan font bawaan sistem operasi"
clips: "Klip"
makeExplorable: "Buat akun tampil di \"Jelajahi\""
makeExplorableDescription: "Jika kamu mematikan ini, akun kamu tidak akan muncul di\
\ bagian \"Jelajahi:"
makeExplorableDescription: "Jika Anda menonaktifkannya, akun Anda tidak akan muncul\
\ di bagian \"Jelajahi\"."
showGapBetweenNotesInTimeline: "Tampilkan jarak diantara catatan pada linimasa"
duplicate: "Duplikat"
left: "Kiri"
@ -678,7 +675,6 @@ editCode: "Sunting kode"
apply: "Terapkan"
receiveAnnouncementFromInstance: "Terima pemberitahuan surel dari instansi ini"
emailNotification: "Pemberitahuan surel"
publish: "Terbitkan"
useReactionPickerForContextMenu: "Buka pemilih reaksi dengan klik-kanan"
typingUsers: "{users} sedang mengetik..."
jumpToSpecifiedDate: "Loncat ke tanggal spesifik"
@ -717,10 +713,7 @@ switch: "Beralih"
noMaintainerInformationWarning: "Informasi pengelola belum disetel."
noBotProtectionWarning: "Proteksi bot belum disetel."
configure: "Setel"
postToGallery: "Posting ke galeri"
gallery: "Galeri"
recentPosts: "Postingan terbaru"
popularPosts: "Postingan populer"
shareWithNote: "Bagikan dengan catatan"
emailNotConfiguredWarning: "Alamat surel tidak disetel."
ratio: "Rasio"
@ -765,7 +758,7 @@ ffVisibility: "Visibilitas Mengikuti/Pengikut"
ffVisibilityDescription: "Mengatur siapa yang dapat melihat pengikutmu dan yang kamu\
\ ikuti."
continueThread: "Lihat lanjutan thread"
deleteAccountConfirm: "Akun akan dihapus. Apakah kamu yakin?"
deleteAccountConfirm: "Ini akan menghapuskan akun {handle} secara permanen. Lanjutkan?"
incorrectPassword: "Kata sandi salah."
voteConfirm: "Konfirmasi suara kamu untuk ({choice})"
hide: "Sembunyikan"
@ -829,11 +822,6 @@ _forgotPassword:
\ admin segera."
contactAdmin: "Instansi ini tidak mendukung menggunakan alamat surel, mohon kontak\
\ admin untuk mengatur ulang password kamu."
_gallery:
my: "Postingan saya"
liked: "Postingan yang disukai"
like: "Suka"
unlike: "Hapus suka"
_email:
_follow:
title: "Mengikuti kamu"
@ -1076,7 +1064,6 @@ _permissions:
"write:notes": "Buat atau hapus catatan"
"read:notifications": "Lihat pemberitahuan"
"write:notifications": "Sunting pemberitahuan"
"read:reactions": "Lihat reaksi"
"write:reactions": "Sunting reaksi"
"write:votes": "Beri suara"
"read:pages": "Lihat halaman"
@ -1087,15 +1074,11 @@ _permissions:
"write:user-groups": "Sunting atau hapus grup pengguna"
"read:channels": "Lihat saluran"
"write:channels": "Sunting saluran"
"read:gallery": "Lihat galeri"
"write:gallery": "Sunting galeri"
"read:gallery-likes": "Lihat daftar postingan galeri yang disukai"
"write:gallery-likes": "Sunting daftar postingan galeri yang disukai"
_auth:
shareAccess: "Apakah kamu ingin mengijinkan \"{name}\" untuk mengakses akun ini?"
shareAccessAsk: "Apakah kamu ingin mengijinkan aplikasi ini untuk mengakses akun\
\ kamu?"
permissionAsk: "Aplikasi ini membutuhkan beberapa ijin, yaitu:"
permissionAsk: "Aplikasi ini meminta izin berikut ini"
pleaseGoBack: "Mohon kembali ke aplikasi kamu"
callback: "Mengembalikan kamu ke aplikasi"
denied: "Akses ditolak"
@ -1239,7 +1222,7 @@ _pages:
editPage: "Sunting halaman"
readPage: "Lihat sumber kode aktif"
created: "Halaman berhasil dibuat"
updated: "Halaman berhasil diperbaharui!"
updated: "Halaman berhasil diperbaharui"
deleted: "Halaman telah dihapus"
pageSetting: "Pengaturan Halaman"
nameAlreadyExists: "URL Halaman yang ditentukan sudah ada"
@ -1279,7 +1262,7 @@ _notification:
youWereFollowed: "Mengikuti kamu"
youReceivedFollowRequest: "Kamu menerima permintaan mengikuti"
yourFollowRequestAccepted: "Permintaan mengikuti kamu telah diterima"
youWereInvitedToGroup: "Telah diundang ke grup"
youWereInvitedToGroup: "{userName} mengundang Anda ke grup"
pollEnded: "Hasil Kuesioner telah keluar"
emptyPushNotificationMessage: "Pembaruan notifikasi dorong"
_types:

View file

@ -66,7 +66,7 @@ driveFileDeleteConfirm: "Vuoi davvero eliminare il file「{name}? Anche gli alle
unfollowConfirm: "Vuoi davvero smettere di seguire {name}?"
exportRequested: "Hai richiesto un'esportazione, e potrebbe volerci tempo. Quando\
\ sarà compiuta, il file verrà aggiunto direttamente al Drive."
importRequested: "Hai richiesto un'importazione. Può volerci tempo. "
importRequested: "Hai richiesto un'importazione. Può volerci tempo."
lists: "Liste"
note: "Nota"
notes: "Note"
@ -78,7 +78,7 @@ manageLists: "Gestisci liste"
error: "Errore"
somethingHappened: "Si è verificato un problema"
retry: "Riprova"
pageLoadError: "Caricamento pagina non riuscito. "
pageLoadError: "Caricamento pagina non riuscito."
pageLoadErrorDescription: "Questo viene normalmente causato dalla rete o dalla cache\
\ del browser. Si prega di pulire la cache, o di attendere e riprovare più tardi."
serverIsDead: "Il server non risponde. Si prega di attendere e riprovare più tardi."
@ -190,7 +190,7 @@ blockedUsers: "Account bloccati"
noUsers: "Nessun utente trovato"
editProfile: "Modifica profilo"
noteDeleteConfirm: "Eliminare questo Nota?"
pinLimitExceeded: "Non puoi fissare altre note "
pinLimitExceeded: "Non puoi fissare altre note."
intro: "L'installazione di FoundKey è finita! Si prega di creare un account amministratore."
done: "Fine"
processing: "In elaborazione"
@ -268,8 +268,6 @@ createFolder: "Nuova cartella"
renameFolder: "Rinominare cartella"
deleteFolder: "Elimina cartella"
addFile: "Allega"
emptyDrive: "Il Drive è vuoto"
emptyFolder: "La cartella è vuota"
unableToDelete: "Eliminazione impossibile"
inputNewFileName: "Inserisci nome del nuovo file"
inputNewDescription: "Inserisci una nuova descrizione"
@ -442,7 +440,7 @@ useObjectStorage: "Utilizza stoccaggio oggetti"
objectStorageBaseUrl: "Base URL"
objectStorageBaseUrlDesc: "URL di riferimento. In caso di utilizzo di proxy o CDN\
\ l'URL è 'https://<bucket>.s3.amazonaws.com' per S3, 'https://storage.googleapis.com/<bucket>'\
\ per GCS eccetera. "
\ per GCS eccetera."
objectStorageBucket: "Bucket"
objectStorageBucketDesc: "Specificare il nome del bucket utilizzato dal provider."
objectStoragePrefix: "Prefix"
@ -527,7 +525,7 @@ large: "Grande"
medium: "Predefinito"
small: "Piccolo"
generateAccessToken: "Genera token di accesso"
permission: "Autorizzazioni "
permission: "Autorizzazioni"
enableAll: "Abilita tutto"
disableAll: "Disabilita tutto"
tokenRequested: "Autorizza accesso all'account"
@ -661,11 +659,10 @@ editCode: "Modifica codice"
apply: "Applica"
receiveAnnouncementFromInstance: "Ricevi i messaggi informativi dall'istanza"
emailNotification: "Eventi per notifiche via mail"
publish: "Pubblico"
useReactionPickerForContextMenu: "Cliccare sul tasto destro per aprire il pannello\
\ di reazioni"
typingUsers: "{users} sta(nno) scrivendo"
jumpToSpecifiedDate: "Vai alla data "
jumpToSpecifiedDate: "Vai alla data"
clear: "Cancella"
markAllAsRead: "Segna tutti come già letti"
goBack: "Indietro"
@ -700,10 +697,7 @@ switch: "Sostituisci"
noMaintainerInformationWarning: "Le informazioni amministratore non sono impostate."
noBotProtectionWarning: "Nessuna protezione impostata contro i bot."
configure: "Imposta"
postToGallery: "Pubblicare nella galleria"
gallery: "Galleria"
recentPosts: "Le più recenti"
popularPosts: "Le più visualizzate"
shareWithNote: "Condividere in nota"
emailNotConfiguredWarning: "Non hai impostato nessun indirizzo e-mail."
ratio: "Rapporto"
@ -780,11 +774,6 @@ _forgotPassword:
contactAdmin: "Poiché questa istanza non permette l'utilizzo di una mail, si prega\
\ di contattare l'amministratore·trice dell'istanza per poter ripristinare la\
\ password."
_gallery:
my: "Le mie pubblicazioni"
liked: "Pubblicazioni che mi piacciono"
like: "Mi piace!"
unlike: "Non mi piace più"
_email:
_follow:
title: "Ha iniziato a seguirti"
@ -907,7 +896,7 @@ _ago:
secondsAgo: "{n}s fa"
minutesAgo: "{n}min fa"
hoursAgo: "{n}h fa"
daysAgo: "{1} giorni fa"
daysAgo: "{n} giorni fa"
weeksAgo: "{n} settimane fa"
monthsAgo: "{n} mesi fa"
yearsAgo: "{n} anni fa"
@ -925,22 +914,22 @@ _tutorial:
\ hai pubblicato alcuna nota ancora."
step2_1: "Prima di scrivere una nota o di seguire un account, imposta il tuo profilo!"
step2_2: "Aggiungere qualche informazione su di te aumenterà le tue possibilità\
\ di essere seguit@ da altre persone. "
\ di essere seguit@ da altre persone."
step3_1: "Hai finito di impostare il tuo profilo?"
step3_2: "Ora, puoi pubblicare una nota. Facciamo una prova! Premi il pulsante a\
\ forma di penna in cima allo schermo per aprire una finestra di dialogo. "
\ forma di penna in cima allo schermo per aprire una finestra di dialogo."
step3_3: "Scritto il testo della nota, puoi pubblicarla premendo il pulsante nella\
\ parte superiore destra della finestra di dialogo."
step3_4: "Non ti viene niente in mente? Perché non scrivi semplicemente \"Ho appena\
\ cominciato a usare FoundKey\"?"
step4_1: "Hai pubblicato qualcosa?"
step4_2: "Se puoi visualizzare la tua nota sulla timeline, ce l'hai fatta!"
step5_1: "Adesso, cerca di seguire altre persone per vivacizzare la tua timeline. "
step5_1: "Adesso, cerca di seguire altre persone per vivacizzare la tua timeline."
step5_2: "La pagina {featured} mostra le note di tendenza su questa istanza, e magari\
\ ti aiuterà a trovare account che ti piacciono e che vorrai seguire. Oppure,\
\ potrai trovare utenti popolari usando {explore}."
step5_3: "Per seguire altrə utenti, clicca sul loro avatar per aprire la pagina\
\ di profilo dove puoi premere il pulsante \"Seguire\". "
\ di profilo dove puoi premere il pulsante \"Seguire\"."
step5_4: "Alcunə utenti scelgono di confermare manualmente le richieste di follow\
\ che ricevono, quindi a seconda delle persone potrebbe volerci un pò prima che\
\ la tua richiesta sia accolta."
@ -951,7 +940,7 @@ _tutorial:
step6_3: "Per inviare una reazione, premi l'icona + della nota e scegli l'emoji\
\ che vuoi mandare."
step7_1: "Complimenti! Sei arrivat@ alla fine dell'esercitazione di base su come\
\ usare FoundKey. "
\ usare FoundKey."
step7_2: "Se vuoi saperne di più su FoundKey, puoi dare un'occhiata alla sezione\
\ {help}."
step7_3: "Da ultimo, buon divertimento su FoundKey! \U0001F680"
@ -975,7 +964,6 @@ _permissions:
"write:notes": "Creare / Eliminare note"
"read:notifications": "Visualizza notifiche"
"write:notifications": "Gerisci notifiche"
"read:reactions": "Vedi reazioni"
"write:reactions": "Gerisci reazioni"
"write:votes": "Votare"
"read:pages": "Visualizzare pagine"
@ -1128,9 +1116,9 @@ _timelines:
_pages:
newPage: "Crea pagina"
editPage: "Modifica pagina"
readPage: "Visualizzando fonte "
created: "Pagina creata!"
updated: "Pagina aggiornata con successo!"
readPage: "Visualizzando fonte"
created: "Pagina creata"
updated: "Pagina aggiornata con successo"
deleted: "Pagina eliminata"
pageSetting: "Impostazioni pagina"
nameAlreadyExists: "Esiste già una pagina con lo stesso URL."

View file

@ -9,9 +9,9 @@ notifications: "通知"
username: "ユーザー名"
password: "パスワード"
forgotPassword: "パスワードを忘れた"
fetchingAsApObject: "連合に照会中"
fetchingAsApObject: "連合に照会中..."
ok: "OK"
gotIt: "わかった"
gotIt: "わかった!"
cancel: "キャンセル"
renotedBy: "{user}がRenote"
noNotes: "ノートはありません"
@ -23,7 +23,7 @@ otherSettings: "その他の設定"
openInWindow: "ウィンドウで開く"
profile: "プロフィール"
timeline: "タイムライン"
noAccountDescription: "自己紹介はありません"
noAccountDescription: "このユーザーはまだ自己紹介文を書いていません。"
login: "ログイン"
loggingIn: "ログイン中"
logout: "ログアウト"
@ -123,12 +123,12 @@ addEmoji: "絵文字を追加"
cacheRemoteFiles: "リモートのファイルをキャッシュする"
cacheRemoteFilesDescription: "この設定を無効にすると、リモートファイルをキャッシュせず直リンクするようになります。サーバーのストレージを節約できますが、サムネイルが生成されないので通信量が増加します。"
flagAsBot: "Botとして設定"
flagAsBotDescription: "このアカウントがプログラムによって運用される場合は、このフラグをオンにします。オンにすると、反応の連鎖を防ぐためのフラグとして他の開発者に役立ったり、FoundKeyのシステム上での扱いがBotに合ったものになります。"
flagAsBotDescription: "このアカウントがプログラムによって制御される場合は、このフラグをオンにします。オンにすると、別のBotとの終わりのないインタラクションの連続を防ぐためのフラグとして他の開発者に役立ったり、このアカウントをBotとして扱うためにFoundKey内部のシステムを調整します。"
flagAsCat: "Catとして設定"
flagAsCatDescription: "このアカウントが猫であることを示す場合は、このフラグをオンにします。"
flagShowTimelineReplies: "タイムラインにノートへの返信を表示する"
flagShowTimelineRepliesDescription: "オンにすると、タイムラインにユーザーのノート以外にもそのユーザーの他のノートへの返信を表示します。"
autoAcceptFollowed: "フォロー中ユーザーからのフォロリクを自動承認"
autoAcceptFollowed: "フォローしているユーザーからのフォローリクエストを自動承認"
addAccount: "アカウントを追加"
loginFailed: "ログインに失敗しました"
showOnRemote: "リモートで表示"
@ -165,17 +165,17 @@ clearQueueConfirmText: "未配達の投稿は配送されなくなります。
clearCachedFiles: "キャッシュをクリア"
clearCachedFilesConfirm: "キャッシュされたリモートファイルをすべて削除しますか?"
blockedInstances: "ブロックしたインスタンス"
blockedInstancesDescription: "ブロックしたいインスタンスのホストを改行で区切って設定します。ブロックされたインスタンスは、このインスタンスとやり取りできなくなります。"
blockedInstancesDescription: "ブロックしたいインスタンスのホストを改行で区切って設定します。ブロックされたインスタンスは、このインスタンスとやり取りできなくなります。非ASCII文字を含むドメイン名はpunycodeでエンコードされている必要があります。設定したインスタンスのサブドメインもブロックされます。"
muteAndBlock: "ミュートとブロック"
mutedUsers: "ミュートしたユーザー"
blockedUsers: "ブロックしたユーザー"
noUsers: "ユーザーはいません"
editProfile: "プロフィールを編集"
noteDeleteConfirm: "このノートを削除しますか?"
pinLimitExceeded: "これ以上ピン留めできません"
pinLimitExceeded: "これ以上ピン留めできません"
intro: "FoundKeyのインストールが完了しました管理者アカウントを作成しましょう。"
done: "完了"
processing: "処理中"
processing: "処理中..."
preview: "プレビュー"
default: "デフォルト"
noCustomEmojis: "絵文字はありません"
@ -251,8 +251,6 @@ createFolder: "フォルダーを作成"
renameFolder: "フォルダー名を変更"
deleteFolder: "フォルダーを削除"
addFile: "ファイルを追加"
emptyDrive: "ドライブは空です"
emptyFolder: "フォルダーは空です"
unableToDelete: "削除できません"
inputNewFileName: "新しいファイル名を入力してください"
inputNewDescription: "新しいキャプションを入力してください"
@ -309,7 +307,7 @@ name: "名前"
antennaSource: "受信ソース"
antennaKeywords: "受信キーワード"
antennaExcludeKeywords: "除外キーワード"
antennaKeywordsDescription: "スペースで区切るとAND指定になり、改行で区切るとOR指定になります"
antennaKeywordsDescription: "スペースで区切るとAND指定になり、改行で区切るとOR指定になります"
notifyAntenna: "新しいノートを通知する"
withFileAntenna: "ファイルが添付されたノートのみ"
antennaUsersDescription: "ユーザー名を改行で区切って指定します"
@ -378,10 +376,10 @@ newMessageExists: "新しいメッセージがあります"
onlyOneFileCanBeAttached: "メッセージに添付できるファイルはひとつです"
signinRequired: "続行する前に、サインアップまたはサインインが必要です"
invitationCode: "招待コード"
checking: "確認しています"
checking: "確認しています..."
available: "利用できます"
unavailable: "利用できません"
usernameInvalidFormat: "a~z、A~Z、0~9、_が使えます"
usernameInvalidFormat: "a~z、A~Z、0~9、_が使えます"
tooShort: "短すぎます"
tooLong: "長すぎます"
weakPassword: "弱いパスワード"
@ -419,7 +417,7 @@ showFeaturedNotesInTimeline: "タイムラインにおすすめのノートを
objectStorage: "オブジェクトストレージ"
useObjectStorage: "オブジェクトストレージを使用"
objectStorageBaseUrl: "Base URL"
objectStorageBaseUrlDesc: "参照に使用するURL。CDNやProxyを使用している場合はそのURLS3: 'https://<bucket>.s3.amazonaws.com'、GCS等:\
objectStorageBaseUrlDesc: "参照に使用するURL。CDNやProxyを使用している場合はそのURL。\nS3: 'https://<bucket>.s3.amazonaws.com'、GCS等:\
\ 'https://storage.googleapis.com/<bucket>'。"
objectStorageBucket: "Bucket"
objectStorageBucketDesc: "使用サービスのbucket名を指定してください。"
@ -610,7 +608,7 @@ onlineUsersCount: "{n}人がオンライン"
backgroundColor: "背景"
accentColor: "アクセント"
textColor: "文字"
saveAs: "名前を付けて保存"
saveAs: "名前を付けて保存..."
createdAt: "作成日時"
updatedAt: "更新日時"
deleteConfirm: "削除しますか?"
@ -623,9 +621,8 @@ editCode: "コードを編集"
apply: "適用"
receiveAnnouncementFromInstance: "インスタンスからのお知らせを受け取る"
emailNotification: "メール通知"
publish: "公開"
useReactionPickerForContextMenu: "右クリックでリアクションピッカーを開く"
typingUsers: "{users}が入力中"
typingUsers: "{users}が入力中..."
jumpToSpecifiedDate: "特定の日付にジャンプ"
clear: "クリア"
markAllAsRead: "全て既読にする"
@ -642,7 +639,7 @@ unknown: "不明"
hideOnlineStatus: "オンライン状態を隠す"
hideOnlineStatusDescription: "オンライン状態を隠すと、検索などの一部機能において利便性が低下することがあります。"
federateBlocks: "ブロックを連合に送信"
federateBlocksDescription: "オフにするとBlockのActivityは連合に送信しません"
federateBlocksDescription: "オフにすると、BlockのActivityは連合に送信されません。"
online: "オンライン"
active: "アクティブ"
offline: "オフライン"
@ -661,10 +658,7 @@ switch: "切り替え"
noMaintainerInformationWarning: "管理者情報が設定されていません。"
noBotProtectionWarning: "Botプロテクションが設定されていません。"
configure: "設定する"
postToGallery: "ギャラリーへ投稿"
gallery: "ギャラリー"
recentPosts: "最近の投稿"
popularPosts: "人気の投稿"
shareWithNote: "ノートで共有"
emailNotConfiguredWarning: "メールアドレスの設定がされていません。"
ratio: "比率"
@ -681,7 +675,7 @@ misskeyUpdated: "FoundKeyが更新されました"
whatIsNew: "更新情報を見る"
translate: "翻訳"
translatedFrom: "{x}から翻訳"
accountDeletionInProgress: "アカウントの削除が進行中です"
accountDeletionInProgress: "アカウントの削除が進行中です"
usernameInfo: "サーバー上であなたのアカウントを一意に識別するための名前。アルファベット(a~z, A~Z)、数字(0~9)、およびアンダーバー(_)が使用できます。ユーザー名は後から変更することは出来ません。"
keepCw: "CWを維持する"
pubSub: "Pub/Subのアカウント"
@ -705,7 +699,7 @@ threadMuteNotificationsDesc: "このスレッドから表示する通知を選
ffVisibility: "つながりの公開範囲"
ffVisibilityDescription: "自分のフォロー/フォロワー情報の公開範囲を設定できます。"
continueThread: "さらにスレッドを見る"
deleteAccountConfirm: "アカウント削除されます。よろしいですか?"
deleteAccountConfirm: "アカウント {handle} が不可逆的に削除されます。よろしいですか?"
incorrectPassword: "パスワードが間違っています。"
voteConfirm: "「{choice}」に投票しますか?"
hide: "隠す"
@ -776,12 +770,6 @@ _forgotPassword:
ifNoEmail: "メールアドレスを登録していない場合は、管理者までお問い合わせください。"
contactAdmin: "このインスタンスではメールがサポートされていないため、パスワードリセットを行う場合は管理者までお問い合わせください。"
_gallery:
my: "自分の投稿"
liked: "いいねした投稿"
like: "いいね!"
unlike: "いいね解除"
_email:
_follow:
title: "フォローされました"
@ -799,7 +787,7 @@ _registry:
createKey: "キーを作成"
_aboutMisskey:
about: "FoundKeyはsyuiloによって2014年から開発されている、オープンソースのソフトウェアです。"
about: "FoundKeyは2022年7月から開発されている、Misskeyのフォークです。"
allContributors: "全てのコントリビューター"
source: "ソースコード"
_nsfw:
@ -955,7 +943,7 @@ _time:
_tutorial:
title: "FoundKeyの使い方"
step1_1: "ようこそ"
step1_1: "ようこそ!"
step1_2: "この画面は「タイムライン」と呼ばれ、あなたや、あなたが「フォロー」する人の「ノート」が時系列で表示されます。"
step1_3: "あなたはまだ何もノートを投稿しておらず、誰もフォローしていないので、タイムラインには何も表示されていないはずです。"
step2_1: "ノートを作成したり誰かをフォローしたりする前に、まずあなたのプロフィールを完成させましょう。"
@ -963,11 +951,11 @@ _tutorial:
step3_1: "プロフィール設定はうまくできましたか?"
step3_2: "では試しに、何かノートを投稿してみてください。画面上にある鉛筆マークのボタンを押すとフォームが開きます。"
step3_3: "内容を書いたら、フォーム右上のボタンを押すと投稿できます。"
step3_4: "内容が思いつかない「FoundKey始めました」というのはいかがでしょう"
step3_4: "内容が思いつかない「FoundKey始めました」というのはいかがでしょう!"
step4_1: "投稿できましたか?"
step4_2: "あなたのノートがタイムラインに表示されていれば成功です。"
step5_1: "次は、他の人をフォローしてタイムラインを賑やかにしたいところです。"
step5_2: "{featured}で人気のノートが見れるので、その中から気になった人を選んでフォローしたり、{explore}で人気のユーザーを探すこともできます"
step5_2: "{featured}で人気のノートが見れるので、その中から気になった人を選んでフォローしたり、{explore}で人気のユーザーを探すこともできます!"
step5_3: "ユーザーをフォローするには、ユーザーのアイコンをクリックしてユーザーページを表示し、「フォロー」ボタンを押します。"
step5_4: "ユーザーによっては、フォローが承認されるまで時間がかかる場合があります。"
step6_1: "タイムラインに他のユーザーのノートが表示されていれば成功です。"
@ -989,39 +977,34 @@ _2fa:
securityKeyInfo: "FIDO2をサポートするハードウェアセキュリティキーもしくは端末の指紋認証やPINを使用してログインするように設定できます。"
_permissions:
"read:account": "アカウントの情報をる"
"read:account": "アカウントの情報を読み取る"
"write:account": "アカウントの情報を変更する"
"read:blocks": "ブロックを見る"
"write:blocks": "ブロックを操作する"
"read:drive": "ドライブを見る"
"write:drive": "ドライブを操作する"
"read:favorites": "お気に入りを見る"
"write:favorites": "お気に入りを操作する"
"read:following": "フォローの情報を見る"
"write:following": "フォロー・フォロー解除する"
"read:messaging": "チャットを見る"
"write:messaging": "チャットを操作する"
"read:mutes": "ミュートを見る"
"write:mutes": "ミュートを操作する"
"read:blocks": "どのユーザーをブロックしているかを読み取る"
"write:blocks": "ユーザーをブロック・ブロック解除する"
"read:drive": "ドライブ内のファイルとフォルダをリスト化する"
"write:drive": "ドライブ内でファイルを作成・変更・削除する"
"read:favorites": "お気に入りにしたノートをリスト化する"
"write:favorites": "ノートをお気に入りまたはお気に入り解除する"
"read:following": "自分がフォローしているユーザーおよび自分をフォローしているユーザーをリスト化する"
"write:following": "ユーザーをフォロー・フォロー解除する"
"read:messaging": "チャットの内容と履歴を見る"
"write:messaging": "チャットでメッセージを作成・削除する"
"read:mutes": "ミュートまたはRenoteをミュートにしたユーザーをリスト化する"
"write:mutes": "ユーザーまたはユーザーのRenoteをミュート・ミュート解除する"
"write:notes": "ノートを作成・削除する"
"read:notifications": "通知を見る"
"write:notifications": "通知を操作する"
"read:reactions": "リアクションを見る"
"write:reactions": "リアクションを操作する"
"read:notifications": "通知を読み取る"
"write:notifications": "通知の既読化およびカスタム通知を作成する"
"write:reactions": "リアクションを作成・削除する"
"write:votes": "投票する"
"read:pages": "ページを見る"
"write:pages": "ページを操作する"
"read:page-likes": "ページのいいねを見る"
"write:page-likes": "ページのいいねを操作する"
"read:user-groups": "ユーザーグループを見る"
"write:user-groups": "ユーザーグループを操作する"
"read:channels": "チャンネルを見る"
"write:channels": "チャンネルを操作する"
"read:gallery": "ギャラリーを見る"
"write:gallery": "ギャラリーを操作する"
"read:gallery-likes": "ギャラリーのいいねを見る"
"write:gallery-likes": "ギャラリーのいいねを操作する"
"read:pages": "ページのリスト化・読み取りをする"
"write:pages": "ページを作成・変更・削除する"
"read:page-likes": "ページのいいねのリスト化・読み取りをする"
"write:page-likes": "ページをいいね・いいね解除する"
"read:user-groups": "参加・所有している、および招待されているグループのリスト化・読み取りをする"
"write:user-groups": "グループを作成・変更・削除・譲渡・参加、または脱退する。グループから他のユーザーを招待・凍結する。グループへの招待を承認・拒否する。"
"read:channels": "フォローおよび参加しているチャンネルのリスト化・読み取りをする"
"write:channels": "チャンネルを作成・変更・フォロー・フォロー解除する"
"read:reactions": リアクションを見る
_auth:
shareAccess: "「{name}」がアカウントにアクセスすることを許可しますか?"
shareAccessAsk: "アカウントへのアクセスを許可しますか?"
@ -1067,6 +1050,7 @@ _widgets:
aiscript: "AiScriptコンソール"
aichan: "藍"
rssMarquee: RSSティッカー
_cw:
hide: "隠す"
show: "もっと見る"
@ -1080,8 +1064,8 @@ _poll:
canMultipleVote: "複数回答可"
expiration: "期限"
infinite: "無期限"
at: "日時指定"
after: "経過指定"
at: "日時指定..."
after: "経過指定..."
deadlineDate: "期日"
deadlineTime: "時間"
duration: "期間"
@ -1117,7 +1101,7 @@ _postForm:
b: "何かありましたか?"
c: "何をお考えですか?"
d: "言いたいことは?"
e: "ここに書いてください"
e: "ここに書いてください..."
f: "あなたが書くのを待っています..."
_profile:
@ -1241,6 +1225,7 @@ _notification:
groupInvited: "グループに招待された"
app: "連携アプリからの通知"
move: 自分以外のアカウントの引っ越し
_actions:
followBack: "フォローバック"
reply: "返信"
@ -1269,3 +1254,48 @@ _deck:
list: "リスト"
mentions: "あなた宛て"
direct: "ダイレクト"
translationSettings: 翻訳設定
signinHistoryExpires: プライバシー規則に準拠するため、過去のログイン試行に関するデータは60日後に自動的に削除されます。
deleteAllFiles: すべてのファイルを削除
cannotAttachFileWhenAccountSwitched: 別のアカウントに切り替えている間はファイルを添付できません。
translationService: 翻訳サービス
cannotSwitchAccountWhenFileAttached: ファイルを添付したままアカウントを切り替えることはできません。
externalCssSnippets: インスピレーションのためのCSSスニペット群 (FoundKeyによって管理されていません)
botFollowRequiresApproval: Botとして設定されたアカウントからのフォロー申請は承認を必要にする
documentation: ドキュメンテーション
unlimited: 無制限
exportAll: すべてエクスポート
oauthErrorGoBack: サードパーティーアプリの認証中にエラーが発生しました。戻ってもう一度やり直してみてください。
selectMode: 複数選択
renoteMute: Renoteをミュート
renoteUnmute: Renoteのミュートを解除
stopActivityDeliveryDescription: ローカルでのアクティビティはこのインスタンスに対して送信されません。アクティビティの受信はこれまで通り機能します。
unrenoteAll: すべてのRenoteを取り消す
unrenoteAllConfirm: このートのRenoteをすべて取り消します。よろしいですか
addTag: タグを追加
removeTag: タグを削除
appAuthorization: アプリの承認
noPermissionsRequested: (必要な権限はありません。)
setCategory: カテゴリを設定
selectAll: 全選択
setTag: タグを設定
blockThisInstanceDescription: ローカルでのアクティビティはこのインスタンスに対して送信されません。このインスタンスからのアクティビティは破棄されます。
maxCustomEmojiPicker: ピッカー内で提案するカスタム絵文字の最大数
maxUnicodeEmojiPicker: ピッカー内で提案するUnicode絵文字の最大数
exportSelected: 選択をエクスポート
_translationService:
_libreTranslate:
authKey: LibreTranslate認証キー (任意)
endpoint: LibreTranslate API Endpoint
_deepl:
authKey: DeepL認証キー
_remoteInteract:
title: 申し訳ありませんが、残念ながら実行できません。
urlInstructions: 以下のURLをコピーするとよいでしょう。あなたのインスタンスの検索フィールドに貼り付けることで、正しい場所に誘導されるでしょう。
description: 今すぐにこのアクションを実行することはできません。あなたのインスタンス上で、またはログインして行う必要があるかもしれません。
movedTo: このユーザーは {handle} に引っ越しました。
uploadFailedDescription: ファイルをアップロードできませんでした。
uploadFailedSize: ファイルサイズが大きすぎるためアップロードできません。
uploadFailed: アップロード失敗
showAttachedNotes: 添付ノートを表示
attachedToNotes: このファイルが添付されたノート

View file

@ -74,10 +74,6 @@ somethingHappened: "なんかアカンことが起こったで"
retry: "もっぺんやる?"
pageLoadError: "ページの読み込みに失敗してしもうたで…"
pageLoadErrorDescription: "これは普通、ネットワークかブラウザキャッシュが原因やからね。キャッシュをクリアするか、もうちっとだけ待ってくれへんか?"
serverIsDead: "The server is not responding. Please wait for a while before trying\
\ again."
youShouldUpgradeClient: "To display this page, please reload and use a new version\
\ client. "
enterListName: "リスト名を入れてや"
privacy: "プライバシー"
makeFollowManuallyApprove: "自分が認めた人だけがこのアカウントをフォローできるようにする"
@ -126,9 +122,6 @@ flagAsBot: "Botやで"
flagAsBotDescription: "もしこのアカウントがプログラムによって運用されるんやったら、このフラグをオンにしてたのむで。オンにすると、反応の連鎖を防ぐためのフラグとして他の開発者に役立ったり、FoundKeyのシステム上での扱いがBotに合ったもんになるんやで。"
flagAsCat: "Catやで"
flagAsCatDescription: "ワレ、猫ちゃんならこのフラグをつけてみ?"
flagShowTimelineReplies: "It will display the reply to the note in the timeline. "
flagShowTimelineRepliesDescription: "It will display the reply to notes other than\
\ the user notes in the timeline when you turn it on. "
autoAcceptFollowed: "フォローしとるユーザーからのフォローリクエストを勝手に許可しとく"
addAccount: "アカウントを追加"
loginFailed: "ログインに失敗してしもうた…"
@ -209,9 +202,6 @@ resetAreYouSure: "リセットしてええん?"
saved: "保存したで!"
messaging: "チャット"
upload: "アップロード"
keepOriginalUploading: "Retain the original image. "
keepOriginalUploadingDescription: "When uploading the clip, the original version will\
\ be retained. Turning it of then uploading will produce images for public use. "
fromDrive: "ドライブから"
fromUrl: "URLから"
uploadFromUrl: "URLアップロード"
@ -253,8 +243,6 @@ createFolder: "フォルダー作る"
renameFolder: "フォルダー名を変える"
deleteFolder: "フォルダーを消してまう"
addFile: "ファイルを追加"
emptyDrive: "ドライブにはなんも残っとらん"
emptyFolder: "ふぉろだーにはなんも残っとらん"
unableToDelete: "消そうおもってんけどな、あかんかったわ"
inputNewFileName: "今度のファイル名は何にするん?"
inputNewDescription: "新しいキャプションを入力しましょ"
@ -380,7 +368,7 @@ onlyOneFileCanBeAttached: "すまん、メッセージに添付できるファ
signinRequired: "ログインしてくれへん?"
invitationCode: "招待コード"
checking: "確認しとるで"
available: "利用できる\n"
available: "利用できる"
unavailable: "利用できん"
usernameInvalidFormat: "a~z、A~Z、0~9、_が使えるで"
tooShort: "短すぎやろ!"
@ -561,8 +549,6 @@ administration: "管理"
hashtags: "ハッシュタグ"
hide: "隠す"
indefinitely: "無期限"
_gallery:
unlike: "良くないわ"
_email:
_follow:
title: "フォローされたで"
@ -656,7 +642,6 @@ _tutorial:
_2fa:
alreadyRegistered: "もう設定終わっとるわ。"
_permissions:
"read:reactions": "リアクションを見る"
"write:votes": "投票する"
"read:pages": "ページを見る"
"read:page-likes": "ページのええやんを見る"
@ -697,7 +682,7 @@ _widgets:
aiscript: "AiScriptコンソール"
_cw:
hide: "隠す"
show: "続き見して"
show: "続き見して"
chars: "{count}文字"
files: "{count}ファイル"
_poll:

View file

@ -34,7 +34,6 @@ selectList: "Fren tabdart"
youHaveNoLists: "Ulac ɣur-k·m ula d yiwet n tabdart"
security: "Taɣellist"
remove: "Kkes"
connectService: "Qqen"
userList: "Tibdarin"
securityKey: "Tasarutt n tɣellist"
securityKeyName: "Isem n tsarutt"

View file

@ -10,7 +10,7 @@ notifications: "Meldingen"
username: "Gebruikersnaam"
password: "Wachtwoord"
forgotPassword: "Wachtwoord vergeten"
fetchingAsApObject: "Ophalen vanuit de Fediverse"
fetchingAsApObject: "Ophalen vanuit de Fediverse..."
ok: "Ok"
gotIt: "Begrepen"
cancel: "Annuleren"
@ -45,7 +45,7 @@ deleteAndEditConfirm: "Weet je zeker dat je deze notitie wilt verwijderen en dan
\ Je verliest alle reacties, herdelingen en antwoorden erop."
addToList: "Aan lijst toevoegen"
sendMessage: "Verstuur bericht"
copyUsername: "Kopiëren gebruikersnaam "
copyUsername: "Kopiëren gebruikersnaam"
reply: "Antwoord"
loadMore: "Laad meer"
showMore: "Toon meer"
@ -76,9 +76,9 @@ followsYou: "Volgt jou"
createList: "Creëer lijst"
manageLists: "Beheren lijsten"
error: "Fout"
somethingHappened: "Er is iets misgegaan."
somethingHappened: "Er is iets misgegaan"
retry: "Probeer opnieuw"
pageLoadError: "Pagina laden mislukt"
pageLoadError: "Pagina laden mislukt."
pageLoadErrorDescription: "Dit wordt normaal gesproken veroorzaakt door netwerkfouten\
\ of door de cache van de browser. Probeer de cache te wissen en probeer het na\
\ een tijdje wachten opnieuw."
@ -217,12 +217,12 @@ resetAreYouSure: "Resetten?"
saved: "Opgeslagen"
messaging: "Chat"
upload: "Uploaden"
keepOriginalUploading: "Origineel beeld behouden."
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"
@ -263,8 +263,6 @@ createFolder: "Map aanmaken"
renameFolder: "Map hernoemen"
deleteFolder: "Map verwijderen"
addFile: "Bestand toevoegen"
emptyDrive: "Jouw Drive is leeg."
emptyFolder: "Deze map is leeg"
unableToDelete: "Kan niet worden verwijderd"
inputNewFileName: "Voer een nieuwe naam in"
copyUrl: "URL kopiëren"
@ -294,7 +292,7 @@ smtpUser: "Gebruikersnaam"
smtpPass: "Wachtwoord"
clearCache: "Cache opschonen"
user: "Gebruikers"
muteThread: "Discussies dempen "
muteThread: "Discussies dempen"
unmuteThread: "Dempen van discussie ongedaan maken"
hide: "Verbergen"
cropImage: "Afbeelding bijsnijden"
@ -358,3 +356,12 @@ selectWidget: Kies een widget
editWidgets: Widgets wijzigen
editWidgetsExit: Klaar
_services: {}
botFollowRequiresApproval: Volgverzoeken van als robot gemarkeerde gebruikers vereisen
goedkeuring
unrenoteAll: Alle renotes terugnemen
unrenoteAllConfirm: Weet je zeker dat je alle renotes voor deze note terug wil nemen?
exportAll: Alles exporteren
exportSelected: Selectie exporteren
uploadFailed: Uploaden mislukt
uploadFailedDescription: Het bestand kon niet worden geupload.
uploadFailedSize: Het bestand is te groot om te uploaden.

View file

@ -1,10 +1,10 @@
_lang_: "język polski"
_lang_: "Polski"
headlineMisskey: "Sieć połączona wpisami"
introMisskey: "FoundKey jest serwisem mikroblogowym typu open source.\nFoundKey to\
\ opensource'owy serwis mikroblogowy, w którym możesz tworzyć \"notatki\", aby dzielić\
\ się tym, co się dzieje i opowiadać wszystkim o sobie.\nMożesz również użyć funkcji\
\ \"Reakcje\", aby szybko dodać własne reakcje do notatek innych użytkowników\U0001F44D\
.\nOdkrywaj nowy świat\U0001F680!"
introMisskey: "Witaj! Foundkey jest otwartoźródłowym, zdecentralizowanym serwisem\
\ mikroblogowym.\nTwórz \"wpisy\", aby dzielić się tym, co się dzieje i opowiadać\
\ wszystkim o sobie. \U0001F4E1\nMożesz również użyć \"reakcji\", aby szybko wyrazić\
\ swoje uczucia dotyczące wpisów innych użytkowników. \U0001F44D\nOdkryjmy nowy\
\ świat! \U0001F680"
monthAndDay: "{month}-{day}"
search: "Szukaj"
notifications: "Powiadomienia"
@ -15,7 +15,7 @@ fetchingAsApObject: "Pobieranie z Fediwersum…"
ok: "OK"
gotIt: "Rozumiem!"
cancel: "Anuluj"
renotedBy: "Udostępniono przez {user}"
renotedBy: "Podbito przez {user}"
noNotes: "Brak wpisów"
noNotifications: "Brak powiadomień"
instance: "Instancja"
@ -25,7 +25,7 @@ otherSettings: "Pozostałe ustawienia"
openInWindow: "Otwórz w oknie"
profile: "Profil"
timeline: "Oś czasu"
noAccountDescription: "Ten użytkownik nie napisał jeszcze swojej biografii."
noAccountDescription: "Ten użytkownik nie napisał jeszcze swojego opisu."
login: "Zaloguj się"
loggingIn: "Logowanie"
logout: "Wyloguj się"
@ -43,7 +43,7 @@ copyLink: "Skopiuj odnośnik"
delete: "Usuń"
deleteAndEdit: "Usuń i edytuj"
deleteAndEditConfirm: "Czy na pewno chcesz usunąć ten wpis i zedytować go? Utracisz\
\ wszystkie reakcje, udostępnienia i odpowiedzi do tego wpisu."
\ wszystkie reakcje, podbicia i odpowiedzi do tego wpisu."
addToList: "Dodaj do listy"
sendMessage: "Wyślij wiadomość"
copyUsername: "Kopiuj nazwę użytkownika"
@ -61,12 +61,12 @@ import: "Importuj"
export: "Eksportuj"
files: "Pliki"
download: "Pobierz"
driveFileDeleteConfirm: "Czy chcesz usunąć plik \"{name}\"? Zniknie również notatka,\
\ do której dołączony jest ten plik."
driveFileDeleteConfirm: "Czy chcesz usunąć plik \"{name}\"? Znikną również wpisy,\
\ do których dołączony jest ten plik."
unfollowConfirm: "Czy na pewno chcesz przestać obserwować {name}?"
exportRequested: "Zażądałeś eksportu. Może to zająć trochę czasu. Po zakończeniu eksportu\
\ zostanie on dodany do Twoich \"dysków\"."
importRequested: "Zażądano importu. Może to zająć chwilę."
exportRequested: "Zażądano eksportu. Może to zająć chwilę. Po zakończeniu eksportu\
\ zostanie on dodany do Twojego Dysku."
importRequested: "Zażądano importu. Może to zająć chwilę."
lists: "Listy"
note: "Utwórz wpis"
notes: "Wpisy"
@ -78,7 +78,7 @@ manageLists: "Zarządzaj listami"
error: "Błąd"
somethingHappened: "Coś poszło nie tak"
retry: "Spróbuj ponownie"
pageLoadError: "Nie udało się załadować strony"
pageLoadError: "Nie udało się załadować strony."
pageLoadErrorDescription: "Zwykle jest to spowodowane problemem z siecią lub cache\
\ przeglądarki. Spróbuj wyczyścić cache i sprawdź jeszcze raz za chwilę."
serverIsDead: "Serwer nie odpowiada. Zaczekaj chwilę i spróbuj ponownie."
@ -92,8 +92,8 @@ followRequest: "Poproś o możliwość obserwacji"
followRequests: "Prośby o możliwość obserwacji"
unfollow: "Przestań obserwować"
followRequestPending: "Oczekująca prośba o możliwość obserwacji"
renote: "Udostępnij"
unrenote: "Cofnij udostępnienie"
renote: "Podbij"
unrenote: "Cofnij podbicie"
quote: "Cytuj"
pinnedNote: "Przypięty wpis"
you: "Ty"
@ -102,7 +102,7 @@ sensitive: "NSFW"
add: "Dodaj"
reaction: "Reakcja"
reactionSettingDescription2: "Przeciągnij aby zmienić kolejność, naciśnij aby usunąć,\
\ naciśnij „+” aby dodać"
\ naciśnij „+” aby dodać."
attachCancel: "Usuń załącznik"
markAsSensitive: "Oznacz jako NSFW"
unmarkAsSensitive: "Cofnij NSFW"
@ -118,7 +118,7 @@ unblockConfirm: "Czy na pewno chcesz odblokować to konto?"
suspendConfirm: "Czy na pewno chcesz zawiesić to konto?"
unsuspendConfirm: "Czy na pewno chcesz cofnąć zawieszenie tego konta?"
selectList: "Wybierz listę"
selectAntenna: "Wybierz Antennę"
selectAntenna: "Wybierz antenę"
selectWidget: "Wybierz widżet"
editWidgets: "Edytuj widżet"
editWidgetsExit: "Gotowe"
@ -128,13 +128,13 @@ emojis: "Emoji"
addEmoji: "Dodaj emoji"
cacheRemoteFiles: "Przechowuj zdalne pliki w pamięci podręcznej"
cacheRemoteFilesDescription: "Gdy ta opcja jest wyłączona, zdalne pliki są ładowane\
\ bezpośrednio ze zdalnych instancji. Wyłączenie the opcji zmniejszy użycie powierzchni\
\ bezpośrednio ze zdalnych instancji. Wyłączenie tej opcji zmniejszy użycie powierzchni\
\ dyskowej, ale zwiększy transfer, ponieważ miniaturki nie będą generowane."
flagAsBot: "To konto jest botem"
flagAsBotDescription: "Jeżeli ten kanał jest kontrolowany przez jakiś program, ustaw\
\ tę opcję. Jeżeli włączona, będzie działać jako flaga informująca innych programistów,\
\ aby zapobiegać nieskończonej interakcji z różnymi botami i dostosowywać wewnętrzne\
\ systemy FoundKey, traktując konto jako bota."
\ systemy Foundkey, traktując konto jako bota."
flagAsCat: "To konto jest kotem"
flagAsCatDescription: "Przełącz tę opcję, aby konto było oznaczone jako kot."
autoAcceptFollowed: "Automatycznie przyjmuj prośby o możliwość obserwacji od użytkowników,\
@ -177,17 +177,19 @@ clearCachedFilesConfirm: "Czy na pewno chcesz usunąć wszystkie zdalne pliki z
\ podręcznej?"
blockedInstances: "Zablokowane instancje"
blockedInstancesDescription: "Wypisz nazwy hostów instancji, które powinny zostać\
\ zablokowane. Wypisane instancje nie będą mogły dłużej komunikować się z tą instancją."
muteAndBlock: "Wycisz / Zablokuj"
\ zablokowane. Wypisane instancje nie będą mogły dłużej komunikować się z tą instancją.\
\ Nazwy domen non-ASCII muszą być zakodowane w punycode. Poddomeny wypisanych instancji\
\ również będą blokowane."
muteAndBlock: "Wyciszenia i blokady"
mutedUsers: "Wyciszeni użytkownicy"
blockedUsers: "Zablokowani użytkownicy"
noUsers: "Brak użytkowników"
editProfile: "Edytuj profil"
noteDeleteConfirm: "Czy na pewno chcesz usunąć ten wpis?"
pinLimitExceeded: "Nie możesz przypiąć więcej wpisów."
intro: "Zakończono instalację FoundKey! Utwórz konto administratora."
intro: "Zakończono instalację Foundkey! Utwórz konto administratora."
done: "Gotowe"
processing: "Przetwarzanie"
processing: "Przetwarzanie..."
preview: "Podgląd"
default: "Domyślne"
noCustomEmojis: "Brak emoji"
@ -262,11 +264,9 @@ createFolder: "Utwórz katalog"
renameFolder: "Zmień nazwę katalogu"
deleteFolder: "Usuń ten katalog"
addFile: "Dodaj plik"
emptyDrive: "Dysk jest pusty"
emptyFolder: "Ten katalog jest pusty"
unableToDelete: "Nie można usunąć"
inputNewFileName: "Wprowadź nową nazwę pliku"
inputNewDescription: "Proszę wpisać nowy napis"
inputNewDescription: "Wpisz nowy opis"
inputNewFolderName: "Wprowadź nową nazwę katalogu"
circularReferenceFolder: "Katalog docelowy jest podkatalogiem katalogu, który chcesz\
\ przenieść."
@ -277,7 +277,7 @@ avatar: "Awatar"
banner: "Baner"
nsfw: "NSFW"
whenServerDisconnected: "Po utracie połączenia z serwerem"
disconnectedFromServer: "Utracono połączenie z serwerem."
disconnectedFromServer: "Utracono połączenie z serwerem"
reload: "Odśwież"
doNothing: "Ignoruj"
reloadConfirm: "Czy chcesz odświeżyć oś czasu?"
@ -318,13 +318,13 @@ hcaptchaSecretKey: "Tajny klucz"
recaptchaSiteKey: "Klucz strony"
recaptchaSecretKey: "Tajny klucz"
antennas: "Anteny"
manageAntennas: "Zarządzaj Antenami"
manageAntennas: "Zarządzaj antenami"
name: "Nazwa"
antennaSource: "Źródło Anteny"
antennaSource: "Źródło anteny"
antennaKeywords: "Słowa kluczowe do obserwacji"
antennaExcludeKeywords: "Wykluczone słowa kluczowe"
antennaKeywordsDescription: "Oddziel spacjami dla warunku AND, albo wymuś koniec linii\
\ dla warunku OR"
\ dla warunku OR."
notifyAntenna: "Powiadamiaj o nowych wpisach"
withFileAntenna: "Filtruj tylko wpisy z załączonym plikiem"
antennaUsersDescription: "Wypisz po jednej nazwie użytkownika w linii"
@ -343,7 +343,7 @@ recentlyRegisteredUsers: "Ostatnio zarejestrowani użytkownicy"
recentlyDiscoveredUsers: "Ostatnio odkryci użytkownicy"
popularTags: "Tagi na czasie"
userList: "Listy"
aboutMisskey: "O FoundKey"
aboutMisskey: "O Foundkey"
administrator: "Admin"
token: "Token"
twoStepAuthentication: "Uwierzytelnianie dwuskładnikowe"
@ -393,10 +393,10 @@ newMessageExists: "Masz nową wiadomość"
onlyOneFileCanBeAttached: "Możesz załączyć tylko jeden plik do wiadomości"
signinRequired: "Proszę się zalogować"
invitationCode: "Kod zaproszenia"
checking: "Sprawdzam"
checking: "Sprawdzam..."
available: "Dostępna"
unavailable: "Niedostępna"
usernameInvalidFormat: "może zawierać litery, cyfry i podkreślniki."
usernameInvalidFormat: "Nazwa użytkownika może zawierać litery, cyfry i podkreślniki."
tooShort: "Zbyt krótka"
tooLong: "Zbyt długa"
weakPassword: "Słabe hasło"
@ -410,7 +410,7 @@ tapSecurityKey: "Wybierz swój klucz bezpieczeństwa"
or: "Lub"
language: "Język"
uiLanguage: "Język wyświetlania UI"
groupInvited: "Zaproszony(-a) do grupy"
groupInvited: "Został*ś zaproszon* do grupy"
useOsNativeEmojis: "Używaj natywnych Emoji systemu"
youHaveNoGroups: "Nie masz żadnych grup"
joinOrCreateGroup: "Uzyskaj zaproszenie do dołączenia do grupy lub utwórz własną grupę."
@ -461,7 +461,7 @@ popout: "Popout"
volume: "Głośność"
masterVolume: "Głośność główna"
details: "Szczegóły"
unableToProcess: "Nie udało się dokończyć działania."
unableToProcess: "Nie udało się dokończyć działania"
recentUsed: "Ostatnio używane"
install: "Zainstaluj"
uninstall: "Odinstaluj"
@ -475,7 +475,7 @@ ascendingOrder: "Rosnąco"
descendingOrder: "Malejąco"
scratchpad: "Brudnopis"
scratchpadDescription: "Brudnopis zawiera eksperymentalne środowisko dla AiScript.\
\ Możesz pisać, wykonywać i sprawdzać wyniki w interakcji z FoundKey."
\ Możesz pisać, wykonywać i sprawdzać wyniki w interakcji z Foundkey."
output: "Wyjście"
updateRemoteUser: "Aktualizuj zdalne dane o użytkowniku"
deleteAllFilesConfirm: "Czy na pewno chcesz usunąć wszystkie pliki?"
@ -497,7 +497,7 @@ enablePlayer: "Otwórz odtwarzacz wideo"
disablePlayer: "Zamknij odtwarzacz wideo"
themeEditor: "Edytor motywu"
description: "Opis"
describeFile: "dodaj podpis"
describeFile: "Dodaj opis"
author: "Autor"
leaveConfirm: "Są niezapisane zmiany. Czy chcesz je odrzucić?"
manage: "Zarządzanie"
@ -532,10 +532,10 @@ smtpUser: "Nazwa użytkownika"
smtpPass: "Hasło"
emptyToDisableSmtpAuth: "Pozostaw adres e-mail i hasło puste, aby wyłączyć weryfikację\
\ SMTP"
smtpSecureInfo: "Wyłącz, jeżeli używasz STARTTLS"
smtpSecureInfo: "Wyłącz, jeżeli używasz STARTTLS."
testEmail: "Przetestuj dostarczanie wiadomości e-mail"
wordMute: "Wyciszenie słowa"
userSaysSomething: "{name} powiedział(-a) coś"
userSaysSomething: "{name} powiedział* coś"
makeActive: "Aktywuj"
display: "Wyświetlanie"
copy: "Kopiuj"
@ -544,7 +544,7 @@ database: "Baza danych"
channel: "Kanały"
create: "Utwórz"
notificationSetting: "Ustawienia powiadomień"
notificationSettingDesc: "Wybierz rodzaj powiadomień do wyświetlania"
notificationSettingDesc: "Wybierz rodzaj powiadomień do wyświetlania."
useGlobalSetting: "Użyj globalnych ustawień"
useGlobalSettingDesc: "Jeżeli włączone, zostaną wykorzystane ustawienia powiadomień\
\ Twojego konta. Jeżeli wyłączone, mogą zostać wykonane oddzielne konfiguracje."
@ -560,8 +560,8 @@ reportAbuse: "Zgłoś"
reportAbuseOf: "Zgłoś {name}"
fillAbuseReportDescription: "Wypełnij szczegóły zgłoszenia."
abuseReported: "Twoje zgłoszenie zostało wysłane. Dziękujemy."
reporteeOrigin: "Pochodzenie zgłoszonego"
reporterOrigin: "Pochodzenie zgłaszającego"
reporteeOrigin: "Pochodzenie osoby zgłoszonej"
reporterOrigin: "Pochodzenie osoby zgłaszającej"
send: "Wyślij"
abuseMarkAsResolved: "Oznacz zgłoszenie jako rozwiązane"
openInNewTab: "Otwórz w nowej karcie"
@ -573,15 +573,15 @@ desktop: "Pulpit"
createNew: "Utwórz nowy"
optional: "Nieobowiązkowe"
public: "Publiczny"
i18nInfo: "FoundKey jest tłumaczone na wiele języków przez wolontariuszy. Możesz pomóc\
i18nInfo: "Foundkey jest tłumaczone na wiele języków przez wolontariuszy. Możesz pomóc\
\ na {link}."
manageAccessTokens: "Zarządzaj tokenami dostępu"
accountInfo: "Informacje o koncie"
notesCount: "Liczba wpisów"
repliesCount: "Liczba wysłanych odpowiedzi"
renotesCount: "Liczba wysłanych udostępnień"
renotesCount: "Liczba wysłanych podbić"
repliedCount: "Liczba otrzymanych odpowiedzi"
renotedCount: "Liczba otrzymanych udostępnień"
renotedCount: "Liczba otrzymanych podbić"
followingCount: "Liczba obserwowanych kont"
followersCount: "Liczba obserwujących"
sentReactionsCount: "Liczba wysłanych reakcji"
@ -595,7 +595,7 @@ driveUsage: "Użycie przestrzeni dyskowej"
noCrawle: "Odrzuć indeksowanie przez crawlery"
noCrawleDescription: "Proś wyszukiwarki internetowe, aby nie indeksowały Twojego profilu,\
\ wpisów, stron itd."
lockedAccountInfo: "Dopóki nie ustawisz widoczności wpisu na \"Obserwujący\", twoje\
lockedAccountInfo: "Dopóki nie ustawisz widoczności wpisu na \"Obserwujący\", Twoje\
\ wpisy będą mogli widzieć wszyscy, nawet jeśli ustawisz manualne zatwierdzanie\
\ obserwujących."
alwaysMarkSensitive: "Oznacz domyślnie jako NSFW"
@ -612,7 +612,7 @@ useSystemFont: "Używaj domyślnej czcionki systemu"
makeExplorable: "Pokazuj konto na stronie „Eksploruj”"
makeExplorableDescription: "Jeżeli wyłączysz tę opcję, Twoje konto nie będzie wyświetlać\
\ się w sekcji „Eksploruj”."
showGapBetweenNotesInTimeline: "Pokazuj odstęp między wpisami na osi czasu."
showGapBetweenNotesInTimeline: "Pokazuj odstęp między wpisami na osi czasu"
duplicate: "Duplikuj"
left: "Lewo"
center: "Wyśsrodkuj"
@ -620,7 +620,7 @@ wide: "Szerokie"
narrow: "Wąskie"
reloadToApplySetting: "To ustawienie zostanie zastosowane po odświeżeniu strony. Chcesz\
\ odświeżyć?"
needReloadToApply: "To ustawienie zostanie zastosowane po odświeżeniu strony"
needReloadToApply: "To ustawienie zostanie zastosowane po odświeżeniu strony."
clearCache: "Wyczyść pamięć podręczną"
onlineUsersCount: "{n} osób jest online"
backgroundColor: "Tło"
@ -639,19 +639,18 @@ editCode: "Edytuj kod"
apply: "Zastosuj"
receiveAnnouncementFromInstance: "Otrzymuj powiadomienia e-mail z tej instancji"
emailNotification: "Powiadomienia e-mail"
publish: "Publikuj"
useReactionPickerForContextMenu: "Otwórz wybornik reakcji prawym kliknięciem"
useReactionPickerForContextMenu: "Otwórz wybierak reakcji prawym kliknięciem"
typingUsers: "{users} pisze(-ą)..."
jumpToSpecifiedDate: "Przejdź do określonej daty"
clear: "Wróć"
markAllAsRead: "Oznacz wszystkie jako przeczytane"
goBack: "Wróć"
unlikeConfirm: "Na pewno chcesz usunąć polubienie?"
unlikeConfirm: "Na pewno chcesz usunąć polubienie?"
fullView: "Pełny widok"
quitFullView: "Opuść pełny widok"
addDescription: "Dodaj opis"
userPagePinTip: "Możesz wyświetlać wpisy w tym miejscu po wybraniu \"Przypnij do profilu\"\
\ z menu pojedyńczego wpisu"
\ z menu pojedynczego wpisu."
notSpecifiedMentionWarning: "Ten wpis zawiera wzmianki o użytkownikach niezawartych\
\ jako odbiorcy"
info: "Informacje"
@ -659,7 +658,7 @@ userInfo: "Informacje o użykowniku"
unknown: "Nieznane"
hideOnlineStatus: "Ukryj status online"
hideOnlineStatusDescription: "Ukrywanie statusu online ogranicza wygody niektórych\
\ funkcji, tj. wyszukiwanie"
\ funkcji, takich jak wyszukiwanie."
online: "Online"
active: "Aktywny"
offline: "Offline"
@ -677,12 +676,9 @@ switch: "Przełącz"
noMaintainerInformationWarning: "Informacje o administratorze nie są skonfigurowane."
noBotProtectionWarning: "Zabezpieczenie przed botami nie jest skonfigurowane."
configure: "Skonfiguruj"
postToGallery: "Opublikuj w galerii"
gallery: "Galeria"
recentPosts: "Ostatnie wpisy"
popularPosts: "Popularne wpisy"
shareWithNote: "Udostępnij z wpisem"
emailNotConfiguredWarning: "Nie podano adresu e-mail"
emailNotConfiguredWarning: "Nie podano adresu e-mail."
ratio: "Stosunek"
previewNoteText: "Pokaż podgląd"
customCss: "Własny CSS"
@ -692,22 +688,21 @@ squareAvatars: "Wyświetlaj kwadratowe awatary"
hashtags: "Hashtag"
pubSub: "Konta Pub/Sub"
hide: "Ukryj"
indefinitely: "Nigdy"
indefinitely: "Dożywotnio"
_ffVisibility:
public: "Publikuj"
followers: Widoczne tylko dla obserwujących
private: Prywatna
_forgotPassword:
ifNoEmail: "Jeżeli nie podano adresu e-mail podczas rejestracji, skontaktuj się\
\ z administratorem zamiast tego."
\ z administratorem."
contactAdmin: "Jeżeli Twoja instancja nie obsługuje adresów e-mail, skontaktuj się\
\ zamiast tego z administratorem, aby zresetować hasło."
_gallery:
my: "Moja galeria"
liked: "Polubione wpisy"
like: "Polub"
unlike: "Cofnij polubienie"
enterEmail: Wpisz adres email użyty do rejestracji konta. Zostanie wysłany link
który umożliwi zresetowanie hasła.
_email:
_follow:
title: "Zaobserwował(a) Cię"
title: "Masz nowego obserwującego"
_receiveFollowRequest:
title: "Otrzymano prośbę o możliwość obserwacji"
_plugin:
@ -720,7 +715,7 @@ _registry:
domain: "Domena"
createKey: "Utwórz klucz"
_aboutMisskey:
about: "FoundKey jest oprogramowanie open source rozwijanym przez syuilo od 2014."
about: "Foundkey jest forkiem Misskey rozwijanym od lipca 2022."
allContributors: "Wszyscy twórcy"
source: "Kod źródłowy"
_nsfw:
@ -729,8 +724,9 @@ _nsfw:
force: "Ukrywaj wszystkie media"
_mfm:
cheatSheet: "Ściąga MFM"
intro: "MFM to język składniowy wyjątkowy dla FoundKey, który może być użyty w wielu\
\ miejscach. Tu znajdziesz listę wszystkich możliwych elementów składni MFM."
intro: "MFM jest językiem składniowym używanym przez m.in. Misskey, forki *key (w\
\ tym Foundkey), oraz Akkomę, który może być użyty w wielu miejscach. Tu znajdziesz\
\ listę wszystkich możliwych elementów składni MFM."
dummy: "FoundKey rozszerza świat Fediwersum"
mention: "Wspomnij"
mentionDescription: "Używając znaku @ i nazwy użytkownika, możesz określić danego\
@ -738,7 +734,7 @@ _mfm:
hashtag: "Hashtag"
hashtagDescription: "Używając kratki i tekstu, możesz określić hashtag."
url: "Adres URL"
urlDescription: "Adresy URL mogą być wyświetlane"
urlDescription: "Adresy URL mogą być wyświetlane."
link: "Odnośnik"
linkDescription: "Określone części tekstu mogą być wyświetlane jako adres URL."
bold: "Pogrubienie"
@ -763,11 +759,38 @@ _mfm:
x3: "Bardzo duże"
x3Description: "Czyni treść jeszcze większą."
x4: "Ogromne"
x4Description: "Czyni treść jeszcze większą niż jeszcze większa."
x4Description: "Czyni treść nawet większą niż jeszcze większa."
blur: "Rozmycie"
font: "Czcionka"
fontDescription: "Wybiera czcionkę do wyświetlania treści."
rotate: "Obróć"
inlineCodeDescription: Wyświetla podświetlanie składni dla kodu (programu) w linii.
jump: Animacja (Skok)
blockMath: Matematyka (Blok)
tada: Animacja (Tada)
sparkle: Blask
sparkleDescription: Nadaje zawartości efekt iskrzących cząstek.
inlineMathDescription: Pokaż formuły matematyczne (KaTeX) w linii.
inlineMath: Matematyka (Inline)
inlineCode: Kod (inline)
smallDescription: Wyświetla zawartość jako małą i cienką.
blurDescription: Rozmywa zawartość. Zostanie ona wyraźnie wyświetlona przy najechaniu.
bounce: Animacja (Odbijanie)
jelly: Animacja (Żelek)
spin: Animacja (Wirowanie)
twitch: Animacja (Drganie)
jellyDescription: Nadaje zawartości galaretowatą animację.
tadaDescription: Nadaje zawartości animację w stylu "Tada!".
jumpDescription: Nadaje zawartości animację skokową.
bounceDescription: Nadaje zawartości sprężystą animację.
shakeDescription: Nadaje zawartości animację potrzęsania.
twitchDescription: Nadaje zawartości silnie drgającą animację.
spinDescription: Nadaje zawartości animację obrotową.
rainbow: Tęcza
rainbowDescription: Sprawia, że zawartość pojawia się w kolorach tęczy.
rotateDescription: Obraca zawartość o podany kąt.
blockMathDescription: Pokaż wieloliniowe formuły matematyczne (KaTeX) w bloku.
shake: Animacja (Wstrząs)
_instanceTicker:
none: "Nigdy nie pokazuj"
remote: "Pokaż dla zdalnych użytkowników"
@ -788,12 +811,21 @@ _channel:
notesCount: "{n} wpisy"
_menuDisplay:
hide: "Ukryj"
sideFull: Z boku
sideIcon: Z boku (tylko ikony)
top: U góry
_wordMute:
muteWords: "Słowo do wyciszenia"
muteWordsDescription2: "Otocz słowa kluczowe ukośnikami, aby używać wyrażeń regularnych."
soft: "Łagodny"
hard: "Twardy"
mutedNotes: "Wyciszone wpisy"
muteWordsDescription: Rozdzielaj spacją dla kondycji AND, lub przerwaniem wiersza
dla kondycji OR.
hardDescription: Zapobiega dodawania do osi czasu wpisów, które spełniają podane
warunki. Dodatkowo, te wpisy nie zostaną dodane do osi czasu, jeśli warunki się
zmienią.
softDescription: Ukryj z osi czasu wpisy, które spełniają podane warunki.
_theme:
explore: "Przeglądaj motywy"
install: "Zainstaluj motyw"
@ -804,7 +836,7 @@ _theme:
installedThemes: "Zainstalowane motywy"
builtinThemes: "Wbudowane motywy"
alreadyInstalled: "Motyw jest już zainstalowany"
invalid: "Format motywu jest nieprawidłowy."
invalid: "Format motywu jest nieprawidłowy"
make: "Utwórz motyw"
_sfx:
note: "Wpisy"
@ -813,6 +845,7 @@ _sfx:
chat: "Wiadomości"
chatBg: "Rozmowy (tło)"
channel: "Powiadomienia kanału"
antenna: Anteny
_ago:
future: "W przyszłości"
justNow: "Przed chwilą"
@ -829,14 +862,39 @@ _time:
hour: "godz."
day: "dzień"
_tutorial:
title: "Jak korzystać z FoundKey"
title: "Jak korzystać z Foundkey"
step1_1: "Witaj!"
step1_3: "Twoja oś czasu jest jeszcze pusta, ponieważ nie opublikowałeś(-aś) jeszcze\
step1_3: "Twoja oś czasu jest jeszcze pusta, ponieważ nie opublikował jeszcze\
\ żadnych wpisów i nie obserwujesz jeszcze nikogo."
step2_1: "Ukończmy konfigurację profilu zanim utworzymy wpis lub zaczniemy kogoś\
\ obserwować."
step3_1: "Zakończyłeś(-aś) konfigurację profilu?"
step3_3: "Wypełnij pole i kliknij przycisk w prawym górnym rogu by wysłać post."
step3_1: "Zakończył*ś konfigurację profilu?"
step3_3: "Wypełnij pole i kliknij przycisk w prawym górnym rogu by wysłać wpis."
step4_1: Skończył*ś publikować swój pierwszy wpis?
step6_2: Możesz też dodawać reakcję do wpisów innych ludzi, żeby szybko odpowiedzieć
na nie.
step4_2: Hura! Teraz Twój wpis powinien być widoczny na Twojej osi czasu.
step5_2: '{featured} pokaże CI popularne wpisy z tej instancji. {explore} pozwoli
ci znaleźć popularnych użytkowników. Spróbuj tam znaleźć ludzi których chciał*byś
zaobserwować!'
step7_1: Gratulacje! Właśnie ukończył*ś podstawowy samouczek Foundkey.
step6_3: W celu dodania reakcji, kliknij na "+" przy poście innego użytkownika i
wybierz jakieś emoji jako reakcję na niego.
step6_1: Wpisy innych ludzi powinny już się pojawiać na Twojej osi czasu.
step7_2: Jeśli chcesz dowiedzieć się więcej o Foundkey, przejdź do sekcji {help}.
step7_3: A teraz, powodzenia i miłej zabawy z Foundkey! 🚀
step5_1: Teraz spróbujmy ożywić oś czasu poprzez zaobserwowanie innych ludzi.
step1_2: Ta strona jest nazywana "osią czasu". Pokazuje ona chronologicznie ułożone
wpisy ludzi których obserwujesz.
step5_4: Jeśli inny użytkownik ma kłódkę przy nazwie, ręczne zatwierdzenie Twojej
prośby o obserwację przez tego użytkownika może zająć trochę czasu.
step3_2: Spróbujmy opublikować wpis. Możesz to zrobić klikając przycisk z ikoną
ołówka.
step2_2: Dodanie informacji o sobie pomoże innym w decyzji czy chcą widzieć Twoje
wpisy, lub Ciebie obserwować.
step5_3: By zaobserwować innych użytkowników, kliknij na ich ikonę i wciśnij przycisk
"Obserwuj" na ich profilu.
step3_4: Nic nie przychodzi na myśl? Spróbuj "Właśnie wrócił*m z kościoła"!
_2fa:
registerDevice: "Zarejestruj nowe urządzenie"
step1: "Najpierw, zainstaluj aplikację uwierzytelniającą (taką jak {a} lub {b})\
@ -844,33 +902,54 @@ _2fa:
step2: "Następnie, zeskanuje kod QR z ekranu."
step3: "Wprowadź token podany w aplikacji, aby ukończyć konfigurację."
step4: "Od teraz, przy każdej próbie logowania otrzymasz prośbę o token logowania."
alreadyRegistered: Już zarejestrował*ś urządzenie do uwierzytelnienia dwuetapowego.
step2Url: 'Możesz też wpisać ten URL jeśli używasz programu komputerowego:'
registerKey: Zarejestruj klucz sprzętowy
securityKeyInfo: Oprócz uwierzytelnienia odciskiem palców lub PIN, możesz również
skonfigurować uwierzytelnienie za pomocą kluczy sprzętowych obsługujących FIDO2,
w celu dalszego zabezpieczenia Twojego konta.
_permissions:
"read:account": "Wyświetl informacje o swoim koncie"
"write:account": "Edytuj swoje informacje o koncie"
"read:blocks": "Zobacz listę osób, które zablokowałeś(-aś)"
"write:blocks": "Edytuj listę osób, które zablokowałeś(-aś)"
"read:drive": "Dostęp do plików i katalogów ze Twojego dysku"
"write:drive": "Edycja i usuwanie plików i katalogów z Twojego dysku."
"read:favorites": "Wyświetlanie Twojej listy ulubionych."
"write:favorites": "Edycja Twojej listy ulubionych."
"read:following": "Wyświetlanie informacji o obserwowanych"
"write:following": "Obserwowanie lub cofanie obserwacji innych kont"
"read:mutes": "Wyświetlanie listy osób, które wyciszyłeś(-aś)"
"write:mutes": "Edycja listy osób, które wyciszyłeś(-aś)"
"write:account": "Edytuj informacje o koncie"
"read:blocks": "Wyświetl listę zablokowanych użytkowników"
"write:blocks": "Blokuj i odblokowuj użytkowników"
"read:drive": "Wyświetl pliki i foldery z twojego Dysku"
"write:drive": "Tworzenie, zmienianie i usuwanie plików z Dysku"
"read:favorites": "Wyświetlanie listy ulubionych wpisów"
"write:favorites": "Edycja listy ulubionych wpisów"
"read:following": "Wyświetlanie informacji o obserwowanych i obserwujących"
"write:following": "Obserwowanie i cofanie obserwacji innych użytkowników"
"read:mutes": "Wyświetlanie użytkowników którzy są wyciszeni, lub których podbicia\
\ są wyciszone"
"write:mutes": "Wyciszanie i odciszanie użytkowników, lub ich podbić"
"read:notifications": "Wyświetlanie powiadomień"
"write:notifications": "Działanie na powiadomieniach"
"read:reactions": "Wyświetlanie reakcji"
"write:reactions": "Edycja reakcji"
"write:votes": "Głosowanie w ankiecie"
"read:pages": "Wyświetlanie Twoich stron"
"write:pages": "Edycja lub usuwanie Twoich stron"
"write:notifications": "Oznaczanie powiadomień jako przeczytanych, oraz tworzenie\
\ niestandardowych powiadomień"
"write:reactions": "Tworzenie i usuwanie reakcji"
"write:votes": "Głosowanie w ankietach"
"read:pages": "Wyświetlanie stron"
"write:pages": "Tworzenie, zmienianie i usuwanie stron"
"read:page-likes": "Wyświetlanie polubień na stronach"
"write:page-likes": "Edycja polubień na stronach"
"read:user-groups": "Wyświetlanie grup użytkownika"
"write:user-groups": "Edycja lub usuwanie grup użytkownika"
"write:page-likes": "Dodawanie oraz usuwanie polubień stron"
"read:user-groups": "Wyświetlanie grup należących do Ciebie, do których dołączył*ś,\
\ lub został*ś zaproszon*"
"write:user-groups": "Tworzenie, modyfikowanie, usuwanie, przenoszenie grup, dołączanie\
\ i wychodzenie z grup. Zapraszaj i banuj innych z grup. Akceptuj i odrzucaj zaproszenia\
\ do grup."
"read:reactions": Wyświetlaj reakcje
"write:notes": Tworzenie i usuwanie wpisów
"write:messaging": Tworzenie i usuwanie wiadomości czatu
"write:channels": Tworzenie, modyfikowanie, obserwowanie i od-obserwowanie kanałów
"read:messaging": Wyświetlaj wiadomości czatu i jego historię
"read:channels": Wyświetlaj obserwowane kanały i te do których dołączył*ś
_auth:
shareAccess: "Czy chcesz autoryzować „{name}” do dostępu do tego konta?"
permissionAsk: "Ta aplikacja wymaga następujących uprawnień:"
permissionAsk: "Ta aplikacja wymaga następujących uprawnień"
pleaseGoBack: Wróć do aplikacji
shareAccessAsk: Czy na pewno chcesz upoważnić tą aplikację do dostępu do Twojego
konta?
denied: Odmowa dostępu
callback: Wracam do aplikacji
_weekday:
sunday: "Niedziela"
monday: "Poniedziałek"
@ -892,6 +971,14 @@ _widgets:
postForm: "Utwórz wpis"
button: "Przycisk"
jobQueue: "Kolejka zadań"
rssMarquee: Karuzela RSS
rss: Czytnik RSS
digitalClock: Zegar cyfrowy
onlineUsers: Użytkownicy online
slideshow: Pokaz slajdów
aichan: Ai
aiscript: Konsola AiScript
serverMetric: Wskaźniki serwera
_cw:
hide: "Ukryj"
show: "Załaduj więcej"
@ -926,6 +1013,10 @@ _visibility:
followers: "Obserwujący"
specified: "Bezpośredni"
specifiedDescription: "Napisz tylko określonym użytkownikom"
localOnly: Lokalnie
homeDescription: Wpis będzie publiczny ale nie pojawi się na osi czasu instancji
followersDescription: Wpis pojawi się tylko na osiach czasu Twoich obserwujących
localOnlyDescription: Wpis będzie widoczny tylko dla użytkowników tej instancji
_postForm:
_placeholders:
a: "Co się dzieje?"
@ -934,6 +1025,9 @@ _postForm:
d: "Czy masz coś do powiedzenia?"
e: "Zacznij coś pisać…"
f: "Czekamy, aż coś napiszesz."
quotePlaceholder: Cytuj ten wpis...
replyPlaceholder: Odpowiedz na ten wpis...
channelPlaceholder: Wyślij na kanał...
_profile:
name: "Nazwa"
username: "Nazwa użytkownika"
@ -953,36 +1047,50 @@ _exportOrImport:
muteList: "Wycisz"
blockingList: "Zablokuj"
userLists: "Listy"
excludeMutingUsers: Wyklucz wyciszonych użytkowników
excludeInactiveUsers: Wyklucz nieaktywnych użytkowników
_charts:
federation: "Federacja"
apRequest: "Żądania"
usersTotal: "Łącznie # użytkowników"
activeUsers: "Aktywni użytkownicy"
usersIncDec: Różnica w liczbie użytkowników
notesIncDec: Różnica w liczbie wpisów
localNotesIncDec: Różnica w liczbie lokalnych wpisów
notesTotal: Łączna liczba wpisów
remoteNotesIncDec: Różnica w liczbie zdalnych wpisów
filesIncDec: Różnica w liczbie plików
storageUsageTotal: Łączne użycie dysku
filesTotal: Łączna liczba plików
storageUsageIncDec: Różnica w wykorzystaniu miejsca
_instanceCharts:
requests: "Żądania"
notesTotal: "Łącznie # wpisów"
ff: "Różnica w # obserwujących"
ff: "Różnica w liczbie obserwowanych / obserwujących użytkowników"
ffTotal: "Łączna liczba # obserwujących"
cacheSize: "Różnica w rozmiarze pamięci podręcznej"
cacheSizeTotal: "Łączny rozmiar pamięci podręcznej"
files: "Różnica # plików"
filesTotal: "Łącznie # plików"
usersTotal: Łączna liczba użytkowników
notes: Różnica w liczbie wpisów
users: Różnica w liczbie użytkowników
_timelines:
home: "Strona główna"
local: "Lokalne"
social: "Społeczność"
social: "Społeczna"
global: "Globalna"
_pages:
newPage: "Utwórz stronę"
editPage: "Edytuj tę stronę"
readPage: "Aktywowano widok źródła"
created: "Pomyślnie utworzono stronę!"
updated: "Pomyślnie zaktualizowano stronę!"
created: "Pomyślnie utworzono stronę"
updated: "Pomyślnie zaktualizowano stronę"
deleted: "Strona została usunięta"
pageSetting: "Ustawienia strony"
nameAlreadyExists: "Określony adres URL strony już istnieje"
invalidNameTitle: "Podany adres URL strony jest nieprawidłowy"
invalidNameText: "Sprawdź, czy nie jest puste"
invalidNameText: "Upewnij się, że pole tytułowe strony nie jest puste"
editThisPage: "Edytuj tę stronę"
viewSource: "Zobacz źródło"
viewPage: "Wyświetlanie Twoich stron"
@ -1007,32 +1115,37 @@ _relayStatus:
accepted: "Zaakceptowano"
rejected: "Odrzucono"
_notification:
youGotMention: "{name} wspomniał(a) o Tobie"
youGotReply: "{name} odpowiedział(a) Tobie"
youGotQuote: "{name} zacytował(a) Ciebie"
youRenoted: "{name} udostępnił(a) Twój wpis"
youGotPoll: "{name} zagłosował(a) w Twojej ankiecie"
youGotMessagingMessageFromUser: "{name} wysłał(a) Ci wiadomość"
youGotMention: "{name} wspomniał* o Tobie"
youGotReply: "{name} odpowiedział* Tobie"
youGotQuote: "{name} zacytował* Ciebie"
youRenoted: "{name} udostępnił* Twój wpis"
youGotPoll: "{name} zagłosował* w Twojej ankiecie"
youGotMessagingMessageFromUser: "{name} wysłał* Ci wiadomość"
youGotMessagingMessageFromGroup: "Została wysłana wiadomość do grupy {name}"
youWereFollowed: "Zaobserwował(a) Cię"
youReceivedFollowRequest: "Otrzymałeś(-aś) prośbę o możliwość obserwacji"
youWereFollowed: "zaobserwował* Cię"
youReceivedFollowRequest: "Otrzymał prośbę o możliwość obserwacji"
yourFollowRequestAccepted: "Twoja prośba o możliwość obserwacji została przyjęta"
youWereInvitedToGroup: "Zaproszony(-a) do grupy"
youWereInvitedToGroup: "{userName} zaprosił* Ciebie do grupy"
_types:
follow: "Obserwowani"
mention: "Wspomnij"
follow: "Nowi obserwujący"
mention: "Wspomnienia"
reply: "Odpowiedzi"
renote: "Udostępnij"
quote: "Cytuj"
reaction: "Reakcja"
renote: "Podbicia"
quote: "Cytaty"
reaction: "Reakcje"
pollVote: "Głosy w ankietach"
receiveFollowRequest: "Otrzymano prośbę o możliwość obserwacji"
followRequestAccepted: "Przyjęto prośbę o możliwość obserwacji"
groupInvited: "Zaproszono do grup"
app: "Powiadomienia z aplikacji"
receiveFollowRequest: "Otrzymane prośby o możliwość obserwacji"
followRequestAccepted: "Przyjęte prośby o możliwość obserwacji"
groupInvited: "Zaproszenia do grup"
app: "Powiadomienia z powiązanych aplikacji"
pollEnded: Zakończone ankiety
move: Inni użytkownicy przenoszący konta
_actions:
reply: "Odpowiedz"
renote: "Udostępnij"
followBack: również cię zaobserwował*
emptyPushNotificationMessage: Powiadomienia push zostały zaktualizowane
pollEnded: Są dostępne wyniki ankiety
_deck:
alwaysShowMainColumn: "Zawsze pokazuj główną kolumnę"
columnAlign: "Wyrównaj kolumny"
@ -1056,3 +1169,208 @@ _deck:
mentions: "Wspomnienia"
direct: "Bezpośredni"
_services: {}
exportAll: Eksportuj wszystko
exportSelected: Eksportuj wybrane
showLess: Pokaż mniej
botFollowRequiresApproval: Prośby o możliwość obserwacji z kont oznaczonych jako boty
wymagają zatwierdzenia
unrenoteAllConfirm: Czy na pewno chcesz cofnąć wszystkie podbicia tego wpisu?
renoteMute: Ukryj podbicia
renoteUnmute: Pokaż podbicia
unrenoteAll: Cofnij wszystkie podbicia
menu: Menu
clips: Klipsy
lastCommunication: Ostatnie połączenie
manageAccounts: Zarządzaj kontami
keepCw: Zostaw ostrzeżenia o zawartości
itsOff: Wyłączone
classic: Klasyczny
controlPanel: Panel sterowania
instanceDefaultLightTheme: Domyślny jasny motyw instancji
instanceDefaultThemeDescription: Wpisz kod motywu w formacie obiektowym.
mutePeriod: Długość wyciszenia
size: Rozmiar
recentNDays: Ostatnie {n} dni
translationSettings: Ustawienia tłumaczeń
breakFollow: Usuń obserwującego
filter: Filtruj
oneDay: Dzień
oneWeek: Tydzień
rateLimitExceeded: Przekroczono ratelimit
_signup:
emailAddressInfo: Wpisz swój adres email. Nie zostanie on upubliczniony.
almostThere: Jeszcze trochę
emailSent: Email potwierdzający został wysłany na Twój adres email {email}. Proszę
kliknij załączony link w celu dokończenia procesu tworzenia konta.
_accountDelete:
inProgress: Usuwanie jest w toku
started: Usuwanie zostało rozpoczęte.
mayTakeTime: Jako że usuwanie konta jest zasobożerną operacją, może zająć ono trochę
czasu, w zależności od ilości utworzonych wpisów oraz wysłanych plików.
accountDelete: Usuń konto
sendEmail: Gdy usuwanie konta będzie ukończone, zostanie wysłany email na adres
email przypisany do tego konta.
requestAccountDelete: Zażądaj usunięcia konta
blockThisInstanceDescription: Lokalna aktywność nie będzie wysyłana do tej instancji.
Aktywność z tej instancji będzie odrzucana.
maxCustomEmojiPicker: Maksymalna ilość sugerowanych niestandardowych emoji w wybieraku
unread: Nieprzeczytane
resolved: Rozwiązano
unresolved: Nierozwiązane
leaveGroup: Wyjdź z grupy
voteConfirm: Potwierdzasz głos na "{choice}"?
documentation: Dokumentacja
file: Plik
makeReactionsPublic: Włącz historię reakcji jako publiczną
unclip: Usuń klipsa
stopActivityDeliveryDescription: Lokalna aktywność nie będzie wysyłana do tej instancji.
Otrzymywanie aktywności działa jak dotychczas.
signinHistoryExpires: Dane dotyczące poprzednich prób logowania są automatycznie usuwane
po 60 dniach, w celu zachowania zgodności z przepisami dotyczącymi ochrony prywatności.
smtpSecure: Użyj implicit SSL/TLS dla połączeń SMTP
federateBlocks: Sfederuj blokady
federateBlocksDescription: Jeśli wyłączone, blokady nie będą wysyłane do instancji
blokowanego użytkownika.
failedToFetchAccountInformation: Nie można uzyskać informacji o koncie
deleteAccountConfirm: To usunie bezpowrotnie konto {handle}. Kontynuować?
_translationService:
_deepl:
authKey: Klucz uwierzytelnienia DeepL
_libreTranslate:
authKey: Klucz uwierzytelnienia LibreTranslate (opcjonalnie)
endpoint: Punkt końcowy API LibreTranslate
itsOn: Włączone
deleteAllFiles: Usuń wszystkie pliki
emailRequiredForSignup: Wymagaj adresu email przy rejestracji
threadMuteNotificationsDesc: Wybierz powiadomienia, które chcesz zobaczyć w tym wątku.
Obowiązują również globalne ustawienia powiadomień. Wyłączenie ma pierwszeństwo.
regexpError: Błąd regularnego wyrażenia
instanceMute: Wyciszone instancje
instanceDefaultDarkTheme: Domyślny ciemny motyw instancji
regexpErrorDescription: 'Wystąpił błąd w regularnym wyrażeniu znajdującym się w linijce
{line} Twoich {tab} wyciszeń słownych:'
reflectMayTakeTime: Może upłynąć trochę czasu, zanim pojawią się zmiany.
numberOfPageCacheDescription: Zwiększenie tej liczby poprawi wygodę użytkowników,
ale spowoduje większe zużycie serwera, jak i pamięci.
_emailUnavailable:
format: Format tego adresu email jest nieprawidłowy
used: Ten adres email już został użyty
disposable: Jednorazowe adresy email nie mogą być użyte
mx: Ten serwer email jest nieprawidłowy
smtp: Ten serwer email nie odpowiada
recommended: Polecane
_antennaSources:
homeTimeline: Wpisy od obserwowanych użytkowników
users: Wpisy od konkretnych użytkowników
all: Wszystkie wpisy
userList: Wpisy od użytkowników z konkretnej listy
userGroup: Wpisy od użytkowników z konkretnej grupy
translationService: Usługa tłumaczeń
ffVisibilityDescription: Pozwala skonfigurować kto może zobaczyć kogo obserwujesz
oraz kto Ciebie obserwuje.
leaveGroupConfirm: Czy na pewno chcesz opuścić "{name}"?
overridedDeviceKind: Typ urządzenia
useDrawerReactionPickerForMobile: Wyświetlaj wybierak reakcji jako szufladę na telefonie
makeReactionsPublicDescription: Dzięki temu lista wszystkich Twoich dotychczasowych
reakcji będzie publicznie widoczna.
muteThread: Wycisz wątek
unmuteThread: Odcisz wątek
ffVisibility: Widoczność obserwowanych/obserwujących
continueThread: Pokaż resztę wątku
incorrectPassword: Nieprawidłowe hasło.
clickToFinishEmailVerification: Kliknij {ok} by dokończyć weryfikację konta email.
cannotAttachFileWhenAccountSwitched: Nie możesz załączyć pliku będąc przełączonym
na inne konto.
cannotSwitchAccountWhenFileAttached: Nie możesz zmienić konta przy załączonych plikach.
tenMinutes: 10 minut
addTag: Dodaj tag
isSystemAccount: Konto założone i automatycznie zarządzane przez system.
auto: Auto
check: Sprawdź
cropImage: Kadruj zdjęcie
deleteAccount: Usuń konto
smartphone: Smartfon
tablet: Tablet
themeColor: Kolor znacznika instancji
oneHour: Godzina
cropImageAsk: Czy chcesz skadrować to zdjęcie?
recentNHours: Ostatnie {n} godzin
typeToConfirm: Wpisz {x} by potwierdzić
numberOfPageCache: Liczba zbuforowanych stron
noEmailServerWarning: Serwer email nie jest skonfigurowany.
thereIsUnresolvedAbuseReportWarning: Istnieją nierozwiązane zgłoszenia.
unlimited: Nieograniczone
selectAll: Wybierz wszystko
setCategory: Ustaw kategorię
setTag: Ustaw tag
removeTag: Usuń tag
externalCssSnippets: Kilka fragmentów CSS dla Twojej inspiracji (nie zarządzane przez
Foundkey)
confirmToUnclipAlreadyClippedNote: Ten wpis jest już częścią klpisa "{name}". Czy
chcesz w takim razie usunąć wpis z tego klipsa?
maxUnicodeEmojiPicker: Maksymalna ilość sugerowanych unicode emoji w wybieraku
_instanceMute:
instanceMuteDescription: Spowoduje to wyciszenie wszystkich wpisów/podbić z podanych
instancji, w tym tych od użytkowników odpowiadających na wpisy z wyciszonych instancji.
instanceMuteDescription2: Oddzielaj nowymi liniami
heading: Lista instancji do wyciszenia
title: Ukrywa wpisy z podanych instancji.
noPermissionsRequested: (Brak oczekiwanych uprawnień.)
appAuthorization: Autoryzacja aplikacji
oauthErrorGoBack: Wystąpił błąd podczas uwierzytelniania zewnętrznej aplikacji. Wróć
i spróbuj ponownie.
selectMode: Wybierz wiele
whatIsNew: Pokaż zmiany
reporter: Osoba zgłaszająca
translate: Tłumacz
translatedFrom: Przetłumaczone z {x}
accountDeletionInProgress: Trwa usuwanie konta.
forwardReport: Przekaż raport do zdalnej instancji
clip: Klipsy
createNewClip: Utwórz nowego klipsa
forwardReportIsAnonymous: Zamiast Twojego konta, anonimowe konto systemowe zostanie
wyświetlone na zdalnej instancji jako zgłaszający.
usernameInfo: Nazwa która odróżnia Twoje konto od innych z tego serwera. Możesz użyć
alfabetu łacińskiego (a-z, A-Z), cyfr (0-9), lub podkreślników (_). Nazwy użytkownika
nie mogą zostać później zmienione.
switchAccount: Przełącz konto
searchResult: Wyniki wyszukiwania
troubleshooting: Rozwiązywanie problemów
useBlurEffect: Używaj efektu rozmycia w interfejsie
learnMore: Dowiedz się więcej
misskeyUpdated: Foundkey zostało zaktualizowane!
flagShowTimelineRepliesDescription: Jeśli włączone, zostaną pokazane odpowiedzi użytkowników
do wpisów innych użytkowników.
flagShowTimelineReplies: Pokazuj odpowiedzi na osi czasu
proxyAccountDescription: Konto proxy jest kontem które w określonych sytuacjach zachowuje
się jak zdalny obserwujący. Na przykład, kiedy użytkownik dodaje zdalnego użytkownika
do listy, oraz żaden lokalny użytkownik nie obserwuje tego konta, aktywność owego
użytkownika nie zostanie dostarczona na oś czasu. W takim razie, użytkownika zaobserwuje
konto proxy.
keepOriginalUploading: Zostaw oryginalne zdjęcie
keepOriginalUploadingDescription: Zapisuje oryginalne zdjęcie. Jeśli wyłączone, wersja
do wyświetlania w sieci zostanie wygenerowana podczas wysłania.
disableDrawer: Nie używaj wysuwanych menu
objectStorageBaseUrlDesc: "URL stosowany jako odniesienie. Podaj URL twojego CDN,\
\ albo proxy, jeśli używasz któregokolwiek.\nDla S3 użyj 'https://<bucket>.s3.amazonaws.com',\
\ a dla GCS i jego odpowiedników użyj 'https://storage.googleapis.com/<bucket>',\
\ itd."
objectStorageSetPublicRead: Ustaw "public-read" podczas wysyłania
removeAllFollowing: Przestań obserwować wszystkich obserwowanych użytkowników
yourAccountSuspendedTitle: To konto jest zawieszone
yourAccountSuspendedDescription: To konto zostało zawieszone z powodu łamania regulaminu
tego serwera. Skontaktuj się z administratorem, jeśli chcesz poznać bardziej dokładny
powód. Prosimy o niezakładanie nowych kont.
numberOfColumn: Liczba kolumn
_remoteInteract:
urlInstructions: Możesz skopiować ten URL. Jeśli wkleisz go w pole wyszukiwania
na twojej instancji, najpewniej zostaniesz przekierowan* do właściwego miejsca.
title: Przepraszam, ale nie mogę tego zrobić.
description: Nie możesz wykonać tej czynności w tej chwili. Musisz najprawdopodobniej
zalogować się, albo wykonać ją na swojej instancji.
movedTo: Ten użytkownik przeniósł się na {handle}.
attachedToNotes: Wpisy z tym plikiem
showAttachedNotes: Pokaż wpisy z tym plikiem
uploadFailedSize: Plik jest za duży do przesłania.
uploadFailed: Przesyłanie nie powiodło się
uploadFailedDescription: Plik nie mógł zostać przesłany.

View file

@ -275,8 +275,6 @@ createFolder: "Crează folder"
renameFolder: "Redenumește acest folder"
deleteFolder: "Șterge acest folder"
addFile: "Adăugați un fișier"
emptyDrive: "Drive-ul tău e gol"
emptyFolder: "Folder-ul acesta este gol"
unableToDelete: "Nu se poate șterge"
inputNewFileName: "Introdu un nou nume de fișier"
inputNewDescription: "Introdu o descriere nouă"

View file

@ -181,14 +181,15 @@ clearCachedFiles: "Очистить кэш"
clearCachedFilesConfirm: "Удалить все закэшированные файлы с других сайтов?"
blockedInstances: "Заблокированные инстансы"
blockedInstancesDescription: "Введите список инстансов, которые хотите заблокировать.\
\ Они больше не смогут обмениваться с вашим инстансом."
\ Они больше не смогут обмениваться с вашим инстансом. Не-ASCII доменные имена должны\
\ быть переведены в punycode. Субдомены тоже будут заблокированы"
muteAndBlock: "Скрытие и блокировка"
mutedUsers: "Скрытые пользователи"
blockedUsers: "Заблокированные пользователи"
noUsers: "Нет ни одного пользователя"
editProfile: "Редактировать профиль"
noteDeleteConfirm: "Вы хотите удалить эту заметку?"
pinLimitExceeded: "Нельзя закрепить ещё больше заметок"
pinLimitExceeded: "Нельзя закрепить ещё больше заметок."
intro: "Установка FoundKey завершена! А теперь создайте учетную запись администратора."
done: "Готово"
processing: "Обработка"
@ -269,8 +270,6 @@ createFolder: "Создать папку"
renameFolder: "Переименовать папку"
deleteFolder: "Удалить папку"
addFile: "Добавить файл"
emptyDrive: "Диск пуст"
emptyFolder: "Папка пуста"
unableToDelete: "Удаление невозможно"
inputNewFileName: "Введите имя нового файла"
inputNewDescription: "Введите новую подпись"
@ -341,7 +340,7 @@ connectedTo: "Вы подключены к следующим аккаунтам
notesAndReplies: "Заметки и ответы"
withFiles: "Заметки с файлами"
silence: "Заглушить"
silenceConfirm: " Заглушить этого пользователя? Уверены?"
silenceConfirm: "Заглушить этого пользователя? Уверены?"
unsilence: "Снять глушение"
unsilenceConfirm: "Снять глушение с этого пользователя? Уверены?"
popularUsers: "Популярные пользователи"
@ -668,7 +667,6 @@ editCode: "Редактировать исходный текст"
apply: "Применить"
receiveAnnouncementFromInstance: "Получать оповещения с инстанса"
emailNotification: "Уведомления по электронной почте"
publish: "Опубликовать"
useReactionPickerForContextMenu: "Открывать палитру реакций правой кнопкой"
typingUsers: "Стук клавиш. Это {users}…"
jumpToSpecifiedDate: "Перейти к заданной дате"
@ -707,10 +705,7 @@ switch: "Переключение"
noMaintainerInformationWarning: "Не заполнены сведения об администраторах"
noBotProtectionWarning: "Ботозащита не настроена"
configure: "Настроить"
postToGallery: "Опубликовать в галерею"
gallery: "Галерея"
recentPosts: "Недавние публикации"
popularPosts: "Популярные публикации"
shareWithNote: "Поделиться заметкой"
emailNotConfiguredWarning: "Не указан адрес электронной почты"
ratio: "Соотношение"
@ -728,7 +723,7 @@ misskeyUpdated: "FoundKey обновился!"
whatIsNew: "Что новенького?"
translate: "Перевод"
translatedFrom: "Перевод. Язык оригинала — {x}"
accountDeletionInProgress: "В настоящее время выполняется удаление учетной записи"
accountDeletionInProgress: "В настоящее время выполняется удаление учетной записи."
usernameInfo: "Имя, которое отличает вашу учетную запись от других на этом сервере.\
\ Вы можете использовать алфавит (a~z, A~Z), цифры (0~9) или символы подчеркивания\
\ (_). Имена пользователей не могут быть изменены позже."
@ -755,7 +750,7 @@ ffVisibility: "Видимость подписок и подписчиков"
ffVisibilityDescription: "Здесь можно настроить, кто будет видеть ваши подписки и\
\ подписчиков."
continueThread: "Показать следующие ответы"
deleteAccountConfirm: "Учётная запись будет безвозвратно удалена. Подтверждаете?"
deleteAccountConfirm: "Учётная запись {handle} будет безвозвратно удалена. Подтверждаете?"
incorrectPassword: "Пароль неверен."
voteConfirm: "Отдать голос за «{choice}»?"
hide: "Спрятать"
@ -805,11 +800,6 @@ _forgotPassword:
\ ресурса, чтобы сменить пароль."
contactAdmin: "Здесь не используются адреса электронной почты, так что свяжитесь\
\ с администратором, чтобы поменять пароль."
_gallery:
my: "Личная"
liked: "Понравившееся"
like: "Нравится!"
unlike: "Отменить «нравится»"
_email:
_follow:
title: "Новый подписчик"
@ -1004,7 +994,7 @@ _tutorial:
step5_3: "Чтобы подписаться на кого-нибудь, щёлкните по его аватару и в открывшемся\
\ профиле нажмите кнопку «Подписаться»."
step5_4: "Некоторые пользователи (около их имени «висит замок») вручную подтверждают\
\ чужие подписки. Так что иногда подписка начинает работать не сразу.\n"
\ чужие подписки. Так что иногда подписка начинает работать не сразу."
step6_1: "Если теперь в ленте видны и чужие заметки, значит у вас получилось."
step6_2: "Здесь можно непринуждённо выразить свои чувства к чьей-то заметке, отметив\
\ «реакцию» под ней."
@ -1044,7 +1034,6 @@ _permissions:
"write:notes": "Писать и удалять заметки"
"read:notifications": "Смотреть уведомления"
"write:notifications": "Изменять уведомления"
"read:reactions": "Смотреть реакции"
"write:reactions": "Изменять реакции"
"write:votes": "Голосовать"
"read:pages": "Смотреть страницы"
@ -1055,10 +1044,6 @@ _permissions:
"write:user-groups": "Изменять и удалять группы пользователей"
"read:channels": "Смотреть каналы"
"write:channels": "Изменять каналы"
"read:gallery": "Просмотр галереи"
"write:gallery": "Редактирование галереи"
"read:gallery-likes": "Просмотр списка понравившегося в галерее"
"write:gallery-likes": "Изменение списка понравившегося в галерее"
_auth:
shareAccess: "Дать доступ для «{name}» к вашей учётной записи?"
shareAccessAsk: "Уверены, что хотите дать приложению доступ к своей учётной записи?"
@ -1162,7 +1147,7 @@ _profile:
changeAvatar: "Поменять аватар"
changeBanner: "Поменять изображение в шапке"
_exportOrImport:
allNotes: "Все записи\n"
allNotes: "Все записи"
followingList: "Подписки"
muteList: "Скрытые"
blockingList: "Заблокированные"
@ -1284,3 +1269,81 @@ _deck:
mentions: "Упоминания"
direct: "Личное"
_services: {}
botFollowRequiresApproval: Запросы на подписку от аккаунтов помеченных как бот требуют
подтверждения
showLess: Показать меньше
exportAll: Экспортировать всё
exportSelected: Экспортировать выбранное
cannotAttachFileWhenAccountSwitched: Вы не можете прикрепить файл, перейдя в другую
учетную запись.
cannotSwitchAccountWhenFileAttached: Вы не можете переключать учетные записи, пока
файлы прикреплены.
deleteAccount: Удалить аккаунт
isSystemAccount: Учетная запись, созданная системой и автоматически управляемая ею.
oneDay: Один день
cropImage: Обрезать изображение
documentation: Документация
movedTo: Этот пользователь перешел на {handle}.
typeToConfirm: Пожалуйста введите {x} чтобы подтвердить
rateLimitExceeded: Лимит превышен
numberOfPageCache: Количество кэшированных страниц
numberOfPageCacheDescription: Увеличение этого числа повысит удобство для пользователей,
но приведет к увеличению нагрузки на сервер, а также к использованию большего объема
памяти.
file: Файл
unclip: Удалить из подборки
translationSettings: Настройки перевода
translationService: Служба перевода
threadMuteNotificationsDesc: Выберите уведомления, которые вы хотите просмотреть в
этом треде. Также применяются глобальные настройки уведомлений. Отключение имеет
приоритет.
reflectMayTakeTime: Это может занять некоторое время чтобы вступило в силу.
failedToFetchAccountInformation: Не удалось получить информацию о аккаунте
instanceDefaultThemeDescription: Введите код темы в формате объекта.
tenMinutes: 10 минут
oneHour: Один час
oneWeek: Одна неделя
cropImageAsk: Вы хотите обрезать это изображение?
recentNHours: Последние {n} часов
recentNDays: Последние {n} дней
confirmToUnclipAlreadyClippedNote: Эта заметка уже является частью подборки "{name}".
Вы хотите вместо этого удалить это из этой подборки?
noEmailServerWarning: Сервер электронной почты не настроен.
setTag: Установить метку
addTag: Добавить метку
removeTag: Удалить метку
externalCssSnippets: Несколько фрагментов CSS для вашего вдохновения (не управляются
FoundKey)
oauthErrorGoBack: Произошла ошибка при попытке аутентификации стороннего приложения.
Пожалуйста, вернитесь и попробуйте еще раз.
appAuthorization: Авторизация приложения
noPermissionsRequested: (Никаких разрешений не требуется.)
selectMode: Выберите несколько
selectAll: Выбрать все
setCategory: Установить категорию
thereIsUnresolvedAbuseReportWarning: Есть нерасмотренные жалобы.
recommended: Рекомендовано
check: Проверка
unlimited: Неограниченный
mutePeriod: Длительность глушения
uploadFailed: Загрузка не удалась
uploadFailedDescription: Файл не может быть загружен.
uploadFailedSize: Файл слишком большой для загрузки.
renoteUnmute: Показать репосты
stopActivityDeliveryDescription: Локальная активнось не будет отправлена на этот сервер.
Получение активностей работает как раньше.
renoteMute: Скрыть репосты
unrenoteAllConfirm: Вы уверены что хотите отменить все репосты данной замети?
unrenoteAll: Отменить все репосты
blockThisInstanceDescription: Локальная активность не будет отправлена на этот сервер.
Активность этого сервера будет выброшена.
attachedToNotes: Заметки с этим файлом
showAttachedNotes: Показать заметки с этим файлом
signinHistoryExpires: Данные о прошлых попытках войти будут автоматически удалены
после 60 дней для соблюдения правил конфиденциальности.
deleteAllFiles: Удалить все файлы
federateBlocks: Федерировать блоки
federateBlocksDescription: Если выключено, то активности типа "блок" не будут отправлены.
regexpErrorDescription: 'Произошла ошибка в регулярном выражении на строке {line}
ваших {tab} заглушенных слов:'
reporter: Подавший жалобу

View file

@ -269,8 +269,6 @@ createFolder: "Vytvoriť priečinok"
renameFolder: "Premenovať priečinok"
deleteFolder: "Odstrániť priečinok"
addFile: "Pridať súbor"
emptyDrive: "Váš disk je prázdny"
emptyFolder: "Tento priečinok je prázdny"
unableToDelete: "Nedá sa odstrániť"
inputNewFileName: "Zadajte nový názov"
inputNewDescription: "Zadajte nový popis"
@ -661,7 +659,6 @@ editCode: "Upraviť kód"
apply: "Použiť"
receiveAnnouncementFromInstance: "Prijať notifikácie z tohoto servera"
emailNotification: "Emailové upozornenia"
publish: "Zverejniť"
useReactionPickerForContextMenu: "Otvoriť výber reakcií na pravý klik"
typingUsers: "{users} píše/u"
jumpToSpecifiedDate: "Skočiť na konkrétny dátum"
@ -700,10 +697,7 @@ switch: "Prepnúť"
noMaintainerInformationWarning: "Informácie správcu nie sú nastavené."
noBotProtectionWarning: "Ochrana proti botom nie je nastavená."
configure: "Konfigurovať"
postToGallery: "Vytvoriť nový príspevok v galérii"
gallery: "Galéria"
recentPosts: "Najnovšie príspevky"
popularPosts: "Populárne príspevky"
shareWithNote: "Zdieľať s poznámkou"
emailNotConfiguredWarning: "Nie je nastavená emailová adresa."
ratio: "Pomer"
@ -804,11 +798,6 @@ _forgotPassword:
ifNoEmail: "Ak ste pri registrácii nepoužili email, prosím kontaktujte administrátora."
contactAdmin: "Tento server nepodporuje používanie emailových adries, prosím kontaktuje\
\ administrátor, ktorý vám resetuje heslo."
_gallery:
my: "Moja galéria"
liked: "Obľúbené príspevky"
like: "Páči sa mi"
unlike: "Nepáči sa mi"
_email:
_follow:
title: "Máte nového sledujúceho"
@ -1039,7 +1028,6 @@ _permissions:
"write:notes": "Písať alebo odstrániť poznámky"
"read:notifications": "Vidieť vaše oznámenia"
"write:notifications": "Pracovať s vašimi notifikáciami"
"read:reactions": "Vidieť vaše reakcie"
"write:reactions": "Upravovať vaše reakcie"
"write:votes": "Hlasovať v hlasovaniach"
"read:pages": "Vidieť vaše stránky"
@ -1050,10 +1038,6 @@ _permissions:
"write:user-groups": "Upraviť alebo odstrániť vaše skupiny"
"read:channels": "Čítať vaše kanály"
"write:channels": "Upravovať vaše kanály"
"read:gallery": "Vidieť vašu galériu"
"write:gallery": "Upravovať vašu galériu"
"read:gallery-likes": "Vidieť zoznam obľúbených príspevkov z galérie"
"write:gallery-likes": "Upraviť zoznam obľúbených príspevov z galérie"
_auth:
shareAccess: "Prajete si povoliť \"{name}\", aby mal prístup k tomuto účtu?"
shareAccessAsk: "Naozaj chcete povoliť tejto aplikácii prístup k tomuto účtu?"
@ -1257,7 +1241,7 @@ _notification:
groupInvited: "Pozvánky do skupín"
app: "Oznámenia z prepojených aplikácií"
_actions:
followBack: "Sledovať späť\n"
followBack: "Sledovať späť"
reply: "Odpovedať"
renote: "Preposlať"
_deck:

View file

@ -74,7 +74,7 @@ followers: "Följare"
followsYou: "Följer dig"
createList: "Skapa lista"
manageLists: "Hantera lista"
error: "Fel!"
error: "Fel"
somethingHappened: "Ett fel har uppstått"
retry: "Försök igen"
pageLoadError: "Det gick inte att ladda sidan."
@ -183,15 +183,17 @@ clearQueueConfirmText: "Om någon not är olevererad i kön kommer den inte fede
clearCachedFiles: "Rensa cache"
clearCachedFilesConfirm: "Är du säker att du vill radera alla cachade externa filer?"
blockedInstances: "Blockerade instanser"
blockedInstancesDescription: "Lista adressnamn av instanser som du vill blockera.\
\ Listade instanser kommer inte längre kommunicera med denna instans."
blockedInstancesDescription: "Skriv de instansernas domäner som du vill blockera.\
\ Uppradade instanser kommer inte längre kunna kommunicera med denna instans. Icke\
\ ASCII domännamn måste skrivas i punycode. Subdomäner till de uppradade instanserna\
\ kommer också blockeras."
muteAndBlock: "Tystningar och blockeringar"
mutedUsers: "Tystade användare"
blockedUsers: "Blockerade användare"
noUsers: "Det finns inga användare"
editProfile: "Redigera profil"
noteDeleteConfirm: "Är du säker på att du vill ta bort denna not?"
pinLimitExceeded: "Du kan inte fästa fler noter"
pinLimitExceeded: "Du kan inte fästa fler noter."
intro: "FoundKey har installerats! Vänligen skapa en adminanvändare."
done: "Klar"
processing: "Bearbetar..."
@ -208,7 +210,7 @@ publishing: "Publiceras"
notResponding: "Svarar inte"
changePassword: "Ändra lösenord"
security: "Säkerhet"
retypedNotMatch: "Inmatningen matchar inte"
retypedNotMatch: "Inmatningen matchar inte."
currentPassword: "Nuvarande lösenord"
newPassword: "Nytt lösenord"
newPasswordRetype: "Bekräfta lösenord"
@ -284,3 +286,35 @@ _deck:
list: "Listor"
mentions: "Omnämningar"
_services: {}
botFollowRequiresApproval: Följarförfrågningar från botmarkerade konton kräver manuellt
godkännande
home: Hem
activity: Akitivitet
images: Bilder
birthday: Födelsedag
yearsOld: '{age} år gammal'
stopActivityDeliveryDescription: Lokala aktiviteter kommer inte skickas till denna
instans. Mottagande av aktiviteter fungerar som innan.
remoteUserCaution: Eftersom användaren är ifrån en fjärran instans så kan informationen
vara inkomplett.
registeredDate: Blev medlem vid
location: Plats
theme: Teman
exportAll: Exportera alla
exportSelected: Exportera valda
showLess: Dölj
keepOriginalUploadingDescription: Sparar den ursprungliga bilden som den är. Om avstängd
så kommer en version som visas på webben genereras vid uppladning.
fromDrive: Från Drive
fromUrl: Från URL
uploadFromUrl: Ladda upp via en URL
uploadFromUrlDescription: URL till filen som du vill ladda upp
uploadFromUrlRequested: Förfrågade uppladningar
uploadFromUrlMayTakeTime: Det tar kanske ett tag innan uppladningen är färdig.
explore: Upptäck
messageRead: Läs
noMoreHistory: Det finns ingen mer historik
startMessaging: Inled en ny chatt
agreeTo: Jag godkänner användarvillkoren {0}
tos: Användarevillkoren
start: Börja

View file

@ -23,7 +23,7 @@ openInWindow: "Bir pencere ile aç"
profile: "Profil"
timeline: "Zaman çizelgesi"
noAccountDescription: "Bu kullanıcı henüz biyografisini yazmadı"
login: "Giriş Yap "
login: "Giriş Yap"
logout: ıkış Yap"
signup: "Kayıt Ol"
users: "Kullanıcı"

View file

@ -183,14 +183,16 @@ clearCachedFiles: "Очистити кеш"
clearCachedFilesConfirm: "Ви впевнені, що хочете видалити всі кешовані файли?"
blockedInstances: "Заблоковані інстанси"
blockedInstancesDescription: "Вкажіть інстанси, які потрібно заблокувати. Перелічені\
\ інстанси більше не зможуть спілкуватися з цим інстансом."
\ інстанси більше не зможуть спілкуватися з цим інстансом. Назви доменів не в ASCII\
\ кодуванні мають бути вказані в кодуванні punycode. Піддомени вказаних доменів\
\ також будуть заблоковані."
muteAndBlock: "Заглушення і блокування"
mutedUsers: "Заглушені користувачі"
blockedUsers: "Заблоковані користувачі"
noUsers: "Немає користувачів"
editProfile: "Редагувати обліковий запис"
noteDeleteConfirm: "Ви дійсно хочете видалити цей запис?"
pinLimitExceeded: "Більше записів не можна закріпити"
pinLimitExceeded: "Більше записів закріпити не можна."
intro: "Встановлення FoundKey завершено! Будь ласка, створіть обліковий запис адміністратора."
done: "Готово"
processing: "Обробка"
@ -270,8 +272,6 @@ createFolder: "Створити теку"
renameFolder: "Перейменувати теку"
deleteFolder: "Видалити теку"
addFile: "Додати файл"
emptyDrive: "Диск порожній"
emptyFolder: "Тека порожня"
unableToDelete: "Видалення неможливе"
inputNewFileName: "Введіть ім'я нового файлу"
inputNewDescription: "Введіть новий заголовок"
@ -548,7 +548,7 @@ smtpPass: "Пароль"
emptyToDisableSmtpAuth: "Залиште назву користувача і пароль пустими для вимкнення\
\ підтвердження SMTP"
smtpSecure: "Використовувати безумовне шифрування SSL/TLS для з'єднань SMTP"
smtpSecureInfo: "Вимкніть при використанні STARTTLS "
smtpSecureInfo: "Вимкніть при використанні STARTTLS ."
testEmail: "Тестовий email"
wordMute: "Блокування слів"
regexpError: "Помилка регулярного виразу"
@ -580,7 +580,7 @@ abuseReports: "Скарги"
reportAbuse: "Поскаржитись"
reportAbuseOf: "Поскаржитись на {name}"
fillAbuseReportDescription: "Будь ласка вкажіть подробиці скарги."
abuseReported: "Дякуємо, вашу скаргу було відправлено. "
abuseReported: "Дякуємо, вашу скаргу було відправлено."
reporter: "Репортер"
reporteeOrigin: "Про кого повідомлено"
reporterOrigin: "Хто повідомив"
@ -666,7 +666,6 @@ editCode: "Редагувати вихідний текст"
apply: "Застосувати"
receiveAnnouncementFromInstance: "Отримувати оповіщення з інстансу"
emailNotification: "Сповіщення електронною поштою"
publish: "Опублікувати"
useReactionPickerForContextMenu: "Відкривати палітру реакцій правою кнопкою"
typingUsers: "Стук клавіш. Це {users}…"
goBack: "Назад"
@ -678,8 +677,6 @@ hide: "Сховати"
indefinitely: "Ніколи"
_ffVisibility:
public: "Опублікувати"
_gallery:
unlike: "Не вподобати"
_email:
_follow:
title: "Новий підписник"
@ -698,7 +695,7 @@ _nsfw:
ignore: "Не приховувати NSFW медіа"
force: "Приховувати всі медіа файли"
_mfm:
cheatSheet: " Довідка MFM"
cheatSheet: "Довідка MFM"
intro: "MFM це ексклюзивна мова розмітки тексту в FoundKey, яку можна використовувати\
\ в багатьох місцях. Тут ви можете переглянути приклади її синтаксису."
dummy: "FoundKey розширює світ Федіверсу"
@ -849,7 +846,7 @@ _tutorial:
step5_4: "Якщо користувач має замок при імені, то йому потрібно буде вручну підтвердити\
\ вашу заявку на підписку."
step6_1: "Тепер ви повинні бачити записи інших користувачів на вашій стрічці подій."
step6_2: "Також ви можете швидко відповісти, або \"відреагувати\" на записи інших\
step6_2: "Також ви можете швидко відповісти, або \"відреагувати\" на записи інших\
\ користувачів."
step6_3: "Щоб \"відреагувати\", нажміть на знак плюс \"+\" на записі і виберіть\
\ емоджі яким ви хочете \"відреагувати\"."
@ -875,7 +872,6 @@ _permissions:
"write:mutes": "Змінювати список ігнорованих"
"write:notes": "Писати і видаляти нотатки"
"read:notifications": "Переглядати сповіщення"
"read:reactions": "Переглядати реакції"
"write:reactions": "Змінювати реакції"
"write:votes": "Голосувати в опитуваннях"
"read:pages": "Переглядати сторінки"
@ -918,7 +914,7 @@ _widgets:
button: "Кнопка"
onlineUsers: "Користувачі онлайн"
jobQueue: "Черга завдань"
serverMetric: "Показники сервера "
serverMetric: "Показники сервера"
aiscript: "Консоль AiScript"
_cw:
hide: "Сховати"
@ -1095,3 +1091,26 @@ _deck:
mentions: "Згадки"
direct: "Особисте"
_services: {}
exportAll: Експортувати все
exportSelected: Експортувати обране
signinHistoryExpires: Дані про минулі спроби входу автоматично видаляються через 60
днів з метою дотримання законодавства.
addDescription: Додати опис
userPagePinTip: Ви можете показувати тут дописи вибравши «Закріпити в профілі» в меню
окремих дописів.
unrenoteAllConfirm: Ви впевнені, що хочете скасувати всі поширення цього запису?
unrenoteAll: Скасувати всі поширення
renoteMute: Приховати поширення
renoteUnmute: Показати поширення
quitFullView: Вийти з повного перегляду
notSpecifiedMentionWarning: Цей допис містить згадки користувачів не вказаних як одержувачі
userInfo: Інформація про користувача
unknown: Невідомо
hideOnlineStatus: Приховати онлайн статус
deleteAllFiles: Видалити всі файли
clear: Повернутися
markAllAsRead: Позначити все як прочитане
unlikeConfirm: Дійсно видалити ваше вподобання?
fullView: Повний перегляд
showLess: Показати менше
jumpToSpecifiedDate: Перейти до вказаної дати

View file

@ -269,8 +269,6 @@ createFolder: "Tạo thư mục"
renameFolder: "Đổi tên thư mục"
deleteFolder: "Xóa thư mục"
addFile: "Thêm tập tin"
emptyDrive: "Ổ đĩa của bạn trống trơn"
emptyFolder: "Thư mục trống"
unableToDelete: "Không thể xóa"
inputNewFileName: "Nhập tên mới cho tập tin"
inputNewDescription: "Nhập mô tả mới"
@ -528,7 +526,7 @@ large: "Lớn"
medium: "Vừa"
small: "Nhỏ"
generateAccessToken: "Tạo mã truy cập"
permission: "Cho phép "
permission: "Cho phép"
enableAll: "Bật toàn bộ"
disableAll: "Tắt toàn bộ"
tokenRequested: "Cấp quyền truy cập vào tài khoản"
@ -666,7 +664,6 @@ editCode: "Chỉnh sửa mã"
apply: "Áp dụng"
receiveAnnouncementFromInstance: "Nhận thông báo từ máy chủ này"
emailNotification: "Thông báo email"
publish: "Đăng"
useReactionPickerForContextMenu: "Nhấn chuột phải để mở bộ chọn biểu cảm"
typingUsers: "{users} đang nhập…"
jumpToSpecifiedDate: "Đến một ngày cụ thể"
@ -704,10 +701,7 @@ switch: "Chuyển đổi"
noMaintainerInformationWarning: "Chưa thiết lập thông tin vận hành."
noBotProtectionWarning: "Bảo vệ Bot chưa thiết lập."
configure: "Thiết lập"
postToGallery: "Tạo tút có ảnh"
gallery: "Thư viện ảnh"
recentPosts: "Tút gần đây"
popularPosts: "Tút được xem nhiều nhất"
shareWithNote: "Chia sẻ kèm với tút"
emailNotConfiguredWarning: "Chưa đặt địa chỉ email."
ratio: "Tỷ lệ"
@ -810,11 +804,6 @@ _forgotPassword:
\ viên."
contactAdmin: "Máy chủ này không hỗ trợ sử dụng địa chỉ email, vui lòng liên hệ\
\ với quản trị viên để đặt lại mật khẩu của bạn."
_gallery:
my: "Kho Ảnh"
liked: "Tút Đã Thích"
like: "Thích"
unlike: "Bỏ thích"
_email:
_follow:
title: "đã theo dõi bạn"
@ -942,7 +931,7 @@ _wordMute:
mutedNotes: "Những tút đã ẩn"
_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."
\ đượ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"
@ -1050,7 +1039,6 @@ _permissions:
"write:notes": "Soạn hoặc xóa tút"
"read:notifications": "Xem thông báo của tôi"
"write:notifications": "Quản lý thông báo của tôi"
"read:reactions": "Xem lượt biểu cảm của tôi"
"write:reactions": "Sửa lượt biểu cảm của tôi"
"write:votes": "Bình chọn"
"read:pages": "Xem trang của tôi"
@ -1061,10 +1049,6 @@ _permissions:
"write:user-groups": "Sửa hoặc xóa nhóm của tôi"
"read:channels": "Xem kênh của tôi"
"write:channels": "Sửa kênh của tôi"
"read:gallery": "Xem kho ảnh của tôi"
"write:gallery": "Sửa kho ảnh của tôi"
"read:gallery-likes": "Xem danh sách các tút đã thích trong thư viện của tôi"
"write:gallery-likes": "Sửa danh sách các tút đã thích trong thư viện của tôi"
_auth:
shareAccess: "Bạn có muốn cho phép \"{name}\" truy cập vào tài khoản này không?"
shareAccessAsk: "Bạn có chắc muốn cho phép ứng dụng này truy cập vào tài khoản của\

View file

@ -249,8 +249,6 @@ createFolder: "创建文件夹"
renameFolder: "重命名文件夹"
deleteFolder: "删除文件夹"
addFile: "添加文件"
emptyDrive: "网盘中无文件"
emptyFolder: "此文件夹中无文件"
unableToDelete: "无法删除"
inputNewFileName: "请输入新文件名"
inputNewDescription: "请输入新标题"
@ -619,7 +617,6 @@ editCode: "编辑代码"
apply: "应用"
receiveAnnouncementFromInstance: "从实例接收通知"
emailNotification: "邮件通知"
publish: "发布"
useReactionPickerForContextMenu: "单击右键打开回应工具栏"
typingUsers: "{users}正在输入"
jumpToSpecifiedDate: "跳转到特定日期"
@ -646,7 +643,7 @@ instanceBlocking: "被阻拦的实例"
selectAccount: "选择账户"
switchAccount: "切换账户"
enabled: "已启用"
disabled: "已禁用 "
disabled: "已禁用"
quickAction: "快捷操作"
user: "用户"
administration: "管理"
@ -655,10 +652,7 @@ switch: "切换"
noMaintainerInformationWarning: "管理人员信息未设置。"
noBotProtectionWarning: "Bot保护未设置。"
configure: "设置"
postToGallery: "发送到图库"
gallery: "图库"
recentPosts: "最新发布"
popularPosts: "热门投稿"
shareWithNote: "在帖子中分享"
emailNotConfiguredWarning: "电子邮件地址未设置。"
ratio: "比率"
@ -749,11 +743,6 @@ _forgotPassword:
enterEmail: "请输入您验证账号时用的电子邮箱地址,密码重置链接将发送至该邮箱上。"
ifNoEmail: "如果您没有使用电子邮件地址进行验证,请联系管理员。"
contactAdmin: "该实例不支持发送电子邮件。如果您想重设密码,请联系管理员。"
_gallery:
my: "我的图库"
liked: "喜欢的图片"
like: "喜欢"
unlike: "取消喜欢"
_email:
_follow:
title: "你有新的关注者"
@ -963,7 +952,6 @@ _permissions:
"write:notes": "撰写或删除帖子"
"read:notifications": "查看通知"
"write:notifications": "管理通知"
"read:reactions": "查看回应"
"write:reactions": "回应操作"
"write:votes": "投票"
"read:pages": "查看页面"
@ -974,10 +962,6 @@ _permissions:
"write:user-groups": "操作用户组"
"read:channels": "查看频道"
"write:channels": "管理频道"
"read:gallery": "浏览图库"
"write:gallery": "操作图库"
"read:gallery-likes": "读取喜欢的图片"
"write:gallery-likes": "操作喜欢的图片"
_auth:
shareAccess: "您要授权允许“{name}”访问您的帐户吗?"
shareAccessAsk: "您确定要授权此应用程序访问您的帐户吗?"

View file

@ -57,7 +57,7 @@ import: "匯入"
export: "匯出"
files: "檔案"
download: "下載"
driveFileDeleteConfirm: "確定要刪除檔案「{name}」嗎?使用此附件的貼文也會跟著消失。\n"
driveFileDeleteConfirm: "確定要刪除檔案「{name}」嗎?使用此附件的貼文也會跟著消失。"
unfollowConfirm: "確定要取消追隨{name}嗎?"
exportRequested: "已請求匯出。這可能會花一點時間。結束後檔案將會被放到雲端裡。"
importRequested: "已請求匯入。這可能會花一點時間"
@ -249,11 +249,9 @@ createFolder: "新增資料夾"
renameFolder: "重新命名資料夾"
deleteFolder: "刪除資料夾"
addFile: "加入附件"
emptyDrive: "雲端硬碟為空"
emptyFolder: "資料夾為空"
unableToDelete: "無法刪除"
inputNewFileName: "輸入檔案名稱"
inputNewDescription: "請輸入新標題 "
inputNewDescription: "請輸入新標題"
inputNewFolderName: "輸入新資料夾的名稱"
circularReferenceFolder: "目標文件夾是您要移動的文件夾的子文件夾。"
hasChildFilesOrFolders: "此文件夾不是空的,無法刪除。"
@ -294,7 +292,7 @@ driveCapacityPerRemoteAccount: "每個非本地用戶的雲端容量"
inMb: "以Mbps為單位"
iconUrl: "圖像URL"
bannerUrl: "橫幅圖像URL"
backgroundImageUrl: "背景圖片的來源網址 "
backgroundImageUrl: "背景圖片的來源網址"
pinnedUsers: "置頂用戶"
pinnedUsersDescription: "在「發現」頁面中使用換行標記想要置頂的使用者。"
hcaptchaSiteKey: "網站金鑰"
@ -419,7 +417,7 @@ useObjectStorage: "使用Object Storage"
objectStorageBaseUrl: "Base URL"
objectStorageBaseUrlDesc: "引用時的URL。如果您使用的是CDN或反向代理请指定其URL例如S3“https://<bucket>.s3.amazonaws.com”GCS“https://storage.googleapis.com/<bucket>”"
objectStorageBucket: "儲存空間Bucket"
objectStorageBucketDesc: "請指定您正在使用的服務的存儲桶名稱。 "
objectStorageBucketDesc: "請指定您正在使用的服務的存儲桶名稱。"
objectStoragePrefix: "前綴"
objectStoragePrefixDesc: "它存儲在此前綴目錄下。"
objectStorageEndpoint: "端點Endpoint"
@ -479,7 +477,7 @@ enablePlayer: "打開播放器"
disablePlayer: "關閉播放器"
themeEditor: "主題編輯器"
description: "描述"
describeFile: "添加標題 "
describeFile: "添加標題"
author: "作者"
leaveConfirm: "有未保存的更改。要放棄嗎?"
manage: "管理"
@ -618,7 +616,6 @@ editCode: "編輯代碼"
apply: "套用"
receiveAnnouncementFromInstance: "接收由本實例發出的電郵通知"
emailNotification: "郵件通知"
publish: "發佈"
useReactionPickerForContextMenu: "點擊右鍵開啟回應工具欄"
typingUsers: "{users}輸入中..."
jumpToSpecifiedDate: "跳轉到特定日期"
@ -654,10 +651,7 @@ switch: "切換"
noMaintainerInformationWarning: "尚未設定管理員信息。"
noBotProtectionWarning: "尚未設定Bot防護。"
configure: "設定"
postToGallery: "發佈到相簿"
gallery: "相簿"
recentPosts: "最新貼文"
popularPosts: "熱門的貼文"
shareWithNote: "在貼文中分享"
emailNotConfiguredWarning: "沒有設定電子郵件地址"
ratio: "%"
@ -746,13 +740,8 @@ _accountDelete:
inProgress: "正在刪除"
_forgotPassword:
enterEmail: "請輸入您的帳戶註冊的電子郵件地址。 密碼重置連結將被發送到該電子郵件地址。"
ifNoEmail: "如果您還沒有註冊您的電子郵件地址,請聯繫管理員。 "
contactAdmin: "此實例不支持電子郵件,請聯繫您的管理員重置您的密碼。 "
_gallery:
my: "我的貼文"
liked: "喜歡的貼文"
like: "讚"
unlike: "收回喜歡"
ifNoEmail: "如果您還沒有註冊您的電子郵件地址,請聯繫管理員。"
contactAdmin: "此實例不支持電子郵件,請聯繫您的管理員重置您的密碼。"
_email:
_follow:
title: "您有新的追隨者"
@ -786,7 +775,7 @@ _mfm:
url: "URL"
urlDescription: "可以展示URL位址。"
link: "鏈接"
linkDescription: "您可以將特定範圍的文章與 URL 相關聯。 "
linkDescription: "您可以將特定範圍的文章與 URL 相關聯。"
bold: "粗體"
boldDescription: "可以將文字顯示为粗體来強調。"
small: "縮小"
@ -804,7 +793,7 @@ _mfm:
quote: "引用"
quoteDescription: "可以用來表示引用的内容。"
emoji: "自訂表情符號"
emojiDescription: "您可以通過將自定義表情符號名稱括在冒號中來顯示自定義表情符號。 "
emojiDescription: "您可以通過將自定義表情符號名稱括在冒號中來顯示自定義表情符號。"
search: "搜尋"
searchDescription: "您可以顯示所輸入的搜索框。"
flip: "翻轉"
@ -962,7 +951,6 @@ _permissions:
"write:notes": "撰寫或刪除貼文"
"read:notifications": "查看通知"
"write:notifications": "編輯通知"
"read:reactions": "查看情感"
"write:reactions": "編輯情感"
"write:votes": "投票"
"read:pages": "顯示頁面"
@ -973,10 +961,6 @@ _permissions:
"write:user-groups": "編輯使用者群組"
"read:channels": "已查看的頻道"
"write:channels": "編輯頻道"
"read:gallery": "瀏覽圖庫"
"write:gallery": "操作圖庫"
"read:gallery-likes": "讀取喜歡的圖片"
"write:gallery-likes": "操作喜歡的圖片"
_auth:
shareAccess: "要授權「“{name}”」存取您的帳戶嗎?"
shareAccessAsk: "您確定要授權這個應用程式使用您的帳戶嗎?"
@ -1015,7 +999,7 @@ _widgets:
button: "按鈕"
onlineUsers: "線上的用戶"
jobQueue: "佇列"
serverMetric: "服務器指標 "
serverMetric: "服務器指標"
aiscript: "AiScript控制台"
aichan: "小藍"
_cw:
@ -1031,7 +1015,7 @@ _poll:
expiration: "期限"
infinite: "無期限"
at: "結束時間"
after: "進度指定 "
after: "進度指定"
deadlineDate: "截止日期"
deadlineTime: "小時"
duration: "時長"
@ -1047,7 +1031,7 @@ _poll:
remainingSeconds: "{s}秒後截止"
_visibility:
public: "公開"
publicDescription: "發布給所有用戶 "
publicDescription: "發布給所有用戶"
home: "首頁"
homeDescription: "僅發送至首頁的時間軸"
followers: "追隨者"

View file

@ -54,5 +54,5 @@
"start-server-and-test": "1.14.0",
"typescript": "^4.9.4"
},
"packageManager": "yarn@3.3.0"
"packageManager": "yarn@3.4.1"
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

View file

@ -0,0 +1,53 @@
export class noteVisibilityFunction1662132062000 {
name = 'noteVisibilityFunction1662132062000';
async up(queryRunner) {
await queryRunner.query(`
CREATE OR REPLACE FUNCTION note_visible(note_id varchar, user_id varchar) RETURNS BOOLEAN
LANGUAGE SQL
STABLE
CALLED ON NULL INPUT
AS $$
SELECT CASE
WHEN note_id IS NULL THEN TRUE
WHEN NOT EXISTS (SELECT 1 FROM note WHERE id = note_id) THEN FALSE
WHEN user_id IS NULL THEN (
-- simplified check without logged in user
SELECT
visibility IN ('public', 'home')
-- check reply / renote recursively
AND note_visible("replyId", NULL)
AND note_visible("renoteId", NULL)
FROM note WHERE note.id = note_id
) ELSE (
SELECT
(
visibility IN ('public', 'home')
OR
user_id = "userId"
OR
user_id = ANY("visibleUserIds")
OR
user_id = ANY("mentions")
OR (
visibility = 'followers'
AND
EXISTS (
SELECT 1 FROM following WHERE "followeeId" = "userId" AND "followerId" = user_id
)
)
)
-- check reply / renote recursively
AND note_visible("replyId", user_id)
AND note_visible("renoteId", user_id)
FROM note WHERE note.id = note_id
)
END;
$$;
`);
}
async down(queryRunner) {
await queryRunner.query('DROP FUNCTION note_visible');
}
}

View file

@ -0,0 +1,35 @@
export class movedTo1668977715500 {
name = 'movedTo1668977715500';
async up(queryRunner) {
await queryRunner.query(`ALTER TABLE "user" ADD "movedToId" character varying(32)`);
await queryRunner.query(`ALTER TABLE "notification" ADD "moveTargetId" character varying(32)`);
await queryRunner.query(`COMMENT ON COLUMN "notification"."moveTargetId" IS 'The ID of the moved to account.'`);
await queryRunner.query(`ALTER TABLE "user" ADD CONSTRAINT "FK_16fef167e4253ccdc8971b01f6e" FOREIGN KEY ("movedToId") REFERENCES "user"("id") ON DELETE SET NULL ON UPDATE NO ACTION`);
await queryRunner.query(`ALTER TABLE "notification" ADD CONSTRAINT "FK_078db271ad52ccc345b7b2b026a" FOREIGN KEY ("moveTargetId") REFERENCES "user"("id") ON DELETE CASCADE ON UPDATE NO ACTION`);
await queryRunner.query(`ALTER TYPE "notification_type_enum" ADD VALUE 'move'`);
await queryRunner.query(`ALTER TYPE "user_profile_mutingnotificationtypes_enum" ADD VALUE 'move'`);
}
async down(queryRunner) {
// remove 'move' from user muting notifications type enum
await queryRunner.query(`CREATE TYPE "public"."user_profile_mutingnotificationtypes_enum_old" AS ENUM('follow', 'mention', 'reply', 'renote', 'quote', 'reaction', 'pollVote', 'receiveFollowRequest', 'followRequestAccepted', 'groupInvited', 'app', 'pollEnded')`);
await queryRunner.query(`ALTER TABLE "user_profile" ALTER COLUMN "mutingNotificationTypes" DROP DEFAULT`);
await queryRunner.query(`ALTER TABLE "user_profile" ALTER COLUMN "mutingNotificationTypes" TYPE "public"."user_profile_mutingnotificationtypes_enum_old"[] USING "mutingNotificationTypes"::"text"::"public"."user_profile_mutingnotificationtypes_enum_old"[]`);
await queryRunner.query(`ALTER TABLE "user_profile" ALTER COLUMN "mutingNotificationTypes" SET DEFAULT '{}'`);
await queryRunner.query(`DROP TYPE "public"."user_profile_mutingnotificationtypes_enum"`);
await queryRunner.query(`ALTER TYPE "public"."user_profile_mutingnotificationtypes_enum_old" RENAME TO "user_profile_mutingnotificationtypes_enum"`);
// remove 'move' from notification type enum
await queryRunner.query(`DELETE FROM "notification" WHERE "type" = 'move'`);
await queryRunner.query(`CREATE TYPE "public"."notification_type_enum_old" AS ENUM('follow', 'mention', 'reply', 'renote', 'quote', 'reaction', 'pollVote', 'pollEnded', 'receiveFollowRequest', 'followRequestAccepted', 'groupInvited', 'app')`);
await queryRunner.query(`ALTER TABLE "notification" ALTER COLUMN "type" TYPE "public"."notification_type_enum_old" USING "type"::"text"::"public"."notification_type_enum_old"`);
await queryRunner.query(`DROP TYPE "public"."notification_type_enum"`);
await queryRunner.query(`ALTER TYPE "public"."notification_type_enum_old" RENAME TO "notification_type_enum"`);
await queryRunner.query(`ALTER TABLE "notification" DROP CONSTRAINT "FK_078db271ad52ccc345b7b2b026a"`);
await queryRunner.query(`ALTER TABLE "user" DROP CONSTRAINT "FK_16fef167e4253ccdc8971b01f6e"`);
await queryRunner.query(`ALTER TABLE "notification" DROP COLUMN "moveTargetId"`);
await queryRunner.query(`ALTER TABLE "user" DROP COLUMN "movedToId"`);
}
}

View file

@ -0,0 +1,13 @@
export class removeUnused1678427401214 {
name = 'removeUnused1678427401214'
async up(queryRunner) {
await queryRunner.query(`ALTER TABLE "meta" DROP COLUMN "pinnedPages"`);
await queryRunner.query(`ALTER TABLE "meta" DROP COLUMN "pinnedClipId"`);
}
async down(queryRunner) {
await queryRunner.query(`ALTER TABLE "meta" ADD "pinnedClipId" character varying(32)`);
await queryRunner.query(`ALTER TABLE "meta" ADD "pinnedPages" character varying(512) array NOT NULL DEFAULT '{/featured,/channels,/explore,/pages,/about-misskey}'`);
}
}

View file

@ -0,0 +1,22 @@
export class unifyDriveObjects1679767920029 {
name = 'unifyDriveObjects1679767920029';
async up(queryRunner) {
await queryRunner.query(`ALTER TABLE "drive_file" RENAME COLUMN "folderId" TO "parentId"`);
await queryRunner.query(`ALTER TABLE "drive_folder" ALTER COLUMN "name" TYPE character varying(256)`);
// The column name changed so the name that typeorm generates for indices and foreign keys changes too.
// To avoid reindexing, just rename them.
await queryRunner.query(`ALTER TABLE "drive_file" RENAME CONSTRAINT "FK_bb90d1956dafc4068c28aa7560a" TO "FK_84b4e3038e7e64a68764dd7ea3e"`);
await queryRunner.query(`ALTER INDEX "IDX_bb90d1956dafc4068c28aa7560" RENAME TO "IDX_84b4e3038e7e64a68764dd7ea3"`);
await queryRunner.query(`ALTER INDEX "IDX_55720b33a61a7c806a8215b825" RENAME TO "IDX_7c607687cd487292d16617b23e"`);
}
async down(queryRunner) {
await queryRunner.query(`ALTER TABLE "drive_file" RENAME CONSTRAINT "FK_84b4e3038e7e64a68764dd7ea3e" TO "FK_bb90d1956dafc4068c28aa7560a"`);
await queryRunner.query(`ALTER INDEX "IDX_84b4e3038e7e64a68764dd7ea3" RENAME TO "IDX_bb90d1956dafc4068c28aa7560"`);
await queryRunner.query(`ALTER INDEX "IDX_7c607687cd487292d16617b23e" RENAME TO "IDX_55720b33a61a7c806a8215b825"`);
await queryRunner.query(`ALTER TABLE "drive_folder" ALTER COLUMN "name" TYPE character varying(128) USING substr("name", 1, 128)`);
await queryRunner.query(`ALTER TABLE "drive_file" RENAME COLUMN "parentId" TO "folderId"`);
}
}

View file

@ -69,7 +69,7 @@
"koa-views": "7.0.2",
"mfm-js": "0.22.1",
"mime-types": "2.1.35",
"mocha": "10.0.0",
"mocha": "10.2.0",
"multer": "1.4.5-lts.1",
"nested-property": "4.0.0",
"node-fetch": "3.2.6",
@ -99,7 +99,7 @@
"strict-event-emitter-types": "2.0.0",
"stringz": "2.1.0",
"style-loader": "3.3.1",
"summaly": "2.6.0",
"summaly": "2.7.0",
"syslog-pro": "1.0.0",
"systeminformation": "5.11.22",
"tinycolor2": "1.4.2",

View file

@ -18,7 +18,13 @@ const ev = new Xev();
* Init process
*/
export async function boot(): Promise<void> {
process.title = `FoundKey (${cluster.isPrimary ? 'master' : 'worker'})`;
if (envOption.disableClustering) {
process.title = "Foundkey";
} else if (cluster.isPrimary) {
process.title = "Foundkey (master)";
} else if (cluster.isWorker) {
process.title = `Foundkey (${process.env.mode})`;
}
if (cluster.isPrimary || envOption.disableClustering) {
await masterMain();

View file

@ -160,12 +160,24 @@ function spawnWorker(mode: 'web' | 'queue'): Promise<void> {
return new Promise(res => {
const worker = cluster.fork({ mode });
worker.on('message', message => {
if (message === 'listenFailed') {
bootLogger.error('The server Listen failed due to the previous error.');
process.exit(1);
switch (message) {
case 'listenFailed':
bootLogger.error('The server Listen failed due to the previous error.');
process.exit(1);
break;
case 'ready':
res();
break;
case 'metaUpdate':
// forward new instance metadata to all workers
for (const otherWorker of Object.values(cluster.workers)) {
// don't forward the message to the worker that sent it
if (worker.id === otherWorker.id) continue;
otherWorker.send(message);
}
break;
}
if (message !== 'ready') return;
res();
});
});
}

View file

@ -4,6 +4,7 @@ import config from '@/config/index.js';
import { UserProfiles } from '@/models/index.js';
import { extractMentions } from '@/misc/extract-mentions.js';
import { intersperse } from '@/prelude/array.js';
import { toPunyNullable } from '@/misc/convert-host.js';
// Transforms MFM to HTML, given the MFM text and a list of user IDs that are
// mentioned in the text. If the list of mentions is not given, all mentions
@ -14,6 +15,19 @@ export async function toHtml(mfmText: string, mentions?: string[]): Promise<stri
return null;
}
let mentionedUsers = [];
const ids = mentions ?? extractMentions(nodes);
if (ids.length > 0) {
mentionedUsers = await UserProfiles.createQueryBuilder('user_profile')
.leftJoin('user_profile.user', 'user')
.select('user.usernameLower', 'username')
.addSelect('user.host', 'host')
// links should preferably use user friendly urls, only fall back to AP ids
.addSelect('COALESCE(user_profile.url, user.uri)', 'url')
.where('"userId" IN (:...ids)', { ids })
.getRawMany();
}
const doc = new JSDOM('').window.document;
const handlers: { [K in mfm.MfmNode['type']]: (node: mfm.NodeType<K>) => Promise<Node> } = {
@ -103,30 +117,28 @@ export async function toHtml(mfmText: string, mentions?: string[]): Promise<stri
},
async mention(node): Promise<HTMLElement | Text> {
const { username, host, acct } = node.props;
const ids = mentions ?? extractMentions(nodes);
if (ids.length > 0) {
const mentionedUsers = await UserProfiles.createQueryBuilder('user_profile')
.leftJoin('user_profile.user', 'user')
.select('user.username', 'username')
.addSelect('user.host', 'host')
// links should preferably use user friendly urls, only fall back to AP ids
.addSelect('COALESCE(user_profile.url, user.uri)', 'url')
.where('"userId" IN (:...ids)', { ids })
.getRawMany();
const userInfo = mentionedUsers.find(user => user.username === username && user.host === host);
if (userInfo != null) {
// Mastodon microformat: span.h-card > a.u-url.mention
const a = doc.createElement('a');
a.href = userInfo.url ?? `${config.url}/${acct}`;
a.className = 'u-url mention';
a.textContent = acct;
let { username, host, acct } = node.props;
// normalize username and host for searching the user
username = username.toLowerCase();
host = toPunyNullable(host);
// Discard host if it is the local host. Otherwise mentions of local users where the
// hostname is not omitted are not handled correctly.
if (host == config.hostname) {
host = null;
}
const userInfo = mentionedUsers.find(user => user.username === username && user.host === host);
if (userInfo != null) {
// Mastodon microformat: span.h-card > a.u-url.mention
const a = doc.createElement('a');
// The fallback will only be used for local users, so the host part can be discarded.
a.href = userInfo.url ?? `${config.url}/@${username}`;
a.className = 'u-url mention';
a.textContent = acct;
const card = doc.createElement('span');
card.className = 'h-card';
card.appendChild(a);
return card;
}
const card = doc.createElement('span');
card.className = 'h-card';
card.appendChild(a);
return card;
}
// this user does not actually exist
return doc.createTextNode(acct);

View file

@ -1,3 +1,4 @@
import process from 'node:process';
import push from 'web-push';
import { db } from '@/db/postgre.js';
import { Meta } from '@/models/entities/meta.js';
@ -17,9 +18,20 @@ export async function setMeta(meta: Meta): Promise<void> {
cache = meta;
/*
The meta is not included here because another process may have updated
the content before the other process receives it.
*/
process.send!('metaUpdated');
unlock();
}
// the primary will forward this message
process.on('message', async message => {
if (message === 'metaUpdated') await getMeta();
});
/**
* Performs the primitive database operation to fetch server configuration.
* If there is no entry yet, inserts a new one.

View file

@ -22,6 +22,7 @@ import { packedNoteReactionSchema } from '@/models/schema/note-reaction.js';
import { packedHashtagSchema } from '@/models/schema/hashtag.js';
import { packedPageSchema } from '@/models/schema/page.js';
import { packedUserGroupSchema } from '@/models/schema/user-group.js';
import { packedUserGroupInvitationSchema } from '@/models/schema/user-group-invitation.js';
import { packedNoteFavoriteSchema } from '@/models/schema/note-favorite.js';
import { packedChannelSchema } from '@/models/schema/channel.js';
import { packedAntennaSchema } from '@/models/schema/antenna.js';
@ -41,6 +42,7 @@ export const refs = {
UserList: packedUserListSchema,
UserGroup: packedUserGroupSchema,
UserGroupInvitation: packedUserGroupInvitationSchema,
App: packedAppSchema,
MessagingMessage: packedMessagingMessageSchema,
Note: packedNoteSchema,

View file

@ -4,7 +4,7 @@ import { User } from './user.js';
import { DriveFolder } from './drive-folder.js';
@Entity()
@Index(['userId', 'folderId', 'id'])
@Index(['userId', 'parentId', 'id'])
export class DriveFile {
@PrimaryColumn(id())
public id: string;
@ -78,7 +78,7 @@ export class DriveFile {
default: {},
comment: 'The any properties of the DriveFile. For example, it includes image width/height.',
})
public properties: { width?: number; height?: number; orientation?: number; avgColor?: string };
public properties: { width?: number; height?: number; orientation?: number; };
@Column('boolean')
public storedInternal: boolean;
@ -142,13 +142,13 @@ export class DriveFile {
nullable: true,
comment: 'The parent folder ID. If null, it means the DriveFile is located in root.',
})
public folderId: DriveFolder['id'] | null;
public parentId: DriveFolder['id'] | null;
@ManyToOne(() => DriveFolder, {
onDelete: 'SET NULL',
})
@JoinColumn()
public folder: DriveFolder | null;
public parent: DriveFolder | null;
@Index()
@Column('boolean', {

View file

@ -14,7 +14,7 @@ export class DriveFolder {
public createdAt: Date;
@Column('varchar', {
length: 128,
length: 256,
comment: 'The name of the DriveFolder.',
})
public name: string;

View file

@ -82,17 +82,6 @@ export class Meta {
})
public blockedHosts: string[];
@Column('varchar', {
length: 512, array: true, default: '{/featured,/channels,/explore,/pages,/about-foundkey}',
})
public pinnedPages: string[];
@Column({
...id(),
nullable: true,
})
public pinnedClipId: Clip['id'] | null;
@Column('varchar', {
length: 512,
nullable: true,

View file

@ -52,19 +52,20 @@ export class Notification {
public notifier: User | null;
/**
*
* follow -
* mention - 稿
* reply - (Watchしている)稿
* renote - (Watchしている)稿Renoteされた
* quote - (Watchしている)稿Renoteされた
* reaction - (Watchしている)稿
* pollVote - (Watchしている)稿
* pollEnded -
* receiveFollowRequest -
* followRequestAccepted -
* groupInvited -
* app -
* Type of notification.
* follow - notifier followed notifiee
* mention - notifiee was mentioned
* reply - notifiee (author or watching) was replied to
* renote - notifiee (author or watching) was renoted
* quote - notifiee (author or watching) was quoted
* reaction - notifiee (author or watching) had a reaction added to the note
* pollVote - new vote in a poll notifiee authored or watched
* pollEnded - notifiee's poll ended
* receiveFollowRequest - notifiee received a new follow request
* followRequestAccepted - notifier accepted notifees follow request
* groupInvited - notifiee was invited into a group
* move - notifier moved
* app - custom application notification
*/
@Index()
@Column('enum', {
@ -129,6 +130,19 @@ export class Notification {
})
public choice: number | null;
@Column({
...id(),
nullable: true,
comment: 'The ID of the moved to account.',
})
public moveTargetId: User['id'] | null;
@ManyToOne(() => User, {
onDelete: 'CASCADE',
})
@JoinColumn()
public moveTarget: User | null;
/**
* body
*/

View file

@ -1,4 +1,4 @@
import { Entity, Column, Index, OneToOne, JoinColumn, PrimaryColumn } from 'typeorm';
import { Entity, Column, Index, OneToOne, ManyToOne, JoinColumn, PrimaryColumn } from 'typeorm';
import { id } from '../id.js';
import { DriveFile } from './drive-file.js';
@ -230,6 +230,18 @@ export class User {
})
public federateBlocks: boolean;
@Column({
...id(),
nullable: true,
})
public movedToId: User['id'] | null;
@ManyToOne(() => User, {
onDelete: 'SET NULL'
})
@JoinColumn()
public movedTo: User | null;
constructor(data: Partial<User>) {
if (data == null) return;

View file

@ -105,8 +105,8 @@ export const DriveFileRepository = db.getRepository(DriveFile).extend({
url: opts.self ? file.url : this.getPublicUrl(file, false),
thumbnailUrl: this.getPublicUrl(file, true),
comment: file.comment,
folderId: file.folderId,
folder: opts.detail && file.folderId ? DriveFolders.pack(file.folderId, {
folderId: file.parentId,
folder: opts.detail && file.parentId ? DriveFolders.pack(file.parentId, {
detail: true,
}) : undefined,
userId: file.userId,

View file

@ -28,7 +28,7 @@ export const DriveFolderRepository = db.getRepository(DriveFolder).extend({
parentId: folder.id,
}),
filesCount: DriveFiles.countBy({
folderId: folder.id,
parentId: folder.id,
}),
...(folder.parentId ? {

View file

@ -11,6 +11,7 @@ import { NoteReaction } from '@/models/entities/note-reaction.js';
import { User } from '@/models/entities/user.js';
import { awaitAll } from '@/prelude/await-all.js';
import { Users, PollVotes, DriveFiles, NoteReactions, Followings, Polls, Channels } from '../index.js';
import { apiLogger } from '@/server/api/logger.js';
async function populatePoll(note: Note, meId: User['id'] | null) {
const poll = await Polls.findOneByOrFail({ noteId: note.id });
@ -77,7 +78,7 @@ async function populateMyReaction(note: Note, meId: User['id'], _hint_?: {
export const NoteRepository = db.getRepository(Note).extend({
async isVisibleForMe(note: Note, meId: User['id'] | null): Promise<boolean> {
// This code must always be synchronized with the checks in generateVisibilityQuery.
// This code must always be synchronized with the `note_visible` SQL function.
// visibility が specified かつ自分が指定されていなかったら非表示
if (note.visibility === 'specified') {
if (meId == null) {
@ -270,6 +271,13 @@ export const NoteRepository = db.getRepository(Note).extend({
})));
// filter out rejected promises, only keep fulfilled values
return promises.flatMap(result => result.status === 'fulfilled' ? [result.value] : []);
return promises.flatMap((result, i) => {
if (result.status === 'fulfilled') {
return [result.value];
} else {
apiLogger.error(`dropping note due to violating visibility restrictions, note ${notes[i].id} user ${meId}`);
return [];
}
});
},
});

View file

@ -44,6 +44,9 @@ export const NotificationRepository = db.getRepository(Notification).extend({
...(notification.type === 'groupInvited' ? {
invitation: UserGroupInvitations.pack(notification.userGroupInvitationId!),
} : {}),
...(notification.type === 'move' ? {
moveTarget: Users.pack(notification.moveTarget ?? notification.moveTargetId),
} : {}),
...(notification.type === 'app' ? {
body: notification.customBody,
header: notification.customHeader || token?.name,

View file

@ -26,6 +26,8 @@ type IsMeAndIsUserDetailed<ExpectsMe extends boolean | null, Detailed extends bo
const ajv = new Ajv();
// It is important that localUsernameSchema does not allow any usernames
// containing dots because those are used for system actors.
const localUsernameSchema = { type: 'string', pattern: /^\w{1,20}$/.toString().slice(1, -1) } as const;
const passwordSchema = { type: 'string', minLength: 1 } as const;
const nameSchema = { type: 'string', minLength: 1, maxLength: 50 } as const;
@ -270,16 +272,14 @@ export const UserRepository = db.getRepository(User).extend({
const followingCount = profile == null ? null :
(profile.ffVisibility === 'public') || isMe ? user.followingCount :
(profile.ffVisibility === 'followers') && (relation && relation.isFollowing) ? user.followingCount :
(profile.ffVisibility === 'followers') && relation?.isFollowing ? user.followingCount :
null;
const followersCount = profile == null ? null :
(profile.ffVisibility === 'public') || isMe ? user.followersCount :
(profile.ffVisibility === 'followers') && (relation && relation.isFollowing) ? user.followersCount :
(profile.ffVisibility === 'followers') && relation?.isFollowing ? user.followersCount :
null;
const falsy = opts.detail ? false : undefined;
const packed = {
id: user.id,
name: user.name,
@ -287,10 +287,10 @@ export const UserRepository = db.getRepository(User).extend({
host: user.host,
avatarUrl: this.getAvatarUrlSync(user),
avatarBlurhash: user.avatar?.blurhash || null,
isAdmin: user.isAdmin || falsy,
isModerator: user.isModerator || falsy,
isBot: user.isBot || falsy,
isCat: user.isCat || falsy,
isAdmin: user.isAdmin,
isModerator: user.isModerator,
isBot: user.isBot,
isCat: user.isCat,
instance: !user.host ? undefined : userInstanceCache.fetch(user.host)
.then(instance => !instance ? undefined : {
name: instance.name,
@ -302,6 +302,10 @@ export const UserRepository = db.getRepository(User).extend({
}),
emojis: populateEmojis(user.emojis, user.host),
onlineStatus: this.getOnlineStatus(user),
movedTo: !user.movedToId ? undefined : this.pack(user.movedTo ?? user.movedToId, me, {
...opts,
detail: false,
}),
...(opts.detail ? {
url: profile!.url,
@ -312,8 +316,8 @@ export const UserRepository = db.getRepository(User).extend({
bannerUrl: user.banner ? DriveFiles.getPublicUrl(user.banner, false) : null,
bannerBlurhash: user.banner?.blurhash || null,
isLocked: user.isLocked,
isSilenced: user.isSilenced || falsy,
isSuspended: user.isSuspended || falsy,
isSilenced: user.isSilenced,
isSuspended: user.isSuspended,
description: profile!.description,
location: profile!.location,
birthday: profile!.birthday,
@ -369,7 +373,7 @@ export const UserRepository = db.getRepository(User).extend({
mutedInstances: profile!.mutedInstances,
mutingNotificationTypes: profile!.mutingNotificationTypes,
emailNotificationTypes: profile!.emailNotificationTypes,
showTimelineReplies: user.showTimelineReplies || falsy,
showTimelineReplies: user.showTimelineReplies,
federateBlocks: user!.federateBlocks,
} : {}),

View file

@ -60,11 +60,6 @@ export const packedDriveFileSchema = {
optional: true, nullable: false,
example: 8,
},
avgColor: {
type: 'string',
optional: true, nullable: false,
example: 'rgb(40,65,87)',
},
},
},
url: {

View file

@ -163,16 +163,20 @@ export const packedNoteSchema = {
optional: false, nullable: false,
},
uri: {
description: 'ActivityPub `id` of this Note',
type: 'string',
optional: true, nullable: false,
},
url: {
description: 'URL to a presentation form intended for humans, if available',
type: 'string',
optional: true, nullable: false,
},
myReaction: {
type: 'object',
description: 'Textual representation of the authenticated users reaction, if they reacted.',
example: ':blobfox@.:',
type: 'string',
optional: true, nullable: true,
},
},

View file

@ -48,6 +48,7 @@ export const packedNotificationSchema = {
},
invitation: {
type: 'object',
ref: 'UserGroupInvitation',
optional: true, nullable: true,
},
body: {

View file

@ -0,0 +1,16 @@
export const packedUserGroupInvitationSchema = {
type: 'object',
properties: {
id: {
type: 'string',
optional: false, nullable: false,
format: 'id',
example: 'xxxxxxxxxx',
},
group: {
type: 'object',
optional: false, nullable: false,
ref: 'UserGroup',
},
},
} as const;

View file

@ -87,11 +87,13 @@ export const packedUserDetailedNotMeOnlySchema = {
type: 'object',
properties: {
url: {
description: 'URL to a presentation form intended for humans, if available',
type: 'string',
format: 'url',
nullable: true, optional: false,
},
uri: {
description: 'ActivityPub `id` of this User',
type: 'string',
format: 'uri',
nullable: true, optional: false,
@ -403,6 +405,24 @@ export const packedMeDetailedOnlySchema = {
items: {
type: 'object',
nullable: false, optional: false,
properties: {
id: {
type: 'string',
optional: false,
nullable: false,
},
name: {
type: 'string',
optional: false,
nullable: false,
},
lastUsed: {
type: 'string',
optional: false,
nullable: false,
example: '1970-01-01T00:00:00Z',
},
},
},
},
//#endregion

View file

@ -4,7 +4,6 @@ import { request } from '@/remote/activitypub/request.js';
import { registerOrFetchInstanceDoc } from '@/services/register-or-fetch-instance-doc.js';
import Logger from '@/services/logger.js';
import { Instances } from '@/models/index.js';
import { apRequestChart, federationChart, instanceChart } from '@/services/chart/index.js';
import { fetchInstanceMetadata } from '@/services/fetch-instance-metadata.js';
import { toPuny } from '@/misc/convert-host.js';
import { StatusError } from '@/misc/fetch.js';
@ -13,8 +12,6 @@ import { DeliverJobData } from '@/queue/types.js';
const logger = new Logger('deliver');
let latest: string | null = null;
export default async (job: Bull.Job<DeliverJobData>) => {
const { host } = new URL(job.data.to);
const puny = toPuny(host);
@ -22,12 +19,14 @@ export default async (job: Bull.Job<DeliverJobData>) => {
if (await shouldSkipInstance(puny)) return 'skip';
try {
if (latest !== (latest = JSON.stringify(job.data.content, null, 2))) {
logger.debug(`delivering ${latest}`);
if (Array.isArray(job.data.content)) {
await Promise.all(
job.data.content.map(x => request(job.data.user, job.data.to, x))
);
} else {
await request(job.data.user, job.data.to, job.data.content);
}
await request(job.data.user, job.data.to, job.data.content);
// Update stats
registerOrFetchInstanceDoc(host).then(i => {
Instances.update(i.id, {
@ -38,13 +37,7 @@ export default async (job: Bull.Job<DeliverJobData>) => {
});
fetchInstanceMetadata(i);
instanceChart.requestSent(i.host, true);
apRequestChart.deliverSucc();
federationChart.deliverd(i.host, true);
});
return 'Success';
} catch (res) {
// Update stats
registerOrFetchInstanceDoc(host).then(i => {
@ -53,10 +46,6 @@ export default async (job: Bull.Job<DeliverJobData>) => {
latestStatus: res instanceof StatusError ? res.statusCode : null,
isNotResponding: true,
});
instanceChart.requestSent(i.host, false);
apRequestChart.deliverFail();
federationChart.deliverd(i.host, false);
});
if (res instanceof StatusError) {
@ -67,7 +56,7 @@ export default async (job: Bull.Job<DeliverJobData>) => {
return `${res.statusCode} ${res.statusMessage}`;
}
// 5xx etc.
// 5xx etc., throwing an Error will make Bull retry
throw new Error(`${res.statusCode} ${res.statusMessage}`);
} else {
// DNS error, socket error, timeout ...

View file

@ -29,18 +29,18 @@ export default async (job: Bull.Job<InboxJobData>): Promise<string> => {
logger.debug(JSON.stringify(info, null, 2));
//#endregion
const host = toPuny(new URL(signature.keyId).hostname);
const keyIdLower = signature.keyId.toLowerCase();
if (keyIdLower.startsWith('acct:')) {
return `Old keyId is no longer supported. ${keyIdLower}`;
}
const host = toPuny(new URL(keyIdLower).hostname);
// Stop if the host is blocked.
if (await shouldBlockInstance(host)) {
return `Blocked request: ${host}`;
}
const keyIdLower = signature.keyId.toLowerCase();
if (keyIdLower.startsWith('acct:')) {
return `Old keyId is no longer supported. ${keyIdLower}`;
}
const resolver = new Resolver();
let authUser;
@ -107,9 +107,14 @@ export default async (job: Bull.Job<InboxJobData>): Promise<string> => {
}
}
// Verify that the actor's host is not blocked
const signerHost = extractDbHost(authUser.user.uri!);
if (await shouldBlockInstance(signerHost)) {
return `Blocked request: ${signerHost}`;
}
if (typeof activity.id === 'string') {
// Verify that activity and actor are from the same host.
const signerHost = extractDbHost(authUser.user.uri!);
const activityIdHost = extractDbHost(activity.id);
if (signerHost !== activityIdHost) {
return `skip: signerHost(${signerHost}) !== activity.id host(${activityIdHost}`;
@ -136,7 +141,7 @@ export default async (job: Bull.Job<InboxJobData>): Promise<string> => {
federationChart.inbox(i.host);
});
// アクティビティを処理
// process the activity
await perform(authUser.user, activity, resolver);
return 'ok';
};

View file

@ -1,5 +1,5 @@
import { CacheableRemoteUser } from '@/models/entities/user.js';
import deleteNode from '@/services/note/delete.js';
import { deleteNotes } from '@/services/note/delete.js';
import { getApLock } from '@/misc/app-lock.js';
import { deleteMessage } from '@/services/messages/delete.js';
import { DbResolver } from '@/remote/activitypub/db-resolver.js';
@ -29,7 +29,7 @@ export default async function(actor: CacheableRemoteUser, uri: string): Promise<
return 'skip: cant delete other actors note';
}
await deleteNode(actor, note);
await deleteNotes([note], actor);
return 'ok: note deleted';
}
} finally {

View file

@ -4,7 +4,7 @@ import { Resolver } from '@/remote/activitypub/resolver.js';
import { extractDbHost } from '@/misc/convert-host.js';
import { shouldBlockInstance } from '@/misc/should-block-instance.js';
import { apLogger } from '../logger.js';
import { IObject, isCreate, isDelete, isUpdate, isRead, isFollow, isAccept, isReject, isAdd, isRemove, isAnnounce, isLike, isUndo, isBlock, isCollectionOrOrderedCollection, isCollection, isFlag, getApId } from '../type.js';
import { IObject, isCreate, isDelete, isUpdate, isRead, isFollow, isAccept, isReject, isAdd, isRemove, isAnnounce, isLike, isUndo, isBlock, isCollectionOrOrderedCollection, isCollection, isFlag, isMove, getApId } from '../type.js';
import create from './create/index.js';
import performDeleteActivity from './delete/index.js';
import performUpdateActivity from './update/index.js';
@ -19,6 +19,7 @@ import add from './add/index.js';
import remove from './remove/index.js';
import block from './block/index.js';
import flag from './flag/index.js';
import { move } from './move/index.js';
export async function performActivity(actor: CacheableRemoteUser, activity: IObject, resolver: Resolver): Promise<void> {
if (isCollectionOrOrderedCollection(activity)) {
@ -73,6 +74,8 @@ async function performOneActivity(actor: CacheableRemoteUser, activity: IObject,
await block(actor, activity);
} else if (isFlag(activity)) {
await flag(actor, activity);
} else if (isMove(activity)) {
await move(actor, activity, resolver);
} else {
apLogger.warn(`unrecognized activity type: ${(activity as any).type}`);
}

View file

@ -11,7 +11,7 @@ export default async (actor: CacheableRemoteUser, activity: ILike) => {
await extractEmojis(activity.tag || [], actor.host).catch(() => null);
return await createReaction(actor, note, activity._misskey_reaction || activity.content || activity.name).catch(e => {
return await createReaction(actor, note, activity.content || activity.name).catch(e => {
if (e.id === '51c42bb4-931a-456b-bff7-e5a8a70dd298') {
return 'skip: already reacted';
} else {

View file

@ -0,0 +1,62 @@
import { IsNull } from 'typeorm';
import { CacheableRemoteUser } from '@/models/entities/user.js';
import { resolvePerson } from '@/remote/activitypub/models/person.js';
import { Followings, Users } from '@/models/index.js';
import { createNotification } from '@/services/create-notification.js';
import Resolver from '../../resolver.js';
import { IMove, isActor, getApId } from '../../type.js';
export async function move(actor: CacheableRemoteUser, activity: IMove, resolver: Resolver): Promise<void> {
// actor is not move origin
if (activity.object == null || getApId(activity.object) !== actor.uri) return;
// actor already moved
if (actor.movedTo != null) return;
// no move target
if (activity.target == null) return;
/* the database resolver can not be used here, because:
* 1. It must be ensured that the latest data is used.
* 2. The AP representation is needed, because `alsoKnownAs`
* is not stored in the database.
* This also checks whether the move target is blocked
*/
const movedToAp = await resolver.resolve(getApId(activity.target));
// move target is not an actor
if (!isActor(movedToAp)) return;
// move destination has not accepted
if (!Array.isArray(movedToAp.alsoKnownAs) || !movedToAp.alsoKnownAs.includes(actor.id)) return;
// ensure the user exists
const movedTo = await resolvePerson(getApId(activity.target), resolver, movedToAp);
// move target is already suspended
if (movedTo.isSuspended) return;
// process move for local followers
const followings = Followings.find({
select: {
followerId: true,
},
where: {
followeeId: actor.id,
followerHost: IsNull(),
},
});
await Promise.all([
Users.update(actor.id, {
movedToId: movedTo.id,
}),
...followings.map(async (following) => {
// TODO: autoAcceptMove?
await createNotification(following.followerId, 'move', {
notifierId: actor.id,
moveTargetId: movedTo.id,
});
}),
]);
}

View file

@ -1,6 +1,6 @@
import { Notes } from '@/models/index.js';
import { CacheableRemoteUser } from '@/models/entities/user.js';
import deleteNote from '@/services/note/delete.js';
import { deleteNotes } from '@/services/note/delete.js';
import { IAnnounce, getApId } from '@/remote/activitypub/type.js';
export const undoAnnounce = async (actor: CacheableRemoteUser, activity: IAnnounce): Promise<string> => {
@ -13,6 +13,6 @@ export const undoAnnounce = async (actor: CacheableRemoteUser, activity: IAnnoun
if (!note) return 'skip: no such Announce';
await deleteNote(actor, note);
await deleteNotes([note], actor);
return 'ok: deleted';
};

View file

@ -185,19 +185,21 @@ export async function createNote(value: string | IObject, resolver: Resolver, si
};
const uris = unique([quoteUrl, note._misskey_quote, note.quoteUri].filter((x): x is string => typeof x === 'string'));
let temperror = false;
// check the urls sequentially and abort early to not do unnecessary HTTP requests
// picks the first one that works
for (const uri in uris) {
for (const uri of uris) {
const res = await tryResolveNote(uri);
if (res.status === 'ok') {
quote = res.res;
break;
} else if (res.status === 'temperror') {
temperror = true;
}
}
if (!quote) {
if (results.some(x => x.status === 'temperror')) {
throw new Error('quote resolve failed');
}
if (!quote && temperror) {
// could not resolve quote, try again later
throw new Error('quote resolve failed');
}
}
@ -207,8 +209,6 @@ export async function createNote(value: string | IObject, resolver: Resolver, si
let text: string | null = null;
if (note.source?.mediaType === 'text/x.misskeymarkdown' && typeof note.source.content === 'string') {
text = note.source.content;
} else if (typeof note._misskey_content !== 'undefined') {
text = note._misskey_content;
} else if (typeof note.content === 'string') {
text = fromHtml(note.content, quote?.uri);
}

View file

@ -39,7 +39,7 @@ const summaryLength = 2048;
* @param x Fetched object
* @param uri Fetch target URI
*/
function validateActor(x: IObject): IActor {
async function validateActor(x: IObject, resolver: Resolver): Promise<IActor> {
if (x == null) {
throw new Error('invalid Actor: object is null');
}
@ -61,6 +61,22 @@ function validateActor(x: IObject): IActor {
throw new StatusError('cannot resolve local user', 400, 'cannot resolve local user');
}
if (x.movedTo !== undefined) {
if (!(typeof x.movedTo === 'string' && x.movedTo.length > 0)) {
throw new Error('invalid Actor: wrong movedTo');
}
if (x.movedTo === uri) {
throw new Error('invalid Actor: moved to self');
}
// This may throw an exception if we cannot resolve the move target.
// If we are processing an incoming activity, this is desired behaviour
// because that will cause the activity to be retried.
await resolvePerson(x.movedTo, resolver)
.then(moveTarget => {
x.movedTo = moveTarget.id
});
}
if (!(typeof x.inbox === 'string' && x.inbox.length > 0)) {
throw new Error('invalid Actor: wrong inbox');
}
@ -137,7 +153,7 @@ export async function fetchPerson(uri: string): Promise<CacheableUser | null> {
export async function createPerson(value: string | IObject, resolver: Resolver): Promise<User> {
const object = await resolver.resolve(value) as any;
const person = validateActor(object);
const person = await validateActor(object, resolver);
apLogger.info(`Creating the Person: ${person.id}`);
@ -177,6 +193,7 @@ export async function createPerson(value: string | IObject, resolver: Resolver):
isBot,
isCat: (person as any).isCat === true,
showTimelineReplies: false,
movedToId: person.movedTo,
})) as IRemoteUser;
await transactionalEntityManager.save(new UserProfile({
@ -287,7 +304,7 @@ export async function updatePerson(value: IObject | string, resolver: Resolver):
const object = await resolver.resolve(value);
const person = validateActor(object);
const person = await validateActor(object, resolver);
apLogger.info(`Updating the Person: ${person.id}`);
@ -328,6 +345,7 @@ export async function updatePerson(value: IObject | string, resolver: Resolver):
isCat: (person as any).isCat === true,
isLocked: !!person.manuallyApprovesFollowers,
isExplorable: !!person.discoverable,
movedToId: person.movedTo,
} as Partial<User>;
if (avatar) {
@ -376,7 +394,7 @@ export async function updatePerson(value: IObject | string, resolver: Resolver):
* If the target Person is registered in FoundKey, return it; otherwise, fetch it from a remote server and return it.
* Fetch the person from the remote server, register it in FoundKey, and return it.
*/
export async function resolvePerson(uri: string, resolver: Resolver): Promise<CacheableUser> {
export async function resolvePerson(uri: string, resolver: Resolver, hint?: IObject): Promise<CacheableUser> {
if (typeof uri !== 'string') throw new Error('uri is not string');
//#region このサーバーに既に登録されていたらそれを返す
@ -388,7 +406,7 @@ export async function resolvePerson(uri: string, resolver: Resolver): Promise<Ca
//#endregion
// リモートサーバーからフェッチしてきて登録
return await createPerson(uri, resolver);
return await createPerson(hint ?? uri, resolver);
}
export function analyzeAttachments(attachments: IObject | IObject[] | undefined) {

View file

@ -23,7 +23,7 @@ export async function extractPollFromQuestion(source: string | IObject, resolver
.map(x => x.name!);
const votes = question[multiple ? 'anyOf' : 'oneOf']!
.map(x => x.replies && x.replies.totalItems || x._misskey_votes || 0);
.map(x => x.replies && x.replies.totalItems || 0);
return {
choices,

View file

@ -13,8 +13,10 @@ export default (object: any, note: Note) => {
} else if (note.visibility === 'home') {
to = [`${attributedTo}/followers`];
cc = ['https://www.w3.org/ns/activitystreams#Public'];
} else if (note.visibility === 'followers') {
to = [`${attributedTo}/followers`];
} else {
return null;
throw new Error('Invalid visibility for pure renote.');
}
return {

View file

@ -35,10 +35,7 @@ export const renderActivity = (x: any): IActivity | null => {
value: 'schema:value',
// Misskey
misskey: 'https://misskey-hub.net/ns#',
'_misskey_content': 'misskey:_misskey_content',
'_misskey_quote': 'misskey:_misskey_quote',
'_misskey_reaction': 'misskey:_misskey_reaction',
'_misskey_votes': 'misskey:_misskey_votes',
'_misskey_talk': 'misskey:_misskey_talk',
'isCat': 'misskey:isCat',
// vcard

View file

@ -14,7 +14,6 @@ export const renderLike = async (noteReaction: NoteReaction, note: Note) => {
actor: `${config.url}/users/${noteReaction.userId}`,
object: note.uri ? note.uri : `${config.url}/notes/${noteReaction.noteId}`,
content: reaction,
_misskey_reaction: reaction,
} as any;
if (reaction.startsWith(':')) {

View file

@ -145,7 +145,6 @@ export default async function renderNote(note: Note, dive = true, isTalk = false
attributedTo,
summary,
content,
_misskey_content: text,
source: {
content: text,
mediaType: 'text/x.misskeymarkdown',

View file

@ -11,7 +11,6 @@ export default async function renderQuestion(user: { id: User['id'] }, note: Not
content: note.text || '',
[poll.multiple ? 'anyOf' : 'oneOf']: poll.choices.map((text, i) => ({
name: text,
_misskey_votes: poll.votes[i],
replies: {
type: 'Collection',
totalItems: poll.votes[i],

View file

@ -4,7 +4,16 @@ import { getUserKeypair } from '@/misc/keypair-store.js';
import { User } from '@/models/entities/user.js';
import { getResponse } from '@/misc/fetch.js';
import { createSignedPost, createSignedGet } from './ap-request.js';
import { apRequestChart, federationChart, instanceChart } from '@/services/chart/index.js';
/**
* Post an activity to an inbox. Automatically updates the statistics
* on succeeded or failed delivery attempts.
*
* @param user http-signature user
* @param url The URL of the inbox.
* @param object The Activity or other object to be posted to the inbox.
*/
export async function request(user: { id: User['id'] }, url: string, object: any): Promise<void> {
const body = JSON.stringify(object);
@ -22,14 +31,28 @@ export async function request(user: { id: User['id'] }, url: string, object: any
},
});
await getResponse({
url,
method: req.request.method,
headers: req.request.headers,
body,
// don't allow redirects on the inbox
redirect: 'error',
});
const { host } = new URL(url);
try {
await getResponse({
url,
method: req.request.method,
headers: req.request.headers,
body,
// don't allow redirects on the inbox
redirect: 'error',
});
instanceChart.requestSent(host, true);
apRequestChart.deliverSucc();
federationChart.deliverd(host, true);
} catch (err) {
instanceChart.requestSent(host, false);
apRequestChart.deliverFail();
federationChart.deliverd(host, false);
throw err;
}
}
/**

View file

@ -55,7 +55,7 @@ export function getApId(value: string | Object): string {
export function getOneApId(value: ApObject): string {
if (Array.isArray(value)) {
// find the first valid ID
for (const id of value) {
for (const x of value) {
try {
return getApId(x);
} catch {
@ -171,7 +171,6 @@ export const isQuestion = (object: IObject): object is IQuestion =>
interface IQuestionChoice {
name?: string;
replies?: ICollection;
_misskey_votes?: number;
}
export interface ITombstone extends IObject {
type: 'Tombstone';
@ -282,7 +281,7 @@ export interface IRemove extends IActivity {
export interface ILike extends IActivity {
type: 'Like' | 'EmojiReaction' | 'EmojiReact';
_misskey_reaction?: string;
content?: string;
}
export interface IAnnounce extends IActivity {
@ -297,6 +296,10 @@ export interface IFlag extends IActivity {
type: 'Flag';
}
export interface IMove extends IActivity {
type: 'Move';
}
export const isCreate = (object: IObject): object is ICreate => getApType(object) === 'Create';
export const isDelete = (object: IObject): object is IDelete => getApType(object) === 'Delete';
export const isUpdate = (object: IObject): object is IUpdate => getApType(object) === 'Update';
@ -311,6 +314,7 @@ export const isLike = (object: IObject): object is ILike => getApType(object) ==
export const isAnnounce = (object: IObject): object is IAnnounce => getApType(object) === 'Announce';
export const isBlock = (object: IObject): object is IBlock => getApType(object) === 'Block';
export const isFlag = (object: IObject): object is IFlag => getApType(object) === 'Flag';
export const isMove = (object: IObject): object is IMove => getApType(object) === 'Move';
export interface ILink {
href: string;

View file

@ -28,7 +28,7 @@ function inbox(ctx: Router.RouterContext): void {
let signature;
try {
signature = httpSignature.parseRequest(ctx.req, { 'headers': [] });
signature = httpSignature.parseRequest(ctx.req);
} catch (e) {
ctx.status = 401;
return;

View file

@ -1,42 +1,17 @@
import { Brackets, SelectQueryBuilder } from 'typeorm';
import { SelectQueryBuilder } from 'typeorm';
import { User } from '@/models/entities/user.js';
import { Followings } from '@/models/index.js';
import { Note } from '@/models/entities/note.js';
import { Notes } from '@/models/index.js';
export function generateVisibilityQuery(q: SelectQueryBuilder<any>, me?: { id: User['id'] } | null) {
// This code must always be synchronized with the checks in Notes.isVisibleForMe.
if (me == null) {
q.andWhere(new Brackets(qb => { qb
.where("note.visibility = 'public'")
.orWhere("note.visibility = 'home'");
}));
export function visibilityQuery(q: SelectQueryBuilder<Note>, meId?: User['id'] | null = null): SelectQueryBuilder<Note> {
const superQuery = Notes.createQueryBuilder()
.from(() => q, 'note');
if (meId == null) {
superQuery.where('note_visible(note.id, null);');
} else {
const followingQuery = Followings.createQueryBuilder('following')
.select('following.followeeId')
.where('following.followerId = :meId');
q.andWhere(new Brackets(qb => { qb
// 公開投稿である
.where(new Brackets(qb => { qb
.where("note.visibility = 'public'")
.orWhere("note.visibility = 'home'");
}))
// または 自分自身
.orWhere('note.userId = :meId')
// または 自分宛て
.orWhere(':meId = ANY(note.visibleUserIds)')
.orWhere(':meId = ANY(note.mentions)')
.orWhere(new Brackets(qb => { qb
// または フォロワー宛ての投稿であり、
.where("note.visibility = 'followers'")
.andWhere(new Brackets(qb => { qb
// 自分がフォロワーである
.where(`note.userId IN (${ followingQuery.getQuery() })`)
// または 自分の投稿へのリプライ
.orWhere('note.replyUserId = :meId');
}));
}));
}));
q.setParameters({ meId: me.id });
superQuery.where('note_visible(note.id, :meId)', { meId });
}
return q;
}

View file

@ -1,8 +1,11 @@
import { IsNull, Not } from 'typeorm';
import { IdentifiableError } from '@/misc/identifiable-error.js';
import { User } from '@/models/entities/user.js';
import { Note } from '@/models/entities/note.js';
import { Notes, Users } from '@/models/index.js';
import { generateVisibilityQuery } from './generate-visibility-query.js';
import { apiLogger } from '@/server/api/logger.js';
import { visibilityQuery } from './generate-visibility-query.js';
import { ApiError } from '@/server/api/error.js';
/**
* Get note for API processing, taking into account visibility.
@ -13,11 +16,10 @@ export async function getNote(noteId: Note['id'], me: { id: User['id'] } | null)
id: noteId,
});
generateVisibilityQuery(query, me);
const note = await query.getOne();
const note = await visibilityQuery(query, me).getOne();
if (note == null) {
apiLogger.error(`user ${me.id} tried to view note ${noteId} violating visibility restrictions`);
throw new IdentifiableError('9725d0ce-ba28-4dde-95a7-2cbb2c15de24', 'No such note.');
}
@ -27,11 +29,15 @@ export async function getNote(noteId: Note['id'], me: { id: User['id'] } | null)
/**
* Get user for API processing
*/
export async function getUser(userId: User['id']) {
const user = await Users.findOneBy({ id: userId });
export async function getUser(userId: User['id'], includeSuspended = false) {
const user = await Users.findOneBy({
id: userId,
isDeleted: false,
...(includeSuspended ? {} : {isSuspended: false}),
});
if (user == null) {
throw new IdentifiableError('15348ddd-432d-49c2-8a5a-8069753becff', 'No such user.');
throw new ApiError('NO_SUCH_USER');
}
return user;
@ -40,11 +46,16 @@ export async function getUser(userId: User['id']) {
/**
* Get remote user for API processing
*/
export async function getRemoteUser(userId: User['id']) {
const user = await getUser(userId);
export async function getRemoteUser(userId: User['id'], includeSuspended = false) {
const user = await Users.findOneBy({
id: userId,
host: Not(IsNull()),
isDeleted: false,
...(includeSuspended ? {} : {isSuspended: false}),
});
if (!Users.isRemoteUser(user)) {
throw new Error('user is not a remote user');
if (user == null) {
throw new ApiError('NO_SUCH_USER');
}
return user;
@ -53,11 +64,16 @@ export async function getRemoteUser(userId: User['id']) {
/**
* Get local user for API processing
*/
export async function getLocalUser(userId: User['id']) {
const user = await getUser(userId);
export async function getLocalUser(userId: User['id'], includeSuspended = false) {
const user = await Users.findOneBy({
id: userId,
host: IsNull(),
isDeleted: false,
...(includeSuspended ? {} : {isSuspended: false}),
});
if (!Users.isLocalUser(user)) {
throw new Error('user is not a local user');
if (user == null) {
throw new ApiError('NO_SUCH_USER');
}
return user;

View file

@ -2,14 +2,10 @@ import { Schema } from '@/misc/schema.js';
import { errors } from './error.js';
import * as ep___admin_meta from './endpoints/admin/meta.js';
import * as ep___admin_abuseUserReports from './endpoints/admin/abuse-user-reports.js';
import * as ep___admin_accounts_create from './endpoints/admin/accounts/create.js';
import * as ep___admin_accounts_delete from './endpoints/admin/accounts/delete.js';
import * as ep___admin_announcements_create from './endpoints/admin/announcements/create.js';
import * as ep___admin_announcements_delete from './endpoints/admin/announcements/delete.js';
import * as ep___admin_announcements_list from './endpoints/admin/announcements/list.js';
import * as ep___admin_announcements_update from './endpoints/admin/announcements/update.js';
import * as ep___admin_deleteAllFilesOfAUser from './endpoints/admin/delete-all-files-of-a-user.js';
import * as ep___admin_drive_cleanRemoteFiles from './endpoints/admin/drive/clean-remote-files.js';
import * as ep___admin_drive_files from './endpoints/admin/drive/files.js';
import * as ep___admin_drive_showFile from './endpoints/admin/drive/show-file.js';
@ -41,17 +37,21 @@ import * as ep___admin_queue_stats from './endpoints/admin/queue/stats.js';
import * as ep___admin_relays_add from './endpoints/admin/relays/add.js';
import * as ep___admin_relays_list from './endpoints/admin/relays/list.js';
import * as ep___admin_relays_remove from './endpoints/admin/relays/remove.js';
import * as ep___admin_resetPassword from './endpoints/admin/reset-password.js';
import * as ep___admin_resolveAbuseUserReport from './endpoints/admin/resolve-abuse-user-report.js';
import * as ep___admin_reports_list from './endpoints/admin/reports/list.js';
import * as ep___admin_reports_resolve from './endpoints/admin/reports/resolve.js';
import * as ep___admin_sendEmail from './endpoints/admin/send-email.js';
import * as ep___admin_serverInfo from './endpoints/admin/server-info.js';
import * as ep___admin_showModerationLogs from './endpoints/admin/show-moderation-logs.js';
import * as ep___admin_showUser from './endpoints/admin/show-user.js';
import * as ep___admin_showUsers from './endpoints/admin/show-users.js';
import * as ep___admin_silenceUser from './endpoints/admin/silence-user.js';
import * as ep___admin_suspendUser from './endpoints/admin/suspend-user.js';
import * as ep___admin_unsilenceUser from './endpoints/admin/unsilence-user.js';
import * as ep___admin_unsuspendUser from './endpoints/admin/unsuspend-user.js';
import * as ep___admin_users from './endpoints/admin/users.js';
import * as ep___admin_users_create from './endpoints/admin/users/create.js';
import * as ep___admin_users_delete from './endpoints/admin/users/delete.js';
import * as ep___admin_users_deleteAllFiles from './endpoints/admin/users/delete-all-files.js';
import * as ep___admin_users_resetPassword from './endpoints/admin/users/reset-password.js';
import * as ep___admin_users_show from './endpoints/admin/users/show.js';
import * as ep___admin_users_silence from './endpoints/admin/users/silence.js';
import * as ep___admin_users_suspend from './endpoints/admin/users/suspend.js';
import * as ep___admin_users_unsilence from './endpoints/admin/users/unsilence.js';
import * as ep___admin_users_unsuspend from './endpoints/admin/users/unsuspend.js';
import * as ep___admin_updateMeta from './endpoints/admin/update-meta.js';
import * as ep___admin_vacuum from './endpoints/admin/vacuum.js';
import * as ep___announcements from './endpoints/announcements.js';
@ -104,6 +104,7 @@ import * as ep___clips_show from './endpoints/clips/show.js';
import * as ep___clips_update from './endpoints/clips/update.js';
import * as ep___drive from './endpoints/drive.js';
import * as ep___drive_files from './endpoints/drive/files.js';
import * as ep___drive_show from './endpoints/drive/show.js';
import * as ep___drive_files_attachedNotes from './endpoints/drive/files/attached-notes.js';
import * as ep___drive_files_checkExistence from './endpoints/drive/files/check-existence.js';
import * as ep___drive_files_create from './endpoints/drive/files/create.js';
@ -298,14 +299,10 @@ import * as ep___fetchRss from './endpoints/fetch-rss.js';
const eps = [
['admin/meta', ep___admin_meta],
['admin/abuse-user-reports', ep___admin_abuseUserReports],
['admin/accounts/create', ep___admin_accounts_create],
['admin/accounts/delete', ep___admin_accounts_delete],
['admin/announcements/create', ep___admin_announcements_create],
['admin/announcements/delete', ep___admin_announcements_delete],
['admin/announcements/list', ep___admin_announcements_list],
['admin/announcements/update', ep___admin_announcements_update],
['admin/delete-all-files-of-a-user', ep___admin_deleteAllFilesOfAUser],
['admin/drive/clean-remote-files', ep___admin_drive_cleanRemoteFiles],
['admin/drive/files', ep___admin_drive_files],
['admin/drive/show-file', ep___admin_drive_showFile],
@ -337,17 +334,21 @@ const eps = [
['admin/relays/add', ep___admin_relays_add],
['admin/relays/list', ep___admin_relays_list],
['admin/relays/remove', ep___admin_relays_remove],
['admin/reset-password', ep___admin_resetPassword],
['admin/resolve-abuse-user-report', ep___admin_resolveAbuseUserReport],
['admin/reports/list', ep___admin_reports_list],
['admin/reports/resolve', ep___admin_reports_resolve],
['admin/send-email', ep___admin_sendEmail],
['admin/server-info', ep___admin_serverInfo],
['admin/show-moderation-logs', ep___admin_showModerationLogs],
['admin/show-user', ep___admin_showUser],
['admin/show-users', ep___admin_showUsers],
['admin/silence-user', ep___admin_silenceUser],
['admin/suspend-user', ep___admin_suspendUser],
['admin/unsilence-user', ep___admin_unsilenceUser],
['admin/unsuspend-user', ep___admin_unsuspendUser],
['admin/users', ep___admin_users],
['admin/users/create', ep___admin_users_create],
['admin/users/delete', ep___admin_users_delete],
['admin/users/delete-all-files', ep___admin_users_deleteAllFiles],
['admin/users/reset-password', ep___admin_users_resetPassword],
['admin/users/show', ep___admin_users_show],
['admin/users/silence', ep___admin_users_silence],
['admin/users/suspend', ep___admin_users_suspend],
['admin/users/unsilence', ep___admin_users_unsilence],
['admin/users/unsuspend', ep___admin_users_unsuspend],
['admin/update-meta', ep___admin_updateMeta],
['admin/vacuum', ep___admin_vacuum],
['announcements', ep___announcements],
@ -400,6 +401,7 @@ const eps = [
['clips/update', ep___clips_update],
['drive', ep___drive],
['drive/files', ep___drive_files],
['drive/show', ep___drive_show],
['drive/files/attached-notes', ep___drive_files_attachedNotes],
['drive/files/check-existence', ep___drive_files_checkExistence],
['drive/files/create', ep___drive_files_create],

View file

@ -1,6 +1,6 @@
import { Announcements } from '@/models/index.js';
import { genId } from '@/misc/gen-id.js';
import define from '../../../define.js';
import define from '@/server/api/define.js';
export const meta = {
tags: ['admin'],

View file

@ -1,6 +1,6 @@
import { Announcements } from '@/models/index.js';
import define from '../../../define.js';
import { ApiError } from '../../../error.js';
import define from '@/server/api/define.js';
import { ApiError } from '@/server/api/error.js';
export const meta = {
tags: ['admin'],

View file

@ -1,7 +1,7 @@
import { Announcements, AnnouncementReads } from '@/models/index.js';
import { Announcement } from '@/models/entities/announcement.js';
import define from '../../../define.js';
import { makePaginationQuery } from '../../../common/make-pagination-query.js';
import define from '@/server/api/define.js';
import { makePaginationQuery } from '@/server/api/common/make-pagination-query.js';
export const meta = {
tags: ['admin'],

View file

@ -1,6 +1,6 @@
import { Announcements } from '@/models/index.js';
import define from '../../../define.js';
import { ApiError } from '../../../error.js';
import define from '@/server/api/define.js';
import { ApiError } from '@/server/api/error.js';
export const meta = {
tags: ['admin'],

View file

@ -1,5 +1,5 @@
import { createCleanRemoteFilesJob } from '@/queue/index.js';
import define from '../../../define.js';
import define from '@/server/api/define.js';
export const meta = {
tags: ['admin'],

View file

@ -1,6 +1,6 @@
import { DriveFiles } from '@/models/index.js';
import define from '../../../define.js';
import { makePaginationQuery } from '../../../common/make-pagination-query.js';
import define from '@/server/api/define.js';
import { makePaginationQuery } from '@/server/api/common/make-pagination-query.js';
export const meta = {
tags: ['admin'],

View file

@ -1,6 +1,6 @@
import { DriveFiles } from '@/models/index.js';
import define from '../../../define.js';
import { ApiError } from '../../../error.js';
import define from '@/server/api/define.js';
import { ApiError } from '@/server/api/error.js';
export const meta = {
tags: ['admin'],
@ -79,11 +79,6 @@ export const meta = {
optional: false, nullable: false,
example: 720,
},
avgColor: {
type: 'string',
optional: true, nullable: false,
example: 'rgb(40,65,87)',
},
},
},
storedInternal: {

View file

@ -1,7 +1,7 @@
import { In } from 'typeorm';
import { Emojis } from '@/models/index.js';
import { db } from '@/db/postgre.js';
import define from '../../../define.js';
import define from '@/server/api/define.js';
export const meta = {
tags: ['admin'],

View file

@ -3,8 +3,8 @@ import { db } from '@/db/postgre.js';
import { Emojis, DriveFiles } from '@/models/index.js';
import { genId } from '@/misc/gen-id.js';
import { insertModerationLog } from '@/services/insert-moderation-log.js';
import define from '../../../define.js';
import { ApiError } from '../../../error.js';
import define from '@/server/api/define.js';
import { ApiError } from '@/server/api/error.js';
export const meta = {
tags: ['admin'],

View file

@ -4,8 +4,8 @@ import { DriveFile } from '@/models/entities/drive-file.js';
import { uploadFromUrl } from '@/services/drive/upload-from-url.js';
import { publishBroadcastStream } from '@/services/stream.js';
import { db } from '@/db/postgre.js';
import define from '../../../define.js';
import { ApiError } from '../../../error.js';
import define from '@/server/api/define.js';
import { ApiError } from '@/server/api/error.js';
export const meta = {
tags: ['admin'],

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